LyogIENvcHlyaWdodCAxOTg2LTE5OTIgRW1tZXQgUC4gR3JheS4KICogIENvcHlyaWdodCAxOTk2LTIwMDMsMjAwNiwyMDA3LDIwMDkgQWxhaW4gS25hZmYuCiAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiBtdG9vbHMuCiAqCiAqICBNdG9vbHMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgTXRvb2xzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhbG9uZyB3aXRoIE10b29scy4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICovCgovKgogKiBEZXZpY2UgdGFibGVzLiAgU2VlIHRoZSBDb25maWd1cmUgZmlsZSBmb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbi4KICovCgojZGVmaW5lIE5PX1RFUk1JTwojaW5jbHVkZSAic3lzaW5jbHVkZXMuaCIKI2luY2x1ZGUgIm1zZG9zLmgiCiNpbmNsdWRlICJtdG9vbHMuaCIKI2luY2x1ZGUgImRldmljZXMuaCIKCiNkZWZpbmUgSU5JVF9OT09QCgojZGVmaW5lIERFRl9BUkcxKHgpICh4KSwgMHgyLDAsKGNoYXIgKikwLCAwLCAwCiNkZWZpbmUgREVGX0FSRzAoeCkgMCxERUZfQVJHMSh4KQoKI2RlZmluZSBNREVGX0FSRyAwTCxERUZfQVJHMChNRk9STUFUX09OTFlfRkxBRykKI2RlZmluZSBGREVGX0FSRyAwTCxERUZfQVJHMCgwKQojZGVmaW5lIFZPTERfREVGX0FSRyAwTCxERUZfQVJHMChWT0xEX0ZMQUd8TUZPUk1BVF9PTkxZX0ZMQUcpCgojZGVmaW5lIE1FRDMxMgkxMiwwLDgwLDIsMzYsMCxNREVGX0FSRyAvKiAzIDEvMiBleHRyYSBkZW5zaXR5ICovCiNkZWZpbmUgTUhEMzEyCTEyLDAsODAsMiwxOCwwLE1ERUZfQVJHIC8qIDMgMS8yIGhpZ2ggZGVuc2l0eSAqLwojZGVmaW5lIE1ERDMxMgkxMiwwLDgwLDIsIDksMCxNREVGX0FSRyAvKiAzIDEvMiBkb3VibGUgZGVuc2l0eSAqLwojZGVmaW5lIE1IRDUxNAkxMiwwLDgwLDIsMTUsMCxNREVGX0FSRyAvKiA1IDEvNCBoaWdoIGRlbnNpdHkgKi8KI2RlZmluZSBNREQ1MTQJMTIsMCw0MCwyLCA5LDAsTURFRl9BUkcgLyogNSAxLzQgZG91YmxlIGRlbnNpdHkgKDM2MGspICovCiNkZWZpbmUgTVNTNTE0CTEyLDAsNDAsMSwgOSwwLE1ERUZfQVJHIC8qIDUgMS80IHNpbmdsZSBzaWRlZCBERCwgKDE4MGspICovCiNkZWZpbmUgTUREc21hbGwJMTIsMCw0MCwyLCA4LDAsTURFRl9BUkcgLyogNSAxLzQgZG91YmxlIGRlbnNpdHkgKDMyMGspICovCiNkZWZpbmUgTVNTc21hbGwJMTIsMCw0MCwxLCA4LDAsTURFRl9BUkcgLyogNSAxLzQgc2luZ2xlIHNpZGVkIERELCAoMTYwaykgKi8KCiNkZWZpbmUgRkVEMzEyCTEyLDAsODAsMiwzNiwwLEZERUZfQVJHIC8qIDMgMS8yIGV4dHJhIGRlbnNpdHkgKi8KI2RlZmluZSBGSEQzMTIJMTIsMCw4MCwyLDE4LDAsRkRFRl9BUkcgLyogMyAxLzIgaGlnaCBkZW5zaXR5ICovCiNkZWZpbmUgRkREMzEyCTEyLDAsODAsMiwgOSwwLEZERUZfQVJHIC8qIDMgMS8yIGRvdWJsZSBkZW5zaXR5ICovCiNkZWZpbmUgRkhENTE0CTEyLDAsODAsMiwxNSwwLEZERUZfQVJHIC8qIDUgMS80IGhpZ2ggZGVuc2l0eSAqLwojZGVmaW5lIEZERDUxNAkxMiwwLDQwLDIsIDksMCxGREVGX0FSRyAvKiA1IDEvNCBkb3VibGUgZGVuc2l0eSAoMzYwaykgKi8KI2RlZmluZSBGU1M1MTQJMTIsMCw0MCwxLCA5LDAsRkRFRl9BUkcgLyogNSAxLzQgc2luZ2xlIHNpZGVkIERELCAoMTgwaykgKi8KI2RlZmluZSBGRERzbWFsbAkxMiwwLDQwLDIsIDgsMCxGREVGX0FSRyAvKiA1IDEvNCBkb3VibGUgZGVuc2l0eSAoMzIwaykgKi8KI2RlZmluZSBGU1NzbWFsbAkxMiwwLDQwLDEsIDgsMCxGREVGX0FSRyAvKiA1IDEvNCBzaW5nbGUgc2lkZWQgREQsICgxNjBrKSAqLwoKI2RlZmluZSBHRU5IRAkxNiwwLCAwLDAsIDAsMCxNREVGX0FSRyAvKiBHZW5lcmljIDE2IGJpdCBGQVQgZnMgKi8KI2RlZmluZSBHRU5GRAkxMiwwLDgwLDIsMTgsMCxNREVGX0FSRyAvKiBHZW5lcmljIDEyIGJpdCBGQVQgZnMgKi8KI2RlZmluZSBWT0xERkQJMTIsMCw4MCwyLDE4LDAsVk9MRF9ERUZfQVJHIC8qIEdlbmVyaWMgMTIgYml0IEZBVCBmcyB3aXRoIHZvbGQgKi8KI2RlZmluZSBHRU4gICAgCSAwLDAsIDAsMCwgMCwwLE1ERUZfQVJHIC8qIEdlbmVyaWMgZnMgb2YgYW55IEZBVCBiaXRzICovCgojZGVmaW5lIFpJUEpBWih4LGMsaCxzLHkpIDE2LCh4KSwoYyksKGgpLChzKSwocyksMEwsIDQsIFwKCQlERUZfQVJHMSgoeSl8TUZPUk1BVF9PTkxZX0ZMQUcpIC8qIEpheiBkaXNrcyAqLwoKI2RlZmluZSBKQVooeCkJIFpJUEpBWih4LDEwMjEsIDY0LCAzMiwgMCkKI2RlZmluZSBSSkFaKHgpCSBaSVBKQVooeCwxMDIxLCA2NCwgMzIsIFNDU0lfRkxBR3xQUklWX0ZMQUcpCiNkZWZpbmUgWklQKHgpCSBaSVBKQVooeCw5NiwgNjQsIDMyLCAwKQojZGVmaW5lIFJaSVAoeCkJIFpJUEpBWih4LDk2LCA2NCwgMzIsIFNDU0lfRkxBR3xQUklWX0ZMQUcpCgojZGVmaW5lIFJFTU9URSAgICB7IiRESVNQTEFZIiwgJ1gnLCAwLDAsIDAsMCwgMCwwLDBMLCBERUZfQVJHMChGTE9QUFlEX0ZMQUcpLDAsMH0KCgoKI2lmIGRlZmluZWQoSU5JVF9HRU5FUklDKSB8fCBkZWZpbmVkKElOSVRfTk9PUCkKc3RhdGljIGludCBjb21wYXJlX2dlb20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpvcmlnX2RldikKewoJaWYoSVNfTUZPUk1BVF9PTkxZKG9yaWdfZGV2KSkKCQlyZXR1cm4gMDsgLyogZ2VvbWV0cnkgb25seSBmb3IgbWZvcm1hdHRpbmcgPT0+IG9rICovCglpZighb3JpZ19kZXYgfHwgIW9yaWdfZGV2LT50cmFja3MgfHwgIWRldiB8fCAhZGV2LT50cmFja3MpCgkJcmV0dXJuIDA7IC8qIG5vIG9yaWdpbmFsIGRldmljZS4gVGhpcyBpcyBvayAqLwoJcmV0dXJuKG9yaWdfZGV2LT50cmFja3MgIT0gZGV2LT50cmFja3MgfHwKCSAgICAgICBvcmlnX2Rldi0+aGVhZHMgIT0gZGV2LT5oZWFkcyB8fAoJICAgICAgIG9yaWdfZGV2LT5zZWN0b3JzICAhPSBkZXYtPnNlY3RvcnMpOwp9CiNlbmRpZgoKI2RlZmluZSBkZXZpY2VzIGNvbnN0X2RldmljZXMKCgojaWZkZWYgX19DWUdXSU5fXwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKICAgeyJcXFxcXFxcXC5cXFxcQToiLCAnQScsIEdFTkZEIH0sCn07CiNlbmRpZiAvKiBDWUdXSU4gKi8KCgojaWZkZWYgT1NfYXV4CiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewogICB7Ii9kZXYvZmxvcHB5MCIsICdBJywgR0VORkQgfSwKICAgeyIvZGV2L3Jkc2svYzEwNGQwczMxIiwgJ0onLCBKQVooT19FWENMKSB9LAogICB7Ii9kZXYvcmRzay9jMTA1ZDBzMzEiLCAnWicsIFpJUChPX0VYQ0wpIH0sCiAgIFJFTU9URQp9OwojZW5kaWYgLyogYXV4ICovCgoKI2lmZGVmIE9TX2x5bnhvcwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9mZDE0NDAuMCIsIAknQScsIE1IRDMxMiB9LAoJUkVNT1RFCn07CiNlbmRpZgoKCiNpZmRlZiBfX0JFT1NfXwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9kaXNrL2Zsb3BweS9yYXciLCAJJ0EnLCBNSEQzMTIgfSwKCVJFTU9URQp9OwojZW5kaWYgLyogQkVCT1ggKi8KCgojaWZkZWYgT1NfaHB1eAoKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7CiNpZmRlZiBPU19ocHV4MTAKLyogaHB1eDEwIHVzZXMgZGlmZmVyZW50IGRldmljZSBuYW1lcyBhY2NvcmRpbmcgdG8gRnJhbmsgTWFyaXRhdG8KICogPGZyYW5rQG1hdGguaG1jLmVkdT4gKi8KCXsiL2Rldi9mbG9wcHkvYzB0MGQwIiwJCSdBJywgTUhEMzEyIH0sCgl7Ii9kZXYvZmxvcHB5L2MwdDBkMSIsCQknQicsIE1IRDMxMiB9LCAvKiBndWVzc2VkIGJ5IG1lICovCiAJeyIvZGV2L3JzY3NpIiwJCQknQycsIEdFTkhEIH0sIC8qIGd1ZXNzZWQgYnkgbWUgKi8KI2Vsc2UKLyogVXNlIHJmbG9wcHksIGFjY29yZGluZyB0byBTaW1hbyBDYW1wb3MgPHNpbWFvQGlyaXMuY3RkLmNvbXNhdC5jb20+ICovCgl7Ii9kZXYvcmZsb3BweS9jMjAxZDBzMCIsCSdBJywgRkhEMzEyIH0sCgl7Ii9kZXYvcmZsb3BweS9jMjBBZDBzMCIsIAknQScsIEZIRDMxMiB9LAogCXsiL2Rldi9yZmxvcHB5L2MyMDFkMXMwIiwJJ0InLCBGSEQzMTIgfSwKIAl7Ii9kZXYvcmZsb3BweS9jMjBBZDFzMCIsCSdCJywgRkhEMzEyIH0sCiAJeyIvZGV2L3JzY3NpIiwJCQknQycsIEdFTkhEIH0sCiNlbmRpZgoJeyIvZGV2L3Jkc2svYzIwMWQ0IiwJCSdKJywgUkpBWihPX0VYQ0wpIH0sCgl7Ii9kZXYvcmRzay9jMjAxZDRzMCIsCQknSicsIFJKQVooT19FWENMKSB9LAoJeyIvZGV2L3Jkc2svYzIwMWQ1IiwJCSdaJywgUlpJUChPX0VYQ0wpIH0sCgl7Ii9kZXYvcmRzay9jMjAxZDVzMCIsCQknWicsIFJaSVAoT19FWENMKSB9LAoJUkVNT1RFCn07CgojaWZkZWYgSEFWRV9TWVNfRkxPUFBZCi8qIGdlb21ldHJ5IHNldHRpbmcgaW9jdGwncyBjb250cmlidXRlZCBieSBQYW9sbyBaZXBwZWdubwogKiA8cGFvbG9AdG8uc2VtLml0PiwgbWF5IGNhdXNlICJOb3QgYSB0eXBld3JpdGVyIiBtZXNzYWdlcyBvbiBvdGhlcgogKiB2ZXJzaW9ucyBhY2NvcmRpbmcgdG8gc3VwcG9ydEB2aXRhbC5jb20gKi8KCiNpbmNsdWRlIDxzeXMvZmxvcHB5Lmg+CiN1bmRlZiBTU0laRQoKc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdAp7CiAgc3RydWN0IGZsb3BweV9nZW9tZXRyeSBmZzsKfTsKCiNkZWZpbmUgQkxPQ0tfTUFKT1IgMjQKI2RlZmluZSBDSEFSX01BSk9SIDExMgoKc3RhdGljIGlubGluZSBpbnQgZ2V0X3BhcmFtZXRlcnMoaW50IGZkLCBzdHJ1Y3QgZ2VuZXJpY19mbG9wcHlfc3RydWN0ICpmbG9wcHkpCnsKCWlmIChpb2N0bChmZCwgRkxPUFBZX0dFVF9HRU9NRVRSWSwgJihmbG9wcHktPmZnKSkgIT0gMCkgewoJCXBlcnJvcigiRkxPUFBZX0dFVF9HRU9NRVRSWSIpOwoJCXJldHVybigxKTsKCX0KCQoJcmV0dXJuIDA7Cn0KCiNkZWZpbmUgVFJBQ0tTKGZsb3BweSkgZmxvcHB5LmZnLnRyYWNrcwojZGVmaW5lIEhFQURTKGZsb3BweSkgZmxvcHB5LmZnLmhlYWRzCiNkZWZpbmUgU0VDVE9SUyhmbG9wcHkpIGZsb3BweS5mZy5zZWN0b3JzCiNkZWZpbmUgRkRfU0VDVFNJWkUoZmxvcHB5KSBmbG9wcHkuZmcuc2VjdG9yX3NpemUKI2RlZmluZSBGRF9TRVRfU0VDVFNJWkUoZmxvcHB5LHYpIHsgZmxvcHB5LmZnLnNlY3Rvcl9zaXplID0gdjsgfQoKc3RhdGljIGlubGluZSBpbnQgc2V0X3BhcmFtZXRlcnMoaW50IGZkLCBzdHJ1Y3QgZ2VuZXJpY19mbG9wcHlfc3RydWN0ICpmbG9wcHksIAoJCQkJIHN0cnVjdCBNVF9TVEFUICpidWYpCnsKCWlmIChpb2N0bChmZCwgRkxPUFBZX1NFVF9HRU9NRVRSWSwgJihmbG9wcHktPmZnKSkgIT0gMCkgewoJCXBlcnJvcigiIik7CgkJcmV0dXJuKDEpOwoJfQoJCglyZXR1cm4gMDsKfQojZGVmaW5lIElOSVRfR0VORVJJQwojZW5kaWYKCiNlbmRpZiAvKiBocHV4ICovCiAKCiNpZiAoZGVmaW5lZChPU19zaW5peCkgfHwgZGVmaW5lZChWRU5ET1Jfc25pKSB8fCBkZWZpbmVkKFNOSSkpCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewojaWZkZWYgQ1BVX21pcHMgICAgIC8qIGZvciBTaWVtZW5zIE5peGRvcmYncyAgU0lOSVgtTi9PIChtaXBzKSA1LjR4IFNWUjQgKi8KCXsgIi9kZXYvYXQvZmxwL2YwdCIsICAgICdBJywgRkhEMzEyfSwKCXsgIi9kZXYvZmQwIiwgICAgICAgICAgICdBJywgR0VORkR9LAojZWxzZQojaWZkZWYgQ1BVX2kzODYgICAgIC8qIGZvciBTaWVtZW5zIE5peGRvcmYncyAgU0lOSVgtRC9MIChpbnRlbCkgNS40eCBTVlI0ICovCgl7ICIvZGV2L2ZkMDEzNWRzMTgiLAknQScsIEZIRDMxMn0sCgl7ICIvZGV2L2ZkMDEzNWRzOSIsCSdBJywgRkREMzEyfSwKCXsgIi9kZXYvZmQwIiwJCSdBJywgR0VORkR9LAoJeyAiL2Rldi9mZDExMzVkczE1IiwJJ0InLCBGSEQ1MTR9LAoJeyAiL2Rldi9mZDExMzVkczkiLAknQicsIEZERDUxNH0sCgl7ICIvZGV2L2ZkMSIsCQknQicsIEdFTkZEfSwKI2VuZGlmIC8qIENQVV9pMzg2ICovCiNlbmRpZiAvKm1pcHMqLwoJUkVNT1RFCn07CiNlbmRpZgoKI2lmZGVmIE9TX3VsdHJpeAojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9yZmQwYSIsCQknQScsIEdFTkZEfSwgLyogZ3Vlc3NlZCAqLwoJeyIvZGV2L3JmZDBjIiwJCSdBJywgR0VORkR9LCAvKiBndWVzc2VkICovCglSRU1PVEUKfTsKCiNlbmRpZgoKCiNpZmRlZiBPU19pc2MKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKI2lmIChkZWZpbmVkKE9TX2lzYzIpICYmIGRlZmluZWQoT0xEU1RVRkYpKQpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9yZHNrL2YwZDlkdCIsICAgCSdBJywgRkRENTE0fSwKCXsiL2Rldi9yZHNrL2YwcTE1ZHQiLAknQScsIEZIRDUxNH0sCgl7Ii9kZXYvcmRzay9mMGQ4ZHQiLAknQScsIEZERHNtYWxsfSwKCXsiL2Rldi9yZHNrL2YxM2h0IiwJJ0InLCBGSEQzMTJ9LAoJeyIvZGV2L3Jkc2svZjEzZHQiLAknQicsIEZERDMxMn0sCgl7Ii9kZXYvcmRzay8wcDEiLAknQycsIEdFTkhEfSwKCXsiL3Vzci92cGl4L2RlZmF1bHRzL0M6IiwnRCcsMTIsIDAsIDAsIDAsIDAsODcwNEwsREVGX0FSRzB9LAoJeyIkSE9NRS92cGl4L0M6IiwgCSdFJywgMTIsIDAsIDAsIDAsIDAsODcwNEwsTURFRl9BUkd9LAoJUkVNT1RFCn07CiNlbHNlCi8qIGNvbnRyaWJ1dGVkIGJ5IGxhcnJ5LmpvbmVzQHNkcmMuY29tIChMYXJyeSBKb25lcykgKi8Kc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvcmZkMCIsCQknQScsIEdFTn0sCgl7Ii9kZXYvcmZkMSIsCQknQicsIEdFTn0sCgl7Ii9kZXYvcmRzay8wcDEiLAknQycsIEdFTn0sCgl7Ii91c3IvdnBpeC9kZWZhdWx0cy9DOiIsJ0QnLCBHRU4sIDF9LAoJeyIkSE9NRS92cGl4L0M6IiwgCSdFJywgR0VOLCAxfSwKCVJFTU9URQp9OwoKI2luY2x1ZGUgPHN5cy92dG9jLmg+CiNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CiN1bmRlZiBTU0laRQojZGVmaW5lIEJMT0NLX01BSk9SIDEKI2RlZmluZSBDSEFSX01BSk9SICAxCiNkZWZpbmUgZ2VuZXJpY19mbG9wcHlfc3RydWN0IGRpc2tfcGFybXMKaW50IGlvY3RsKGludCwgaW50LCB2b2lkICopOwoKc3RhdGljIGludCBnZXRfcGFyYW1ldGVycyhpbnQgZmQsIHN0cnVjdCBnZW5lcmljX2Zsb3BweV9zdHJ1Y3QgKmZsb3BweSkKewoJbXRfb2ZmX3Qgb2ZmOwoJY2hhciBidWZbNTEyXTsKCglvZmYgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpOwoJaWYob2ZmIDwgMCkgewoJCXBlcnJvcigiZGV2aWNlIHNlZWsgMSIpOwoJCWV4aXQoMSk7Cgl9CglpZiAob2ZmID09IDApIHsKCQkvKiBuZWVkIHRvIHJlYWQgYXQgbGVhc3QgMSBzZWN0b3IgdG8gZ2V0IGNvcnJlY3QgaW5mbyAqLwoJCXJlYWQoZmQsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CgkJaWYobHNlZWsoZmQsIDAsIFNFRUtfU0VUKSA8IDApIHsKCQkJcGVycm9yKCJkZXZpY2Ugc2VlayAyIik7CgkJCWV4aXQoMSk7CgkJfQoJfQoJcmV0dXJuIGlvY3RsKGZkLCBWX0dFVFBBUk1TLCBmbG9wcHkpOwp9CgojZGVmaW5lIFRSQUNLUyhmbG9wcHkpICAoZmxvcHB5KS5kcF9jeWxzCiNkZWZpbmUgSEVBRFMoZmxvcHB5KSAgIChmbG9wcHkpLmRwX2hlYWRzCiNkZWZpbmUgU0VDVE9SUyhmbG9wcHkpIChmbG9wcHkpLmRwX3NlY3RvcnMKI2RlZmluZSBGRF9TRUNUU0laRShmbG9wcHkpIChmbG9wcHkpLmRwX3NlY3NpegojZGVmaW5lIEZEX1NFVF9TRUNUU0laRShmbG9wcHksdikgeyAoZmxvcHB5KS5kcF9zZWNzaXogPSAodik7IH0KCnN0YXRpYyBpbnQgc2V0X3BhcmFtZXRlcnMoaW50IGZkLCBzdHJ1Y3QgZ2VuZXJpY19mbG9wcHlfc3RydWN0ICpmbG9wcHksCglzdHJ1Y3QgTVRfU1RBVCAqYnVmKQp7CglyZXR1cm4gMTsKfQoKI2RlZmluZSBJTklUX0dFTkVSSUMKI2VuZGlmCiNlbmRpZiAvKiBpc2MgKi8KCiNpZmRlZiBDUFVfaTM3MAojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9yZmQwIiwgJ0EnLCBHRU5GRH0sCglSRU1PVEUKfTsKI2VuZGlmIC8qIENQVV9pMzcwICovCgojaWZkZWYgT1NfYWl4Ci8qIG1vZGlmaWVkIGJ5IEZlZGVyaWNvIEJpYW5jaGkgKi8KI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvZmQwIiwnQScsR0VORkR9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBhaXggKi8KCiAgCiNpZmRlZiBPU19vc2Y0Ci8qIG1vZGlmaWVkIGJ5IENocmlzIFNhbXVlbCA8Y2hyaXNAcml2ZXJzLmRyYS5obWcuZ2I+ICovCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJeyIvZGV2L2ZkMGMiLCdBJyxHRU5GRH0sCglSRU1PVEUKfTsKI2VuZGlmIC8qIE9TX29zZjQgKi8KCgojaWZkZWYgT1Nfc29sYXJpcwoKI2lmZGVmIFVTSU5HX05FV19WT0xECgpjaGFyICphbGlhc19uYW1lID0gTlVMTDsKICAKZXh0ZXJuIGNoYXIgKm1lZGlhX29sZGFsaWFzZXMoY2hhciAqKTsKZXh0ZXJuIGNoYXIgKm1lZGlhX2ZpbmRuYW1lKGNoYXIgKik7CgpjaGFyICpnZXRWb2xkTmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKm5hbWUpCnsKCWNoYXIgKnJuYW1lOwogIAoJaWYoIVNIT1VMRF9VU0VfVk9MRChkZXYpKQoJCXJldHVybiBuYW1lOwoKCS8qKioKCSAqIFNvbGFyaXMgc3BlY2lmaWMgcm91dGluZXMgdG8gdXNlIHRoZSB2b2x1bWUgbWFuYWdlbWVudAoJICogZGFlbW9uIGFuZCBsaWJyYXJpZXMgdG8gZ2V0IHRoZSBjb3JyZWN0IGRldmljZSBuYW1lLi4uCgkgKioqLwoJcm5hbWUgPSBtZWRpYV9maW5kbmFtZShuYW1lKTsKI2lmZGVmIEhBVkVfTUVESUFfT0xEQUxJQVNFUwoJaWYgKHJuYW1lID09IE5VTEwpIHsKCQlpZiAoKGFsaWFzX25hbWUgPSBtZWRpYV9vbGRhbGlhc2VzKG5hbWUpKSAhPSBOVUxMKQoJCQlybmFtZSA9IG1lZGlhX2ZpbmRuYW1lKGFsaWFzX25hbWUpOwoJfQojZW5kaWYKCWlmIChybmFtZSA9PSBOVUxMKSB7CgkJZnByaW50ZihzdGRlcnIsIAoJCQkJIk5vIHN1Y2ggdm9sdW1lIG9yIG5vIG1lZGlhIGluIGRldmljZTogJXMuXG4iLCAKCQkJCW5hbWUpOwoJCWV4aXQoMSk7Cgl9CglyZXR1cm4gcm5hbWU7Cn0KI2VuZGlmIC8qIFVTSU5HX05FV19WT0xEICovCgojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKI2lmZGVmICBVU0lOR19ORVdfVk9MRAoJeyJmbG9wcHkiLCAnQScsIFZPTERGRCB9LAojZWxpZglVU0lOR19WT0xECgl7Ii92b2wvZGV2L2FsaWFzZXMvZmxvcHB5MCIsICdBJywgR0VORkR9LAoJeyIvZGV2L3JkaXNrZXR0ZSIsICdCJywgR0VORkR9LAojZWxzZQkvKiAhIFVTSU5HX1ZPTEQgKi8KCXsiL2Rldi9yZGlza2V0dGUiLCAnQScsIEdFTkZEfSwKCXsiL3ZvbC9kZXYvYWxpYXNlcy9mbG9wcHkwIiwgJ0InLCBHRU5GRH0sCiNlbmRpZgkvKiBVU0lOR19WT0xEICovCgl7Ii9kZXYvcmRzay9jMHQ0ZDBzMiIsICdKJywgUkpBWihPX05ERUxBWSl9LAoJeyIvZGV2L3Jkc2svYzB0NWQwczIiLCAnWicsIFJaSVAoT19OREVMQVkpfSwKCVJFTU9URQp9OwoKCgovKgogKiBPZmVyIExpY2h0IDxvZmVyQHN0YXQuQmVya2VsZXkuRURVPiwgTWF5IDE0LCAxOTk3LgogKi8KCiNkZWZpbmUgSU5JVF9HRU5FUklDCgojaW5jbHVkZSA8c3lzL2ZkaW8uaD4KI2luY2x1ZGUgPHN5cy9ta2Rldi5oPgkvKiBmb3IgbWFqb3IoKSAqLwoKc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdAp7CiAgc3RydWN0IGZkX2NoYXIgZmRjaGFyOwp9OwoKI2RlZmluZSBCTE9DS19NQUpPUiAzNgojZGVmaW5lIENIQVJfTUFKT1IgMzYKCnN0YXRpYyBpbmxpbmUgaW50IGdldF9wYXJhbWV0ZXJzKGludCBmZCwgc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdCAqZmxvcHB5KQp7CglpZiAoaW9jdGwoZmQsIEZESU9HQ0hBUiwgJihmbG9wcHktPmZkY2hhcikpICE9IDApIHsKCQlwZXJyb3IoIiIpOwoJCWlvY3RsKGZkLCBGREVKRUNULCBOVUxMKTsKCQlyZXR1cm4oMSk7Cgl9CglyZXR1cm4gMDsKfQoKI2RlZmluZSBUUkFDS1MoZmxvcHB5KSBmbG9wcHkuZmRjaGFyLmZkY19uY3lsCiNkZWZpbmUgSEVBRFMoZmxvcHB5KSBmbG9wcHkuZmRjaGFyLmZkY19uaGVhZAojZGVmaW5lIFNFQ1RPUlMoZmxvcHB5KSBmbG9wcHkuZmRjaGFyLmZkY19zZWNwdHJhY2sKLyogU0VDVE9SU19QRVJfRElTSyhmbG9wcHkpIG5vdCB1c2VkICovCiNkZWZpbmUgRkRfU0VDVFNJWkUoZmxvcHB5KSBmbG9wcHkuZmRjaGFyLmZkY19zZWNfc2l6ZQojZGVmaW5lIEZEX1NFVF9TRUNUU0laRShmbG9wcHksdikgeyBmbG9wcHkuZmRjaGFyLmZkY19zZWNfc2l6ZSA9IHY7IH0KCnN0YXRpYyBpbmxpbmUgaW50IHNldF9wYXJhbWV0ZXJzKGludCBmZCwgc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdCAqZmxvcHB5LCAKCQkJCSBzdHJ1Y3QgTVRfU1RBVCAqYnVmKQp7CglpZiAoaW9jdGwoZmQsIEZESU9TQ0hBUiwgJihmbG9wcHktPmZkY2hhcikpICE9IDApIHsKCQlpb2N0bChmZCwgRkRFSkVDVCwgTlVMTCk7CgkJcGVycm9yKCIiKTsKCQlyZXR1cm4oMSk7Cgl9CglyZXR1cm4gMDsKfQojZGVmaW5lIElOSVRfR0VORVJJQwojZW5kaWYgLyogc29sYXJpcyAqLwoKI2lmZGVmIE9TX3N1bm9zMwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9yZmRsMGMiLAknQScsIEZERDMxMn0sCgl7Ii9kZXYvcmZkMGMiLAknQScsIEZIRDMxMn0sCglSRU1PVEUKfTsKI2VuZGlmIC8qIE9TX3N1bm9zMyAqLwoKI2lmZGVmIE9TX3hlbml4CiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJeyIvZGV2L2ZkMDk2ZHMxNSIsCSdBJywgRkhENTE0fSwKCXsiL2Rldi9mZDA0OGRzOSIsCSdBJywgRkRENTE0fSwKCXsiL2Rldi9mZDExMzVkczE4IiwJJ0InLCBGSEQzMTJ9LAoJeyIvZGV2L2ZkMTEzNWRzOSIsCSdCJywgRkREMzEyfSwKCXsiL2Rldi9oZDBkIiwJCSdDJywgR0VOSER9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBPU194ZW5peCAqLwoKI2lmZGVmIE9TX3NjbwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsgIi9kZXYvZmQwMTM1ZHMxOCIsCSdBJywgRkhEMzEyfSwKCXsgIi9kZXYvZmQwMTM1ZHM5IiwJJ0EnLCBGREQzMTJ9LAoJeyAiL2Rldi9mZDAiLAkJJ0EnLCBHRU5GRH0sCgl7ICIvZGV2L2ZkMTEzNWRzMTUiLAknQicsIEZIRDUxNH0sCgl7ICIvZGV2L2ZkMTEzNWRzOSIsCSdCJywgRkRENTE0fSwKCXsgIi9kZXYvZmQxIiwJCSdCJywgR0VORkR9LAoJeyAiL2Rldi9oZDBkIiwJCSdDJywgR0VOSER9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBPU19zY28gKi8KCgojaWZkZWYgT1NfaXJpeAojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKICB7ICIvZGV2L3Jkc2svZmRzMGQyLjMuNWhpIiwJJ0EnLCBGSEQzMTJ9LAogIHsgIi9kZXYvcmRzay9mZHMwZDIuMy41IiwJJ0EnLCBGREQzMTJ9LAogIHsgIi9kZXYvcmRzay9mZHMwZDIuOTYiLAknQScsIEZIRDUxNH0sCiAgeyIvZGV2L3Jkc2svZmRzMGQyLjQ4IiwJJ0EnLCBGREQ1MTR9LAogIFJFTU9URQp9OwojZW5kaWYgLyogT1NfaXJpeCAqLwoKCiNpZmRlZiBPU19zdW5vczQKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8c3VuL2RraW8uaD4KCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJeyIvZGV2L3JmZDBjIiwJJ0EnLCBHRU5GRH0sCgl7Ii9kZXYvcnNkNGMiLAknSicsIFJKQVooT19OREVMQVkpfSwKCXsiL2Rldi9yc2Q1YyIsCSdaJywgUlpJUChPX05ERUxBWSl9LAoJUkVNT1RFCn07CgovKgogKiBTdHVmZmluZyBiYWNrIHRoZSBmbG9wcHkgcGFyYW1ldGVycyBpbnRvIHRoZSBkcml2ZXIgYWxsb3dzIGZvciBnZW1zCiAqIGxpa2UgMTAgc2VjdG9yIG9yIHNpbmdsZSBzaWRlZCBmbG9wcGllcyBmcm9tIEF0YXJpIFNUIHN5c3RlbXMuCiAqIAogKiBNYXJ0aW4gU2NodWx6LCBVbml2ZXJzaXRlIGRlIE1vbmN0b24sIE4uQi4sIENhbmFkYSwgTWFyY2ggMTEsIDE5OTEuCiAqLwoKI2RlZmluZSBJTklUX0dFTkVSSUMKCnN0cnVjdCBnZW5lcmljX2Zsb3BweV9zdHJ1Y3QKewogIHN0cnVjdCBmZGtfY2hhciBka2J1ZjsKICBzdHJ1Y3QgZGtfbWFwIGRrbWFwOwp9OwoKI2RlZmluZSBCTE9DS19NQUpPUiAxNgojZGVmaW5lIENIQVJfTUFKT1IgNTQKCnN0YXRpYyBpbmxpbmUgaW50IGdldF9wYXJhbWV0ZXJzKGludCBmZCwgc3RydWN0IGdlbmVyaWNfZmxvcHB5X3N0cnVjdCAqZmxvcHB5KQp7CglpZiAoaW9jdGwoZmQsIERLSU9DR1BBUlQsICYoZmxvcHB5LT5ka21hcCkpICE9IDApIHsKCQlwZXJyb3IoIkRLSU9DR1BBUlQiKTsKCQlpb2N0bChmZCwgRkRLRUpFQ1QsIE5VTEwpOwoJCXJldHVybigxKTsKCX0KCQoJaWYgKGlvY3RsKGZkLCBGREtJT0dDSEFSLCAmKCBmbG9wcHktPmRrYnVmKSkgIT0gMCkgewoJCXBlcnJvcigiIik7CgkJaW9jdGwoZmQsIEZES0VKRUNULCBOVUxMKTsKCQlyZXR1cm4oMSk7Cgl9CglyZXR1cm4gMDsKfQoKI2RlZmluZSBUUkFDS1MoZmxvcHB5KSBmbG9wcHkuZGtidWYubmN5bAojZGVmaW5lIEhFQURTKGZsb3BweSkgZmxvcHB5LmRrYnVmLm5oZWFkCiNkZWZpbmUgU0VDVE9SUyhmbG9wcHkpIGZsb3BweS5ka2J1Zi5zZWNwdHJhY2sKI2RlZmluZSBTRUNUT1JTX1BFUl9ESVNLKGZsb3BweSkgZmxvcHB5LmRrbWFwLmRrbF9uYmxrCiNkZWZpbmUgRkRfU0VDVFNJWkUoZmxvcHB5KSBmbG9wcHkuZGtidWYuc2VjX3NpemUKI2RlZmluZSBGRF9TRVRfU0VDVFNJWkUoZmxvcHB5LHYpIHsgZmxvcHB5LmRrYnVmLnNlY19zaXplID0gdjsgfQoKc3RhdGljIGlubGluZSBpbnQgc2V0X3BhcmFtZXRlcnMoaW50IGZkLCBzdHJ1Y3QgZ2VuZXJpY19mbG9wcHlfc3RydWN0ICpmbG9wcHksIAoJCQkJIHN0cnVjdCBNVF9TVEFUICpidWYpCnsKCWlmIChpb2N0bChmZCwgRkRLSU9TQ0hBUiwgJihmbG9wcHktPmRrYnVmKSkgIT0gMCkgewoJCWlvY3RsKGZkLCBGREtFSkVDVCwgTlVMTCk7CgkJcGVycm9yKCIiKTsKCQlyZXR1cm4oMSk7Cgl9CgkKCWlmIChpb2N0bChmZCwgKCB1bnNpZ25lZCBpbnQpIERLSU9DU1BBUlQsICYoZmxvcHB5LT5ka21hcCkpICE9IDApIHsKCQlpb2N0bChmZCwgRkRLRUpFQ1QsIE5VTEwpOwoJCXBlcnJvcigiIik7CgkJcmV0dXJuKDEpOwoJfQoJcmV0dXJuIDA7Cn0KI2RlZmluZSBJTklUX0dFTkVSSUMKI2VuZGlmIC8qIHNwYXJjICYmIHN1bm9zICovCgoKI2lmZGVmIERQWDEwMDAKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7CgkvKiBbYmxvY2sgZGV2aWNlXTogRFBYMTAwMCBoYXMgL2Rldi9mbGJtNjAsIERQWDIgaGFzIC9kZXYvZWFzeWZiICovCgl7Ii9kZXYvZmxibTYwIiwgJ0EnLCBNSEQ1MTR9OwoJeyIvZGV2L2ZsYm02MCIsICdCJywgTURENTE0fSwKCXsiL2Rldi9mbGJtNjAiLCAnQycsIE1ERHNtYWxsfSwKCXsiL2Rldi9mbGJtNjAiLCAnRCcsIE1TU30sCgl7Ii9kZXYvZmxibTYwIiwgJ0UnLCBNU1NzbWFsbH0sCglSRU1PVEUKfTsKI2VuZGlmIC8qIERQWDEwMDAgKi8KCiNpZmRlZiBPU19ib3N4CiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJLyogW2Jsb2NrIGRldmljZV06IERQWDEwMDAgaGFzIC9kZXYvZmxibTYwLCBEUFgyIGhhcyAvZGV2L2Vhc3lmYiAqLwoJeyIvZGV2L2Vhc3lmYiIsICdBJywgTUhENTE0fSwKCXsiL2Rldi9lYXN5ZmIiLCAnQicsIE1ERDUxNH0sCgl7Ii9kZXYvZWFzeWZiIiwgJ0MnLCBNRERzbWFsbH0sCgl7Ii9kZXYvZWFzeWZiIiwgJ0QnLCBNU1N9LAoJeyIvZGV2L2Vhc3lmYiIsICdFJywgTVNTc21hbGx9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBPU19ib3N4ICovCgojaWZkZWYgT1NfbGludXgKCnN0YXRpYyBjb25zdCBjaGFyICplcnJvcl9tc2dbMjJdPXsKIk1pc3NpbmcgRGF0YSBBZGRyZXNzIE1hcmsiLAoiQmFkIGN5bGluZGVyIiwKIlNjYW4gbm90IHNhdGlzZmllZCIsCiJTY2FuIGVxdWFsIGhpdCIsCiJXcm9uZyBjeWxpbmRlciIsCiJDUkMgZXJyb3IgaW4gZGF0YSBmaWVsZCIsCiJDb250cm9sIE1hcmsgPSBkZWxldGVkIiwKMCwKCiJNaXNzaW5nIEFkZHJlc3MgTWFyayIsCiJXcml0ZSBQcm90ZWN0IiwKIk5vIERhdGEgLSB1bnJlYWRhYmxlIiwKMCwKIk92ZXJSdW4iLAoiQ1JDIGVycm9yIGluIGRhdGEgb3IgYWRkcmVzcyIsCjAsCiJFbmQgT2YgQ3lsaW5kZXIiLAoKMCwKMCwKMCwKIk5vdCByZWFkeSIsCiJFcXVpcG1lbnQgY2hlY2sgZXJyb3IiLAoiU2VlayBlbmQiIH07CgoKc3RhdGljIF9faW5saW5lX18gdm9pZCBwcmludF9tZXNzYWdlKFJhd1JlcXVlc3RfdCAqcmF3X2NtZCxjb25zdCBjaGFyICptZXNzYWdlKQp7CglpbnQgaSwgY29kZTsKCWlmKCFtZXNzYWdlKQoJCXJldHVybjsKCglmcHJpbnRmKHN0ZGVyciwiICAgIik7Cglmb3IgKGk9MDsgaTwgcmF3X2NtZC0+Y21kX2NvdW50OyBpKyspCgkJZnByaW50ZihzdGRlcnIsIiUyLjJ4ICIsIAoJCQkoaW50KXJhd19jbWQtPmNtZFtpXSApOwoJZnByaW50ZihzdGRlcnIsIlxuIik7Cglmb3IgKGk9MDsgaTwgcmF3X2NtZC0+cmVwbHlfY291bnQ7IGkrKykKCQlmcHJpbnRmKHN0ZGVyciwiJTIuMnggIiwKCQkJKGludClyYXdfY21kLT5yZXBseVtpXSApOwoJZnByaW50ZihzdGRlcnIsIlxuIik7Cgljb2RlID0gKHJhd19jbWQtPnJlcGx5WzBdIDw8MTYpICsgCgkJKHJhd19jbWQtPnJlcGx5WzFdIDw8IDgpICsgCgkJcmF3X2NtZC0+cmVwbHlbMl07Cglmb3IoaT0wOyBpPDIyOyBpKyspewoJCWlmICgoY29kZSAmICgxIDw8IGkpKSAmJiBlcnJvcl9tc2dbaV0pCgkJCWZwcmludGYoc3RkZXJyLCIlc1xuIiwKCQkJCWVycm9yX21zZ1tpXSk7Cgl9Cn0KCgovKiByZXR1cm4gdmFsdWVzOgogKiAgLTE6IEZhdGFsIGVycm9yLCBkb24ndCBib3RoZXIgcmV0cnlpbmcuCiAqICAgMDogT0sKICogICAxOiBtaW5vciBlcnJvciwgcmV0cnkKICovCgppbnQgc2VuZF9vbmVfY21kKGludCBmZCwgUmF3UmVxdWVzdF90ICpyYXdfY21kLCBjb25zdCBjaGFyICptZXNzYWdlKQp7CglpZiAoaW9jdGwoIGZkLCBGRFJBV0NNRCwgcmF3X2NtZCkgPj0gMCkgewoJCWlmIChyYXdfY21kLT5yZXBseV9jb3VudCA8IDcpIHsKCQkJZnByaW50ZihzdGRlcnIsIlNob3J0IHJlcGx5IGZyb20gRkRDXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0JCQoJCXJldHVybiAwOwoJfQoKCXN3aXRjaChlcnJubykgewoJCWNhc2UgRUJVU1k6CgkJCWZwcmludGYoc3RkZXJyLCAiRkRDIGJ1c3ksIHNsZWVwaW5nIGZvciBhIHNlY29uZFxuIik7CgkJCXNsZWVwKDEpOwoJCQlyZXR1cm4gMTsKCQljYXNlIEVJTzoKCQkJZnByaW50ZihzdGRlcnIsInJlc2V0dGluZyBjb250cm9sbGVyXG4iKTsKCQkJaWYoaW9jdGwoZmQsIEZEUkVTRVQsIDIpICA8IDApewoJCQkJcGVycm9yKCJyZXNldCIpOwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJCXJldHVybiAxOwoJCWRlZmF1bHQ6CgkJCXBlcnJvcihtZXNzYWdlKTsKCQkJcmV0dXJuIC0xOwoJfQp9CgoKLyoKICogcmV0dXJuIHZhbHVlcwogKiAgLTE6IGVycm9yCiAqICAgMDogT0ssIGxhc3Qgc2VjdG9yCiAqICAgMTogbW9yZSByYXcgY29tbWFuZHMgZm9sbG93CiAqLwoKaW50IGFuYWx5emVfb25lX3JlcGx5KFJhd1JlcXVlc3RfdCAqcmF3X2NtZCwgaW50ICpieXRlcywgaW50IGRvX3ByaW50KQp7CgkKCWlmKHJhd19jbWQtPnJlcGx5X2NvdW50ID09IDcpIHsKCQlpbnQgZW5kOwoJCQoJCWlmIChyYXdfY21kLT5yZXBseVszXSAhPSByYXdfY21kLT5jbWRbMl0pIHsKCQkJLyogZW5kIG9mIGN5bGluZGVyICovCgkJCWVuZCA9IHJhd19jbWQtPmNtZFs2XSArIDE7CgkJfSBlbHNlIHsKCQkJZW5kID0gcmF3X2NtZC0+cmVwbHlbNV07CgkJfQoKCQkqYnl0ZXMgPSBlbmQgLSByYXdfY21kLT5jbWRbNF07CgkJLyogRklYTUU6IG92ZXIvdW5kZXIgcnVuICovCgkJKmJ5dGVzID0gKmJ5dGVzIDw8ICg3ICsgcmF3X2NtZC0+Y21kWzVdKTsKCX0gZWxzZQoJCSpieXRlcyA9IDA7ICAgICAgIAoKCXN3aXRjaChyYXdfY21kLT5yZXBseVswXSAmIDB4YzApewoJCWNhc2UgMHg0MDoKCQkJaWYgKChyYXdfY21kLT5yZXBseVswXSAmIDB4MzgpID09IDAgJiYKCQkJICAgIChyYXdfY21kLT5yZXBseVsxXSkgPT0gMHg4MCAmJgoJCQkgICAgKHJhd19jbWQtPnJlcGx5WzJdKSA9PSAwKSB7CgkJCQkqYnl0ZXMgKz0gMSA8PCAoNyArIHJhd19jbWQtPmNtZFs1XSk7CgkJCQlicmVhazsKCQkJfQoKCQkJaWYgKCByYXdfY21kLT5yZXBseVsxXSAmIFNUMV9XUCApewoJCQkJKmJ5dGVzID0gMDsKCQkJCWZwcmludGYoc3RkZXJyLAoJCQkJCSJUaGlzIGRpc2sgaXMgd3JpdGUgcHJvdGVjdGVkXG4iKTsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZighKmJ5dGVzICYmIGRvX3ByaW50KQoJCQkJcHJpbnRfbWVzc2FnZShyYXdfY21kLCAiIik7CgkJCXJldHVybiAtMTsKCQljYXNlIDB4ODA6CgkJCSpieXRlcyA9IDA7CgkJCWZwcmludGYoc3RkZXJyLAoJCQkJImludmFsaWQgY29tbWFuZCBnaXZlblxuIik7CgkJCXJldHVybiAtMTsKCQljYXNlIDB4YzA6CgkJCSpieXRlcyA9IDA7CgkJCWZwcmludGYoc3RkZXJyLAoJCQkJImFibm9ybWFsIHRlcm1pbmF0aW9uIGNhdXNlZCBieSBwb2xsaW5nXG4iKTsKCQkJcmV0dXJuIC0xOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJfQkKI2lmZGVmIEZEX1JBV19NT1JFCglpZihyYXdfY21kLT5mbGFncyAmIEZEX1JBV19NT1JFKQoJCXJldHVybiAxOwojZW5kaWYKCXJldHVybiAwOwp9CgojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9mZDAiLCAnQScsIDAsIDAsIDgwLDIsIDE4LDAsIE1ERUZfQVJHLCAwLCAwfSwKCXsiL2Rldi9mZDEiLCAnQicsIDAsIDAsIDAsMCwgMCwwLCBGREVGX0FSRywgMCwgMH0sCgkvKiB3ZSBhc3N1bWUgdGhhdCB0aGUgWmlwIG9yIEpheiBkcml2ZSBpcyB0aGUgc2Vjb25kIG9uIHRoZSBTQ1NJIGJ1cyAqLwoJeyIvZGV2L3NkYjQiLCdKJywgR0VOSEQsIDAsIDAgfSwKCXsiL2Rldi9zZGI0IiwnWicsIEdFTkhELCAwLCAwIH0sCgkvKgl7Ii9kZXYvc2RhNCIsJ0QnLCBHRU5IRCwgMCwgMCB9LCovCglSRU1PVEUKfTsKCi8qCiAqIFN0dWZmaW5nIGJhY2sgdGhlIGZsb3BweSBwYXJhbWV0ZXJzIGludG8gdGhlIGRyaXZlciBhbGxvd3MgZm9yIGdlbXMKICogbGlrZSAyMSBzZWN0b3Igb3Igc2luZ2xlIHNpZGVkIGZsb3BwaWVzIGZyb20gQXRhcmkgU1Qgc3lzdGVtcy4KICogCiAqIEFsYWluIEtuYWZmLCBVbml2ZXJzaXTpIEpvc2VwaCBGb3VyaWVyLCBGcmFuY2UsIE5vdmVtYmVyIDEyLCAxOTkzLgogKi8KCgojZGVmaW5lIElOSVRfR0VORVJJQwojZGVmaW5lIGdlbmVyaWNfZmxvcHB5X3N0cnVjdCBmbG9wcHlfc3RydWN0CiNkZWZpbmUgQkxPQ0tfTUFKT1IgMgojZGVmaW5lIFNFQ1RPUlMoZmxvcHB5KSBmbG9wcHkuc2VjdAojZGVmaW5lIFRSQUNLUyhmbG9wcHkpIGZsb3BweS50cmFjawojZGVmaW5lIEhFQURTKGZsb3BweSkgZmxvcHB5LmhlYWQKI2RlZmluZSBTRUNUT1JTX1BFUl9ESVNLKGZsb3BweSkgZmxvcHB5LnNpemUKI2RlZmluZSBTVFJFVENIKGZsb3BweSkgZmxvcHB5LnN0cmV0Y2gKI2RlZmluZSBVU0VfMk0oZmxvcHB5KSAoKGZsb3BweS5yYXRlICYgRkRfMk0pID8gMHhmZiA6IDB4ODAgKQojZGVmaW5lIFNTSVpFKGZsb3BweSkgKCgoKGZsb3BweS5yYXRlICYgMHgzOCkgPj4gMyApICsgMikgJSA4KQoKc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfMm0oc3RydWN0IGZsb3BweV9zdHJ1Y3QgKmZsb3BweSwgaW50IHZhbHVlKQp7CglpZiAodmFsdWUgJiAweDdmKQoJCXZhbHVlID0gRkRfMk07CgllbHNlCgkJdmFsdWUgPSAwOwoJZmxvcHB5LT5yYXRlID0gKGZsb3BweS0+cmF0ZSAmIH5GRF8yTSkgfCB2YWx1ZTsKfQojZGVmaW5lIFNFVF8yTSBzZXRfMm0KCnN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X3NzaXplKHN0cnVjdCBmbG9wcHlfc3RydWN0ICpmbG9wcHksIGludCB2YWx1ZSkKewoJdmFsdWUgPSAoKCAodmFsdWUgJiA3KSArIDYgKSAlIDgpIDw8IDM7CgoJZmxvcHB5LT5yYXRlID0gKGZsb3BweS0+cmF0ZSAmIH4weDM4KSB8IHZhbHVlOwp9CgojZGVmaW5lIFNFVF9TU0laRSBzZXRfc3NpemUKCnN0YXRpYyBfX2lubGluZV9fIGludCBzZXRfcGFyYW1ldGVycyhpbnQgZmQsIHN0cnVjdCBmbG9wcHlfc3RydWN0ICpmbG9wcHksIAoJCQkJICAgICBzdHJ1Y3QgTVRfU1RBVCAqYnVmKQp7CglpZiAoICggTUlOT1IoYnVmLT5zdF9yZGV2ICkgJiAweDdmICkgPiAzICkKCQlyZXR1cm4gMTsKCQoJcmV0dXJuIGlvY3RsKGZkLCBGRFNFVFBSTSwgZmxvcHB5KTsKfQoKc3RhdGljIF9faW5saW5lX18gaW50IGdldF9wYXJhbWV0ZXJzKGludCBmZCwgc3RydWN0IGZsb3BweV9zdHJ1Y3QgKmZsb3BweSkKewoJcmV0dXJuIGlvY3RsKGZkLCBGREdFVFBSTSwgZmxvcHB5KTsKfQoKI2VuZGlmIC8qIGxpbnV4ICovCgoKLyogT1MvMiwgZ2NjK2VteCAqLwojaWZkZWYgX19FTVhfXwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKICB7IkE6IiwgJ0EnLCBHRU5GRH0sCiAgeyJCOiIsICdCJywgR0VORkR9LAp9OwojZGVmaW5lIElOSVRfTk9PUAojZW5kaWYKCgoKLyoqKiAvamVzIC0tIGZvciBELk8uUy4gNDg2IEJMIERYMi84MCAqKiovCi8qKiogSmVhbi1NYXJjIFp1Y2NvbmkgPGptekBGcmVlQlNELm9yZz4gMjAwMS8wMy8zMCAqKiovCiNpZmRlZiBPU19mcmVlYnNkCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewoJeyIvZGV2L2ZkMC4xNDQwIiwgJ0EnLCBGSEQzMTJ9LAoJeyIvZGV2L2ZkMC43MjAiLCAgJ0EnLCBGREQzMTJ9LAoJeyIvZGV2L2ZkMS4xMjAwIiwgJ0InLCBNSEQ1MTR9LAoJeyIvZGV2L3NkMHMxIiwgICAgICdDJywgR0VOSER9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBfX0ZyZWVCU0RfXyAqLwogCi8qKiogL2plcyAtLSBmb3IgQUxSIDQ4NiBEWDQvMTAwICoqKi8KI2lmIGRlZmluZWQoT1NfbmV0YnNkKSB8fCBkZWZpbmVkKE9TX25ldGJzZGVsZikKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvcmZkMGEiLCAnQScsIEZIRDMxMn0sCgl7Ii9kZXYvcmZkMGYiLCAnQScsIEZERDMxMn0sCgl7Ii9kZXYvcmZkMGYiLCAnUycsIE1ERDMxMn0sCgl7Ii9kZXYvcmZkMWEiLCAnQicsIEZIRDUxNH0sCgl7Ii9kZXYvcmZkMWQiLCAnQicsIEZERDUxNH0sCgl7Ii9kZXYvcmZkMWQiLCAnVCcsIE1ERDUxNH0sCgl7Ii9kZXYvcndkMGQiLCAnQycsIDE2LCAwLCAwLCAwLCAwLCAwLCA2M0wqNTEyTCwgREVGX0FSRzAoMCl9LAoJUkVNT1RFCn07CiNlbmRpZiAvKiBPU19OZXRCU0QgKi8KCi8qIGZnc2NoQG9wZW5ic2Qub3JnIDIwMDAvMDUvMTkgKi8KI2lmIGRlZmluZWQoT1Nfb3BlbmJzZCkKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvcmZkMEJjIiwgJ0EnLCBGSEQzMTJ9LAoJeyIvZGV2L3JmZDBGYyIsICdBJywgRkREMzEyfSwKCXsiL2Rldi9yZmQxQ2MiLCAnQicsIEZIRDUxNH0sCgl7Ii9kZXYvcmZkMURjIiwgJ0InLCBGREQ1MTR9LAoJeyIvZGV2L3J3ZDBjIiwgJ0MnLCAxNiwgMCwgMCwgMCwgMCwgMCwgNjNMKjUxMkwsIERFRl9BUkcwKDApfSwKCVJFTU9URQp9OwojZW5kaWYgLyogT1Nfb3BlbmJzZCAqLwoKCgojaWYgKCFkZWZpbmVkKHByZWRlZmluZWRfZGV2aWNlcykgJiYgZGVmaW5lZCAoQ1BVX202ODAwMCkgJiYgZGVmaW5lZCAoT1Nfc3lzdikpCiNpbmNsdWRlIDxzeXMvZ2Rpb2N0bC5oPgoKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7Cgl7Ii9kZXYvcmZwMDIwIiwJCSdBJywgMTIsT19OREVMQVksNDAsMiwgOSwgMCwgTURFRl9BUkd9LAoJeyIvdXNyL2Jpbi9ET1MvZHZkMDAwIiwgJ0MnLCBHRU5GRH0sCglSRU1PVEUKfTsKCiN1bmRlZiBJTklUX05PT1AKaW50IGluaXRfZ2VvbShpbnQgZmQsIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqb3JpZ19kZXYsCgkgICAgICBzdHJ1Y3QgTVRfU1RBVCAqc3RhdGJ1ZikKewoJc3RydWN0IGdkY3RsIGdkYnVmOwoKCWlmIChpb2N0bChmZCwgR0RHRVRBLCAmZ2RidWYpID09IC0xKSB7CgkJaW9jdGwoZmQsIEdERElTTU5ULCAmZ2RidWYpOwoJCXJldHVybiAxOwoJfQoJaWYoKGRldi0+dXNlXzJtICYgMHg3ZikgfHwgKGRldi0+c3NpemUgJiAweDdmKSkKCQlyZXR1cm4gMTsKCQoJU0VUX0lOVChnZGJ1Zi5wYXJhbXMuY3lscyxkZXYtPm50cmFja3MpOwoJU0VUX0lOVChnZGJ1Zi5wYXJhbXMuaGVhZHMsZGV2LT5uaGVhZHMpOwoJU0VUX0lOVChnZGJ1Zi5wYXJhbXMucHNlY3RyayxkZXYtPm5zZWN0KTsKCWRldi0+bnRyYWNrcyA9IGdkYnVmLnBhcmFtcy5jeWxzOwoJZGV2LT5uaGVhZHMgPSBnZGJ1Zi5wYXJhbXMuaGVhZHM7CglkZXYtPm5zZWN0ID0gZ2RidWYucGFyYW1zLnBzZWN0cms7CglkZXYtPnVzZV8ybSA9IDB4ODA7CglkZXYtPnNzaXplID0gMHg4MjsKCglnZGJ1Zi5wYXJhbXMucHNlY2N5bCA9IGdkYnVmLnBhcmFtcy5wc2VjdHJrICogZ2RidWYucGFyYW1zLmhlYWRzOwoJZ2RidWYucGFyYW1zLmZsYWdzID0gMTsJCS8qIGRpc2sgdHlwZSBmbGFnICovCglnZGJ1Zi5wYXJhbXMuc3RlcCA9IDA7CQkvKiBzdGVwIHJhdGUgZm9yIGNvbnRyb2xsZXIgKi8KCWdkYnVmLnBhcmFtcy5zZWN0b3JzeiA9IDUxMjsJLyogc2VjdG9yIHNpemUgKi8KCglpZiAoaW9jdGwoZmQsIEdEU0VUQSwgJmdkYnVmKSA8IDApIHsKCQlpb2N0bChmZCwgR0RESVNNTlQsICZnZGJ1Zik7CgkJcmV0dXJuKDEpOwoJfQoJcmV0dXJuKDApOwp9CiNlbmRpZiAvKiAoZGVmaW5lZCAobTY4MDAwKSAmJiBkZWZpbmVkIChzeXN2KSkqLwoKI2lmZGVmIENQVV9hbHBoYQojaWZuZGVmIE9TX29zZjQKI2lmZGVmIF9fb3NmX18KI2luY2x1ZGUgPHN5cy9mY250bC5oPgojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9yZmQwYyIsCQknQScsIEdFTkZEfSwKCVJFTU9URQp9OwojZW5kaWYKI2VuZGlmCiNlbmRpZgoKI2lmZGVmIE9TX29zZgojaWZuZGVmIHByZWRlZmluZWRfZGV2aWNlcwojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9mZDBhIiwgJ0EnLCAgTUhEMzEyIH0gfTsKCVJFTU9URQojZW5kaWYKI2VuZGlmCgoKI2lmZGVmIE9TX25leHRzdGVwCiNkZWZpbmUgcHJlZGVmaW5lZF9kZXZpY2VzCnN0cnVjdCBkZXZpY2UgZGV2aWNlc1tdID0gewojaWZkZWYgQ1BVX202OGsKCXsiL2Rldi9yZmQwYiIsICdBJywgTUVEMzEyIH0sCglSRU1PVEUKI2Vsc2UKCXsiL2Rldi9yZmQwYiIsICdBJywgTUhEMzEyIH0sCglSRU1PVEUKI2VuZGlmCn07CiNlbmRpZgoKCiNpZiAoIWRlZmluZWQocHJlZGVmaW5lZF9kZXZpY2VzKSAmJiBkZWZpbmVkKE9TX3N5c3Y0KSkKI2lmZGVmIF9fdXhwX18KI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7CiAgICAgIHsiL2Rldi9mcGQwIiwgICAnQScsIEZIRDMxMn0sCiAgICAgIHsiL2Rldi9mcGQwIiwgICAnQScsIEZERDMxMn0sCgkgIFJFTU9URQp9OwojZWxzZQojZGVmaW5lIHByZWRlZmluZWRfZGV2aWNlcwpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXSA9IHsKCXsiL2Rldi9yZHNrL2YxcTE1ZHQiLAknQicsIEZIRDUxNH0sCgl7Ii9kZXYvcmRzay9mMWQ5ZHQiLAknQicsIEZERDUxNH0sCgl7Ii9kZXYvcmRzay9mMWQ4ZHQiLAknQicsIEZERHNtYWxsfSwKCXsiL2Rldi9yZHNrL2YwM2h0IiwJJ0EnLCBGSEQzMTJ9LAoJeyIvZGV2L3Jkc2svZjAzZHQiLAknQScsIEZERDMxMn0sCgl7Ii9kZXYvcmRzay9kb3MiLAknQycsIEdFTkhEfSwKCVJFTU9URQp9OwojZW5kaWYKI2VuZGlmIC8qIHN5c3Y0ICovCgojaWZkZWYgT1NfbWluZ3czMm1zdmMKI2RlZmluZSBwcmVkZWZpbmVkX2RldmljZXMKc3RydWN0IGRldmljZSBkZXZpY2VzW10gPSB7CiAgIHsiXFxcXC5cXEE6IiwgJ0EnLCBHRU5GRCB9LAp9OwojZW5kaWYKCiNpZmRlZiBJTklUX0dFTkVSSUMKCiNpZm5kZWYgVVNFXzJNCiNkZWZpbmUgVVNFXzJNKHgpIDB4ODAKI2VuZGlmCgojaWZuZGVmIFNTSVpFCiNkZWZpbmUgU1NJWkUoeCkgMHg4MgojZW5kaWYKCiNpZm5kZWYgU0VUXzJNCiNkZWZpbmUgU0VUXzJNKHgseSkgcmV0dXJuIC0xCiNlbmRpZgoKI2lmbmRlZiBTRVRfU1NJWkUKI2RlZmluZSBTRVRfU1NJWkUoeCx5KSByZXR1cm4gLTEKI2VuZGlmCgojdW5kZWYgSU5JVF9OT09QCmludCBpbml0X2dlb20oaW50IGZkLCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm9yaWdfZGV2LAoJICAgICAgc3RydWN0IE1UX1NUQVQgKnN0YXRidWYpCnsKCXN0cnVjdCBnZW5lcmljX2Zsb3BweV9zdHJ1Y3QgZmxvcHB5OwoJaW50IGNoYW5nZTsKCQoJLyogCgkgKiBzdWNjZWVkIGlmIHdlIGRvbid0IGhhdmUgYSBmbG9wcHkKCSAqIHRoaXMgaXMgdGhlIGNhc2UgZm9yIGRvc2VtdSBmbG9wcHkgaW1hZ2UgZmlsZXMgZm9yIGluc3RhbmNlCgkgKi8KCWlmICghKChTX0lTQkxLKHN0YXRidWYtPnN0X21vZGUpICYmIAoJICAgICAgIG1ham9yKHN0YXRidWYtPnN0X3JkZXYpID09IEJMT0NLX01BSk9SKQojaWZkZWYgQ0hBUl9NQUpPUgoJICAgICAgfHwgKFNfSVNDSFIoc3RhdGJ1Zi0+c3RfbW9kZSkgJiYgCgkJICBtYWpvcihzdGF0YnVmLT5zdF9yZGV2KSA9PSBDSEFSX01BSk9SKSAKI2VuZGlmCgkJKSkKCQlyZXR1cm4gY29tcGFyZV9nZW9tKGRldiwgb3JpZ19kZXYpOwoJCgkvKgoJICogV2UgZmlyc3QgdHJ5IHRvIGdldCB0aGUgY3VycmVudCBmbG9wcHkgcGFyYW1ldGVycyBmcm9tIHRoZSBrZXJuZWwuCgkgKiBUaGlzIGFsbG93cyB1cyB0bwoJICogMS4gZ2V0IHRoZSByYXRlCgkgKiAyLiBza2lwIHRoZSBwYXJhbWV0ZXIgc2V0dGluZyBpZiB0aGUgcGFyYW1ldGVycyBhcmUgYWxyZWFkeSBvLmsuCgkgKi8KCQoJaWYgKGdldF9wYXJhbWV0ZXJzKCBmZCwgJiBmbG9wcHkgKSApCgkJLyogCgkJICogYXV0b2RldGVjdGlvbiBmYWlsdXJlLgoJCSAqIFRoaXMgbW9zdGx5IG9jY3VycyBiZWNhdXNlIG9mIGFuIGFic2VudCBvciB1bmZvcm1hdHRlZCBkaXNrcy4KCQkgKgoJCSAqIEl0IG1pZ2h0IGFsc28gb2NjdXIgYmVjYXVzZSBvZiBiaXphcnJlIGZvcm1hdHMgKGZvciBleGFtcGxlIAoJCSAqIHJhdGUgMSBvbiBhIDMgMS8yIGRpc2spLgoKCQkgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgdXNlciBzaG91bGQgZG8gYW4gZXhwbGljaXQgCgkJICogc2V0ZmRwcm0gYmVmb3JlIGNhbGxpbmcgbXRvb2xzCgkJICoKCQkgKiBBbm90aGVyIGNhdXNlIG1pZ2h0IGJlIHByZS1leGlzdGluZyB3cm9uZyBwYXJhbWV0ZXJzLiBUaGUgCgkJICogdXNlciBzaG91bGQgZG8gYW4gc2V0ZmRwcm0gLWMgdG8gcmVwYWlyIHRoaXMgc2l0dWF0aW9uLgoJCSAqCgkJICogLi4uZmFpbCBpbW1lZGlhdGVseS4uLiAoIFRoZW9yZXRpY2FsbHksIHdlIGNvdWxkIHRyeSB0byBzYXZlCgkJICogdGhlIHNpdHVhdGlvbiBieSB0cnlpbmcgb3V0IGFsbCByYXRlcywgYnV0IGl0IHdvdWxkIGJlIHNsb3cgCgkJICogYW5kIGF3a3dhcmQpCgkJICovCgkJcmV0dXJuIDE7CgoKCS8qIAoJICogaWYgd2UgaGF2ZSBhbHJlYWR5IGhhdmUgdGhlIGNvcnJlY3QgcGFyYW1ldGVycywga2VlcCB0aGVtLgoJICogdGhlIG51bWJlciBvZiB0cmFja3MgZG9lc24ndCBuZWVkIHRvIG1hdGNoIGV4YWN0bHksIGl0IG1heSBiZSBiaWdnZXIuCgkgKiB0aGUgbnVtYmVyIG9mIGhlYWRzIGFuZCBzZWN0b3JzIG11c3QgbWF0Y2ggZXhhY3RseSwgdG8gYXZvaWQgCgkgKiBtaXNjYWxjdWxhdGlvbiBvZiB0aGUgbG9jYXRpb24gb2YgYSBibG9jayBvbiB0aGUgZGlzawoJICovCgljaGFuZ2UgPSAwOwoJaWYoY29tcGFyZShkZXYtPnNlY3RvcnMsIFNFQ1RPUlMoZmxvcHB5KSkpewoJCVNFQ1RPUlMoZmxvcHB5KSA9IGRldi0+c2VjdG9yczsKCQljaGFuZ2UgPSAxOwoJfSBlbHNlCgkJZGV2LT5zZWN0b3JzID0gU0VDVE9SUyhmbG9wcHkpOwoKCWlmKGNvbXBhcmUoZGV2LT5oZWFkcywgSEVBRFMoZmxvcHB5KSkpewoJCUhFQURTKGZsb3BweSkgPSBkZXYtPmhlYWRzOwoJCWNoYW5nZSA9IDE7Cgl9IGVsc2UKCQlkZXYtPmhlYWRzID0gSEVBRFMoZmxvcHB5KTsKCSAKCWlmKGNvbXBhcmUoZGV2LT50cmFja3MsIFRSQUNLUyhmbG9wcHkpKSl7CgkJVFJBQ0tTKGZsb3BweSkgPSBkZXYtPnRyYWNrczsKCQljaGFuZ2UgPSAxOwoJfSBlbHNlCgkJZGV2LT50cmFja3MgPSBUUkFDS1MoZmxvcHB5KTsKCgoJaWYoY29tcGFyZShkZXYtPnVzZV8ybSwgVVNFXzJNKGZsb3BweSkpKXsKCQlTRVRfMk0oJmZsb3BweSwgZGV2LT51c2VfMm0pOwoJCWNoYW5nZSA9IDE7Cgl9IGVsc2UKCQlkZXYtPnVzZV8ybSA9IFVTRV8yTShmbG9wcHkpOwoJCglpZiggISAoZGV2LT5zc2l6ZSAmIDB4ODApICkKCQlkZXYtPnNzaXplID0gMDsKCWlmKGNvbXBhcmUoZGV2LT5zc2l6ZSwgU1NJWkUoZmxvcHB5KSArIDEyOCkpewoJCVNFVF9TU0laRSgmZmxvcHB5LCBkZXYtPnNzaXplKTsKCQljaGFuZ2UgPSAxOwoJfSBlbHNlCgkJZGV2LT5zc2l6ZSA9IFNTSVpFKGZsb3BweSk7CgoJaWYoIWNoYW5nZSkKCQkvKiBubyBjaGFuZ2UsIHN1Y2NlZWQgKi8KCQlyZXR1cm4gMDsKCiNpZmRlZiBTRUNUT1JTX1BFUl9UUkFDSwoJU0VDVE9SU19QRVJfVFJBQ0soZmxvcHB5KSA9IGRldi0+c2VjdG9ycyAqIGRldi0+aGVhZHM7CiNlbmRpZgoKI2lmZGVmIFNFQ1RPUlNfUEVSX0RJU0sKCVNFQ1RPUlNfUEVSX0RJU0soZmxvcHB5KSA9IGRldi0+c2VjdG9ycyAqIGRldi0+aGVhZHMgKiBkZXYtPnRyYWNrczsKI2VuZGlmCgkKI2lmZGVmIFNUUkVUQ0gKCS8qIC4uLiBhbmQgdGhlIHN0cmV0Y2ggKi8KCWlmICggZGV2LT50cmFja3MgPiA0MSApIAoJCVNUUkVUQ0goZmxvcHB5KSA9IDA7CgllbHNlCgkJU1RSRVRDSChmbG9wcHkpID0gMTsKI2VuZGlmCgkKCXJldHVybiBzZXRfcGFyYW1ldGVycyggZmQsICZmbG9wcHksIHN0YXRidWYpOwp9CiNlbmRpZiAvKiBJTklUX0dFTkVSSUMgKi8gIAoKI2lmZGVmIElOSVRfTk9PUAppbnQgaW5pdF9nZW9tKGludCBmZCwgc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpvcmlnX2RldiwKCQkJICBzdHJ1Y3QgTVRfU1RBVCAqc3RhdGJ1ZikKewoJcmV0dXJuIGNvbXBhcmVfZ2VvbShkZXYsIG9yaWdfZGV2KTsKfQojZW5kaWYKCiNpZmRlZiBwcmVkZWZpbmVkX2RldmljZXMKY29uc3QgdW5zaWduZWQgaW50IG5yX2NvbnN0X2RldmljZXMgPSBzaXplb2YoY29uc3RfZGV2aWNlcykgLyBzaXplb2YoKmNvbnN0X2RldmljZXMpOwojZWxzZQpzdHJ1Y3QgZGV2aWNlIGRldmljZXNbXT17Cgl7Ii9kZXYvZmQwIiwgJ0EnLCAwLCBPX0VYQ0wsIDAsMCwgMCwwLCBNREVGX0FSR30sCgkvKiB0byBzaHV0IHVwIFVsdHJpeCdzIG5hdGl2ZSBjb21waWxlciwgd2UgY2FuJ3QgbWFrZSB0aGlzIGVtcHR5IDooICovCn07CmNvbnN0IHVuc2lnbmVkIGludCBucl9jb25zdF9kZXZpY2VzID0gMDsKI2VuZGlmCg==