LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgbmV0d2F2ZV9jcy5jCiAqIFZlcnNpb246ICAgICAgIDAuNC4xCiAqIERlc2NyaXB0aW9uOiAgIE5ldHdhdmUgQWlyU3VyZmVyIFdpcmVsZXNzIExBTiBQQyBDYXJkIGRyaXZlcgogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcnM6ICAgICAgIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4gPGpvaG5tQGNzLnVpdC5ubz4KICogICAgICAgICAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAgICAgICAgICAgICAgICBEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAqIENyZWF0ZWQgYXQ6ICAgIEEgbG9uZyB0aW1lIGFnbyEKICogTW9kaWZpZWQgYXQ6ICAgTW9uIE5vdiAxMCAxMTo1NDozNyAxOTk3CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcgVW5pdmVyc2l0eSBvZiBUcm9tc/gsIE5vcndheQogKgogKiBSZXZpc2lvbiBIaXN0b3J5OgogKgogKiAgIDA4LU5vdi05NyAxNToxNDo0NyAgIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4gPGpvaG5tQGNzLnVpdC5ubz4KICogICAgLSBGaXhlZCBzb21lIGJ1Z3MgaW4gbmV0d2F2ZV9yeCBhbmQgY2xlYW5lZCBpdCB1cCBhIGJpdC4gCiAqICAgICAgKE9uZSBvZiB0aGUgYnVncyB3b3VsZCBoYXZlIGRlc3Ryb3llZCBwYWNrZXRzIHdoZW4gcmVjZWl2aW5nCiAqICAgICAgbXVsdGlwbGUgcGFja2V0cyBwZXIgaW50ZXJydXB0KS4gCiAqICAgIC0gQ2xlYW5lZCB1cCBwYXJ0cyBvZiBuZXdhdmVfaHdfeG1pdC4gCiAqICAgIC0gQSBmZXcgZ2VuZXJhbCBjbGVhbnVwcy4gCiAqICAgMjQtT2N0LTk3IDEzOjE3OjM2ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAgICAtIEZpeGVkIG5ldHdhdmVfcnggcmVjZWl2ZSBmdW5jdGlvbiAoZ290IHVwZGF0ZWQgZG9jcykKICogICBPdGhlcnM6CiAqICAgIC0gQ2hhbmdlZCBuYW1lIGZyb20geGlyY253IHRvIG5ldHdhdmUsIHRha2UgYSBsb29rIGF0IAogKiAgICAgIGh0dHA6Ly93d3cubmV0d2F2ZS13aXJlbGVzcy5jb20KICogICAgLSBTb21lIHJlb3JnYW5pemluZyBvZiB0aGUgY29kZQogKiAgICAtIFJlbW92ZWQgcG9zc2libGUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdHJhbnNtaXQKICogICAgICBmdW5jdGlvbgogKiAgICAtIFN0YXJ0ZWQgdG8gYWRkIHdpcmVsZXNzIGV4dGVuc2lvbnMsIGJ1dCBzdGlsbCBuZWVkcyBzb21lIGNvZGluZwogKiAgICAtIEFkZGVkIHdhdGNoZG9nIGZvciBiZXR0ZXIgaGFuZGxpbmcgb2YgdHJhbnNtaXNzaW9uIHRpbWVvdXRzIAogKiAgICAgIChob3BlZnVsbHkgdGhpcyB3b3JrcyBiZXR0ZXIpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRvIGhhdmUgc3RhdGlzdGljcyAoanVzdCBwYWNrZXRzIHNlbnQpIGRlZmluZSB0aGlzICovCiN1bmRlZiBORVRXQVZFX1NUQVRTCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9mY250bC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaW4uaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvdGltZXIuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgojaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CgojaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiNpbmNsdWRlIDxwY21jaWEvY3MuaD4KI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgojaW5jbHVkZSA8cGNtY2lhL21lbV9vcC5oPgoKI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgoKI2RlZmluZSBORVRXQVZFX1JFR09GRiAgICAgICAgIDB4ODAwMAovKiBUaGUgTmV0d2F2ZSBJTyByZWdpc3RlcnMsIG9mZnNldHMgdG8gaW9iYXNlICovCiNkZWZpbmUgTkVUV0FWRV9SRUdfQ09SICAgICAgICAweDAKI2RlZmluZSBORVRXQVZFX1JFR19DQ1NSICAgICAgIDB4MgojZGVmaW5lIE5FVFdBVkVfUkVHX0FTUiAgICAgICAgMHg0CiNkZWZpbmUgTkVUV0FWRV9SRUdfSU1SICAgICAgICAweGEKI2RlZmluZSBORVRXQVZFX1JFR19QTVIgICAgICAgIDB4YwojZGVmaW5lIE5FVFdBVkVfUkVHX0lPTE9XICAgICAgMHg2CiNkZWZpbmUgTkVUV0FWRV9SRUdfSU9ISSAgICAgICAweDcKI2RlZmluZSBORVRXQVZFX1JFR19JT0NPTlRST0wgIDB4OAojZGVmaW5lIE5FVFdBVkVfUkVHX0RBVEEgICAgICAgMHhmCi8qIFRoZSBOZXR3YXZlIEV4dGVuZGVkIElPIHJlZ2lzdGVycywgb2Zmc2V0cyB0byBSYW1CYXNlICovCiNkZWZpbmUgTkVUV0FWRV9FUkVHX0FTQ0MgICAgICAweDExNAojZGVmaW5lIE5FVFdBVkVfRVJFR19SU0VSICAgICAgMHgxMjAKI2RlZmluZSBORVRXQVZFX0VSRUdfUlNFUlcgICAgIDB4MTI0CiNkZWZpbmUgTkVUV0FWRV9FUkVHX1RTRVIgICAgICAweDEzMAojZGVmaW5lIE5FVFdBVkVfRVJFR19UU0VSVyAgICAgMHgxMzQKI2RlZmluZSBORVRXQVZFX0VSRUdfQ0IgICAgICAgIDB4MTAwCiNkZWZpbmUgTkVUV0FWRV9FUkVHX1NQQ1EgICAgICAweDE1NAojZGVmaW5lIE5FVFdBVkVfRVJFR19TUFUgICAgICAgMHgxNTUKI2RlZmluZSBORVRXQVZFX0VSRUdfTElGICAgICAgIDB4MTRlCiNkZWZpbmUgTkVUV0FWRV9FUkVHX0lTUExRICAgICAweDE1NgojZGVmaW5lIE5FVFdBVkVfRVJFR19ISEMgICAgICAgMHgxNTgKI2RlZmluZSBORVRXQVZFX0VSRUdfTkkgICAgICAgIDB4MTZlCiNkZWZpbmUgTkVUV0FWRV9FUkVHX01IUyAgICAgICAweDE2YgojZGVmaW5lIE5FVFdBVkVfRVJFR19URFAgICAgICAgMHgxNDAKI2RlZmluZSBORVRXQVZFX0VSRUdfUkRQICAgICAgIDB4MTUwCiNkZWZpbmUgTkVUV0FWRV9FUkVHX1BBICAgICAgICAweDE2MAojZGVmaW5lIE5FVFdBVkVfRVJFR19FQyAgICAgICAgMHgxODAKI2RlZmluZSBORVRXQVZFX0VSRUdfQ1JCUCAgICAgIDB4MTdhCiNkZWZpbmUgTkVUV0FWRV9FUkVHX0FSVyAgICAgICAweDE2NgoKLyoKICogQ29tbWFuZHMgdXNlZCBpbiB0aGUgZXh0ZW5kZWQgY29tbWFuZCBidWZmZXIKICogTkVUV0FWRV9FUkVHX0NCICgweDEwMC0weDEwRikgCiAqLwojZGVmaW5lIE5FVFdBVkVfQ01EX05PUCAgICAgICAgMHgwMAojZGVmaW5lIE5FVFdBVkVfQ01EX1NSQyAgICAgICAgMHgwMQojZGVmaW5lIE5FVFdBVkVfQ01EX1NUQyAgICAgICAgMHgwMgojZGVmaW5lIE5FVFdBVkVfQ01EX0FNQSAgICAgICAgMHgwMwojZGVmaW5lIE5FVFdBVkVfQ01EX0RNQSAgICAgICAgMHgwNAojZGVmaW5lIE5FVFdBVkVfQ01EX1NBTUEgICAgICAgMHgwNQojZGVmaW5lIE5FVFdBVkVfQ01EX0VSICAgICAgICAgMHgwNgojZGVmaW5lIE5FVFdBVkVfQ01EX0RSICAgICAgICAgMHgwNwojZGVmaW5lIE5FVFdBVkVfQ01EX1RMICAgICAgICAgMHgwOAojZGVmaW5lIE5FVFdBVkVfQ01EX1NSUCAgICAgICAgMHgwOQojZGVmaW5lIE5FVFdBVkVfQ01EX1NTSyAgICAgICAgMHgwYQojZGVmaW5lIE5FVFdBVkVfQ01EX1NNRCAgICAgICAgMHgwYgojZGVmaW5lIE5FVFdBVkVfQ01EX1NBUEQgICAgICAgMHgwYwojZGVmaW5lIE5FVFdBVkVfQ01EX1NTUyAgICAgICAgMHgxMQovKiBFbmQgb2YgQ29tbWFuZCBtYXJrZXIgKi8KI2RlZmluZSBORVRXQVZFX0NNRF9FT0MgICAgICAgIDB4MDAKCi8qIEFTUiByZWdpc3RlciBiaXRzICovCiNkZWZpbmUgTkVUV0FWRV9BU1JfUlhSRFkgICAweDgwCiNkZWZpbmUgTkVUV0FWRV9BU1JfVFhCQSAgICAweDAxCgojZGVmaW5lIFRYX1RJTUVPVVQJCSgoMzIqSFopLzEwMCkKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW1yQ29uZlJGVTEgPSAweDEwOyAvKiBSRlUgaW50ZXJydXB0IG1hc2ssIGtlZXAgaGlnaCAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltckNvbmZJRU5BID0gMHgwMjsgLyogSW50ZXJydXB0IGVuYWJsZSAqLwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjb3JDb25mSUVOQSAgID0gMHgwMTsgLyogSW50ZXJydXB0IGVuYWJsZSAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvckNvbmZMVkxSRVEgPSAweDQwOyAvKiBLZWVwIGhpZ2ggKi8KCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mUnhFbmEgID0gMHg4MDsgLyogUmVjZWl2ZSBFbmFibGUgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZNQUMgICAgPSAweDIwOyAvKiBNQUMgaG9zdCByZWNlaXZlIG1vZGUqLyAKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZQcm8gICAgPSAweDEwOyAvKiBQcm9taXNjdW91cyAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZkFNUCAgICA9IDB4MDg7IC8qIEFjY2VwdCBNdWx0aWNhc3QgUGFja2V0cyAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZkJjYXN0ICA9IDB4MDQ7IC8qIEFjY2VwdCBCcm9hZGNhc3QgUGFja2V0cyAqLwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZUeEVuYSAgPSAweDgwOyAvKiBUcmFuc21pdCBFbmFibGUgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZNQUMgICAgPSAweDIwOyAvKiBIb3N0IHNlbmRzIE1BQyBtb2RlICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHhDb25mRVVEICAgID0gMHgxMDsgLyogRW5hYmxlIFVuaS1EYXRhIHBhY2tldHMgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZLZXkgICAgPSAweDAyOyAvKiBTY3JhbWJsZSBkYXRhIHBhY2tldHMgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZMb29wICAgPSAweDAxOyAvKiBMb29wYmFjayBtb2RlICovCgovKgogICBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZgogICB5b3UgZG8gbm90IGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZQogICBsZWZ0IG91dC4gIElmIHlvdSBjb21waWxlIHdpdGggUENNQ0lBX0RFQlVHPTAsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwKICAgYmUgcHJlc2VudCBidXQgZGlzYWJsZWQgLS0gYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljCiAgIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYSAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKi8KCiNpZmRlZiBQQ01DSUFfREVCVUcKc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOwojZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCnN0YXRpYyBjaGFyICp2ZXJzaW9uID0KIm5ldHdhdmVfY3MuYyAwLjMuMCBUaHUgSnVsIDE3IDE0OjM2OjAyIDE5OTcgKEpvaG4gTWFya3VzIEJq+HJuZGFsZW4pXG4iOwojZWxzZQojZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCgovKiBDaG9vc2UgdGhlIGRvbWFpbiwgZGVmYXVsdCBpcyAweDEwMCAqLwpzdGF0aWMgdV9pbnQgIGRvbWFpbiA9IDB4MTAwOwoKLyogU2NyYW1ibGUga2V5LCByYW5nZSBmcm9tIDB4MCB0byAweGZmZmYuICAKICogMHgwIGlzIG5vIHNjcmFtYmxpbmcuIAogKi8Kc3RhdGljIHVfaW50ICBzY3JhbWJsZV9rZXkgPSAweDA7CgovKiBTaGFyZWQgbWVtb3J5IHNwZWVkLCBpbiBucy4gVGhlIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgCiAqIHRoZSBjYXJkIHNob3VsZCBub3QgYmUgcmVhZCBmYXN0ZXIgdGhhbiBldmVyeSA0MDBucy4gCiAqIFRoaXMgdGltaW5nIHNob3VsZCBiZSBwcm92aWRlZCBieSB0aGUgSEJBLiBJZiBpdCBiZWNvbWVzIGEgCiAqIHByb2JsZW0sIHRyeSBzZXR0aW5nIG1lbV9zcGVlZCB0byA0MDAuIAogKi8Kc3RhdGljIGludCBtZW1fc3BlZWQ7Cgptb2R1bGVfcGFyYW0oZG9tYWluLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oc2NyYW1ibGVfa2V5LCBpbnQsIDApOwptb2R1bGVfcGFyYW0obWVtX3NwZWVkLCBpbnQsIDApOwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKiBQQ01DSUEgKENhcmQgU2VydmljZXMpIHJlbGF0ZWQgZnVuY3Rpb25zICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfcmVsZWFzZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayk7ICAgICAvKiBDYXJkIHJlbW92YWwgKi8Kc3RhdGljIGludCBuZXR3YXZlX3BjbWNpYV9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmFyZyk7IC8qIFJ1bnMgYWZ0ZXIgY2FyZAoJCQkJCQkJCQkJCQkJICAgaW5zZXJ0aW9uICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfZGV0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7ICAgIC8qIERlc3Ryb3kgaW5zdGFuY2UgKi8KCi8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8Kc3RhdGljIHZvaWQgbmV0d2F2ZV9kb3Jlc2V0KGtpb19hZGRyX3QgaW9iYXNlLCB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSk7CnN0YXRpYyB2b2lkIG5ldHdhdmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CgovKiBNaXNjIGRldmljZSBzdHVmZiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsgIC8qIE9wZW4gdGhlIGRldmljZSAqLwpzdGF0aWMgaW50IG5ldHdhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7IC8qIENsb3NlIHRoZSBkZXZpY2UgKi8KCi8qIFBhY2tldCB0cmFuc21pc3Npb24gYW5kIFBhY2tldCByZWNlcHRpb24gKi8Kc3RhdGljIGludCBuZXR3YXZlX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50IG5ldHdhdmVfcngoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwoKLyogSW50ZXJydXB0IHJvdXRpbmVzICovCnN0YXRpYyBpcnFyZXR1cm5fdCBuZXR3YXZlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpzdGF0aWMgdm9pZCBuZXR3YXZlX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICopOwoKLyogU3RhdGlzdGljcyAqLwpzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0d2F2ZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CgovKiBXaXJlbGVzcyBleHRlbnNpb25zICovCnN0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyogbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CgpzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CgovKgogICBBIHN0cnVjdCBwY21jaWFfZGV2aWNlIHN0cnVjdHVyZSBoYXMgZmllbGRzIGZvciBtb3N0IHRoaW5ncyB0aGF0IGFyZSBuZWVkZWQKICAgdG8ga2VlcCB0cmFjayBvZiBhIHNvY2tldCwgYnV0IHRoZXJlIHdpbGwgdXN1YWxseSBiZSBzb21lIGRldmljZQogICBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IGFsc28gbmVlZHMgdG8gYmUga2VwdCB0cmFjayBvZi4gIFRoZQogICAncHJpdicgcG9pbnRlciBpbiBhIHN0cnVjdCBwY21jaWFfZGV2aWNlIHN0cnVjdHVyZSBjYW4gYmUgdXNlZCB0byBwb2ludCB0bwogICBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCgogICBBIGRyaXZlciBuZWVkcyB0byBwcm92aWRlIGEgZGV2X25vZGVfdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggZGV2aWNlCiAgIG9uIGEgY2FyZC4gIEluIHNvbWUgY2FzZXMsIHRoZXJlIGlzIG9ubHkgb25lIGRldmljZSBwZXIgY2FyZCAoZm9yCiAgIGV4YW1wbGUsIGV0aGVybmV0IGNhcmRzLCBtb2RlbXMpLiAgSW4gb3RoZXIgY2FzZXMsIHRoZXJlIG1heSBiZQogICBtYW55IGFjdHVhbCBvciBsb2dpY2FsIGRldmljZXMgKFNDU0kgYWRhcHRlcnMsIG1lbW9yeSBjYXJkcyB3aXRoCiAgIG11bHRpcGxlIHBhcnRpdGlvbnMpLiAgVGhlIGRldl9ub2RlX3Qgc3RydWN0dXJlcyBuZWVkIHRvIGJlIGtlcHQKICAgaW4gYSBsaW5rZWQgbGlzdCBzdGFydGluZyBhdCB0aGUgJ2RldicgZmllbGQgb2YgYSBzdHJ1Y3QgcGNtY2lhX2RldmljZQogICBzdHJ1Y3R1cmUuICBXZSBhbGxvY2F0ZSB0aGVtIGluIHRoZSBjYXJkJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwKICAgYmVjYXVzZSB0aGV5IGdlbmVyYWxseSBjYW4ndCBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCiovCgpzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCW5ldHdhdmVfaGFuZGxlcl9kZWY7CgojZGVmaW5lIFNJT0NHSVBTTkFQCVNJT0NJV0ZJUlNUUFJJVgkrIDEJLyogU2l0ZSBTdXJ2ZXkgU25hcHNob3QgKi8KCiNkZWZpbmUgTUFYX0VTQSAxMAoKdHlwZWRlZiBzdHJ1Y3QgbmV0X2FkZHIgewogICAgdV9jaGFyIGFkZHI0OFs2XTsKfSBuZXRfYWRkcjsKCnN0cnVjdCBzaXRlX3N1cnZleSB7CiAgICB1X3Nob3J0IGxlbmd0aDsKICAgIHVfY2hhciAgc3RydWN0X3JldmlzaW9uOwogICAgdV9jaGFyICByb2FtaW5nX3N0YXRlOwoJCiAgICB1X2NoYXIgIHNwX2V4aXN0c0ZsYWc7CiAgICB1X2NoYXIgIHNwX2xpbmtfcXVhbGl0eTsKICAgIHVfY2hhciAgc3BfbWF4X2xpbmtfcXVhbGl0eTsKICAgIHVfY2hhciAgbGlua1F1YWxpdHlHb29kRmFpckJvdW5kYXJ5OwogICAgdV9jaGFyICBsaW5rUXVhbGl0eUZhaXJQb29yQm91bmRhcnk7CiAgICB1X2NoYXIgIHNwX3V0aWxpemF0aW9uOwogICAgdV9jaGFyICBzcF9nb29kbmVzczsKICAgIHVfY2hhciAgc3BfaG90aGVhZGNvdW50OwogICAgdV9jaGFyICByb2FtaW5nX2NvbmRpdGlvbjsKCQogICAgbmV0X2FkZHIgc3A7CiAgICB1X2NoYXIgICBudW1BUHM7CiAgICBuZXRfYWRkciBuZWFyQnlBY2Nlc3NQb2ludHNbTUFYX0VTQV07Cn07CQogICAKdHlwZWRlZiBzdHJ1Y3QgbmV0d2F2ZV9wcml2YXRlIHsKCXN0cnVjdCBwY21jaWFfZGV2aWNlCSpwX2RldjsKICAgIHNwaW5sb2NrX3QJc3BpbmxvY2s7CS8qIFNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIChTTVApICovCiAgICBkZXZfbm9kZV90IG5vZGU7CiAgICB1X2NoYXIgICAgIF9faW9tZW0gKnJhbUJhc2U7CiAgICBpbnQgICAgICAgIHRpbWVvdXRDb3VudGVyOwogICAgaW50ICAgICAgICBsYXN0RXhlYzsKICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgd2F0Y2hkb2c7CS8qIFRvIGF2b2lkIGJsb2NraW5nIHN0YXRlICovCiAgICBzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkgICAgIG5zczsKICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogICAgc3RydWN0IGl3X3N0YXRpc3RpY3MgICBpd19zdGF0czsgICAgLyogV2lyZWxlc3Mgc3RhdHMgKi8KfSBuZXR3YXZlX3ByaXZhdGU7CgojaWZkZWYgTkVUV0FWRV9TVEFUUwpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHdhdmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwojZW5kaWYKCi8qCiAqIFRoZSBOZXR3YXZlIGNhcmQgaXMgbGl0dGxlLWVuZGlhbiwgc28gd29uJ3Qgd29yayBmb3IgYmlnIGVuZGlhbgogKiBzeXN0ZW1zLgogKi8Kc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBnZXRfdWludDE2KHVfY2hhciBfX2lvbWVtICpzdGFkZHIpIAp7CiAgICByZXR1cm4gcmVhZHcoc3RhZGRyKTsgLyogUmV0dXJuIG9ubHkgMTYgYml0cyAqLwp9CgpzdGF0aWMgaW5saW5lIHNob3J0IGdldF9pbnQxNih1X2NoYXIgX19pb21lbSAqIHN0YWRkcikKewogICAgcmV0dXJuIHJlYWR3KHN0YWRkcik7Cn0KCi8qIAogKiBXYWl0IHVudGlsIHRoZSBXT0MgKFdyaXRlIE9wZXJhdGlvbiBDb21wbGV0ZSkgYml0IGluIHRoZSAKICogQVNSIChBZGFwdGVyIFN0YXR1cyBSZWdpc3RlcikgaXMgYXNzZXJ0ZWQuIAogKiBUaGlzIHNob3VsZCBoYXZlIGFib3J0ZWQgaWYgaXQgdGFrZXMgdG9vIGxvbmcgdGltZS4gCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9XT0ModW5zaWduZWQgaW50IGlvYmFzZSkKewogICAgLyogU3BpbiBsb2NrICovCiAgICB3aGlsZSAoKGluYihpb2Jhc2UgKyBORVRXQVZFX1JFR19BU1IpICYgMHg4KSAhPSAweDgpIDsgCn0KCnN0YXRpYyB2b2lkIG5ldHdhdmVfc25hcHNob3QobmV0d2F2ZV9wcml2YXRlICpwcml2LCB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSwgCgkJCSAgICAga2lvX2FkZHJfdCBpb2Jhc2UpIHsKICAgIHVfc2hvcnQgcmVzdWx0QnVmZmVyOwoKICAgIC8qIGlmIHRpbWUgc2luY2UgbGFzdCBzbmFwc2hvdCBpcyA+IDEgc2VjLiAoMTAwIGppZmZpZXM/KSAgdGhlbiB0YWtlIAogICAgICogbmV3IHNuYXBzaG90LCBlbHNlIHJldHVybiBjYWNoZWQgZGF0YS4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgcmF0ZS4gIAogICAgICovCiAgICBpZiAoIGppZmZpZXMgLSBwcml2LT5sYXN0RXhlYyA+IDEwMCkgeyAKCS8qIFRha2Ugc2l0ZSBzdXJ2ZXkgIHNuYXBzaG90ICovIAoJLypwcmludGsoIEtFUk5fREVCVUcgIlRha2luZyBuZXcgc25hcHNob3QuICVsZFxuIiwgamlmZmllcyAtCgkgIHByaXYtPmxhc3RFeGVjKTsgKi8KCXdhaXRfV09DKGlvYmFzZSk7IAoJd3JpdGViKE5FVFdBVkVfQ01EX1NTUywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOyAKCXdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsgCgl3YWl0X1dPQyhpb2Jhc2UpOyAKCgkvKiBHZXQgcmVzdWx0IGFuZCBjb3B5IHRvIGNhY2ggKi8gCglyZXN1bHRCdWZmZXIgPSByZWFkdyhyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NSQlApOyAKCWNvcHlfZnJvbV9wYyggJnByaXYtPm5zcywgcmFtQmFzZStyZXN1bHRCdWZmZXIsIAoJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkpKTsgCiAgICB9IAp9CgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0cyAoZGV2KQogKgogKiAgICBXaXJlbGVzcyBleHRlbnNpb25zIHN0YXRpc3RpY3MKICoKICovCnN0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewkKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzKiB3c3RhdHM7CgkKICAgIHdzdGF0cyA9ICZwcml2LT5pd19zdGF0czsKCiAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKCQogICAgbmV0d2F2ZV9zbmFwc2hvdCggcHJpdiwgcmFtQmFzZSwgaW9iYXNlKTsKCiAgICB3c3RhdHMtPnN0YXR1cyA9IHByaXYtPm5zcy5yb2FtaW5nX3N0YXRlOwogICAgd3N0YXRzLT5xdWFsLnF1YWwgPSByZWFkYiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUENRKTsgCiAgICB3c3RhdHMtPnF1YWwubGV2ZWwgPSByZWFkYiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19JU1BMUSk7CiAgICB3c3RhdHMtPnF1YWwubm9pc2UgPSByZWFkYiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUFUpICYgMHgzZjsKICAgIHdzdGF0cy0+ZGlzY2FyZC5ud2lkID0gMEw7CiAgICB3c3RhdHMtPmRpc2NhcmQuY29kZSA9IDBMOwogICAgd3N0YXRzLT5kaXNjYXJkLm1pc2MgPSAwTDsKCiAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwogICAgCiAgICByZXR1cm4gJnByaXYtPml3X3N0YXRzOwp9CgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX2F0dGFjaCAodm9pZCkKICoKICogICAgIENyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nIGxvY2FsIGRhdGEgCiAqICAgICBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCAKICogICAgIFNlcnZpY2VzLgogKgogKiAgICAgVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CiAqICAgICBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQogKiAgICAgY2FyZCBpbnNlcnRpb24gZXZlbnQuCiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfcHJvYmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCnsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXY7CgogICAgREVCVUcoMCwgIm5ldHdhdmVfYXR0YWNoKClcbiIpOwoKICAgIC8qIEluaXRpYWxpemUgdGhlIHN0cnVjdCBwY21jaWFfZGV2aWNlIHN0cnVjdHVyZSAqLwogICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZSkpOwogICAgaWYgKCFkZXYpCglyZXR1cm4gLUVOT01FTTsKICAgIHByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgcHJpdi0+cF9kZXYgPSBsaW5rOwogICAgbGluay0+cHJpdiA9IGRldjsKCiAgICAvKiBUaGUgaW8gc3RydWN0dXJlIGRlc2NyaWJlcyBJTyBwb3J0IG1hcHBpbmcgKi8KICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OwogICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CiAgICAvKiBsaW5rLT5pby5OdW1Qb3J0czIgPSAxNjsgCiAgICAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsgKi8KICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNTsKICAgIAogICAgLyogSW50ZXJydXB0IHNldHVwICovCiAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKICAgIGxpbmstPmlycS5IYW5kbGVyID0gJm5ldHdhdmVfaW50ZXJydXB0OwogICAgCiAgICAvKiBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uICovCiAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CiAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOwogICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CgogICAgLyogTmV0d2F2ZSBwcml2YXRlIHN0cnVjdCBpbml0LiBsaW5rL2Rldi9ub2RlIGFscmVhZHkgdGFrZW4gY2FyZSBvZiwKICAgICAqIG90aGVyIHN0dWZmIHplcm8nZCAtIEplYW4gSUkgKi8KICAgIHNwaW5fbG9ja19pbml0KCZwcml2LT5zcGlubG9jayk7CgogICAgLyogTmV0d2F2ZSBzcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCiAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CiAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZuZXR3YXZlX3N0YXJ0X3htaXQ7CiAgICBkZXYtPmdldF9zdGF0cyAgPSAmbmV0d2F2ZV9nZXRfc3RhdHM7CiAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CiAgICAvKiB3aXJlbGVzcyBleHRlbnNpb25zICovCiAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZuZXR3YXZlX2hhbmRsZXJfZGVmOwoKICAgIGRldi0+dHhfdGltZW91dCA9ICZuZXR3YXZlX3dhdGNoZG9nOwogICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CgogICAgZGV2LT5vcGVuID0gJm5ldHdhdmVfb3BlbjsKICAgIGRldi0+c3RvcCA9ICZuZXR3YXZlX2Nsb3NlOwogICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OwoKICAgIHJldHVybiBuZXR3YXZlX3BjbWNpYV9jb25maWcoIGxpbmspOwp9IC8qIG5ldHdhdmVfYXR0YWNoICovCgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX2RldGFjaCAobGluaykKICoKICogICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKICogICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCiAqICAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCiAqICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfZGV0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKCglERUJVRygwLCAibmV0d2F2ZV9kZXRhY2goMHglcClcbiIsIGxpbmspOwoKCW5ldHdhdmVfcmVsZWFzZShsaW5rKTsKCglpZiAobGluay0+ZGV2X25vZGUpCgkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKCglmcmVlX25ldGRldihkZXYpOwp9IC8qIG5ldHdhdmVfZGV0YWNoICovCgovKgogKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHByb3RvY29sIG5hbWUKICovCnN0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAoJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCgkJCSAgICBjaGFyICpleHRyYSkKewoJc3RyY3B5KHdycXUtPm5hbWUsICJOZXR3YXZlIik7CglyZXR1cm4gMDsKfQoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBOZXR3b3JrIElECiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfc2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgY2hhciAqZXh0cmEpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwoJbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKCXVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKCgkvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKCglpZighd3JxdS0+bndpZC5kaXNhYmxlZCkgewoJICAgIGRvbWFpbiA9IHdycXUtPm53aWQudmFsdWU7CgkgICAgcHJpbnRrKCBLRVJOX0RFQlVHICJTZXR0aW5nIGRvbWFpbiB0byAweCV4JTAyeFxuIiwgCgkJICAgIChkb21haW4gPj4gOCkgJiAweDAxLCBkb21haW4gJiAweGZmKTsKCSAgICB3YWl0X1dPQyhpb2Jhc2UpOwoJICAgIHdyaXRlYihORVRXQVZFX0NNRF9TTUQsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKCSAgICB3cml0ZWIoIGRvbWFpbiAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKCSAgICB3cml0ZWIoKGRvbWFpbiA+PjggKSAmIDB4MDEscmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQisyKTsKCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7Cgl9CgoJLyogUmVFbmFibGUgaW50ZXJydXB0cyAmIHJlc3RvcmUgZmxhZ3MgKi8KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CiAgICAKCXJldHVybiAwOwp9CgovKgogKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE5ldHdvcmsgSUQKICovCnN0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfbndpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAoJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCgkJCSAgICBjaGFyICpleHRyYSkKewoJd3JxdS0+bndpZC52YWx1ZSA9IGRvbWFpbjsKCXdycXUtPm53aWQuZGlzYWJsZWQgPSAwOwoJd3JxdS0+bndpZC5maXhlZCA9IDE7CglyZXR1cm4gMDsKfQoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBzY3JhbWJsZSBrZXkKICovCnN0YXRpYyBpbnQgbmV0d2F2ZV9zZXRfc2NyYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkJY2hhciAqa2V5KQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJa2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Cgl1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CgoJc2NyYW1ibGVfa2V5ID0gKGtleVswXSA8PCA4KSB8IGtleVsxXTsKCXdhaXRfV09DKGlvYmFzZSk7Cgl3cml0ZWIoTkVUV0FWRV9DTURfU1NLLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7Cgl3cml0ZWIoc2NyYW1ibGVfa2V5ICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwoJd3JpdGViKChzY3JhbWJsZV9rZXk+PjgpICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOwoJd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOwoKCS8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwogICAgCglyZXR1cm4gMDsKfQoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBzY3JhbWJsZSBrZXkKICovCnN0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfc2NyYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkJY2hhciAqa2V5KQp7CglrZXlbMV0gPSBzY3JhbWJsZV9rZXkgJiAweGZmOwoJa2V5WzBdID0gKHNjcmFtYmxlX2tleT4+OCkgJiAweGZmOwoJd3JxdS0+ZW5jb2RpbmcuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRDsKCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IDI7CglyZXR1cm4gMDsKfQoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBtb2RlCiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgY2hhciAqZXh0cmEpCnsKCWlmKGRvbWFpbiAmIDB4MTAwKQoJCXdycXUtPm1vZGUgPSBJV19NT0RFX0lORlJBOwoJZWxzZQoJCXdycXUtPm1vZGUgPSBJV19NT0RFX0FESE9DOwoKCXJldHVybiAwOwp9CgovKgogKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KICovCnN0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCgkJCSAgICAgY2hhciAqZXh0cmEpCnsKCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOwoJaW50IHJldCA9IDA7CgoJLyogU2V0IHRoZSBsZW5ndGggKHZlcnkgaW1wb3J0YW50IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLwoJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKCgkvKiBTZXQgYWxsIHRoZSBpbmZvIHdlIGRvbid0IGNhcmUgb3IgZG9uJ3Qga25vdyBhYm91dCB0byB6ZXJvICovCgltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKCgkvKiBTZXQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiB2ZXJzaW9ucyAqLwoJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CglyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSA5OwkvKiBOb3RoaW5nIGZvciB1cyBpbiB2MTAgYW5kIHYxMSAqLwoJCSAgIAoJLyogU2V0IGluZm9ybWF0aW9uIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KCXJhbmdlLT50aHJvdWdocHV0ID0gNDUwICogMTAwMDsJLyogZG9uJ3QgYXJndWUgb24gdGhpcyAhICovCglyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CglyYW5nZS0+bWF4X253aWQgPSAweDAxRkY7CgoJcmFuZ2UtPm51bV9jaGFubmVscyA9IHJhbmdlLT5udW1fZnJlcXVlbmN5ID0gMDsKCQkgICAKCXJhbmdlLT5zZW5zaXRpdml0eSA9IDB4M0Y7CglyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDI1NTsKCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDI1NTsKCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7CgkJICAgCglyYW5nZS0+bnVtX2JpdHJhdGVzID0gMTsKCXJhbmdlLT5iaXRyYXRlWzBdID0gMTAwMDAwMDsJLyogMSBNYi9zICovCgoJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSAyOwkJLyogMTYgYml0cyBzY3JhbWJsaW5nICovCglyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMTsKCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gMTsJLyogT25seSBvbmUga2V5IHBvc3NpYmxlICovCgoJcmV0dXJuIHJldDsKfQoKLyoKICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IHNuYXBzaG90CiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X3NuYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgY2hhciAqZXh0cmEpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwoJbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKCXVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKCgkvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKCgkvKiBUYWtlIHNuYXBzaG90IG9mIGVudmlyb25tZW50ICovCgluZXR3YXZlX3NuYXBzaG90KCBwcml2LCByYW1CYXNlLCBpb2Jhc2UpOwoJd3JxdS0+ZGF0YS5sZW5ndGggPSBwcml2LT5uc3MubGVuZ3RoOwoJbWVtY3B5KGV4dHJhLCAodV9jaGFyICopICZwcml2LT5uc3MsIHNpemVvZiggc3RydWN0IHNpdGVfc3VydmV5KSk7CgoJcHJpdi0+bGFzdEV4ZWMgPSBqaWZmaWVzOwoKCS8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwogICAgCglyZXR1cm4oMCk7Cn0KCi8qCiAqIFN0cnVjdHVyZXMgdG8gZXhwb3J0IHRoZSBXaXJlbGVzcyBIYW5kbGVycwogKiAgICAgVGhpcyBpcyB0aGUgc3R1ZmYgdGhhdCBhcmUgdHJlYXRlZCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaXdjb25maWcpCiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgbmV0d2F2ZV9wcml2YXRlX2FyZ3NbXSA9IHsKLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLwogIHsgU0lPQ0dJUFNOQVAsIDAsIAogICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCBzaXplb2Yoc3RydWN0IHNpdGVfc3VydmV5KSwgCiAgICAiZ2V0c2l0ZXN1cnZleSIgfSwKfTsKCnN0YXRpYyBjb25zdCBpd19oYW5kbGVyCQluZXR3YXZlX2hhbmRsZXJbXSA9CnsKCU5VTEwsCQkJCS8qIFNJT0NTSVdOQU1FICovCgluZXR3YXZlX2dldF9uYW1lLAkJLyogU0lPQ0dJV05BTUUgKi8KCW5ldHdhdmVfc2V0X253aWQsCQkvKiBTSU9DU0lXTldJRCAqLwoJbmV0d2F2ZV9nZXRfbndpZCwJCS8qIFNJT0NHSVdOV0lEICovCglOVUxMLAkJCQkvKiBTSU9DU0lXRlJFUSAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV0ZSRVEgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdNT0RFICovCgluZXR3YXZlX2dldF9tb2RlLAkJLyogU0lPQ0dJV01PREUgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdTRU5TICovCglOVUxMLAkJCQkvKiBTSU9DR0lXU0VOUyAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV1JBTkdFICovCgluZXR3YXZlX2dldF9yYW5nZSwJCS8qIFNJT0NHSVdSQU5HRSAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV1BSSVYgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdQUklWICovCglOVUxMLAkJCQkvKiBTSU9DU0lXU1RBVFMgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdTVEFUUyAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV1NQWSAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV1NQWSAqLwoJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwoJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV0FQICovCglOVUxMLAkJCQkvKiBTSU9DR0lXQVAgKi8KCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdBUExJU1QgKi8KCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdFU1NJRCAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV0VTU0lEICovCglOVUxMLAkJCQkvKiBTSU9DU0lXTklDS04gKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdOSUNLTiAqLwoJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwoJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV1JBVEUgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdSQVRFICovCglOVUxMLAkJCQkvKiBTSU9DU0lXUlRTICovCglOVUxMLAkJCQkvKiBTSU9DR0lXUlRTICovCglOVUxMLAkJCQkvKiBTSU9DU0lXRlJBRyAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV0ZSQUcgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdUWFBPVyAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV1RYUE9XICovCglOVUxMLAkJCQkvKiBTSU9DU0lXUkVUUlkgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdSRVRSWSAqLwoJbmV0d2F2ZV9zZXRfc2NyYW1ibGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCgluZXR3YXZlX2dldF9zY3JhbWJsZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KfTsKCnN0YXRpYyBjb25zdCBpd19oYW5kbGVyCQluZXR3YXZlX3ByaXZhdGVfaGFuZGxlcltdID0KewoJTlVMTCwJCQkJLyogU0lPQ0lXRklSU1RQUklWICovCgluZXR3YXZlX2dldF9zbmFwLAkJLyogU0lPQ0lXRklSU1RQUklWICsgMSAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZgluZXR3YXZlX2hhbmRsZXJfZGVmID0KewoJLm51bV9zdGFuZGFyZAk9IHNpemVvZihuZXR3YXZlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKCS5udW1fcHJpdmF0ZQk9IHNpemVvZihuZXR3YXZlX3ByaXZhdGVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAoJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YobmV0d2F2ZV9wcml2YXRlX2FyZ3MpL3NpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIG5ldHdhdmVfaGFuZGxlciwKCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgbmV0d2F2ZV9wcml2YXRlX2hhbmRsZXIsCgkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgbmV0d2F2ZV9wcml2YXRlX2FyZ3MsCgkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMsCn07CgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX3BjbWNpYV9jb25maWcgKGxpbmspCiAqCiAqICAgICBuZXR3YXZlX3BjbWNpYV9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gCiAqICAgICBldmVudCBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKICogICAgIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4gCiAqCiAqLwoKI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCmRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCgpzdGF0aWMgaW50IG5ldHdhdmVfcGNtY2lhX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykgewogICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgdHVwbGVfdCB0dXBsZTsKICAgIGNpc3BhcnNlX3QgcGFyc2U7CiAgICBpbnQgaSwgaiwgbGFzdF9yZXQsIGxhc3RfZm47CiAgICB1X2NoYXIgYnVmWzY0XTsKICAgIHdpbl9yZXFfdCByZXE7CiAgICBtZW1yZXFfdCBtZW07CiAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IE5VTEw7CgogICAgREVCVUcoMCwgIm5ldHdhdmVfcGNtY2lhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CgogICAgLyoKICAgICAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCiAgICAgIHJlZ2lzdGVycy4KICAgICovCiAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKikgYnVmOwogICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CiAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwogICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwogICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7CiAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKCiAgICAvKgogICAgICogIFRyeSBhbGxvY2F0aW5nIElPIHBvcnRzLiAgVGhpcyB0cmllcyBhIGZldyBmaXhlZCBhZGRyZXNzZXMuCiAgICAgKiAgSWYgeW91IHdhbnQsIHlvdSBjYW4gYWxzbyByZWFkIHRoZSBjYXJkJ3MgY29uZmlnIHRhYmxlIHRvCiAgICAgKiAgcGljayBhZGRyZXNzZXMgLS0gc2VlIHRoZSBzZXJpYWwgZHJpdmVyIGZvciBhbiBleGFtcGxlLgogICAgICovCiAgICBmb3IgKGkgPSBqID0gMHgwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgewoJbGluay0+aW8uQmFzZVBvcnQxID0gaiBeIDB4MzAwOwoJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CglpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKICAgIH0KICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RJTywgaSk7Cglnb3RvIGZhaWxlZDsKICAgIH0KCiAgICAvKgogICAgICogIE5vdyBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CiAgICAgKiAgYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgogICAgICovCiAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSkpOwoKICAgIC8qCiAgICAgKiAgVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAKICAgICAqICB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZy4KICAgICAqLwogICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKCiAgICAvKgogICAgICogIEFsbG9jYXRlIGEgMzJLIG1lbW9yeSB3aW5kb3cuICBOb3RlIHRoYXQgdGhlIHN0cnVjdCBwY21jaWFfZGV2aWNlCiAgICAgKiAgc3RydWN0dXJlIHByb3ZpZGVzIHNwYWNlIGZvciBvbmUgd2luZG93IGhhbmRsZSAtLSBpZiB5b3VyCiAgICAgKiAgZGV2aWNlIG5lZWRzIHNldmVyYWwgd2luZG93cywgeW91J2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZgogICAgICogIHRoZSBoYW5kbGVzIGluIHlvdXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwgZGV2LT5wcml2LgogICAgICovCiAgICBERUJVRygxLCAiU2V0dGluZyBtZW0gc3BlZWQgb2YgJWRcbiIsIG1lbV9zcGVlZCk7CgogICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9DTXxXSU5fRU5BQkxFOwogICAgcmVxLkJhc2UgPSAwOyByZXEuU2l6ZSA9IDB4ODAwMDsKICAgIHJlcS5BY2Nlc3NTcGVlZCA9IG1lbV9zcGVlZDsKICAgIENTX0NIRUNLKFJlcXVlc3RXaW5kb3csIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluaywgJnJlcSwgJmxpbmstPndpbikpOwogICAgbWVtLkNhcmRPZmZzZXQgPSAweDIwMDAwOyBtZW0uUGFnZSA9IDA7IAogICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pKTsKCiAgICAvKiBTdG9yZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbW1vbiB3aW5kb3cgZnJhbWUgKi8KICAgIHJhbUJhc2UgPSBpb3JlbWFwKHJlcS5CYXNlLCAweDgwMDApOwogICAgcHJpdi0+cmFtQmFzZSA9IHJhbUJhc2U7CgogICAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CiAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYobGluaykpOwoKICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CglwcmludGsoS0VSTl9ERUJVRyAibmV0d2F2ZV9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKCWdvdG8gZmFpbGVkOwogICAgfQoKICAgIHN0cmNweShwcml2LT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOwogICAgbGluay0+ZGV2X25vZGUgPSAmcHJpdi0+bm9kZTsKCiAgICAvKiBSZXNldCBjYXJkIGJlZm9yZSByZWFkaW5nIHBoeXNpY2FsIGFkZHJlc3MgKi8KICAgIG5ldHdhdmVfZG9yZXNldChkZXYtPmJhc2VfYWRkciwgcmFtQmFzZSk7CgogICAgLyogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBhbmQgZmlsbCBpbiB0aGUgTmV0d2F2ZSByZWdpc3RlcnMuICovCiAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1BBICsgaSk7CgogICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5ldHdhdmU6IHBvcnQgJSMzbHgsIGlycSAlZCwgbWVtICVseCBpZCAiCgkgICAiJWMlYywgaHdfYWRkciAiLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKCSAgICh1X2xvbmcpIHJhbUJhc2UsIChpbnQpIHJlYWRiKHJhbUJhc2UrTkVUV0FWRV9FUkVHX05JKSwKCSAgIChpbnQpIHJlYWRiKHJhbUJhc2UrTkVUV0FWRV9FUkVHX05JKzEpKTsKICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCglwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKCiAgICAvKiBnZXQgcmV2aXNpb24gd29yZHMgKi8KICAgIHByaW50ayhLRVJOX0RFQlVHICJOZXR3YXZlX3Jlc2V0OiByZXZpc2lvbiAlMDR4ICUwNHhcbiIsIAoJICAgZ2V0X3VpbnQxNihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FSVyksCgkgICBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQVJXKzIpKTsKICAgIHJldHVybiAwOwoKY3NfZmFpbGVkOgogICAgY3NfZXJyb3IobGluaywgbGFzdF9mbiwgbGFzdF9yZXQpOwpmYWlsZWQ6CiAgICBuZXR3YXZlX3JlbGVhc2UobGluayk7CiAgICByZXR1cm4gLUVOT0RFVjsKfSAvKiBuZXR3YXZlX3BjbWNpYV9jb25maWcgKi8KCi8qCiAqIEZ1bmN0aW9uIG5ldHdhdmVfcmVsZWFzZSAoYXJnKQogKgogKiAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgbmV0d2F2ZV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKICogICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCiAqICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgogKi8Kc3RhdGljIHZvaWQgbmV0d2F2ZV9yZWxlYXNlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CgoJREVCVUcoMCwgIm5ldHdhdmVfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CgoJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOwoJaWYgKGxpbmstPndpbikKCQlpb3VubWFwKHByaXYtPnJhbUJhc2UpOwp9CgpzdGF0aWMgaW50IG5ldHdhdmVfc3VzcGVuZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CgoJaWYgKGxpbmstPm9wZW4pCgkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IG5ldHdhdmVfcmVzdW1lKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKCglpZiAobGluay0+b3BlbikgewoJCW5ldHdhdmVfcmVzZXQoZGV2KTsKCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7Cgl9CgoJcmV0dXJuIDA7Cn0KCgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX2RvcmVzZXQgKGlvQmFzZSwgcmFtQmFzZSkKICoKICogICAgUHJvcGVyIGhhcmR3YXJlIHJlc2V0IG9mIHRoZSBjYXJkLgogKi8Kc3RhdGljIHZvaWQgbmV0d2F2ZV9kb3Jlc2V0KGtpb19hZGRyX3QgaW9CYXNlLCB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSkKewogICAgLyogUmVzZXQgY2FyZCAqLwogICAgd2FpdF9XT0MoaW9CYXNlKTsKICAgIG91dGIoMHg4MCwgaW9CYXNlICsgTkVUV0FWRV9SRUdfUE1SKTsKICAgIHdyaXRlYigweDA4LCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FTQ0MpOyAvKiBCaXQgMyBpcyBXT0MgKi8KICAgIG91dGIoMHgwLCBpb0Jhc2UgKyBORVRXQVZFX1JFR19QTVIpOyAvKiByZWxlYXNlIHJlc2V0ICovCn0KCi8qCiAqIEZ1bmN0aW9uIG5ldHdhdmVfcmVzZXQgKGRldikKICoKICogICAgUmVzZXQgYW5kIHJlc3RvcmUgYWxsIG9mIHRoZSBuZXR3YXZlIHJlZ2lzdGVycyAKICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewogICAgLyogdV9jaGFyIHN0YXRlOyAqLwogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKICAgIGtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CgogICAgREVCVUcoMCwgIm5ldHdhdmVfcmVzZXQ6IERvbmUgd2l0aCBoYXJkd2FyZSByZXNldFxuIik7CgogICAgcHJpdi0+dGltZW91dENvdW50ZXIgPSAwOwoKICAgIC8qIFJlc2V0IGNhcmQgKi8KICAgIG5ldHdhdmVfZG9yZXNldChpb2Jhc2UsIHJhbUJhc2UpOwogICAgcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdhdmVfcmVzZXQ6IERvbmUgd2l0aCBoYXJkd2FyZSByZXNldFxuIik7CgkKICAgIC8qIFdyaXRlIGEgTk9QIHRvIGNoZWNrIHRoZSBjYXJkICovCiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX05PUCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwoJCiAgICAvKiBTZXQgcmVjZWl2ZSBjb25mICovCiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX1NSQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKHJ4Q29uZlJ4RW5hICsgcnhDb25mQmNhc3QsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKICAgIAogICAgLyogU2V0IHRyYW5zbWl0IGNvbmYgKi8KICAgIHdhaXRfV09DKGlvYmFzZSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1RDLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CiAgICB3cml0ZWIodHhDb25mVHhFbmEsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKICAgIAogICAgLyogTm93IHNldCB0aGUgTVUgRG9tYWluICovCiAgICBwcmludGsoS0VSTl9ERUJVRyAiU2V0dGluZyBkb21haW4gdG8gMHgleCUwMnhcbiIsIChkb21haW4gPj4gOCkgJiAweDAxLCBkb21haW4gJiAweGZmKTsKICAgIHdhaXRfV09DKGlvYmFzZSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfU01ELCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CiAgICB3cml0ZWIoZG9tYWluICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwogICAgd3JpdGViKChkb21haW4+PjgpICYgMHgwMSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOwoJCiAgICAvKiBTZXQgc2NyYW1ibGUga2V5ICovCiAgICBwcmludGsoS0VSTl9ERUJVRyAiU2V0dGluZyBzY3JhbWJsZSBrZXkgdG8gMHgleFxuIiwgc2NyYW1ibGVfa2V5KTsKICAgIHdhaXRfV09DKGlvYmFzZSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1NLLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CiAgICB3cml0ZWIoc2NyYW1ibGVfa2V5ICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwogICAgd3JpdGViKChzY3JhbWJsZV9rZXk+PjgpICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOwoKICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzLCBiaXQgNCBoaWdoIHRvIGtlZXAgdW51c2VkCiAgICAgKiBzb3VyY2UgZnJvbSBpbnRlcnJ1cHRpbmcgdXMsIGJpdCAyIGhpZ2ggdG8gCiAgICAgKiBzZXQgaW50ZXJydXB0IGVuYWJsZSwgNTY3IHRvIGVuYWJsZSBUeEROLCAKICAgICAqIFJ4RXJyIGFuZCBSeFJkeQogICAgICovCiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgb3V0YihpbXJDb25mSUVOQStpbXJDb25mUkZVMSwgaW9iYXNlICsgTkVUV0FWRV9SRUdfSU1SKTsKCiAgICAvKiBIZW50IDQgYnl0ZXMgZnJhIDB4MTcwLiBTa2FsIHZhZXJlIDBhLDI5LDg4LDM2CiAgICAgKiB3YWl0V09DCiAgICAgKiBza3JpdiA4MCB0aWwgZDAwMDozNjg4CiAgICAgKiBzamVrayBvbSBkZXQgYmxlIDgwCiAgICAgKi8KICAgIAogICAgLyogRW5hYmxlIFJlY2VpdmVyICovCiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX0VSLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CgkKICAgIC8qIFNldCB0aGUgSUVOQSBiaXQgaW4gQ09SICovCiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgb3V0Yihjb3JDb25mSUVOQSArIGNvckNvbmZMVkxSRVEsIGlvYmFzZSArIE5FVFdBVkVfUkVHX0NPUik7Cn0KCi8qCiAqIEZ1bmN0aW9uIG5ldHdhdmVfaHdfeG1pdCAoZGF0YSwgbGVuLCBkZXYpICAgIAogKi8Kc3RhdGljIGludCBuZXR3YXZlX2h3X3htaXQodW5zaWduZWQgY2hhciogZGF0YSwgaW50IGxlbiwKCQkJICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldikgewogICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgIHVuc2lnbmVkIGludCBUeEZyZWVMaXN0LAoJICAgICAgICAgY3VyQnVmZiwKCSAgICAgICAgIE1heERhdGEsIAogICAgICAgICAgICAgICAgIERhdGFPZmZzZXQ7CiAgICBpbnQgdG1wY291bnQ7IAoJCiAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgdV9jaGFyIF9faW9tZW0gKiByYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKICAgIGtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CgogICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLwogICAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CgogICAgLyogQ2hlY2sgaWYgdGhlcmUgYXJlIHRyYW5zbWl0IGJ1ZmZlcnMgYXZhaWxhYmxlICovCiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgaWYgKChpbmIoaW9iYXNlK05FVFdBVkVfUkVHX0FTUikgJiBORVRXQVZFX0FTUl9UWEJBKSA9PSAwKSB7CgkvKiBObyBidWZmZXJzIGF2YWlsYWJsZSAqLwoJcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdhdmVfaHdfeG1pdDogJXMgLSBubyB4bWl0IGJ1ZmZlcnMgYXZhaWxhYmxlLlxuIiwKCSAgICAgICBkZXYtPm5hbWUpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKCXJldHVybiAxOwogICAgfQoKICAgIHByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKCiAgICBERUJVRygzLCAiVHJhbnNtaXR0aW5nIHdpdGggU1BDUSAleCBTUFUgJXggTElGICV4IElTUExRICV4XG4iLAoJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQQ1EpLAoJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQVSksCgkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfTElGKSwKCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19JU1BMUSkpOwoKICAgIC8qIE5vdyB0cnkgdG8gaW5zZXJ0IGl0IGludG8gdGhlIGFkYXB0ZXJzIGZyZWUgbWVtb3J5ICovCiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgVHhGcmVlTGlzdCA9IGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19URFApOwogICAgTWF4RGF0YSAgICA9IGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19URFArMik7CiAgICBEYXRhT2Zmc2V0ID0gZ2V0X3VpbnQxNihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1REUCs0KTsKCQogICAgREVCVUcoMywgIlR4RnJlZUxpc3QgJXgsIE1heERhdGEgJXgsIERhdGFPZmZzZXQgJXhcbiIsCgkgIFR4RnJlZUxpc3QsIE1heERhdGEsIERhdGFPZmZzZXQpOwoKICAgIC8qIENvcHkgcGFja2V0IHRvIHRoZSBhZGFwdGVyIGZyYWdtZW50IGJ1ZmZlcnMgKi8KICAgIGN1ckJ1ZmYgPSBUeEZyZWVMaXN0OyAKICAgIHRtcGNvdW50ID0gMDsgCiAgICB3aGlsZSAodG1wY291bnQgPCBsZW4pIHsKCWludCB0bXBsZW4gPSBsZW4gLSB0bXBjb3VudDsgCgljb3B5X3RvX3BjKHJhbUJhc2UgKyBjdXJCdWZmICsgRGF0YU9mZnNldCwgZGF0YSArIHRtcGNvdW50LCAKCQkgICAodG1wbGVuIDwgTWF4RGF0YSkgPyB0bXBsZW4gOiBNYXhEYXRhKTsKCXRtcGNvdW50ICs9IE1heERhdGE7CgkJCQoJLyogQWR2YW5jZSB0byBuZXh0IGJ1ZmZlciAqLwoJY3VyQnVmZiA9IGdldF91aW50MTYocmFtQmFzZSArIGN1ckJ1ZmYpOwogICAgfQogICAgCiAgICAvKiBOb3cgaXNzdWUgdHJhbnNtaXQgbGlzdCAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9UTCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKGxlbiAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKICAgIHdyaXRlYigobGVuPj44KSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKCiAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbmV0d2F2ZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKCS8qIFRoaXMgZmxhZyBpbmRpY2F0ZSB0aGF0IHRoZSBoYXJkd2FyZSBjYW4ndCBwZXJmb3JtIGEgdHJhbnNtaXNzaW9uLgoJICogVGhlb3JpdGljYWxseSwgTkVUMyBjaGVjayBpdCBiZWZvcmUgc2VuZGluZyBhIHBhY2tldCB0byB0aGUgZHJpdmVyLAoJICogYnV0IGluIGZhY3QgaXQgbmV2ZXIgZG8gdGhhdCBhbmQgcG9vbCBjb250aW51b3VzbHkuCgkgKiBBcyB0aGUgd2F0Y2hkb2cgd2lsbCBhYm9ydCB0b28gbG9uZyB0cmFuc21pc3Npb25zLCB3ZSBhcmUgcXVpdGUgc2FmZS4uLgoJICovCgogICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwoKICAgIHsKCXNob3J0IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOwoJdW5zaWduZWQgY2hhciogYnVmID0gc2tiLT5kYXRhOwoJCglpZiAobmV0d2F2ZV9od194bWl0KCBidWYsIGxlbmd0aCwgZGV2KSA9PSAxKSB7CgkgICAgLyogU29tZSBlcnJvciwgbGV0J3MgbWFrZSB0aGVtIGNhbGwgdXMgYW5vdGhlciB0aW1lPyAqLwoJICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Cgl9CglkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKICAgIH0KICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKICAgIAogICAgcmV0dXJuIDA7Cn0gLyogbmV0d2F2ZV9zdGFydF94bWl0ICovCgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX2ludGVycnVwdCAoaXJxLCBkZXZfaWQpCiAqCiAqICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgTmV0d2F2ZSBjYXJkLiBUaGlzCiAqICAgIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXI6IAogKgkgIDEuIEEgcGFja2V0IGlzIHJlY2VpdmVkLgogKgkgIDIuIEEgcGFja2V0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB0cmFuc2ZlcnJlZCBhbmQgdGhlIHVuaXQgaXMKICoJICAgICByZWFkeSB0byB0cmFuc21pdCBhbm90aGVyIHBhY2tldC4KICoJICAzLiBBIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCiAqLwpzdGF0aWMgaXJxcmV0dXJuX3QgbmV0d2F2ZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCogZGV2X2lkKQp7CiAgICBraW9fYWRkcl90IGlvYmFzZTsKICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlOwogICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKICAgIHN0cnVjdCBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBwcml2LT5wX2RldjsKICAgIGludCBpOwogICAgCiAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCglyZXR1cm4gSVJRX05PTkU7CiAgICAKICAgIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwogICAgcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CgkKICAgIC8qIE5vdyBmaW5kIHdoYXQgY2F1c2VkIHRoZSBpbnRlcnJ1cHQsIGNoZWNrIHdoaWxlIGludGVycnVwdHMgcmVhZHkgKi8KICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Cgl1X2NoYXIgc3RhdHVzOwoJCQoJd2FpdF9XT0MoaW9iYXNlKTsJCglpZiAoIShpbmIoaW9iYXNlK05FVFdBVkVfUkVHX0NDU1IpICYgMHgwMikpCgkgICAgYnJlYWs7IC8qIE5vbmUgb2YgdGhlIGludGVycnVwdCBzb3VyY2VzIGFzc2VydGVkIChub3JtYWwgZXhpdCkgKi8KCQogICAgICAgIHN0YXR1cyA9IGluYihpb2Jhc2UgKyBORVRXQVZFX1JFR19BU1IpOwoJCQoJaWYgKCFwY21jaWFfZGV2X3ByZXNlbnQobGluaykpIHsKCSAgICBERUJVRygxLCAibmV0d2F2ZV9pbnRlcnJ1cHQ6IEludGVycnVwdCB3aXRoIHN0YXR1cyAweCV4ICIKCQkgICJmcm9tIHJlbW92ZWQgb3Igc3VzcGVuZGVkIGNhcmQhXG4iLCBzdGF0dXMpOwoJICAgIGJyZWFrOwoJfQoJCQoJLyogUnhSZHkgKi8KCWlmIChzdGF0dXMgJiAweDgwKSB7CgkgICAgbmV0d2F2ZV9yeChkZXYpOwoJICAgIC8qIHdhaXRfV09DKGlvYmFzZSk7ICovCgkgICAgLyogUnhSZHkgY2Fubm90IGJlIHJlc2V0IGRpcmVjdGx5IGJ5IHRoZSBob3N0ICovCgl9CgkvKiBSeEVyciAqLwoJaWYgKHN0YXR1cyAmIDB4NDApIHsKCSAgICB1X2NoYXIgcnNlcjsKCQkJCgkgICAgcnNlciA9IHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUlNFUik7CQkJCgkgICAgCgkgICAgaWYgKHJzZXIgJiAweDA0KSB7CgkJKytwcml2LT5zdGF0cy5yeF9kcm9wcGVkOyAKCQkrK3ByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnM7CgkgICAgfQoJICAgIGlmIChyc2VyICYgMHgwMikKCQkrK3ByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKCQkJCgkgICAgLyogQ2xlYXIgdGhlIFJ4RXJyIGJpdCBpbiBSU0VSLiBSU0VSKzQgaXMgdGhlCgkgICAgICogd3JpdGUgcGFydC4gQWxzbyBjbGVhciB0aGUgUnhDUkMgKDB4MDQpIGFuZCAKCSAgICAgKiBSeEJpZyAoMHgwMikgYml0cyBpZiBwcmVzZW50ICovCgkgICAgd2FpdF9XT0MoaW9iYXNlKTsKCSAgICB3cml0ZWIoMHg0MCB8IChyc2VyICYgMHgwNiksIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUlNFUiArIDQpOwoKCSAgICAvKiBXcml0ZSBiaXQgNiBoaWdoIHRvIEFTQ0MgdG8gY2xlYXIgUnhFcnIgaW4gQVNSLAoJICAgICAqIFdPQyBtdXN0IGJlIHNldCBmaXJzdCEgCgkgICAgICovCgkgICAgd2FpdF9XT0MoaW9iYXNlKTsKCSAgICB3cml0ZWIoMHg0MCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19BU0NDKTsKCgkgICAgLyogUmVtZW1iZXIgdG8gY291bnQgdXAgcHJpdi0+c3RhdHMgb24gZXJyb3IgcGFja2V0cyAqLwoJICAgICsrcHJpdi0+c3RhdHMucnhfZXJyb3JzOwoJfQoJLyogVHhETiAqLwoJaWYgKHN0YXR1cyAmIDB4MjApIHsKCSAgICBpbnQgdHhTdGF0dXM7CgoJICAgIHR4U3RhdHVzID0gcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19UU0VSKTsKCSAgICBERUJVRygzLCAiVHJhbnNtaXQgZG9uZS4gVFNFUiA9ICV4IGlkICV4XG4iLCAKCQkgIHR4U3RhdHVzLCByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIgKyAxKSk7CgkgICAgCgkgICAgaWYgKHR4U3RhdHVzICYgMHgyMCkgewoJCS8qIFRyYW5zbWl0dGluZyB3YXMgb2theSwgY2xlYXIgYml0cyAqLwoJCXdhaXRfV09DKGlvYmFzZSk7CgkJd3JpdGViKDB4MmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVFNFUiArIDQpOwoJCSsrcHJpdi0+c3RhdHMudHhfcGFja2V0czsKCSAgICB9CgkJCQoJICAgIGlmICh0eFN0YXR1cyAmIDB4ZDApIHsKCQlpZiAodHhTdGF0dXMgJiAweDgwKSB7CgkJICAgICsrcHJpdi0+c3RhdHMuY29sbGlzaW9uczsgLyogQmVjYXVzZSBvZiAvcHJvYy9uZXQvZGV2Ki8KCQkgICAgLyogKytwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9yczsgKi8KCQkgICAgLyogcHJpbnRrKCJDb2xsaXNpb24uICVsZFxuIiwgamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQpOyAqLwoJCX0KCQlpZiAodHhTdGF0dXMgJiAweDQwKSAKCQkgICAgKytwcml2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9yczsKCQkvKiAweDgwIFR4R1UgVHJhbnNtaXQgZ2l2ZXVwIC0gbmluZSB0aW1lcyBhbmQgbm8gbHVjawoJCSAqIDB4NDAgVHhOT0FQIE5vIGFjY2VzcyBwb2ludC4gRGlzY2FyZGVkIHBhY2tldC4KCQkgKiAweDEwIFR4RXJyIFRyYW5zbWl0IGVycm9yLiBBbHdheXMgc2V0IHdoZW4gCgkJICogICAgICBUeEdVIGFuZCBUeE5PQVAgaXMgc2V0LiAoVGhvc2UgYXJlIHRoZSBvbmx5IG9uZXMKCQkgKiAgICAgIHRvIHNldCBUeEVycikuCgkJICovCgkJREVCVUcoMywgIm5ldHdhdmVfaW50ZXJydXB0OiBUeEROIHdpdGggZXJyb3Igc3RhdHVzICV4XG4iLCAKCQkgICAgICB0eFN0YXR1cyk7CgkJCgkJLyogQ2xlYXIgb3V0IFR4R1UsIFR4Tk9BUCwgVHhFcnIgYW5kIFR4VHJ5cyAqLwoJCXdhaXRfV09DKGlvYmFzZSk7CgkJd3JpdGViKDB4ZGYgJiB0eFN0YXR1cywgcmFtQmFzZStORVRXQVZFX0VSRUdfVFNFUis0KTsKCQkrK3ByaXYtPnN0YXRzLnR4X2Vycm9yczsKCSAgICB9CgkgICAgREVCVUcoMywgIk5ldyBzdGF0dXMgaXMgVFNFUiAleCBBU1IgJXhcbiIsCgkJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIpLAoJCSAgaW5iKGlvYmFzZSArIE5FVFdBVkVfUkVHX0FTUikpOwoKCSAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cgl9CgkvKiBUeEJBLCB0aGlzIHdvdWxkIHRyaWdnZXIgb24gYWxsIGVycm9yIHBhY2tldHMgcmVjZWl2ZWQgKi8KCS8qIGlmIChzdGF0dXMgJiAweDAxKSB7CgkgICBERUJVRyg0LCAiVHJhbnNtaXQgYnVmZmVycyBhdmFpbGFibGUsICV4XG4iLCBzdGF0dXMpOwoJICAgfQoJICAgKi8KICAgIH0KICAgIC8qIEhhbmRsZWQgaWYgd2UgbG9vcGVkIGF0IGxlYXN0IG9uZSB0aW1lIC0gSmVhbiBJSSAqLwogICAgcmV0dXJuIElSUV9SRVRWQUwoaSk7Cn0gLyogbmV0d2F2ZV9pbnRlcnJ1cHQgKi8KCi8qCiAqIEZ1bmN0aW9uIG5ldHdhdmVfd2F0Y2hkb2cgKGEpCiAqCiAqICAgIFdhdGNoZG9nIDogd2hlbiB3ZSBzdGFydCBhIHRyYW5zbWlzc2lvbiwgd2Ugc2V0IGEgdGltZXIgaW4gdGhlCiAqICAgIGtlcm5lbC4gIElmIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGUsIHRoaXMgdGltZXIgaXMgZGlzYWJsZWQuIElmCiAqICAgIGl0IGV4cGlyZSwgd2UgcmVzZXQgdGhlIGNhcmQuCiAqCiAqLwpzdGF0aWMgdm9pZCBuZXR3YXZlX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKCiAgICBERUJVRygxLCAiJXM6IG5ldHdhdmVfd2F0Y2hkb2c6IHdhdGNoZG9nIHRpbWVyIGV4cGlyZWRcbiIsIGRldi0+bmFtZSk7CiAgICBuZXR3YXZlX3Jlc2V0KGRldik7CiAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKfSAvKiBuZXR3YXZlX3dhdGNoZG9nICovCgpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHdhdmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CgogICAgdXBkYXRlX3N0YXRzKGRldik7CgogICAgREVCVUcoMiwgIm5ldHdhdmU6IFNQQ1EgJXggU1BVICV4IExJRiAleCBJU1BMUSAleCBNSFMgJXggcnh0eCAleCIKCSAgIiAleCB0eCAleCAleCAleCAleFxuIiwgCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BDUSksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BVKSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19MSUYpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0lTUExRKSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19NSFMpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHhlKSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4ZiksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDE4KSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4MTkpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHgxYSksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDFiKSk7CgogICAgcmV0dXJuICZwcml2LT5zdGF0czsKfQoKc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKICAgIC8vdW5zaWduZWQgbG9uZyBmbGFnczsKLyogICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7ICovCgogICAgLy9zcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKCi8qICAgIHByaXYtPnN0YXRzLnJ4X3BhY2tldHMgPSByZWFkYihwcml2LT5yYW1CYXNlICsgMHgxOGUpOyAKICAgIHByaXYtPnN0YXRzLnR4X3BhY2tldHMgPSByZWFkYihwcml2LT5yYW1CYXNlICsgMHgxOGYpOyAqLwoKICAgIC8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKfQoKc3RhdGljIGludCBuZXR3YXZlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CiAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwogICAgdV9jaGFyIHJ4U3RhdHVzOwogICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAgICB1bnNpZ25lZCBpbnQgY3VyQnVmZmVyLAoJCXJjdkxpc3Q7CiAgICBpbnQgcmN2TGVuOwogICAgaW50IHRtcGNvdW50ID0gMDsKICAgIGludCBkYXRhQ291bnQsIGRhdGFPZmZzZXQ7CiAgICBpbnQgaTsKICAgIHVfY2hhciAqcHRyOwoJCiAgICBERUJVRygzLCAieGlud19yeDogUmVjZWl2aW5nIC4uLiBcbiIpOwoKICAgIC8qIFJlY2VpdmUgbWF4IDEwIHBhY2tldHMgZm9yIG5vdy4gKi8KICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CgkvKiBBbnkgcGFja2V0cz8gKi8KCXdhaXRfV09DKGlvYmFzZSk7CglyeFN0YXR1cyA9IHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUlNFUik7CQkKCWlmICggISggcnhTdGF0dXMgJiAweDgwKSkgLyogTm8gbW9yZSBwYWNrZXRzICovCgkgICAgYnJlYWs7CgkJCgkvKiBDaGVjayBpZiBtdWx0aWNhc3QvYnJvYWRjYXN0IG9yIG90aGVyICovCgkvKiBtdWx0aWNhc3QgPSAocnhTdGF0dXMgJiAweDIwKTsgICovCgkJCgkvKiBUaGUgcmVjZWl2ZSBsaXN0IHBvaW50ZXIgYW5kIGxlbmd0aCBvZiB0aGUgcGFja2V0ICovCgl3YWl0X1dPQyhpb2Jhc2UpOwoJcmN2TGVuICA9IGdldF9pbnQxNiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19SRFApOwoJcmN2TGlzdCA9IGdldF91aW50MTYoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUkRQICsgMik7CgkJCglpZiAocmN2TGVuIDwgMCkgewoJICAgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX3J4OiBSZWNlaXZlIHBhY2tldCB3aXRoIGxlbiAlZFxuIiwgCgkJICAgcmN2TGVuKTsKCSAgICByZXR1cm4gMDsKCX0KCQkKCXNrYiA9IGRldl9hbGxvY19za2IocmN2TGVuKzUpOwoJaWYgKHNrYiA9PSBOVUxMKSB7CgkgICAgREVCVUcoMSwgIm5ldHdhdmVfcng6IENvdWxkIG5vdCBhbGxvY2F0ZSBhbiBza19idWZmIG9mICIKCQkgICJsZW5ndGggJWRcbiIsIHJjdkxlbik7CgkgICAgKytwcml2LT5zdGF0cy5yeF9kcm9wcGVkOyAKCSAgICAvKiBUZWxsIHRoZSBhZGFwdGVyIHRvIHNraXAgdGhlIHBhY2tldCAqLwoJICAgIHdhaXRfV09DKGlvYmFzZSk7CgkgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NSUCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwoJICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKCSAgICByZXR1cm4gMDsKCX0KCglza2JfcmVzZXJ2ZSggc2tiLCAyKTsgIC8qIEFsaWduIElQIG9uIDE2IGJ5dGUgKi8KCXNrYl9wdXQoIHNrYiwgcmN2TGVuKTsKCXNrYi0+ZGV2ID0gZGV2OwoKCS8qIENvcHkgcGFja2V0IGZyYWdtZW50cyB0byB0aGUgc2tiIGRhdGEgYXJlYSAqLwoJcHRyID0gKHVfY2hhciopIHNrYi0+ZGF0YTsKCWN1ckJ1ZmZlciA9IHJjdkxpc3Q7Cgl0bXBjb3VudCA9IDA7IAoJd2hpbGUgKCB0bXBjb3VudCA8IHJjdkxlbikgewoJICAgIC8qIEdldCBsZW5ndGggYW5kIG9mZnNldCBvZiBjdXJyZW50IGJ1ZmZlciAqLwoJICAgIGRhdGFDb3VudCAgPSBnZXRfdWludDE2KCByYW1CYXNlK2N1ckJ1ZmZlcisyKTsKCSAgICBkYXRhT2Zmc2V0ID0gZ2V0X3VpbnQxNiggcmFtQmFzZStjdXJCdWZmZXIrNCk7CgkJCgkgICAgY29weV9mcm9tX3BjKCBwdHIgKyB0bXBjb3VudCwKCQkJICByYW1CYXNlK2N1ckJ1ZmZlcitkYXRhT2Zmc2V0LCBkYXRhQ291bnQpOwoKCSAgICB0bXBjb3VudCArPSBkYXRhQ291bnQ7CgkJCgkgICAgLyogUG9pbnQgdG8gbmV4dCBidWZmZXIgKi8KCSAgICBjdXJCdWZmZXIgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBjdXJCdWZmZXIpOwoJfQoJCglza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CgkvKiBRdWV1ZSBwYWNrZXQgZm9yIG5ldHdvcmsgbGF5ZXIgKi8KCW5ldGlmX3J4KHNrYik7CgoJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJjdkxlbjsKCgkvKiBHb3QgdGhlIHBhY2tldCwgdGVsbCB0aGUgYWRhcHRlciB0byBza2lwIGl0ICovCgl3YWl0X1dPQyhpb2Jhc2UpOwoJd3JpdGViKE5FVFdBVkVfQ01EX1NSUCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwoJd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwoJREVCVUcoMywgIlBhY2tldCByZWNlcHRpb24gb2tcbiIpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbmV0d2F2ZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IHByaXYtPnBfZGV2OwoKICAgIERFQlVHKDEsICJuZXR3YXZlX29wZW46IHN0YXJ0aW5nLlxuIik7CiAgICAKICAgIGlmICghcGNtY2lhX2Rldl9wcmVzZW50KGxpbmspKQoJcmV0dXJuIC1FTk9ERVY7CgogICAgbGluay0+b3BlbisrOwoKICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAgICBuZXR3YXZlX3Jlc2V0KGRldik7CgkKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IG5ldHdhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gcHJpdi0+cF9kZXY7CgogICAgREVCVUcoMSwgIm5ldHdhdmVfY2xvc2U6IGZpbmlzaGluZy5cbiIpOwoKICAgIGxpbmstPm9wZW4tLTsKICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIG5ldHdhdmVfaWRzW10gPSB7CglQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiWGlyY29tIiwgIkNyZWRpdENhcmQgTmV0d2F2ZSIsIDB4MmUzZWU4NDUsIDB4NTRlMjhhMjgpLAoJUENNQ0lBX0RFVklDRV9OVUxMLAp9OwpNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgbmV0d2F2ZV9pZHMpOwoKc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIG5ldHdhdmVfZHJpdmVyID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmRydgkJPSB7CgkJLm5hbWUJPSAibmV0d2F2ZV9jcyIsCgl9LAoJLnByb2JlCQk9IG5ldHdhdmVfcHJvYmUsCgkucmVtb3ZlCQk9IG5ldHdhdmVfZGV0YWNoLAoJLmlkX3RhYmxlICAgICAgID0gbmV0d2F2ZV9pZHMsCgkuc3VzcGVuZAk9IG5ldHdhdmVfc3VzcGVuZCwKCS5yZXN1bWUJCT0gbmV0d2F2ZV9yZXN1bWUsCn07CgpzdGF0aWMgaW50IF9faW5pdCBpbml0X25ldHdhdmVfY3Modm9pZCkKewoJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJm5ldHdhdmVfZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmV0d2F2ZV9jcyh2b2lkKQp7CglwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJm5ldHdhdmVfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQoaW5pdF9uZXR3YXZlX2NzKTsKbW9kdWxlX2V4aXQoZXhpdF9uZXR3YXZlX2NzKTsKCi8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgogICBudW1fYWRkcnMgPT0gLTEJUHJvbWlzY3VvdXMgbW9kZSwgcmVjZWl2ZSBhbGwgcGFja2V0cwogICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbwogICBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCiAqLwpzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB1X2NoYXIgX19pb21lbSAqIHJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOwogICAgdV9jaGFyICByY3ZNb2RlID0gMDsKICAgCiNpZmRlZiBQQ01DSUFfREVCVUcKICAgIGlmIChwY19kZWJ1ZyA+IDIpIHsKCXN0YXRpYyBpbnQgb2xkOwoJaWYgKG9sZCAhPSBkZXYtPm1jX2NvdW50KSB7CgkgICAgb2xkID0gZGV2LT5tY19jb3VudDsKCSAgICBERUJVRygwLCAiJXM6IHNldHRpbmcgUnggbW9kZSB0byAlZCBhZGRyZXNzZXMuXG4iLAoJCSAgZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50KTsKCX0KICAgIH0KI2VuZGlmCgkKICAgIGlmIChkZXYtPm1jX2NvdW50IHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgewoJLyogTXVsdGljYXN0IE1vZGUgKi8KCXJjdk1vZGUgPSByeENvbmZSeEVuYSArIHJ4Q29uZkFNUCArIHJ4Q29uZkJjYXN0OwogICAgfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKCS8qIFByb21pc2NvdXMgbW9kZSAqLwoJcmN2TW9kZSA9IHJ4Q29uZlJ4RW5hICsgcnhDb25mUHJvICsgcnhDb25mQU1QICsgcnhDb25mQmNhc3Q7CiAgICB9IGVsc2UgewoJLyogTm9ybWFsIG1vZGUgKi8KCXJjdk1vZGUgPSByeENvbmZSeEVuYSArIHJ4Q29uZkJjYXN0OwogICAgfQoJCiAgICAvKiBwcmludGsoIm5ldHdhdmUgc2V0X211bHRpY2FzdF9saXN0OiByY3ZNb2RlIHRvICV4XG4iLCByY3ZNb2RlKTsqLwogICAgLyogTm93IHNldCByZWNlaXZlIG1vZGUgKi8KICAgIHdhaXRfV09DKGlvYmFzZSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1JDLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CiAgICB3cml0ZWIocmN2TW9kZSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOwp9Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK