LyoKICogREVDIDkzIEVyaWsgQm9zIDxlcmlrQHhzNGFsbC5ubD4KICoKICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAqCiAqIENvcHlyaWdodCAyMDAxIE1pa2UgTWNDb3JtYWNrCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBIaXN0b3J5OgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogQXByIDMsIDE5OTkuICBMYXdzb24gV2hpdG5leSA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIC0gRml4ZWQgdGhlIG1vZGVtIGNvbnRyb2wgcGFydCBvZiBFc2NhcGVDb21tRnVuY3Rpb24xNi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KICogLSBwdHItPmZkIHdhc24ndCBnZXR0aW5nIGNsZWFyZWQgb24gY2xvc2UuCiAqIC0gR2V0Q29tbUV2ZW50TWFzaygpIGFuZCBHZXRDb21tRXJyb3IoKSBkaWRuJ3QgZG8gbXVjaCBvZiBhbnl0aGluZy4KICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKICogICBldmVudCBhbmQgcmV0dXJuIEkvTyBxdWV1ZSBzaXplcywgd2hpY2ggbWFrZXMgdGhlIGFwcCBJJ20gaW50ZXJlc3RlZAogKiAgIGluIChhbmFsb2cgZGV2aWNlcyBFWktJVCBEU1AgZGV2ZWxvcG1lbnQgc3lzdGVtKSB3b3JrLgogKgogKiBBdWd1c3QgMTIsIDE5OTcuICBUYWtlIGEgYmFzaCBhdCBTZXRDb21tRXZlbnRNYXNrIC0gTGF3c29uIFdoaXRuZXkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogKiBKdWx5IDYsIDE5OTguIEZpeGVzIGFuZCBjb21tZW50cyBieSBWYWxlbnRpam4gU2Vzc2luawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnNlc3NpbmtAaWMudXZhLm5sPiBbVl0KICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICoKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAibnRzdGF0dXMuaCIKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbmUvd2ludXNlcjE2LmgiCiNpbmNsdWRlICJ3aW4uaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoY29tbSk7CgovKiB3aW5kb3cncyBzZW1pIGRvY3VtZW50ZWQgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCiNkZWZpbmUgQ09NTV9NU1JfT0ZGU0VUICAzNQojZGVmaW5lIE1TUl9DVFMgIDB4MTAKI2RlZmluZSBNU1JfRFNSICAweDIwCiNkZWZpbmUgTVNSX1JJICAgMHg0MAojZGVmaW5lIE1TUl9STFNEIDB4ODAKI2RlZmluZSBNU1JfTUFTSyAoTVNSX0NUU3xNU1JfRFNSfE1TUl9SSXxNU1JfUkxTRCkKCiNkZWZpbmUgRkxBR19MUFQgMHg4MAoKI2RlZmluZSBNQVhfUE9SVFMgICA5CgpzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0IHsKICAgIEhBTkRMRSBoYW5kbGU7CiAgICBpbnQgc3VzcGVuZGVkOwogICAgaW50IHVuZ2V0LHhtaXQ7CiAgICBpbnQgZXZ0Y2hhcjsKICAgIC8qIGV2ZW50cyAqLwogICAgaW50IGNvbW1lcnJvciwgZXZlbnRtYXNrOwogICAgLyogYnVmZmVycyAqLwogICAgY2hhciAqaW5idWYsKm91dGJ1ZjsKICAgIHVuc2lnbmVkIGlidWZfc2l6ZSxpYnVmX2hlYWQsaWJ1Zl90YWlsOwogICAgdW5zaWduZWQgb2J1Zl9zaXplLG9idWZfaGVhZCxvYnVmX3RhaWw7CiAgICAvKiBub3RpZmljYXRpb25zICovCiAgICBIV05EIHduZDsKICAgIGludCBuX3JlYWQsIG5fd3JpdGU7CiAgICBPVkVSTEFQUEVEIHJlYWRfb3YsIHdyaXRlX292OwogICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZXMgKi8KICAgIERDQjE2IGRjYjsKICAgIC8qIHBvaW50ZXIgdG8gdW5rbm93big9PXVuZG9jdW1lbnRlZCkgY29tbSBzdHJ1Y3R1cmUgKi8KICAgIFNFR1BUUiBzZWdfdW5rbm93bjsKICAgIEJZVEUgdW5rbm93bls0MF07Cn07CgpzdGF0aWMgc3RydWN0IERvc0RldmljZVN0cnVjdCBDT01bTUFYX1BPUlRTXTsKc3RhdGljIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgTFBUW01BWF9QT1JUU107CgovKiB1cGRhdGUgd2luZG93J3Mgc2VtaSBkb2N1bWVudGVkIG1vZGVtIHN0YXR1cyByZWdpc3RlciAqLwovKiBzZWUga25vd2xlZGdlIGJhc2UgUTEwMTQxNyAqLwpzdGF0aWMgdm9pZCBDT01NX01TUlVwZGF0ZSggSEFORExFIGhhbmRsZSwgVUNIQVIgKiBwTXNyICkKewogICAgVUNIQVIgdG1wbXNyPTA7CiAgICBEV09SRCBtc3RhdD0wOwoKICAgIGlmKCFHZXRDb21tTW9kZW1TdGF0dXMoaGFuZGxlLCZtc3RhdCkpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmKG1zdGF0ICYgTVNfQ1RTX09OKSB0bXBtc3IgfD0gTVNSX0NUUzsKICAgIGlmKG1zdGF0ICYgTVNfRFNSX09OKSB0bXBtc3IgfD0gTVNSX0RTUjsKICAgIGlmKG1zdGF0ICYgTVNfUklOR19PTikgdG1wbXNyIHw9IE1TUl9SSTsKICAgIGlmKG1zdGF0ICYgTVNfUkxTRF9PTikgdG1wbXNyIHw9IE1TUl9STFNEOwogICAgKnBNc3IgPSAoKnBNc3IgJiB+TVNSX01BU0spIHwgdG1wbXNyOwp9CgpzdGF0aWMgc3RydWN0IERvc0RldmljZVN0cnVjdCAqR2V0RGV2aWNlU3RydWN0KGludCBpbmRleCkKewoJaWYgKChpbmRleCYweDdGKTw9TUFYX1BPUlRTKSB7CiAgICAgICAgICAgIGlmICghKGluZGV4JkZMQUdfTFBUKSkgewoJCWlmIChDT01baW5kZXhdLmhhbmRsZSkKCQkgICAgcmV0dXJuICZDT01baW5kZXhdOwoJICAgIH0gZWxzZSB7CgkJaW5kZXggJj0gMHg3ZjsKCQlpZiAoTFBUW2luZGV4XS5oYW5kbGUpCgkJICAgIHJldHVybiAmTFBUW2luZGV4XTsKCSAgICB9Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyBpbnQgICAgR2V0Q29tbVBvcnRfb3YoTFBPVkVSTEFQUEVEIG92LCBpbnQgd3JpdGUpCnsKCWludCB4OwoKCWZvciAoeD0wOyB4PE1BWF9QT1JUUzsgeCsrKSB7CgkJaWYgKG92ID09ICh3cml0ZT8mQ09NW3hdLndyaXRlX292OiZDT01beF0ucmVhZF9vdikpCgkJCXJldHVybiB4OwoJfQoKCXJldHVybiAtMTsKfQoKc3RhdGljIGludCBXaW5FcnJvcih2b2lkKQp7CiAgICAgICAgVFJBQ0UoImVycm5vID0gJWRcbiIsIGVycm5vKTsKCXN3aXRjaCAoZXJybm8pIHsKCQlkZWZhdWx0OgoJCQlyZXR1cm4gQ0VfSU9FOwoJCX0KfQoKc3RhdGljIHVuc2lnbmVkIGNvbW1faW5idWYoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CiAgcmV0dXJuICgocHRyLT5pYnVmX3RhaWwgPiBwdHItPmlidWZfaGVhZCkgPyBwdHItPmlidWZfc2l6ZSA6IDApCiAgICArIHB0ci0+aWJ1Zl9oZWFkIC0gcHRyLT5pYnVmX3RhaWw7Cn0KCnN0YXRpYyB1bnNpZ25lZCBjb21tX291dGJ1ZihzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKICByZXR1cm4gKChwdHItPm9idWZfdGFpbCA+IHB0ci0+b2J1Zl9oZWFkKSA/IHB0ci0+b2J1Zl9zaXplIDogMCkKICAgICsgcHRyLT5vYnVmX2hlYWQgLSBwdHItPm9idWZfdGFpbDsKfQoKc3RhdGljIHZvaWQgY29tbV93YWl0cmVhZChzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpOwpzdGF0aWMgdm9pZCBjb21tX3dhaXR3cml0ZShzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpOwoKc3RhdGljIFZPSUQgV0lOQVBJIENPTU0xNl9SZWFkQ29tcGxldGUoRFdPUkQgc3RhdHVzLCBEV09SRCBsZW4sIExQT1ZFUkxBUFBFRCBvdikKewoJaW50IHByZXYgOwoJV09SRCBtYXNrID0gMDsKCWludCBjaWQgPSBHZXRDb21tUG9ydF9vdihvdiwwKTsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglpZihjaWQ8MCkgewoJCUVSUigiYXN5bmMgd3JpdGUgd2l0aCBiYWQgb3ZlcmxhcHBlZCBwb2ludGVyXG4iKTsKCQlyZXR1cm47Cgl9CglwdHIgPSAmQ09NW2NpZF07CgoJLyogd2UgZ2V0IGNhbmNlbGxlZCB3aGVuIENsb3NlQ29tbSBpcyBjYWxsZWQgKi8KCWlmIChzdGF0dXM9PVNUQVRVU19DQU5DRUxMRUQpCgl7CgkJVFJBQ0UoIkNhbmNlbGxlZFxuIik7CgkJcmV0dXJuOwoJfQoKCS8qIHJlYWQgZGF0YSBmcm9tIGNvbW0gcG9ydCAqLwoJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewoJCUVSUigiYXN5bmMgcmVhZCBmYWlsZWQgJTA4bHhcbiIsc3RhdHVzKTsKCQlDT01bY2lkXS5jb21tZXJyb3IgPSBDRV9SWE9WRVI7CgkJcmV0dXJuOwoJfQoJVFJBQ0UoImFzeW5jIHJlYWQgY29tcGxldGVkICVsZCBieXRlc1xuIixsZW4pOwoKCXByZXYgPSBjb21tX2luYnVmKHB0cik7CgoJLyogY2hlY2sgZm9yIGV2ZW50cyAqLwoJaWYgKChwdHItPmV2ZW50bWFzayAmIEVWX1JYRkxBRykgJiYKCSAgICBtZW1jaHIocHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl9oZWFkLCBwdHItPmV2dGNoYXIsIGxlbikpIHsKCQkqKFdPUkQqKShDT01bY2lkXS51bmtub3duKSB8PSBFVl9SWEZMQUc7CgkJbWFzayB8PSBDTl9FVkVOVDsKCX0KCWlmIChwdHItPmV2ZW50bWFzayAmIEVWX1JYQ0hBUikgewoJCSooV09SRCopKENPTVtjaWRdLnVua25vd24pIHw9IEVWX1JYQ0hBUjsKCQltYXNrIHw9IENOX0VWRU5UOwoJfQoKCS8qIGFkdmFuY2UgYnVmZmVyIHBvc2l0aW9uICovCglwdHItPmlidWZfaGVhZCArPSBsZW47CglpZiAocHRyLT5pYnVmX2hlYWQgPj0gcHRyLT5pYnVmX3NpemUpCgkJcHRyLT5pYnVmX2hlYWQgPSAwOwoKCS8qIGNoZWNrIGZvciBub3RpZmljYXRpb24gKi8KCWlmIChwdHItPnduZCAmJiAocHRyLT5uX3JlYWQ+MCkgJiYgKHByZXY8cHRyLT5uX3JlYWQpICYmCgkgICAgKGNvbW1faW5idWYocHRyKT49cHRyLT5uX3JlYWQpKSB7CgkJLyogcGFzc2VkIHRoZSByZWNlaXZlIG5vdGlmaWNhdGlvbiB0aHJlc2hvbGQgKi8KCQltYXNrIHw9IENOX1JFQ0VJVkU7Cgl9CgoJLyogc2VuZCBub3RpZmljYXRpb25zLCBpZiBhbnkgKi8KCWlmIChwdHItPnduZCAmJiBtYXNrKSB7CgkJVFJBQ0UoIm5vdGlmeWluZyAlcDogY2lkPSVkLCBtYXNrPSUwMnhcbiIsIHB0ci0+d25kLCBjaWQsIG1hc2spOwoJCVBvc3RNZXNzYWdlQShwdHItPnduZCwgV01fQ09NTU5PVElGWSwgY2lkLCBtYXNrKTsKCX0KCgkvKiBvbiByZWFsIHdpbmRvd3MsIHRoaXMgY291bGQgY2F1c2UgcHJvYmxlbXMsIHNpbmNlIGl0IGlzIHJlY3Vyc2l2ZSAqLwoJLyogcmVzdGFydCB0aGUgcmVjZWl2ZSAqLwoJY29tbV93YWl0cmVhZChwdHIpOwp9CgovKiB0aGlzIGlzIG1lYW50IHRvIHdvcmsgbGlrZSB3cml0ZSgpICovCnN0YXRpYyBJTlQgQ09NTTE2X1dyaXRlRmlsZShIQU5ETEUgaENvbW0sIExQQ1ZPSUQgYnVmZmVyLCBEV09SRCBsZW4pCnsKCU9WRVJMQVBQRUQgb3Y7CglEV09SRCBjb3VudD0gLTE7CgoJWmVyb01lbW9yeSgmb3Ysc2l6ZW9mKG92KSk7Cglvdi5oRXZlbnQgPSBDcmVhdGVFdmVudEEoTlVMTCwwLDAsTlVMTCk7CglpZihvdi5oRXZlbnQ9PUlOVkFMSURfSEFORExFX1ZBTFVFKQoJCXJldHVybiAtMTsKCglpZighV3JpdGVGaWxlKGhDb21tLGJ1ZmZlcixsZW4sJmNvdW50LCZvdikpCgl7CgkJaWYoR2V0TGFzdEVycm9yKCk9PUVSUk9SX0lPX1BFTkRJTkcpCgkJewoJCQlHZXRPdmVybGFwcGVkUmVzdWx0KGhDb21tLCZvdiwmY291bnQsVFJVRSk7CgkJfQoJfQoJQ2xvc2VIYW5kbGUob3YuaEV2ZW50KTsKCglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBWT0lEIFdJTkFQSSBDT01NMTZfV3JpdGVDb21wbGV0ZShEV09SRCBzdGF0dXMsIERXT1JEIGxlbiwgTFBPVkVSTEFQUEVEIG92KQp7CglpbnQgcHJldiwgYmxlZnQ7CglXT1JEIG1hc2sgPSAwOwoJaW50IGNpZCA9IEdldENvbW1Qb3J0X292KG92LDEpOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCWlmKGNpZDwwKSB7CgkJRVJSKCJhc3luYyB3cml0ZSB3aXRoIGJhZCBvdmVybGFwcGVkIHBvaW50ZXJcbiIpOwoJCXJldHVybjsKCX0KCXB0ciA9ICZDT01bY2lkXTsKCgkvKiByZWFkIGRhdGEgZnJvbSBjb21tIHBvcnQgKi8KCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKCQlFUlIoImFzeW5jIHdyaXRlIGZhaWxlZFxuIik7CgkJQ09NW2NpZF0uY29tbWVycm9yID0gQ0VfUlhPVkVSOwoJCXJldHVybjsKCX0KCVRSQUNFKCJhc3luYyB3cml0ZSBjb21wbGV0ZWQgJWxkIGJ5dGVzXG4iLGxlbik7CgoJLyogdXBkYXRlIHRoZSBidWZmZXIgcG9pbnRlcnMgKi8KCXByZXYgPSBjb21tX291dGJ1ZigmQ09NW2NpZF0pOwoJcHRyLT5vYnVmX3RhaWwgKz0gbGVuOwoJaWYgKHB0ci0+b2J1Zl90YWlsID49IHB0ci0+b2J1Zl9zaXplKQoJCXB0ci0+b2J1Zl90YWlsID0gMDsKCgkvKiB3cml0ZSBhbnkgVHJhbnNtaXRDb21tQ2hhciBjaGFyYWN0ZXIgKi8KCWlmIChwdHItPnhtaXQ+PTApIHsKCQlsZW4gPSBDT01NMTZfV3JpdGVGaWxlKHB0ci0+aGFuZGxlLCAmKHB0ci0+eG1pdCksIDEpOwoJCWlmIChsZW4gPiAwKSBwdHItPnhtaXQgPSAtMTsKCX0KCgkvKiB3cml0ZSBmcm9tIG91dHB1dCBxdWV1ZSAqLwoJYmxlZnQgPSAoKHB0ci0+b2J1Zl90YWlsIDw9IHB0ci0+b2J1Zl9oZWFkKSA/CgkJcHRyLT5vYnVmX2hlYWQgOiBwdHItPm9idWZfc2l6ZSkgLSBwdHItPm9idWZfdGFpbDsKCgkvKiBjaGVjayBmb3Igbm90aWZpY2F0aW9uICovCglpZiAocHRyLT53bmQgJiYgKHB0ci0+bl93cml0ZT4wKSAmJiAocHJldj49cHRyLT5uX3dyaXRlKSAmJgoJICAoY29tbV9vdXRidWYocHRyKTxwdHItPm5fd3JpdGUpKSB7CgkJLyogcGFzc2VkIHRoZSB0cmFuc21pdCBub3RpZmljYXRpb24gdGhyZXNob2xkICovCgkJbWFzayB8PSBDTl9UUkFOU01JVDsKCX0KCgkvKiBzZW5kIG5vdGlmaWNhdGlvbnMsIGlmIGFueSAqLwoJaWYgKHB0ci0+d25kICYmIG1hc2spIHsKCQlUUkFDRSgibm90aWZ5aW5nICVwOiBjaWQ9JWQsIG1hc2s9JTAyeFxuIiwgcHRyLT53bmQsIGNpZCwgbWFzayk7CgkJUG9zdE1lc3NhZ2VBKHB0ci0+d25kLCBXTV9DT01NTk9USUZZLCBjaWQsIG1hc2spOwoJfQoKCS8qIHN0YXJ0IGFnYWluIGlmIG5lY2Vzc2FyeSAqLwoJaWYoYmxlZnQpCgkJY29tbV93YWl0d3JpdGUocHRyKTsKfQoKc3RhdGljIHZvaWQgY29tbV93YWl0cmVhZChzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKCWludCBibGVmdDsKICAgICAgICBDT01TVEFUIHN0YXQ7CgoJLyogRklYTUU6IGdldCB0aW1lb3V0cyB3b3JraW5nIHByb3Blcmx5IHNvIHdlIGNhbiByZWFkIGJsZWZ0IGJ5dGVzICovCglibGVmdCA9ICgocHRyLT5pYnVmX3RhaWwgPiBwdHItPmlidWZfaGVhZCkgPwoJCShwdHItPmlidWZfdGFpbC0xKSA6IHB0ci0+aWJ1Zl9zaXplKSAtIHB0ci0+aWJ1Zl9oZWFkOwoKCS8qIGZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIGFyZSBsZWZ0IGluIHRoZSBidWZmZXIgKi8KCWlmKENsZWFyQ29tbUVycm9yKHB0ci0+aGFuZGxlLE5VTEwsJnN0YXQpKQoJCWJsZWZ0ID0gKGJsZWZ0PHN0YXQuY2JJblF1ZSkgPyBibGVmdCA6IHN0YXQuY2JJblF1ZTsKCWVsc2UKCQlibGVmdCA9IDE7CgoJLyogYWx3YXlzIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUgKi8KCWlmKGJsZWZ0PT0wKQoJCWJsZWZ0Kys7CgoJUmVhZEZpbGVFeChwdHItPmhhbmRsZSwKCQlwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsCgkJYmxlZnQsCgkJJnB0ci0+cmVhZF9vdiwKCQlDT01NMTZfUmVhZENvbXBsZXRlKTsKfQoKc3RhdGljIHZvaWQgY29tbV93YWl0d3JpdGUoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CglpbnQgYmxlZnQ7CgoJYmxlZnQgPSAoKHB0ci0+b2J1Zl90YWlsIDw9IHB0ci0+b2J1Zl9oZWFkKSA/CgkJcHRyLT5vYnVmX2hlYWQgOiBwdHItPm9idWZfc2l6ZSkgLSBwdHItPm9idWZfdGFpbDsKCVdyaXRlRmlsZUV4KHB0ci0+aGFuZGxlLAoJCXB0ci0+b3V0YnVmICsgcHRyLT5vYnVmX3RhaWwsCgkJYmxlZnQsCgkJJnB0ci0+d3JpdGVfb3YsCgkJQ09NTTE2X1dyaXRlQ29tcGxldGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ09NTTE2X0RDQnRvRENCMTYJKEludGVybmFsKQogKi8KSU5UMTYgQ09NTTE2X0RDQnRvRENCMTYoTFBEQ0IgbHBkY2IsIExQRENCMTYgbHBkY2IxNikKewoJaWYobHBkY2ItPkJhdWRSYXRlPDB4MTAwMDApCgkJbHBkY2IxNi0+QmF1ZFJhdGUgPSBscGRjYi0+QmF1ZFJhdGU7CgllbHNlIGlmKGxwZGNiLT5CYXVkUmF0ZT09MTE1MjAwKQoJCQlscGRjYjE2LT5CYXVkUmF0ZSA9IDU3NjAxOwoJZWxzZSB7CgkJV0FSTigiQmF1ZCByYXRlIGNhbid0IGJlIGNvbnZlcnRlZFxuIik7CgkJbHBkY2IxNi0+QmF1ZFJhdGUgPSA1NzYwMTsKCX0KCWxwZGNiMTYtPkJ5dGVTaXplID0gbHBkY2ItPkJ5dGVTaXplOwoJbHBkY2IxNi0+ZlBhcml0eSA9IGxwZGNiLT5mUGFyaXR5OwoJbHBkY2IxNi0+UGFyaXR5ID0gbHBkY2ItPlBhcml0eTsKCWxwZGNiMTYtPlN0b3BCaXRzID0gbHBkY2ItPlN0b3BCaXRzOwoKCWxwZGNiMTYtPlJsc1RpbWVvdXQgPSA1MDsKCWxwZGNiMTYtPkN0c1RpbWVvdXQgPSA1MDsKCWxwZGNiMTYtPkRzclRpbWVvdXQgPSA1MDsKCWxwZGNiMTYtPmZOdWxsID0gMDsKCWxwZGNiMTYtPmZDaEV2dCA9IDA7CglscGRjYjE2LT5mQmluYXJ5ID0gMTsKCglscGRjYjE2LT5mRHRyZmxvdyA9IChscGRjYi0+ZkR0ckNvbnRyb2w9PURUUl9DT05UUk9MX0hBTkRTSEFLRSk7CglscGRjYjE2LT5mUnRzZmxvdyA9IChscGRjYi0+ZlJ0c0NvbnRyb2w9PVJUU19DT05UUk9MX0hBTkRTSEFLRSk7CglscGRjYjE2LT5mT3V0eEN0c0Zsb3cgPSBscGRjYi0+Zk91dHhDdHNGbG93OwoJbHBkY2IxNi0+Zk91dHhEc3JGbG93ID0gbHBkY2ItPmZPdXR4RHNyRmxvdzsKCWxwZGNiMTYtPmZEdHJEaXNhYmxlID0gKGxwZGNiLT5mRHRyQ29udHJvbD09RFRSX0NPTlRST0xfRElTQUJMRSk7CgoJbHBkY2IxNi0+ZkluWCA9IGxwZGNiLT5mSW5YOwoKCWxwZGNiMTYtPmZPdXRYID0gbHBkY2ItPmZPdXRYOwovKgoJbHBkY2IxNi0+WG9uQ2hhciA9CglscGRjYjE2LT5Yb2ZmQ2hhciA9CiAqLwoJbHBkY2IxNi0+WG9uTGltID0gMTA7CglscGRjYjE2LT5Yb2ZmTGltID0gMTA7CgoJcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0IJCShVU0VSLjIxMykKICoKICogQWNjb3JkaW5nIHRvIHRoZSBFQ01BLTIzNCAoMzY4LjMpIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBGQUxTRSBvbgogKiBzdWNjZXNzLCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gLTEuCiAqLwpJTlQxNiBXSU5BUEkgQnVpbGRDb21tRENCMTYoTFBDU1RSIGRldmljZSwgTFBEQ0IxNiBscGRjYikKewoJLyogIkNPTTE6OTYsbiw4LDEiCSovCgkvKiAgMDEyMzQ1CQkqLwoJaW50IHBvcnQ7CglEQ0IgZGNiOwoKCVRSQUNFKCIoJXMpLCBwdHIgJXBcbiIsIGRldmljZSwgbHBkY2IpOwoKCWlmIChzdHJuY2FzZWNtcChkZXZpY2UsIkNPTSIsMykpCgkJcmV0dXJuIC0xOwoJcG9ydCA9IGRldmljZVszXSAtICcwJzsKCglpZiAocG9ydC0tID09IDApIHsKCQlFUlIoIkJVRyAhIENPTTAgY2FuJ3QgZXhpc3QhXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbWVtc2V0KGxwZGNiLCAwLCBzaXplb2YoRENCMTYpKTsgLyogaW5pdGlhbGl6ZSAqLwoKCWxwZGNiLT5JZCA9IHBvcnQ7CglkY2IuRENCbGVuZ3RoID0gc2l6ZW9mKERDQik7CgoJaWYgKHN0cmNocihkZXZpY2UsJz0nKSkgLyogYmxvY2sgbmV3IHN0eWxlICovCgkJcmV0dXJuIC0xOwoKCWlmKCFCdWlsZENvbW1EQ0JBKGRldmljZSwmZGNiKSkKCQlyZXR1cm4gLTE7CgoJcmV0dXJuIENPTU0xNl9EQ0J0b0RDQjE2KCZkY2IsIGxwZGNiKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCU9wZW5Db21tCQkoVVNFUi4yMDApCiAqLwpJTlQxNiBXSU5BUEkgT3BlbkNvbW0xNihMUENTVFIgZGV2aWNlLFVJTlQxNiBjYkluUXVldWUsVUlOVDE2IGNiT3V0UXVldWUpCnsKCWludCBwb3J0OwoJSEFORExFIGhhbmRsZTsKCiAgICAJVFJBQ0UoIiVzLCAlZCwgJWRcbiIsIGRldmljZSwgY2JJblF1ZXVlLCBjYk91dFF1ZXVlKTsKCglpZiAoc3RybGVuKGRldmljZSkgPCA0KQoJICAgcmV0dXJuIElFX0JBRElEOwoKCXBvcnQgPSBkZXZpY2VbM10gLSAnMCc7CgoJaWYgKHBvcnQtLSA9PSAwKQoJCUVSUigiQlVHICEgQ09NMCBvciBMUFQwIGRvbid0IGV4aXN0ICFcbiIpOwoKCWlmICghc3RybmNhc2VjbXAoZGV2aWNlLCJDT00iLDMpKQogICAgICAgIHsKCQlpZiAoQ09NW3BvcnRdLmhhbmRsZSkKCQkJcmV0dXJuIElFX09QRU47CgoJCWhhbmRsZSA9IENyZWF0ZUZpbGVBKGRldmljZSwgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEUsCgkJCUZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsIE5VTEwsIENSRUFURV9BTFdBWVMsCgkJCUZJTEVfRkxBR19PVkVSTEFQUEVEfEZJTEVfRkxBR19OT19CVUZGRVJJTkcsIDAgKTsKCQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CgkJCXJldHVybiBJRV9IQVJEV0FSRTsKCQl9IGVsc2UgewoJCQltZW1zZXQoQ09NW3BvcnRdLnVua25vd24sIDAsIHNpemVvZihDT01bcG9ydF0udW5rbm93bikpOwogICAgICAgICAgICAgICAgICAgICAgICBDT01bcG9ydF0uc2VnX3Vua25vd24gPSAwOwoJCQlDT01bcG9ydF0uaGFuZGxlID0gaGFuZGxlOwoJCQlDT01bcG9ydF0uY29tbWVycm9yID0gMDsKCQkJQ09NW3BvcnRdLmV2ZW50bWFzayA9IDA7CgkJCUNPTVtwb3J0XS5ldnRjaGFyID0gMDsgLyogRklYTUU6IGRlZmF1bHQ/ICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGVybWluYWwgc3RhdGUgKi8KCQkJR2V0Q29tbVN0YXRlMTYocG9ydCwmQ09NW3BvcnRdLmRjYik7CgkJCS8qIGluaXQgcHJpb3JpdHkgY2hhcmFjdGVycyAqLwoJCQlDT01bcG9ydF0udW5nZXQgPSAtMTsKCQkJQ09NW3BvcnRdLnhtaXQgPSAtMTsKCQkJLyogYWxsb2NhdGUgYnVmZmVycyAqLwoJCQlDT01bcG9ydF0uaWJ1Zl9zaXplID0gY2JJblF1ZXVlOwoJCQlDT01bcG9ydF0uaWJ1Zl9oZWFkID0gQ09NW3BvcnRdLmlidWZfdGFpbCA9IDA7CgkJCUNPTVtwb3J0XS5vYnVmX3NpemUgPSBjYk91dFF1ZXVlOwoJCQlDT01bcG9ydF0ub2J1Zl9oZWFkID0gQ09NW3BvcnRdLm9idWZfdGFpbCA9IDA7CgoJCQlDT01bcG9ydF0uaW5idWYgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY2JJblF1ZXVlKTsKCQkJaWYgKENPTVtwb3J0XS5pbmJ1ZikgewoJCQkgIENPTVtwb3J0XS5vdXRidWYgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNiT3V0UXVldWUpOwoJCQkgIGlmICghQ09NW3BvcnRdLm91dGJ1ZikKCQkJICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBDT01bcG9ydF0uaW5idWYpOwoJCQl9IGVsc2UgQ09NW3BvcnRdLm91dGJ1ZiA9IE5VTEw7CgkJCWlmICghQ09NW3BvcnRdLm91dGJ1ZikgewoJCQkgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCgkJCSAgQ2xvc2VIYW5kbGUoQ09NW3BvcnRdLmhhbmRsZSk7CgkJCSAgRVJSKCJvdXQgb2YgbWVtb3J5XG4iKTsKCQkJICByZXR1cm4gSUVfTUVNT1JZOwoJCQl9CgoJCQlaZXJvTWVtb3J5KCZDT01bcG9ydF0ucmVhZF9vdixzaXplb2YgKE9WRVJMQVBQRUQpKTsKCQkJWmVyb01lbW9yeSgmQ09NW3BvcnRdLndyaXRlX292LHNpemVvZiAoT1ZFUkxBUFBFRCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29tbV93YWl0cmVhZCggJkNPTVtwb3J0XSApOwoJCQlVU0VSMTZfQWxlcnRhYmxlV2FpdCsrOwoKCQkJcmV0dXJuIHBvcnQ7CgkJfQoJfQoJZWxzZQoJaWYgKCFzdHJuY2FzZWNtcChkZXZpY2UsIkxQVCIsMykpIHsKCgkJaWYgKExQVFtwb3J0XS5oYW5kbGUpCgkJCXJldHVybiBJRV9PUEVOOwoKCQloYW5kbGUgPSBDcmVhdGVGaWxlQShkZXZpY2UsIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFLAoJCQlGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLCBOVUxMLCBDUkVBVEVfQUxXQVlTLCAwLCAwICk7CgkJaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewoJCQlyZXR1cm4gSUVfSEFSRFdBUkU7CgkJfSBlbHNlIHsKCQkJTFBUW3BvcnRdLmhhbmRsZSA9IGhhbmRsZTsKCQkJTFBUW3BvcnRdLmNvbW1lcnJvciA9IDA7CgkJCUxQVFtwb3J0XS5ldmVudG1hc2sgPSAwOwoJCQlyZXR1cm4gcG9ydHxGTEFHX0xQVDsKCQl9Cgl9CglyZXR1cm4gSUVfQkFESUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbG9zZUNvbW0JCShVU0VSLjIwNykKICovCklOVDE2IFdJTkFQSSBDbG9zZUNvbW0xNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZFxuIiwgY2lkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglpZiAoIShjaWQmRkxBR19MUFQpKSB7CgkJLyogQ09NIHBvcnQgKi8KICAgICAgICAgICAgICAgIFVuTWFwTFMoIENPTVtjaWRdLnNlZ191bmtub3duICk7CgkJVVNFUjE2X0FsZXJ0YWJsZVdhaXQtLTsKCQlDYW5jZWxJbyhwdHItPmhhbmRsZSk7CgoJCS8qIGZyZWUgYnVmZmVycyAqLwoJCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwdHItPm91dGJ1Zik7CgkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHB0ci0+aW5idWYpOwoKCQkvKiByZXNldCBtb2RlbSBsaW5lcyAqLwoJCVNldENvbW1TdGF0ZTE2KCZDT01bY2lkXS5kY2IpOwoJfQoKCWlmICghQ2xvc2VIYW5kbGUocHRyLT5oYW5kbGUpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCS8qIEZJWE1FOiBzaG91bGQgd2UgY2xlYXIgcHRyLT5oYW5kbGUgaGVyZT8gKi8KCQlyZXR1cm4gLTE7Cgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlwdHItPmhhbmRsZSA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tQnJlYWsJCShVU0VSLjIxMCkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCglwdHItPnN1c3BlbmRlZCA9IDE7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUJyZWFrCShVU0VSLjIxMSkKICovCklOVDE2IFdJTkFQSSBDbGVhckNvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKCEocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT5zdXNwZW5kZWQgPSAwOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKFVTRVIuMjE0KQogKi8KTE9ORyBXSU5BUEkgRXNjYXBlQ29tbUZ1bmN0aW9uMTYoVUlOVDE2IGNpZCxVSU5UMTYgbkZ1bmN0aW9uKQp7CglzdHJ1Y3QgIERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkLCBmdW5jdGlvbj0lZFxuIiwgY2lkLCBuRnVuY3Rpb24pOwoKCXN3aXRjaChuRnVuY3Rpb24pIHsKCWNhc2UgR0VUTUFYQ09NOgoJICAgICAgICBUUkFDRSgiR0VUTUFYQ09NXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiA0OyAgLyogRklYTUUgKi8KCgljYXNlIEdFVE1BWExQVDoKCQlUUkFDRSgiR0VUTUFYTFBUXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBGTEFHX0xQVCArIDM7ICAvKiBGSVhNRSAqLwoKCWNhc2UgR0VUQkFTRUlSUToKCQlUUkFDRSgiR0VUQkFTRUlSUVxuIik7CgkJLyogRklYTUU6IHVzZSB0YWJsZXMgKi8KCQkvKiBqdXN0IGZha2Ugc29tZXRoaW5nIGZvciBub3cgKi8KCQlpZiAoY2lkICYgRkxBR19MUFQpIHsKCQkJLyogTFBUMTogaXJxIDcsIExQVDI6IGlycSA1ICovCgkJCXJldHVybiAoY2lkICYgMHg3ZikgPyA1IDogNzsKCQl9IGVsc2UgewoJCQkvKiBDT00xOiBpcnEgNCwgQ09NMjogaXJxIDMsCgkJCSAgIENPTTM6IGlycSA0LCBDT000OiBpcnEgMyAqLwoJCQlyZXR1cm4gNCAtIChjaWQgJiAxKTsKCQl9Cgl9CgoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCglzd2l0Y2ggKG5GdW5jdGlvbikgewoJY2FzZSBSRVNFVERFVjoKCWNhc2UgQ0xSRFRSOgoJY2FzZSBDTFJSVFM6CgljYXNlIFNFVERUUjoKCWNhc2UgU0VUUlRTOgoJY2FzZSBTRVRYT0ZGOgoJY2FzZSBTRVRYT046CgkJaWYoRXNjYXBlQ29tbUZ1bmN0aW9uKHB0ci0+aGFuZGxlLG5GdW5jdGlvbikpCgkJCXJldHVybiAwOwoJCWVsc2UgewoJCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJCXJldHVybiAtMTsKCQl9CgoJY2FzZSBDTFJCUkVBSzoKCWNhc2UgU0VUQlJFQUs6CglkZWZhdWx0OgoJCVdBUk4oIihjaWQ9JWQsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwKCQkJY2lkLCBuRnVuY3Rpb24pOwoJfQoJcmV0dXJuIC0xOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRmx1c2hDb21tCShVU0VSLjIxNSkKICovCklOVDE2IFdJTkFQSSBGbHVzaENvbW0xNihJTlQxNiBjaWQsSU5UMTYgZm5RdWV1ZSkKewoJRFdPUkQgcXVldWU7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQ9JWQsIHF1ZXVlPSVkXG4iLCBjaWQsIGZuUXVldWUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCXN3aXRjaCAoZm5RdWV1ZSkgewoJY2FzZSAwOgoJCXF1ZXVlID0gUFVSR0VfVFhBQk9SVDsKCQlwdHItPm9idWZfdGFpbCA9IHB0ci0+b2J1Zl9oZWFkOwoJCWJyZWFrOwoJY2FzZSAxOgoJCXF1ZXVlID0gUFVSR0VfUlhBQk9SVDsKCQlwdHItPmlidWZfaGVhZCA9IHB0ci0+aWJ1Zl90YWlsOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlXQVJOKCIoY2lkPSVkLGZuUXVldWU9JWQpOlVua25vd24gcXVldWVcbiIsCgkJICAgICAgICAgICAgY2lkLCBmblF1ZXVlKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKCFQdXJnZUNvbW0ocHRyLT5oYW5kbGUscXVldWUpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbUVycm9yCShVU0VSLjIwMykKICovCklOVDE2IFdJTkFQSSBHZXRDb21tRXJyb3IxNihJTlQxNiBjaWQsTFBDT01TVEFUMTYgbHBTdGF0KQp7CglpbnQJCXRlbXBlcnJvcjsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwoKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQogICAgICAgIGlmIChjaWQmRkxBR19MUFQpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiBDRV9NT0RFOwogICAgICAgIH0KICAgICAgICBzdG9sID0gKHVuc2lnbmVkIGNoYXIgKilDT01bY2lkXS51bmtub3duICsgQ09NTV9NU1JfT0ZGU0VUOwoJQ09NTV9NU1JVcGRhdGUoIHB0ci0+aGFuZGxlLCBzdG9sICk7CgoJaWYgKGxwU3RhdCkgewoJCWxwU3RhdC0+c3RhdHVzID0gMDsKCgkJU2xlZXBFeCgxLFRSVUUpOwoKCQlscFN0YXQtPmNiT3V0UXVlID0gY29tbV9vdXRidWYocHRyKTsKCQlscFN0YXQtPmNiSW5RdWUgPSBjb21tX2luYnVmKHB0cik7CgogICAgCQlUUkFDRSgiY2lkICVkLCBlcnJvciAlZCwgc3RhdCAlZCBpbiAlZCBvdXQgJWQsIHN0b2wgJXhcbiIsCgkJCSAgICAgY2lkLCBwdHItPmNvbW1lcnJvciwgbHBTdGF0LT5zdGF0dXMsIGxwU3RhdC0+Y2JJblF1ZSwKCQkJICAgICBscFN0YXQtPmNiT3V0UXVlLCAqc3RvbCk7Cgl9CgllbHNlCgkJVFJBQ0UoImNpZCAlZCwgZXJyb3IgJWQsIGxwU3RhdCBOVUxMIHN0b2wgJXhcbiIsCgkJCSAgICAgY2lkLCBwdHItPmNvbW1lcnJvciwgKnN0b2wpOwoKCS8qIFJldHVybiBhbnkgZXJyb3JzIGFuZCBjbGVhciBpdCAqLwoJdGVtcGVycm9yID0gcHRyLT5jb21tZXJyb3I7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4odGVtcGVycm9yKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1FdmVudE1hc2sJKFVTRVIuMjA4KQogKi8KU0VHUFRSIFdJTkFQSSBTZXRDb21tRXZlbnRNYXNrMTYoSU5UMTYgY2lkLFVJTlQxNiBmdUV2dE1hc2spCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwoKICAgIAlUUkFDRSgiY2lkICVkLG1hc2sgJWRcbiIsY2lkLGZ1RXZ0TWFzayk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJICAgIHJldHVybiAoU0VHUFRSKU5VTEw7Cgl9CgoJcHRyLT5ldmVudG1hc2sgPSBmdUV2dE1hc2s7CgogICAgICAgIGlmIChjaWQmRkxBR19MUFQpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiAoU0VHUFRSKU5VTEw7CiAgICAgICAgfQogICAgICAgIC8qIGl0J3MgYSBDT00gcG9ydCA/IC0+IG1vZGlmeSBmbGFncyAqLwogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKUNPTVtjaWRdLnVua25vd24gKyBDT01NX01TUl9PRkZTRVQ7CglDT01NX01TUlVwZGF0ZSggcHRyLT5oYW5kbGUsIHN0b2wgKTsKCglUUkFDRSgiIG1vZGVtIGRjZCBjb25zdHJ1Y3QgJXhcbiIsKnN0b2wpOwogICAgICAgIGlmICghQ09NW2NpZF0uc2VnX3Vua25vd24pIENPTVtjaWRdLnNlZ191bmtub3duID0gTWFwTFMoIENPTVtjaWRdLnVua25vd24gKTsKICAgICAgICByZXR1cm4gQ09NW2NpZF0uc2VnX3Vua25vd247Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXZlbnRNYXNrCShVU0VSLjIwOSkKICovClVJTlQxNiBXSU5BUEkgR2V0Q29tbUV2ZW50TWFzazE2KElOVDE2IGNpZCxVSU5UMTYgZm5FdnRDbGVhcikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJV09SRCBldmVudHM7CgogICAgCVRSQUNFKCJjaWQgJWQsIG1hc2sgJWRcbiIsIGNpZCwgZm5FdnRDbGVhcik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJICAgIHJldHVybiAwOwoJfQoKICAgICAgICBpZiAoY2lkJkZMQUdfTFBUKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgoJZXZlbnRzID0gKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgJiBmbkV2dENsZWFyOwoJKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgJj0gfmZuRXZ0Q2xlYXI7CglyZXR1cm4gZXZlbnRzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbVN0YXRlCShVU0VSLjIwMSkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tU3RhdGUxNihMUERDQjE2IGxwZGNiKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglEQ0IgZGNiOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXBcbiIsIGxwZGNiLT5JZCwgbHBkY2IpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QobHBkY2ItPklkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsbHBkY2ItPklkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbWVtc2V0KCZkY2IsMCxzaXplb2YoZGNiKSk7CglkY2IuRENCbGVuZ3RoID0gc2l6ZW9mKGRjYik7CgoJLyoKCSAqIGFjY29yZGluZyB0byBNU0ROLCB3ZSBzaG91bGQgZmlyc3QgaW50ZXJwcmV0IGxwZGNiLT5CYXVkUmF0ZSBhcyBmb2xsb3dzOgoJICogMS4gaWYgdGhlIGJhdWQgcmF0ZSBpcyBhIENCUiBjb25zdGFudCwgaW50ZXJwcmV0IGl0LgoJICogMi4gaWYgaXQgaXMgZ3JlYXRlciB0aGFuIDU3NjAwLCB0aGUgYmF1ZCByYXRlIGlzIDExNTIwMAoJICogMy4gdXNlIHRoZSBhY3R1YWwgYmF1ZHJhdGUKCSAqIHN0ZXBzIDIgYW5kIDMgYXJlIGVxdWl2aWxlbnQgdG8gMTY1NTAgYmF1ZHJhdGUgZGl2aXNvciA9IDExNTIwMC9CYXVkUmF0ZQoJICogc2VlIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vc3VwcG9ydC9rYi9hcnRpY2xlcy9xMTA4LzkvMjguYXNwCgkgKi8KCXN3aXRjaChscGRjYi0+QmF1ZFJhdGUpCgl7CgljYXNlIENCUl8xMTA6ICAgIGRjYi5CYXVkUmF0ZSA9IDExMDsgICAgYnJlYWs7CgljYXNlIENCUl8zMDA6ICAgIGRjYi5CYXVkUmF0ZSA9IDMwMDsgICAgYnJlYWs7CgljYXNlIENCUl82MDA6ICAgIGRjYi5CYXVkUmF0ZSA9IDYwMDsgICAgYnJlYWs7CgljYXNlIENCUl8xMjAwOiAgIGRjYi5CYXVkUmF0ZSA9IDEyMDA7ICAgYnJlYWs7CgljYXNlIENCUl8yNDAwOiAgIGRjYi5CYXVkUmF0ZSA9IDI0MDA7ICAgYnJlYWs7CgljYXNlIENCUl80ODAwOiAgIGRjYi5CYXVkUmF0ZSA9IDQ4MDA7ICAgYnJlYWs7CgljYXNlIENCUl85NjAwOiAgIGRjYi5CYXVkUmF0ZSA9IDk2MDA7ICAgYnJlYWs7CgljYXNlIENCUl8xNDQwMDogIGRjYi5CYXVkUmF0ZSA9IDE0NDAwOyAgYnJlYWs7CgljYXNlIENCUl8xOTIwMDogIGRjYi5CYXVkUmF0ZSA9IDE5MjAwOyAgYnJlYWs7CgljYXNlIENCUl8zODQwMDogIGRjYi5CYXVkUmF0ZSA9IDM4NDAwOyAgYnJlYWs7CgljYXNlIENCUl81NjAwMDogIGRjYi5CYXVkUmF0ZSA9IDU2MDAwOyAgYnJlYWs7CgljYXNlIENCUl8xMjgwMDA6IGRjYi5CYXVkUmF0ZSA9IDEyODAwMDsgYnJlYWs7CgljYXNlIENCUl8yNTYwMDA6IGRjYi5CYXVkUmF0ZSA9IDI1NjAwMDsgYnJlYWs7CglkZWZhdWx0OgoJCWlmKGxwZGNiLT5CYXVkUmF0ZT41NzYwMCkKCQlkY2IuQmF1ZFJhdGUgPSAxMTUyMDA7CiAgICAgICAgZWxzZQoJCWRjYi5CYXVkUmF0ZSA9IGxwZGNiLT5CYXVkUmF0ZTsKIAl9CgogICAgICAgIGRjYi5CeXRlU2l6ZT1scGRjYi0+Qnl0ZVNpemU7CiAgICAgICAgZGNiLlN0b3BCaXRzPWxwZGNiLT5TdG9wQml0czsKCglkY2IuZlBhcml0eT1scGRjYi0+ZlBhcml0eTsKCWRjYi5QYXJpdHk9bHBkY2ItPlBhcml0eTsKCglkY2IuZk91dHhDdHNGbG93ID0gbHBkY2ItPmZPdXR4Q3RzRmxvdzsKCglpZiAobHBkY2ItPmZEdHJmbG93IHx8IGxwZGNiLT5mUnRzZmxvdykKCQlkY2IuZlJ0c0NvbnRyb2wgPSBUUlVFOwoKCWlmIChscGRjYi0+ZkR0ckRpc2FibGUpCgkJZGNiLmZEdHJDb250cm9sID0gVFJVRTsKCglwdHItPmV2dGNoYXIgPSBscGRjYi0+RXZ0Q2hhcjsKCglkY2IuZkluWCA9IGxwZGNiLT5mSW5YOwoJZGNiLmZPdXRYID0gbHBkY2ItPmZPdXRYOwoKCWlmICghU2V0Q29tbVN0YXRlKHB0ci0+aGFuZGxlLCZkY2IpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVN0YXRlCShVU0VSLjIwMikKICovCklOVDE2IFdJTkFQSSBHZXRDb21tU3RhdGUxNihJTlQxNiBjaWQsIExQRENCMTYgbHBkY2IpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCURDQiBkY2I7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcFxuIiwgY2lkLCBscGRjYik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCWlmICghR2V0Q29tbVN0YXRlKHB0ci0+aGFuZGxlLCZkY2IpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsKCX0KCglscGRjYi0+SWQgPSBjaWQ7CgoJQ09NTTE2X0RDQnRvRENCMTYoJmRjYixscGRjYik7CgoJbHBkY2ItPkV2dENoYXIgPSBwdHItPmV2dGNoYXI7CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglUcmFuc21pdENvbW1DaGFyCShVU0VSLjIwNikKICovCklOVDE2IFdJTkFQSSBUcmFuc21pdENvbW1DaGFyMTYoSU5UMTYgY2lkLENIQVIgY2hUcmFuc21pdCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkLCBkYXRhICVkIFxuIiwgY2lkLCBjaFRyYW5zbWl0KTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnhtaXQgPj0gMCkgewoJICAvKiBjaGFyYWN0ZXIgYWxyZWFkeSBxdWV1ZWQgKi8KCSAgLyogRklYTUU6IHdoaWNoIGVycm9yIHdvdWxkIFdpbmRvd3MgcmV0dXJuPyAqLwoJICBwdHItPmNvbW1lcnJvciA9IENFX1RYRlVMTDsKCSAgcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPm9idWZfaGVhZCA9PSBwdHItPm9idWZfdGFpbCkgewoJICAvKiB0cmFuc21pdCBxdWV1ZSBlbXB0eSwgdHJ5IHRvIHRyYW5zbWl0IGRpcmVjdGx5ICovCgkgIGlmKDEhPUNPTU0xNl9Xcml0ZUZpbGUocHRyLT5oYW5kbGUsICZjaFRyYW5zbWl0LCAxKSkKCSAgewoJICAgIC8qIGRpZG4ndCB3b3JrLCBxdWV1ZSBpdCAqLwoJICAgIHB0ci0+eG1pdCA9IGNoVHJhbnNtaXQ7CgkgICAgY29tbV93YWl0d3JpdGUocHRyKTsKCSAgfQoJfSBlbHNlIHsKCSAgLyogZGF0YSBpbiBxdWV1ZSwgbGV0IHRoaXMgY2hhciBiZSB0cmFuc21pdHRlZCBuZXh0ICovCgkgIHB0ci0+eG1pdCA9IGNoVHJhbnNtaXQ7CgkgIGNvbW1fd2FpdHdyaXRlKHB0cik7Cgl9CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVbmdldENvbW1DaGFyCShVU0VSLjIxMikKICovCklOVDE2IFdJTkFQSSBVbmdldENvbW1DaGFyMTYoSU5UMTYgY2lkLENIQVIgY2hVbmdldCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkIChjaGFyICVkKVxuIiwgY2lkLCBjaFVuZ2V0KTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfUlhPVkVSOwoJICByZXR1cm4gLTE7Cgl9CgoJcHRyLT51bmdldCA9IGNoVW5nZXQ7CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglSZWFkQ29tbQkoVVNFUi4yMDQpCiAqLwpJTlQxNiBXSU5BUEkgUmVhZENvbW0xNihJTlQxNiBjaWQsTFBTVFIgbHB2QnVmLElOVDE2IGNiUmVhZCkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJTFBTVFIgb3JnQnVmID0gbHB2QnVmOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgY2lkLCBscHZCdWYsIGNiUmVhZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0KCglpZigwPT1jb21tX2luYnVmKHB0cikpCgkJU2xlZXBFeCgxLFRSVUUpOwoKCS8qIHJlYWQgdW5nZXQgY2hhcmFjdGVyICovCglpZiAocHRyLT51bmdldD49MCkgewoJCSpscHZCdWYrKyA9IHB0ci0+dW5nZXQ7CgkJcHRyLT51bmdldCA9IC0xOwoKCQlsZW5ndGggPSAxOwoJfSBlbHNlCgkgCWxlbmd0aCA9IDA7CgoJLyogcmVhZCBmcm9tIHJlY2VpdmUgYnVmZmVyICovCgl3aGlsZSAobGVuZ3RoIDwgY2JSZWFkKSB7CgkgIHN0YXR1cyA9ICgocHRyLT5pYnVmX2hlYWQgPCBwdHItPmlidWZfdGFpbCkgPwoJCSAgICBwdHItPmlidWZfc2l6ZSA6IHB0ci0+aWJ1Zl9oZWFkKSAtIHB0ci0+aWJ1Zl90YWlsOwoJICBpZiAoIXN0YXR1cykgYnJlYWs7CgkgIGlmICgoY2JSZWFkIC0gbGVuZ3RoKSA8IHN0YXR1cykKCSAgICBzdGF0dXMgPSBjYlJlYWQgLSBsZW5ndGg7CgoJICBtZW1jcHkobHB2QnVmLCBwdHItPmluYnVmICsgcHRyLT5pYnVmX3RhaWwsIHN0YXR1cyk7CgkgIHB0ci0+aWJ1Zl90YWlsICs9IHN0YXR1czsKCSAgaWYgKHB0ci0+aWJ1Zl90YWlsID49IHB0ci0+aWJ1Zl9zaXplKQoJICAgIHB0ci0+aWJ1Zl90YWlsID0gMDsKCSAgbHB2QnVmICs9IHN0YXR1czsKCSAgbGVuZ3RoICs9IHN0YXR1czsKCX0KCglUUkFDRSgiJXNcbiIsIGRlYnVnc3RyX2FuKCBvcmdCdWYsIGxlbmd0aCApKTsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiBsZW5ndGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglXcml0ZUNvbW0JKFVTRVIuMjA1KQogKi8KSU5UMTYgV0lOQVBJIFdyaXRlQ29tbTE2KElOVDE2IGNpZCwgTFBTVFIgbHB2QnVmLCBJTlQxNiBjYldyaXRlKQp7CglpbnQgc3RhdHVzLCBsZW5ndGg7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcCwgbGVuZ3RoICVkXG4iLAoJCWNpZCwgbHB2QnVmLCBjYldyaXRlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQoKCVRSQUNFKCIlc1xuIiwgZGVidWdzdHJfYW4oIGxwdkJ1ZiwgY2JXcml0ZSApKTsKCglsZW5ndGggPSAwOwoJd2hpbGUgKGxlbmd0aCA8IGNiV3JpdGUpIHsKCSAgaWYgKChwdHItPm9idWZfaGVhZCA9PSBwdHItPm9idWZfdGFpbCkgJiYgKHB0ci0+eG1pdCA8IDApKSB7CgkgICAgLyogbm8gZGF0YSBxdWV1ZWQsIHRyeSB0byB3cml0ZSBkaXJlY3RseSAqLwoJICAgIHN0YXR1cyA9IENPTU0xNl9Xcml0ZUZpbGUocHRyLT5oYW5kbGUsIGxwdkJ1ZiwgY2JXcml0ZSAtIGxlbmd0aCk7CgkgICAgaWYgKHN0YXR1cyA+IDApIHsKCSAgICAgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgICAgICBsZW5ndGggKz0gc3RhdHVzOwoJICAgICAgY29udGludWU7CgkgICAgfQoJICB9CgkgIC8qIGNhbid0IHdyaXRlIGRpcmVjdGx5LCBwdXQgaW50byB0cmFuc21pdCBidWZmZXIgKi8KCSAgc3RhdHVzID0gKChwdHItPm9idWZfdGFpbCA+IHB0ci0+b2J1Zl9oZWFkKSA/CgkJICAgIChwdHItPm9idWZfdGFpbC0xKSA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl9oZWFkOwoJICBpZiAoIXN0YXR1cykgYnJlYWs7CgkgIGlmICgoY2JXcml0ZSAtIGxlbmd0aCkgPCBzdGF0dXMpCgkgICAgc3RhdHVzID0gY2JXcml0ZSAtIGxlbmd0aDsKCSAgbWVtY3B5KGxwdkJ1ZiwgcHRyLT5vdXRidWYgKyBwdHItPm9idWZfaGVhZCwgc3RhdHVzKTsKCSAgcHRyLT5vYnVmX2hlYWQgKz0gc3RhdHVzOwoJICBpZiAocHRyLT5vYnVmX2hlYWQgPj0gcHRyLT5vYnVmX3NpemUpCgkgICAgcHRyLT5vYnVmX2hlYWQgPSAwOwoJICBscHZCdWYgKz0gc3RhdHVzOwoJICBsZW5ndGggKz0gc3RhdHVzOwoJICBjb21tX3dhaXR3cml0ZShwdHIpOwoJfQoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiBsZW5ndGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbiAgIChVU0VSLjI0NSkKICovCkJPT0wxNiBXSU5BUEkgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbjE2KCBJTlQxNiBjaWQsIEhXTkQxNiBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNiV3JpdGVOb3RpZnksIElOVDE2IGNiT3V0UXVldWUgKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgoJVFJBQ0UoIiglZCwgJXgsICVkLCAlZClcbiIsIGNpZCwgaHduZCwgY2JXcml0ZU5vdGlmeSwgY2JPdXRRdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCXB0ci0+d25kID0gV0lOX0hhbmRsZTMyKCBod25kICk7CglwdHItPm5fcmVhZCA9IGNiV3JpdGVOb3RpZnk7CglwdHItPm5fd3JpdGUgPSBjYk91dFF1ZXVlOwoJcmV0dXJuIFRSVUU7Cn0K