LyoKICogY2kxM3h4eF91ZGMuYyAtIE1JUFMgVVNCIElQIGNvcmUgZmFtaWx5IGRldmljZSBjb250cm9sbGVyCiAqCiAqIENvcHlyaWdodCAoQykgMjAwOCBDaGlwaWRlYSAtIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIEF1dGhvcjogRGF2aWQgTG9wbwogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCgovKgogKiBEZXNjcmlwdGlvbjogTUlQUyBVU0IgSVAgY29yZSBmYW1pbHkgZGV2aWNlIGNvbnRyb2xsZXIKICogICAgICAgICAgICAgIEN1cnJlbnRseSBpdCBvbmx5IHN1cHBvcnRzIElQIHBhcnQgbnVtYmVyIENJMTM0MTIKICoKICogVGhpcyBkcml2ZXIgaXMgY29tcG9zZWQgb2Ygc2V2ZXJhbCBibG9ja3M6CiAqIC0gSFc6ICAgICBoYXJkd2FyZSBpbnRlcmZhY2UKICogLSBEQkc6ICAgIGRlYnVnIGZhY2lsaXRpZXMgKG9wdGlvbmFsKQogKiAtIFVUSUw6ICAgdXRpbGl0aWVzCiAqIC0gSVNSOiAgICBpbnRlcnJ1cHRzIGhhbmRsaW5nCiAqIC0gRU5EUFQ6ICBlbmRwb2ludCBvcGVyYXRpb25zIChHYWRnZXQgQVBJKQogKiAtIEdBREdFVDogZ2FkZ2V0IG9wZXJhdGlvbnMgKEdhZGdldCBBUEkpCiAqIC0gQlVTOiAgICBidXMgZ2x1ZSBjb2RlLCBidXMgYWJzdHJhY3Rpb24gbGF5ZXIKICoKICogQ29tcGlsZSBPcHRpb25zCiAqIC0gQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVM6IGVuYWJsZSBkZWJ1ZyBmYWNpbGl0aWVzCiAqIC0gU1RBTExfSU46ICBub24tZW1wdHkgYnVsay1pbiBwaXBlcyBjYW5ub3QgYmUgaGFsdGVkCiAqICAgICAgICAgICAgICBpZiBkZWZpbmVkIG1hc3Mgc3RvcmFnZSBjb21wbGlhbmNlIHN1Y2NlZWRzIGJ1dCB3aXRoIHdhcm5pbmdzCiAqICAgICAgICAgICAgICA9PiBjYXNlIDQ6IEhpID4gIERuCiAqICAgICAgICAgICAgICA9PiBjYXNlIDU6IEhpID4gIERpCiAqICAgICAgICAgICAgICA9PiBjYXNlIDg6IEhpIDw+IERvCiAqICAgICAgICAgICAgICBpZiB1bmRlZmluZWQgdXNidGVzdCAxMyBmYWlscwogKiAtIFRSQUNFOiAgICAgZW5hYmxlIGZ1bmN0aW9uIHRyYWNpbmcgKGRlcGVuZHMgb24gREVCVUcpCiAqCiAqIE1haW4gRmVhdHVyZXMKICogLSBDaGFwdGVyIDkgJiBNYXNzIFN0b3JhZ2UgQ29tcGxpYW5jZSB3aXRoIEdhZGdldCBGaWxlIFN0b3JhZ2UKICogLSBDaGFwdGVyIDkgQ29tcGxpYW5jZSB3aXRoIEdhZGdldCBaZXJvIChTVEFMTF9JTiB1bmRlZmluZWQpCiAqIC0gTm9ybWFsICYgTFBNIHN1cHBvcnQKICoKICogVVNCVEVTVCBSZXBvcnQKICogLSBPSzogMC0xMiwgMTMgKFNUQUxMX0lOIGRlZmluZWQpICYgMTQKICogLSBOb3QgU3VwcG9ydGVkOiAxNSAmIDE2IChJU08pCiAqCiAqIFRPRE8gTGlzdAogKiAtIE9URwogKiAtIElzb2Nocm9ub3VzICYgSW50ZXJydXB0IFRyYWZmaWMKICogLSBIYW5kbGUgcmVxdWVzdHMgd2hpY2ggc3Bhd25zIGludG8gc2V2ZXJhbCBURHMKICogLSBHRVRfU1RBVFVTKGRldmljZSkgLSBhbHdheXMgcmVwb3J0cyAwCiAqIC0gR2FkZ2V0IEFQSSAobWFqb3JpdHkgb2Ygb3B0aW9uYWwgZmVhdHVyZXMpCiAqIC0gU3VzcGVuZCAmIFJlbW90ZSBXYWtldXAKICovCiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9pby5oPgojaW5jbHVkZSA8bGludXgvaXJxLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KCiNpbmNsdWRlICJjaTEzeHh4X3VkYy5oIgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREVGSU5FCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogY3RybCByZWdpc3RlciBiYW5rIGFjY2VzcyAqLwpzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVkY19sb2NrKTsKCi8qIGNvbnRyb2wgZW5kcG9pbnQgZGVzY3JpcHRpb24gKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgpjdHJsX2VuZHB0X291dF9kZXNjID0gewoJLmJMZW5ndGggICAgICAgICA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAoJLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKCgkuYkVuZHBvaW50QWRkcmVzcyA9IFVTQl9ESVJfT1VULAoJLmJtQXR0cmlidXRlcyAgICA9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wsCgkud01heFBhY2tldFNpemUgID0gY3B1X3RvX2xlMTYoQ1RSTF9QQVlMT0FEX01BWCksCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCmN0cmxfZW5kcHRfaW5fZGVzYyA9IHsKCS5iTGVuZ3RoICAgICAgICAgPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKCS5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCgoJLmJFbmRwb2ludEFkZHJlc3MgPSBVU0JfRElSX0lOLAoJLmJtQXR0cmlidXRlcyAgICA9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wsCgkud01heFBhY2tldFNpemUgID0gY3B1X3RvX2xlMTYoQ1RSTF9QQVlMT0FEX01BWCksCn07CgovKiBVREMgZGVzY3JpcHRvciAqLwpzdGF0aWMgc3RydWN0IGNpMTN4eHggKl91ZGM7CgovKiBJbnRlcnJ1cHQgc3RhdGlzdGljcyAqLwojZGVmaW5lIElTUl9NQVNLICAgMHgxRgpzdGF0aWMgc3RydWN0IHsKCXUzMiB0ZXN0OwoJdTMyIHVpOwoJdTMyIHVlaTsKCXUzMiBwY2k7Cgl1MzIgdXJpOwoJdTMyIHNsaTsKCXUzMiBub25lOwoJc3RydWN0IHsKCQl1MzIgY250OwoJCXUzMiBidWZbSVNSX01BU0srMV07CgkJdTMyIGlkeDsKCX0gaG5kbDsKfSBpc3Jfc3RhdGlzdGljczsKCi8qKgogKiBmZnNfbnI6IGZpbmQgZmlyc3QgKGxlYXN0IHNpZ25pZmljYW50KSBiaXQgc2V0CiAqIEB4OiB0aGUgd29yZCB0byBzZWFyY2gKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJpdCBudW1iZXIgKGluc3RlYWQgb2YgcG9zaXRpb24pCiAqLwpzdGF0aWMgaW50IGZmc19ucih1MzIgeCkKewoJaW50IG4gPSBmZnMoeCk7CgoJcmV0dXJuIG4gPyBuLTEgOiAzMjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBIVyBibG9jawogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHJlZ2lzdGVyIGJhbmsgZGVzY3JpcHRvciAqLwpzdGF0aWMgc3RydWN0IHsKCXVuc2lnbmVkICAgICAgbHBtOyAgICAvKiBpcyBMUE0/ICovCgl2b2lkIF9faW9tZW0gKmFiczsgICAgLyogYnVzIG1hcCBvZmZzZXQgKi8KCXZvaWQgX19pb21lbSAqY2FwOyAgICAvKiBidXMgbWFwIG9mZnNldCArIENBUCBvZmZzZXQgKyBDQVAgZGF0YSAqLwoJc2l6ZV90ICAgICAgICBzaXplOyAgIC8qIGJhbmsgc2l6ZSAqLwp9IGh3X2Jhbms7CgovKiBNU00gc3BlY2lmaWMgKi8KI2RlZmluZSBBQlNfQUhCQlVSU1QgICAgICAgICgweDAwOTBVTCkKI2RlZmluZSBBQlNfQUhCTU9ERSAgICAgICAgICgweDAwOThVTCkKLyogVURDIHJlZ2lzdGVyIG1hcCAqLwojZGVmaW5lIEFCU19DQVBMRU5HVEggICAgICAgKDB4MTAwVUwpCiNkZWZpbmUgQUJTX0hDQ1BBUkFNUyAgICAgICAoMHgxMDhVTCkKI2RlZmluZSBBQlNfRENDUEFSQU1TICAgICAgICgweDEyNFVMKQojZGVmaW5lIEFCU19URVNUTU9ERSAgICAgICAgKGh3X2JhbmsubHBtID8gMHgwRkNVTCA6IDB4MTM4VUwpCi8qIG9mZnNldCB0byBDQVBMRU5UR0ggKGFkZHIgKyBkYXRhKSAqLwojZGVmaW5lIENBUF9VU0JDTUQgICAgICAgICAgKDB4MDAwVUwpCiNkZWZpbmUgQ0FQX1VTQlNUUyAgICAgICAgICAoMHgwMDRVTCkKI2RlZmluZSBDQVBfVVNCSU5UUiAgICAgICAgICgweDAwOFVMKQojZGVmaW5lIENBUF9ERVZJQ0VBRERSICAgICAgKDB4MDE0VUwpCiNkZWZpbmUgQ0FQX0VORFBUTElTVEFERFIgICAoMHgwMThVTCkKI2RlZmluZSBDQVBfUE9SVFNDICAgICAgICAgICgweDA0NFVMKQojZGVmaW5lIENBUF9ERVZMQyAgICAgICAgICAgKDB4MDg0VUwpCiNkZWZpbmUgQ0FQX1VTQk1PREUgICAgICAgICAoaHdfYmFuay5scG0gPyAweDBDOFVMIDogMHgwNjhVTCkKI2RlZmluZSBDQVBfRU5EUFRTRVRVUFNUQVQgIChod19iYW5rLmxwbSA/IDB4MEQ4VUwgOiAweDA2Q1VMKQojZGVmaW5lIENBUF9FTkRQVFBSSU1FICAgICAgKGh3X2JhbmsubHBtID8gMHgwRENVTCA6IDB4MDcwVUwpCiNkZWZpbmUgQ0FQX0VORFBURkxVU0ggICAgICAoaHdfYmFuay5scG0gPyAweDBFMFVMIDogMHgwNzRVTCkKI2RlZmluZSBDQVBfRU5EUFRTVEFUICAgICAgIChod19iYW5rLmxwbSA/IDB4MEU0VUwgOiAweDA3OFVMKQojZGVmaW5lIENBUF9FTkRQVENPTVBMRVRFICAgKGh3X2JhbmsubHBtID8gMHgwRThVTCA6IDB4MDdDVUwpCiNkZWZpbmUgQ0FQX0VORFBUQ1RSTCAgICAgICAoaHdfYmFuay5scG0gPyAweDBFQ1VMIDogMHgwODBVTCkKI2RlZmluZSBDQVBfTEFTVCAgICAgICAgICAgIChod19iYW5rLmxwbSA/IDB4MTJDVUwgOiAweDBDMFVMKQoKLyogbWF4aW11bSBudW1iZXIgb2YgZW5wb2ludHM6IHZhbGlkIG9ubHkgYWZ0ZXIgaHdfZGV2aWNlX3Jlc2V0KCkgKi8Kc3RhdGljIHVuc2lnbmVkIGh3X2VwX21heDsKCi8qKgogKiBod19lcF9iaXQ6IGNhbGN1bGF0ZXMgdGhlIGJpdCBudW1iZXIKICogQG51bTogZW5kcG9pbnQgbnVtYmVyCiAqIEBkaXI6IGVuZHBvaW50IGRpcmVjdGlvbgogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYml0IG51bWJlcgogKi8Kc3RhdGljIGlubGluZSBpbnQgaHdfZXBfYml0KGludCBudW0sIGludCBkaXIpCnsKCXJldHVybiBudW0gKyAoZGlyID8gMTYgOiAwKTsKfQoKLyoqCiAqIGh3X2FyZWFkOiByZWFkcyBmcm9tIHJlZ2lzdGVyIGJpdGZpZWxkCiAqIEBhZGRyOiBhZGRyZXNzIHJlbGF0aXZlIHRvIGJ1cyBtYXAKICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlZ2lzdGVyIGJpdGZpZWxkIGRhdGEKICovCnN0YXRpYyB1MzIgaHdfYXJlYWQodTMyIGFkZHIsIHUzMiBtYXNrKQp7CglyZXR1cm4gaW9yZWFkMzIoYWRkciArIGh3X2JhbmsuYWJzKSAmIG1hc2s7Cn0KCi8qKgogKiBod19hd3JpdGU6IHdyaXRlcyB0byByZWdpc3RlciBiaXRmaWVsZAogKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBidXMgbWFwCiAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCiAqIEBkYXRhOiBuZXcgZGF0YQogKi8Kc3RhdGljIHZvaWQgaHdfYXdyaXRlKHUzMiBhZGRyLCB1MzIgbWFzaywgdTMyIGRhdGEpCnsKCWlvd3JpdGUzMihod19hcmVhZChhZGRyLCB+bWFzaykgfCAoZGF0YSAmIG1hc2spLAoJCSAgYWRkciArIGh3X2JhbmsuYWJzKTsKfQoKLyoqCiAqIGh3X2NyZWFkOiByZWFkcyBmcm9tIHJlZ2lzdGVyIGJpdGZpZWxkCiAqIEBhZGRyOiBhZGRyZXNzIHJlbGF0aXZlIHRvIENBUCBvZmZzZXQgcGx1cyBjb250ZW50CiAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBiaXRmaWVsZCBkYXRhCiAqLwpzdGF0aWMgdTMyIGh3X2NyZWFkKHUzMiBhZGRyLCB1MzIgbWFzaykKewoJcmV0dXJuIGlvcmVhZDMyKGFkZHIgKyBod19iYW5rLmNhcCkgJiBtYXNrOwp9CgovKioKICogaHdfY3dyaXRlOiB3cml0ZXMgdG8gcmVnaXN0ZXIgYml0ZmllbGQKICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gQ0FQIG9mZnNldCBwbHVzIGNvbnRlbnQKICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKICogQGRhdGE6IG5ldyBkYXRhCiAqLwpzdGF0aWMgdm9pZCBod19jd3JpdGUodTMyIGFkZHIsIHUzMiBtYXNrLCB1MzIgZGF0YSkKewoJaW93cml0ZTMyKGh3X2NyZWFkKGFkZHIsIH5tYXNrKSB8IChkYXRhICYgbWFzayksCgkJICBhZGRyICsgaHdfYmFuay5jYXApOwp9CgovKioKICogaHdfY3Rlc3RfYW5kX2NsZWFyOiB0ZXN0cyAmIGNsZWFycyByZWdpc3RlciBiaXRmaWVsZAogKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBDQVAgb2Zmc2V0IHBsdXMgY29udGVudAogKiBAbWFzazogYml0ZmllbGQgbWFzawogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgYml0ZmllbGQgZGF0YQogKi8Kc3RhdGljIHUzMiBod19jdGVzdF9hbmRfY2xlYXIodTMyIGFkZHIsIHUzMiBtYXNrKQp7Cgl1MzIgcmVnID0gaHdfY3JlYWQoYWRkciwgbWFzayk7CgoJaW93cml0ZTMyKHJlZywgYWRkciArIGh3X2JhbmsuY2FwKTsKCXJldHVybiByZWc7Cn0KCi8qKgogKiBod19jdGVzdF9hbmRfd3JpdGU6IHRlc3RzICYgd3JpdGVzIHJlZ2lzdGVyIGJpdGZpZWxkCiAqIEBhZGRyOiBhZGRyZXNzIHJlbGF0aXZlIHRvIENBUCBvZmZzZXQgcGx1cyBjb250ZW50CiAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCiAqIEBkYXRhOiBuZXcgZGF0YQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgYml0ZmllbGQgZGF0YQogKi8Kc3RhdGljIHUzMiBod19jdGVzdF9hbmRfd3JpdGUodTMyIGFkZHIsIHUzMiBtYXNrLCB1MzIgZGF0YSkKewoJdTMyIHJlZyA9IGh3X2NyZWFkKGFkZHIsIH4wKTsKCglpb3dyaXRlMzIoKHJlZyAmIH5tYXNrKSB8IChkYXRhICYgbWFzayksIGFkZHIgKyBod19iYW5rLmNhcCk7CglyZXR1cm4gKHJlZyAmIG1hc2spID4+IGZmc19ucihtYXNrKTsKfQoKc3RhdGljIGludCBod19kZXZpY2VfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UpCnsKCXUzMiByZWc7CgoJLyogYmFuayBpcyBhIG1vZHVsZSB2YXJpYWJsZSAqLwoJaHdfYmFuay5hYnMgPSBiYXNlOwoKCWh3X2JhbmsuY2FwID0gaHdfYmFuay5hYnM7Cglod19iYW5rLmNhcCArPSBBQlNfQ0FQTEVOR1RIOwoJaHdfYmFuay5jYXAgKz0gaW9yZWFkOChod19iYW5rLmNhcCk7CgoJcmVnID0gaHdfYXJlYWQoQUJTX0hDQ1BBUkFNUywgSENDUEFSQU1TX0xFTikgPj4gZmZzX25yKEhDQ1BBUkFNU19MRU4pOwoJaHdfYmFuay5scG0gID0gcmVnOwoJaHdfYmFuay5zaXplID0gaHdfYmFuay5jYXAgLSBod19iYW5rLmFiczsKCWh3X2Jhbmsuc2l6ZSArPSBDQVBfTEFTVDsKCWh3X2Jhbmsuc2l6ZSAvPSBzaXplb2YodTMyKTsKCglyZWcgPSBod19hcmVhZChBQlNfRENDUEFSQU1TLCBEQ0NQQVJBTVNfREVOKSA+PiBmZnNfbnIoRENDUEFSQU1TX0RFTik7Cglod19lcF9tYXggPSByZWcgKiAyOyAgIC8qIGNhY2hlIGh3IEVORFBUX01BWCAqLwoKCWlmIChod19lcF9tYXggPT0gMCB8fCBod19lcF9tYXggPiBFTkRQVF9NQVgpCgkJcmV0dXJuIC1FTk9ERVY7CgoJLyogc2V0dXAgbG9jayBtb2RlID8gKi8KCgkvKiBFTkRQVFNFVFVQU1RBVCBpcyAnMCcgYnkgZGVmYXVsdCAqLwoKCS8qIEhDU1BBUkFNUy5iZi5wcGMgU0hPVUxEIEJFIHplcm8gZm9yIGRldmljZSAqLwoKCXJldHVybiAwOwp9Ci8qKgogKiBod19kZXZpY2VfcmVzZXQ6IHJlc2V0cyBjaGlwIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQogKiBAYmFzZTogcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGh3X2RldmljZV9yZXNldChzdHJ1Y3QgY2kxM3h4eCAqdWRjKQp7CgkvKiBzaG91bGQgZmx1c2ggJiBzdG9wIGJlZm9yZSByZXNldCAqLwoJaHdfY3dyaXRlKENBUF9FTkRQVEZMVVNILCB+MCwgfjApOwoJaHdfY3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9SUywgMCk7CgoJaHdfY3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9SU1QsIFVTQkNNRF9SU1QpOwoJd2hpbGUgKGh3X2NyZWFkKENBUF9VU0JDTUQsIFVTQkNNRF9SU1QpKQoJCXVkZWxheSgxMCk7ICAgICAgICAgICAgIC8qIG5vdCBSVE9TIGZyaWVuZGx5ICovCgoKCWlmICh1ZGMtPnVkY19kcml2ZXItPm5vdGlmeV9ldmVudCkKCQl1ZGMtPnVkY19kcml2ZXItPm5vdGlmeV9ldmVudCh1ZGMsCgkJCUNJMTNYWFhfQ09OVFJPTExFUl9SRVNFVF9FVkVOVCk7CgoJaWYgKHVkYy0+dWRjX2RyaXZlci0+ZmxhZ3MgJiYgQ0kxM1hYWF9ESVNBQkxFX1NUUkVBTUlORykKCQlod19jd3JpdGUoQ0FQX1VTQk1PREUsIFVTQk1PREVfU0RJUywgVVNCTU9ERV9TRElTKTsKCgkvKiBVU0JNT0RFIHNob3VsZCBiZSBjb25maWd1cmVkIHN0ZXAgYnkgc3RlcCAqLwoJaHdfY3dyaXRlKENBUF9VU0JNT0RFLCBVU0JNT0RFX0NNLCBVU0JNT0RFX0NNX0lETEUpOwoJaHdfY3dyaXRlKENBUF9VU0JNT0RFLCBVU0JNT0RFX0NNLCBVU0JNT0RFX0NNX0RFVklDRSk7Cglod19jd3JpdGUoQ0FQX1VTQk1PREUsIFVTQk1PREVfU0xPTSwgVVNCTU9ERV9TTE9NKTsgIC8qIEhXID49IDIuMyAqLwoKCWlmIChod19jcmVhZChDQVBfVVNCTU9ERSwgVVNCTU9ERV9DTSkgIT0gVVNCTU9ERV9DTV9ERVZJQ0UpIHsKCQlwcl9lcnIoImNhbm5vdCBlbnRlciBpbiBkZXZpY2UgbW9kZSIpOwoJCXByX2VycigibHBtID0gJWkiLCBod19iYW5rLmxwbSk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19kZXZpY2Vfc3RhdGU6IGVuYWJsZXMvZGlzYWJsZXMgaW50ZXJydXB0cyAmIHN0YXJ0cy9zdG9wcyBkZXZpY2UgKGV4ZWN1dGUKICogICAgICAgICAgICAgICAgICB3aXRob3V0IGludGVycnVwdGlvbikKICogQGRtYTogMCA9PiBkaXNhYmxlLCAhMCA9PiBlbmFibGUgYW5kIHNldCBkbWEgZW5naW5lCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGh3X2RldmljZV9zdGF0ZSh1MzIgZG1hKQp7CglpZiAoZG1hKSB7CgkJaHdfY3dyaXRlKENBUF9FTkRQVExJU1RBRERSLCB+MCwgZG1hKTsKCQkvKiBpbnRlcnJ1cHQsIGVycm9yLCBwb3J0IGNoYW5nZSwgcmVzZXQsIHNsZWVwL3N1c3BlbmQgKi8KCQlod19jd3JpdGUoQ0FQX1VTQklOVFIsIH4wLAoJCQkgICAgIFVTQmlfVUl8VVNCaV9VRUl8VVNCaV9QQ0l8VVNCaV9VUkl8VVNCaV9TTEkpOwoJCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlMsIFVTQkNNRF9SUyk7Cgl9IGVsc2UgewoJCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlMsIDApOwoJCWh3X2N3cml0ZShDQVBfVVNCSU5UUiwgfjAsIDApOwoJfQoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19lcF9mbHVzaDogZmx1c2ggZW5kcG9pbnQgZmlmbyAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKICogQG51bTogZW5kcG9pbnQgbnVtYmVyCiAqIEBkaXI6IGVuZHBvaW50IGRpcmVjdGlvbgogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19lcF9mbHVzaChpbnQgbnVtLCBpbnQgZGlyKQp7CglpbnQgbiA9IGh3X2VwX2JpdChudW0sIGRpcik7CgoJZG8gewoJCS8qIGZsdXNoIGFueSBwZW5kaW5nIHRyYW5zZmVyICovCgkJaHdfY3dyaXRlKENBUF9FTkRQVEZMVVNILCBCSVQobiksIEJJVChuKSk7CgkJd2hpbGUgKGh3X2NyZWFkKENBUF9FTkRQVEZMVVNILCBCSVQobikpKQoJCQljcHVfcmVsYXgoKTsKCX0gd2hpbGUgKGh3X2NyZWFkKENBUF9FTkRQVFNUQVQsIEJJVChuKSkpOwoKCXJldHVybiAwOwp9CgovKioKICogaHdfZXBfZGlzYWJsZTogZGlzYWJsZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEBudW06IGVuZHBvaW50IG51bWJlcgogKiBAZGlyOiBlbmRwb2ludCBkaXJlY3Rpb24KICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgaHdfZXBfZGlzYWJsZShpbnQgbnVtLCBpbnQgZGlyKQp7Cglod19lcF9mbHVzaChudW0sIGRpcik7Cglod19jd3JpdGUoQ0FQX0VORFBUQ1RSTCArIG51bSAqIHNpemVvZih1MzIpLAoJCSAgZGlyID8gRU5EUFRDVFJMX1RYRSA6IEVORFBUQ1RSTF9SWEUsIDApOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19lcF9lbmFibGU6IGVuYWJsZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEBudW06ICBlbmRwb2ludCBudW1iZXIKICogQGRpcjogIGVuZHBvaW50IGRpcmVjdGlvbgogKiBAdHlwZTogZW5kcG9pbnQgdHlwZQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19lcF9lbmFibGUoaW50IG51bSwgaW50IGRpciwgaW50IHR5cGUpCnsKCXUzMiBtYXNrLCBkYXRhOwoKCWlmIChkaXIpIHsKCQltYXNrICA9IEVORFBUQ1RSTF9UWFQ7ICAvKiB0eXBlICAgICovCgkJZGF0YSAgPSB0eXBlIDw8IGZmc19ucihtYXNrKTsKCgkJbWFzayB8PSBFTkRQVENUUkxfVFhTOyAgLyogdW5zdGFsbCAqLwoJCW1hc2sgfD0gRU5EUFRDVFJMX1RYUjsgIC8qIHJlc2V0IGRhdGEgdG9nZ2xlICovCgkJZGF0YSB8PSBFTkRQVENUUkxfVFhSOwoJCW1hc2sgfD0gRU5EUFRDVFJMX1RYRTsgIC8qIGVuYWJsZSAgKi8KCQlkYXRhIHw9IEVORFBUQ1RSTF9UWEU7Cgl9IGVsc2UgewoJCW1hc2sgID0gRU5EUFRDVFJMX1JYVDsgIC8qIHR5cGUgICAgKi8KCQlkYXRhICA9IHR5cGUgPDwgZmZzX25yKG1hc2spOwoKCQltYXNrIHw9IEVORFBUQ1RSTF9SWFM7ICAvKiB1bnN0YWxsICovCgkJbWFzayB8PSBFTkRQVENUUkxfUlhSOyAgLyogcmVzZXQgZGF0YSB0b2dnbGUgKi8KCQlkYXRhIHw9IEVORFBUQ1RSTF9SWFI7CgkJbWFzayB8PSBFTkRQVENUUkxfUlhFOyAgLyogZW5hYmxlICAqLwoJCWRhdGEgfD0gRU5EUFRDVFJMX1JYRTsKCX0KCWh3X2N3cml0ZShDQVBfRU5EUFRDVFJMICsgbnVtICogc2l6ZW9mKHUzMiksIG1hc2ssIGRhdGEpOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19lcF9nZXRfaGFsdDogcmV0dXJuIGVuZHBvaW50IGhhbHQgc3RhdHVzCiAqIEBudW06IGVuZHBvaW50IG51bWJlcgogKiBAZGlyOiBlbmRwb2ludCBkaXJlY3Rpb24KICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgZW5kcG9pbnQgaGFsdGVkCiAqLwpzdGF0aWMgaW50IGh3X2VwX2dldF9oYWx0KGludCBudW0sIGludCBkaXIpCnsKCXUzMiBtYXNrID0gZGlyID8gRU5EUFRDVFJMX1RYUyA6IEVORFBUQ1RSTF9SWFM7CgoJcmV0dXJuIGh3X2NyZWFkKENBUF9FTkRQVENUUkwgKyBudW0gKiBzaXplb2YodTMyKSwgbWFzaykgPyAxIDogMDsKfQoKLyoqCiAqIGh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX3N0YXR1czogdGVzdCAmIGNsZWFyIHNldHVwIHN0YXR1cyAoZXhlY3V0ZSB3aXRob3V0CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQogKiBAbjogYml0IG51bWJlciAoZW5kcG9pbnQpCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBzZXR1cCBzdGF0dXMKICovCnN0YXRpYyBpbnQgaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfc3RhdHVzKGludCBuKQp7CglyZXR1cm4gaHdfY3Rlc3RfYW5kX2NsZWFyKENBUF9FTkRQVFNFVFVQU1RBVCwgQklUKG4pKTsKfQoKLyoqCiAqIGh3X2VwX3ByaW1lOiBwcmltZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEBudW06ICAgICBlbmRwb2ludCBudW1iZXIKICogQGRpcjogICAgIGVuZHBvaW50IGRpcmVjdGlvbgogKiBAaXNfY3RybDogdHJ1ZSBpZiBjb250cm9sIGVuZHBvaW50CiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGh3X2VwX3ByaW1lKGludCBudW0sIGludCBkaXIsIGludCBpc19jdHJsKQp7CglpbnQgbiA9IGh3X2VwX2JpdChudW0sIGRpcik7CgoJaWYgKGlzX2N0cmwgJiYgZGlyID09IFJYICYmIGh3X2NyZWFkKENBUF9FTkRQVFNFVFVQU1RBVCwgQklUKG51bSkpKQoJCXJldHVybiAtRUFHQUlOOwoKCWh3X2N3cml0ZShDQVBfRU5EUFRQUklNRSwgQklUKG4pLCBCSVQobikpOwoKCXdoaWxlIChod19jcmVhZChDQVBfRU5EUFRQUklNRSwgQklUKG4pKSkKCQljcHVfcmVsYXgoKTsKCWlmIChpc19jdHJsICYmIGRpciA9PSBSWCAgJiYgaHdfY3JlYWQoQ0FQX0VORFBUU0VUVVBTVEFULCBCSVQobnVtKSkpCgkJcmV0dXJuIC1FQUdBSU47CgoJLyogc3RhdHVzIHNob3VsdCBiZSB0ZXN0ZWQgYWNjb3JkaW5nIHdpdGggbWFudWFsIGJ1dCBpdCBkb2Vzbid0IHdvcmsgKi8KCXJldHVybiAwOwp9CgovKioKICogaHdfZXBfc2V0X2hhbHQ6IGNvbmZpZ3VyZXMgZXAgaGFsdCAmIHJlc2V0cyBkYXRhIHRvZ2dsZSBhZnRlciBjbGVhciAoZXhlY3V0ZQogKiAgICAgICAgICAgICAgICAgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEBudW06ICAgZW5kcG9pbnQgbnVtYmVyCiAqIEBkaXI6ICAgZW5kcG9pbnQgZGlyZWN0aW9uCiAqIEB2YWx1ZTogdHJ1ZSA9PiBzdGFsbCwgZmFsc2UgPT4gdW5zdGFsbAogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19lcF9zZXRfaGFsdChpbnQgbnVtLCBpbnQgZGlyLCBpbnQgdmFsdWUpCnsKCWlmICh2YWx1ZSAhPSAwICYmIHZhbHVlICE9IDEpCgkJcmV0dXJuIC1FSU5WQUw7CgoJZG8gewoJCXUzMiBhZGRyID0gQ0FQX0VORFBUQ1RSTCArIG51bSAqIHNpemVvZih1MzIpOwoJCXUzMiBtYXNrX3hzID0gZGlyID8gRU5EUFRDVFJMX1RYUyA6IEVORFBUQ1RSTF9SWFM7CgkJdTMyIG1hc2tfeHIgPSBkaXIgPyBFTkRQVENUUkxfVFhSIDogRU5EUFRDVFJMX1JYUjsKCgkJLyogZGF0YSB0b2dnbGUgLSByZXNlcnZlZCBmb3IgRVAwIGJ1dCBpdCdzIGluIEVTUyAqLwoJCWh3X2N3cml0ZShhZGRyLCBtYXNrX3hzfG1hc2tfeHIsIHZhbHVlID8gbWFza194cyA6IG1hc2tfeHIpOwoKCX0gd2hpbGUgKHZhbHVlICE9IGh3X2VwX2dldF9oYWx0KG51bSwgZGlyKSk7CgoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19pbnRyX2NsZWFyOiBkaXNhYmxlcyBpbnRlcnJ1cHQgJiBjbGVhcnMgaW50ZXJydXB0IHN0YXR1cyAoZXhlY3V0ZSB3aXRob3V0CiAqICAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKICogQG46IGludGVycnVwdCBiaXQKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgaHdfaW50cl9jbGVhcihpbnQgbikKewoJaWYgKG4gPj0gUkVHX0JJVFMpCgkJcmV0dXJuIC1FSU5WQUw7CgoJaHdfY3dyaXRlKENBUF9VU0JJTlRSLCBCSVQobiksIDApOwoJaHdfY3dyaXRlKENBUF9VU0JTVFMsICBCSVQobiksIEJJVChuKSk7CglyZXR1cm4gMDsKfQoKLyoqCiAqIGh3X2ludHJfZm9yY2U6IGVuYWJsZXMgaW50ZXJydXB0ICYgZm9yY2VzIGludGVycnVwdCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAogKiAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCiAqIEBuOiBpbnRlcnJ1cHQgYml0CiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGh3X2ludHJfZm9yY2UoaW50IG4pCnsKCWlmIChuID49IFJFR19CSVRTKQoJCXJldHVybiAtRUlOVkFMOwoKCWh3X2F3cml0ZShBQlNfVEVTVE1PREUsIFRFU1RNT0RFX0ZPUkNFLCBURVNUTU9ERV9GT1JDRSk7Cglod19jd3JpdGUoQ0FQX1VTQklOVFIsICBCSVQobiksIEJJVChuKSk7Cglod19jd3JpdGUoQ0FQX1VTQlNUUywgICBCSVQobiksIEJJVChuKSk7Cglod19hd3JpdGUoQUJTX1RFU1RNT0RFLCBURVNUTU9ERV9GT1JDRSwgMCk7CglyZXR1cm4gMDsKfQoKLyoqCiAqIGh3X2lzX3BvcnRfaGlnaF9zcGVlZDogdGVzdCBpZiBwb3J0IGlzIGhpZ2ggc3BlZWQKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgaGlnaCBzcGVlZCBwb3J0CiAqLwpzdGF0aWMgaW50IGh3X3BvcnRfaXNfaGlnaF9zcGVlZCh2b2lkKQp7CglyZXR1cm4gaHdfYmFuay5scG0gPyBod19jcmVhZChDQVBfREVWTEMsIERFVkxDX1BTUEQpIDoKCQlod19jcmVhZChDQVBfUE9SVFNDLCBQT1JUU0NfSFNQKTsKfQoKLyoqCiAqIGh3X3BvcnRfdGVzdF9nZXQ6IHJlYWRzIHBvcnQgdGVzdCBtb2RlIHZhbHVlCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBwb3J0IHRlc3QgbW9kZSB2YWx1ZQogKi8Kc3RhdGljIHU4IGh3X3BvcnRfdGVzdF9nZXQodm9pZCkKewoJcmV0dXJuIGh3X2NyZWFkKENBUF9QT1JUU0MsIFBPUlRTQ19QVEMpID4+IGZmc19ucihQT1JUU0NfUFRDKTsKfQoKLyoqCiAqIGh3X3BvcnRfdGVzdF9zZXQ6IHdyaXRlcyBwb3J0IHRlc3QgbW9kZSAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKICogQG1vZGU6IG5ldyB2YWx1ZQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19wb3J0X3Rlc3Rfc2V0KHU4IG1vZGUpCnsKCWNvbnN0IHU4IFRFU1RfTU9ERV9NQVggPSA3OwoKCWlmIChtb2RlID4gVEVTVF9NT0RFX01BWCkKCQlyZXR1cm4gLUVJTlZBTDsKCglod19jd3JpdGUoQ0FQX1BPUlRTQywgUE9SVFNDX1BUQywgbW9kZSA8PCBmZnNfbnIoUE9SVFNDX1BUQykpOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19yZWFkX2ludHJfZW5hYmxlOiByZXR1cm5zIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlZ2lzdGVyIGRhdGEKICovCnN0YXRpYyB1MzIgaHdfcmVhZF9pbnRyX2VuYWJsZSh2b2lkKQp7CglyZXR1cm4gaHdfY3JlYWQoQ0FQX1VTQklOVFIsIH4wKTsKfQoKLyoqCiAqIGh3X3JlYWRfaW50cl9zdGF0dXM6IHJldHVybnMgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgZGF0YQogKi8Kc3RhdGljIHUzMiBod19yZWFkX2ludHJfc3RhdHVzKHZvaWQpCnsKCXJldHVybiBod19jcmVhZChDQVBfVVNCU1RTLCB+MCk7Cn0KCi8qKgogKiBod19yZWdpc3Rlcl9yZWFkOiByZWFkcyBhbGwgZGV2aWNlIHJlZ2lzdGVycyAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKICogQGJ1ZjogIGRlc3RpbmF0aW9uIGJ1ZmZlcgogKiBAc2l6ZTogYnVmZmVyIHNpemUKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG51bWJlciBvZiByZWdpc3RlcnMgcmVhZAogKi8Kc3RhdGljIHNpemVfdCBod19yZWdpc3Rlcl9yZWFkKHUzMiAqYnVmLCBzaXplX3Qgc2l6ZSkKewoJdW5zaWduZWQgaTsKCglpZiAoc2l6ZSA+IGh3X2Jhbmsuc2l6ZSkKCQlzaXplID0gaHdfYmFuay5zaXplOwoKCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCgkJYnVmW2ldID0gaHdfYXJlYWQoaSAqIHNpemVvZih1MzIpLCB+MCk7CgoJcmV0dXJuIHNpemU7Cn0KCi8qKgogKiBod19yZWdpc3Rlcl93cml0ZTogd3JpdGVzIHRvIHJlZ2lzdGVyCiAqIEBhZGRyOiByZWdpc3RlciBhZGRyZXNzCiAqIEBkYXRhOiByZWdpc3RlciB2YWx1ZQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19yZWdpc3Rlcl93cml0ZSh1MTYgYWRkciwgdTMyIGRhdGEpCnsKCS8qIGFsaWduICovCglhZGRyIC89IHNpemVvZih1MzIpOwoKCWlmIChhZGRyID49IGh3X2Jhbmsuc2l6ZSkKCQlyZXR1cm4gLUVJTlZBTDsKCgkvKiBhbGlnbiAqLwoJYWRkciAqPSBzaXplb2YodTMyKTsKCglod19hd3JpdGUoYWRkciwgfjAsIGRhdGEpOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod190ZXN0X2FuZF9jbGVhcl9jb21wbGV0ZTogdGVzdCAmIGNsZWFyIGNvbXBsZXRlIHN0YXR1cyAoZXhlY3V0ZSB3aXRob3V0CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCiAqIEBuOiBiaXQgbnVtYmVyIChlbmRwb2ludCkKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGNvbXBsZXRlIHN0YXR1cwogKi8Kc3RhdGljIGludCBod190ZXN0X2FuZF9jbGVhcl9jb21wbGV0ZShpbnQgbikKewoJcmV0dXJuIGh3X2N0ZXN0X2FuZF9jbGVhcihDQVBfRU5EUFRDT01QTEVURSwgQklUKG4pKTsKfQoKLyoqCiAqIGh3X3Rlc3RfYW5kX2NsZWFyX2ludHJfYWN0aXZlOiB0ZXN0ICYgY2xlYXIgYWN0aXZlIGludGVycnVwdHMgKGV4ZWN1dGUKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgaW50ZXJydXB0aW9uKQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYWN0aXZlIGludGVycnV0cHMKICovCnN0YXRpYyB1MzIgaHdfdGVzdF9hbmRfY2xlYXJfaW50cl9hY3RpdmUodm9pZCkKewoJdTMyIHJlZyA9IGh3X3JlYWRfaW50cl9zdGF0dXMoKSAmIGh3X3JlYWRfaW50cl9lbmFibGUoKTsKCglod19jd3JpdGUoQ0FQX1VTQlNUUywgfjAsIHJlZyk7CglyZXR1cm4gcmVnOwp9CgovKioKICogaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfZ3VhcmQ6IHRlc3QgJiBjbGVhciBzZXR1cCBndWFyZCAoZXhlY3V0ZSB3aXRob3V0CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBndWFyZCB2YWx1ZQogKi8Kc3RhdGljIGludCBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9ndWFyZCh2b2lkKQp7CglyZXR1cm4gaHdfY3Rlc3RfYW5kX3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9TVVRXLCAwKTsKfQoKLyoqCiAqIGh3X3Rlc3RfYW5kX3NldF9zZXR1cF9ndWFyZDogdGVzdCAmIHNldCBzZXR1cCBndWFyZCAoZXhlY3V0ZSB3aXRob3V0CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZ3VhcmQgdmFsdWUKICovCnN0YXRpYyBpbnQgaHdfdGVzdF9hbmRfc2V0X3NldHVwX2d1YXJkKHZvaWQpCnsKCXJldHVybiBod19jdGVzdF9hbmRfd3JpdGUoQ0FQX1VTQkNNRCwgVVNCQ01EX1NVVFcsIFVTQkNNRF9TVVRXKTsKfQoKLyoqCiAqIGh3X3VzYl9zZXRfYWRkcmVzczogY29uZmlndXJlcyBVU0IgYWRkcmVzcyAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKICogQHZhbHVlOiBuZXcgVVNCIGFkZHJlc3MKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgaHdfdXNiX3NldF9hZGRyZXNzKHU4IHZhbHVlKQp7CgkvKiBhZHZhbmNlICovCglod19jd3JpdGUoQ0FQX0RFVklDRUFERFIsIERFVklDRUFERFJfVVNCQURSIHwgREVWSUNFQUREUl9VU0JBRFJBLAoJCSAgdmFsdWUgPDwgZmZzX25yKERFVklDRUFERFJfVVNCQURSKSB8IERFVklDRUFERFJfVVNCQURSQSk7CglyZXR1cm4gMDsKfQoKLyoqCiAqIGh3X3VzYl9yZXNldDogcmVzdGFydCBkZXZpY2UgYWZ0ZXIgYSBidXMgcmVzZXQgKGV4ZWN1dGUgd2l0aG91dAogKiAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgaHdfdXNiX3Jlc2V0KHZvaWQpCnsKCWh3X3VzYl9zZXRfYWRkcmVzcygwKTsKCgkvKiBFU1MgZmx1c2hlcyBvbmx5IGF0IGVuZD8hPyAqLwoJaHdfY3dyaXRlKENBUF9FTkRQVEZMVVNILCAgICB+MCwgfjApOyAgIC8qIGZsdXNoIGFsbCBFUHMgKi8KCgkvKiBjbGVhciBzZXR1cCB0b2tlbiBzZW1hcGhvcmVzICovCglod19jd3JpdGUoQ0FQX0VORFBUU0VUVVBTVEFULCAwLCAgMCk7ICAgLyogd3JpdGVzIGl0cyBjb250ZW50ICovCgoJLyogY2xlYXIgY29tcGxldGUgc3RhdHVzICovCglod19jd3JpdGUoQ0FQX0VORFBUQ09NUExFVEUsICAwLCAgMCk7ICAgLyogd3JpdGVzIGl0cyBjb250ZW50ICovCgoJLyogd2FpdCB1bnRpbCBhbGwgYml0cyBjbGVhcmVkICovCgl3aGlsZSAoaHdfY3JlYWQoQ0FQX0VORFBUUFJJTUUsIH4wKSkKCQl1ZGVsYXkoMTApOyAgICAgICAgICAgICAvKiBub3QgUlRPUyBmcmllbmRseSAqLwoKCS8qIHJlc2V0IGFsbCBlbmRwb2ludHMgPyAqLwoKCS8qIHJlc2V0IGludGVybmFsIHN0YXR1cyBhbmQgd2FpdCBmb3IgZnVydGhlciBpbnN0cnVjdGlvbnMKCSAgIG5vIG5lZWQgdG8gdmVyaWZ5IHRoZSBwb3J0IHJlc2V0IHN0YXR1cyAoRVNTIGRvZXMgaXQpICovCgoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREJHIGJsb2NrCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIHNob3dfZGV2aWNlOiBwcmludHMgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlIGNhcGFiaWxpdGllcyBhbmQgc3RhdHVzCiAqCiAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBzc2l6ZV90IHNob3dfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCgkJCSAgIGNoYXIgKmJ1ZikKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKCXN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQgPSAmdWRjLT5nYWRnZXQ7CglpbnQgbiA9IDA7CgoJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuIDA7Cgl9CgoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgInNwZWVkICAgICAgICAgICAgID0gJWRcbiIsCgkJICAgICAgIGdhZGdldC0+c3BlZWQpOwoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImlzX2R1YWxzcGVlZCAgICAgID0gJWRcbiIsCgkJICAgICAgIGdhZGdldC0+aXNfZHVhbHNwZWVkKTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJpc19vdGcgICAgICAgICAgICA9ICVkXG4iLAoJCSAgICAgICBnYWRnZXQtPmlzX290Zyk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiaXNfYV9wZXJpcGhlcmFsICAgPSAlZFxuIiwKCQkgICAgICAgZ2FkZ2V0LT5pc19hX3BlcmlwaGVyYWwpOwoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImJfaG5wX2VuYWJsZSAgICAgID0gJWRcbiIsCgkJICAgICAgIGdhZGdldC0+Yl9obnBfZW5hYmxlKTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJhX2hucF9zdXBwb3J0ICAgICA9ICVkXG4iLAoJCSAgICAgICBnYWRnZXQtPmFfaG5wX3N1cHBvcnQpOwoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImFfYWx0X2hucF9zdXBwb3J0ID0gJWRcbiIsCgkJICAgICAgIGdhZGdldC0+YV9hbHRfaG5wX3N1cHBvcnQpOwoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIm5hbWUgICAgICAgICAgICAgID0gJXNcbiIsCgkJICAgICAgIChnYWRnZXQtPm5hbWUgPyBnYWRnZXQtPm5hbWUgOiAiIikpOwoKCXJldHVybiBuOwp9CnN0YXRpYyBERVZJQ0VfQVRUUihkZXZpY2UsIFNfSVJVU1IsIHNob3dfZGV2aWNlLCBOVUxMKTsKCi8qKgogKiBzaG93X2RyaXZlcjogcHJpbnRzIGluZm9ybWF0aW9uIGFib3V0IGF0dGFjaGVkIGdhZGdldCAoaWYgYW55KQogKgogKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2RyaXZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCQkgICBjaGFyICpidWYpCnsKCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7CglzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciA9IHVkYy0+ZHJpdmVyOwoJaW50IG4gPSAwOwoKCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CglpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CgkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOwoJCXJldHVybiAwOwoJfQoKCWlmIChkcml2ZXIgPT0gTlVMTCkKCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLAoJCQkJICJUaGVyZSBpcyBubyBnYWRnZXQgYXR0YWNoZWQhXG4iKTsKCgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiZnVuY3Rpb24gID0gJXNcbiIsCgkJICAgICAgIChkcml2ZXItPmZ1bmN0aW9uID8gZHJpdmVyLT5mdW5jdGlvbiA6ICIiKSk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAibWF4IHNwZWVkID0gJWRcbiIsCgkJICAgICAgIGRyaXZlci0+c3BlZWQpOwoKCXJldHVybiBuOwp9CnN0YXRpYyBERVZJQ0VfQVRUUihkcml2ZXIsIFNfSVJVU1IsIHNob3dfZHJpdmVyLCBOVUxMKTsKCi8qIE1heGltdW0gZXZlbnQgbWVzc2FnZSBsZW5ndGggKi8KI2RlZmluZSBEQkdfREFUQV9NU0cgICA2NFVMCgovKiBNYXhpbXVtIGV2ZW50IG1lc3NhZ2VzICovCiNkZWZpbmUgREJHX0RBVEFfTUFYICAgMTI4VUwKCi8qIEV2ZW50IGJ1ZmZlciBkZXNjcmlwdG9yICovCnN0YXRpYyBzdHJ1Y3QgewoJY2hhciAgICAgKGJ1ZltEQkdfREFUQV9NQVhdKVtEQkdfREFUQV9NU0ddOyAgIC8qIGJ1ZmZlciAqLwoJdW5zaWduZWQgaWR4OyAgIC8qIGluZGV4ICovCgl1bnNpZ25lZCB0dHk7ICAgLyogcHJpbnQgdG8gY29uc29sZT8gKi8KCXJ3bG9ja190IGxjazsgICAvKiBsb2NrICovCn0gZGJnX2RhdGEgPSB7CgkuaWR4ID0gMCwKCS50dHkgPSAwLAoJLmxjayA9IF9fUldfTE9DS19VTkxPQ0tFRChsY2spCn07CgovKioKICogZGJnX2RlYzogZGVjcmVtZW50cyBkZWJ1ZyBldmVudCBpbmRleAogKiBAaWR4OiBidWZmZXIgaW5kZXgKICovCnN0YXRpYyB2b2lkIGRiZ19kZWModW5zaWduZWQgKmlkeCkKewoJKmlkeCA9ICgqaWR4IC0gMSkgJiAoREJHX0RBVEFfTUFYLTEpOwp9CgovKioKICogZGJnX2luYzogaW5jcmVtZW50cyBkZWJ1ZyBldmVudCBpbmRleAogKiBAaWR4OiBidWZmZXIgaW5kZXgKICovCnN0YXRpYyB2b2lkIGRiZ19pbmModW5zaWduZWQgKmlkeCkKewoJKmlkeCA9ICgqaWR4ICsgMSkgJiAoREJHX0RBVEFfTUFYLTEpOwp9CgovKioKICogZGJnX3ByaW50OiAgcHJpbnRzIHRoZSBjb21tb24gcGFydCBvZiB0aGUgZXZlbnQKICogQGFkZHI6ICAgZW5kcG9pbnQgYWRkcmVzcwogKiBAbmFtZTogICBldmVudCBuYW1lCiAqIEBzdGF0dXM6IHN0YXR1cwogKiBAZXh0cmE6ICBleHRyYSBpbmZvcm1hdGlvbgogKi8Kc3RhdGljIHZvaWQgZGJnX3ByaW50KHU4IGFkZHIsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzdGF0dXMsIGNvbnN0IGNoYXIgKmV4dHJhKQp7CglzdHJ1Y3QgdGltZXZhbCB0dmFsOwoJdW5zaWduZWQgaW50IHN0YW1wOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl3cml0ZV9sb2NrX2lycXNhdmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOwoKCWRvX2dldHRpbWVvZmRheSgmdHZhbCk7CglzdGFtcCA9IHR2YWwudHZfc2VjICYgMHhGRkZGOwkvKiAyXjMyID0gNDI5NDk2NzI5Ni4gTGltaXQgdG8gNDA5NnMgKi8KCXN0YW1wID0gc3RhbXAgKiAxMDAwMDAwICsgdHZhbC50dl91c2VjOwoKCXNjbnByaW50ZihkYmdfZGF0YS5idWZbZGJnX2RhdGEuaWR4XSwgREJHX0RBVEFfTVNHLAoJCSAgIiUwNFhcdLsgJTAyWCAlLTcuN3MgJTRpIKtcdCVzXG4iLAoJCSAgc3RhbXAsIGFkZHIsIG5hbWUsIHN0YXR1cywgZXh0cmEpOwoKCWRiZ19pbmMoJmRiZ19kYXRhLmlkeCk7CgoJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOwoKCWlmIChkYmdfZGF0YS50dHkgIT0gMCkKCQlwcl9ub3RpY2UoIiUwNFhcdLsgJTAyWCAlLTcuN3MgJTRpIKtcdCVzXG4iLAoJCQkgIHN0YW1wLCBhZGRyLCBuYW1lLCBzdGF0dXMsIGV4dHJhKTsKfQoKLyoqCiAqIGRiZ19kb25lOiBwcmludHMgYSBET05FIGV2ZW50CiAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKICogQHRkOiAgICAgdHJhbnNmZXIgZGVzY3JpcHRvcgogKiBAc3RhdHVzOiBzdGF0dXMKICovCnN0YXRpYyB2b2lkIGRiZ19kb25lKHU4IGFkZHIsIGNvbnN0IHUzMiB0b2tlbiwgaW50IHN0YXR1cykKewoJY2hhciBtc2dbREJHX0RBVEFfTVNHXTsKCglzY25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIiVkICUwMlgiLAoJCSAgKGludCkodG9rZW4gJiBURF9UT1RBTF9CWVRFUykgPj4gZmZzX25yKFREX1RPVEFMX0JZVEVTKSwKCQkgIChpbnQpKHRva2VuICYgVERfU1RBVFVTKSAgICAgID4+IGZmc19ucihURF9TVEFUVVMpKTsKCWRiZ19wcmludChhZGRyLCAiRE9ORSIsIHN0YXR1cywgbXNnKTsKfQoKLyoqCiAqIGRiZ19ldmVudDogcHJpbnRzIGEgZ2VuZXJpYyBldmVudAogKiBAYWRkcjogICBlbmRwb2ludCBhZGRyZXNzCiAqIEBuYW1lOiAgIGV2ZW50IG5hbWUKICogQHN0YXR1czogc3RhdHVzCiAqLwpzdGF0aWMgdm9pZCBkYmdfZXZlbnQodTggYWRkciwgY29uc3QgY2hhciAqbmFtZSwgaW50IHN0YXR1cykKewoJaWYgKG5hbWUgIT0gTlVMTCkKCQlkYmdfcHJpbnQoYWRkciwgbmFtZSwgc3RhdHVzLCAiIik7Cn0KCi8qCiAqIGRiZ19xdWV1ZTogcHJpbnRzIGEgUVVFVUUgZXZlbnQKICogQGFkZHI6ICAgZW5kcG9pbnQgYWRkcmVzcwogKiBAcmVxOiAgICBVU0IgcmVxdWVzdAogKiBAc3RhdHVzOiBzdGF0dXMKICovCnN0YXRpYyB2b2lkIGRiZ19xdWV1ZSh1OCBhZGRyLCBjb25zdCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSwgaW50IHN0YXR1cykKewoJY2hhciBtc2dbREJHX0RBVEFfTVNHXTsKCglpZiAocmVxICE9IE5VTEwpIHsKCQlzY25wcmludGYobXNnLCBzaXplb2YobXNnKSwKCQkJICAiJWQgJWQiLCAhcmVxLT5ub19pbnRlcnJ1cHQsIHJlcS0+bGVuZ3RoKTsKCQlkYmdfcHJpbnQoYWRkciwgIlFVRVVFIiwgc3RhdHVzLCBtc2cpOwoJfQp9CgovKioKICogZGJnX3NldHVwOiBwcmludHMgYSBTRVRVUCBldmVudAogKiBAYWRkcjogZW5kcG9pbnQgYWRkcmVzcwogKiBAcmVxOiAgc2V0dXAgcmVxdWVzdAogKi8Kc3RhdGljIHZvaWQgZGJnX3NldHVwKHU4IGFkZHIsIGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcSkKewoJY2hhciBtc2dbREJHX0RBVEFfTVNHXTsKCglpZiAocmVxICE9IE5VTEwpIHsKCQlzY25wcmludGYobXNnLCBzaXplb2YobXNnKSwKCQkJICAiJTAyWCAlMDJYICUwNFggJTA0WCAlZCIsIHJlcS0+YlJlcXVlc3RUeXBlLAoJCQkgIHJlcS0+YlJlcXVlc3QsIGxlMTZfdG9fY3B1KHJlcS0+d1ZhbHVlKSwKCQkJICBsZTE2X3RvX2NwdShyZXEtPndJbmRleCksIGxlMTZfdG9fY3B1KHJlcS0+d0xlbmd0aCkpOwoJCWRiZ19wcmludChhZGRyLCAiU0VUVVAiLCAwLCBtc2cpOwoJfQp9CgovKioKICogc2hvd19ldmVudHM6IGRpc3BsYXlzIHRoZSBldmVudCBidWZmZXIKICoKICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19ldmVudHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKCQkJICAgY2hhciAqYnVmKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgaSwgaiwgbiA9IDA7CgoJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuIDA7Cgl9CgoJcmVhZF9sb2NrX2lycXNhdmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOwoKCWkgPSBkYmdfZGF0YS5pZHg7Cglmb3IgKGRiZ19kZWMoJmkpOyBpICE9IGRiZ19kYXRhLmlkeDsgZGJnX2RlYygmaSkpIHsKCQluICs9IHN0cmxlbihkYmdfZGF0YS5idWZbaV0pOwoJCWlmIChuID49IFBBR0VfU0laRSkgewoJCQluIC09IHN0cmxlbihkYmdfZGF0YS5idWZbaV0pOwoJCQlicmVhazsKCQl9Cgl9Cglmb3IgKGogPSAwLCBkYmdfaW5jKCZpKTsgaiA8IG47IGRiZ19pbmMoJmkpKQoJCWogKz0gc2NucHJpbnRmKGJ1ZiArIGosIFBBR0VfU0laRSAtIGosCgkJCSAgICAgICAiJXMiLCBkYmdfZGF0YS5idWZbaV0pOwoKCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOwoKCXJldHVybiBuOwp9CgovKioKICogc3RvcmVfZXZlbnRzOiBjb25maWd1cmUgaWYgZXZlbnRzIGFyZSBnb2luZyB0byBiZSBhbHNvIHByaW50ZWQgdG8gY29uc29sZQogKgogKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgc3NpemVfdCBzdG9yZV9ldmVudHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQp7Cgl1bnNpZ25lZCB0dHk7CgoJZGJnX3RyYWNlKCJbJXNdICVwLCAlZFxuIiwgX19mdW5jX18sIGJ1ZiwgY291bnQpOwoJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewoJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKCQlnb3RvIGRvbmU7Cgl9CgoJaWYgKHNzY2FuZihidWYsICIldSIsICZ0dHkpICE9IDEgfHwgdHR5ID4gMSkgewoJCWRldl9lcnIoZGV2LCAiPDF8MD46IGVuYWJsZXxkaXNhYmxlIGNvbnNvbGUgbG9nXG4iKTsKCQlnb3RvIGRvbmU7Cgl9CgoJZGJnX2RhdGEudHR5ID0gdHR5OwoJZGV2X2luZm8oZGV2LCAidHR5ID0gJXUiLCBkYmdfZGF0YS50dHkpOwoKIGRvbmU6CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIERFVklDRV9BVFRSKGV2ZW50cywgU19JUlVTUiB8IFNfSVdVU1IsIHNob3dfZXZlbnRzLCBzdG9yZV9ldmVudHMpOwoKLyoqCiAqIHNob3dfaW50ZXJzOiBpbnRlcnJ1cHQgc3RhdHVzLCBlbmFibGUgc3RhdHVzIGFuZCBoaXN0b3JpYwogKgogKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2ludGVycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCQkgICBjaGFyICpidWYpCnsKCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTMyIGludHI7Cgl1bnNpZ25lZCBpLCBqLCBuID0gMDsKCglkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOwoJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewoJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm4gMDsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAoJCSAgICAgICAic3RhdHVzID0gJTA4eFxuIiwgaHdfcmVhZF9pbnRyX3N0YXR1cygpKTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCgkJICAgICAgICJlbmFibGUgPSAlMDh4XG4iLCBod19yZWFkX2ludHJfZW5hYmxlKCkpOwoKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICIqdGVzdCA9ICVkXG4iLAoJCSAgICAgICBpc3Jfc3RhdGlzdGljcy50ZXN0KTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICK7IHVpICA9ICVkXG4iLAoJCSAgICAgICBpc3Jfc3RhdGlzdGljcy51aSk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyB1ZWkgPSAlZFxuIiwKCQkgICAgICAgaXNyX3N0YXRpc3RpY3MudWVpKTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICK7IHBjaSA9ICVkXG4iLAoJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5wY2kpOwoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgdXJpID0gJWRcbiIsCgkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnVyaSk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyBzbGkgPSAlZFxuIiwKCQkgICAgICAgaXNyX3N0YXRpc3RpY3Muc2xpKTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICIqbm9uZSA9ICVkXG4iLAoJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5ub25lKTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICIqaG5kbCA9ICVkXG4iLAoJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5obmRsLmNudCk7CgoJZm9yIChpID0gaXNyX3N0YXRpc3RpY3MuaG5kbC5pZHgsIGogPSAwOyBqIDw9IElTUl9NQVNLOyBqKyssIGkrKykgewoJCWkgICAmPSBJU1JfTUFTSzsKCQlpbnRyID0gaXNyX3N0YXRpc3RpY3MuaG5kbC5idWZbaV07CgoJCWlmIChVU0JpX1VJICAmIGludHIpCgkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJ1aSAgIik7CgkJaW50ciAmPSB+VVNCaV9VSTsKCQlpZiAoVVNCaV9VRUkgJiBpbnRyKQoJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAidWVpICIpOwoJCWludHIgJj0gflVTQmlfVUVJOwoJCWlmIChVU0JpX1BDSSAmIGludHIpCgkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJwY2kgIik7CgkJaW50ciAmPSB+VVNCaV9QQ0k7CgkJaWYgKFVTQmlfVVJJICYgaW50cikKCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgInVyaSAiKTsKCQlpbnRyICY9IH5VU0JpX1VSSTsKCQlpZiAoVVNCaV9TTEkgJiBpbnRyKQoJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAic2xpICIpOwoJCWludHIgJj0gflVTQmlfU0xJOwoJCWlmIChpbnRyKQoJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiPz8/ICIpOwoJCWlmIChpc3Jfc3RhdGlzdGljcy5obmRsLmJ1ZltpXSkKCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIlxuIik7Cgl9CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gbjsKfQoKLyoqCiAqIHN0b3JlX2ludGVyczogZW5hYmxlICYgZm9yY2Ugb3IgZGlzYWJsZSBhbiBpbmRpdmlkdWFsIGludGVycnV0cHMKICogICAgICAgICAgICAgICAgICAgKHRvIGJlIHVzZWQgZm9yIHRlc3QgcHVycG9zZXMgb25seSkKICoKICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHNzaXplX3Qgc3RvcmVfaW50ZXJzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCgkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBlbiwgYml0OwoKCWRiZ190cmFjZSgiWyVzXSAlcCwgJWRcbiIsIF9fZnVuY19fLCBidWYsIGNvdW50KTsKCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CgkJZ290byBkb25lOwoJfQoKCWlmIChzc2NhbmYoYnVmLCAiJXUgJXUiLCAmZW4sICZiaXQpICE9IDIgfHwgZW4gPiAxKSB7CgkJZGV2X2VycihkZXYsICI8MXwwPiA8Yml0PjogZW5hYmxlfGRpc2FibGUgaW50ZXJydXB0Iik7CgkJZ290byBkb25lOwoJfQoKCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoJaWYgKGVuKSB7CgkJaWYgKGh3X2ludHJfZm9yY2UoYml0KSkKCQkJZGV2X2VycihkZXYsICJpbnZhbGlkIGJpdCBudW1iZXJcbiIpOwoJCWVsc2UKCQkJaXNyX3N0YXRpc3RpY3MudGVzdCsrOwoJfSBlbHNlIHsKCQlpZiAoaHdfaW50cl9jbGVhcihiaXQpKQoJCQlkZXZfZXJyKGRldiwgImludmFsaWQgYml0IG51bWJlclxuIik7Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwoKIGRvbmU6CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIERFVklDRV9BVFRSKGludGVycywgU19JUlVTUiB8IFNfSVdVU1IsIHNob3dfaW50ZXJzLCBzdG9yZV9pbnRlcnMpOwoKLyoqCiAqIHNob3dfcG9ydF90ZXN0OiByZWFkcyBwb3J0IHRlc3QgbW9kZQogKgogKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgc3NpemVfdCBzaG93X3BvcnRfdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCgkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgbW9kZTsKCglkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOwoJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewoJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm4gMDsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCW1vZGUgPSBod19wb3J0X3Rlc3RfZ2V0KCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwoKCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJtb2RlID0gJXVcbiIsIG1vZGUpOwp9CgovKioKICogc3RvcmVfcG9ydF90ZXN0OiB3cml0ZXMgcG9ydCB0ZXN0IG1vZGUKICoKICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHNzaXplX3Qgc3RvcmVfcG9ydF90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCnsKCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgbW9kZTsKCglkYmdfdHJhY2UoIlslc10gJXAsICVkXG4iLCBfX2Z1bmNfXywgYnVmLCBjb3VudCk7CglpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CgkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOwoJCWdvdG8gZG9uZTsKCX0KCglpZiAoc3NjYW5mKGJ1ZiwgIiV1IiwgJm1vZGUpICE9IDEpIHsKCQlkZXZfZXJyKGRldiwgIjxtb2RlPjogc2V0IHBvcnQgdGVzdCBtb2RlIik7CgkJZ290byBkb25lOwoJfQoKCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoJaWYgKGh3X3BvcnRfdGVzdF9zZXQobW9kZSkpCgkJZGV2X2VycihkZXYsICJpbnZhbGlkIG1vZGVcbiIpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCiBkb25lOgoJcmV0dXJuIGNvdW50Owp9CnN0YXRpYyBERVZJQ0VfQVRUUihwb3J0X3Rlc3QsIFNfSVJVU1IgfCBTX0lXVVNSLAoJCSAgIHNob3dfcG9ydF90ZXN0LCBzdG9yZV9wb3J0X3Rlc3QpOwoKLyoqCiAqIHNob3dfcWhlYWRzOiBETUEgY29udGVudHMgb2YgYWxsIHF1ZXVlIGhlYWRzCiAqCiAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBzc2l6ZV90IHNob3dfcWhlYWRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCgkJCSAgIGNoYXIgKmJ1ZikKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBpLCBqLCBuID0gMDsKCglkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOwoJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewoJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm4gMDsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCWZvciAoaSA9IDA7IGkgPCBod19lcF9tYXgvMjsgaSsrKSB7CgkJc3RydWN0IGNpMTN4eHhfZXAgKm1FcFJ4ID0gJnVkYy0+Y2kxM3h4eF9lcFtpXTsKCQlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwVHggPSAmdWRjLT5jaTEzeHh4X2VwW2kgKyBod19lcF9tYXgvMl07CgkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKCQkJICAgICAgICJFUD0lMDJpOiBSWD0lMDhYIFRYPSUwOFhcbiIsCgkJCSAgICAgICBpLCAodTMyKW1FcFJ4LT5xaC5kbWEsICh1MzIpbUVwVHgtPnFoLmRtYSk7CgkJZm9yIChqID0gMDsgaiA8IChzaXplb2Yoc3RydWN0IGNpMTN4eHhfcWgpL3NpemVvZih1MzIpKTsgaisrKSB7CgkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCgkJCQkgICAgICAgIiAlMDRYOiAgICAlMDhYICAgICUwOFhcbiIsIGosCgkJCQkgICAgICAgKigodTMyICopbUVwUngtPnFoLnB0ciArIGopLAoJCQkJICAgICAgICooKHUzMiAqKW1FcFR4LT5xaC5wdHIgKyBqKSk7CgkJfQoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gbjsKfQpzdGF0aWMgREVWSUNFX0FUVFIocWhlYWRzLCBTX0lSVVNSLCBzaG93X3FoZWFkcywgTlVMTCk7CgovKioKICogc2hvd19yZWdpc3RlcnM6IGR1bXBzIGFsbCByZWdpc3RlcnMKICoKICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19yZWdpc3RlcnMoc3RydWN0IGRldmljZSAqZGV2LAoJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXUzMiBkdW1wWzUxMl07Cgl1bnNpZ25lZCBpLCBrLCBuID0gMDsKCglkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOwoJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewoJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm4gMDsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCWsgPSBod19yZWdpc3Rlcl9yZWFkKGR1bXAsIHNpemVvZihkdW1wKS9zaXplb2YodTMyKSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwoKCWZvciAoaSA9IDA7IGkgPCBrOyBpKyspIHsKCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAoJCQkgICAgICAgInJlZ1sweCUwNFhdID0gMHglMDhYXG4iLAoJCQkgICAgICAgaSAqICh1bnNpZ25lZClzaXplb2YodTMyKSwgZHVtcFtpXSk7Cgl9CgoJcmV0dXJuIG47Cn0KCi8qKgogKiBzdG9yZV9yZWdpc3RlcnM6IHdyaXRlcyB2YWx1ZSB0byByZWdpc3RlciBhZGRyZXNzCiAqCiAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBzc2l6ZV90IHN0b3JlX3JlZ2lzdGVycyhzdHJ1Y3QgZGV2aWNlICpkZXYsCgkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOwoJdW5zaWduZWQgbG9uZyBhZGRyLCBkYXRhLCBmbGFnczsKCglkYmdfdHJhY2UoIlslc10gJXAsICVkXG4iLCBfX2Z1bmNfXywgYnVmLCBjb3VudCk7CglpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CgkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOwoJCWdvdG8gZG9uZTsKCX0KCglpZiAoc3NjYW5mKGJ1ZiwgIiVsaSAlbGkiLCAmYWRkciwgJmRhdGEpICE9IDIpIHsKCQlkZXZfZXJyKGRldiwgIjxhZGRyPiA8ZGF0YT46IHdyaXRlIGRhdGEgdG8gcmVnaXN0ZXIgYWRkcmVzcyIpOwoJCWdvdG8gZG9uZTsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCWlmIChod19yZWdpc3Rlcl93cml0ZShhZGRyLCBkYXRhKSkKCQlkZXZfZXJyKGRldiwgImludmFsaWQgYWRkcmVzcyByYW5nZVxuIik7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwoKIGRvbmU6CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIERFVklDRV9BVFRSKHJlZ2lzdGVycywgU19JUlVTUiB8IFNfSVdVU1IsCgkJICAgc2hvd19yZWdpc3RlcnMsIHN0b3JlX3JlZ2lzdGVycyk7CgovKioKICogc2hvd19yZXF1ZXN0czogRE1BIGNvbnRlbnRzIG9mIGFsbCByZXF1ZXN0cyBjdXJyZW50bHkgcXVldWVkIChhbGwgZW5kcHRzKQogKgogKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgc3NpemVfdCBzaG93X3JlcXVlc3RzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCgkJCSAgICAgY2hhciAqYnVmKQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXN0cnVjdCBsaXN0X2hlYWQgICAqcHRyID0gTlVMTDsKCXN0cnVjdCBjaTEzeHh4X3JlcSAqcmVxID0gTlVMTDsKCXVuc2lnbmVkIGksIGosIG4gPSAwLCBxU2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2kxM3h4eF90ZCkvc2l6ZW9mKHUzMik7CgoJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuIDA7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7Cglmb3IgKGkgPSAwOyBpIDwgaHdfZXBfbWF4OyBpKyspCgkJbGlzdF9mb3JfZWFjaChwdHIsICZ1ZGMtPmNpMTN4eHhfZXBbaV0ucWgucXVldWUpCgkJewoJCQlyZXEgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGNpMTN4eHhfcmVxLCBxdWV1ZSk7CgoJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAoJCQkJCSJFUD0lMDJpOiBURD0lMDhYICVzXG4iLAoJCQkJCWkgJSBod19lcF9tYXgvMiwgKHUzMilyZXEtPmRtYSwKCQkJCQkoKGkgPCBod19lcF9tYXgvMikgPyAiUlgiIDogIlRYIikpOwoKCQkJZm9yIChqID0gMDsgaiA8IHFTaXplOyBqKyspCgkJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAoJCQkJCQkiICUwNFg6ICAgICUwOFhcbiIsIGosCgkJCQkJCSooKHUzMiAqKXJlcS0+cHRyICsgaikpOwoJCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CgoJcmV0dXJuIG47Cn0Kc3RhdGljIERFVklDRV9BVFRSKHJlcXVlc3RzLCBTX0lSVVNSLCBzaG93X3JlcXVlc3RzLCBOVUxMKTsKCi8qKgogKiBkYmdfY3JlYXRlX2ZpbGVzOiBpbml0aWFsaXplcyB0aGUgYXR0cmlidXRlIGludGVyZmFjZQogKiBAZGV2OiBkZXZpY2UKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCl9fbWF5YmVfdW51c2VkIHN0YXRpYyBpbnQgZGJnX2NyZWF0ZV9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCWludCByZXR2YWwgPSAwOwoKCWlmIChkZXYgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZXZpY2UpOwoJaWYgKHJldHZhbCkKCQlnb3RvIGRvbmU7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHJpdmVyKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9kZXZpY2U7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZXZlbnRzKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9kcml2ZXI7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaW50ZXJzKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9ldmVudHM7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcG9ydF90ZXN0KTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9pbnRlcnM7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcWhlYWRzKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9wb3J0X3Rlc3Q7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnaXN0ZXJzKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9xaGVhZHM7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVxdWVzdHMpOwoJaWYgKHJldHZhbCkKCQlnb3RvIHJtX3JlZ2lzdGVyczsKCXJldHVybiAwOwoKIHJtX3JlZ2lzdGVyczoKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWdpc3RlcnMpOwogcm1fcWhlYWRzOgoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3FoZWFkcyk7CiBybV9wb3J0X3Rlc3Q6CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcG9ydF90ZXN0KTsKIHJtX2ludGVyczoKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9pbnRlcnMpOwogcm1fZXZlbnRzOgoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2V2ZW50cyk7CiBybV9kcml2ZXI6CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHJpdmVyKTsKIHJtX2RldmljZToKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9kZXZpY2UpOwogZG9uZToKCXJldHVybiByZXR2YWw7Cn0KCi8qKgogKiBkYmdfcmVtb3ZlX2ZpbGVzOiBkZXN0cm95cyB0aGUgYXR0cmlidXRlIGludGVyZmFjZQogKiBAZGV2OiBkZXZpY2UKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCl9fbWF5YmVfdW51c2VkIHN0YXRpYyBpbnQgZGJnX3JlbW92ZV9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCWlmIChkZXYgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXF1ZXN0cyk7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnaXN0ZXJzKTsKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9xaGVhZHMpOwoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3BvcnRfdGVzdCk7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaW50ZXJzKTsKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9ldmVudHMpOwoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RyaXZlcik7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGV2aWNlKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFVUSUwgYmxvY2sKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioKICogX3VzYl9hZGRyOiBjYWxjdWxhdGVzIGVuZHBvaW50IGFkZHJlc3MgZnJvbSBkaXJlY3Rpb24gJiBudW1iZXIKICogQGVwOiAgZW5kcG9pbnQKICovCnN0YXRpYyBpbmxpbmUgdTggX3VzYl9hZGRyKHN0cnVjdCBjaTEzeHh4X2VwICplcCkKewoJcmV0dXJuICgoZXAtPmRpciA9PSBUWCkgPyBVU0JfRU5EUE9JTlRfRElSX01BU0sgOiAwKSB8IGVwLT5udW07Cn0KCi8qKgogKiBfaGFyZHdhcmVfcXVldWU6IGNvbmZpZ3VyZXMgYSByZXF1ZXN0IGF0IGhhcmR3YXJlIGxldmVsCiAqIEBnYWRnZXQ6IGdhZGdldAogKiBAbUVwOiAgICBlbmRwb2ludAogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBfaGFyZHdhcmVfZW5xdWV1ZShzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwLCBzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEpCnsKCXVuc2lnbmVkIGk7CglpbnQgcmV0ID0gMDsKCXVuc2lnbmVkIGxlbmd0aCA9IG1SZXEtPnJlcS5sZW5ndGg7CgoJdHJhY2UoIiVwLCAlcCIsIG1FcCwgbVJlcSk7CgoJLyogZG9uJ3QgcXVldWUgdHdpY2UgKi8KCWlmIChtUmVxLT5yZXEuc3RhdHVzID09IC1FQUxSRUFEWSkKCQlyZXR1cm4gLUVBTFJFQURZOwoKCW1SZXEtPnJlcS5zdGF0dXMgPSAtRUFMUkVBRFk7CglpZiAobGVuZ3RoICYmICFtUmVxLT5yZXEuZG1hKSB7CgkJbVJlcS0+cmVxLmRtYSA9IFwKCQkJZG1hX21hcF9zaW5nbGUobUVwLT5kZXZpY2UsIG1SZXEtPnJlcS5idWYsCgkJCQkgICAgICAgbGVuZ3RoLCBtRXAtPmRpciA/IERNQV9UT19ERVZJQ0UgOgoJCQkJICAgICAgIERNQV9GUk9NX0RFVklDRSk7CgkJaWYgKG1SZXEtPnJlcS5kbWEgPT0gMCkKCQkJcmV0dXJuIC1FTk9NRU07CgoJCW1SZXEtPm1hcCA9IDE7Cgl9CgoJaWYgKG1SZXEtPnJlcS56ZXJvICYmIGxlbmd0aCAmJiAobGVuZ3RoICUgbUVwLT5lcC5tYXhwYWNrZXQgPT0gMCkpIHsKCQltUmVxLT56cHRyID0gZG1hX3Bvb2xfYWxsb2MobUVwLT50ZF9wb29sLCBHRlBfQVRPTUlDLAoJCQkJCSAgICZtUmVxLT56ZG1hKTsKCQlpZiAobVJlcS0+enB0ciA9PSBOVUxMKSB7CgkJCWlmIChtUmVxLT5tYXApIHsKCQkJCWRtYV91bm1hcF9zaW5nbGUobUVwLT5kZXZpY2UsIG1SZXEtPnJlcS5kbWEsCgkJCQkJbGVuZ3RoLCBtRXAtPmRpciA/IERNQV9UT19ERVZJQ0UgOgoJCQkJCURNQV9GUk9NX0RFVklDRSk7CgkJCQltUmVxLT5yZXEuZG1hID0gMDsKCQkJCW1SZXEtPm1hcCAgICAgPSAwOwoJCQl9CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCQltZW1zZXQobVJlcS0+enB0ciwgMCwgc2l6ZW9mKCptUmVxLT56cHRyKSk7CgkJbVJlcS0+enB0ci0+bmV4dCAgICA9IFREX1RFUk1JTkFURTsKCQltUmVxLT56cHRyLT50b2tlbiAgID0gVERfU1RBVFVTX0FDVElWRTsKCQlpZiAoIW1SZXEtPnJlcS5ub19pbnRlcnJ1cHQpCgkJCW1SZXEtPnpwdHItPnRva2VuICAgfD0gVERfSU9DOwoJfQoJLyoKCSAqIFREIGNvbmZpZ3VyYXRpb24KCSAqIFRPRE8gLSBoYW5kbGUgcmVxdWVzdHMgd2hpY2ggc3Bhd25zIGludG8gc2V2ZXJhbCBURHMKCSAqLwoJbWVtc2V0KG1SZXEtPnB0ciwgMCwgc2l6ZW9mKCptUmVxLT5wdHIpKTsKCW1SZXEtPnB0ci0+dG9rZW4gICAgPSBsZW5ndGggPDwgZmZzX25yKFREX1RPVEFMX0JZVEVTKTsKCW1SZXEtPnB0ci0+dG9rZW4gICAmPSBURF9UT1RBTF9CWVRFUzsKCW1SZXEtPnB0ci0+dG9rZW4gICB8PSBURF9TVEFUVVNfQUNUSVZFOwoJaWYgKG1SZXEtPnpwdHIpIHsKCQltUmVxLT5wdHItPm5leHQgICAgPSBtUmVxLT56ZG1hOwoJfSBlbHNlIHsKCQltUmVxLT5wdHItPm5leHQgICAgPSBURF9URVJNSU5BVEU7CgkJaWYgKCFtUmVxLT5yZXEubm9faW50ZXJydXB0KQoJCQltUmVxLT5wdHItPnRva2VuICB8PSBURF9JT0M7Cgl9CgltUmVxLT5wdHItPnBhZ2VbMF0gID0gbVJlcS0+cmVxLmRtYTsKCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspCgkJbVJlcS0+cHRyLT5wYWdlW2ldID0KCQkJKG1SZXEtPnJlcS5kbWEgKyBpICogQ0kxM1hYWF9QQUdFX1NJWkUpICYgflREX1JFU0VSVkVEX01BU0s7CgoJaWYgKCFsaXN0X2VtcHR5KCZtRXAtPnFoLnF1ZXVlKSkgewoJCXN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcVByZXY7CgkJaW50IG4gPSBod19lcF9iaXQobUVwLT5udW0sIG1FcC0+ZGlyKTsKCQlpbnQgdG1wX3N0YXQ7CgoJCW1SZXFQcmV2ID0gbGlzdF9lbnRyeShtRXAtPnFoLnF1ZXVlLnByZXYsCgkJCQlzdHJ1Y3QgY2kxM3h4eF9yZXEsIHF1ZXVlKTsKCQlpZiAobVJlcVByZXYtPnpwdHIpCgkJCW1SZXFQcmV2LT56cHRyLT5uZXh0ID0gbVJlcS0+ZG1hICYgVERfQUREUl9NQVNLOwoJCWVsc2UKCQkJbVJlcVByZXYtPnB0ci0+bmV4dCA9IG1SZXEtPmRtYSAmIFREX0FERFJfTUFTSzsKCQl3bWIoKTsKCQlpZiAoaHdfY3JlYWQoQ0FQX0VORFBUUFJJTUUsIEJJVChuKSkpCgkJCWdvdG8gZG9uZTsKCQlkbyB7CgkJCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfQVREVFcsIFVTQkNNRF9BVERUVyk7CgkJCXRtcF9zdGF0ID0gaHdfY3JlYWQoQ0FQX0VORFBUU1RBVCwgQklUKG4pKTsKCQl9IHdoaWxlICghaHdfY3JlYWQoQ0FQX1VTQkNNRCwgVVNCQ01EX0FURFRXKSk7CgkJaHdfY3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9BVERUVywgMCk7CgkJaWYgKHRtcF9zdGF0KQoJCQlnb3RvIGRvbmU7Cgl9CgoJLyogIFFIIGNvbmZpZ3VyYXRpb24gKi8KCW1FcC0+cWgucHRyLT50ZC5uZXh0ICAgPSBtUmVxLT5kbWE7ICAgIC8qIFRFUk1JTkFURSA9IDAgKi8KCW1FcC0+cWgucHRyLT50ZC50b2tlbiAmPSB+VERfU1RBVFVTOyAgIC8qIGNsZWFyIHN0YXR1cyAqLwoJbUVwLT5xaC5wdHItPmNhcCB8PSAgUUhfWkxUOwoKCXdtYigpOyAgIC8qIHN5bmNocm9uaXplIGJlZm9yZSBlcCBwcmltZSAqLwoKCXJldCA9IGh3X2VwX3ByaW1lKG1FcC0+bnVtLCBtRXAtPmRpciwKCQkJICAgbUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpOwpkb25lOgoJcmV0dXJuIHJldDsKfQoKLyoqCiAqIF9oYXJkd2FyZV9kZXF1ZXVlOiBoYW5kbGVzIGEgcmVxdWVzdCBhdCBoYXJkd2FyZSBsZXZlbAogKiBAZ2FkZ2V0OiBnYWRnZXQKICogQG1FcDogICAgZW5kcG9pbnQKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgX2hhcmR3YXJlX2RlcXVldWUoc3RydWN0IGNpMTN4eHhfZXAgKm1FcCwgc3RydWN0IGNpMTN4eHhfcmVxICptUmVxKQp7Cgl0cmFjZSgiJXAsICVwIiwgbUVwLCBtUmVxKTsKCglpZiAobVJlcS0+cmVxLnN0YXR1cyAhPSAtRUFMUkVBRFkpCgkJcmV0dXJuIC1FSU5WQUw7CgoJaWYgKChURF9TVEFUVVNfQUNUSVZFICYgbVJlcS0+cHRyLT50b2tlbikgIT0gMCkKCQlyZXR1cm4gLUVCVVNZOwoKCWlmIChtUmVxLT56cHRyKSB7CgkJaWYgKChURF9TVEFUVVNfQUNUSVZFICYgbVJlcS0+enB0ci0+dG9rZW4pICE9IDApCgkJCXJldHVybiAtRUJVU1k7CgkJZG1hX3Bvb2xfZnJlZShtRXAtPnRkX3Bvb2wsIG1SZXEtPnpwdHIsIG1SZXEtPnpkbWEpOwoJCW1SZXEtPnpwdHIgPSBOVUxMOwoJfQoKCW1SZXEtPnJlcS5zdGF0dXMgPSAwOwoKCWlmIChtUmVxLT5tYXApIHsKCQlkbWFfdW5tYXBfc2luZ2xlKG1FcC0+ZGV2aWNlLCBtUmVxLT5yZXEuZG1hLCBtUmVxLT5yZXEubGVuZ3RoLAoJCQkJIG1FcC0+ZGlyID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CgkJbVJlcS0+cmVxLmRtYSA9IDA7CgkJbVJlcS0+bWFwICAgICA9IDA7Cgl9CgoJbVJlcS0+cmVxLnN0YXR1cyA9IG1SZXEtPnB0ci0+dG9rZW4gJiBURF9TVEFUVVM7CglpZiAoKFREX1NUQVRVU19IQUxURUQgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQoJCW1SZXEtPnJlcS5zdGF0dXMgPSAtMTsKCWVsc2UgaWYgKChURF9TVEFUVVNfRFRfRVJSICYgbVJlcS0+cmVxLnN0YXR1cykgIT0gMCkKCQltUmVxLT5yZXEuc3RhdHVzID0gLTE7CgllbHNlIGlmICgoVERfU1RBVFVTX1RSX0VSUiAmIG1SZXEtPnJlcS5zdGF0dXMpICE9IDApCgkJbVJlcS0+cmVxLnN0YXR1cyA9IC0xOwoKCW1SZXEtPnJlcS5hY3R1YWwgICA9IG1SZXEtPnB0ci0+dG9rZW4gJiBURF9UT1RBTF9CWVRFUzsKCW1SZXEtPnJlcS5hY3R1YWwgPj49IGZmc19ucihURF9UT1RBTF9CWVRFUyk7CgltUmVxLT5yZXEuYWN0dWFsICAgPSBtUmVxLT5yZXEubGVuZ3RoIC0gbVJlcS0+cmVxLmFjdHVhbDsKCW1SZXEtPnJlcS5hY3R1YWwgICA9IG1SZXEtPnJlcS5zdGF0dXMgPyAwIDogbVJlcS0+cmVxLmFjdHVhbDsKCglyZXR1cm4gbVJlcS0+cmVxLmFjdHVhbDsKfQoKLyoqCiAqIF9lcF9udWtlOiBkZXF1ZXVlcyBhbGwgZW5kcG9pbnQgcmVxdWVzdHMKICogQG1FcDogZW5kcG9pbnQKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICogQ2FsbGVyIG11c3QgaG9sZCBsb2NrCiAqLwpzdGF0aWMgaW50IF9lcF9udWtlKHN0cnVjdCBjaTEzeHh4X2VwICptRXApCl9fcmVsZWFzZXMobUVwLT5sb2NrKQpfX2FjcXVpcmVzKG1FcC0+bG9jaykKewoJdHJhY2UoIiVwIiwgbUVwKTsKCglpZiAobUVwID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgoJaHdfZXBfZmx1c2gobUVwLT5udW0sIG1FcC0+ZGlyKTsKCgl3aGlsZSAoIWxpc3RfZW1wdHkoJm1FcC0+cWgucXVldWUpKSB7CgoJCS8qIHBvcCBvbGRlc3QgcmVxdWVzdCAqLwoJCXN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSA9IFwKCQkJbGlzdF9lbnRyeShtRXAtPnFoLnF1ZXVlLm5leHQsCgkJCQkgICBzdHJ1Y3QgY2kxM3h4eF9yZXEsIHF1ZXVlKTsKCQlsaXN0X2RlbF9pbml0KCZtUmVxLT5xdWV1ZSk7CgkJbVJlcS0+cmVxLnN0YXR1cyA9IC1FU0hVVERPV047CgoJCWlmIChtUmVxLT5yZXEuY29tcGxldGUgIT0gTlVMTCkgewoJCQlzcGluX3VubG9jayhtRXAtPmxvY2spOwoJCQltUmVxLT5yZXEuY29tcGxldGUoJm1FcC0+ZXAsICZtUmVxLT5yZXEpOwoJCQlzcGluX2xvY2sobUVwLT5sb2NrKTsKCQl9Cgl9CglyZXR1cm4gMDsKfQoKLyoqCiAqIF9nYWRnZXRfc3RvcF9hY3Rpdml0eTogc3RvcHMgYWxsIFVTQiBhY3Rpdml0eSwgZmx1c2hlcyAmIGRpc2FibGVzIGFsbCBlbmRwdHMKICogQGdhZGdldDogZ2FkZ2V0CiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqIENhbGxlciBtdXN0IGhvbGQgbG9jawogKi8Kc3RhdGljIGludCBfZ2FkZ2V0X3N0b3BfYWN0aXZpdHkoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKewoJc3RydWN0IHVzYl9lcCAqZXA7CglzdHJ1Y3QgY2kxM3h4eCAgICAqdWRjID0gY29udGFpbmVyX29mKGdhZGdldCwgc3RydWN0IGNpMTN4eHgsIGdhZGdldCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXRyYWNlKCIlcCIsIGdhZGdldCk7CgoJaWYgKGdhZGdldCA9PSBOVUxMKQoJCXJldHVybiAtRUlOVkFMOwoKCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoJdWRjLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKCXVkYy0+cmVtb3RlX3dha2V1cCA9IDA7Cgl1ZGMtPnN1c3BlbmRlZCA9IDA7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwoKCS8qIGZsdXNoIGFsbCBlbmRwb2ludHMgKi8KCWdhZGdldF9mb3JfZWFjaF9lcChlcCwgZ2FkZ2V0KSB7CgkJdXNiX2VwX2ZpZm9fZmx1c2goZXApOwoJfQoJdXNiX2VwX2ZpZm9fZmx1c2goJnVkYy0+ZXAwb3V0LmVwKTsKCXVzYl9lcF9maWZvX2ZsdXNoKCZ1ZGMtPmVwMGluLmVwKTsKCgl1ZGMtPmRyaXZlci0+ZGlzY29ubmVjdChnYWRnZXQpOwoKCS8qIG1ha2Ugc3VyZSB0byBkaXNhYmxlIGFsbCBlbmRwb2ludHMgKi8KCWdhZGdldF9mb3JfZWFjaF9lcChlcCwgZ2FkZ2V0KSB7CgkJdXNiX2VwX2Rpc2FibGUoZXApOwoJfQoJdXNiX2VwX2Rpc2FibGUoJnVkYy0+ZXAwb3V0LmVwKTsKCXVzYl9lcF9kaXNhYmxlKCZ1ZGMtPmVwMGluLmVwKTsKCglpZiAodWRjLT5zdGF0dXMgIT0gTlVMTCkgewoJCXVzYl9lcF9mcmVlX3JlcXVlc3QoJnVkYy0+ZXAwaW4uZXAsIHVkYy0+c3RhdHVzKTsKCQl1ZGMtPnN0YXR1cyA9IE5VTEw7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVNSIGJsb2NrCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIGlzcl9yZXNldF9oYW5kbGVyOiBVU0IgcmVzZXQgaW50ZXJydXB0IGhhbmRsZXIKICogQHVkYzogVURDIGRldmljZQogKgogKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBVU0IgZW5naW5lIGFmdGVyIGEgYnVzIHJlc2V0IG9jY3VycmVkCiAqLwpzdGF0aWMgdm9pZCBpc3JfcmVzZXRfaGFuZGxlcihzdHJ1Y3QgY2kxM3h4eCAqdWRjKQpfX3JlbGVhc2VzKHVkYy0+bG9jaykKX19hY3F1aXJlcyh1ZGMtPmxvY2spCnsKCWludCByZXR2YWw7CgoJdHJhY2UoIiVwIiwgdWRjKTsKCglpZiAodWRjID09IE5VTEwpIHsKCQllcnIoIkVJTlZBTCIpOwoJCXJldHVybjsKCX0KCglkYmdfZXZlbnQoMHhGRiwgIkJVUyBSU1QiLCAwKTsKCglzcGluX3VubG9jayh1ZGMtPmxvY2spOwoJcmV0dmFsID0gX2dhZGdldF9zdG9wX2FjdGl2aXR5KCZ1ZGMtPmdhZGdldCk7CglpZiAocmV0dmFsKQoJCWdvdG8gZG9uZTsKCglyZXR2YWwgPSBod191c2JfcmVzZXQoKTsKCWlmIChyZXR2YWwpCgkJZ290byBkb25lOwoKCXJldHZhbCA9IHVzYl9lcF9lbmFibGUoJnVkYy0+ZXAwb3V0LmVwLCAmY3RybF9lbmRwdF9vdXRfZGVzYyk7CglpZiAocmV0dmFsKQoJCWdvdG8gZG9uZTsKCglyZXR2YWwgPSB1c2JfZXBfZW5hYmxlKCZ1ZGMtPmVwMGluLmVwLCAmY3RybF9lbmRwdF9pbl9kZXNjKTsKCWlmICghcmV0dmFsKSB7CgkJdWRjLT5zdGF0dXMgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdCgmdWRjLT5lcDBpbi5lcCwgR0ZQX0FUT01JQyk7CgkJaWYgKHVkYy0+c3RhdHVzID09IE5VTEwpIHsKCQkJdXNiX2VwX2Rpc2FibGUoJnVkYy0+ZXAwb3V0LmVwKTsKCQkJcmV0dmFsID0gLUVOT01FTTsKCQl9Cgl9CglzcGluX2xvY2sodWRjLT5sb2NrKTsKCiBkb25lOgoJaWYgKHJldHZhbCkKCQllcnIoImVycm9yOiAlaSIsIHJldHZhbCk7Cn0KCi8qKgogKiBpc3JfZ2V0X3N0YXR1c19jb21wbGV0ZTogZ2V0X3N0YXR1cyByZXF1ZXN0IGNvbXBsZXRlIGZ1bmN0aW9uCiAqIEBlcDogIGVuZHBvaW50CiAqIEByZXE6IHJlcXVlc3QgaGFuZGxlZAogKgogKiBDYWxsZXIgbXVzdCByZWxlYXNlIGxvY2sKICovCnN0YXRpYyB2b2lkIGlzcl9nZXRfc3RhdHVzX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKewoJdHJhY2UoIiVwLCAlcCIsIGVwLCByZXEpOwoKCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMKSB7CgkJZXJyKCJFSU5WQUwiKTsKCQlyZXR1cm47Cgl9CgoJa2ZyZWUocmVxLT5idWYpOwoJdXNiX2VwX2ZyZWVfcmVxdWVzdChlcCwgcmVxKTsKfQoKLyoqCiAqIGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlOiBnZXRfc3RhdHVzIHJlcXVlc3QgcmVzcG9uc2UKICogQHVkYzogdWRjIHN0cnVjdAogKiBAc2V0dXA6IHNldHVwIHJlcXVlc3QgcGFja2V0CiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlKHN0cnVjdCBjaTEzeHh4ICp1ZGMsCgkJCQkgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpzZXR1cCkKX19yZWxlYXNlcyhtRXAtPmxvY2spCl9fYWNxdWlyZXMobUVwLT5sb2NrKQp7CglzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwID0gJnVkYy0+ZXAwaW47CglzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9IE5VTEw7CglnZnBfdCBnZnBfZmxhZ3MgPSBHRlBfQVRPTUlDOwoJaW50IGRpciwgbnVtLCByZXR2YWw7CgoJdHJhY2UoIiVwLCAlcCIsIG1FcCwgc2V0dXApOwoKCWlmIChtRXAgPT0gTlVMTCB8fCBzZXR1cCA9PSBOVUxMKQoJCXJldHVybiAtRUlOVkFMOwoKCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CglyZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdCgmbUVwLT5lcCwgZ2ZwX2ZsYWdzKTsKCXNwaW5fbG9jayhtRXAtPmxvY2spOwoJaWYgKHJlcSA9PSBOVUxMKQoJCXJldHVybiAtRU5PTUVNOwoKCXJlcS0+Y29tcGxldGUgPSBpc3JfZ2V0X3N0YXR1c19jb21wbGV0ZTsKCXJlcS0+bGVuZ3RoICAgPSAyOwoJcmVxLT5idWYgICAgICA9IGt6YWxsb2MocmVxLT5sZW5ndGgsIGdmcF9mbGFncyk7CglpZiAocmVxLT5idWYgPT0gTlVMTCkgewoJCXJldHZhbCA9IC1FTk9NRU07CgkJZ290byBlcnJfZnJlZV9yZXE7Cgl9CgoJaWYgKChzZXR1cC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spID09IFVTQl9SRUNJUF9ERVZJQ0UpIHsKCQkvKiBBc3N1bWUgdGhhdCBkZXZpY2UgaXMgYnVzIHBvd2VyZWQgZm9yIG5vdy4gKi8KCQkqKCh1MTYgKilyZXEtPmJ1ZikgPSBfdWRjLT5yZW1vdGVfd2FrZXVwIDw8IDE7CgkJcmV0dmFsID0gMDsKCX0gZWxzZSBpZiAoKHNldHVwLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgXAoJCSAgID09IFVTQl9SRUNJUF9FTkRQT0lOVCkgewoJCWRpciA9IChsZTE2X3RvX2NwdShzZXR1cC0+d0luZGV4KSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPwoJCQlUWCA6IFJYOwoJCW51bSA9ICBsZTE2X3RvX2NwdShzZXR1cC0+d0luZGV4KSAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKCQkqKCh1MTYgKilyZXEtPmJ1ZikgPSBod19lcF9nZXRfaGFsdChudW0sIGRpcik7Cgl9CgkvKiBlbHNlIGRvIG5vdGhpbmc7IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCgoJc3Bpbl91bmxvY2sobUVwLT5sb2NrKTsKCXJldHZhbCA9IHVzYl9lcF9xdWV1ZSgmbUVwLT5lcCwgcmVxLCBnZnBfZmxhZ3MpOwoJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CglpZiAocmV0dmFsKQoJCWdvdG8gZXJyX2ZyZWVfYnVmOwoKCXJldHVybiAwOwoKIGVycl9mcmVlX2J1ZjoKCWtmcmVlKHJlcS0+YnVmKTsKIGVycl9mcmVlX3JlcToKCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7Cgl1c2JfZXBfZnJlZV9yZXF1ZXN0KCZtRXAtPmVwLCByZXEpOwoJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogaXNyX3NldHVwX3N0YXR1c19jb21wbGV0ZTogc2V0dXBfc3RhdHVzIHJlcXVlc3QgY29tcGxldGUgZnVuY3Rpb24KICogQGVwOiAgZW5kcG9pbnQKICogQHJlcTogcmVxdWVzdCBoYW5kbGVkCiAqCiAqIENhbGxlciBtdXN0IHJlbGVhc2UgbG9jay4gUHV0IHRoZSBwb3J0IGluIHRlc3QgbW9kZSBpZiB0ZXN0IG1vZGUKICogZmVhdHVyZSBpcyBzZWxlY3RlZC4KICovCnN0YXRpYyB2b2lkCmlzcl9zZXR1cF9zdGF0dXNfY29tcGxldGUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gcmVxLT5jb250ZXh0OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl0cmFjZSgiJXAsICVwIiwgZXAsIHJlcSk7CgoJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CglpZiAodWRjLT50ZXN0X21vZGUpCgkJaHdfcG9ydF90ZXN0X3NldCh1ZGMtPnRlc3RfbW9kZSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwp9CgovKioKICogaXNyX3NldHVwX3N0YXR1c19waGFzZTogcXVldWVzIHRoZSBzdGF0dXMgcGhhc2Ugb2YgYSBzZXR1cCB0cmFuc2F0aW9uCiAqIEB1ZGM6IHVkYyBzdHJ1Y3QKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgaXNyX3NldHVwX3N0YXR1c19waGFzZShzdHJ1Y3QgY2kxM3h4eCAqdWRjKQpfX3JlbGVhc2VzKG1FcC0+bG9jaykKX19hY3F1aXJlcyhtRXAtPmxvY2spCnsKCWludCByZXR2YWw7CglzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwOwoKCXRyYWNlKCIlcCIsIHVkYyk7CgoJbUVwID0gKHVkYy0+ZXAwX2RpciA9PSBUWCkgPyAmdWRjLT5lcDBvdXQgOiAmdWRjLT5lcDBpbjsKCXVkYy0+c3RhdHVzLT5jb250ZXh0ID0gdWRjOwoJdWRjLT5zdGF0dXMtPmNvbXBsZXRlID0gaXNyX3NldHVwX3N0YXR1c19jb21wbGV0ZTsKCglzcGluX3VubG9jayhtRXAtPmxvY2spOwoJcmV0dmFsID0gdXNiX2VwX3F1ZXVlKCZtRXAtPmVwLCB1ZGMtPnN0YXR1cywgR0ZQX0FUT01JQyk7CglzcGluX2xvY2sobUVwLT5sb2NrKTsKCglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogaXNyX3RyX2NvbXBsZXRlX2xvdzogdHJhbnNhY3Rpb24gY29tcGxldGUgbG93IGxldmVsIGhhbmRsZXIKICogQG1FcDogZW5kcG9pbnQKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICogQ2FsbGVyIG11c3QgaG9sZCBsb2NrCiAqLwpzdGF0aWMgaW50IGlzcl90cl9jb21wbGV0ZV9sb3coc3RydWN0IGNpMTN4eHhfZXAgKm1FcCkKX19yZWxlYXNlcyhtRXAtPmxvY2spCl9fYWNxdWlyZXMobUVwLT5sb2NrKQp7CglzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEsICptUmVxVGVtcDsKCWludCByZXR2YWw7CgoJdHJhY2UoIiVwIiwgbUVwKTsKCglpZiAobGlzdF9lbXB0eSgmbUVwLT5xaC5xdWV1ZSkpCgkJcmV0dXJuIC1FSU5WQUw7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1SZXEsIG1SZXFUZW1wLCAmbUVwLT5xaC5xdWV1ZSwKCQkJcXVldWUpIHsKCQlyZXR2YWwgPSBfaGFyZHdhcmVfZGVxdWV1ZShtRXAsIG1SZXEpOwoJCWlmIChyZXR2YWwgPCAwKQoJCQlicmVhazsKCQlsaXN0X2RlbF9pbml0KCZtUmVxLT5xdWV1ZSk7CgkJZGJnX2RvbmUoX3VzYl9hZGRyKG1FcCksIG1SZXEtPnB0ci0+dG9rZW4sIHJldHZhbCk7CgkJaWYgKG1SZXEtPnJlcS5jb21wbGV0ZSAhPSBOVUxMKSB7CgkJCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CgkJCW1SZXEtPnJlcS5jb21wbGV0ZSgmbUVwLT5lcCwgJm1SZXEtPnJlcSk7CgkJCXNwaW5fbG9jayhtRXAtPmxvY2spOwoJCX0KCX0KCglpZiAocmV0dmFsID09IEVCVVNZKQoJCXJldHZhbCA9IDA7CglpZiAocmV0dmFsIDwgMCkKCQlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJET05FIiwgcmV0dmFsKTsKCglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogaXNyX3RyX2NvbXBsZXRlX2hhbmRsZXI6IHRyYW5zYWN0aW9uIGNvbXBsZXRlIGludGVycnVwdCBoYW5kbGVyCiAqIEB1ZGM6IFVEQyBkZXNjcmlwdG9yCiAqCiAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0cmFmZmljIGV2ZW50cwogKi8Kc3RhdGljIHZvaWQgaXNyX3RyX2NvbXBsZXRlX2hhbmRsZXIoc3RydWN0IGNpMTN4eHggKnVkYykKX19yZWxlYXNlcyh1ZGMtPmxvY2spCl9fYWNxdWlyZXModWRjLT5sb2NrKQp7Cgl1bnNpZ25lZCBpOwoJdTggdG1vZGUgPSAwOwoKCXRyYWNlKCIlcCIsIHVkYyk7CgoJaWYgKHVkYyA9PSBOVUxMKSB7CgkJZXJyKCJFSU5WQUwiKTsKCQlyZXR1cm47Cgl9CgoJZm9yIChpID0gMDsgaSA8IGh3X2VwX21heDsgaSsrKSB7CgkJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCAgPSAmdWRjLT5jaTEzeHh4X2VwW2ldOwoJCWludCB0eXBlLCBudW0sIGVyciA9IC1FSU5WQUw7CgkJc3RydWN0IHVzYl9jdHJscmVxdWVzdCByZXE7CgoJCWlmIChtRXAtPmRlc2MgPT0gTlVMTCkKCQkJY29udGludWU7ICAgLyogbm90IGNvbmZpZ3VyZWQgKi8KCgkJaWYgKGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlKGkpKSB7CgkJCWVyciA9IGlzcl90cl9jb21wbGV0ZV9sb3cobUVwKTsKCQkJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKSB7CgkJCQlpZiAoZXJyID4gMCkgICAvKiBuZWVkcyBzdGF0dXMgcGhhc2UgKi8KCQkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKHVkYyk7CgkJCQlpZiAoZXJyIDwgMCkgewoJCQkJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwKCQkJCQkJICAiRVJST1IiLCBlcnIpOwoJCQkJCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CgkJCQkJaWYgKHVzYl9lcF9zZXRfaGFsdCgmbUVwLT5lcCkpCgkJCQkJCWVycigiZXJyb3I6IGVwX3NldF9oYWx0Iik7CgkJCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmIChtRXAtPnR5cGUgIT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCB8fAoJCSAgICAhaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfc3RhdHVzKGkpKQoJCQljb250aW51ZTsKCgkJaWYgKGkgIT0gMCkgewoJCQl3YXJuKCJjdHJsIHRyYWZmaWMgcmVjZWl2ZWQgYXQgZW5kcG9pbnQiKTsKCQkJY29udGludWU7CgkJfQoKCQkvKgoJCSAqIEZsdXNoIGRhdGEgYW5kIGhhbmRzaGFrZSB0cmFuc2FjdGlvbnMgb2YgcHJldmlvdXMKCQkgKiBzZXR1cCBwYWNrZXQuCgkJICovCgkJX2VwX251a2UoJnVkYy0+ZXAwb3V0KTsKCQlfZXBfbnVrZSgmdWRjLT5lcDBpbik7CgoJCS8qIHJlYWRfc2V0dXBfcGFja2V0ICovCgkJZG8gewoJCQlod190ZXN0X2FuZF9zZXRfc2V0dXBfZ3VhcmQoKTsKCQkJbWVtY3B5KCZyZXEsICZtRXAtPnFoLnB0ci0+c2V0dXAsIHNpemVvZihyZXEpKTsKCQl9IHdoaWxlICghaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfZ3VhcmQoKSk7CgoJCXR5cGUgPSByZXEuYlJlcXVlc3RUeXBlOwoKCQl1ZGMtPmVwMF9kaXIgPSAodHlwZSAmIFVTQl9ESVJfSU4pID8gVFggOiBSWDsKCgkJZGJnX3NldHVwKF91c2JfYWRkcihtRXApLCAmcmVxKTsKCgkJc3dpdGNoIChyZXEuYlJlcXVlc3QpIHsKCQljYXNlIFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToKCQkJaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9FTkRQT0lOVCkgJiYKCQkJCQlsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSA9PQoJCQkJCVVTQl9FTkRQT0lOVF9IQUxUKSB7CgkJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKCQkJCQlicmVhazsKCQkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKCQkJCW51bSAmPSBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CgkJCQlpZiAoIXVkYy0+Y2kxM3h4eF9lcFtudW1dLndlZGdlKSB7CgkJCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKCQkJCQllcnIgPSB1c2JfZXBfY2xlYXJfaGFsdCgKCQkJCQkJJnVkYy0+Y2kxM3h4eF9lcFtudW1dLmVwKTsKCQkJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKCQkJCQlpZiAoZXJyKQoJCQkJCQlicmVhazsKCQkJCX0KCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UodWRjKTsKCQkJfSBlbHNlIGlmICh0eXBlID09IChVU0JfRElSX09VVHxVU0JfUkVDSVBfREVWSUNFKSAmJgoJCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09CgkJCQkJVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQKSB7CgkJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKCQkJCQlicmVhazsKCQkJCXVkYy0+cmVtb3RlX3dha2V1cCA9IDA7CgkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKHVkYyk7CgkJCX0gZWxzZSB7CgkJCQlnb3RvIGRlbGVnYXRlOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgVVNCX1JFUV9HRVRfU1RBVFVTOgoJCQlpZiAodHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfREVWSUNFKSAgICYmCgkJCSAgICB0eXBlICE9IChVU0JfRElSX0lOfFVTQl9SRUNJUF9FTkRQT0lOVCkgJiYKCQkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0lOVEVSRkFDRSkpCgkJCQlnb3RvIGRlbGVnYXRlOwoJCQlpZiAobGUxNl90b19jcHUocmVxLndMZW5ndGgpICE9IDIgfHwKCQkJICAgIGxlMTZfdG9fY3B1KHJlcS53VmFsdWUpICAhPSAwKQoJCQkJYnJlYWs7CgkJCWVyciA9IGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlKHVkYywgJnJlcSk7CgkJCWJyZWFrOwoJCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzoKCQkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpKQoJCQkJZ290byBkZWxlZ2F0ZTsKCQkJaWYgKGxlMTZfdG9fY3B1KHJlcS53TGVuZ3RoKSAhPSAwIHx8CgkJCSAgICBsZTE2X3RvX2NwdShyZXEud0luZGV4KSAgIT0gMCkKCQkJCWJyZWFrOwoJCQllcnIgPSBod191c2Jfc2V0X2FkZHJlc3MoKHU4KWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpKTsKCQkJaWYgKGVycikKCQkJCWJyZWFrOwoJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKHVkYyk7CgkJCWJyZWFrOwoJCWNhc2UgVVNCX1JFUV9TRVRfRkVBVFVSRToKCQkJaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9FTkRQT0lOVCkgJiYKCQkJCQlsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSA9PQoJCQkJCVVTQl9FTkRQT0lOVF9IQUxUKSB7CgkJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKCQkJCQlicmVhazsKCQkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKCQkJCW51bSAmPSBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CgoJCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKCQkJCWVyciA9IHVzYl9lcF9zZXRfaGFsdCgmdWRjLT5jaTEzeHh4X2VwW251bV0uZXApOwoJCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CgkJCQlpZiAoIWVycikKCQkJCQlpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKHVkYyk7CgkJCX0gZWxzZSBpZiAodHlwZSA9PSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0RFVklDRSkpIHsKCQkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQoJCQkJCWJyZWFrOwoJCQkJc3dpdGNoIChsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSkgewoJCQkJY2FzZSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVA6CgkJCQkJdWRjLT5yZW1vdGVfd2FrZXVwID0gMTsKCQkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKHVkYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIFVTQl9ERVZJQ0VfVEVTVF9NT0RFOgoJCQkJCXRtb2RlID0gbGUxNl90b19jcHUocmVxLndJbmRleCkgPj4gODsKCQkJCQlzd2l0Y2ggKHRtb2RlKSB7CgkJCQkJY2FzZSBURVNUX0o6CgkJCQkJY2FzZSBURVNUX0s6CgkJCQkJY2FzZSBURVNUX1NFMF9OQUs6CgkJCQkJY2FzZSBURVNUX1BBQ0tFVDoKCQkJCQljYXNlIFRFU1RfRk9SQ0VfRU46CgkJCQkJCXVkYy0+dGVzdF9tb2RlID0gdG1vZGU7CgkJCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoCgkJCQkJCQkJdWRjKTsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJZGVmYXVsdDoKCQkJCQlnb3RvIGRlbGVnYXRlOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZ290byBkZWxlZ2F0ZTsKCQkJfQoJCQlicmVhazsKCQlkZWZhdWx0OgpkZWxlZ2F0ZToKCQkJaWYgKHJlcS53TGVuZ3RoID09IDApICAgLyogbm8gZGF0YSBwaGFzZSAqLwoJCQkJdWRjLT5lcDBfZGlyID0gVFg7CgoJCQlzcGluX3VubG9jayh1ZGMtPmxvY2spOwoJCQllcnIgPSB1ZGMtPmRyaXZlci0+c2V0dXAoJnVkYy0+Z2FkZ2V0LCAmcmVxKTsKCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CgkJCWJyZWFrOwoJCX0KCgkJaWYgKGVyciA8IDApIHsKCQkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRVJST1IiLCBlcnIpOwoKCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKCQkJaWYgKHVzYl9lcF9zZXRfaGFsdCgmbUVwLT5lcCkpCgkJCQllcnIoImVycm9yOiBlcF9zZXRfaGFsdCIpOwoJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKCQl9Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRU5EUFQgYmxvY2sKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioKICogZXBfZW5hYmxlOiBjb25maWd1cmUgZW5kcG9pbnQsIG1ha2luZyBpdCB1c2FibGUKICoKICogQ2hlY2sgdXNiX2VwX2VuYWJsZSgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgaW50IGVwX2VuYWJsZShzdHJ1Y3QgdXNiX2VwICplcCwKCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKewoJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKCWludCByZXR2YWwgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl0cmFjZSgiJXAsICVwIiwgZXAsIGRlc2MpOwoKCWlmIChlcCA9PSBOVUxMIHx8IGRlc2MgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCglzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKCgkvKiBvbmx5IGludGVybmFsIFNXIHNob3VsZCBlbmFibGUgY3RybCBlbmRwdHMgKi8KCgltRXAtPmRlc2MgPSBkZXNjOwoKCWlmICghbGlzdF9lbXB0eSgmbUVwLT5xaC5xdWV1ZSkpCgkJd2FybigiZW5hYmxpbmcgYSBub24tZW1wdHkgZW5kcG9pbnQhIik7CgoJbUVwLT5kaXIgID0gdXNiX2VuZHBvaW50X2Rpcl9pbihkZXNjKSA/IFRYIDogUlg7CgltRXAtPm51bSAgPSB1c2JfZW5kcG9pbnRfbnVtKGRlc2MpOwoJbUVwLT50eXBlID0gdXNiX2VuZHBvaW50X3R5cGUoZGVzYyk7CgoJbUVwLT5lcC5tYXhwYWNrZXQgPSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKTsKCglkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJFTkFCTEUiLCAwKTsKCgltRXAtPnFoLnB0ci0+Y2FwID0gMDsKCglpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCgkJbUVwLT5xaC5wdHItPmNhcCB8PSAgUUhfSU9TOwoJZWxzZSBpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCgkJbUVwLT5xaC5wdHItPmNhcCAmPSB+UUhfTVVMVDsKCWVsc2UKCQltRXAtPnFoLnB0ci0+Y2FwICY9IH5RSF9aTFQ7CgoJbUVwLT5xaC5wdHItPmNhcCB8PQoJCShtRXAtPmVwLm1heHBhY2tldCA8PCBmZnNfbnIoUUhfTUFYX1BLVCkpICYgUUhfTUFYX1BLVDsKCW1FcC0+cWgucHRyLT50ZC5uZXh0IHw9IFREX1RFUk1JTkFURTsgICAvKiBuZWVkZWQ/ICovCgoJcmV0dmFsIHw9IGh3X2VwX2VuYWJsZShtRXAtPm51bSwgbUVwLT5kaXIsIG1FcC0+dHlwZSk7CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKCXJldHVybiByZXR2YWw7Cn0KCi8qKgogKiBlcF9kaXNhYmxlOiBlbmRwb2ludCBpcyBubyBsb25nZXIgdXNhYmxlCiAqCiAqIENoZWNrIHVzYl9lcF9kaXNhYmxlKCkgYXQgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBpbnQgZXBfZGlzYWJsZShzdHJ1Y3QgdXNiX2VwICplcCkKewoJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKCWludCBkaXJlY3Rpb24sIHJldHZhbCA9IDA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXRyYWNlKCIlcCIsIGVwKTsKCglpZiAoZXAgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCWVsc2UgaWYgKG1FcC0+ZGVzYyA9PSBOVUxMKQoJCXJldHVybiAtRUJVU1k7CgoJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CgoJLyogb25seSBpbnRlcm5hbCBTVyBzaG91bGQgZGlzYWJsZSBjdHJsIGVuZHB0cyAqLwoKCWRpcmVjdGlvbiA9IG1FcC0+ZGlyOwoJZG8gewoJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkRJU0FCTEUiLCAwKTsKCgkJcmV0dmFsIHw9IF9lcF9udWtlKG1FcCk7CgkJcmV0dmFsIHw9IGh3X2VwX2Rpc2FibGUobUVwLT5udW0sIG1FcC0+ZGlyKTsKCgkJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQoJCQltRXAtPmRpciA9IChtRXAtPmRpciA9PSBUWCkgPyBSWCA6IFRYOwoKCX0gd2hpbGUgKG1FcC0+ZGlyICE9IGRpcmVjdGlvbik7CgoJbUVwLT5kZXNjID0gTlVMTDsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIHJldHZhbDsKfQoKLyoqCiAqIGVwX2FsbG9jX3JlcXVlc3Q6IGFsbG9jYXRlIGEgcmVxdWVzdCBvYmplY3QgdG8gdXNlIHdpdGggdGhpcyBlbmRwb2ludAogKgogKiBDaGVjayB1c2JfZXBfYWxsb2NfcmVxdWVzdCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICplcF9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKmVwLCBnZnBfdCBnZnBfZmxhZ3MpCnsKCXN0cnVjdCBjaTEzeHh4X2VwICAqbUVwICA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKCXN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSA9IE5VTEw7CgoJdHJhY2UoIiVwLCAlaSIsIGVwLCBnZnBfZmxhZ3MpOwoKCWlmIChlcCA9PSBOVUxMKSB7CgkJZXJyKCJFSU5WQUwiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgltUmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNpMTN4eHhfcmVxKSwgZ2ZwX2ZsYWdzKTsKCWlmIChtUmVxICE9IE5VTEwpIHsKCQlJTklUX0xJU1RfSEVBRCgmbVJlcS0+cXVldWUpOwoKCQltUmVxLT5wdHIgPSBkbWFfcG9vbF9hbGxvYyhtRXAtPnRkX3Bvb2wsIGdmcF9mbGFncywKCQkJCQkgICAmbVJlcS0+ZG1hKTsKCQlpZiAobVJlcS0+cHRyID09IE5VTEwpIHsKCQkJa2ZyZWUobVJlcSk7CgkJCW1SZXEgPSBOVUxMOwoJCX0KCX0KCglkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJBTExPQyIsIG1SZXEgPT0gTlVMTCk7CgoJcmV0dXJuIChtUmVxID09IE5VTEwpID8gTlVMTCA6ICZtUmVxLT5yZXE7Cn0KCi8qKgogKiBlcF9mcmVlX3JlcXVlc3Q6IGZyZWVzIGEgcmVxdWVzdCBvYmplY3QKICoKICogQ2hlY2sgdXNiX2VwX2ZyZWVfcmVxdWVzdCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgdm9pZCBlcF9mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQp7CglzdHJ1Y3QgY2kxM3h4eF9lcCAgKm1FcCAgPSBjb250YWluZXJfb2YoZXAsICBzdHJ1Y3QgY2kxM3h4eF9lcCwgZXApOwoJc3RydWN0IGNpMTN4eHhfcmVxICptUmVxID0gY29udGFpbmVyX29mKHJlcSwgc3RydWN0IGNpMTN4eHhfcmVxLCByZXEpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl0cmFjZSgiJXAsICVwIiwgZXAsIHJlcSk7CgoJaWYgKGVwID09IE5VTEwgfHwgcmVxID09IE5VTEwpIHsKCQllcnIoIkVJTlZBTCIpOwoJCXJldHVybjsKCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJm1SZXEtPnF1ZXVlKSkgewoJCWVycigiRUJVU1kiKTsKCQlyZXR1cm47Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CgoJaWYgKG1SZXEtPnB0cikKCQlkbWFfcG9vbF9mcmVlKG1FcC0+dGRfcG9vbCwgbVJlcS0+cHRyLCBtUmVxLT5kbWEpOwoJa2ZyZWUobVJlcSk7CgoJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRlJFRSIsIDApOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7Cn0KCi8qKgogKiBlcF9xdWV1ZTogcXVldWVzIChzdWJtaXRzKSBhbiBJL08gcmVxdWVzdCB0byBhbiBlbmRwb2ludAogKgogKiBDaGVjayB1c2JfZXBfcXVldWUoKSogYXQgdXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIGludCBlcF9xdWV1ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsCgkJICAgIGdmcF90IF9fbWF5YmVfdW51c2VkIGdmcF9mbGFncykKewoJc3RydWN0IGNpMTN4eHhfZXAgICptRXAgID0gY29udGFpbmVyX29mKGVwLCAgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKCXN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSA9IGNvbnRhaW5lcl9vZihyZXEsIHN0cnVjdCBjaTEzeHh4X3JlcSwgcmVxKTsKCWludCByZXR2YWwgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl0cmFjZSgiJXAsICVwLCAlWCIsIGVwLCByZXEsIGdmcF9mbGFncyk7CgoJaWYgKGVwID09IE5VTEwgfHwgcmVxID09IE5VTEwgfHwgbUVwLT5kZXNjID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgoJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CgoJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MICYmCgkgICAgIWxpc3RfZW1wdHkoJm1FcC0+cWgucXVldWUpKSB7CgkJX2VwX251a2UobUVwKTsKCQlyZXR2YWwgPSAtRU9WRVJGTE9XOwoJCXdhcm4oImVuZHBvaW50IGN0cmwgJVggbnVrZWQiLCBfdXNiX2FkZHIobUVwKSk7Cgl9CgoJLyogZmlyc3QgbnVrZSB0aGVuIHRlc3QgbGluaywgZS5nLiBwcmV2aW91cyBzdGF0dXMgaGFzIG5vdCBzZW50ICovCglpZiAoIWxpc3RfZW1wdHkoJm1SZXEtPnF1ZXVlKSkgewoJCXJldHZhbCA9IC1FQlVTWTsKCQllcnIoInJlcXVlc3QgYWxyZWFkeSBpbiBxdWV1ZSIpOwoJCWdvdG8gZG9uZTsKCX0KCglpZiAocmVxLT5sZW5ndGggPiAoNCAqIENJMTNYWFhfUEFHRV9TSVpFKSkgewoJCXJlcS0+bGVuZ3RoID0gKDQgKiBDSTEzWFhYX1BBR0VfU0laRSk7CgkJcmV0dmFsID0gLUVNU0dTSVpFOwoJCXdhcm4oInJlcXVlc3QgbGVuZ3RoIHRydW5jYXRlZCIpOwoJfQoKCWRiZ19xdWV1ZShfdXNiX2FkZHIobUVwKSwgcmVxLCByZXR2YWwpOwoKCS8qIHB1c2ggcmVxdWVzdCAqLwoJbVJlcS0+cmVxLnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKCW1SZXEtPnJlcS5hY3R1YWwgPSAwOwoKCXJldHZhbCA9IF9oYXJkd2FyZV9lbnF1ZXVlKG1FcCwgbVJlcSk7CgoJaWYgKHJldHZhbCA9PSAtRUFMUkVBRFkpIHsKCQlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJRVUVVRSIsIHJldHZhbCk7CgkJcmV0dmFsID0gMDsKCX0KCWlmICghcmV0dmFsKQoJCWxpc3RfYWRkX3RhaWwoJm1SZXEtPnF1ZXVlLCAmbUVwLT5xaC5xdWV1ZSk7CgogZG9uZToKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogZXBfZGVxdWV1ZTogZGVxdWV1ZXMgKGNhbmNlbHMsIHVubGlua3MpIGFuIEkvTyByZXF1ZXN0IGZyb20gYW4gZW5kcG9pbnQKICoKICogQ2hlY2sgdXNiX2VwX2RlcXVldWUoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIGludCBlcF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKewoJc3RydWN0IGNpMTN4eHhfZXAgICptRXAgID0gY29udGFpbmVyX29mKGVwLCAgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKCXN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSA9IGNvbnRhaW5lcl9vZihyZXEsIHN0cnVjdCBjaTEzeHh4X3JlcSwgcmVxKTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJdHJhY2UoIiVwLCAlcCIsIGVwLCByZXEpOwoKCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMIHx8IG1SZXEtPnJlcS5zdGF0dXMgIT0gLUVBTFJFQURZIHx8CgkJbUVwLT5kZXNjID09IE5VTEwgfHwgbGlzdF9lbXB0eSgmbVJlcS0+cXVldWUpIHx8CgkJbGlzdF9lbXB0eSgmbUVwLT5xaC5xdWV1ZSkpCgkJcmV0dXJuIC1FSU5WQUw7CgoJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CgoJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiREVRVUVVRSIsIDApOwoKCWh3X2VwX2ZsdXNoKG1FcC0+bnVtLCBtRXAtPmRpcik7CgoJLyogcG9wIHJlcXVlc3QgKi8KCWxpc3RfZGVsX2luaXQoJm1SZXEtPnF1ZXVlKTsKCWlmIChtUmVxLT5tYXApIHsKCQlkbWFfdW5tYXBfc2luZ2xlKG1FcC0+ZGV2aWNlLCBtUmVxLT5yZXEuZG1hLCBtUmVxLT5yZXEubGVuZ3RoLAoJCQkJIG1FcC0+ZGlyID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CgkJbVJlcS0+cmVxLmRtYSA9IDA7CgkJbVJlcS0+bWFwICAgICA9IDA7Cgl9CglyZXEtPnN0YXR1cyA9IC1FQ09OTlJFU0VUOwoKCWlmIChtUmVxLT5yZXEuY29tcGxldGUgIT0gTlVMTCkgewoJCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CgkJbVJlcS0+cmVxLmNvbXBsZXRlKCZtRXAtPmVwLCAmbVJlcS0+cmVxKTsKCQlzcGluX2xvY2sobUVwLT5sb2NrKTsKCX0KCglzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBlcF9zZXRfaGFsdDogc2V0cyB0aGUgZW5kcG9pbnQgaGFsdCBmZWF0dXJlCiAqCiAqIENoZWNrIHVzYl9lcF9zZXRfaGFsdCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgaW50IGVwX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgdmFsdWUpCnsKCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CglpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl0cmFjZSgiJXAsICVpIiwgZXAsIHZhbHVlKTsKCglpZiAoZXAgPT0gTlVMTCB8fCBtRXAtPmRlc2MgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCglzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKCiNpZm5kZWYgU1RBTExfSU4KCS8qIGdfZmlsZV9zdG9yYWdlIE1TIGNvbXBsaWFudCBidXQgZ196ZXJvIGZhaWxzIGNoYXB0ZXIgOSBjb21wbGlhbmNlICovCglpZiAodmFsdWUgJiYgbUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsgJiYgbUVwLT5kaXIgPT0gVFggJiYKCSAgICAhbGlzdF9lbXB0eSgmbUVwLT5xaC5xdWV1ZSkpIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOwoJCXJldHVybiAtRUFHQUlOOwoJfQojZW5kaWYKCglkaXJlY3Rpb24gPSBtRXAtPmRpcjsKCWRvIHsKCQlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJIQUxUIiwgdmFsdWUpOwoJCXJldHZhbCB8PSBod19lcF9zZXRfaGFsdChtRXAtPm51bSwgbUVwLT5kaXIsIHZhbHVlKTsKCgkJaWYgKCF2YWx1ZSkKCQkJbUVwLT53ZWRnZSA9IDA7CgoJCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkKCQkJbUVwLT5kaXIgPSAobUVwLT5kaXIgPT0gVFgpID8gUlggOiBUWDsKCgl9IHdoaWxlIChtRXAtPmRpciAhPSBkaXJlY3Rpb24pOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogZXBfc2V0X3dlZGdlOiBzZXRzIHRoZSBoYWx0IGZlYXR1cmUgYW5kIGlnbm9yZXMgY2xlYXIgcmVxdWVzdHMKICoKICogQ2hlY2sgdXNiX2VwX3NldF93ZWRnZSgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgaW50IGVwX3NldF93ZWRnZShzdHJ1Y3QgdXNiX2VwICplcCkKewoJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJdHJhY2UoIiVwIiwgZXApOwoKCWlmIChlcCA9PSBOVUxMIHx8IG1FcC0+ZGVzYyA9PSBOVUxMKQoJCXJldHVybiAtRUlOVkFMOwoKCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOwoKCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIldFREdFIiwgMCk7CgltRXAtPndlZGdlID0gMTsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOwoKCXJldHVybiB1c2JfZXBfc2V0X2hhbHQoZXApOwp9CgovKioKICogZXBfZmlmb19mbHVzaDogZmx1c2hlcyBjb250ZW50cyBvZiBhIGZpZm8KICoKICogQ2hlY2sgdXNiX2VwX2ZpZm9fZmx1c2goKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHZvaWQgZXBfZmlmb19mbHVzaChzdHJ1Y3QgdXNiX2VwICplcCkKewoJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJdHJhY2UoIiVwIiwgZXApOwoKCWlmIChlcCA9PSBOVUxMKSB7CgkJZXJyKCIlMDJYOiAtRUlOVkFMIiwgX3VzYl9hZGRyKG1FcCkpOwoJCXJldHVybjsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKCglkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJGRkxVU0giLCAwKTsKCWh3X2VwX2ZsdXNoKG1FcC0+bnVtLCBtRXAtPmRpcik7CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKfQoKLyoqCiAqIEVuZHBvaW50LXNwZWNpZmljIHBhcnQgb2YgdGhlIEFQSSB0byB0aGUgVVNCIGNvbnRyb2xsZXIgaGFyZHdhcmUKICogQ2hlY2sgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2VwX29wcyB1c2JfZXBfb3BzID0gewoJLmVuYWJsZQkgICAgICAgPSBlcF9lbmFibGUsCgkuZGlzYWJsZSAgICAgICA9IGVwX2Rpc2FibGUsCgkuYWxsb2NfcmVxdWVzdCA9IGVwX2FsbG9jX3JlcXVlc3QsCgkuZnJlZV9yZXF1ZXN0ICA9IGVwX2ZyZWVfcmVxdWVzdCwKCS5xdWV1ZQkgICAgICAgPSBlcF9xdWV1ZSwKCS5kZXF1ZXVlICAgICAgID0gZXBfZGVxdWV1ZSwKCS5zZXRfaGFsdCAgICAgID0gZXBfc2V0X2hhbHQsCgkuc2V0X3dlZGdlICAgICA9IGVwX3NldF93ZWRnZSwKCS5maWZvX2ZsdXNoICAgID0gZXBfZmlmb19mbHVzaCwKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR0FER0VUIGJsb2NrCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludCBjaTEzeHh4X3ZidXNfc2Vzc2lvbihzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCwgaW50IGlzX2FjdGl2ZSkKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihfZ2FkZ2V0LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0KTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgZ2FkZ2V0X3JlYWR5ID0gMDsKCglpZiAoISh1ZGMtPnVkY19kcml2ZXItPmZsYWdzICYgQ0kxM1hYWF9QVUxMVVBfT05fVkJVUykpCgkJcmV0dXJuIC1FT1BOT1RTVVBQOwoKCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoJdWRjLT52YnVzX2FjdGl2ZSA9IGlzX2FjdGl2ZTsKCWlmICh1ZGMtPmRyaXZlcikKCQlnYWRnZXRfcmVhZHkgPSAxOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCglpZiAoZ2FkZ2V0X3JlYWR5KSB7CgkJaWYgKGlzX2FjdGl2ZSkgewoJCQlwbV9ydW50aW1lX2dldF9zeW5jKCZfZ2FkZ2V0LT5kZXYpOwoJCQlod19kZXZpY2VfcmVzZXQodWRjKTsKCQkJaHdfZGV2aWNlX3N0YXRlKHVkYy0+ZXAwb3V0LnFoLmRtYSk7CgkJfSBlbHNlIHsKCQkJaHdfZGV2aWNlX3N0YXRlKDApOwoJCQlpZiAodWRjLT51ZGNfZHJpdmVyLT5ub3RpZnlfZXZlbnQpCgkJCQl1ZGMtPnVkY19kcml2ZXItPm5vdGlmeV9ldmVudCh1ZGMsCgkJCQlDSTEzWFhYX0NPTlRST0xMRVJfU1RPUFBFRF9FVkVOVCk7CgkJCV9nYWRnZXRfc3RvcF9hY3Rpdml0eSgmdWRjLT5nYWRnZXQpOwoJCQlwbV9ydW50aW1lX3B1dF9zeW5jKCZfZ2FkZ2V0LT5kZXYpOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjaTEzeHh4X3dha2V1cChzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCkKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihfZ2FkZ2V0LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0KTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgcmV0ID0gMDsKCgl0cmFjZSgpOwoKCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoJaWYgKCF1ZGMtPnJlbW90ZV93YWtldXApIHsKCQlyZXQgPSAtRU9QTk9UU1VQUDsKCQlkYmdfdHJhY2UoInJlbW90ZSB3YWtldXAgZmVhdHVyZSBpcyBub3QgZW5hYmxlZFxuIik7CgkJZ290byBvdXQ7Cgl9CglpZiAoIWh3X2NyZWFkKENBUF9QT1JUU0MsIFBPUlRTQ19TVVNQKSkgewoJCXJldCA9IC1FSU5WQUw7CgkJZGJnX3RyYWNlKCJwb3J0IGlzIG5vdCBzdXNwZW5kZWRcbiIpOwoJCWdvdG8gb3V0OwoJfQoJaHdfY3dyaXRlKENBUF9QT1JUU0MsIFBPUlRTQ19GUFIsIFBPUlRTQ19GUFIpOwpvdXQ6CglzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIHJldDsKfQoKLyoqCiAqIERldmljZSBvcGVyYXRpb25zIHBhcnQgb2YgdGhlIEFQSSB0byB0aGUgVVNCIGNvbnRyb2xsZXIgaGFyZHdhcmUsCiAqIHdoaWNoIGRvbid0IGludm9sdmUgZW5kcG9pbnRzIChvciBpL28pCiAqIENoZWNrICAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyB1c2JfZ2FkZ2V0X29wcyA9IHsKCS52YnVzX3Nlc3Npb24JPSBjaTEzeHh4X3ZidXNfc2Vzc2lvbiwKCS53YWtldXAJCT0gY2kxM3h4eF93YWtldXAsCn07CgovKioKICogdXNiX2dhZGdldF9wcm9iZV9kcml2ZXI6IHJlZ2lzdGVyIGEgZ2FkZ2V0IGRyaXZlcgogKiBAZHJpdmVyOiB0aGUgZHJpdmVyIGJlaW5nIHJlZ2lzdGVyZWQKICogQGJpbmQ6IHRoZSBkcml2ZXIncyBiaW5kIGNhbGxiYWNrCiAqCiAqIENoZWNrIHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKCkgYXQgPGxpbnV4L3VzYi9nYWRnZXQuaD4gZm9yIGRldGFpbHMuCiAqIEludGVycnVwdHMgYXJlIGVuYWJsZWQgaGVyZS4KICovCmludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IF91ZGM7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IGksIGo7CglpbnQgcmV0dmFsID0gLUVOT01FTTsKCgl0cmFjZSgiJXAiLCBkcml2ZXIpOwoKCWlmIChkcml2ZXIgICAgICAgICAgICAgPT0gTlVMTCB8fAoJICAgIGJpbmQgICAgICAgICAgICAgICA9PSBOVUxMIHx8CgkgICAgZHJpdmVyLT5zZXR1cCAgICAgID09IE5VTEwgfHwKCSAgICBkcml2ZXItPmRpc2Nvbm5lY3QgPT0gTlVMTCB8fAoJICAgIGRyaXZlci0+c3VzcGVuZCAgICA9PSBOVUxMIHx8CgkgICAgZHJpdmVyLT5yZXN1bWUgICAgID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgllbHNlIGlmICh1ZGMgICAgICAgICA9PSBOVUxMKQoJCXJldHVybiAtRU5PREVWOwoJZWxzZSBpZiAodWRjLT5kcml2ZXIgIT0gTlVMTCkKCQlyZXR1cm4gLUVCVVNZOwoKCS8qIGFsbG9jIHJlc291cmNlcyAqLwoJdWRjLT5xaF9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJjaTEzeHh4X3FoIiwgJnVkYy0+Z2FkZ2V0LmRldiwKCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNpMTN4eHhfcWgpLAoJCQkJICAgICAgIDY0LCBDSTEzWFhYX1BBR0VfU0laRSk7CglpZiAodWRjLT5xaF9wb29sID09IE5VTEwpCgkJcmV0dXJuIC1FTk9NRU07CgoJdWRjLT50ZF9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJjaTEzeHh4X3RkIiwgJnVkYy0+Z2FkZ2V0LmRldiwKCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNpMTN4eHhfdGQpLAoJCQkJICAgICAgIDY0LCBDSTEzWFhYX1BBR0VfU0laRSk7CglpZiAodWRjLT50ZF9wb29sID09IE5VTEwpIHsKCQlkbWFfcG9vbF9kZXN0cm95KHVkYy0+cWhfcG9vbCk7CgkJdWRjLT5xaF9wb29sID0gTlVMTDsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCglpbmZvKCJod19lcF9tYXggPSAlZCIsIGh3X2VwX21heCk7CgoJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CgoJcmV0dmFsID0gMDsKCWZvciAoaSA9IDA7IGkgPCBod19lcF9tYXgvMjsgaSsrKSB7CgkJZm9yIChqID0gUlg7IGogPD0gVFg7IGorKykgewoJCQlpbnQgayA9IGkgKyBqICogaHdfZXBfbWF4LzI7CgkJCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwW2tdOwoKCQkJc2NucHJpbnRmKG1FcC0+bmFtZSwgc2l6ZW9mKG1FcC0+bmFtZSksICJlcCVpJXMiLCBpLAoJCQkJCShqID09IFRYKSAgPyAiaW4iIDogIm91dCIpOwoKCQkJbUVwLT5sb2NrICAgICAgICAgPSB1ZGMtPmxvY2s7CgkJCW1FcC0+ZGV2aWNlICAgICAgID0gJnVkYy0+Z2FkZ2V0LmRldjsKCQkJbUVwLT50ZF9wb29sICAgICAgPSB1ZGMtPnRkX3Bvb2w7CgoJCQltRXAtPmVwLm5hbWUgICAgICA9IG1FcC0+bmFtZTsKCQkJbUVwLT5lcC5vcHMgICAgICAgPSAmdXNiX2VwX29wczsKCQkJbUVwLT5lcC5tYXhwYWNrZXQgPSBDVFJMX1BBWUxPQURfTUFYOwoKCQkJSU5JVF9MSVNUX0hFQUQoJm1FcC0+cWgucXVldWUpOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwoJCQltRXAtPnFoLnB0ciA9IGRtYV9wb29sX2FsbG9jKHVkYy0+cWhfcG9vbCwgR0ZQX0tFUk5FTCwKCQkJCQkmbUVwLT5xaC5kbWEpOwoJCQlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCQkJaWYgKG1FcC0+cWgucHRyID09IE5VTEwpCgkJCQlyZXR2YWwgPSAtRU5PTUVNOwoJCQllbHNlCgkJCQltZW1zZXQobUVwLT5xaC5wdHIsIDAsIHNpemVvZigqbUVwLT5xaC5wdHIpKTsKCgkJCS8qIHNraXAgZXAwIG91dCBhbmQgaW4gZW5kcG9pbnRzICovCgkJCWlmIChpID09IDApCgkJCQljb250aW51ZTsKCgkJCWxpc3RfYWRkX3RhaWwoJm1FcC0+ZXAuZXBfbGlzdCwgJnVkYy0+Z2FkZ2V0LmVwX2xpc3QpOwoJCX0KCX0KCWlmIChyZXR2YWwpCgkJZ290byBkb25lOwoKCXVkYy0+Z2FkZ2V0LmVwMCA9ICZ1ZGMtPmVwMGluLmVwOwoJLyogYmluZCBnYWRnZXQgKi8KCWRyaXZlci0+ZHJpdmVyLmJ1cyAgICAgPSBOVUxMOwoJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9ICZkcml2ZXItPmRyaXZlcjsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwoJcmV0dmFsID0gYmluZCgmdWRjLT5nYWRnZXQpOyAgICAgICAgICAgICAgICAvKiBNQVkgU0xFRVAgKi8KCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoKCWlmIChyZXR2YWwpIHsKCQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKCQlnb3RvIGRvbmU7Cgl9CgoJdWRjLT5kcml2ZXIgPSBkcml2ZXI7CglwbV9ydW50aW1lX2dldF9zeW5jKCZ1ZGMtPmdhZGdldC5kZXYpOwoJaWYgKHVkYy0+dWRjX2RyaXZlci0+ZmxhZ3MgJiBDSTEzWFhYX1BVTExVUF9PTl9WQlVTKSB7CgkJaWYgKHVkYy0+dmJ1c19hY3RpdmUpIHsKCQkJaWYgKHVkYy0+dWRjX2RyaXZlci0+ZmxhZ3MgJiBDSTEzWFhYX1JFR1NfU0hBUkVEKQoJCQkJaHdfZGV2aWNlX3Jlc2V0KHVkYyk7CgkJfSBlbHNlIHsKCQkJcG1fcnVudGltZV9wdXRfc3luYygmdWRjLT5nYWRnZXQuZGV2KTsKCQkJZ290byBkb25lOwoJCX0KCX0KCglyZXR2YWwgPSBod19kZXZpY2Vfc3RhdGUodWRjLT5lcDBvdXQucWguZG1hKTsKCWlmIChyZXR2YWwpCgkJcG1fcnVudGltZV9wdXRfc3luYygmdWRjLT5nYWRnZXQuZGV2KTsKCiBkb25lOgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCXJldHVybiByZXR2YWw7Cn0KRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcik7CgovKioKICogdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcjogdW5yZWdpc3RlciBhIGdhZGdldCBkcml2ZXIKICoKICogQ2hlY2sgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcigpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAqLwppbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IF91ZGM7Cgl1bnNpZ25lZCBsb25nIGksIGZsYWdzOwoKCXRyYWNlKCIlcCIsIGRyaXZlcik7CgoJaWYgKGRyaXZlciAgICAgICAgICAgICA9PSBOVUxMIHx8CgkgICAgZHJpdmVyLT51bmJpbmQgICAgID09IE5VTEwgfHwKCSAgICBkcml2ZXItPnNldHVwICAgICAgPT0gTlVMTCB8fAoJICAgIGRyaXZlci0+ZGlzY29ubmVjdCA9PSBOVUxMIHx8CgkgICAgZHJpdmVyLT5zdXNwZW5kICAgID09IE5VTEwgfHwKCSAgICBkcml2ZXItPnJlc3VtZSAgICAgPT0gTlVMTCB8fAoJICAgIGRyaXZlciAgICAgICAgICAgICAhPSB1ZGMtPmRyaXZlcikKCQlyZXR1cm4gLUVJTlZBTDsKCglzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCglpZiAoISh1ZGMtPnVkY19kcml2ZXItPmZsYWdzICYgQ0kxM1hYWF9QVUxMVVBfT05fVkJVUykgfHwKCQkJdWRjLT52YnVzX2FjdGl2ZSkgewoJCWh3X2RldmljZV9zdGF0ZSgwKTsKCQlpZiAodWRjLT51ZGNfZHJpdmVyLT5ub3RpZnlfZXZlbnQpCgkJCXVkYy0+dWRjX2RyaXZlci0+bm90aWZ5X2V2ZW50KHVkYywKCQkJQ0kxM1hYWF9DT05UUk9MTEVSX1NUT1BQRURfRVZFTlQpOwoJCV9nYWRnZXRfc3RvcF9hY3Rpdml0eSgmdWRjLT5nYWRnZXQpOwoJCXBtX3J1bnRpbWVfcHV0KCZ1ZGMtPmdhZGdldC5kZXYpOwoJfQoKCS8qIHVuYmluZCBnYWRnZXQgKi8KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7Cglkcml2ZXItPnVuYmluZCgmdWRjLT5nYWRnZXQpOyAgICAgICAgICAgICAgIC8qIE1BWSBTTEVFUCAqLwoJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CgoJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CgoJLyogZnJlZSByZXNvdXJjZXMgKi8KCWZvciAoaSA9IDA7IGkgPCBod19lcF9tYXg7IGkrKykgewoJCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwW2ldOwoKCQlpZiAoIWxpc3RfZW1wdHkoJm1FcC0+ZXAuZXBfbGlzdCkpCgkJCWxpc3RfZGVsX2luaXQoJm1FcC0+ZXAuZXBfbGlzdCk7CgoJCWlmIChtRXAtPnFoLnB0ciAhPSBOVUxMKQoJCQlkbWFfcG9vbF9mcmVlKHVkYy0+cWhfcG9vbCwgbUVwLT5xaC5wdHIsIG1FcC0+cWguZG1hKTsKCX0KCgl1ZGMtPmdhZGdldC5lcDAgPSBOVUxMOwoJdWRjLT5kcml2ZXIgPSBOVUxMOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CgoJaWYgKHVkYy0+dGRfcG9vbCAhPSBOVUxMKSB7CgkJZG1hX3Bvb2xfZGVzdHJveSh1ZGMtPnRkX3Bvb2wpOwoJCXVkYy0+dGRfcG9vbCA9IE5VTEw7Cgl9CglpZiAodWRjLT5xaF9wb29sICE9IE5VTEwpIHsKCQlkbWFfcG9vbF9kZXN0cm95KHVkYy0+cWhfcG9vbCk7CgkJdWRjLT5xaF9wb29sID0gTlVMTDsKCX0KCglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBCVVMgYmxvY2sKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioKICogdWRjX2lycTogZ2xvYmFsIGludGVycnVwdCBoYW5kbGVyCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBJUlFfSEFORExFRCBpZiB0aGUgSVJRIGhhcyBiZWVuIGhhbmRsZWQKICogSXQgbG9ja3MgYWNjZXNzIHRvIHJlZ2lzdGVycwogKi8Kc3RhdGljIGlycXJldHVybl90IHVkY19pcnEodm9pZCkKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IF91ZGM7CglpcnFyZXR1cm5fdCByZXR2YWw7Cgl1MzIgaW50cjsKCgl0cmFjZSgpOwoKCWlmICh1ZGMgPT0gTlVMTCkgewoJCWVycigiRU5PREVWIik7CgkJcmV0dXJuIElSUV9IQU5ETEVEOwoJfQoKCXNwaW5fbG9jayh1ZGMtPmxvY2spOwoKCWlmICh1ZGMtPnVkY19kcml2ZXItPmZsYWdzICYgQ0kxM1hYWF9SRUdTX1NIQVJFRCkgewoJCWlmIChod19jcmVhZChDQVBfVVNCTU9ERSwgVVNCTU9ERV9DTSkgIT0KCQkJCVVTQk1PREVfQ01fREVWSUNFKSB7CgkJCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CgkJCXJldHVybiBJUlFfTk9ORTsKCQl9Cgl9CglpbnRyID0gaHdfdGVzdF9hbmRfY2xlYXJfaW50cl9hY3RpdmUoKTsKCWlmIChpbnRyKSB7CgkJaXNyX3N0YXRpc3RpY3MuaG5kbC5idWZbaXNyX3N0YXRpc3RpY3MuaG5kbC5pZHgrK10gPSBpbnRyOwoJCWlzcl9zdGF0aXN0aWNzLmhuZGwuaWR4ICY9IElTUl9NQVNLOwoJCWlzcl9zdGF0aXN0aWNzLmhuZGwuY250Kys7CgoJCS8qIG9yZGVyIGRlZmluZXMgcHJpb3JpdHkgLSBkbyBOT1QgY2hhbmdlIGl0ICovCgkJaWYgKFVTQmlfVVJJICYgaW50cikgewoJCQlpc3Jfc3RhdGlzdGljcy51cmkrKzsKCQkJaXNyX3Jlc2V0X2hhbmRsZXIodWRjKTsKCQl9CgkJaWYgKFVTQmlfUENJICYgaW50cikgewoJCQlpc3Jfc3RhdGlzdGljcy5wY2krKzsKCQkJdWRjLT5nYWRnZXQuc3BlZWQgPSBod19wb3J0X2lzX2hpZ2hfc3BlZWQoKSA/CgkJCQlVU0JfU1BFRURfSElHSCA6IFVTQl9TUEVFRF9GVUxMOwoJCQlpZiAodWRjLT5zdXNwZW5kZWQpIHsKCQkJCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CgkJCQl1ZGMtPmRyaXZlci0+cmVzdW1lKCZ1ZGMtPmdhZGdldCk7CgkJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKCQkJCXVkYy0+c3VzcGVuZGVkID0gMDsKCQkJfQoJCX0KCQlpZiAoVVNCaV9VRUkgJiBpbnRyKQoJCQlpc3Jfc3RhdGlzdGljcy51ZWkrKzsKCQlpZiAoVVNCaV9VSSAgJiBpbnRyKSB7CgkJCWlzcl9zdGF0aXN0aWNzLnVpKys7CgkJCWlzcl90cl9jb21wbGV0ZV9oYW5kbGVyKHVkYyk7CgkJfQoJCWlmIChVU0JpX1NMSSAmIGludHIpIHsKCQkJaWYgKHVkYy0+Z2FkZ2V0LnNwZWVkICE9IFVTQl9TUEVFRF9VTktOT1dOKSB7CgkJCQl1ZGMtPnN1c3BlbmRlZCA9IDE7CgkJCQlzcGluX3VubG9jayh1ZGMtPmxvY2spOwoJCQkJdWRjLT5kcml2ZXItPnN1c3BlbmQoJnVkYy0+Z2FkZ2V0KTsKCQkJCXNwaW5fbG9jayh1ZGMtPmxvY2spOwoJCQl9CgkJCWlzcl9zdGF0aXN0aWNzLnNsaSsrOwoJCX0KCQlyZXR2YWwgPSBJUlFfSEFORExFRDsKCX0gZWxzZSB7CgkJaXNyX3N0YXRpc3RpY3Mubm9uZSsrOwoJCXJldHZhbCA9IElSUV9OT05FOwoJfQoJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKCglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogdWRjX3JlbGVhc2U6IGRyaXZlciByZWxlYXNlIGZ1bmN0aW9uCiAqIEBkZXY6IGRldmljZQogKgogKiBDdXJyZW50bHkgZG9lcyBub3RoaW5nCiAqLwpzdGF0aWMgdm9pZCB1ZGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXRyYWNlKCIlcCIsIGRldik7CgoJaWYgKGRldiA9PSBOVUxMKQoJCWVycigiRUlOVkFMIik7Cn0KCi8qKgogKiB1ZGNfcHJvYmU6IHBhcmVudCBwcm9iZSBtdXN0IGNhbGwgdGhpcyB0byBpbml0aWFsaXplIFVEQwogKiBAZGV2OiAgcGFyZW50IGRldmljZQogKiBAcmVnczogcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcwogKiBAbmFtZTogZHJpdmVyIG5hbWUKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICogTm8gaW50ZXJydXB0cyBhY3RpdmUsIHRoZSBJUlEgaGFzIG5vdCBiZWVuIHJlcXVlc3RlZCB5ZXQKICogS2VybmVsIGFzc3VtZXMgMzItYml0IERNQSBvcGVyYXRpb25zIGJ5IGRlZmF1bHQsIG5vIG5lZWQgdG8gZG1hX3NldF9tYXNrCiAqLwpzdGF0aWMgaW50IHVkY19wcm9iZShzdHJ1Y3QgY2kxM3h4eF91ZGNfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCBkZXZpY2UgKmRldiwKCQl2b2lkIF9faW9tZW0gKnJlZ3MpCnsKCXN0cnVjdCBjaTEzeHh4ICp1ZGM7CglpbnQgcmV0dmFsID0gMDsKCgl0cmFjZSgiJXAsICVwLCAlcCIsIGRldiwgcmVncywgbmFtZSk7CgoJaWYgKGRldiA9PSBOVUxMIHx8IHJlZ3MgPT0gTlVMTCB8fCBkcml2ZXIgPT0gTlVMTCB8fAoJCQlkcml2ZXItPm5hbWUgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCgl1ZGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2kxM3h4eCksIEdGUF9LRVJORUwpOwoJaWYgKHVkYyA9PSBOVUxMKQoJCXJldHVybiAtRU5PTUVNOwoKCXVkYy0+bG9jayA9ICZ1ZGNfbG9jazsKCXVkYy0+cmVncyA9IHJlZ3M7Cgl1ZGMtPnVkY19kcml2ZXIgPSBkcml2ZXI7CgoJdWRjLT5nYWRnZXQub3BzICAgICAgICAgID0gJnVzYl9nYWRnZXRfb3BzOwoJdWRjLT5nYWRnZXQuc3BlZWQgICAgICAgID0gVVNCX1NQRUVEX1VOS05PV047Cgl1ZGMtPmdhZGdldC5pc19kdWFsc3BlZWQgPSAxOwoJdWRjLT5nYWRnZXQuaXNfb3RnICAgICAgID0gMDsKCXVkYy0+Z2FkZ2V0Lm5hbWUgICAgICAgICA9IGRyaXZlci0+bmFtZTsKCglJTklUX0xJU1RfSEVBRCgmdWRjLT5nYWRnZXQuZXBfbGlzdCk7Cgl1ZGMtPmdhZGdldC5lcDAgPSBOVUxMOwoKCWRldl9zZXRfbmFtZSgmdWRjLT5nYWRnZXQuZGV2LCAiZ2FkZ2V0Iik7Cgl1ZGMtPmdhZGdldC5kZXYuZG1hX21hc2sgPSBkZXYtPmRtYV9tYXNrOwoJdWRjLT5nYWRnZXQuZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKCXVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQgICA9IGRldjsKCXVkYy0+Z2FkZ2V0LmRldi5yZWxlYXNlICA9IHVkY19yZWxlYXNlOwoKCXJldHZhbCA9IGh3X2RldmljZV9pbml0KHJlZ3MpOwoJaWYgKHJldHZhbCA8IDApCgkJZ290byBmcmVlX3VkYzsKCgl1ZGMtPnRyYW5zY2VpdmVyID0gb3RnX2dldF90cmFuc2NlaXZlcigpOwoKCWlmICh1ZGMtPnVkY19kcml2ZXItPmZsYWdzICYgQ0kxM1hYWF9SRVFVSVJFX1RSQU5TQ0VJVkVSKSB7CgkJaWYgKHVkYy0+dHJhbnNjZWl2ZXIgPT0gTlVMTCkgewoJCQlyZXR2YWwgPSAtRU5PREVWOwoJCQlnb3RvIGZyZWVfdWRjOwoJCX0KCX0KCglpZiAoISh1ZGMtPnVkY19kcml2ZXItPmZsYWdzICYgQ0kxM1hYWF9SRUdTX1NIQVJFRCkpIHsKCQlyZXR2YWwgPSBod19kZXZpY2VfcmVzZXQodWRjKTsKCQlpZiAocmV0dmFsKQoJCQlnb3RvIHB1dF90cmFuc2NlaXZlcjsKCX0KCglyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoJnVkYy0+Z2FkZ2V0LmRldik7CglpZiAocmV0dmFsKSB7CgkJcHV0X2RldmljZSgmdWRjLT5nYWRnZXQuZGV2KTsKCQlnb3RvIHB1dF90cmFuc2NlaXZlcjsKCX0KCiNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUwoJcmV0dmFsID0gZGJnX2NyZWF0ZV9maWxlcygmdWRjLT5nYWRnZXQuZGV2KTsKI2VuZGlmCglpZiAocmV0dmFsKQoJCWdvdG8gdW5yZWdfZGV2aWNlOwoKCWlmICh1ZGMtPnRyYW5zY2VpdmVyKSB7CgkJcmV0dmFsID0gb3RnX3NldF9wZXJpcGhlcmFsKHVkYy0+dHJhbnNjZWl2ZXIsICZ1ZGMtPmdhZGdldCk7CgkJaWYgKHJldHZhbCkKCQkJZ290byByZW1vdmVfZGJnOwoJfQoJcG1fcnVudGltZV9ub19jYWxsYmFja3MoJnVkYy0+Z2FkZ2V0LmRldik7CglwbV9ydW50aW1lX2VuYWJsZSgmdWRjLT5nYWRnZXQuZGV2KTsKCglfdWRjID0gdWRjOwoJcmV0dXJuIHJldHZhbDsKCgllcnIoImVycm9yID0gJWkiLCByZXR2YWwpOwpyZW1vdmVfZGJnOgojaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMKCWRiZ19yZW1vdmVfZmlsZXMoJnVkYy0+Z2FkZ2V0LmRldik7CiNlbmRpZgp1bnJlZ19kZXZpY2U6CglkZXZpY2VfdW5yZWdpc3RlcigmdWRjLT5nYWRnZXQuZGV2KTsKcHV0X3RyYW5zY2VpdmVyOgoJaWYgKHVkYy0+dHJhbnNjZWl2ZXIpCgkJb3RnX3B1dF90cmFuc2NlaXZlcih1ZGMtPnRyYW5zY2VpdmVyKTsKZnJlZV91ZGM6CglrZnJlZSh1ZGMpOwoJX3VkYyA9IE5VTEw7CglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogdWRjX3JlbW92ZTogcGFyZW50IHJlbW92ZSBtdXN0IGNhbGwgdGhpcyB0byByZW1vdmUgVURDCiAqCiAqIE5vIGludGVycnVwdHMgYWN0aXZlLCB0aGUgSVJRIGhhcyBiZWVuIHJlbGVhc2VkCiAqLwpzdGF0aWMgdm9pZCB1ZGNfcmVtb3ZlKHZvaWQpCnsKCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBfdWRjOwoKCWlmICh1ZGMgPT0gTlVMTCkgewoJCWVycigiRUlOVkFMIik7CgkJcmV0dXJuOwoJfQoKCWlmICh1ZGMtPnRyYW5zY2VpdmVyKSB7CgkJb3RnX3NldF9wZXJpcGhlcmFsKHVkYy0+dHJhbnNjZWl2ZXIsICZ1ZGMtPmdhZGdldCk7CgkJb3RnX3B1dF90cmFuc2NlaXZlcih1ZGMtPnRyYW5zY2VpdmVyKTsKCX0KI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTCglkYmdfcmVtb3ZlX2ZpbGVzKCZ1ZGMtPmdhZGdldC5kZXYpOwojZW5kaWYKCWRldmljZV91bnJlZ2lzdGVyKCZ1ZGMtPmdhZGdldC5kZXYpOwoKCWtmcmVlKHVkYyk7CglfdWRjID0gTlVMTDsKfQo=