LyoKICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgogKgogKi8KI2luY2x1ZGUgImRybVAuaCIKI2luY2x1ZGUgImRybS5oIgojaW5jbHVkZSAiaTkxNV9kcm0uaCIKI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiNpbmNsdWRlICJpbnRlbF9iaW9zLmgiCgojZGVmaW5lCVNMQVZFX0FERFIxCTB4NzAKI2RlZmluZQlTTEFWRV9BRERSMgkweDcyCgpzdGF0aWMgaW50IHBhbmVsX3R5cGU7CgpzdGF0aWMgdm9pZCAqCmZpbmRfc2VjdGlvbihzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiLCBpbnQgc2VjdGlvbl9pZCkKewoJdTggKmJhc2UgPSAodTggKiliZGI7CglpbnQgaW5kZXggPSAwOwoJdTE2IHRvdGFsLCBjdXJyZW50X3NpemU7Cgl1OCBjdXJyZW50X2lkOwoKCS8qIHNraXAgdG8gZmlyc3Qgc2VjdGlvbiAqLwoJaW5kZXggKz0gYmRiLT5oZWFkZXJfc2l6ZTsKCXRvdGFsID0gYmRiLT5iZGJfc2l6ZTsKCgkvKiB3YWxrIHRoZSBzZWN0aW9ucyBsb29raW5nIGZvciBzZWN0aW9uX2lkICovCgl3aGlsZSAoaW5kZXggPCB0b3RhbCkgewoJCWN1cnJlbnRfaWQgPSAqKGJhc2UgKyBpbmRleCk7CgkJaW5kZXgrKzsKCQljdXJyZW50X3NpemUgPSAqKCh1MTYgKikoYmFzZSArIGluZGV4KSk7CgkJaW5kZXggKz0gMjsKCQlpZiAoY3VycmVudF9pZCA9PSBzZWN0aW9uX2lkKQoJCQlyZXR1cm4gYmFzZSArIGluZGV4OwoJCWluZGV4ICs9IGN1cnJlbnRfc2l6ZTsKCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHUxNgpnZXRfYmxvY2tzaXplKHZvaWQgKnApCnsKCXUxNiAqYmxvY2tfcHRyLCBibG9ja19zaXplOwoKCWJsb2NrX3B0ciA9ICh1MTYgKikoKGNoYXIgKilwIC0gMik7CglibG9ja19zaXplID0gKmJsb2NrX3B0cjsKCXJldHVybiBibG9ja19zaXplOwp9CgpzdGF0aWMgdm9pZApmaWxsX2RldGFpbF90aW1pbmdfZGF0YShzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZSwKCQkJc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqZHZvX3RpbWluZykKewoJcGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgPSAoZHZvX3RpbWluZy0+aGFjdGl2ZV9oaSA8PCA4KSB8CgkJZHZvX3RpbWluZy0+aGFjdGl2ZV9sbzsKCXBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ID0gcGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgKwoJCSgoZHZvX3RpbWluZy0+aHN5bmNfb2ZmX2hpIDw8IDgpIHwgZHZvX3RpbWluZy0+aHN5bmNfb2ZmX2xvKTsKCXBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ICsKCQlkdm9fdGltaW5nLT5oc3luY19wdWxzZV93aWR0aDsKCXBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ICsKCQkoKGR2b190aW1pbmctPmhibGFua19oaSA8PCA4KSB8IGR2b190aW1pbmctPmhibGFua19sbyk7CgoJcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgPSAoZHZvX3RpbWluZy0+dmFjdGl2ZV9oaSA8PCA4KSB8CgkJZHZvX3RpbWluZy0+dmFjdGl2ZV9sbzsKCXBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ID0gcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgKwoJCWR2b190aW1pbmctPnZzeW5jX29mZjsKCXBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX2VuZCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ICsKCQlkdm9fdGltaW5nLT52c3luY19wdWxzZV93aWR0aDsKCXBhbmVsX2ZpeGVkX21vZGUtPnZ0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ICsKCQkoKGR2b190aW1pbmctPnZibGFua19oaSA8PCA4KSB8IGR2b190aW1pbmctPnZibGFua19sbyk7CglwYW5lbF9maXhlZF9tb2RlLT5jbG9jayA9IGR2b190aW1pbmctPmNsb2NrICogMTA7CglwYW5lbF9maXhlZF9tb2RlLT50eXBlID0gRFJNX01PREVfVFlQRV9QUkVGRVJSRUQ7CgoJaWYgKGR2b190aW1pbmctPmhzeW5jX3Bvc2l0aXZlKQoJCXBhbmVsX2ZpeGVkX21vZGUtPmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfUEhTWU5DOwoJZWxzZQoJCXBhbmVsX2ZpeGVkX21vZGUtPmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfTkhTWU5DOwoKCWlmIChkdm9fdGltaW5nLT52c3luY19wb3NpdGl2ZSkKCQlwYW5lbF9maXhlZF9tb2RlLT5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX1BWU1lOQzsKCWVsc2UKCQlwYW5lbF9maXhlZF9tb2RlLT5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX05WU1lOQzsKCgkvKiBTb21lIFZCVHMgaGF2ZSBib2d1cyBoL3Z0b3RhbCB2YWx1ZXMgKi8KCWlmIChwYW5lbF9maXhlZF9tb2RlLT5oc3luY19lbmQgPiBwYW5lbF9maXhlZF9tb2RlLT5odG90YWwpCgkJcGFuZWxfZml4ZWRfbW9kZS0+aHRvdGFsID0gcGFuZWxfZml4ZWRfbW9kZS0+aHN5bmNfZW5kICsgMTsKCWlmIChwYW5lbF9maXhlZF9tb2RlLT52c3luY19lbmQgPiBwYW5lbF9maXhlZF9tb2RlLT52dG90YWwpCgkJcGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsID0gcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kICsgMTsKCglkcm1fbW9kZV9zZXRfbmFtZShwYW5lbF9maXhlZF9tb2RlKTsKfQoKLyogVHJ5IHRvIGZpbmQgaW50ZWdyYXRlZCBwYW5lbCBkYXRhICovCnN0YXRpYyB2b2lkCnBhcnNlX2xmcF9wYW5lbF9kYXRhKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkJICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBiZGJfbHZkc19vcHRpb25zICpsdmRzX29wdGlvbnM7CglzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGEgKmx2ZHNfbGZwX2RhdGE7CglzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfcHRycyAqbHZkc19sZnBfZGF0YV9wdHJzOwoJc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX2VudHJ5ICplbnRyeTsKCXN0cnVjdCBsdmRzX2R2b190aW1pbmcgKmR2b190aW1pbmc7CglzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZTsKCWludCBsZnBfZGF0YV9zaXplLCBkdm9fdGltaW5nX29mZnNldDsKCWludCBpLCB0ZW1wX2Rvd25jbG9jazsKCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICp0ZW1wX21vZGU7CgoJLyogRGVmYXVsdHMgaWYgd2UgY2FuJ3QgZmluZCBWQlQgaW5mbyAqLwoJZGV2X3ByaXYtPmx2ZHNfZGl0aGVyID0gMDsKCWRldl9wcml2LT5sdmRzX3ZidCA9IDA7CgoJbHZkc19vcHRpb25zID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0xWRFNfT1BUSU9OUyk7CglpZiAoIWx2ZHNfb3B0aW9ucykKCQlyZXR1cm47CgoJZGV2X3ByaXYtPmx2ZHNfZGl0aGVyID0gbHZkc19vcHRpb25zLT5waXhlbF9kaXRoZXI7CglpZiAobHZkc19vcHRpb25zLT5wYW5lbF90eXBlID09IDB4ZmYpCgkJcmV0dXJuOwoJcGFuZWxfdHlwZSA9IGx2ZHNfb3B0aW9ucy0+cGFuZWxfdHlwZTsKCglsdmRzX2xmcF9kYXRhID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0xWRFNfTEZQX0RBVEEpOwoJaWYgKCFsdmRzX2xmcF9kYXRhKQoJCXJldHVybjsKCglsdmRzX2xmcF9kYXRhX3B0cnMgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfTFZEU19MRlBfREFUQV9QVFJTKTsKCWlmICghbHZkc19sZnBfZGF0YV9wdHJzKQoJCXJldHVybjsKCglkZXZfcHJpdi0+bHZkc192YnQgPSAxOwoKCWxmcF9kYXRhX3NpemUgPSBsdmRzX2xmcF9kYXRhX3B0cnMtPnB0clsxXS5kdm9fdGltaW5nX29mZnNldCAtCgkJbHZkc19sZnBfZGF0YV9wdHJzLT5wdHJbMF0uZHZvX3RpbWluZ19vZmZzZXQ7CgllbnRyeSA9IChzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfZW50cnkgKikKCQkoKHVpbnQ4X3QgKilsdmRzX2xmcF9kYXRhLT5kYXRhICsgKGxmcF9kYXRhX3NpemUgKgoJCQkJCQkgICBsdmRzX29wdGlvbnMtPnBhbmVsX3R5cGUpKTsKCWR2b190aW1pbmdfb2Zmc2V0ID0gbHZkc19sZnBfZGF0YV9wdHJzLT5wdHJbMF0uZHZvX3RpbWluZ19vZmZzZXQgLQoJCWx2ZHNfbGZwX2RhdGFfcHRycy0+cHRyWzBdLmZwX3RpbWluZ19vZmZzZXQ7CgoJLyoKCSAqIHRoZSBzaXplIG9mIGZwX3RpbWluZyB2YXJpZXMgb24gdGhlIGRpZmZlcmVudCBwbGF0Zm9ybS4KCSAqIFNvIGNhbGN1bGF0ZSB0aGUgRFZPIHRpbWluZyByZWxhdGl2ZSBvZmZzZXQgaW4gTFZEUyBkYXRhCgkgKiBlbnRyeSB0byBnZXQgdGhlIERWTyB0aW1pbmcgZW50cnkKCSAqLwoJZHZvX3RpbWluZyA9IChzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICopCgkJCSgodW5zaWduZWQgY2hhciAqKWVudHJ5ICsgZHZvX3RpbWluZ19vZmZzZXQpOwoKCXBhbmVsX2ZpeGVkX21vZGUgPSBremFsbG9jKHNpemVvZigqcGFuZWxfZml4ZWRfbW9kZSksIEdGUF9LRVJORUwpOwoKCWZpbGxfZGV0YWlsX3RpbWluZ19kYXRhKHBhbmVsX2ZpeGVkX21vZGUsIGR2b190aW1pbmcpOwoKCWRldl9wcml2LT5sZnBfbHZkc192YnRfbW9kZSA9IHBhbmVsX2ZpeGVkX21vZGU7CgoJRFJNX0RFQlVHX0tNUygiRm91bmQgcGFuZWwgbW9kZSBpbiBCSU9TIFZCVCB0YWJsZXM6XG4iKTsKCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUocGFuZWxfZml4ZWRfbW9kZSk7CgoJdGVtcF9tb2RlID0ga3phbGxvYyhzaXplb2YoKnRlbXBfbW9kZSksIEdGUF9LRVJORUwpOwoJdGVtcF9kb3duY2xvY2sgPSBwYW5lbF9maXhlZF9tb2RlLT5jbG9jazsKCS8qCgkgKiBlbnVtZXJhdGUgdGhlIExWRFMgcGFuZWwgdGltaW5nIGluZm8gZW50cnkgaW4gVkJUIHRvIGNoZWNrIHdoZXRoZXIKCSAqIHRoZSBMVkRTIGRvd25jbG9jayBpcyBmb3VuZC4KCSAqLwoJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKCQllbnRyeSA9IChzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfZW50cnkgKikKCQkJKCh1aW50OF90ICopbHZkc19sZnBfZGF0YS0+ZGF0YSArIChsZnBfZGF0YV9zaXplICogaSkpOwoJCWR2b190aW1pbmcgPSAoc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqKQoJCQkoKHVuc2lnbmVkIGNoYXIgKillbnRyeSArIGR2b190aW1pbmdfb2Zmc2V0KTsKCgkJZmlsbF9kZXRhaWxfdGltaW5nX2RhdGEodGVtcF9tb2RlLCBkdm9fdGltaW5nKTsKCgkJaWYgKHRlbXBfbW9kZS0+aGRpc3BsYXkgPT0gcGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgJiYKCQl0ZW1wX21vZGUtPmhzeW5jX3N0YXJ0ID09IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ICYmCgkJdGVtcF9tb2RlLT5oc3luY19lbmQgPT0gcGFuZWxfZml4ZWRfbW9kZS0+aHN5bmNfZW5kICYmCgkJdGVtcF9tb2RlLT5odG90YWwgPT0gcGFuZWxfZml4ZWRfbW9kZS0+aHRvdGFsICYmCgkJdGVtcF9tb2RlLT52ZGlzcGxheSA9PSBwYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheSAmJgoJCXRlbXBfbW9kZS0+dnN5bmNfc3RhcnQgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfc3RhcnQgJiYKCQl0ZW1wX21vZGUtPnZzeW5jX2VuZCA9PSBwYW5lbF9maXhlZF9tb2RlLT52c3luY19lbmQgJiYKCQl0ZW1wX21vZGUtPnZ0b3RhbCA9PSBwYW5lbF9maXhlZF9tb2RlLT52dG90YWwgJiYKCQl0ZW1wX21vZGUtPmNsb2NrIDwgdGVtcF9kb3duY2xvY2spIHsKCQkJLyoKCQkJICogZG93bmNsb2NrIGlzIGFscmVhZHkgZm91bmQuIEJ1dCB3ZSBleHBlY3QKCQkJICogdG8gZmluZCB0aGUgbG93ZXIgZG93bmNsb2NrLgoJCQkgKi8KCQkJdGVtcF9kb3duY2xvY2sgPSB0ZW1wX21vZGUtPmNsb2NrOwoJCX0KCQkvKiBjbGVhciBpdCB0byB6ZXJvICovCgkJbWVtc2V0KHRlbXBfbW9kZSwgMCwgc2l6ZW9mKCp0ZW1wX21vZGUpKTsKCX0KCWtmcmVlKHRlbXBfbW9kZSk7CglpZiAodGVtcF9kb3duY2xvY2sgPCBwYW5lbF9maXhlZF9tb2RlLT5jbG9jayAmJgoJICAgIGk5MTVfbHZkc19kb3duY2xvY2spIHsKCQlkZXZfcHJpdi0+bHZkc19kb3duY2xvY2tfYXZhaWwgPSAxOwoJCWRldl9wcml2LT5sdmRzX2Rvd25jbG9jayA9IHRlbXBfZG93bmNsb2NrOwoJCURSTV9ERUJVR19LTVMoIkxWRFMgZG93bmNsb2NrIGlzIGZvdW5kIGluIFZCVC4gIiwKCQkJCSJOb3JtYWwgQ2xvY2sgJWRLSHosIGRvd25jbG9jayAlZEtIelxuIiwKCQkJCXRlbXBfZG93bmNsb2NrLCBwYW5lbF9maXhlZF9tb2RlLT5jbG9jayk7Cgl9CglyZXR1cm47Cn0KCi8qIFRyeSB0byBmaW5kIHNkdm8gcGFuZWwgZGF0YSAqLwpzdGF0aWMgdm9pZApwYXJzZV9zZHZvX3BhbmVsX2RhdGEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBiZGJfc2R2b19sdmRzX29wdGlvbnMgKnNkdm9fbHZkc19vcHRpb25zOwoJc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqZHZvX3RpbWluZzsKCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpwYW5lbF9maXhlZF9tb2RlOwoKCWRldl9wcml2LT5zZHZvX2x2ZHNfdmJ0X21vZGUgPSBOVUxMOwoKCXNkdm9fbHZkc19vcHRpb25zID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX1NEVk9fTFZEU19PUFRJT05TKTsKCWlmICghc2R2b19sdmRzX29wdGlvbnMpCgkJcmV0dXJuOwoKCWR2b190aW1pbmcgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfU0RWT19QQU5FTF9EVERTKTsKCWlmICghZHZvX3RpbWluZykKCQlyZXR1cm47CgoJcGFuZWxfZml4ZWRfbW9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpwYW5lbF9maXhlZF9tb2RlKSwgR0ZQX0tFUk5FTCk7CgoJaWYgKCFwYW5lbF9maXhlZF9tb2RlKQoJCXJldHVybjsKCglmaWxsX2RldGFpbF90aW1pbmdfZGF0YShwYW5lbF9maXhlZF9tb2RlLAoJCQlkdm9fdGltaW5nICsgc2R2b19sdmRzX29wdGlvbnMtPnBhbmVsX3R5cGUpOwoKCWRldl9wcml2LT5zZHZvX2x2ZHNfdmJ0X21vZGUgPSBwYW5lbF9maXhlZF9tb2RlOwoKCXJldHVybjsKfQoKc3RhdGljIHZvaWQKcGFyc2VfZ2VuZXJhbF9mZWF0dXJlcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJICAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OwoJc3RydWN0IGJkYl9nZW5lcmFsX2ZlYXR1cmVzICpnZW5lcmFsOwoKCS8qIFNldCBzZW5zaWJsZSBkZWZhdWx0cyBpbiBjYXNlIHdlIGNhbid0IGZpbmQgdGhlIGdlbmVyYWwgYmxvY2sgKi8KCWRldl9wcml2LT5pbnRfdHZfc3VwcG9ydCA9IDE7CglkZXZfcHJpdi0+aW50X2NydF9zdXBwb3J0ID0gMTsKCglnZW5lcmFsID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0dFTkVSQUxfRkVBVFVSRVMpOwoJaWYgKGdlbmVyYWwpIHsKCQlkZXZfcHJpdi0+aW50X3R2X3N1cHBvcnQgPSBnZW5lcmFsLT5pbnRfdHZfc3VwcG9ydDsKCQlkZXZfcHJpdi0+aW50X2NydF9zdXBwb3J0ID0gZ2VuZXJhbC0+aW50X2NydF9zdXBwb3J0OwoJCWRldl9wcml2LT5sdmRzX3VzZV9zc2MgPSBnZW5lcmFsLT5lbmFibGVfc3NjOwoKCQlpZiAoZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYykgewoJCQlpZiAoSVNfSTg1WChkZXZfcHJpdi0+ZGV2KSkKCQkJCWRldl9wcml2LT5sdmRzX3NzY19mcmVxID0KCQkJCQlnZW5lcmFsLT5zc2NfZnJlcSA/IDY2IDogNDg7CgkJCWVsc2UgaWYgKElTX0lST05MQUtFKGRldl9wcml2LT5kZXYpIHx8IElTX0dFTjYoZGV2KSkKCQkJCWRldl9wcml2LT5sdmRzX3NzY19mcmVxID0KCQkJCQlnZW5lcmFsLT5zc2NfZnJlcSA/IDEwMCA6IDEyMDsKCQkJZWxzZQoJCQkJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPQoJCQkJCWdlbmVyYWwtPnNzY19mcmVxID8gMTAwIDogOTY7CgkJfQoJfQp9CgpzdGF0aWMgdm9pZApwYXJzZV9nZW5lcmFsX2RlZmluaXRpb25zKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkJICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2dlbmVyYWxfZGVmaW5pdGlvbnMgKmdlbmVyYWw7Cgljb25zdCBpbnQgY3J0X2J1c19tYXBfdGFibGVbXSA9IHsKCQlHUElPQiwKCQlHUElPQSwKCQlHUElPQywKCQlHUElPRCwKCQlHUElPRSwKCQlHUElPRiwKCX07CgoJZ2VuZXJhbCA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9HRU5FUkFMX0RFRklOSVRJT05TKTsKCWlmIChnZW5lcmFsKSB7CgkJdTE2IGJsb2NrX3NpemUgPSBnZXRfYmxvY2tzaXplKGdlbmVyYWwpOwoJCWlmIChibG9ja19zaXplID49IHNpemVvZigqZ2VuZXJhbCkpIHsKCQkJaW50IGJ1c19waW4gPSBnZW5lcmFsLT5jcnRfZGRjX2dtYnVzX3BpbjsKCQkJRFJNX0RFQlVHX0tNUygiY3J0X2RkY19idXNfcGluOiAlZFxuIiwgYnVzX3Bpbik7CgkJCWlmICgoYnVzX3BpbiA+PSAxKSAmJiAoYnVzX3BpbiA8PSA2KSkgewoJCQkJZGV2X3ByaXYtPmNydF9kZGNfYnVzID0KCQkJCQljcnRfYnVzX21hcF90YWJsZVtidXNfcGluLTFdOwoJCQl9CgkJfSBlbHNlIHsKCQkJRFJNX0RFQlVHX0tNUygiQkRCX0dEIHRvbyBzbWFsbCAoJWQpLiBJbnZhbGlkLlxuIiwKCQkJCSAgYmxvY2tfc2l6ZSk7CgkJfQoJfQp9CgpzdGF0aWMgdm9pZApwYXJzZV9zZHZvX2RldmljZV9tYXBwaW5nKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IHNkdm9fZGV2aWNlX21hcHBpbmcgKnBfbWFwcGluZzsKCXN0cnVjdCBiZGJfZ2VuZXJhbF9kZWZpbml0aW9ucyAqcF9kZWZzOwoJc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcgKnBfY2hpbGQ7CglpbnQgaSwgY2hpbGRfZGV2aWNlX251bSwgY291bnQ7Cgl1MTYJYmxvY2tfc2l6ZTsKCglwX2RlZnMgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9ERUZJTklUSU9OUyk7CglpZiAoIXBfZGVmcykgewoJCURSTV9ERUJVR19LTVMoIk5vIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jayBpcyBmb3VuZFxuIik7CgkJcmV0dXJuOwoJfQoJLyoganVkZ2Ugd2hldGhlciB0aGUgc2l6ZSBvZiBjaGlsZCBkZXZpY2UgbWVldHMgdGhlIHJlcXVpcmVtZW50cy4KCSAqIElmIHRoZSBjaGlsZCBkZXZpY2Ugc2l6ZSBvYnRhaW5lZCBmcm9tIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jawoJICogaXMgZGlmZmVyZW50IHdpdGggc2l6ZW9mKHN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnKSwgc2tpcCB0aGUKCSAqIHBhcnNpbmcgb2Ygc2R2byBkZXZpY2UgaW5mbwoJICovCglpZiAocF9kZWZzLT5jaGlsZF9kZXZfc2l6ZSAhPSBzaXplb2YoKnBfY2hpbGQpKSB7CgkJLyogZGlmZmVyZW50IGNoaWxkIGRldiBzaXplIC4gSWdub3JlIGl0ICovCgkJRFJNX0RFQlVHX0tNUygiZGlmZmVyZW50IGNoaWxkIHNpemUgaXMgZm91bmQuIEludmFsaWQuXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBnZXQgdGhlIGJsb2NrIHNpemUgb2YgZ2VuZXJhbCBkZWZpbml0aW9ucyAqLwoJYmxvY2tfc2l6ZSA9IGdldF9ibG9ja3NpemUocF9kZWZzKTsKCS8qIGdldCB0aGUgbnVtYmVyIG9mIGNoaWxkIGRldmljZSAqLwoJY2hpbGRfZGV2aWNlX251bSA9IChibG9ja19zaXplIC0gc2l6ZW9mKCpwX2RlZnMpKSAvCgkJCQlzaXplb2YoKnBfY2hpbGQpOwoJY291bnQgPSAwOwoJZm9yIChpID0gMDsgaSA8IGNoaWxkX2RldmljZV9udW07IGkrKykgewoJCXBfY2hpbGQgPSAmKHBfZGVmcy0+ZGV2aWNlc1tpXSk7CgkJaWYgKCFwX2NoaWxkLT5kZXZpY2VfdHlwZSkgewoJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLwoJCQljb250aW51ZTsKCQl9CgkJaWYgKHBfY2hpbGQtPnNsYXZlX2FkZHIgIT0gU0xBVkVfQUREUjEgJiYKCQkJcF9jaGlsZC0+c2xhdmVfYWRkciAhPSBTTEFWRV9BRERSMikgewoJCQkvKgoJCQkgKiBJZiB0aGUgc2xhdmUgYWRkcmVzcyBpcyBuZWl0aGVyIDB4NzAgbm9yIDB4NzIsCgkJCSAqIGl0IGlzIG5vdCBhIFNEVk8gZGV2aWNlLiBTa2lwIGl0LgoJCQkgKi8KCQkJY29udGludWU7CgkJfQoJCWlmIChwX2NoaWxkLT5kdm9fcG9ydCAhPSBERVZJQ0VfUE9SVF9EVk9CICYmCgkJCXBfY2hpbGQtPmR2b19wb3J0ICE9IERFVklDRV9QT1JUX0RWT0MpIHsKCQkJLyogc2tpcCB0aGUgaW5jb3JyZWN0IFNEVk8gcG9ydCAqLwoJCQlEUk1fREVCVUdfS01TKCJJbmNvcnJlY3QgU0RWTyBwb3J0LiBTa2lwIGl0IFxuIik7CgkJCWNvbnRpbnVlOwoJCX0KCQlEUk1fREVCVUdfS01TKCJ0aGUgU0RWTyBkZXZpY2Ugd2l0aCBzbGF2ZSBhZGRyICUyeCBpcyBmb3VuZCBvbiIKCQkJCSIgJXMgcG9ydFxuIiwKCQkJCXBfY2hpbGQtPnNsYXZlX2FkZHIsCgkJCQkocF9jaGlsZC0+ZHZvX3BvcnQgPT0gREVWSUNFX1BPUlRfRFZPQikgPwoJCQkJCSJTRFZPQiIgOiAiU0RWT0MiKTsKCQlwX21hcHBpbmcgPSAmKGRldl9wcml2LT5zZHZvX21hcHBpbmdzW3BfY2hpbGQtPmR2b19wb3J0IC0gMV0pOwoJCWlmICghcF9tYXBwaW5nLT5pbml0aWFsaXplZCkgewoJCQlwX21hcHBpbmctPmR2b19wb3J0ID0gcF9jaGlsZC0+ZHZvX3BvcnQ7CgkJCXBfbWFwcGluZy0+c2xhdmVfYWRkciA9IHBfY2hpbGQtPnNsYXZlX2FkZHI7CgkJCXBfbWFwcGluZy0+ZHZvX3dpcmluZyA9IHBfY2hpbGQtPmR2b193aXJpbmc7CgkJCXBfbWFwcGluZy0+ZGRjX3BpbiA9IHBfY2hpbGQtPmRkY19waW47CgkJCXBfbWFwcGluZy0+aW5pdGlhbGl6ZWQgPSAxOwoJCX0gZWxzZSB7CgkJCURSTV9ERUJVR19LTVMoIk1heWJlIG9uZSBTRFZPIHBvcnQgaXMgc2hhcmVkIGJ5ICIKCQkJCQkgInR3byBTRFZPIGRldmljZS5cbiIpOwoJCX0KCQlpZiAocF9jaGlsZC0+c2xhdmUyX2FkZHIpIHsKCQkJLyogTWF5YmUgdGhpcyBpcyBhIFNEVk8gZGV2aWNlIHdpdGggbXVsdGlwbGUgaW5wdXRzICovCgkJCS8qIEFuZCB0aGUgbWFwcGluZyBpbmZvIGlzIG5vdCBhZGRlZCAqLwoJCQlEUk1fREVCVUdfS01TKCJ0aGVyZSBleGlzdHMgdGhlIHNsYXZlMl9hZGRyLiBNYXliZSB0aGlzIgoJCQkJIiBpcyBhIFNEVk8gZGV2aWNlIHdpdGggbXVsdGlwbGUgaW5wdXRzLlxuIik7CgkJfQoJCWNvdW50Kys7Cgl9CgoJaWYgKCFjb3VudCkgewoJCS8qIE5vIFNEVk8gZGV2aWNlIGluZm8gaXMgZm91bmQgKi8KCQlEUk1fREVCVUdfS01TKCJObyBTRFZPIGRldmljZSBpbmZvIGlzIGZvdW5kIGluIFZCVFxuIik7Cgl9CglyZXR1cm47Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2RyaXZlcl9mZWF0dXJlcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJICAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OwoJc3RydWN0IGJkYl9kcml2ZXJfZmVhdHVyZXMgKmRyaXZlcjsKCglkcml2ZXIgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfRFJJVkVSX0ZFQVRVUkVTKTsKCWlmICghZHJpdmVyKQoJCXJldHVybjsKCglpZiAoZHJpdmVyICYmIFNVUFBPUlRTX0VEUChkZXYpICYmCgkgICAgZHJpdmVyLT5sdmRzX2NvbmZpZyA9PSBCREJfRFJJVkVSX0ZFQVRVUkVfRURQKSB7CgkJZGV2X3ByaXYtPmVkcF9zdXBwb3J0ID0gMTsKCX0gZWxzZSB7CgkJZGV2X3ByaXYtPmVkcF9zdXBwb3J0ID0gMDsKCX0KCglpZiAoZHJpdmVyICYmIGRyaXZlci0+ZHVhbF9mcmVxdWVuY3kpCgkJZGV2X3ByaXYtPnJlbmRlcl9yZWNsb2NrX2F2YWlsID0gdHJ1ZTsKfQoKc3RhdGljIHZvaWQKcGFyc2VfZWRwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IGJkYl9lZHAgKmVkcDsKCgllZHAgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfRURQKTsKCWlmICghZWRwKSB7CgkJaWYgKFNVUFBPUlRTX0VEUChkZXZfcHJpdi0+ZGV2KSAmJiBkZXZfcHJpdi0+ZWRwX3N1cHBvcnQpIHsKCQkJRFJNX0RFQlVHX0tNUygiTm8gZURQIEJEQiBmb3VuZCBidXQgZURQIHBhbmVsICIKCQkJCSAgICAgICJzdXBwb3J0ZWQsIGFzc3VtZSAxOGJwcCBwYW5lbCBjb2xvciAiCgkJCQkgICAgICAiZGVwdGguXG4iKTsKCQkJZGV2X3ByaXYtPmVkcF9icHAgPSAxODsKCQl9CgkJcmV0dXJuOwoJfQoKCXN3aXRjaCAoKGVkcC0+Y29sb3JfZGVwdGggPj4gKHBhbmVsX3R5cGUgKiAyKSkgJiAzKSB7CgljYXNlIEVEUF8xOEJQUDoKCQlkZXZfcHJpdi0+ZWRwX2JwcCA9IDE4OwoJCWJyZWFrOwoJY2FzZSBFRFBfMjRCUFA6CgkJZGV2X3ByaXYtPmVkcF9icHAgPSAyNDsKCQlicmVhazsKCWNhc2UgRURQXzMwQlBQOgoJCWRldl9wcml2LT5lZHBfYnBwID0gMzA7CgkJYnJlYWs7Cgl9Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2RldmljZV9tYXBwaW5nKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IGJkYl9nZW5lcmFsX2RlZmluaXRpb25zICpwX2RlZnM7CglzdHJ1Y3QgY2hpbGRfZGV2aWNlX2NvbmZpZyAqcF9jaGlsZCwgKmNoaWxkX2Rldl9wdHI7CglpbnQgaSwgY2hpbGRfZGV2aWNlX251bSwgY291bnQ7Cgl1MTYJYmxvY2tfc2l6ZTsKCglwX2RlZnMgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9ERUZJTklUSU9OUyk7CglpZiAoIXBfZGVmcykgewoJCURSTV9ERUJVR19LTVMoIk5vIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jayBpcyBmb3VuZFxuIik7CgkJcmV0dXJuOwoJfQoJLyoganVkZ2Ugd2hldGhlciB0aGUgc2l6ZSBvZiBjaGlsZCBkZXZpY2UgbWVldHMgdGhlIHJlcXVpcmVtZW50cy4KCSAqIElmIHRoZSBjaGlsZCBkZXZpY2Ugc2l6ZSBvYnRhaW5lZCBmcm9tIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jawoJICogaXMgZGlmZmVyZW50IHdpdGggc2l6ZW9mKHN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnKSwgc2tpcCB0aGUKCSAqIHBhcnNpbmcgb2Ygc2R2byBkZXZpY2UgaW5mbwoJICovCglpZiAocF9kZWZzLT5jaGlsZF9kZXZfc2l6ZSAhPSBzaXplb2YoKnBfY2hpbGQpKSB7CgkJLyogZGlmZmVyZW50IGNoaWxkIGRldiBzaXplIC4gSWdub3JlIGl0ICovCgkJRFJNX0RFQlVHX0tNUygiZGlmZmVyZW50IGNoaWxkIHNpemUgaXMgZm91bmQuIEludmFsaWQuXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBnZXQgdGhlIGJsb2NrIHNpemUgb2YgZ2VuZXJhbCBkZWZpbml0aW9ucyAqLwoJYmxvY2tfc2l6ZSA9IGdldF9ibG9ja3NpemUocF9kZWZzKTsKCS8qIGdldCB0aGUgbnVtYmVyIG9mIGNoaWxkIGRldmljZSAqLwoJY2hpbGRfZGV2aWNlX251bSA9IChibG9ja19zaXplIC0gc2l6ZW9mKCpwX2RlZnMpKSAvCgkJCQlzaXplb2YoKnBfY2hpbGQpOwoJY291bnQgPSAwOwoJLyogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGQgZGV2aWNlIHRoYXQgaXMgcHJlc2VudCAqLwoJZm9yIChpID0gMDsgaSA8IGNoaWxkX2RldmljZV9udW07IGkrKykgewoJCXBfY2hpbGQgPSAmKHBfZGVmcy0+ZGV2aWNlc1tpXSk7CgkJaWYgKCFwX2NoaWxkLT5kZXZpY2VfdHlwZSkgewoJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLwoJCQljb250aW51ZTsKCQl9CgkJY291bnQrKzsKCX0KCWlmICghY291bnQpIHsKCQlEUk1fREVCVUdfS01TKCJubyBjaGlsZCBkZXYgaXMgcGFyc2VkIGZyb20gVkJUIFxuIik7CgkJcmV0dXJuOwoJfQoJZGV2X3ByaXYtPmNoaWxkX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpwX2NoaWxkKSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKCWlmICghZGV2X3ByaXYtPmNoaWxkX2RldikgewoJCURSTV9ERUJVR19LTVMoIk5vIG1lbW9yeSBzcGFjZSBmb3IgY2hpbGQgZGV2aWNlXG4iKTsKCQlyZXR1cm47Cgl9CgoJZGV2X3ByaXYtPmNoaWxkX2Rldl9udW0gPSBjb3VudDsKCWNvdW50ID0gMDsKCWZvciAoaSA9IDA7IGkgPCBjaGlsZF9kZXZpY2VfbnVtOyBpKyspIHsKCQlwX2NoaWxkID0gJihwX2RlZnMtPmRldmljZXNbaV0pOwoJCWlmICghcF9jaGlsZC0+ZGV2aWNlX3R5cGUpIHsKCQkJLyogc2tpcCB0aGUgZGV2aWNlIGJsb2NrIGlmIGRldmljZSB0eXBlIGlzIGludmFsaWQgKi8KCQkJY29udGludWU7CgkJfQoJCWNoaWxkX2Rldl9wdHIgPSBkZXZfcHJpdi0+Y2hpbGRfZGV2ICsgY291bnQ7CgkJY291bnQrKzsKCQltZW1jcHkoKHZvaWQgKiljaGlsZF9kZXZfcHRyLCAodm9pZCAqKXBfY2hpbGQsCgkJCQkJc2l6ZW9mKCpwX2NoaWxkKSk7Cgl9CglyZXR1cm47Cn0KLyoqCiAqIGludGVsX2luaXRfYmlvcyAtIGluaXRpYWxpemUgVkJJT1Mgc2V0dGluZ3MgJiBmaW5kIFZCVAogKiBAZGV2OiBEUk0gZGV2aWNlCiAqCiAqIExvYWRzIHRoZSBWaWRlbyBCSU9TIGFuZCBjaGVja3MgdGhhdCB0aGUgVkJUIGV4aXN0cy4gIFNldHMgc2NyYXRjaCByZWdpc3RlcnMKICogdG8gYXBwcm9wcmlhdGUgdmFsdWVzLgogKgogKiBWQlQgZXhpc3RlbmNlIGlzIGEgc2FuaXR5IGNoZWNrIHRoYXQgaXMgcmVsaWVkIG9uIGJ5IG90aGVyIGk4MzBfYmlvcy5jIGNvZGUuCiAqIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gdXNlIGEgQklPUyBjYWxsIHRvIGdldCB0aGUgVkJULCBhcyBCSU9TZXMgbWF5CiAqIGZlZWQgYW4gdXBkYXRlZCBWQlQgYmFjayB0aHJvdWdoIHRoYXQsIGNvbXBhcmVkIHRvIHdoYXQgd2UnbGwgZmV0Y2ggdXNpbmcKICogdGhpcyBtZXRob2Qgb2YgZ3JvcGluZyBhcm91bmQgaW4gdGhlIEJJT1MgZGF0YS4KICoKICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZmFpbHVyZS4KICovCmJvb2wKaW50ZWxfaW5pdF9iaW9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKCXN0cnVjdCB2YnRfaGVhZGVyICp2YnQgPSBOVUxMOwoJc3RydWN0IGJkYl9oZWFkZXIgKmJkYjsKCXU4IF9faW9tZW0gKmJpb3M7CglzaXplX3Qgc2l6ZTsKCWludCBpOwoKCWJpb3MgPSBwY2lfbWFwX3JvbShwZGV2LCAmc2l6ZSk7CglpZiAoIWJpb3MpCgkJcmV0dXJuIC0xOwoKCS8qIFNjb3VyIG1lbW9yeSBsb29raW5nIGZvciB0aGUgVkJUIHNpZ25hdHVyZSAqLwoJZm9yIChpID0gMDsgaSArIDQgPCBzaXplOyBpKyspIHsKCQlpZiAoIW1lbWNtcChiaW9zICsgaSwgIiRWQlQiLCA0KSkgewoJCQl2YnQgPSAoc3RydWN0IHZidF9oZWFkZXIgKikoYmlvcyArIGkpOwoJCQlicmVhazsKCQl9Cgl9CgoJaWYgKCF2YnQpIHsKCQlEUk1fRVJST1IoIlZCVCBzaWduYXR1cmUgbWlzc2luZ1xuIik7CgkJcGNpX3VubWFwX3JvbShwZGV2LCBiaW9zKTsKCQlyZXR1cm4gLTE7Cgl9CgoJYmRiID0gKHN0cnVjdCBiZGJfaGVhZGVyICopKGJpb3MgKyBpICsgdmJ0LT5iZGJfb2Zmc2V0KTsKCgkvKiBHcmFiIHVzZWZ1bCBnZW5lcmFsIGRlZmluaXRpb25zICovCglwYXJzZV9nZW5lcmFsX2ZlYXR1cmVzKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZ2VuZXJhbF9kZWZpbml0aW9ucyhkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX2xmcF9wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOwoJcGFyc2Vfc2R2b19wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOwoJcGFyc2Vfc2R2b19kZXZpY2VfbWFwcGluZyhkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX2RldmljZV9tYXBwaW5nKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZHJpdmVyX2ZlYXR1cmVzKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZWRwKGRldl9wcml2LCBiZGIpOwoKCXBjaV91bm1hcF9yb20ocGRldiwgYmlvcyk7CgoJcmV0dXJuIDA7Cn0K