LyogIENvcHlyaWdodCAxOTg2LTE5OTIgRW1tZXQgUC4gR3JheS4KICogIENvcHlyaWdodCAxOTk2LTIwMDMsMjAwNiwyMDA3LDIwMDkgQWxhaW4gS25hZmYuCiAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiBtdG9vbHMuCiAqCiAqICBNdG9vbHMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgTXRvb2xzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhbG9uZyB3aXRoIE10b29scy4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICovCgovKgogKiBEZXZpY2UgdGFibGVzLiAgU2VlIHRoZSBDb25maWd1cmUgZmlsZSBmb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbi4KICovCgojZGVmaW5lIE5PX1RFUk1JTwojaW5jbHVkZSAic3lzaW5jbHVkZXMuaCIKI2luY2x1ZGUgIm1zZG9zLmgiCiNpbmNsdWRlICJtdG9vbHMuaCIKI2luY2x1ZGUgImRldmljZXMuaCIKCiNkZWZpbmUgSU5JVF9OT09QCgojZGVmaW5lIERFRl9BUkcxKHgpICh4KSwgMHgyLDAsKGNoYXIgKikwLCAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMCiNkZWZpbmUgREVGX0FSRzAoeCkgMCxERUZfQVJHMSh4KQoKI2RlZmluZSBNREVGX0FSRyAwTCxERUZfQVJHMChNRk9STUFUX09OTFlfRkxBRykKI2RlZmluZSBGREVGX0FSRyAwTCxERUZfQVJHMCgwKQoKI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCiNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtbWFjcm9zIgoKI2RlZmluZSBWT0xEX0RFRl9BUkcgMEwsREVGX0FSRzAoVk9MRF9GTEFHfE1GT1JNQVRfT05MWV9GTEFHKQoKI2RlZmluZSBNRUQzMTIJMTIsMCw4MCwyLDM2LDAsTURFRl9BUkcgLyogMyAxLzIgZXh0cmEgZGVuc2l0eSAqLwojZGVmaW5lIE1IRDMxMgkxMiwwLDgwLDIsMTgsMCxNREVGX0FSRyAvKiAzIDEvMiBoaWdoIGRlbnNpdHkgKi8KI2RlZmluZSBNREQzMTIJMTIsMCw4MCwyLCA5LDAsTURFRl9BUkcgLyogMyAxLzIgZG91YmxlIGRlbnNpdHkgKi8KI2RlZmluZSBNSEQ1MTQJMTIsMCw4MCwyLDE1LDAsTURFRl9BUkcgLyogNSAxLzQgaGlnaCBkZW5zaXR5ICovCiNkZWZpbmUgTURENTE0CTEyLDAsNDAsMiwgOSwwLE1ERUZfQVJHIC8qIDUgMS80IGRvdWJsZSBkZW5zaXR5ICgzNjBrKSAqLwojZGVmaW5lIE1TUzUxNAkxMiwwLDQwLDEsIDksMCxNREVGX0FSRyAvKiA1IDEvNCBzaW5nbGUgc2lkZWQgREQsICgxODBrKSAqLwojZGVmaW5lIE1ERHNtYWxsCTEyLDAsNDAsMiwgOCwwLE1ERUZfQVJHIC8qIDUgMS80IGRvdWJsZSBkZW5zaXR5ICgzMjBrKSAqLwojZGVmaW5lIE1TU3NtYWxsCTEyLDAsNDAsMSwgOCwwLE1ERUZfQVJHIC8qIDUgMS80IHNpbmdsZSBzaWRlZCBERCwgKDE2MGspICovCgojZGVmaW5lIEZFRDMxMgkxMiwwLDgwLDIsMzYsMCxGREVGX0FSRyAvKiAzIDEvMiBleHRyYSBkZW5zaXR5ICovCiNkZWZpbmUgRkhEMzEyCTEyLDAsODAsMiwxOCwwLEZERUZfQVJHIC8qIDMgMS8yIGhpZ2ggZGVuc2l0eSAqLwojZGVmaW5lIEZERDMxMgkxMiwwLDgwLDIsIDksMCxGREVGX0FSRyAvKiAzIDEvMiBkb3VibGUgZGVuc2l0eSAqLwojZGVmaW5lIEZIRDUxNAkxMiwwLDgwLDIsMTUsMCxGREVGX0FSRyAvKiA1IDEvNCBoaWdoIGRlbnNpdHkgKi8KI2RlZmluZSBGREQ1MTQJMTIsMCw0MCwyLCA5LDAsRkRFRl9BUkcgLyogNSAxLzQgZG91YmxlIGRlbnNpdHkgKDM2MGspICovCiNkZWZpbmUgRlNTNTE0CTEyLDAsNDAsMSwgOSwwLEZERUZfQVJHIC8qIDUgMS80IHNpbmdsZSBzaWRlZCBERCwgKDE4MGspICovCiNkZWZpbmUgRkREc21hbGwJMTIsMCw0MCwyLCA4LDAsRkRFRl9BUkcgLyogNSAxLzQgZG91YmxlIGRlbnNpdHkgKDMyMGspICovCiNkZWZpbmUgRlNTc21hbGwJMTIsMCw0MCwxLCA4LDAsRkRFRl9BUkcgLyogNSAxLzQgc2luZ2xlIHNpZGVkIERELCAoMTYwaykgKi8KCiNkZWZpbmUgR0VOSEQJMTYsMCwgMCwwLCAwLDAsTURFRl9BUkcgLyogR2VuZXJpYyAxNiBiaXQgRkFUIGZzICovCiNkZWZpbmUgR0VORkQJMTIsMCw4MCwyLDE4LDAsTURFRl9BUkcgLyogR2VuZXJpYyAxMiBiaXQgRkFUIGZzICovCiNkZWZpbmUgVk9MREZECTEyLDAsODAsMiwxOCwwLFZPTERfREVGX0FSRyAvKiBHZW5lcmljIDEyIGJpdCBGQVQgZnMgd2l0aCB2b2xkICovCiNkZWZpbmUgR0VOICAgIAkgMCwwLCAwLDAsIDAsMCxNREVGX0FSRyAvKiBHZW5lcmljIGZzIG9mIGFueSBGQVQgYml0cyAqLwoKI2RlZmluZSBaSVBKQVooeCxjLGgscyx5KSAxNiwoeCksKGMpLChoKSwocyksKHMpLDBMLCA0LCBcCgkJREVGX0FSRzEoKHkpfE1GT1JNQVRfT05MWV9GTEFHKSAvKiBKYXogZGlza3MgKi8KCiNkZWZpbmUgSkFaKHgpCSBaSVBKQVooeCwxMDIxLCA2NCwgMzIsIDApCiNkZWZpbmUgUkpBWih4KQkgWklQSkFaKHgsMTAyMSwgNjQsIDMyLCBTQ1NJX0ZMQUd8UFJJVl9GTEFHKQojZGVmaW5lIFpJUCh4KQkgWklQSkFaKHgsOTYsIDY0LCAzMiwgMCkKI2RlZmluZSBSWklQKHgpCSBaSVBKQVooeCw5NiwgNjQsIDMyLCBTQ1NJX0ZMQUd8UFJJVl9GTEFHKQoKI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKCiNkZWZpbmUgUkVNT1RFICAgIHsiJERJU1BMQVkiLCAnWCcsIDAsMCwgMCwwLCAwLDAsMEwsIERFRl9BUkcwKEZMT1BQWURfRkxBRyl9CgoKCiNpZiBkZWZpbmVkKElOSVRfR0VORVJJQykgfHwgZGVmaW5lZChJTklUX05PT1ApCnN0YXRpYyBpbnQgY29tcGFyZV9nZW9tKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqb3JpZ19kZXYpCnsKCWlmKElTX01GT1JNQVRfT05MWShvcmlnX2RldikpCgkJcmV0dXJuIDA7IC8qIGdlb21ldHJ5IG9ubHkgZm9yIG1mb3JtYXR0aW5nID09PiBvayAqLwoJaWYoIW9yaWdfZGV2IHx8ICFvcmlnX2Rldi0+dHJhY2tzIHx8ICFkZXYgfHwgIWRldi0+dHJhY2tzKQoJCXJldHVybiAwOyAvKiBubyBvcmlnaW5hbCBkZXZpY2UuIFRoaXMgaXMgb2sgKi8KCXJldHVybihvcmlnX2Rldi0+dHJhY2tzICE9IGRldi0+dHJhY2tzIHx8CgkgICAgICAgb3JpZ19kZXYtPmhlYWRzICE9IGRldi0+aGVhZHMgfHwKCSAgICAgICBvcmlnX2Rldi0+c2VjdG9ycyAgIT0gZGV2LT5zZWN0b3JzKTsKfQojZW5kaWYKCiNkZWZpbmUgZGV2aWNlcyBjb25zdF9kZXZpY2VzCgoKI2lmZGVmIF9fQ1lHV0lOX18KI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7CiAgIHsiXFxcXFxcXFwuXFxcXEE6IiwgJ0EnLCBHRU5GRCB9LAp9OwojZW5kaWYgLyogQ1lHV0lOICovCgoKI2lmZGVmIE9TX2F1eAojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKICAgeyIvZGV2L2Zsb3BweTAiLCAnQScsIEdFTkZEIH0sCiAgIHsiL2Rldi9yZHNrL2MxMDRkMHMzMSIsICdKJywgSkFaKE9fRVhDTCkgfSwKICAgeyIvZGV2L3Jkc2svYzEwNWQwczMxIiwgJ1onLCBaSVAoT19FWENMKSB9LAogICBSRU1PVEUKfTsKI2VuZGlmIC8qIGF1eCAqLwoKCiNpZmRlZiBPU19seW54b3MKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvZmQxNDQwLjAiLCAJJ0EnLCBNSEQzMTIgfSwKCVJFTU9URQp9OwojZW5kaWYKCgojaWZkZWYgX19CRU9TX18KI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvZGlzay9mbG9wcHkvcmF3IiwgCSdBJywgTUhEMzEyIH0sCglSRU1PVEUKfTsKI2VuZGlmIC8qIEJFQk9YICovCgoKI2lmZGVmIE9TX2hwdXgKCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewojaWZkZWYgT1NfaHB1eDEwCi8qIGhwdXgxMCB1c2VzIGRpZmZlcmVudCBkZXZpY2UgbmFtZXMgYWNjb3JkaW5nIHRvIEZyYW5rIE1hcml0YXRvCiAqIDxmcmFua0BtYXRoLmhtYy5lZHU+ICovCgl7Ii9kZXYvZmxvcHB5L2MwdDBkMCIsCQknQScsIE1IRDMxMiB9LAoJeyIvZGV2L2Zsb3BweS9jMHQwZDEiLAkJJ0InLCBNSEQzMTIgfSwgLyogZ3Vlc3NlZCBieSBtZSAqLwogCXsiL2Rldi9yc2NzaSIsCQkJJ0MnLCBHRU5IRCB9LCAvKiBndWVzc2VkIGJ5IG1lICovCiNlbHNlCi8qIFVzZSByZmxvcHB5LCBhY2NvcmRpbmcgdG8gU2ltYW8gQ2FtcG9zIDxzaW1hb0BpcmlzLmN0ZC5jb21zYXQuY29tPiAqLwoJeyIvZGV2L3JmbG9wcHkvYzIwMWQwczAiLAknQScsIEZIRDMxMiB9LAoJeyIvZGV2L3JmbG9wcHkvYzIwQWQwczAiLCAJJ0EnLCBGSEQzMTIgfSwKIAl7Ii9kZXYvcmZsb3BweS9jMjAxZDFzMCIsCSdCJywgRkhEMzEyIH0sCiAJeyIvZGV2L3JmbG9wcHkvYzIwQWQxczAiLAknQicsIEZIRDMxMiB9LAogCXsiL2Rldi9yc2NzaSIsCQkJJ0MnLCBHRU5IRCB9LAojZW5kaWYKCXsiL2Rldi9yZHNrL2MyMDFkNCIsCQknSicsIFJKQVooT19FWENMKSB9LAoJeyIvZGV2L3Jkc2svYzIwMWQ0czAiLAkJJ0onLCBSSkFaKE9fRVhDTCkgfSwKCXsiL2Rldi9yZHNrL2MyMDFkNSIsCQknWicsIFJaSVAoT19FWENMKSB9LAoJeyIvZGV2L3Jkc2svYzIwMWQ1czAiLAkJJ1onLCBSWklQKE9fRVhDTCkgfSwKCVJFTU9URQp9OwoKI2lmZGVmIEhBVkVfU1lTX0ZMT1BQWQovKiBnZW9tZXRyeSBzZXR0aW5nIGlvY3RsJ3MgY29udHJpYnV0ZWQgYnkgUGFvbG8gWmVwcGVnbm8KICogPHBhb2xvQHRvLnNlbS5pdD4sIG1heSBjYXVzZSAiTm90IGEgdHlwZXdyaXRlciIgbWVzc2FnZXMgb24gb3RoZXIKICogdmVyc2lvbnMgYWNjb3JkaW5nIHRvIHN1cHBvcnRAdml0YWwuY29tICovCgojaW5jbHVkZSA8c3lzL2Zsb3BweS5oPgojdW5kZWYgU1NJWkUKCnN0cnVjdCBnZW5lcmljX2Zsb3BweV9zdHJ1Y3QKewogIHN0cnVjdCBmbG9wcHlfZ2VvbWV0cnkgZmc7Cn07CgojZGVmaW5lIEJMT0NLX01BSk9SIDI0CiNkZWZpbmUgQ0hBUl9NQUpPUiAxMTIKCnN0YXRpYyBpbmxpbmUgaW50IGdldF9wYXJhbWV0ZXJzKGludCBmZCwgc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdCAqZmxvcHB5KQp7CglpZiAoaW9jdGwoZmQsIEZMT1BQWV9HRVRfR0VPTUVUUlksICYoZmxvcHB5LT5mZykpICE9IDApIHsKCQlwZXJyb3IoIkZMT1BQWV9HRVRfR0VPTUVUUlkiKTsKCQlyZXR1cm4oMSk7Cgl9CgoJcmV0dXJuIDA7Cn0KCiNkZWZpbmUgVFJBQ0tTKGZsb3BweSkgZmxvcHB5LmZnLnRyYWNrcwojZGVmaW5lIEhFQURTKGZsb3BweSkgZmxvcHB5LmZnLmhlYWRzCiNkZWZpbmUgU0VDVE9SUyhmbG9wcHkpIGZsb3BweS5mZy5zZWN0b3JzCiNkZWZpbmUgRkRfU0VDVFNJWkUoZmxvcHB5KSBmbG9wcHkuZmcuc2VjdG9yX3NpemUKI2RlZmluZSBGRF9TRVRfU0VDVFNJWkUoZmxvcHB5LHYpIHsgZmxvcHB5LmZnLnNlY3Rvcl9zaXplID0gdjsgfQoKc3RhdGljIGlubGluZSBpbnQgc2V0X3BhcmFtZXRlcnMoaW50IGZkLCBzdHJ1Y3QgZ2VuZXJpY19mbG9wcHlfc3RydWN0ICpmbG9wcHksCgkJCQkgc3RydWN0IE1UX1NUQVQgKmJ1ZikKewoJaWYgKGlvY3RsKGZkLCBGTE9QUFlfU0VUX0dFT01FVFJZLCAmKGZsb3BweS0+ZmcpKSAhPSAwKSB7CgkJcGVycm9yKCIiKTsKCQlyZXR1cm4oMSk7Cgl9CgoJcmV0dXJuIDA7Cn0KI2RlZmluZSBJTklUX0dFTkVSSUMKI2VuZGlmCgojZW5kaWYgLyogaHB1eCAqLwoKCiNpZiAoZGVmaW5lZChPU19zaW5peCkgfHwgZGVmaW5lZChWRU5ET1Jfc25pKSB8fCBkZWZpbmVkKFNOSSkpCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewojaWZkZWYgQ1BVX21pcHMgICAgIC8qIGZvciBTaWVtZW5zIE5peGRvcmYncyAgU0lOSVgtTi9PIChtaXBzKSA1LjR4IFNWUjQgKi8KCXsgIi9kZXYvYXQvZmxwL2YwdCIsICAgICdBJywgRkhEMzEyfSwKCXsgIi9kZXYvZmQwIiwgICAgICAgICAgICdBJywgR0VORkR9LAojZWxzZQojaWZkZWYgQ1BVX2kzODYgICAgIC8qIGZvciBTaWVtZW5zIE5peGRvcmYncyAgU0lOSVgtRC9MIChpbnRlbCkgNS40eCBTVlI0ICovCgl7ICIvZGV2L2ZkMDEzNWRzMTgiLAknQScsIEZIRDMxMn0sCgl7ICIvZGV2L2ZkMDEzNWRzOSIsCSdBJywgRkREMzEyfSwKCXsgIi9kZXYvZmQwIiwJCSdBJywgR0VORkR9LAoJeyAiL2Rldi9mZDExMzVkczE1IiwJJ0InLCBGSEQ1MTR9LAoJeyAiL2Rldi9mZDExMzVkczkiLAknQicsIEZERDUxNH0sCgl7ICIvZGV2L2ZkMSIsCQknQicsIEdFTkZEfSwKI2VuZGlmIC8qIENQVV9pMzg2ICovCiNlbmRpZiAvKm1pcHMqLwoJUkVNT1RFCn07CiNlbmRpZgoKI2lmZGVmIE9TX3VsdHJpeAojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9yZmQwYSIsCQknQScsIEdFTkZEfSwgLyogZ3Vlc3NlZCAqLwoJeyIvZGV2L3JmZDBjIiwJCSdBJywgR0VORkR9LCAvKiBndWVzc2VkICovCglSRU1PVEUKfTsKCiNlbmRpZgoKCiNpZmRlZiBPU19pc2MKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKI2lmIChkZWZpbmVkKE9TX2lzYzIpICYmIGRlZmluZWQoT0xEU1RVRkYpKQpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9yZHNrL2YwZDlkdCIsICAgCSdBJywgRkRENTE0fSwKCXsiL2Rldi9yZHNrL2YwcTE1ZHQiLAknQScsIEZIRDUxNH0sCgl7Ii9kZXYvcmRzay9mMGQ4ZHQiLAknQScsIEZERHNtYWxsfSwKCXsiL2Rldi9yZHNrL2YxM2h0IiwJJ0InLCBGSEQzMTJ9LAoJeyIvZGV2L3Jkc2svZjEzZHQiLAknQicsIEZERDMxMn0sCgl7Ii9kZXYvcmRzay8wcDEiLAknQycsIEdFTkhEfSwKCXsiL3Vzci92cGl4L2RlZmF1bHRzL0M6IiwnRCcsMTIsIDAsIDAsIDAsIDAsODcwNEwsREVGX0FSRzB9LAoJeyIkSE9NRS92cGl4L0M6IiwgCSdFJywgMTIsIDAsIDAsIDAsIDAsODcwNEwsTURFRl9BUkd9LAoJUkVNT1RFCn07CiNlbHNlCi8qIGNvbnRyaWJ1dGVkIGJ5IGxhcnJ5LmpvbmVzQHNkcmMuY29tIChMYXJyeSBKb25lcykgKi8Kc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvcmZkMCIsCQknQScsIEdFTn0sCgl7Ii9kZXYvcmZkMSIsCQknQicsIEdFTn0sCgl7Ii9kZXYvcmRzay8wcDEiLAknQycsIEdFTn0sCgl7Ii91c3IvdnBpeC9kZWZhdWx0cy9DOiIsJ0QnLCBHRU4sIDF9LAoJeyIkSE9NRS92cGl4L0M6IiwgCSdFJywgR0VOLCAxfSwKCVJFTU9URQp9OwoKI2luY2x1ZGUgPHN5cy92dG9jLmg+CiNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CiN1bmRlZiBTU0laRQojZGVmaW5lIEJMT0NLX01BSk9SIDEKI2RlZmluZSBDSEFSX01BSk9SICAxCiNkZWZpbmUgZ2VuZXJpY19mbG9wcHlfc3RydWN0IGRpc2tfcGFybXMKaW50IGlvY3RsKGludCwgaW50LCB2b2lkICopOwoKc3RhdGljIGludCBnZXRfcGFyYW1ldGVycyhpbnQgZmQsIHN0cnVjdCBnZW5lcmljX2Zsb3BweV9zdHJ1Y3QgKmZsb3BweSkKewoJbXRfb2ZmX3Qgb2ZmOwoJY2hhciBidWZbNTEyXTsKCglvZmYgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpOwoJaWYob2ZmIDwgMCkgewoJCXBlcnJvcigiZGV2aWNlIHNlZWsgMSIpOwoJCWV4aXQoMSk7Cgl9CglpZiAob2ZmID09IDApIHsKCQkvKiBuZWVkIHRvIHJlYWQgYXQgbGVhc3QgMSBzZWN0b3IgdG8gZ2V0IGNvcnJlY3QgaW5mbyAqLwoJCXJlYWQoZmQsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CgkJaWYobHNlZWsoZmQsIDAsIFNFRUtfU0VUKSA8IDApIHsKCQkJcGVycm9yKCJkZXZpY2Ugc2VlayAyIik7CgkJCWV4aXQoMSk7CgkJfQoJfQoJcmV0dXJuIGlvY3RsKGZkLCBWX0dFVFBBUk1TLCBmbG9wcHkpOwp9CgojZGVmaW5lIFRSQUNLUyhmbG9wcHkpICAoZmxvcHB5KS5kcF9jeWxzCiNkZWZpbmUgSEVBRFMoZmxvcHB5KSAgIChmbG9wcHkpLmRwX2hlYWRzCiNkZWZpbmUgU0VDVE9SUyhmbG9wcHkpIChmbG9wcHkpLmRwX3NlY3RvcnMKI2RlZmluZSBGRF9TRUNUU0laRShmbG9wcHkpIChmbG9wcHkpLmRwX3NlY3NpegojZGVmaW5lIEZEX1NFVF9TRUNUU0laRShmbG9wcHksdikgeyAoZmxvcHB5KS5kcF9zZWNzaXogPSAodik7IH0KCnN0YXRpYyBpbnQgc2V0X3BhcmFtZXRlcnMoaW50IGZkLCBzdHJ1Y3QgZ2VuZXJpY19mbG9wcHlfc3RydWN0ICpmbG9wcHksCglzdHJ1Y3QgTVRfU1RBVCAqYnVmKQp7CglyZXR1cm4gMTsKfQoKI2RlZmluZSBJTklUX0dFTkVSSUMKI2VuZGlmCiNlbmRpZiAvKiBpc2MgKi8KCiNpZmRlZiBDUFVfaTM3MAojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9yZmQwIiwgJ0EnLCBHRU5GRH0sCglSRU1PVEUKfTsKI2VuZGlmIC8qIENQVV9pMzcwICovCgojaWZkZWYgT1NfYWl4Ci8qIG1vZGlmaWVkIGJ5IEZlZGVyaWNvIEJpYW5jaGkgKi8KI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvZmQwIiwnQScsR0VORkR9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBhaXggKi8KCgojaWZkZWYgT1Nfb3NmNAovKiBtb2RpZmllZCBieSBDaHJpcyBTYW11ZWwgPGNocmlzQHJpdmVycy5kcmEuaG1nLmdiPiAqLwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9mZDBjIiwnQScsR0VORkR9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBPU19vc2Y0ICovCgoKI2lmZGVmIE9TX3NvbGFyaXMKCiNpZmRlZiBVU0lOR19ORVdfVk9MRAoKY2hhciAqYWxpYXNfbmFtZSA9IE5VTEw7CgpleHRlcm4gY2hhciAqbWVkaWFfb2xkYWxpYXNlcyhjaGFyICopOwpleHRlcm4gY2hhciAqbWVkaWFfZmluZG5hbWUoY2hhciAqKTsKCmNoYXIgKmdldFZvbGROYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbmFtZSkKewoJY2hhciAqcm5hbWU7CgoJaWYoIVNIT1VMRF9VU0VfVk9MRChkZXYpKQoJCXJldHVybiBuYW1lOwoKCS8qKioKCSAqIFNvbGFyaXMgc3BlY2lmaWMgcm91dGluZXMgdG8gdXNlIHRoZSB2b2x1bWUgbWFuYWdlbWVudAoJICogZGFlbW9uIGFuZCBsaWJyYXJpZXMgdG8gZ2V0IHRoZSBjb3JyZWN0IGRldmljZSBuYW1lLi4uCgkgKioqLwoJcm5hbWUgPSBtZWRpYV9maW5kbmFtZShuYW1lKTsKI2lmZGVmIEhBVkVfTUVESUFfT0xEQUxJQVNFUwoJaWYgKHJuYW1lID09IE5VTEwpIHsKCQlpZiAoKGFsaWFzX25hbWUgPSBtZWRpYV9vbGRhbGlhc2VzKG5hbWUpKSAhPSBOVUxMKQoJCQlybmFtZSA9IG1lZGlhX2ZpbmRuYW1lKGFsaWFzX25hbWUpOwoJfQojZW5kaWYKCWlmIChybmFtZSA9PSBOVUxMKSB7CgkJZnByaW50ZihzdGRlcnIsCgkJCQkiTm8gc3VjaCB2b2x1bWUgb3Igbm8gbWVkaWEgaW4gZGV2aWNlOiAlcy5cbiIsCgkJCQluYW1lKTsKCQlleGl0KDEpOwoJfQoJcmV0dXJuIHJuYW1lOwp9CiNlbmRpZiAvKiBVU0lOR19ORVdfVk9MRCAqLwoKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7CiNpZmRlZiAgVVNJTkdfTkVXX1ZPTEQKCXsiZmxvcHB5IiwgJ0EnLCBWT0xERkQgfSwKI2VsaWYJVVNJTkdfVk9MRAoJeyIvdm9sL2Rldi9hbGlhc2VzL2Zsb3BweTAiLCAnQScsIEdFTkZEfSwKCXsiL2Rldi9yZGlza2V0dGUiLCAnQicsIEdFTkZEfSwKI2Vsc2UJLyogISBVU0lOR19WT0xEICovCgl7Ii9kZXYvcmRpc2tldHRlIiwgJ0EnLCBHRU5GRH0sCgl7Ii92b2wvZGV2L2FsaWFzZXMvZmxvcHB5MCIsICdCJywgR0VORkR9LAojZW5kaWYJLyogVVNJTkdfVk9MRCAqLwoJeyIvZGV2L3Jkc2svYzB0NGQwczIiLCAnSicsIFJKQVooT19OREVMQVkpfSwKCXsiL2Rldi9yZHNrL2MwdDVkMHMyIiwgJ1onLCBSWklQKE9fTkRFTEFZKX0sCglSRU1PVEUKfTsKCgoKI2lmZGVmIEhBVkVfU1lTX0ZESU9fSAovKgogKiBPZmVyIExpY2h0IDxvZmVyQHN0YXQuQmVya2VsZXkuRURVPiwgTWF5IDE0LCAxOTk3LgogKi8KCiNkZWZpbmUgSU5JVF9HRU5FUklDCgojaW5jbHVkZSA8c3lzL2ZkaW8uaD4KI2luY2x1ZGUgPHN5cy9ta2Rldi5oPgkvKiBmb3IgbWFqb3IoKSAqLwoKc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdAp7CiAgc3RydWN0IGZkX2NoYXIgZmRjaGFyOwp9OwoKI2RlZmluZSBCTE9DS19NQUpPUiAzNgojZGVmaW5lIENIQVJfTUFKT1IgMzYKCnN0YXRpYyBpbmxpbmUgaW50IGdldF9wYXJhbWV0ZXJzKGludCBmZCwgc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdCAqZmxvcHB5KQp7CglpZiAoaW9jdGwoZmQsIEZESU9HQ0hBUiwgJihmbG9wcHktPmZkY2hhcikpICE9IDApIHsKCQlwZXJyb3IoIiIpOwoJCWlvY3RsKGZkLCBGREVKRUNULCBOVUxMKTsKCQlyZXR1cm4oMSk7Cgl9CglyZXR1cm4gMDsKfQoKI2RlZmluZSBUUkFDS1MoZmxvcHB5KSBmbG9wcHkuZmRjaGFyLmZkY19uY3lsCiNkZWZpbmUgSEVBRFMoZmxvcHB5KSBmbG9wcHkuZmRjaGFyLmZkY19uaGVhZAojZGVmaW5lIFNFQ1RPUlMoZmxvcHB5KSBmbG9wcHkuZmRjaGFyLmZkY19zZWNwdHJhY2sKLyogU0VDVE9SU19QRVJfRElTSyhmbG9wcHkpIG5vdCB1c2VkICovCiNkZWZpbmUgRkRfU0VDVFNJWkUoZmxvcHB5KSBmbG9wcHkuZmRjaGFyLmZkY19zZWNfc2l6ZQojZGVmaW5lIEZEX1NFVF9TRUNUU0laRShmbG9wcHksdikgeyBmbG9wcHkuZmRjaGFyLmZkY19zZWNfc2l6ZSA9IHY7IH0KCnN0YXRpYyBpbmxpbmUgaW50IHNldF9wYXJhbWV0ZXJzKGludCBmZCwgc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdCAqZmxvcHB5LAoJCQkJIHN0cnVjdCBNVF9TVEFUICpidWYgVU5VU0VEUCkKewoJaWYgKGlvY3RsKGZkLCBGRElPU0NIQVIsICYoZmxvcHB5LT5mZGNoYXIpKSAhPSAwKSB7CgkJaW9jdGwoZmQsIEZERUpFQ1QsIE5VTEwpOwoJCXBlcnJvcigiIik7CgkJcmV0dXJuKDEpOwoJfQoJcmV0dXJuIDA7Cn0KI2VuZGlmCiNlbmRpZiAvKiBzb2xhcmlzICovCgojaWZkZWYgT1Nfc3Vub3MzCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJeyIvZGV2L3JmZGwwYyIsCSdBJywgRkREMzEyfSwKCXsiL2Rldi9yZmQwYyIsCSdBJywgRkhEMzEyfSwKCVJFTU9URQp9OwojZW5kaWYgLyogT1Nfc3Vub3MzICovCgojaWZkZWYgT1NfeGVuaXgKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvZmQwOTZkczE1IiwJJ0EnLCBGSEQ1MTR9LAoJeyIvZGV2L2ZkMDQ4ZHM5IiwJJ0EnLCBGREQ1MTR9LAoJeyIvZGV2L2ZkMTEzNWRzMTgiLAknQicsIEZIRDMxMn0sCgl7Ii9kZXYvZmQxMTM1ZHM5IiwJJ0InLCBGREQzMTJ9LAoJeyIvZGV2L2hkMGQiLAkJJ0MnLCBHRU5IRH0sCglSRU1PVEUKfTsKI2VuZGlmIC8qIE9TX3hlbml4ICovCgojaWZkZWYgT1Nfc2NvCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJeyAiL2Rldi9mZDAxMzVkczE4IiwJJ0EnLCBGSEQzMTJ9LAoJeyAiL2Rldi9mZDAxMzVkczkiLAknQScsIEZERDMxMn0sCgl7ICIvZGV2L2ZkMCIsCQknQScsIEdFTkZEfSwKCXsgIi9kZXYvZmQxMTM1ZHMxNSIsCSdCJywgRkhENTE0fSwKCXsgIi9kZXYvZmQxMTM1ZHM5IiwJJ0InLCBGREQ1MTR9LAoJeyAiL2Rldi9mZDEiLAkJJ0InLCBHRU5GRH0sCgl7ICIvZGV2L2hkMGQiLAkJJ0MnLCBHRU5IRH0sCglSRU1PVEUKfTsKI2VuZGlmIC8qIE9TX3NjbyAqLwoKCiNpZmRlZiBPU19pcml4CiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewogIHsgIi9kZXYvcmRzay9mZHMwZDIuMy41aGkiLAknQScsIEZIRDMxMn0sCiAgeyAiL2Rldi9yZHNrL2ZkczBkMi4zLjUiLAknQScsIEZERDMxMn0sCiAgeyAiL2Rldi9yZHNrL2ZkczBkMi45NiIsCSdBJywgRkhENTE0fSwKICB7Ii9kZXYvcmRzay9mZHMwZDIuNDgiLAknQScsIEZERDUxNH0sCiAgUkVNT1RFCn07CiNlbmRpZiAvKiBPU19pcml4ICovCgoKI2lmZGVmIE9TX3N1bm9zNAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzdW4vZGtpby5oPgoKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvcmZkMGMiLAknQScsIEdFTkZEfSwKCXsiL2Rldi9yc2Q0YyIsCSdKJywgUkpBWihPX05ERUxBWSl9LAoJeyIvZGV2L3JzZDVjIiwJJ1onLCBSWklQKE9fTkRFTEFZKX0sCglSRU1PVEUKfTsKCi8qCiAqIFN0dWZmaW5nIGJhY2sgdGhlIGZsb3BweSBwYXJhbWV0ZXJzIGludG8gdGhlIGRyaXZlciBhbGxvd3MgZm9yIGdlbXMKICogbGlrZSAxMCBzZWN0b3Igb3Igc2luZ2xlIHNpZGVkIGZsb3BwaWVzIGZyb20gQXRhcmkgU1Qgc3lzdGVtcy4KICoKICogTWFydGluIFNjaHVseiwgVW5pdmVyc2l0ZSBkZSBNb25jdG9uLCBOLkIuLCBDYW5hZGEsIE1hcmNoIDExLCAxOTkxLgogKi8KCiNkZWZpbmUgSU5JVF9HRU5FUklDCgpzdHJ1Y3QgZ2VuZXJpY19mbG9wcHlfc3RydWN0CnsKICBzdHJ1Y3QgZmRrX2NoYXIgZGtidWY7CiAgc3RydWN0IGRrX21hcCBka21hcDsKfTsKCiNkZWZpbmUgQkxPQ0tfTUFKT1IgMTYKI2RlZmluZSBDSEFSX01BSk9SIDU0CgpzdGF0aWMgaW5saW5lIGludCBnZXRfcGFyYW1ldGVycyhpbnQgZmQsIHN0cnVjdCBnZW5lcmljX2Zsb3BweV9zdHJ1Y3QgKmZsb3BweSkKewoJaWYgKGlvY3RsKGZkLCBES0lPQ0dQQVJULCAmKGZsb3BweS0+ZGttYXApKSAhPSAwKSB7CgkJcGVycm9yKCJES0lPQ0dQQVJUIik7CgkJaW9jdGwoZmQsIEZES0VKRUNULCBOVUxMKTsKCQlyZXR1cm4oMSk7Cgl9CgoJaWYgKGlvY3RsKGZkLCBGREtJT0dDSEFSLCAmKCBmbG9wcHktPmRrYnVmKSkgIT0gMCkgewoJCXBlcnJvcigiIik7CgkJaW9jdGwoZmQsIEZES0VKRUNULCBOVUxMKTsKCQlyZXR1cm4oMSk7Cgl9CglyZXR1cm4gMDsKfQoKI2RlZmluZSBUUkFDS1MoZmxvcHB5KSBmbG9wcHkuZGtidWYubmN5bAojZGVmaW5lIEhFQURTKGZsb3BweSkgZmxvcHB5LmRrYnVmLm5oZWFkCiNkZWZpbmUgU0VDVE9SUyhmbG9wcHkpIGZsb3BweS5ka2J1Zi5zZWNwdHJhY2sKI2RlZmluZSBTRUNUT1JTX1BFUl9ESVNLKGZsb3BweSkgZmxvcHB5LmRrbWFwLmRrbF9uYmxrCiNkZWZpbmUgRkRfU0VDVFNJWkUoZmxvcHB5KSBmbG9wcHkuZGtidWYuc2VjX3NpemUKI2RlZmluZSBGRF9TRVRfU0VDVFNJWkUoZmxvcHB5LHYpIHsgZmxvcHB5LmRrYnVmLnNlY19zaXplID0gdjsgfQoKc3RhdGljIGlubGluZSBpbnQgc2V0X3BhcmFtZXRlcnMoaW50IGZkLCBzdHJ1Y3QgZ2VuZXJpY19mbG9wcHlfc3RydWN0ICpmbG9wcHksCgkJCQkgc3RydWN0IE1UX1NUQVQgKmJ1ZikKewoJaWYgKGlvY3RsKGZkLCBGREtJT1NDSEFSLCAmKGZsb3BweS0+ZGtidWYpKSAhPSAwKSB7CgkJaW9jdGwoZmQsIEZES0VKRUNULCBOVUxMKTsKCQlwZXJyb3IoIiIpOwoJCXJldHVybigxKTsKCX0KCglpZiAoaW9jdGwoZmQsICggdW5zaWduZWQgaW50KSBES0lPQ1NQQVJULCAmKGZsb3BweS0+ZGttYXApKSAhPSAwKSB7CgkJaW9jdGwoZmQsIEZES0VKRUNULCBOVUxMKTsKCQlwZXJyb3IoIiIpOwoJCXJldHVybigxKTsKCX0KCXJldHVybiAwOwp9CiNkZWZpbmUgSU5JVF9HRU5FUklDCiNlbmRpZiAvKiBzcGFyYyAmJiBzdW5vcyAqLwoKCiNpZmRlZiBEUFgxMDAwCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJLyogW2Jsb2NrIGRldmljZV06IERQWDEwMDAgaGFzIC9kZXYvZmxibTYwLCBEUFgyIGhhcyAvZGV2L2Vhc3lmYiAqLwoJeyIvZGV2L2ZsYm02MCIsICdBJywgTUhENTE0fTsKCXsiL2Rldi9mbGJtNjAiLCAnQicsIE1ERDUxNH0sCgl7Ii9kZXYvZmxibTYwIiwgJ0MnLCBNRERzbWFsbH0sCgl7Ii9kZXYvZmxibTYwIiwgJ0QnLCBNU1N9LAoJeyIvZGV2L2ZsYm02MCIsICdFJywgTVNTc21hbGx9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBEUFgxMDAwICovCgojaWZkZWYgT1NfYm9zeAojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCS8qIFtibG9jayBkZXZpY2VdOiBEUFgxMDAwIGhhcyAvZGV2L2ZsYm02MCwgRFBYMiBoYXMgL2Rldi9lYXN5ZmIgKi8KCXsiL2Rldi9lYXN5ZmIiLCAnQScsIE1IRDUxNH0sCgl7Ii9kZXYvZWFzeWZiIiwgJ0InLCBNREQ1MTR9LAoJeyIvZGV2L2Vhc3lmYiIsICdDJywgTUREc21hbGx9LAoJeyIvZGV2L2Vhc3lmYiIsICdEJywgTVNTfSwKCXsiL2Rldi9lYXN5ZmIiLCAnRScsIE1TU3NtYWxsfSwKCVJFTU9URQp9OwojZW5kaWYgLyogT1NfYm9zeCAqLwoKI2lmZGVmIE9TX2xpbnV4CgpzdGF0aWMgY29uc3QgY2hhciAqZXJyb3JfbXNnWzIyXT17CiJNaXNzaW5nIERhdGEgQWRkcmVzcyBNYXJrIiwKIkJhZCBjeWxpbmRlciIsCiJTY2FuIG5vdCBzYXRpc2ZpZWQiLAoiU2NhbiBlcXVhbCBoaXQiLAoiV3JvbmcgY3lsaW5kZXIiLAoiQ1JDIGVycm9yIGluIGRhdGEgZmllbGQiLAoiQ29udHJvbCBNYXJrID0gZGVsZXRlZCIsCjAsCgoiTWlzc2luZyBBZGRyZXNzIE1hcmsiLAoiV3JpdGUgUHJvdGVjdCIsCiJObyBEYXRhIC0gdW5yZWFkYWJsZSIsCjAsCiJPdmVyUnVuIiwKIkNSQyBlcnJvciBpbiBkYXRhIG9yIGFkZHJlc3MiLAowLAoiRW5kIE9mIEN5bGluZGVyIiwKCjAsCjAsCjAsCiJOb3QgcmVhZHkiLAoiRXF1aXBtZW50IGNoZWNrIGVycm9yIiwKIlNlZWsgZW5kIiB9OwoKCnN0YXRpYyBfX2lubGluZV9fIHZvaWQgcHJpbnRfbWVzc2FnZShSYXdSZXF1ZXN0X3QgKnJhd19jbWQsY29uc3QgY2hhciAqbWVzc2FnZSkKewoJaW50IGksIGNvZGU7CglpZighbWVzc2FnZSkKCQlyZXR1cm47CgoJZnByaW50ZihzdGRlcnIsIiAgICIpOwoJZm9yIChpPTA7IGk8IHJhd19jbWQtPmNtZF9jb3VudDsgaSsrKQoJCWZwcmludGYoc3RkZXJyLCIlMi4yeCAiLAoJCQkoaW50KXJhd19jbWQtPmNtZFtpXSApOwoJZnByaW50ZihzdGRlcnIsIlxuIik7Cglmb3IgKGk9MDsgaTwgcmF3X2NtZC0+cmVwbHlfY291bnQ7IGkrKykKCQlmcHJpbnRmKHN0ZGVyciwiJTIuMnggIiwKCQkJKGludClyYXdfY21kLT5yZXBseVtpXSApOwoJZnByaW50ZihzdGRlcnIsIlxuIik7Cgljb2RlID0gKHJhd19jbWQtPnJlcGx5WzBdIDw8MTYpICsKCQkocmF3X2NtZC0+cmVwbHlbMV0gPDwgOCkgKwoJCXJhd19jbWQtPnJlcGx5WzJdOwoJZm9yKGk9MDsgaTwyMjsgaSsrKXsKCQlpZiAoKGNvZGUgJiAoMSA8PCBpKSkgJiYgZXJyb3JfbXNnW2ldKQoJCQlmcHJpbnRmKHN0ZGVyciwiJXNcbiIsCgkJCQllcnJvcl9tc2dbaV0pOwoJfQp9CgoKLyogcmV0dXJuIHZhbHVlczoKICogIC0xOiBGYXRhbCBlcnJvciwgZG9uJ3QgYm90aGVyIHJldHJ5aW5nLgogKiAgIDA6IE9LCiAqICAgMTogbWlub3IgZXJyb3IsIHJldHJ5CiAqLwoKaW50IHNlbmRfb25lX2NtZChpbnQgZmQsIFJhd1JlcXVlc3RfdCAqcmF3X2NtZCwgY29uc3QgY2hhciAqbWVzc2FnZSkKewoJaWYgKGlvY3RsKCBmZCwgRkRSQVdDTUQsIHJhd19jbWQpID49IDApIHsKCQlpZiAocmF3X2NtZC0+cmVwbHlfY291bnQgPCA3KSB7CgkJCWZwcmludGYoc3RkZXJyLCJTaG9ydCByZXBseSBmcm9tIEZEQ1xuIik7CgkJCXJldHVybiAtMTsKCQl9CgkJcmV0dXJuIDA7Cgl9CgoJc3dpdGNoKGVycm5vKSB7CgkJY2FzZSBFQlVTWToKCQkJZnByaW50ZihzdGRlcnIsICJGREMgYnVzeSwgc2xlZXBpbmcgZm9yIGEgc2Vjb25kXG4iKTsKCQkJc2xlZXAoMSk7CgkJCXJldHVybiAxOwoJCWNhc2UgRUlPOgoJCQlmcHJpbnRmKHN0ZGVyciwicmVzZXR0aW5nIGNvbnRyb2xsZXJcbiIpOwoJCQlpZihpb2N0bChmZCwgRkRSRVNFVCwgMikgIDwgMCl7CgkJCQlwZXJyb3IoInJlc2V0Iik7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJcmV0dXJuIDE7CgkJZGVmYXVsdDoKCQkJcGVycm9yKG1lc3NhZ2UpOwoJCQlyZXR1cm4gLTE7Cgl9Cn0KCgovKgogKiByZXR1cm4gdmFsdWVzCiAqICAtMTogZXJyb3IKICogICAwOiBPSywgbGFzdCBzZWN0b3IKICogICAxOiBtb3JlIHJhdyBjb21tYW5kcyBmb2xsb3cKICovCgppbnQgYW5hbHl6ZV9vbmVfcmVwbHkoUmF3UmVxdWVzdF90ICpyYXdfY21kLCBpbnQgKmJ5dGVzLCBpbnQgZG9fcHJpbnQpCnsKCglpZihyYXdfY21kLT5yZXBseV9jb3VudCA9PSA3KSB7CgkJaW50IGVuZDsKCgkJaWYgKHJhd19jbWQtPnJlcGx5WzNdICE9IHJhd19jbWQtPmNtZFsyXSkgewoJCQkvKiBlbmQgb2YgY3lsaW5kZXIgKi8KCQkJZW5kID0gcmF3X2NtZC0+Y21kWzZdICsgMTsKCQl9IGVsc2UgewoJCQllbmQgPSByYXdfY21kLT5yZXBseVs1XTsKCQl9CgoJCSpieXRlcyA9IGVuZCAtIHJhd19jbWQtPmNtZFs0XTsKCQkvKiBGSVhNRTogb3Zlci91bmRlciBydW4gKi8KCQkqYnl0ZXMgPSAqYnl0ZXMgPDwgKDcgKyByYXdfY21kLT5jbWRbNV0pOwoJfSBlbHNlCgkJKmJ5dGVzID0gMDsKCglzd2l0Y2gocmF3X2NtZC0+cmVwbHlbMF0gJiAweGMwKXsKCQljYXNlIDB4NDA6CgkJCWlmICgocmF3X2NtZC0+cmVwbHlbMF0gJiAweDM4KSA9PSAwICYmCgkJCSAgICAocmF3X2NtZC0+cmVwbHlbMV0pID09IDB4ODAgJiYKCQkJICAgIChyYXdfY21kLT5yZXBseVsyXSkgPT0gMCkgewoJCQkJKmJ5dGVzICs9IDEgPDwgKDcgKyByYXdfY21kLT5jbWRbNV0pOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICggcmF3X2NtZC0+cmVwbHlbMV0gJiBTVDFfV1AgKXsKCQkJCSpieXRlcyA9IDA7CgkJCQlmcHJpbnRmKHN0ZGVyciwKCQkJCQkiVGhpcyBkaXNrIGlzIHdyaXRlIHByb3RlY3RlZFxuIik7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJaWYoISpieXRlcyAmJiBkb19wcmludCkKCQkJCXByaW50X21lc3NhZ2UocmF3X2NtZCwgIiIpOwoJCQlyZXR1cm4gLTE7CgkJY2FzZSAweDgwOgoJCQkqYnl0ZXMgPSAwOwoJCQlmcHJpbnRmKHN0ZGVyciwKCQkJCSJpbnZhbGlkIGNvbW1hbmQgZ2l2ZW5cbiIpOwoJCQlyZXR1cm4gLTE7CgkJY2FzZSAweGMwOgoJCQkqYnl0ZXMgPSAwOwoJCQlmcHJpbnRmKHN0ZGVyciwKCQkJCSJhYm5vcm1hbCB0ZXJtaW5hdGlvbiBjYXVzZWQgYnkgcG9sbGluZ1xuIik7CgkJCXJldHVybiAtMTsKCQlkZWZhdWx0OgoJCQlicmVhazsKCX0KI2lmZGVmIEZEX1JBV19NT1JFCglpZihyYXdfY21kLT5mbGFncyAmIEZEX1JBV19NT1JFKQoJCXJldHVybiAxOwojZW5kaWYKCXJldHVybiAwOwp9CgojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9mZDAiLCAnQScsIDAsIDAsIDgwLDIsIDE4LDAsIE1ERUZfQVJHIH0sCgl7Ii9kZXYvZmQxIiwgJ0InLCAwLCAwLCAwLDAsIDAsMCwgRkRFRl9BUkcgfSwKCS8qIHdlIGFzc3VtZSB0aGF0IHRoZSBaaXAgb3IgSmF6IGRyaXZlIGlzIHRoZSBzZWNvbmQgb24gdGhlIFNDU0kgYnVzICovCgl7Ii9kZXYvc2RiNCIsJ0onLCBHRU5IRCB9LAoJeyIvZGV2L3NkYjQiLCdaJywgR0VOSEQgfSwKCS8qCXsiL2Rldi9zZGE0IiwnRCcsIEdFTkhEIH0sKi8KCVJFTU9URQp9OwoKLyoKICogU3R1ZmZpbmcgYmFjayB0aGUgZmxvcHB5IHBhcmFtZXRlcnMgaW50byB0aGUgZHJpdmVyIGFsbG93cyBmb3IgZ2VtcwogKiBsaWtlIDIxIHNlY3RvciBvciBzaW5nbGUgc2lkZWQgZmxvcHBpZXMgZnJvbSBBdGFyaSBTVCBzeXN0ZW1zLgogKgogKiBBbGFpbiBLbmFmZiwgVW5pdmVyc2l06SBKb3NlcGggRm91cmllciwgRnJhbmNlLCBOb3ZlbWJlciAxMiwgMTk5My4KICovCgoKI2RlZmluZSBJTklUX0dFTkVSSUMKI2RlZmluZSBnZW5lcmljX2Zsb3BweV9zdHJ1Y3QgZmxvcHB5X3N0cnVjdAojZGVmaW5lIEJMT0NLX01BSk9SIDIKI2RlZmluZSBTRUNUT1JTKGZsb3BweSkgZmxvcHB5LnNlY3QKI2RlZmluZSBUUkFDS1MoZmxvcHB5KSBmbG9wcHkudHJhY2sKI2RlZmluZSBIRUFEUyhmbG9wcHkpIGZsb3BweS5oZWFkCiNkZWZpbmUgU0VDVE9SU19QRVJfRElTSyhmbG9wcHkpIGZsb3BweS5zaXplCiNkZWZpbmUgU1RSRVRDSChmbG9wcHkpIGZsb3BweS5zdHJldGNoCiNkZWZpbmUgVVNFXzJNKGZsb3BweSkgKChmbG9wcHkucmF0ZSAmIEZEXzJNKSA/IDB4ZmYgOiAweDgwICkKI2RlZmluZSBTU0laRShmbG9wcHkpICgoKChmbG9wcHkucmF0ZSAmIDB4MzgpID4+IDMgKSArIDIpICUgOCkKCnN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0XzJtKHN0cnVjdCBmbG9wcHlfc3RydWN0ICpmbG9wcHksIHVuc2lnbmVkIGludCB2YWx1ZSkKewoJdWludDhfdCB2OwoJaWYgKHZhbHVlICYgMHg3ZikKCQl2ID0gRkRfMk07CgllbHNlCgkJdiA9IDA7CglmbG9wcHktPnJhdGUgPSAoZmxvcHB5LT5yYXRlICYgfkZEXzJNKSB8IHY7Cn0KI2RlZmluZSBTRVRfMk0gc2V0XzJtCgpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9zc2l6ZShzdHJ1Y3QgZmxvcHB5X3N0cnVjdCAqZmxvcHB5LCBpbnQgdmFsdWUpCnsKCXVpbnQ4X3QgdiA9ICh1aW50OF90KSAoKCggKHZhbHVlICYgNykgKyA2ICkgJSA4KSA8PCAzKTsKCglmbG9wcHktPnJhdGUgPSAoZmxvcHB5LT5yYXRlICYgfjB4MzgpIHwgdjsKfQoKI2RlZmluZSBTRVRfU1NJWkUgc2V0X3NzaXplCgpzdGF0aWMgX19pbmxpbmVfXyBpbnQgc2V0X3BhcmFtZXRlcnMoaW50IGZkLCBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCAqZmxvcHB5LAoJCQkJICAgICBzdHJ1Y3QgTVRfU1RBVCAqYnVmKQp7CglpZiAoICggTUlOT1IoYnVmLT5zdF9yZGV2ICkgJiAweDdmICkgPiAzICkKCQlyZXR1cm4gMTsKCglyZXR1cm4gaW9jdGwoZmQsIEZEU0VUUFJNLCBmbG9wcHkpOwp9CgpzdGF0aWMgX19pbmxpbmVfXyBpbnQgZ2V0X3BhcmFtZXRlcnMoaW50IGZkLCBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCAqZmxvcHB5KQp7CglyZXR1cm4gaW9jdGwoZmQsIEZER0VUUFJNLCBmbG9wcHkpOwp9CgojaW5jbHVkZSAibGludXgvaGRyZWcuaCIKI2luY2x1ZGUgImxpbnV4L2ZzLmgiCgpzdGF0aWMgdWludDMyX3QgdWxvbmdfdG9fc2VjdG9ycyh1bnNpZ25lZCBsb25nIHJhd19zZWN0KSB7CgkvKiBOdW1iZXIgb2Ygc2VjdG9ycyBtdXN0IGZpdCBpbnRvIDMyYml0IHZhbHVlICovCglpZiAocmF3X3NlY3QgPiBVTE9OR19NQVgpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IHNlY3RvcnMgZm9yIEZBVCAlOGx4XG4iLHJhd19zZWN0KTsKCQlleGl0KDEpOwoJfQoJcmV0dXJuICh1aW50MzJfdCkgcmF3X3NlY3Q7Cn0KCmludCBnZXRfc2VjdG9yX3NpemUoaW50IGZkKSB7CglpbnQgc2VjX3NpemU7CglpZiAoaW9jdGwoZmQsIEJMS1NTWkdFVCwgJnNlY19zaXplKSAhPSAwIHx8IHNlY19zaXplIDw9IDApIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgc2VjdG9yIHNpemUgb2YgZGV2aWNlICglcykiLAoJCQlzdHJlcnJvcihlcnJubykpOwoJCXJldHVybiAtMTsKCX0KCgkvKiBDYXAgc2VjdG9yIHNpemUgYXQgNDA5NiAqLwoJaWYoc2VjX3NpemUgPiA0MDk2KQoJCXNlY19zaXplID0gNDA5NjsKCXJldHVybiBzZWNfc2l6ZTsKfQoKc3RhdGljIGludCBnZXRfYmxvY2tfZ2VvbShpbnQgZmQsIHN0cnVjdCBkZXZpY2UgKmRldikgewoJc3RydWN0IGhkX2dlb21ldHJ5IGdlb207CglpbnQgc2VjX3NpemU7Cgl1bnNpZ25lZCBsb25nIHNpemU7Cgl1aW50MTZfdCBoZWFkcz1kZXYtPmhlYWRzOwoJdWludDE2X3Qgc2VjdG9ycz1kZXYtPnNlY3RvcnM7Cgl1aW50MzJfdCBzZWN0X3Blcl90cmFjazsKCglpZiAoaW9jdGwoZmQsIEhESU9fR0VUR0VPLCAmZ2VvbSkgPCAwKSB7CgkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIGRldmljZSAoJXMpIiwKCQkJc3RyZXJyb3IoZXJybm8pKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPCAwKSB7CgkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IHNpemUgb2YgZGV2aWNlICglcykiLAoJCQlzdHJlcnJvcihlcnJubykpOwoJCXJldHVybiAtMTsKCX0KCglzZWNfc2l6ZSA9IGdldF9zZWN0b3Jfc2l6ZShmZCk7CglpZihzZWNfc2l6ZSA8IDApCgkJcmV0dXJuIC0xOwoKCWRldi0+c3NpemUgPSAwOwoJd2hpbGUgKGRldi0+c3NpemUgPCAweDdGICYmICgxMjggPDwgZGV2LT5zc2l6ZSkgPCBzZWNfc2l6ZSkKCQlkZXYtPnNzaXplKys7CgoJaWYoIWhlYWRzKQoJCWhlYWRzID0gZ2VvbS5oZWFkczsKCWlmKCFzZWN0b3JzKQoJCXNlY3RvcnMgPSBnZW9tLnNlY3RvcnM7CgoJc2VjdF9wZXJfdHJhY2sgPSBoZWFkcyAqIHNlY3RvcnM7CglpZighZGV2LT5oaWRkZW4pIHsKCQl1aW50MzJfdCBoaWRkZW47CgkJaGlkZGVuID0gZ2VvbS5zdGFydCAlIHNlY3RfcGVyX3RyYWNrOwoJCWlmKGhpZGRlbiAmJiBoaWRkZW4gIT0gc2VjdG9ycykgewoJCQlmcHJpbnRmKHN0ZGVyciwKCQkJCSJIaWRkZW4gKCVkKSBkb2VzIG5vdCBtYXRjaCBzZWN0b3JzICglZClcbiIsCgkJCQloaWRkZW4sIHNlY3RvcnMpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCWRldi0+aGlkZGVuID0gaGlkZGVuOwoJfQoJZGV2LT5oZWFkcyA9IGhlYWRzOwoJZGV2LT5zZWN0b3JzID0gc2VjdG9yczsKCWlmKCFkZXYtPnRyYWNrcykKCQlkZXYtPnRyYWNrcyA9IHVsb25nX3RvX3NlY3RvcnMoKHNpemUgKyBkZXYtPmhpZGRlbiAlIHNlY3RfcGVyX3RyYWNrKSAvIHNlY3RfcGVyX3RyYWNrKTsKCXJldHVybiAwOwp9CgojZGVmaW5lIEhBVkVfR0VUX0JMT0NLX0dFT00KCiNlbmRpZiAvKiBsaW51eCAqLwoKCi8qIE9TLzIsIGdjYytlbXggKi8KI2lmZGVmIF9fRU1YX18KI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7CiAgeyJBOiIsICdBJywgR0VORkR9LAogIHsiQjoiLCAnQicsIEdFTkZEfSwKfTsKI2RlZmluZSBJTklUX05PT1AKI2VuZGlmCgoKCi8qKiogL2plcyAtLSBmb3IgRC5PLlMuIDQ4NiBCTCBEWDIvODAgKioqLwovKioqIEplYW4tTWFyYyBadWNjb25pIDxqbXpARnJlZUJTRC5vcmc+IDIwMDEvMDMvMzAgKioqLwojaWZkZWYgT1NfZnJlZWJzZAojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9mZDAuMTQ0MCIsICdBJywgRkhEMzEyfSwKCXsiL2Rldi9mZDAuNzIwIiwgICdBJywgRkREMzEyfSwKCXsiL2Rldi9mZDEuMTIwMCIsICdCJywgTUhENTE0fSwKCXsiL2Rldi9zZDBzMSIsICAgICAnQycsIEdFTkhEfSwKCVJFTU9URQp9OwojZW5kaWYgLyogX19GcmVlQlNEX18gKi8KCi8qKiogL2plcyAtLSBmb3IgQUxSIDQ4NiBEWDQvMTAwICoqKi8KI2lmIGRlZmluZWQoT1NfbmV0YnNkKSB8fCBkZWZpbmVkKE9TX25ldGJzZGVsZikKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvcmZkMGEiLCAnQScsIEZIRDMxMn0sCgl7Ii9kZXYvcmZkMGYiLCAnQScsIEZERDMxMn0sCgl7Ii9kZXYvcmZkMGYiLCAnUycsIE1ERDMxMn0sCgl7Ii9kZXYvcmZkMWEiLCAnQicsIEZIRDUxNH0sCgl7Ii9kZXYvcmZkMWQiLCAnQicsIEZERDUxNH0sCgl7Ii9kZXYvcmZkMWQiLCAnVCcsIE1ERDUxNH0sCgl7Ii9kZXYvcndkMGQiLCAnQycsIDE2LCAwLCAwLCAwLCAwLCAwLCA2M0wqNTEyTCwgREVGX0FSRzAoMCl9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBPU19OZXRCU0QgKi8KCi8qIGZnc2NoQG9wZW5ic2Qub3JnIDIwMDAvMDUvMTkgKi8KI2lmIGRlZmluZWQoT1Nfb3BlbmJzZCkKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvcmZkMEJjIiwgJ0EnLCBGSEQzMTJ9LAoJeyIvZGV2L3JmZDBGYyIsICdBJywgRkREMzEyfSwKCXsiL2Rldi9yZmQxQ2MiLCAnQicsIEZIRDUxNH0sCgl7Ii9kZXYvcmZkMURjIiwgJ0InLCBGREQ1MTR9LAoJeyIvZGV2L3J3ZDBjIiwgJ0MnLCAxNiwgMCwgMCwgMCwgMCwgMCwgNjNMKjUxMkwsIERFRl9BUkcwKDApfSwKCVJFTU9URQp9OwojZW5kaWYgLyogT1Nfb3BlbmJzZCAqLwoKCgojaWYgKCFkZWZpbmVkKHByZWRlZmluZWRfZGV2aWNlcykgJiYgZGVmaW5lZCAoQ1BVX202ODAwMCkgJiYgZGVmaW5lZCAoT1Nfc3lzdikpCiNpbmNsdWRlIDxzeXMvZ2Rpb2N0bC5oPgoKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvcmZwMDIwIiwJCSdBJywgMTIsT19OREVMQVksNDAsMiwgOSwgMCwgTURFRl9BUkd9LAoJeyIvdXNyL2Jpbi9ET1MvZHZkMDAwIiwgJ0MnLCBHRU5GRH0sCglSRU1PVEUKfTsKCiN1bmRlZiBJTklUX05PT1AKaW50IGluaXRfZ2VvbShpbnQgZmQsIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqb3JpZ19kZXYsCgkgICAgICBzdHJ1Y3QgTVRfU1RBVCAqc3RhdGJ1ZikKewoJc3RydWN0IGdkY3RsIGdkYnVmOwoKCWlmIChpb2N0bChmZCwgR0RHRVRBLCAmZ2RidWYpID09IC0xKSB7CgkJaW9jdGwoZmQsIEdERElTTU5ULCAmZ2RidWYpOwoJCXJldHVybiAxOwoJfQoJaWYoKGRldi0+dXNlXzJtICYgMHg3ZikgfHwgKGRldi0+c3NpemUgJiAweDdmKSkKCQlyZXR1cm4gMTsKCglTRVRfSU5UKGdkYnVmLnBhcmFtcy5jeWxzLGRldi0+bnRyYWNrcyk7CglTRVRfSU5UKGdkYnVmLnBhcmFtcy5oZWFkcyxkZXYtPm5oZWFkcyk7CglTRVRfSU5UKGdkYnVmLnBhcmFtcy5wc2VjdHJrLGRldi0+bnNlY3QpOwoJZGV2LT5udHJhY2tzID0gZ2RidWYucGFyYW1zLmN5bHM7CglkZXYtPm5oZWFkcyA9IGdkYnVmLnBhcmFtcy5oZWFkczsKCWRldi0+bnNlY3QgPSBnZGJ1Zi5wYXJhbXMucHNlY3RyazsKCWRldi0+dXNlXzJtID0gMHg4MDsKCWRldi0+c3NpemUgPSAweDAyOwoKCWdkYnVmLnBhcmFtcy5wc2VjY3lsID0gZ2RidWYucGFyYW1zLnBzZWN0cmsgKiBnZGJ1Zi5wYXJhbXMuaGVhZHM7CglnZGJ1Zi5wYXJhbXMuZmxhZ3MgPSAxOwkJLyogZGlzayB0eXBlIGZsYWcgKi8KCWdkYnVmLnBhcmFtcy5zdGVwID0gMDsJCS8qIHN0ZXAgcmF0ZSBmb3IgY29udHJvbGxlciAqLwoJZ2RidWYucGFyYW1zLnNlY3RvcnN6ID0gNTEyOwkvKiBzZWN0b3Igc2l6ZSAqLwoKCWlmIChpb2N0bChmZCwgR0RTRVRBLCAmZ2RidWYpIDwgMCkgewoJCWlvY3RsKGZkLCBHRERJU01OVCwgJmdkYnVmKTsKCQlyZXR1cm4oMSk7Cgl9CglyZXR1cm4oMCk7Cn0KI2VuZGlmIC8qIChkZWZpbmVkIChtNjgwMDApICYmIGRlZmluZWQgKHN5c3YpKSovCgojaWZkZWYgQ1BVX2FscGhhCiNpZm5kZWYgT1Nfb3NmNAojaWZkZWYgX19vc2ZfXwojaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJeyIvZGV2L3JmZDBjIiwJCSdBJywgR0VORkR9LAoJUkVNT1RFCn07CiNlbmRpZgojZW5kaWYKI2VuZGlmCgojaWZkZWYgT1Nfb3NmCiNpZm5kZWYgcHJlZGVmaW5lZF9kZXZpY2VzCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJeyIvZGV2L2ZkMGEiLCAnQScsICBNSEQzMTIgfSB9OwoJUkVNT1RFCiNlbmRpZgojZW5kaWYKCgojaWZkZWYgT1NfbmV4dHN0ZXAKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7CiNpZmRlZiBDUFVfbTY4awoJeyIvZGV2L3JmZDBiIiwgJ0EnLCBNRUQzMTIgfSwKCVJFTU9URQojZWxzZQoJeyIvZGV2L3JmZDBiIiwgJ0EnLCBNSEQzMTIgfSwKCVJFTU9URQojZW5kaWYKfTsKI2VuZGlmCgoKI2lmICghZGVmaW5lZChwcmVkZWZpbmVkX2RldmljZXMpICYmIGRlZmluZWQoT1Nfc3lzdjQpKQojaWZkZWYgX191eHBfXwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKICAgICAgeyIvZGV2L2ZwZDAiLCAgICdBJywgRkhEMzEyfSwKICAgICAgeyIvZGV2L2ZwZDAiLCAgICdBJywgRkREMzEyfSwKCSAgUkVNT1RFCn07CiNlbHNlCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJeyIvZGV2L3Jkc2svZjFxMTVkdCIsCSdCJywgRkhENTE0fSwKCXsiL2Rldi9yZHNrL2YxZDlkdCIsCSdCJywgRkRENTE0fSwKCXsiL2Rldi9yZHNrL2YxZDhkdCIsCSdCJywgRkREc21hbGx9LAoJeyIvZGV2L3Jkc2svZjAzaHQiLAknQScsIEZIRDMxMn0sCgl7Ii9kZXYvcmRzay9mMDNkdCIsCSdBJywgRkREMzEyfSwKCXsiL2Rldi9yZHNrL2RvcyIsCSdDJywgR0VOSER9LAoJUkVNT1RFCn07CiNlbmRpZgojZW5kaWYgLyogc3lzdjQgKi8KCiNpZmRlZiBPU19taW5ndzMybXN2YwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKICAgeyJcXFxcLlxcQToiLCAnQScsIEdFTkZEIH0sCn07CiNlbmRpZgoKI2lmZGVmIElOSVRfR0VORVJJQwoKI2lmbmRlZiBVU0VfMk0KI2RlZmluZSBVU0VfMk0oeCkgMHg4MAojZW5kaWYKCiNpZm5kZWYgU1NJWkUKI2RlZmluZSBTU0laRSh4KSAweDAyCiNlbmRpZgoKI2lmbmRlZiBTRVRfMk0KI2RlZmluZSBTRVRfMk0oeCx5KSByZXR1cm4gLTEKI2VuZGlmCgojaWZuZGVmIFNFVF9TU0laRQojZGVmaW5lIFNFVF9TU0laRSh4LHkpIHJldHVybiAtMQojZW5kaWYKCiN1bmRlZiBJTklUX05PT1AKaW50IGluaXRfZ2VvbShpbnQgZmQsIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqb3JpZ19kZXYsCgkgICAgICBzdHJ1Y3QgTVRfU1RBVCAqc3RhdGJ1ZikKewoJc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdCBmbG9wcHk7CglpbnQgY2hhbmdlOwoKI2lmZGVmIEhBVkVfR0VUX0JMT0NLX0dFT00KCS8qKgoJICogQmxvY2sgZGV2aWNlIHdoaWNoICppc24ndCogYSBmbG9wcHkgZGV2aWNlCgkgKi8KCWlmIChTX0lTQkxLKHN0YXRidWYtPnN0X21vZGUpICYmCgkgICAgbWFqb3Ioc3RhdGJ1Zi0+c3RfcmRldikgIT0gQkxPQ0tfTUFKT1IpIHsKCQlnZXRfYmxvY2tfZ2VvbShmZCwgZGV2KTsKCQlyZXR1cm4gY29tcGFyZV9nZW9tKGRldiwgb3JpZ19kZXYpOwoJfQojZW5kaWYKCgkvKgoJICogc3VjY2VlZCBpZiB3ZSBkb24ndCBoYXZlIGEgZmxvcHB5CgkgKiB0aGlzIGlzIHRoZSBjYXNlIGZvciBkb3NlbXUgZmxvcHB5IGltYWdlIGZpbGVzIGZvciBpbnN0YW5jZQoJICovCglpZiAoISgoU19JU0JMSyhzdGF0YnVmLT5zdF9tb2RlKSAmJgoJICAgICAgIG1ham9yKHN0YXRidWYtPnN0X3JkZXYpID09IEJMT0NLX01BSk9SKQojaWZkZWYgQ0hBUl9NQUpPUgoJICAgICAgfHwgKFNfSVNDSFIoc3RhdGJ1Zi0+c3RfbW9kZSkgJiYKCQkgIG1ham9yKHN0YXRidWYtPnN0X3JkZXYpID09IENIQVJfTUFKT1IpCiNlbmRpZgoJCSkpCgkJcmV0dXJuIGNvbXBhcmVfZ2VvbShkZXYsIG9yaWdfZGV2KTsKCgkvKgoJICogV2UgZmlyc3QgdHJ5IHRvIGdldCB0aGUgY3VycmVudCBmbG9wcHkgcGFyYW1ldGVycyBmcm9tIHRoZSBrZXJuZWwuCgkgKiBUaGlzIGFsbG93cyB1cyB0bwoJICogMS4gZ2V0IHRoZSByYXRlCgkgKiAyLiBza2lwIHRoZSBwYXJhbWV0ZXIgc2V0dGluZyBpZiB0aGUgcGFyYW1ldGVycyBhcmUgYWxyZWFkeSBvLmsuCgkgKi8KCglpZiAoZ2V0X3BhcmFtZXRlcnMoIGZkLCAmIGZsb3BweSApICkKCQkvKgoJCSAqIGF1dG9kZXRlY3Rpb24gZmFpbHVyZS4KCQkgKiBUaGlzIG1vc3RseSBvY2N1cnMgYmVjYXVzZSBvZiBhbiBhYnNlbnQgb3IgdW5mb3JtYXR0ZWQgZGlza3MuCgkJICoKCQkgKiBJdCBtaWdodCBhbHNvIG9jY3VyIGJlY2F1c2Ugb2YgYml6YXJyZSBmb3JtYXRzIChmb3IgZXhhbXBsZQoJCSAqIHJhdGUgMSBvbiBhIDMgMS8yIGRpc2spLgoKCQkgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgdXNlciBzaG91bGQgZG8gYW4gZXhwbGljaXQKCQkgKiBzZXRmZHBybSBiZWZvcmUgY2FsbGluZyBtdG9vbHMKCQkgKgoJCSAqIEFub3RoZXIgY2F1c2UgbWlnaHQgYmUgcHJlLWV4aXN0aW5nIHdyb25nIHBhcmFtZXRlcnMuIFRoZQoJCSAqIHVzZXIgc2hvdWxkIGRvIGFuIHNldGZkcHJtIC1jIHRvIHJlcGFpciB0aGlzIHNpdHVhdGlvbi4KCQkgKgoJCSAqIC4uLmZhaWwgaW1tZWRpYXRlbHkuLi4gKCBUaGVvcmV0aWNhbGx5LCB3ZSBjb3VsZCB0cnkgdG8gc2F2ZQoJCSAqIHRoZSBzaXR1YXRpb24gYnkgdHJ5aW5nIG91dCBhbGwgcmF0ZXMsIGJ1dCBpdCB3b3VsZCBiZSBzbG93CgkJICogYW5kIGF3a3dhcmQpCgkJICovCgkJcmV0dXJuIDE7CgoKCS8qCgkgKiBpZiB3ZSBoYXZlIGFscmVhZHkgaGF2ZSB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzLCBrZWVwIHRoZW0uCgkgKiB0aGUgbnVtYmVyIG9mIHRyYWNrcyBkb2Vzbid0IG5lZWQgdG8gbWF0Y2ggZXhhY3RseSwgaXQgbWF5IGJlIGJpZ2dlci4KCSAqIHRoZSBudW1iZXIgb2YgaGVhZHMgYW5kIHNlY3RvcnMgbXVzdCBtYXRjaCBleGFjdGx5LCB0byBhdm9pZAoJICogbWlzY2FsY3VsYXRpb24gb2YgdGhlIGxvY2F0aW9uIG9mIGEgYmxvY2sgb24gdGhlIGRpc2sKCSAqLwoJY2hhbmdlID0gMDsKCWlmKGNvbXBhcmUoZGV2LT5zZWN0b3JzLCBTRUNUT1JTKGZsb3BweSkpKXsKCQlTRUNUT1JTKGZsb3BweSkgPSBkZXYtPnNlY3RvcnM7CgkJY2hhbmdlID0gMTsKCX0gZWxzZQoJCWRldi0+c2VjdG9ycyA9ICh1aW50MTZfdCkgU0VDVE9SUyhmbG9wcHkpOwoKCWlmKGNvbXBhcmUoZGV2LT5oZWFkcywgSEVBRFMoZmxvcHB5KSkpewoJCUhFQURTKGZsb3BweSkgPSBkZXYtPmhlYWRzOwoJCWNoYW5nZSA9IDE7Cgl9IGVsc2UKCQlkZXYtPmhlYWRzID0gKHVpbnQxNl90KSBIRUFEUyhmbG9wcHkpOwoKCWlmKGNvbXBhcmUoZGV2LT50cmFja3MsICh1bnNpZ25lZCBpbnQpIFRSQUNLUyhmbG9wcHkpKSl7CgkJVFJBQ0tTKGZsb3BweSkgPSBkZXYtPnRyYWNrczsKCQljaGFuZ2UgPSAxOwoJfSBlbHNlCgkJZGV2LT50cmFja3MgPSBUUkFDS1MoZmxvcHB5KTsKCgoJaWYoY29tcGFyZShkZXYtPnVzZV8ybSwgVVNFXzJNKGZsb3BweSkpKXsKCQlTRVRfMk0oJmZsb3BweSwgZGV2LT51c2VfMm0pOwoJCWNoYW5nZSA9IDE7Cgl9IGVsc2UKCQlkZXYtPnVzZV8ybSA9IFVTRV8yTShmbG9wcHkpOwoKCWlmKCAhIChkZXYtPnNzaXplICYgMHg4MCkgKQoJCWRldi0+c3NpemUgPSAwOwoJaWYoY29tcGFyZShkZXYtPnNzaXplLCBTU0laRShmbG9wcHkpICsgMTI4KSl7CgkJU0VUX1NTSVpFKCZmbG9wcHksIGRldi0+c3NpemUpOwoJCWNoYW5nZSA9IDE7Cgl9IGVsc2UKCQlkZXYtPnNzaXplID0gU1NJWkUoZmxvcHB5KTsKCglpZighY2hhbmdlKQoJCS8qIG5vIGNoYW5nZSwgc3VjY2VlZCAqLwoJCXJldHVybiAwOwoKI2lmZGVmIFNFQ1RPUlNfUEVSX1RSQUNLCglTRUNUT1JTX1BFUl9UUkFDSyhmbG9wcHkpID0gZGV2LT5zZWN0b3JzICogZGV2LT5oZWFkczsKI2VuZGlmCgojaWZkZWYgU0VDVE9SU19QRVJfRElTSwoJU0VDVE9SU19QRVJfRElTSyhmbG9wcHkpID0gZGV2LT5zZWN0b3JzICogZGV2LT5oZWFkcyAqIGRldi0+dHJhY2tzOwojZW5kaWYKCiNpZmRlZiBTVFJFVENICgkvKiAuLi4gYW5kIHRoZSBzdHJldGNoICovCglpZiAoIGRldi0+dHJhY2tzID4gNDEgKQoJCVNUUkVUQ0goZmxvcHB5KSA9IDA7CgllbHNlCgkJU1RSRVRDSChmbG9wcHkpID0gMTsKI2VuZGlmCgoJcmV0dXJuIHNldF9wYXJhbWV0ZXJzKCBmZCwgJmZsb3BweSwgc3RhdGJ1Zik7Cn0KI2VuZGlmIC8qIElOSVRfR0VORVJJQyAqLwoKI2lmZGVmIElOSVRfTk9PUAppbnQgaW5pdF9nZW9tKGludCBmZCwgc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpvcmlnX2RldiwKCQkJICBzdHJ1Y3QgTVRfU1RBVCAqc3RhdGJ1ZikKewoJcmV0dXJuIGNvbXBhcmVfZ2VvbShkZXYsIG9yaWdfZGV2KTsKfQojZW5kaWYKCiNpZmRlZiBwcmVkZWZpbmVkX2RldmljZXMKY29uc3QgdW5zaWduZWQgaW50IG5yX2NvbnN0X2RldmljZXMgPSBzaXplb2YoY29uc3RfZGV2aWNlcykgLyBzaXplb2YoKmNvbnN0X2RldmljZXMpOwojZWxzZQpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXT17Cgl7Ii9kZXYvZmQwIiwgJ0EnLCAwLCBPX0VYQ0wsIDAsMCwgMCwwLCBNREVGX0FSR30sCgkvKiB0byBzaHV0IHVwIFVsdHJpeCdzIG5hdGl2ZSBjb21waWxlciwgd2UgY2FuJ3QgbWFrZSB0aGlzIGVtcHR5IDooICovCn07CmNvbnN0IHVuc2lnbmVkIGludCBucl9jb25zdF9kZXZpY2VzID0gMDsKI2VuZGlmCg==