LyoKICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgogKgogKi8KI2luY2x1ZGUgImRybVAuaCIKI2luY2x1ZGUgImRybS5oIgojaW5jbHVkZSAiaTkxNV9kcm0uaCIKI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiNpbmNsdWRlICJpbnRlbF9iaW9zLmgiCgojZGVmaW5lCVNMQVZFX0FERFIxCTB4NzAKI2RlZmluZQlTTEFWRV9BRERSMgkweDcyCgpzdGF0aWMgdm9pZCAqCmZpbmRfc2VjdGlvbihzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiLCBpbnQgc2VjdGlvbl9pZCkKewoJdTggKmJhc2UgPSAodTggKiliZGI7CglpbnQgaW5kZXggPSAwOwoJdTE2IHRvdGFsLCBjdXJyZW50X3NpemU7Cgl1OCBjdXJyZW50X2lkOwoKCS8qIHNraXAgdG8gZmlyc3Qgc2VjdGlvbiAqLwoJaW5kZXggKz0gYmRiLT5oZWFkZXJfc2l6ZTsKCXRvdGFsID0gYmRiLT5iZGJfc2l6ZTsKCgkvKiB3YWxrIHRoZSBzZWN0aW9ucyBsb29raW5nIGZvciBzZWN0aW9uX2lkICovCgl3aGlsZSAoaW5kZXggPCB0b3RhbCkgewoJCWN1cnJlbnRfaWQgPSAqKGJhc2UgKyBpbmRleCk7CgkJaW5kZXgrKzsKCQljdXJyZW50X3NpemUgPSAqKCh1MTYgKikoYmFzZSArIGluZGV4KSk7CgkJaW5kZXggKz0gMjsKCQlpZiAoY3VycmVudF9pZCA9PSBzZWN0aW9uX2lkKQoJCQlyZXR1cm4gYmFzZSArIGluZGV4OwoJCWluZGV4ICs9IGN1cnJlbnRfc2l6ZTsKCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKZmlsbF9kZXRhaWxfdGltaW5nX2RhdGEoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBhbmVsX2ZpeGVkX21vZGUsCgkJCXN0cnVjdCBsdmRzX2R2b190aW1pbmcgKmR2b190aW1pbmcpCnsKCXBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ID0gKGR2b190aW1pbmctPmhhY3RpdmVfaGkgPDwgOCkgfAoJCWR2b190aW1pbmctPmhhY3RpdmVfbG87CglwYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ICsKCQkoKGR2b190aW1pbmctPmhzeW5jX29mZl9oaSA8PCA4KSB8IGR2b190aW1pbmctPmhzeW5jX29mZl9sbyk7CglwYW5lbF9maXhlZF9tb2RlLT5oc3luY19lbmQgPSBwYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydCArCgkJZHZvX3RpbWluZy0+aHN5bmNfcHVsc2Vfd2lkdGg7CglwYW5lbF9maXhlZF9tb2RlLT5odG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT5oZGlzcGxheSArCgkJKChkdm9fdGltaW5nLT5oYmxhbmtfaGkgPDwgOCkgfCBkdm9fdGltaW5nLT5oYmxhbmtfbG8pOwoKCXBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ID0gKGR2b190aW1pbmctPnZhY3RpdmVfaGkgPDwgOCkgfAoJCWR2b190aW1pbmctPnZhY3RpdmVfbG87CglwYW5lbF9maXhlZF9tb2RlLT52c3luY19zdGFydCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ICsKCQlkdm9fdGltaW5nLT52c3luY19vZmY7CglwYW5lbF9maXhlZF9tb2RlLT52c3luY19lbmQgPSBwYW5lbF9maXhlZF9tb2RlLT52c3luY19zdGFydCArCgkJZHZvX3RpbWluZy0+dnN5bmNfcHVsc2Vfd2lkdGg7CglwYW5lbF9maXhlZF9tb2RlLT52dG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheSArCgkJKChkdm9fdGltaW5nLT52YmxhbmtfaGkgPDwgOCkgfCBkdm9fdGltaW5nLT52YmxhbmtfbG8pOwoJcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2sgPSBkdm9fdGltaW5nLT5jbG9jayAqIDEwOwoJcGFuZWxfZml4ZWRfbW9kZS0+dHlwZSA9IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOwoKCS8qIFNvbWUgVkJUcyBoYXZlIGJvZ3VzIGgvdnRvdGFsIHZhbHVlcyAqLwoJaWYgKHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCA+IHBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCkKCQlwYW5lbF9maXhlZF9tb2RlLT5odG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT5oc3luY19lbmQgKyAxOwoJaWYgKHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX2VuZCA+IHBhbmVsX2ZpeGVkX21vZGUtPnZ0b3RhbCkKCQlwYW5lbF9maXhlZF9tb2RlLT52dG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT52c3luY19lbmQgKyAxOwoKCWRybV9tb2RlX3NldF9uYW1lKHBhbmVsX2ZpeGVkX21vZGUpOwp9CgovKiBUcnkgdG8gZmluZCBpbnRlZ3JhdGVkIHBhbmVsIGRhdGEgKi8Kc3RhdGljIHZvaWQKcGFyc2VfbGZwX3BhbmVsX2RhdGEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCQkgICAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IGJkYl9sdmRzX29wdGlvbnMgKmx2ZHNfb3B0aW9uczsKCXN0cnVjdCBiZGJfbHZkc19sZnBfZGF0YSAqbHZkc19sZnBfZGF0YTsKCXN0cnVjdCBiZGJfbHZkc19sZnBfZGF0YV9lbnRyeSAqZW50cnk7CglzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICpkdm9fdGltaW5nOwoJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBhbmVsX2ZpeGVkX21vZGU7CgoJLyogRGVmYXVsdHMgaWYgd2UgY2FuJ3QgZmluZCBWQlQgaW5mbyAqLwoJZGV2X3ByaXYtPmx2ZHNfZGl0aGVyID0gMDsKCWRldl9wcml2LT5sdmRzX3ZidCA9IDA7CgoJbHZkc19vcHRpb25zID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0xWRFNfT1BUSU9OUyk7CglpZiAoIWx2ZHNfb3B0aW9ucykKCQlyZXR1cm47CgoJZGV2X3ByaXYtPmx2ZHNfZGl0aGVyID0gbHZkc19vcHRpb25zLT5waXhlbF9kaXRoZXI7CglpZiAobHZkc19vcHRpb25zLT5wYW5lbF90eXBlID09IDB4ZmYpCgkJcmV0dXJuOwoKCWx2ZHNfbGZwX2RhdGEgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfTFZEU19MRlBfREFUQSk7CglpZiAoIWx2ZHNfbGZwX2RhdGEpCgkJcmV0dXJuOwoKCWRldl9wcml2LT5sdmRzX3ZidCA9IDE7CgoJZW50cnkgPSAmbHZkc19sZnBfZGF0YS0+ZGF0YVtsdmRzX29wdGlvbnMtPnBhbmVsX3R5cGVdOwoJZHZvX3RpbWluZyA9ICZlbnRyeS0+ZHZvX3RpbWluZzsKCglwYW5lbF9maXhlZF9tb2RlID0gZHJtX2NhbGxvYygxLCBzaXplb2YoKnBhbmVsX2ZpeGVkX21vZGUpLAoJCQkJICAgICAgRFJNX01FTV9EUklWRVIpOwoKCWZpbGxfZGV0YWlsX3RpbWluZ19kYXRhKHBhbmVsX2ZpeGVkX21vZGUsIGR2b190aW1pbmcpOwoKCWRldl9wcml2LT5sZnBfbHZkc192YnRfbW9kZSA9IHBhbmVsX2ZpeGVkX21vZGU7CgoJRFJNX0RFQlVHKCJGb3VuZCBwYW5lbCBtb2RlIGluIEJJT1MgVkJUIHRhYmxlczpcbiIpOwoJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShwYW5lbF9maXhlZF9tb2RlKTsKCglyZXR1cm47Cn0KCi8qIFRyeSB0byBmaW5kIHNkdm8gcGFuZWwgZGF0YSAqLwpzdGF0aWMgdm9pZApwYXJzZV9zZHZvX3BhbmVsX2RhdGEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBiZGJfc2R2b19sdmRzX29wdGlvbnMgKnNkdm9fbHZkc19vcHRpb25zOwoJc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqZHZvX3RpbWluZzsKCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpwYW5lbF9maXhlZF9tb2RlOwoKCWRldl9wcml2LT5zZHZvX2x2ZHNfdmJ0X21vZGUgPSBOVUxMOwoKCXNkdm9fbHZkc19vcHRpb25zID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX1NEVk9fTFZEU19PUFRJT05TKTsKCWlmICghc2R2b19sdmRzX29wdGlvbnMpCgkJcmV0dXJuOwoKCWR2b190aW1pbmcgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfU0RWT19QQU5FTF9EVERTKTsKCWlmICghZHZvX3RpbWluZykKCQlyZXR1cm47CgoJcGFuZWxfZml4ZWRfbW9kZSA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCpwYW5lbF9maXhlZF9tb2RlKSwKCQkJCSAgICAgIERSTV9NRU1fRFJJVkVSKTsKCglpZiAoIXBhbmVsX2ZpeGVkX21vZGUpCgkJcmV0dXJuOwoKCWZpbGxfZGV0YWlsX3RpbWluZ19kYXRhKHBhbmVsX2ZpeGVkX21vZGUsCgkJCWR2b190aW1pbmcgKyBzZHZvX2x2ZHNfb3B0aW9ucy0+cGFuZWxfdHlwZSk7CgoJZGV2X3ByaXYtPnNkdm9fbHZkc192YnRfbW9kZSA9IHBhbmVsX2ZpeGVkX21vZGU7CgoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZApwYXJzZV9nZW5lcmFsX2ZlYXR1cmVzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IGJkYl9nZW5lcmFsX2ZlYXR1cmVzICpnZW5lcmFsOwoKCS8qIFNldCBzZW5zaWJsZSBkZWZhdWx0cyBpbiBjYXNlIHdlIGNhbid0IGZpbmQgdGhlIGdlbmVyYWwgYmxvY2sgKi8KCWRldl9wcml2LT5pbnRfdHZfc3VwcG9ydCA9IDE7CglkZXZfcHJpdi0+aW50X2NydF9zdXBwb3J0ID0gMTsKCglnZW5lcmFsID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0dFTkVSQUxfRkVBVFVSRVMpOwoJaWYgKGdlbmVyYWwpIHsKCQlkZXZfcHJpdi0+aW50X3R2X3N1cHBvcnQgPSBnZW5lcmFsLT5pbnRfdHZfc3VwcG9ydDsKCQlkZXZfcHJpdi0+aW50X2NydF9zdXBwb3J0ID0gZ2VuZXJhbC0+aW50X2NydF9zdXBwb3J0OwoJCWRldl9wcml2LT5sdmRzX3VzZV9zc2MgPSBnZW5lcmFsLT5lbmFibGVfc3NjOwoKCQlpZiAoZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYykgewoJCSAgaWYgKElTX0k4NTUoZGV2X3ByaXYtPmRldikpCgkJICAgIGRldl9wcml2LT5sdmRzX3NzY19mcmVxID0gZ2VuZXJhbC0+c3NjX2ZyZXEgPyA2NiA6IDQ4OwoJCSAgZWxzZQoJCSAgICBkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9IGdlbmVyYWwtPnNzY19mcmVxID8gMTAwIDogOTY7CgkJfQoJfQp9CgpzdGF0aWMgdm9pZApwYXJzZV9zZHZvX2RldmljZV9tYXBwaW5nKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IHNkdm9fZGV2aWNlX21hcHBpbmcgKnBfbWFwcGluZzsKCXN0cnVjdCBiZGJfZ2VuZXJhbF9kZWZpbml0aW9ucyAqcF9kZWZzOwoJc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcgKnBfY2hpbGQ7CglpbnQgaSwgY2hpbGRfZGV2aWNlX251bSwgY291bnQ7Cgl1MTYJYmxvY2tfc2l6ZSwgKmJsb2NrX3B0cjsKCglwX2RlZnMgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9ERUZJTklUSU9OUyk7CglpZiAoIXBfZGVmcykgewoJCURSTV9ERUJVRygiTm8gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrIGlzIGZvdW5kXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBqdWRnZSB3aGV0aGVyIHRoZSBzaXplIG9mIGNoaWxkIGRldmljZSBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLgoJICogSWYgdGhlIGNoaWxkIGRldmljZSBzaXplIG9idGFpbmVkIGZyb20gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrCgkgKiBpcyBkaWZmZXJlbnQgd2l0aCBzaXplb2Yoc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcpLCBza2lwIHRoZQoJICogcGFyc2luZyBvZiBzZHZvIGRldmljZSBpbmZvCgkgKi8KCWlmIChwX2RlZnMtPmNoaWxkX2Rldl9zaXplICE9IHNpemVvZigqcF9jaGlsZCkpIHsKCQkvKiBkaWZmZXJlbnQgY2hpbGQgZGV2IHNpemUgLiBJZ25vcmUgaXQgKi8KCQlEUk1fREVCVUcoImRpZmZlcmVudCBjaGlsZCBzaXplIGlzIGZvdW5kLiBJbnZhbGlkLlxuIik7CgkJcmV0dXJuOwoJfQoJLyogZ2V0IHRoZSBibG9jayBzaXplIG9mIGdlbmVyYWwgZGVmaW5pdGlvbnMgKi8KCWJsb2NrX3B0ciA9ICh1MTYgKikoKGNoYXIgKilwX2RlZnMgLSAyKTsKCWJsb2NrX3NpemUgPSAqYmxvY2tfcHRyOwoJLyogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGQgZGV2aWNlICovCgljaGlsZF9kZXZpY2VfbnVtID0gKGJsb2NrX3NpemUgLSBzaXplb2YoKnBfZGVmcykpIC8KCQkJCXNpemVvZigqcF9jaGlsZCk7Cgljb3VudCA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgY2hpbGRfZGV2aWNlX251bTsgaSsrKSB7CgkJcF9jaGlsZCA9ICYocF9kZWZzLT5kZXZpY2VzW2ldKTsKCQlpZiAoIXBfY2hpbGQtPmRldmljZV90eXBlKSB7CgkJCS8qIHNraXAgdGhlIGRldmljZSBibG9jayBpZiBkZXZpY2UgdHlwZSBpcyBpbnZhbGlkICovCgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAocF9jaGlsZC0+c2xhdmVfYWRkciAhPSBTTEFWRV9BRERSMSAmJgoJCQlwX2NoaWxkLT5zbGF2ZV9hZGRyICE9IFNMQVZFX0FERFIyKSB7CgkJCS8qCgkJCSAqIElmIHRoZSBzbGF2ZSBhZGRyZXNzIGlzIG5laXRoZXIgMHg3MCBub3IgMHg3MiwKCQkJICogaXQgaXMgbm90IGEgU0RWTyBkZXZpY2UuIFNraXAgaXQuCgkJCSAqLwoJCQljb250aW51ZTsKCQl9CgkJaWYgKHBfY2hpbGQtPmR2b19wb3J0ICE9IERFVklDRV9QT1JUX0RWT0IgJiYKCQkJcF9jaGlsZC0+ZHZvX3BvcnQgIT0gREVWSUNFX1BPUlRfRFZPQykgewoJCQkvKiBza2lwIHRoZSBpbmNvcnJlY3QgU0RWTyBwb3J0ICovCgkJCURSTV9ERUJVRygiSW5jb3JyZWN0IFNEVk8gcG9ydC4gU2tpcCBpdCBcbiIpOwoJCQljb250aW51ZTsKCQl9CgkJRFJNX0RFQlVHKCJ0aGUgU0RWTyBkZXZpY2Ugd2l0aCBzbGF2ZSBhZGRyICUyeCBpcyBmb3VuZCBvbiAiCgkJCQkiJXMgcG9ydFxuIiwKCQkJCXBfY2hpbGQtPnNsYXZlX2FkZHIsCgkJCQkocF9jaGlsZC0+ZHZvX3BvcnQgPT0gREVWSUNFX1BPUlRfRFZPQikgPwoJCQkJCSJTRFZPQiIgOiAiU0RWT0MiKTsKCQlwX21hcHBpbmcgPSAmKGRldl9wcml2LT5zZHZvX21hcHBpbmdzW3BfY2hpbGQtPmR2b19wb3J0IC0gMV0pOwoJCWlmICghcF9tYXBwaW5nLT5pbml0aWFsaXplZCkgewoJCQlwX21hcHBpbmctPmR2b19wb3J0ID0gcF9jaGlsZC0+ZHZvX3BvcnQ7CgkJCXBfbWFwcGluZy0+c2xhdmVfYWRkciA9IHBfY2hpbGQtPnNsYXZlX2FkZHI7CgkJCXBfbWFwcGluZy0+ZHZvX3dpcmluZyA9IHBfY2hpbGQtPmR2b193aXJpbmc7CgkJCXBfbWFwcGluZy0+aW5pdGlhbGl6ZWQgPSAxOwoJCX0gZWxzZSB7CgkJCURSTV9ERUJVRygiTWF5YmUgb25lIFNEVk8gcG9ydCBpcyBzaGFyZWQgYnkgIgoJCQkJCSAidHdvIFNEVk8gZGV2aWNlLlxuIik7CgkJfQoJCWlmIChwX2NoaWxkLT5zbGF2ZTJfYWRkcikgewoJCQkvKiBNYXliZSB0aGlzIGlzIGEgU0RWTyBkZXZpY2Ugd2l0aCBtdWx0aXBsZSBpbnB1dHMgKi8KCQkJLyogQW5kIHRoZSBtYXBwaW5nIGluZm8gaXMgbm90IGFkZGVkICovCgkJCURSTV9ERUJVRygidGhlcmUgZXhpc3RzIHRoZSBzbGF2ZTJfYWRkci4gTWF5YmUgdGhpcyAiCgkJCQkiaXMgYSBTRFZPIGRldmljZSB3aXRoIG11bHRpcGxlIGlucHV0cy5cbiIpOwoJCX0KCQljb3VudCsrOwoJfQoKCWlmICghY291bnQpIHsKCQkvKiBObyBTRFZPIGRldmljZSBpbmZvIGlzIGZvdW5kICovCgkJRFJNX0RFQlVHKCJObyBTRFZPIGRldmljZSBpbmZvIGlzIGZvdW5kIGluIFZCVFxuIik7Cgl9CglyZXR1cm47Cn0KLyoqCiAqIGludGVsX2luaXRfYmlvcyAtIGluaXRpYWxpemUgVkJJT1Mgc2V0dGluZ3MgJiBmaW5kIFZCVAogKiBAZGV2OiBEUk0gZGV2aWNlCiAqCiAqIExvYWRzIHRoZSBWaWRlbyBCSU9TIGFuZCBjaGVja3MgdGhhdCB0aGUgVkJUIGV4aXN0cy4gIFNldHMgc2NyYXRjaCByZWdpc3RlcnMKICogdG8gYXBwcm9wcmlhdGUgdmFsdWVzLgogKgogKiBWQlQgZXhpc3RlbmNlIGlzIGEgc2FuaXR5IGNoZWNrIHRoYXQgaXMgcmVsaWVkIG9uIGJ5IG90aGVyIGk4MzBfYmlvcy5jIGNvZGUuCiAqIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gdXNlIGEgQklPUyBjYWxsIHRvIGdldCB0aGUgVkJULCBhcyBCSU9TZXMgbWF5CiAqIGZlZWQgYW4gdXBkYXRlZCBWQlQgYmFjayB0aHJvdWdoIHRoYXQsIGNvbXBhcmVkIHRvIHdoYXQgd2UnbGwgZmV0Y2ggdXNpbmcKICogdGhpcyBtZXRob2Qgb2YgZ3JvcGluZyBhcm91bmQgaW4gdGhlIEJJT1MgZGF0YS4KICoKICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZmFpbHVyZS4KICovCmJvb2wKaW50ZWxfaW5pdF9iaW9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKCXN0cnVjdCB2YnRfaGVhZGVyICp2YnQgPSBOVUxMOwoJc3RydWN0IGJkYl9oZWFkZXIgKmJkYjsKCXU4IF9faW9tZW0gKmJpb3M7CglzaXplX3Qgc2l6ZTsKCWludCBpOwoKCWJpb3MgPSBwY2lfbWFwX3JvbShwZGV2LCAmc2l6ZSk7CglpZiAoIWJpb3MpCgkJcmV0dXJuIC0xOwoKCS8qIFNjb3VyIG1lbW9yeSBsb29raW5nIGZvciB0aGUgVkJUIHNpZ25hdHVyZSAqLwoJZm9yIChpID0gMDsgaSArIDQgPCBzaXplOyBpKyspIHsKCQlpZiAoIW1lbWNtcChiaW9zICsgaSwgIiRWQlQiLCA0KSkgewoJCQl2YnQgPSAoc3RydWN0IHZidF9oZWFkZXIgKikoYmlvcyArIGkpOwoJCQlicmVhazsKCQl9Cgl9CgoJaWYgKCF2YnQpIHsKCQlEUk1fRVJST1IoIlZCVCBzaWduYXR1cmUgbWlzc2luZ1xuIik7CgkJcGNpX3VubWFwX3JvbShwZGV2LCBiaW9zKTsKCQlyZXR1cm4gLTE7Cgl9CgoJYmRiID0gKHN0cnVjdCBiZGJfaGVhZGVyICopKGJpb3MgKyBpICsgdmJ0LT5iZGJfb2Zmc2V0KTsKCgkvKiBHcmFiIHVzZWZ1bCBnZW5lcmFsIGRlZmluaXRpb25zICovCglwYXJzZV9nZW5lcmFsX2ZlYXR1cmVzKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfbGZwX3BhbmVsX2RhdGEoZGV2X3ByaXYsIGJkYik7CglwYXJzZV9zZHZvX3BhbmVsX2RhdGEoZGV2X3ByaXYsIGJkYik7CglwYXJzZV9zZHZvX2RldmljZV9tYXBwaW5nKGRldl9wcml2LCBiZGIpOwoJcGNpX3VubWFwX3JvbShwZGV2LCBiaW9zKTsKCglyZXR1cm4gMDsKfQo=