LyogR2VtVGVrIHJhZGlvIGNhcmQgZHJpdmVyIGZvciBMaW51eCAoQykgMTk5OCBKb25hcyBNdW5zaW4gPGptdW5zaW5AaWtpLmZpPgogKgogKiBHZW1UZWsgaGFzbid0IHJlbGVhc2VkIGFueSBzcGVjcyBvbiB0aGUgY2FyZCwgc28gdGhlIHByb3RvY29sIGhhZCB0bwogKiBiZSByZXZlcnNlIGVuZ2luZWVyZWQgd2l0aCBkb3NlbXUuCiAqCiAqIEJlc2lkZXMgdGhlIHByb3RvY29sIGNoYW5nZXMsIHRoaXMgaXMgbW9zdGx5IGEgY29weSBvZjoKICoKICogICAgUmFkaW9UcmFjayBJSSBkcml2ZXIgZm9yIExpbnV4IHJhZGlvIHN1cHBvcnQgKEMpIDE5OTggQmVuIFBmYWZmCiAqCiAqICAgIEJhc2VkIG9uIFJhZGlvVHJhY2sgSS9SYWRpb1JldmVhbCAoQykgMTk5NyBNLiBLaXJrd29vZAogKiAgICBDb252ZXJ0ZWQgdG8gbmV3IEFQSSBieSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogKiAgICBWYXJpb3VzIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMgYnkgUnVzc2VsbCBLcm9sbCA8cmtyb2xsQGV4cGxvaXRzLm9yZz4KICoKICogVE9ETzogQWxsb3cgZm9yIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UgZm9vbGlzaCBlbnRpdGllcyA6LSkKICoKICogQ29udmVydGVkIHRvIFY0TDIgQVBJIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogTW9kdWxlcyAJCQkqLwojaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogSW5pdGRhdGEJCQkqLwojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIHJlcXVlc3RfcmVnaW9uCQkqLwojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogdWRlbGF5CQkJKi8KI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPCSovCiNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgojaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgoKI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDMpCgovKgogKiBNb2R1bGUgaW5mby4KICovCgpNT0RVTEVfQVVUSE9SKCJKb25hcyBNdW5zaW4sIFBla2thIFNlcHDkbmVuIDxwZXh1QGthcHNpLmZpPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgR2VtVGVrIFJhZGlvIGNhcmQuIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCi8qCiAqIE1vZHVsZSBwYXJhbXMuCiAqLwoKI2lmbmRlZiBDT05GSUdfUkFESU9fR0VNVEVLX1BPUlQKI2RlZmluZSBDT05GSUdfUkFESU9fR0VNVEVLX1BPUlQgLTEKI2VuZGlmCiNpZm5kZWYgQ09ORklHX1JBRElPX0dFTVRFS19QUk9CRQojZGVmaW5lIENPTkZJR19SQURJT19HRU1URUtfUFJPQkUgMQojZW5kaWYKCnN0YXRpYyBpbnQgaW8JCT0gQ09ORklHX1JBRElPX0dFTVRFS19QT1JUOwpzdGF0aWMgaW50IHByb2JlCT0gQ09ORklHX1JBRElPX0dFTVRFS19QUk9CRTsKc3RhdGljIGludCBoYXJkbXV0ZTsKc3RhdGljIGludCBzaHV0ZG93bgk9IDE7CnN0YXRpYyBpbnQga2VlcG11dGVkCT0gMTsKc3RhdGljIGludCBpbml0bXV0ZQk9IDE7CnN0YXRpYyBpbnQgcmFkaW9fbnIJPSAtMTsKCm1vZHVsZV9wYXJhbShpbywgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhpbywgIkZvcmNlIEkvTyBwb3J0IGZvciB0aGUgR2VtVGVrIFJhZGlvIGNhcmQgaWYgYXV0b21hdGljICIKCSAicHJvYmluZyBpcyBkaXNhYmxlZCBvciBmYWlscy4gVGhlIG1vc3QgY29tbW9uIEkvTyBwb3J0cyBhcmU6IDB4MjBjICIKCSAiMHgzMGMsIDB4MjRjIG9yIDB4MzRjICgweDIwYywgMHgyNDggYW5kIDB4MjhjIGhhdmUgYmVlbiByZXBvcnRlZCB0byAiCgkgIndvcmsgZm9yIHRoZSBjb21iaW5lZCBzb3VuZC9yYWRpb2NhcmQpLiIpOwoKbW9kdWxlX3BhcmFtKHByb2JlLCBib29sLCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhwcm9iZSwgIkVuYWJsZSBhdXRvbWF0aWMgZGV2aWNlIHByb2JpbmcuIE5vdGU6IG9ubHkgdGhlIG1vc3QgIgoJImNvbW1vbiBJL08gcG9ydHMgdXNlZCBieSB0aGUgY2FyZCBhcmUgcHJvYmVkLiIpOwoKbW9kdWxlX3BhcmFtKGhhcmRtdXRlLCBib29sLCAwNjQ0KTsKTU9EVUxFX1BBUk1fREVTQyhoYXJkbXV0ZSwgIkVuYWJsZSBgaGFyZCBtdXRpbmcnIGJ5IHNodXR0aW5nIGRvd24gUExMLCBtYXkgIgoJICJyZWR1Y2Ugc3RhdGljIG5vaXNlLiIpOwoKbW9kdWxlX3BhcmFtKHNodXRkb3duLCBib29sLCAwNjQ0KTsKTU9EVUxFX1BBUk1fREVTQyhzaHV0ZG93biwgIkVuYWJsZSBzaHV0dGluZyBkb3duIFBMTCBhbmQgbXV0aW5nIGxpbmUgd2hlbiAiCgkgIm1vZHVsZSBpcyB1bmxvYWRlZC4iKTsKCm1vZHVsZV9wYXJhbShrZWVwbXV0ZWQsIGJvb2wsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGtlZXBtdXRlZCwgIktlZXAgY2FyZCBtdXRlZCBldmVuIHdoZW4gZnJlcXVlbmN5IGlzIGNoYW5nZWQuIik7Cgptb2R1bGVfcGFyYW0oaW5pdG11dGUsIGJvb2wsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGluaXRtdXRlLCAiTXV0ZSBjYXJkIHdoZW4gbW9kdWxlIGlzIGxvYWRlZC4iKTsKCm1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwNDQ0KTsKCi8qCiAqIEZ1bmN0aW9ucyBmb3IgY29udHJvbGxpbmcgdGhlIGNhcmQuCiAqLwojZGVmaW5lIEdFTVRFS19MT1dGUkVRCSg4NyoxNjAwMCkKI2RlZmluZSBHRU1URUtfSElHSEZSRVEJKDEwOCoxNjAwMCkKCi8qCiAqIEZyZXF1ZW5jeSBjYWxjdWxhdGlvbiBjb25zdGFudHMuICBJbnRlcm1lZGlhdGUgZnJlcXVlbmN5IDEwLjUyIE1IeiAobm9taW5hbAogKiB2YWx1ZSAxMC43IE1IeiksIHJlZmVyZW5jZSBkaXZpc29yIDYuMzkga0h6IChub21pbmFsIDYuMjUga0h6KS4KICovCiNkZWZpbmUgRlNDQUxFCQk4CiNkZWZpbmUgSUZfT0ZGU0VUCSgodW5zaWduZWQgaW50KSgxMC41MiAqIDE2MDAwICogKDE8PEZTQ0FMRSkpKQojZGVmaW5lIFJFRl9GUkVRCSgodW5zaWduZWQgaW50KSg2LjM5ICogMTYgKiAoMTw8RlNDQUxFKSkpCgojZGVmaW5lIEdFTVRFS19DSwkJMHgwMQkvKiBDbG9jayBzaWduYWwJCQkqLwojZGVmaW5lIEdFTVRFS19EQQkJMHgwMgkvKiBTZXJpYWwgZGF0YQkJCSovCiNkZWZpbmUgR0VNVEVLX0NFCQkweDA0CS8qIENoaXAgZW5hYmxlCQkJKi8KI2RlZmluZSBHRU1URUtfTlMJCTB4MDgJLyogTm8gc2lnbmFsCQkJKi8KI2RlZmluZSBHRU1URUtfTVQJCTB4MTAJLyogTGluZSBtdXRlCQkJKi8KI2RlZmluZSBHRU1URUtfU1RERl8zXzEyNV9LSFoJMHgwMQkvKiBTdGFuZGFyZCBmcmVxdWVuY3kgMy4xMjUga0h6CSovCiNkZWZpbmUgR0VNVEVLX1BMTF9PRkYJCTB4MDcJLyogUExMIG9mZgkJCSovCgojZGVmaW5lIEJVMjYxNF9CVVNfU0laRQkzMgkvKiBCVTI2MTQgLyBCVTI2MTRGUyBidXMgc2l6ZQkJKi8KCiNkZWZpbmUgU0hPUlRfREVMQVkgNQkJLyogdXNlYyAqLwojZGVmaW5lIExPTkdfREVMQVkgNzUJCS8qIHVzZWMgKi8KCnN0cnVjdCBnZW10ZWsgewoJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwoJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OwoJc3RydWN0IG11dGV4IGxvY2s7Cgl1bnNpZ25lZCBsb25nIGxhc3RmcmVxOwoJaW50IG11dGVkOwoJaW50IHZlcmlmaWVkOwoJaW50IGlvOwoJdTMyIGJ1MjYxNGRhdGE7Cn07CgpzdGF0aWMgc3RydWN0IGdlbXRlayBnZW10ZWtfY2FyZDsKCiNkZWZpbmUgQlUyNjE0X0ZSRVFfQklUUyAJMTYgLyogRDAuLkQxNSwgRnJlcXVlbmN5IGRhdGEJCSovCiNkZWZpbmUgQlUyNjE0X1BPUlRfQklUUwkzIC8qIFAwLi5QMiwgT3V0cHV0IHBvcnQgY29udHJvbCBkYXRhCSovCiNkZWZpbmUgQlUyNjE0X1ZPSURfQklUUwk0IC8qIHVudXNlZCAJCQkJKi8KI2RlZmluZSBCVTI2MTRfRk1FU19CSVRTCTEgLyogQ1QsIEZyZXF1ZW5jeSBtZWFzdXJlbWVudCBiZWdpbm5pbmcgZGF0YSAqLwojZGVmaW5lIEJVMjYxNF9TVERGX0JJVFMJMyAvKiBSMC4uUjIsIFN0YW5kYXJkIGZyZXF1ZW5jeSBkYXRhCSovCiNkZWZpbmUgQlUyNjE0X1NXSU5fQklUUwkxIC8qIFMsIFN3aXRjaCBiZXR3ZWVuIEZNSU4gLyBBTUlOCSovCiNkZWZpbmUgQlUyNjE0X1NXQUxfQklUUyAgICAgICAgMSAvKiBQUywgU3dhbGxvdyBjb3VudGVyIGRpdmlzaW9uIChBTUlOIG9ubHkpKi8KI2RlZmluZSBCVTI2MTRfVk9JRDJfQklUUwkxIC8qIHVudXNlZAkJCQkqLwojZGVmaW5lIEJVMjYxNF9GTVVOX0JJVFMJMSAvKiBHVCwgRnJlcXVlbmN5IG1lYXN1cmVtZW50IHRpbWUgJiB1bmxvY2sgKi8KI2RlZmluZSBCVTI2MTRfVEVTVF9CSVRTCTEgLyogVFMsIFRlc3QgZGF0YSBpcyBpbnB1dAkJKi8KCiNkZWZpbmUgQlUyNjE0X0ZSRVFfU0hJRlQgCTAKI2RlZmluZSBCVTI2MTRfUE9SVF9TSElGVAkoQlUyNjE0X0ZSRVFfQklUUyArIEJVMjYxNF9GUkVRX1NISUZUKQojZGVmaW5lIEJVMjYxNF9WT0lEX1NISUZUCShCVTI2MTRfUE9SVF9CSVRTICsgQlUyNjE0X1BPUlRfU0hJRlQpCiNkZWZpbmUgQlUyNjE0X0ZNRVNfU0hJRlQJKEJVMjYxNF9WT0lEX0JJVFMgKyBCVTI2MTRfVk9JRF9TSElGVCkKI2RlZmluZSBCVTI2MTRfU1RERl9TSElGVAkoQlUyNjE0X0ZNRVNfQklUUyArIEJVMjYxNF9GTUVTX1NISUZUKQojZGVmaW5lIEJVMjYxNF9TV0lOX1NISUZUCShCVTI2MTRfU1RERl9CSVRTICsgQlUyNjE0X1NUREZfU0hJRlQpCiNkZWZpbmUgQlUyNjE0X1NXQUxfU0hJRlQJKEJVMjYxNF9TV0lOX0JJVFMgKyBCVTI2MTRfU1dJTl9TSElGVCkKI2RlZmluZSBCVTI2MTRfVk9JRDJfU0hJRlQJKEJVMjYxNF9TV0FMX0JJVFMgKyBCVTI2MTRfU1dBTF9TSElGVCkKI2RlZmluZSBCVTI2MTRfRk1VTl9TSElGVAkoQlUyNjE0X1ZPSUQyX0JJVFMgKyBCVTI2MTRfVk9JRDJfU0hJRlQpCiNkZWZpbmUgQlUyNjE0X1RFU1RfU0hJRlQJKEJVMjYxNF9GTVVOX0JJVFMgKyBCVTI2MTRfRk1VTl9TSElGVCkKCiNkZWZpbmUgTUtNQVNLKGZpZWxkKQkoKCgxPDxCVTI2MTRfIyNmaWVsZCMjX0JJVFMpIC0gMSkgPDwgXAoJCQlCVTI2MTRfIyNmaWVsZCMjX1NISUZUKQojZGVmaW5lIEJVMjYxNF9QT1JUX01BU0sJTUtNQVNLKFBPUlQpCiNkZWZpbmUgQlUyNjE0X0ZSRVFfTUFTSwlNS01BU0soRlJFUSkKI2RlZmluZSBCVTI2MTRfVk9JRF9NQVNLCU1LTUFTSyhWT0lEKQojZGVmaW5lIEJVMjYxNF9GTUVTX01BU0sJTUtNQVNLKEZNRVMpCiNkZWZpbmUgQlUyNjE0X1NUREZfTUFTSwlNS01BU0soU1RERikKI2RlZmluZSBCVTI2MTRfU1dJTl9NQVNLCU1LTUFTSyhTV0lOKQojZGVmaW5lIEJVMjYxNF9TV0FMX01BU0sJTUtNQVNLKFNXQUwpCiNkZWZpbmUgQlUyNjE0X1ZPSUQyX01BU0sJTUtNQVNLKFZPSUQyKQojZGVmaW5lIEJVMjYxNF9GTVVOX01BU0sJTUtNQVNLKEZNVU4pCiNkZWZpbmUgQlUyNjE0X1RFU1RfTUFTSwlNS01BU0soVEVTVCkKCi8qCiAqIFNldCBkYXRhIHdoaWNoIHdpbGwgYmUgc2VudCB0byBCVTI2MTRGUy4KICovCiNkZWZpbmUgZ2VtdGVrX2J1MjYxNF9zZXQoZGV2LCBmaWVsZCwgZGF0YSkgKChkZXYpLT5idTI2MTRkYXRhID0gXAoJKChkZXYpLT5idTI2MTRkYXRhICYgfmZpZWxkIyNfTUFTSykgfCAoKGRhdGEpIDw8IGZpZWxkIyNfU0hJRlQpKQoKLyoKICogVHJhbnNtaXQgc2V0dGluZ3MgdG8gQlUyNjE0RlMgb3ZlciBHZW1UZWsgSUMuCiAqLwpzdGF0aWMgdm9pZCBnZW10ZWtfYnUyNjE0X3RyYW5zbWl0KHN0cnVjdCBnZW10ZWsgKmd0KQp7CglpbnQgaSwgYml0LCBxLCBtdXRlOwoKCW11dGV4X2xvY2soJmd0LT5sb2NrKTsKCgltdXRlID0gZ3QtPm11dGVkID8gR0VNVEVLX01UIDogMHgwMDsKCglvdXRiX3AobXV0ZSB8IEdFTVRFS19EQSB8IEdFTVRFS19DSywgZ3QtPmlvKTsKCXVkZWxheShTSE9SVF9ERUxBWSk7CglvdXRiX3AobXV0ZSB8IEdFTVRFS19DRSB8IEdFTVRFS19EQSB8IEdFTVRFS19DSywgZ3QtPmlvKTsKCXVkZWxheShMT05HX0RFTEFZKTsKCglmb3IgKGkgPSAwLCBxID0gZ3QtPmJ1MjYxNGRhdGE7IGkgPCAzMjsgaSsrLCBxID4+PSAxKSB7CgkJYml0ID0gKHEgJiAxKSA/IEdFTVRFS19EQSA6IDA7CgkJb3V0Yl9wKG11dGUgfCBHRU1URUtfQ0UgfCBiaXQsIGd0LT5pbyk7CgkJdWRlbGF5KFNIT1JUX0RFTEFZKTsKCQlvdXRiX3AobXV0ZSB8IEdFTVRFS19DRSB8IGJpdCB8IEdFTVRFS19DSywgZ3QtPmlvKTsKCQl1ZGVsYXkoU0hPUlRfREVMQVkpOwoJfQoKCW91dGJfcChtdXRlIHwgR0VNVEVLX0RBIHwgR0VNVEVLX0NLLCBndC0+aW8pOwoJdWRlbGF5KFNIT1JUX0RFTEFZKTsKCW91dGJfcChtdXRlIHwgR0VNVEVLX0NFIHwgR0VNVEVLX0RBIHwgR0VNVEVLX0NLLCBndC0+aW8pOwoJdWRlbGF5KExPTkdfREVMQVkpOwoKCW11dGV4X3VubG9jaygmZ3QtPmxvY2spOwp9CgovKgogKiBDYWxjdWxhdGUgZGl2aXNvciBmcm9tIEZNLWZyZXF1ZW5jeSBmb3IgQlUyNjE0RlMgKDMuMTI1IEtIeiBTVERGIGV4cGVjdGVkKS4KICovCnN0YXRpYyB1bnNpZ25lZCBsb25nIGdlbXRla19jb252ZnJlcSh1bnNpZ25lZCBsb25nIGZyZXEpCnsKCXJldHVybiAoKGZyZXE8PEZTQ0FMRSkgKyBJRl9PRkZTRVQgKyBSRUZfRlJFUS8yKSAvIFJFRl9GUkVROwp9CgovKgogKiBTZXQgRk0tZnJlcXVlbmN5LgogKi8Kc3RhdGljIHZvaWQgZ2VtdGVrX3NldGZyZXEoc3RydWN0IGdlbXRlayAqZ3QsIHVuc2lnbmVkIGxvbmcgZnJlcSkKewoJaWYgKGtlZXBtdXRlZCAmJiBoYXJkbXV0ZSAmJiBndC0+bXV0ZWQpCgkJcmV0dXJuOwoKCWZyZXEgPSBjbGFtcF92YWwoZnJlcSwgR0VNVEVLX0xPV0ZSRVEsIEdFTVRFS19ISUdIRlJFUSk7CgoJZ3QtPmxhc3RmcmVxID0gZnJlcTsKCWd0LT5tdXRlZCA9IDA7CgoJZ2VtdGVrX2J1MjYxNF9zZXQoZ3QsIEJVMjYxNF9QT1JULCAwKTsKCWdlbXRla19idTI2MTRfc2V0KGd0LCBCVTI2MTRfRk1FUywgMCk7CglnZW10ZWtfYnUyNjE0X3NldChndCwgQlUyNjE0X1NXSU4sIDApOwkvKiBGTS1tb2RlCSovCglnZW10ZWtfYnUyNjE0X3NldChndCwgQlUyNjE0X1NXQUwsIDApOwoJZ2VtdGVrX2J1MjYxNF9zZXQoZ3QsIEJVMjYxNF9GTVVOLCAxKTsJLyogR1QgYml0IHNldAkqLwoJZ2VtdGVrX2J1MjYxNF9zZXQoZ3QsIEJVMjYxNF9URVNULCAwKTsKCglnZW10ZWtfYnUyNjE0X3NldChndCwgQlUyNjE0X1NUREYsIEdFTVRFS19TVERGXzNfMTI1X0tIWik7CglnZW10ZWtfYnUyNjE0X3NldChndCwgQlUyNjE0X0ZSRVEsIGdlbXRla19jb252ZnJlcShmcmVxKSk7CgoJZ2VtdGVrX2J1MjYxNF90cmFuc21pdChndCk7Cn0KCi8qCiAqIFNldCBtdXRlIGZsYWcuCiAqLwpzdGF0aWMgdm9pZCBnZW10ZWtfbXV0ZShzdHJ1Y3QgZ2VtdGVrICpndCkKewoJaW50IGk7CgoJZ3QtPm11dGVkID0gMTsKCglpZiAoaGFyZG11dGUpIHsKCQkvKiBUdXJuIG9mZiBQTEwsIGRpc2FibGUgZGF0YSBvdXRwdXQgKi8KCQlnZW10ZWtfYnUyNjE0X3NldChndCwgQlUyNjE0X1BPUlQsIDApOwoJCWdlbXRla19idTI2MTRfc2V0KGd0LCBCVTI2MTRfRk1FUywgMCk7CS8qIENUIGJpdCBvZmYJKi8KCQlnZW10ZWtfYnUyNjE0X3NldChndCwgQlUyNjE0X1NXSU4sIDApOwkvKiBGTS1tb2RlCSovCgkJZ2VtdGVrX2J1MjYxNF9zZXQoZ3QsIEJVMjYxNF9TV0FMLCAwKTsKCQlnZW10ZWtfYnUyNjE0X3NldChndCwgQlUyNjE0X0ZNVU4sIDApOwkvKiBHVCBiaXQgb2ZmCSovCgkJZ2VtdGVrX2J1MjYxNF9zZXQoZ3QsIEJVMjYxNF9URVNULCAwKTsKCQlnZW10ZWtfYnUyNjE0X3NldChndCwgQlUyNjE0X1NUREYsIEdFTVRFS19QTExfT0ZGKTsKCQlnZW10ZWtfYnUyNjE0X3NldChndCwgQlUyNjE0X0ZSRVEsIDApOwoJCWdlbXRla19idTI2MTRfdHJhbnNtaXQoZ3QpOwoJCXJldHVybjsKCX0KCgltdXRleF9sb2NrKCZndC0+bG9jayk7CgoJLyogUmVhZCBidXMgY29udGVudHMgKENFLCBDSyBhbmQgREEpLiAqLwoJaSA9IGluYl9wKGd0LT5pbyk7CgkvKiBXcml0ZSBpdCBiYWNrIHdpdGggbXV0ZSBmbGFnIHNldC4gKi8KCW91dGJfcCgoaSA+PiA1KSB8IEdFTVRFS19NVCwgZ3QtPmlvKTsKCXVkZWxheShTSE9SVF9ERUxBWSk7CgoJbXV0ZXhfdW5sb2NrKCZndC0+bG9jayk7Cn0KCi8qCiAqIFVuc2V0IG11dGUgZmxhZy4KICovCnN0YXRpYyB2b2lkIGdlbXRla191bm11dGUoc3RydWN0IGdlbXRlayAqZ3QpCnsKCWludCBpOwoKCWd0LT5tdXRlZCA9IDA7CglpZiAoaGFyZG11dGUpIHsKCQkvKiBUdXJuIFBMTCBiYWNrIG9uLiAqLwoJCWdlbXRla19zZXRmcmVxKGd0LCBndC0+bGFzdGZyZXEpOwoJCXJldHVybjsKCX0KCW11dGV4X2xvY2soJmd0LT5sb2NrKTsKCglpID0gaW5iX3AoZ3QtPmlvKTsKCW91dGJfcChpID4+IDUsIGd0LT5pbyk7Cgl1ZGVsYXkoU0hPUlRfREVMQVkpOwoKCW11dGV4X3VubG9jaygmZ3QtPmxvY2spOwp9CgovKgogKiBHZXQgc2lnbmFsIHN0cmVuZ3RoICg9IHN0ZXJlbyBzdGF0dXMpLgogKi8Kc3RhdGljIGlubGluZSBpbnQgZ2VtdGVrX2dldHNpZ3N0cihzdHJ1Y3QgZ2VtdGVrICpndCkKewoJaW50IHNpZzsKCgltdXRleF9sb2NrKCZndC0+bG9jayk7CglzaWcgPSBpbmJfcChndC0+aW8pICYgR0VNVEVLX05TID8gMCA6IDE7CgltdXRleF91bmxvY2soJmd0LT5sb2NrKTsKCXJldHVybiBzaWc7Cn0KCi8qCiAqIENoZWNrIGlmIHJlcXVlc3RlZCBjYXJkIGFjdHMgbGlrZSBHZW1UZWsgUmFkaW8gY2FyZC4KICovCnN0YXRpYyBpbnQgZ2VtdGVrX3ZlcmlmeShzdHJ1Y3QgZ2VtdGVrICpndCwgaW50IHBvcnQpCnsKCWludCBpLCBxOwoKCWlmIChndC0+dmVyaWZpZWQgPT0gcG9ydCkKCQlyZXR1cm4gMTsKCgltdXRleF9sb2NrKCZndC0+bG9jayk7CgoJcSA9IGluYl9wKHBvcnQpOwkvKiBSZWFkIGJ1cyBjb250ZW50cyBiZWZvcmUgcHJvYmluZy4gKi8KCS8qIFRyeSB0byB0dXJuIG9uIENFLCBDSyBhbmQgREEgcmVzcGVjdGl2ZWx5IGFuZCBjaGVjayBpZiBjYXJkIHJlc3BvbmRzCgkgICBwcm9wZXJseS4gKi8KCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKCQlvdXRiX3AoMSA8PCBpLCBwb3J0KTsKCQl1ZGVsYXkoU0hPUlRfREVMQVkpOwoKCQlpZiAoKGluYl9wKHBvcnQpICYgKH5HRU1URUtfTlMpKSAhPSAoMHgxNyB8ICgxIDw8IChpICsgNSkpKSkgewoJCQltdXRleF91bmxvY2soJmd0LT5sb2NrKTsKCQkJcmV0dXJuIDA7CgkJfQoJfQoJb3V0Yl9wKHEgPj4gNSwgcG9ydCk7CS8qIFdyaXRlIGJ1cyBjb250ZW50cyBiYWNrLiAqLwoJdWRlbGF5KFNIT1JUX0RFTEFZKTsKCgltdXRleF91bmxvY2soJmd0LT5sb2NrKTsKCWd0LT52ZXJpZmllZCA9IHBvcnQ7CgoJcmV0dXJuIDE7Cn0KCi8qCiAqIEF1dG9tYXRpYyBwcm9iaW5nIGZvciBjYXJkLgogKi8Kc3RhdGljIGludCBnZW10ZWtfcHJvYmUoc3RydWN0IGdlbXRlayAqZ3QpCnsKCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSAmZ3QtPnY0bDJfZGV2OwoJaW50IGlvcG9ydHNbXSA9IHsgMHgyMGMsIDB4MzBjLCAweDI0YywgMHgzNGMsIDB4MjQ4LCAweDI4YyB9OwoJaW50IGk7CgoJaWYgKCFwcm9iZSkgewoJCXY0bDJfaW5mbyh2NGwyX2RldiwgIkF1dG9tYXRpYyBkZXZpY2UgcHJvYmluZyBkaXNhYmxlZC5cbiIpOwoJCXJldHVybiAtMTsKCX0KCgl2NGwyX2luZm8odjRsMl9kZXYsICJBdXRvbWF0aWMgZGV2aWNlIHByb2JpbmcgZW5hYmxlZC5cbiIpOwoKCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlvcG9ydHMpOyArK2kpIHsKCQl2NGwyX2luZm8odjRsMl9kZXYsICJUcnlpbmcgSS9PIHBvcnQgMHgleC4uLlxuIiwgaW9wb3J0c1tpXSk7CgoJCWlmICghcmVxdWVzdF9yZWdpb24oaW9wb3J0c1tpXSwgMSwgImdlbXRlay1wcm9iZSIpKSB7CgkJCXY0bDJfd2Fybih2NGwyX2RldiwgIkkvTyBwb3J0IDB4JXggYnVzeSFcbiIsCgkJCSAgICAgICBpb3BvcnRzW2ldKTsKCQkJY29udGludWU7CgkJfQoKCQlpZiAoZ2VtdGVrX3ZlcmlmeShndCwgaW9wb3J0c1tpXSkpIHsKCQkJdjRsMl9pbmZvKHY0bDJfZGV2LCAiQ2FyZCBmb3VuZCBmcm9tIEkvTyBwb3J0ICIKCQkJICAgICAgICIweCV4IVxuIiwgaW9wb3J0c1tpXSk7CgoJCQlyZWxlYXNlX3JlZ2lvbihpb3BvcnRzW2ldLCAxKTsKCQkJZ3QtPmlvID0gaW9wb3J0c1tpXTsKCQkJcmV0dXJuIGd0LT5pbzsKCQl9CgoJCXJlbGVhc2VfcmVnaW9uKGlvcG9ydHNbaV0sIDEpOwoJfQoKCXY0bDJfZXJyKHY0bDJfZGV2LCAiQXV0b21hdGljIHByb2JpbmcgZmFpbGVkIVxuIik7CglyZXR1cm4gLTE7Cn0KCi8qCiAqIFZpZGVvIDQgTGludXggc3R1ZmYuCiAqLwpzdGF0aWMgaW50IGdlbXRla19vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBnZW10ZWtfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgZ2VtdGVrX2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkub3BlbgkJPSBnZW10ZWtfb3BlbiwKCS5yZWxlYXNlCT0gZ2VtdGVrX3JlbGVhc2UsCgkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAp9OwoKc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCgkJCSAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYpCnsKCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tZ2VtdGVrIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwoJc3RybGNweSh2LT5jYXJkLCAiR2VtVGVrIiwgc2l6ZW9mKHYtPmNhcmQpKTsKCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwoJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl90dW5lciAqdikKewoJc3RydWN0IGdlbXRlayAqZ3QgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwoKCWlmICh2LT5pbmRleCA+IDApCgkJcmV0dXJuIC1FSU5WQUw7CgoJc3RybGNweSh2LT5uYW1lLCAiRk0iLCBzaXplb2Yodi0+bmFtZSkpOwoJdi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Cgl2LT5yYW5nZWxvdyA9IEdFTVRFS19MT1dGUkVROwoJdi0+cmFuZ2VoaWdoID0gR0VNVEVLX0hJR0hGUkVROwoJdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVyB8IFY0TDJfVFVORVJfQ0FQX1NURVJFTzsKCXYtPnNpZ25hbCA9IDB4ZmZmZiAqIGdlbXRla19nZXRzaWdzdHIoZ3QpOwoJaWYgKHYtPnNpZ25hbCkgewoJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwoJCXYtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87Cgl9IGVsc2UgewoJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKCQl2LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl90dW5lciAqdikKewoJcmV0dXJuICh2LT5pbmRleCAhPSAwKSA/IC1FSU5WQUwgOiAwOwp9CgpzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKCQkJICAgICAgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQp7CglzdHJ1Y3QgZ2VtdGVrICpndCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CgoJaWYgKGYtPnR1bmVyICE9IDApCgkJcmV0dXJuIC1FSU5WQUw7CglmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKCWYtPmZyZXF1ZW5jeSA9IGd0LT5sYXN0ZnJlcTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKCQkJICAgICAgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQp7CglzdHJ1Y3QgZ2VtdGVrICpndCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CgoJaWYgKGYtPnR1bmVyICE9IDAgfHwgZi0+dHlwZSAhPSBWNEwyX1RVTkVSX1JBRElPKQoJCXJldHVybiAtRUlOVkFMOwoJZ2VtdGVrX3NldGZyZXEoZ3QsIGYtPmZyZXF1ZW5jeSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAoJCQkgICAgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKewoJc3dpdGNoIChxYy0+aWQpIHsKCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDEsIDEsIDApOwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAoJCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKewoJc3RydWN0IGdlbXRlayAqZ3QgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwoKCXN3aXRjaCAoY3RybC0+aWQpIHsKCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKCQljdHJsLT52YWx1ZSA9IGd0LT5tdXRlZDsKCQlyZXR1cm4gMDsKCX0KCXJldHVybiAtRUlOVkFMOwp9CgpzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCgkJCSBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQp7CglzdHJ1Y3QgZ2VtdGVrICpndCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CgoJc3dpdGNoIChjdHJsLT5pZCkgewoJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgoJCWlmIChjdHJsLT52YWx1ZSkKCQkJZ2VtdGVrX211dGUoZ3QpOwoJCWVsc2UKCQkJZ2VtdGVrX3VubXV0ZShndCk7CgkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gLUVJTlZBTDsKfQoKc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQp7CgkqaSA9IDA7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCnsKCXJldHVybiAoaSAhPSAwKSA/IC1FSU5WQUwgOiAwOwp9CgpzdGF0aWMgaW50IHZpZGlvY19nX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKewoJYS0+aW5kZXggPSAwOwoJc3RybGNweShhLT5uYW1lLCAiUmFkaW8iLCBzaXplb2YoYS0+bmFtZSkpOwoJYS0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKewoJcmV0dXJuIChhLT5pbmRleCAhPSAwKSA/IC1FSU5WQUwgOiAwOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIGdlbXRla19pb2N0bF9vcHMgPSB7CgkudmlkaW9jX3F1ZXJ5Y2FwCT0gdmlkaW9jX3F1ZXJ5Y2FwLAoJLnZpZGlvY19nX3R1bmVyCQk9IHZpZGlvY19nX3R1bmVyLAoJLnZpZGlvY19zX3R1bmVyCQk9IHZpZGlvY19zX3R1bmVyLAoJLnZpZGlvY19nX2F1ZGlvCQk9IHZpZGlvY19nX2F1ZGlvLAoJLnZpZGlvY19zX2F1ZGlvCQk9IHZpZGlvY19zX2F1ZGlvLAoJLnZpZGlvY19nX2lucHV0CQk9IHZpZGlvY19nX2lucHV0LAoJLnZpZGlvY19zX2lucHV0CQk9IHZpZGlvY19zX2lucHV0LAoJLnZpZGlvY19nX2ZyZXF1ZW5jeQk9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKCS52aWRpb2Nfc19mcmVxdWVuY3kJPSB2aWRpb2Nfc19mcmVxdWVuY3ksCgkudmlkaW9jX3F1ZXJ5Y3RybAk9IHZpZGlvY19xdWVyeWN0cmwsCgkudmlkaW9jX2dfY3RybAkJPSB2aWRpb2NfZ19jdHJsLAoJLnZpZGlvY19zX2N0cmwJCT0gdmlkaW9jX3NfY3RybAp9OwoKLyoKICogSW5pdGlhbGl6YXRpb24gLyBjbGVhbnVwIHJlbGF0ZWQgc3R1ZmYuCiAqLwoKc3RhdGljIGludCBfX2luaXQgZ2VtdGVrX2luaXQodm9pZCkKewoJc3RydWN0IGdlbXRlayAqZ3QgPSAmZ2VtdGVrX2NhcmQ7CglzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gJmd0LT52NGwyX2RldjsKCWludCByZXM7CgoJc3RybGNweSh2NGwyX2Rldi0+bmFtZSwgImdlbXRlayIsIHNpemVvZih2NGwyX2Rldi0+bmFtZSkpOwoKCXY0bDJfaW5mbyh2NGwyX2RldiwgIkdlbVRlayBSYWRpbyBjYXJkIGRyaXZlcjogdjAuMC4zXG4iKTsKCgltdXRleF9pbml0KCZndC0+bG9jayk7CgoJZ3QtPnZlcmlmaWVkID0gLTE7CglndC0+aW8gPSBpbzsKCWdlbXRla19wcm9iZShndCk7CglpZiAoZ3QtPmlvKSB7CgkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihndC0+aW8sIDEsICJnZW10ZWsiKSkgewoJCQl2NGwyX2Vycih2NGwyX2RldiwgIkkvTyBwb3J0IDB4JXggYWxyZWFkeSBpbiB1c2UuXG4iLCBndC0+aW8pOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCgkJaWYgKCFnZW10ZWtfdmVyaWZ5KGd0LCBndC0+aW8pKQoJCQl2NGwyX3dhcm4odjRsMl9kZXYsICJDYXJkIGF0IEkvTyBwb3J0IDB4JXggZG9lcyBub3QgIgoJCQkgICAgICAgInJlc3BvbmQgcHJvcGVybHksIGNoZWNrIHlvdXIgIgoJCQkgICAgICAgImNvbmZpZ3VyYXRpb24uXG4iLCBndC0+aW8pOwoJCWVsc2UKCQkJdjRsMl9pbmZvKHY0bDJfZGV2LCAiVXNpbmcgSS9PIHBvcnQgMHgleC5cbiIsIGd0LT5pbyk7Cgl9IGVsc2UgaWYgKHByb2JlKSB7CgkJdjRsMl9lcnIodjRsMl9kZXYsICJBdXRvbWF0aWMgcHJvYmluZyBmYWlsZWQgYW5kIG5vICIKCQkgICAgICAgImZpeGVkIEkvTyBwb3J0IGRlZmluZWQuXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0gZWxzZSB7CgkJdjRsMl9lcnIodjRsMl9kZXYsICJBdXRvbWF0aWMgcHJvYmluZyBkaXNhYmxlZCBidXQgbm8gZml4ZWQgIgoJCSAgICAgICAiSS9PIHBvcnQgZGVmaW5lZC4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglyZXMgPSB2NGwyX2RldmljZV9yZWdpc3RlcihOVUxMLCB2NGwyX2Rldik7CglpZiAocmVzIDwgMCkgewoJCXY0bDJfZXJyKHY0bDJfZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIHY0bDJfZGV2aWNlXG4iKTsKCQlyZWxlYXNlX3JlZ2lvbihndC0+aW8sIDEpOwoJCXJldHVybiByZXM7Cgl9CgoJc3RybGNweShndC0+dmRldi5uYW1lLCB2NGwyX2Rldi0+bmFtZSwgc2l6ZW9mKGd0LT52ZGV2Lm5hbWUpKTsKCWd0LT52ZGV2LnY0bDJfZGV2ID0gdjRsMl9kZXY7CglndC0+dmRldi5mb3BzID0gJmdlbXRla19mb3BzOwoJZ3QtPnZkZXYuaW9jdGxfb3BzID0gJmdlbXRla19pb2N0bF9vcHM7CglndC0+dmRldi5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHk7Cgl2aWRlb19zZXRfZHJ2ZGF0YSgmZ3QtPnZkZXYsIGd0KTsKCglpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZndC0+dmRldiwgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKSA8IDApIHsKCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKHY0bDJfZGV2KTsKCQlyZWxlYXNlX3JlZ2lvbihndC0+aW8sIDEpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJLyogU2V0IGRlZmF1bHRzICovCglndC0+bGFzdGZyZXEgPSBHRU1URUtfTE9XRlJFUTsKCWd0LT5idTI2MTRkYXRhID0gMDsKCglpZiAoaW5pdG11dGUpCgkJZ2VtdGVrX211dGUoZ3QpOwoKCXJldHVybiAwOwp9CgovKgogKiBNb2R1bGUgY2xlYW51cAogKi8Kc3RhdGljIHZvaWQgX19leGl0IGdlbXRla19leGl0KHZvaWQpCnsKCXN0cnVjdCBnZW10ZWsgKmd0ID0gJmdlbXRla19jYXJkOwoJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9ICZndC0+djRsMl9kZXY7CgoJaWYgKHNodXRkb3duKSB7CgkJaGFyZG11dGUgPSAxOwkvKiBUdXJuIG9mZiBQTEwgKi8KCQlnZW10ZWtfbXV0ZShndCk7Cgl9IGVsc2UgewoJCXY0bDJfaW5mbyh2NGwyX2RldiwgIk1vZHVsZSB1bmxvYWRlZCBidXQgY2FyZCBub3QgbXV0ZWQhXG4iKTsKCX0KCgl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmZ3QtPnZkZXYpOwoJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZ3QtPnY0bDJfZGV2KTsKCXJlbGVhc2VfcmVnaW9uKGd0LT5pbywgMSk7Cn0KCm1vZHVsZV9pbml0KGdlbXRla19pbml0KTsKbW9kdWxlX2V4aXQoZ2VtdGVrX2V4aXQpOwo=