IC8qCiAqIERFQyA5MyBFcmlrIEJvcyA8ZXJpa0B4czRhbGwubmw+CiAqCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogQXByIDMsIDE5OTkuICBMYXdzb24gV2hpdG5leSA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIC0gRml4ZWQgdGhlIG1vZGVtIGNvbnRyb2wgcGFydCBvZiBFc2NhcGVDb21tRnVuY3Rpb24xNi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KICogLSBwdHItPmZkIHdhc24ndCBnZXR0aW5nIGNsZWFyZWQgb24gY2xvc2UuCiAqIC0gR2V0Q29tbUV2ZW50TWFzaygpIGFuZCBHZXRDb21tRXJyb3IoKSBkaWRuJ3QgZG8gbXVjaCBvZiBhbnl0aGluZy4KICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKICogICBldmVudCBhbmQgcmV0dXJuIEkvTyBxdWV1ZSBzaXplcywgd2hpY2ggbWFrZXMgdGhlIGFwcCBJJ20gaW50ZXJlc3RlZAogKiAgIGluIChhbmFsb2cgZGV2aWNlcyBFWktJVCBEU1AgZGV2ZWxvcG1lbnQgc3lzdGVtKSB3b3JrLgogKgogKiBBdWd1c3QgMTIsIDE5OTcuICBUYWtlIGEgYmFzaCBhdCBTZXRDb21tRXZlbnRNYXNrIC0gTGF3c29uIFdoaXRuZXkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogKiBKdWx5IDYsIDE5OTguIEZpeGVzIGFuZCBjb21tZW50cyBieSBWYWxlbnRpam4gU2Vzc2luawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnNlc3NpbmtAaWMudXZhLm5sPiBbVl0KICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICogCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGVybWlvcy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaWZkZWYgSEFWRV9TVFJJTkdTX0gKIyBpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaWZkZWYgSEFWRV9TWVNfRklMSU9fSAojIGluY2x1ZGUgPHN5cy9maWxpby5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAid2luZS93aW51c2VyMTYuaCIKI2luY2x1ZGUgImNvbW0uaCIKI2lmZGVmIEhBVkVfU1lTX01PREVNX0gKIyBpbmNsdWRlIDxzeXMvbW9kZW0uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TVFJUSU9fSAojIGluY2x1ZGUgPHN5cy9zdHJ0aW8uaD4KI2VuZGlmCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCgojaW5jbHVkZSAic2VydmVyLmgiCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAiYXN5bmMuaCIKCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoY29tbSkKCiNpZm5kZWYgVElPQ0lOUQojZGVmaW5lCVRJT0NJTlEgRklPTlJFQUQKI2VuZGlmCiNkZWZpbmUgQ09NTV9NU1JfT0ZGU0VUICAzNSAgICAgICAvKiBzZWUga25vd2xlZGdlIGJhc2UgUTEwMTQxNyAqLwojZGVmaW5lIEZMQUdfTFBUIDB4ODAKCnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgQ09NW01BWF9QT1JUU107CnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgTFBUW01BWF9QT1JUU107Ci8qIHBvaW50ZXJzIHRvIHVua25vd24oPT11bmRvY3VtZW50ZWQpIGNvbW0gc3RydWN0dXJlICovIApMUENWT0lEICp1bmtub3duW01BWF9QT1JUU107Ci8qIHNhdmUgdGVybWluYWwgc3RhdGVzICovCnN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBtX3N0YXRbTUFYX1BPUlRTXTsKCnZvaWQgQ09NTV9Jbml0KHZvaWQpCnsKCWludCB4OwoJY2hhciBvcHRpb25bMTBdLCB0ZW1wWzI1Nl0sICpidGVtcDsKCXN0cnVjdCBzdGF0IHN0OwoKCWZvciAoeD0wOyB4IT1NQVhfUE9SVFM7IHgrKykgewoJCXN0cmNweShvcHRpb24sIkNPTXgiKTsKCQlvcHRpb25bM10gPSAnMScgKyB4OwoJCW9wdGlvbls0XSA9ICdcMCc7CgoJCVBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggInNlcmlhbHBvcnRzIiwgb3B0aW9uLCAiKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIHNpemVvZih0ZW1wKSApOwoJCWlmICghc3RyY21wKHRlbXAsICIqIikgfHwgKnRlbXAgPT0gJ1wwJykgCgkJCUNPTVt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkgIAlidGVtcCA9IHN0cmNocih0ZW1wLCcsJyk7CgkJCWlmIChidGVtcCAhPSBOVUxMKSB7CgkJCSAgCSpidGVtcCsrID0gJ1wwJzsKCQkJCUNPTVt4XS5iYXVkcmF0ZSA9IGF0b2koYnRlbXApOwoJCQl9IGVsc2UgewoJCQkJQ09NW3hdLmJhdWRyYXRlID0gLTE7CgkJCX0KCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZQoJCQkJaWYgKChDT01beF0uZGV2aWNlbmFtZSA9IG1hbGxvYyhzdHJsZW4odGVtcCkrMSkpID09IE5VTEwpIAoJCQkJCVdBUk4oIkNhbid0IG1hbGxvYyBmb3IgZGV2aWNlIGluZm8hXG4iKTsKCQkJCWVsc2UgewoJCQkJCUNPTVt4XS5mZCA9IDA7CgkJCQkJc3RyY3B5KENPTVt4XS5kZXZpY2VuYW1lLCB0ZW1wKTsKCQkJCX0KICAgICAgICAgICAgICAgIFRSQUNFKCIlcyA9ICVzXG4iLCBvcHRpb24sIENPTVt4XS5kZXZpY2VuYW1lKTsKIAkJfQoKCQlzdHJjcHkob3B0aW9uLCAiTFBUeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAicGFyYWxsZWxwb3J0cyIsIG9wdGlvbiwgIioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCBzaXplb2YodGVtcCkgKTsKCQlpZiAoIXN0cmNtcCh0ZW1wLCAiKiIpIHx8ICp0ZW1wID09ICdcMCcpCgkJCUxQVFt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZSAKCQkJCWlmICgoTFBUW3hdLmRldmljZW5hbWUgPSBtYWxsb2Moc3RybGVuKHRlbXApKzEpKSA9PSBOVUxMKSAKCQkJCQlXQVJOKCJDYW4ndCBtYWxsb2MgZm9yIGRldmljZSBpbmZvIVxuIik7CgkJCQllbHNlIHsKCQkJCQlMUFRbeF0uZmQgPSAwOwoJCQkJCXN0cmNweShMUFRbeF0uZGV2aWNlbmFtZSwgdGVtcCk7CgkJCQl9CiAgICAgICAgICAgICAgICBUUkFDRSgiJXMgPSAlc1xuIiwgb3B0aW9uLCBMUFRbeF0uZGV2aWNlbmFtZSk7CgkJfQoKCX0KfQoKCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpHZXREZXZpY2VTdHJ1Y3QoaW50IGZkKQp7CglpZiAoKGZkJjB4N0YpPD1NQVhfUE9SVFMpIHsKICAgICAgICAgICAgaWYgKCEoZmQmRkxBR19MUFQpKSB7CgkJaWYgKENPTVtmZF0uZmQpCgkJICAgIHJldHVybiAmQ09NW2ZkXTsKCSAgICB9IGVsc2UgewoJCWlmIChMUFRbZmRdLmZkKQoJCSAgICByZXR1cm4gJkxQVFtmZF07CgkgICAgfQoJfQoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50ICAgIEdldENvbW1Qb3J0X2ZkKGludCBmZCkKewogICAgICAgIGludCB4OwogICAgICAgIAogICAgICAgIGZvciAoeD0wOyB4PE1BWF9QT1JUUzsgeCsrKSB7CiAgICAgICAgICAgICBpZiAoQ09NW3hdLmZkID09IGZkKQogICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgfQogICAgICAgCiAgICAgICByZXR1cm4gLTE7Cn0gCgpzdGF0aWMgaW50IFZhbGlkQ09NUG9ydChpbnQgeCkKewoJcmV0dXJuKHggPCBNQVhfUE9SVFMgPyAoaW50KSBDT01beF0uZGV2aWNlbmFtZSA6IDApOyAKfQoKc3RhdGljIGludCBWYWxpZExQVFBvcnQoaW50IHgpCnsKCXJldHVybih4IDwgTUFYX1BPUlRTID8gKGludCkgTFBUW3hdLmRldmljZW5hbWUgOiAwKTsgCn0KCnN0YXRpYyBpbnQgV2luRXJyb3Iodm9pZCkKewogICAgICAgIFRSQUNFKCJlcnJubyA9ICVkXG4iLCBlcnJubyk7Cglzd2l0Y2ggKGVycm5vKSB7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIENFX0lPRTsKCQl9Cn0KCnN0YXRpYyB1bnNpZ25lZCBjb21tX2luYnVmKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIHJldHVybiAoKHB0ci0+aWJ1Zl90YWlsID4gcHRyLT5pYnVmX2hlYWQpID8gcHRyLT5pYnVmX3NpemUgOiAwKQogICAgKyBwdHItPmlidWZfaGVhZCAtIHB0ci0+aWJ1Zl90YWlsOwp9CgpzdGF0aWMgdW5zaWduZWQgY29tbV9vdXRidWYoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CiAgcmV0dXJuICgocHRyLT5vYnVmX3RhaWwgPiBwdHItPm9idWZfaGVhZCkgPyBwdHItPm9idWZfc2l6ZSA6IDApCiAgICArIHB0ci0+b2J1Zl9oZWFkIC0gcHRyLT5vYnVmX3RhaWw7Cn0KCnN0YXRpYyBpbnQgQ09NTV9XaGFja01vZGVtKGludCBmZCwgdW5zaWduZWQgaW50IGFuZHksIHVuc2lnbmVkIGludCBvcnJpZSkKewogICAgdW5zaWduZWQgaW50IG1zdGF0LCBva2F5OwogICAgb2theSA9IGlvY3RsKGZkLCBUSU9DTUdFVCwgJm1zdGF0KTsKICAgIGlmIChva2F5KSByZXR1cm4gb2theTsKICAgIGlmIChhbmR5KSBtc3RhdCAmPSBhbmR5OwogICAgbXN0YXQgfD0gb3JyaWU7CiAgICByZXR1cm4gaW9jdGwoZmQsIFRJT0NNU0VULCAmbXN0YXQpOwp9CgkKc3RhdGljIHZvaWQgY29tbV9ub3RpZmljYXRpb24oaW50IGZkLHZvaWQqcHJpdmF0ZSkKewogIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0ciA9IChzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICopcHJpdmF0ZTsKICBpbnQgcHJldiwgYmxlZnQsIGxlbjsKICBXT1JEIG1hc2sgPSAwOwogIGludCBjaWQgPSBHZXRDb21tUG9ydF9mZChmZCk7CgogIFRSQUNFKCJhc3luYyBub3RpZmljYXRpb25cbiIpOwogIC8qIHJlYWQgZGF0YSBmcm9tIGNvbW0gcG9ydCAqLwogIHByZXYgPSBjb21tX2luYnVmKHB0cik7CiAgZG8gewogICAgYmxlZnQgPSAoKHB0ci0+aWJ1Zl90YWlsID4gcHRyLT5pYnVmX2hlYWQpID8gKHB0ci0+aWJ1Zl90YWlsLTEpIDogcHRyLT5pYnVmX3NpemUpCiAgICAgIC0gcHRyLT5pYnVmX2hlYWQ7CiAgICBsZW4gPSByZWFkKGZkLCBwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsIGJsZWZ0P2JsZWZ0OjEpOwogICAgaWYgKGxlbiA+IDApIHsKICAgICAgaWYgKCFibGVmdCkgewoJcHRyLT5jb21tZXJyb3IgPSBDRV9SWE9WRVI7CiAgICAgIH0gZWxzZSB7CgkvKiBjaGVjayBmb3IgZXZlbnRzICovCglpZiAoKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhGTEFHKSAmJgoJICAgIG1lbWNocihwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsIHB0ci0+ZXZ0Y2hhciwgYmxlZnQpKSB7CgkgICooV09SRCopKHVua25vd25bY2lkXSkgfD0gRVZfUlhGTEFHOwoJICBtYXNrIHw9IENOX0VWRU5UOwoJfQoJaWYgKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhDSEFSKSB7CgkgICooV09SRCopKHVua25vd25bY2lkXSkgfD0gRVZfUlhDSEFSOwoJICBtYXNrIHw9IENOX0VWRU5UOwoJfQoJLyogYWR2YW5jZSBidWZmZXIgcG9zaXRpb24gKi8KCXB0ci0+aWJ1Zl9oZWFkICs9IGxlbjsKCWlmIChwdHItPmlidWZfaGVhZCA+PSBwdHItPmlidWZfc2l6ZSkKCSAgcHRyLT5pYnVmX2hlYWQgPSAwOwogICAgICB9CiAgICB9CiAgfSB3aGlsZSAobGVuID4gMCk7CiAgLyogY2hlY2sgZm9yIG5vdGlmaWNhdGlvbiAqLwogIGlmIChwdHItPnduZCAmJiAocHRyLT5uX3JlYWQ+MCkgJiYgKHByZXY8cHRyLT5uX3JlYWQpICYmCiAgICAgIChjb21tX2luYnVmKHB0cik+PXB0ci0+bl9yZWFkKSkgewogICAgLyogcGFzc2VkIHRoZSByZWNlaXZlIG5vdGlmaWNhdGlvbiB0aHJlc2hvbGQgKi8KICAgIG1hc2sgfD0gQ05fUkVDRUlWRTsKICB9CgogIC8qIHdyaXRlIGFueSBUcmFuc21pdENvbW1DaGFyIGNoYXJhY3RlciAqLwogIGlmIChwdHItPnhtaXQ+PTApIHsKICAgIGxlbiA9IHdyaXRlKGZkLCAmKHB0ci0+eG1pdCksIDEpOwogICAgaWYgKGxlbiA+IDApIHB0ci0+eG1pdCA9IC0xOwogIH0KICAvKiB3cml0ZSBmcm9tIG91dHB1dCBxdWV1ZSAqLwogIHByZXYgPSBjb21tX291dGJ1ZihwdHIpOwogIGRvIHsKICAgIGJsZWZ0ID0gKChwdHItPm9idWZfdGFpbCA8PSBwdHItPm9idWZfaGVhZCkgPyBwdHItPm9idWZfaGVhZCA6IHB0ci0+b2J1Zl9zaXplKQogICAgICAtIHB0ci0+b2J1Zl90YWlsOwogICAgbGVuID0gYmxlZnQgPyB3cml0ZShmZCwgcHRyLT5vdXRidWYgKyBwdHItPm9idWZfdGFpbCwgYmxlZnQpIDogMDsKICAgIGlmIChsZW4gPiAwKSB7CiAgICAgIHB0ci0+b2J1Zl90YWlsICs9IGxlbjsKICAgICAgaWYgKHB0ci0+b2J1Zl90YWlsID49IHB0ci0+b2J1Zl9zaXplKQoJcHRyLT5vYnVmX3RhaWwgPSAwOwogICAgICAvKiBmbGFnIGV2ZW50ICovCiAgICAgIGlmICgocHRyLT5vYnVmX3RhaWwgPT0gcHRyLT5vYnVmX2hlYWQpICYmIChwdHItPmV2ZW50bWFzayAmIEVWX1RYRU1QVFkpKSB7CgkqKFdPUkQqKSh1bmtub3duW2NpZF0pIHw9IEVWX1RYRU1QVFk7CgltYXNrIHw9IENOX0VWRU5UOwogICAgICB9CiAgICB9CiAgfSB3aGlsZSAobGVuID4gMCk7CiAgLyogY2hlY2sgZm9yIG5vdGlmaWNhdGlvbiAqLwogIGlmIChwdHItPnduZCAmJiAocHRyLT5uX3dyaXRlPjApICYmIChwcmV2Pj1wdHItPm5fd3JpdGUpICYmCiAgICAgIChjb21tX291dGJ1ZihwdHIpPHB0ci0+bl93cml0ZSkpIHsKICAgIC8qIHBhc3NlZCB0aGUgdHJhbnNtaXQgbm90aWZpY2F0aW9uIHRocmVzaG9sZCAqLwogICAgbWFzayB8PSBDTl9UUkFOU01JVDsKICB9CgogIC8qIHNlbmQgbm90aWZpY2F0aW9ucywgaWYgYW55ICovCiAgaWYgKHB0ci0+d25kICYmIG1hc2spIHsKICAgIFRSQUNFKCJub3RpZnlpbmcgJTA0eDogY2lkPSVkLCBtYXNrPSUwMnhcbiIsIHB0ci0+d25kLCBjaWQsIG1hc2spOwogICAgUG9zdE1lc3NhZ2UxNihwdHItPnduZCwgV01fQ09NTU5PVElGWSwgY2lkLCBtYXNrKTsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQgkJKFVTRVIuMjEzKQogKi8KQk9PTDE2IFdJTkFQSSBCdWlsZENvbW1EQ0IxNihMUENTVFIgZGV2aWNlLCBMUERDQjE2IGxwZGNiKQp7CgkvKiAiQ09NMTo5NjAwLG4sOCwxIgkqLwoJLyogIDAxMjM0NQkJKi8KCWludCBwb3J0OwoJY2hhciAqcHRyLCB0ZW1wWzI1Nl07CgoJVFJBQ0UoIiglcyksIHB0ciAlcFxuIiwgZGV2aWNlLCBscGRjYik7CgoJaWYgKCFsc3RybmNtcGlBKGRldmljZSwiQ09NIiwzKSkgewoJCXBvcnQgPSBkZXZpY2VbM10gLSAnMCc7CgkKCgkJaWYgKHBvcnQtLSA9PSAwKSB7CgkJCUVSUigiQlVHICEgQ09NMCBjYW4ndCBleGlzdCEuXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJaWYgKCFWYWxpZENPTVBvcnQocG9ydCkpIHsKCQkJcmV0dXJuIC0xOwoJCX0KCQkKCQltZW1zZXQobHBkY2IsIDAsIHNpemVvZihEQ0IxNikpOyAvKiBpbml0aWFsaXplICovCgoJCWxwZGNiLT5JZCA9IHBvcnQ7CgkJCgkJaWYgKCEqKGRldmljZSs0KSkKCQkJcmV0dXJuIDA7CgoJCWlmICgqKGRldmljZSs0KSAhPSAnOicpCgkJCXJldHVybiAtMTsKCQkKCQlzdHJjcHkodGVtcCxkZXZpY2UrNSk7CgkJcHRyID0gc3RydG9rKHRlbXAsICIsICIpOyAKCgkJaWYgKENPTVtwb3J0XS5iYXVkcmF0ZSA+IDApCgkJCWxwZGNiLT5CYXVkUmF0ZSA9IENPTVtwb3J0XS5iYXVkcmF0ZTsKCQllbHNlCgkJCWxwZGNiLT5CYXVkUmF0ZSA9IGF0b2kocHRyKTsKICAgICAgICAJVFJBQ0UoImJhdWRyYXRlICglZClcbiIsIGxwZGNiLT5CYXVkUmF0ZSk7CgoJCXB0ciA9IHN0cnRvayhOVUxMLCAiLCAiKTsKCQlpZiAoaXNsb3dlcigqcHRyKSkKCQkJKnB0ciA9IHRvdXBwZXIoKnB0cik7CgogICAgICAgIAlUUkFDRSgicGFyaXR5ICglYylcbiIsICpwdHIpOwoJCWxwZGNiLT5mUGFyaXR5ID0gVFJVRTsKCQlzd2l0Y2ggKCpwdHIpIHsKCQkJY2FzZSAnTic6CgkJCQlscGRjYi0+UGFyaXR5ID0gTk9QQVJJVFk7CgkJCQlscGRjYi0+ZlBhcml0eSA9IEZBTFNFOwoJCQkJYnJlYWs7CQkJCgkJCWNhc2UgJ0UnOgoJCQkJbHBkY2ItPlBhcml0eSA9IEVWRU5QQVJJVFk7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAnTSc6CgkJCQlscGRjYi0+UGFyaXR5ID0gTUFSS1BBUklUWTsKCQkJCWJyZWFrOwkJCQoJCQljYXNlICdPJzoKCQkJCWxwZGNiLT5QYXJpdHkgPSBPRERQQVJJVFk7CgkJCQlicmVhazsJCQkKCQkJZGVmYXVsdDoKCQkJCVdBUk4oIlVua25vd24gcGFyaXR5IGAlYychXG4iLCAqcHRyKTsKCQkJCXJldHVybiAtMTsKCQl9CgoJCXB0ciA9IHN0cnRvayhOVUxMLCAiLCAiKTsgCiAgICAgICAgIAlUUkFDRSgiY2hhcnNpemUgKCVjKVxuIiwgKnB0cik7CgkJbHBkY2ItPkJ5dGVTaXplID0gKnB0ciAtICcwJzsKCgkJcHRyID0gc3RydG9rKE5VTEwsICIsICIpOwogICAgICAgIAlUUkFDRSgic3RvcGJpdHMgKCVjKVxuIiwgKnB0cik7CgkJc3dpdGNoICgqcHRyKSB7CgkJCWNhc2UgJzEnOgoJCQkJbHBkY2ItPlN0b3BCaXRzID0gT05FU1RPUEJJVDsKCQkJCWJyZWFrOwkJCQoJCQljYXNlICcyJzoKCQkJCWxwZGNiLT5TdG9wQml0cyA9IFRXT1NUT1BCSVRTOwoJCQkJYnJlYWs7CQkJCgkJCWRlZmF1bHQ6CgkJCQlXQVJOKCJVbmtub3duICMgb2Ygc3RvcGJpdHMgYCVjJyFcbiIsICpwdHIpOwoJCQkJcmV0dXJuIC0xOwoJCX0KCX0JCgoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglPcGVuQ29tbQkJKFVTRVIuMjAwKQogKi8KSU5UMTYgV0lOQVBJIE9wZW5Db21tMTYoTFBDU1RSIGRldmljZSxVSU5UMTYgY2JJblF1ZXVlLFVJTlQxNiBjYk91dFF1ZXVlKQp7CglpbnQgcG9ydCxmZDsKCiAgICAJVFJBQ0UoIiVzLCAlZCwgJWRcbiIsIGRldmljZSwgY2JJblF1ZXVlLCBjYk91dFF1ZXVlKTsKCgkJcG9ydCA9IGRldmljZVszXSAtICcwJzsKCglpZiAocG9ydC0tID09IDApCgkJRVJSKCJCVUcgISBDT00wIG9yIExQVDAgZG9uJ3QgZXhpc3QgIVxuIik7CgoJaWYgKCFsc3RybmNtcGlBKGRldmljZSwiQ09NIiwzKSkgewoJCQogICAgICAgICAgICAgICAgVFJBQ0UoIiVzID0gJXNcbiIsIGRldmljZSwgQ09NW3BvcnRdLmRldmljZW5hbWUpOwoKCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkKCQkJcmV0dXJuIElFX0JBRElEOwoKCQlpZiAoQ09NW3BvcnRdLmZkKQoJCQlyZXR1cm4gSUVfT1BFTjsKCgkJZmQgPSBvcGVuKENPTVtwb3J0XS5kZXZpY2VuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLKTsKCQlpZiAoZmQgPT0gLTEpIHsKCQkJRVJSKCJlcnJvcj0lZFxuIiwgZXJybm8pOwoJCQlyZXR1cm4gSUVfSEFSRFdBUkU7CgkJfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bltwb3J0XSA9IFNFR1BUUl9BTExPQyg0MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ6ZXJvKHVua25vd25bcG9ydF0sNDApOwoJCQlDT01bcG9ydF0uZmQgPSBmZDsKCQkJQ09NW3BvcnRdLmNvbW1lcnJvciA9IDA7CgkJCUNPTVtwb3J0XS5ldmVudG1hc2sgPSAwOwoJCQlDT01bcG9ydF0uZXZ0Y2hhciA9IDA7IC8qIEZJWE1FOiBkZWZhdWx0PyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRlcm1pbmFsIHN0YXRlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHRjZ2V0YXR0cihmZCwmbV9zdGF0W3BvcnRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRlZmF1bHQgcGFyYW1ldGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZihDT01bcG9ydF0uYmF1ZHJhdGU+LTEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRENCMTYgZGNiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29tbVN0YXRlMTYocG9ydCwgJmRjYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2IuQmF1ZFJhdGU9Q09NW3BvcnRdLmJhdWRyYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9yZSBkZWZhdWx0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRhdGFiaXRzLCBwYXJpdHksIHN0b3BiaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENvbW1TdGF0ZTE2KCAmZGNiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkvKiBpbml0IHByaW9yaXR5IGNoYXJhY3RlcnMgKi8KCQkJQ09NW3BvcnRdLnVuZ2V0ID0gLTE7CgkJCUNPTVtwb3J0XS54bWl0ID0gLTE7CgkJCS8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KCQkJQ09NW3BvcnRdLmlidWZfc2l6ZSA9IGNiSW5RdWV1ZTsKCQkJQ09NW3BvcnRdLmlidWZfaGVhZCA9IENPTVtwb3J0XS5pYnVmX3RhaWw9IDA7CgkJCUNPTVtwb3J0XS5vYnVmX3NpemUgPSBjYk91dFF1ZXVlOwoJCQlDT01bcG9ydF0ub2J1Zl9oZWFkID0gQ09NW3BvcnRdLm9idWZfdGFpbCA9IDA7CgoJCQlDT01bcG9ydF0uaW5idWYgPSBtYWxsb2MoY2JJblF1ZXVlKTsKCQkJaWYgKENPTVtwb3J0XS5pbmJ1ZikgewoJCQkgIENPTVtwb3J0XS5vdXRidWYgPSBtYWxsb2MoY2JPdXRRdWV1ZSk7CgkJCSAgaWYgKCFDT01bcG9ydF0ub3V0YnVmKQoJCQkgICAgZnJlZShDT01bcG9ydF0uaW5idWYpOwoJCQl9IGVsc2UgQ09NW3BvcnRdLm91dGJ1ZiA9IE5VTEw7CgkJCWlmICghQ09NW3BvcnRdLm91dGJ1ZikgewoJCQkgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCgkJCSAgdGNzZXRhdHRyKENPTVtwb3J0XS5mZCxUQ1NBTk9XLCZtX3N0YXRbcG9ydF0pOwoJCQkgIGNsb3NlKENPTVtwb3J0XS5mZCk7CgkJCSAgRVJSKCJvdXQgb2YgbWVtb3J5Iik7CgkJCSAgcmV0dXJuIElFX01FTU9SWTsKCQkJfQoKCQkJLyogZW5hYmxlIGFzeW5jIG5vdGlmaWNhdGlvbnMgKi8KCQkJQVNZTkNfUmVnaXN0ZXJGRChDT01bcG9ydF0uZmQsY29tbV9ub3RpZmljYXRpb24sJkNPTVtwb3J0XSk7CgkJCS8qIGJvb3RzdHJhcCBub3RpZmljYXRpb25zLCBqdXN0IGluIGNhc2UgKi8KCQkJY29tbV9ub3RpZmljYXRpb24oQ09NW3BvcnRdLmZkLCZDT01bcG9ydF0pOwoJCQlyZXR1cm4gcG9ydDsKCQl9Cgl9IAoJZWxzZSAKCWlmICghbHN0cm5jbXBpQShkZXZpY2UsIkxQVCIsMykpIHsKCQoJCWlmICghVmFsaWRMUFRQb3J0KHBvcnQpKQoJCQlyZXR1cm4gSUVfQkFESUQ7CgoJCWlmIChMUFRbcG9ydF0uZmQpCgkJCXJldHVybiBJRV9PUEVOOwoKCQlmZCA9IG9wZW4oTFBUW3BvcnRdLmRldmljZW5hbWUsIE9fUkRXUiB8IE9fTk9OQkxPQ0ssIDApOwoJCWlmIChmZCA9PSAtMSkgewoJCQlyZXR1cm4gSUVfSEFSRFdBUkU7CgkJfSBlbHNlIHsKCQkJTFBUW3BvcnRdLmZkID0gZmQ7CgkJCUxQVFtwb3J0XS5jb21tZXJyb3IgPSAwOwoJCQlMUFRbcG9ydF0uZXZlbnRtYXNrID0gMDsKCQkJcmV0dXJuIHBvcnR8RkxBR19MUFQ7CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbG9zZUNvbW0JCShVU0VSLjIwNykKICovCklOVDE2IFdJTkFQSSBDbG9zZUNvbW0xNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICAKICAgIAlUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCWlmICghKGNpZCZGTEFHX0xQVCkpIHsKCQkvKiBDT00gcG9ydCAqLwoJCVNFR1BUUl9GUkVFKHVua25vd25bY2lkXSk7IC8qIFtMV10gKi8KCgkJLyogZGlzYWJsZSBhc3luYyBub3RpZmljYXRpb25zICovCgkJQVNZTkNfVW5yZWdpc3RlckZEKENPTVtjaWRdLmZkLGNvbW1fbm90aWZpY2F0aW9uKTsKCQkvKiBmcmVlIGJ1ZmZlcnMgKi8KCQlmcmVlKHB0ci0+b3V0YnVmKTsKCQlmcmVlKHB0ci0+aW5idWYpOwoKCQkvKiByZXNldCBtb2RlbSBsaW5lcyAqLwoJCXRjc2V0YXR0cihwdHItPmZkLFRDU0FOT1csJm1fc3RhdFtjaWRdKTsKCX0KCglpZiAoY2xvc2UocHRyLT5mZCkgPT0gLTEpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJLyogRklYTUU6IHNob3VsZCB3ZSBjbGVhciBwdHItPmZkIGhlcmU/ICovCgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcHRyLT5mZCA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tQnJlYWsJCShVU0VSLjIxMCkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCglwdHItPnN1c3BlbmRlZCA9IDE7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUJyZWFrCQkoVVNFUi4yMTEpCiAqLwpJTlQxNiBXSU5BUEkgQ2xlYXJDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZFxuIiwgY2lkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJcHRyLT5zdXNwZW5kZWQgPSAwOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKFVTRVIuMjE0KQogKi8KTE9ORyBXSU5BUEkgRXNjYXBlQ29tbUZ1bmN0aW9uMTYoVUlOVDE2IGNpZCxVSU5UMTYgbkZ1bmN0aW9uKQp7CglpbnQJbWF4OwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJc3RydWN0IHRlcm1pb3MgcG9ydDsKCiAgICAJVFJBQ0UoImNpZD0lZCwgZnVuY3Rpb249JWRcbiIsIGNpZCwgbkZ1bmN0aW9uKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CglpZiAodGNnZXRhdHRyKHB0ci0+ZmQsJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3I9V2luRXJyb3IoKTsJCgkJcmV0dXJuIC0xOwoJfQoKCXN3aXRjaCAobkZ1bmN0aW9uKSB7CgkJY2FzZSBSRVNFVERFVjoKCQkJYnJlYWs7CQkJCQkKCgkJY2FzZSBHRVRNQVhDT006CgkJCWZvciAobWF4ID0gTUFYX1BPUlRTOyFDT01bbWF4XS5kZXZpY2VuYW1lO21heC0tKQoJCQkJOwoJCQlyZXR1cm4gbWF4OwoJCQlicmVhazsKCgkJY2FzZSBHRVRNQVhMUFQ6CgkJCWZvciAobWF4ID0gTUFYX1BPUlRTOyFMUFRbbWF4XS5kZXZpY2VuYW1lO21heC0tKQoJCQkJOwoJCQlyZXR1cm4gRkxBR19MUFQgKyBtYXg7CgkJCWJyZWFrOwoKI2lmZGVmIFRJT0NNX0RUUgoJCWNhc2UgQ0xSRFRSOgoJCQlyZXR1cm4gQ09NTV9XaGFja01vZGVtKHB0ci0+ZmQsIH5USU9DTV9EVFIsIDApOwojZW5kaWYKI2lmZGVmIFRJT0NNX1JUUwoJCWNhc2UgQ0xSUlRTOgoJCQlyZXR1cm4gQ09NTV9XaGFja01vZGVtKHB0ci0+ZmQsIH5USU9DTV9SVFMsIDApOwojZW5kaWYKCQojaWZkZWYgVElPQ01fRFRSCgkJY2FzZSBTRVREVFI6CgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgMCwgVElPQ01fRFRSKTsKI2VuZGlmCgojaWZkZWYgVElPQ01fUlRTCQkJCgkJY2FzZSBTRVRSVFM6CgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgMCwgVElPQ01fUlRTKTsKI2VuZGlmCgoJCWNhc2UgU0VUWE9GRjoKCQkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJCQlicmVhazsKCgkJY2FzZSBTRVRYT046CgkJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJV0FSTigiKGNpZD0lZCxuRnVuY3Rpb249JWQpOiBVbmtub3duIGZ1bmN0aW9uXG4iLCAKCQkJY2lkLCBuRnVuY3Rpb24pOwoJCQlicmVhazsJCQkJCgl9CgkKCWlmICh0Y3NldGF0dHIocHRyLT5mZCwgVENTQURSQUlOLCAmcG9ydCkgPT0gLTEpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwkKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRmx1c2hDb21tCShVU0VSLjIxNSkKICovCklOVDE2IFdJTkFQSSBGbHVzaENvbW0xNihJTlQxNiBjaWQsSU5UMTYgZm5RdWV1ZSkKewoJaW50IHF1ZXVlOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkLCBxdWV1ZT0lZFxuIiwgY2lkLCBmblF1ZXVlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9Cglzd2l0Y2ggKGZuUXVldWUpIHsKCQljYXNlIDA6CgkJICBxdWV1ZSA9IFRDT0ZMVVNIOwoJCSAgcHRyLT5vYnVmX3RhaWwgPSBwdHItPm9idWZfaGVhZDsKCQkgIGJyZWFrOwoJCWNhc2UgMToKCQkgIHF1ZXVlID0gVENJRkxVU0g7CgkJICBwdHItPmlidWZfaGVhZCA9IHB0ci0+aWJ1Zl90YWlsOwoJCSAgYnJlYWs7CgkJZGVmYXVsdDoKCQkgIFdBUk4oIihjaWQ9JWQsZm5RdWV1ZT0lZCk6VW5rbm93biBxdWV1ZVxuIiwgCgkJICAgICAgICAgICAgY2lkLCBmblF1ZXVlKTsKCQkgIHJldHVybiAtMTsKCQl9CglpZiAodGNmbHVzaChwdHItPmZkLCBxdWV1ZSkpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwkKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9ICAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXJyb3IJKFVTRVIuMjAzKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1FcnJvcjE2KElOVDE2IGNpZCxMUENPTVNUQVQxNiBscFN0YXQpCnsKCWludAkJdGVtcGVycm9yOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0b2w7CiAgICAgICAgdW5zaWduZWQgaW50IG1zdGF0OwoKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CiAgICAgICAgaWYgKGNpZCZGTEFHX0xQVCkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIENFX01PREU7CiAgICAgICAgfQogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKXVua25vd25bY2lkXSArIENPTU1fTVNSX09GRlNFVDsKICAgICAgICBpb2N0bChwdHItPmZkLFRJT0NNR0VULCZtc3RhdCk7CiAgICAgICAgaWYoIG1zdGF0JlRJT0NNX0NBUiApIAogICAgICAgICAgICAqc3RvbCB8PSAweDgwOwogICAgICAgIGVsc2UgCiAgICAgICAgICAgICpzdG9sICY9MHg3ZjsKCglpZiAobHBTdGF0KSB7CgkJbHBTdGF0LT5zdGF0dXMgPSAwOwoKCQlscFN0YXQtPmNiT3V0UXVlID0gY29tbV9vdXRidWYocHRyKTsKCQlscFN0YXQtPmNiSW5RdWUgPSBjb21tX2luYnVmKHB0cik7CgogICAgCQlUUkFDRSgiY2lkICVkLCBlcnJvciAlZCwgbHBTdGF0ICVkICVkICVkIHN0b2wgJXhcbiIsCgkJCSAgICAgY2lkLCBwdHItPmNvbW1lcnJvciwgbHBTdGF0LT5zdGF0dXMsIGxwU3RhdC0+Y2JJblF1ZSwgCgkJCSAgICAgbHBTdGF0LT5jYk91dFF1ZSwgKnN0b2wpOwoJfQoJZWxzZQoJCVRSQUNFKCJjaWQgJWQsIGVycm9yICVkLCBscFN0YXQgTlVMTCBzdG9sICV4XG4iLAoJCQkgICAgIGNpZCwgcHRyLT5jb21tZXJyb3IsICpzdG9sKTsKCgkvKiBSZXR1cm4gYW55IGVycm9ycyBhbmQgY2xlYXIgaXQgKi8KCXRlbXBlcnJvciA9IHB0ci0+Y29tbWVycm9yOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuKHRlbXBlcnJvcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tRXZlbnRNYXNrCShVU0VSLjIwOCkKICovClNFR1BUUiBXSU5BUEkgU2V0Q29tbUV2ZW50TWFzazE2KElOVDE2IGNpZCxVSU5UMTYgZnVFdnRNYXNrKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAgICAgICAgdW5zaWduZWQgY2hhciAqc3RvbDsKICAgICAgICBpbnQgcmVwaWQ7CiAgICAgICAgdW5zaWduZWQgaW50IG1zdGF0OwoKICAgIAlUUkFDRSgiY2lkICVkLG1hc2sgJWRcbiIsY2lkLGZ1RXZ0TWFzayk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKQoJICAgIHJldHVybiAoU0VHUFRSKU5VTEw7CgoJcHRyLT5ldmVudG1hc2sgPSBmdUV2dE1hc2s7CgogICAgICAgIGlmICgoY2lkJkZMQUdfTFBUKSB8fCAhVmFsaWRDT01Qb3J0KGNpZCkpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiAoU0VHUFRSKU5VTEw7CiAgICAgICAgfQogICAgICAgIC8qIGl0J3MgYSBDT00gcG9ydCA/IC0+IG1vZGlmeSBmbGFncyAqLwogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKXVua25vd25bY2lkXSArIENPTU1fTVNSX09GRlNFVDsKCXJlcGlkID0gaW9jdGwocHRyLT5mZCxUSU9DTUdFVCwmbXN0YXQpOwoJVFJBQ0UoIiBpb2N0bCAgJWQsIG1zciAleCBhdCAlcCAlcFxuIixyZXBpZCxtc3RhdCxzdG9sLHVua25vd25bY2lkXSk7CglpZiAoKG1zdGF0JlRJT0NNX0NBUikpCgkgICAgKnN0b2wgfD0gMHg4MDsKCWVsc2UKCSAgICAqc3RvbCAmPTB4N2Y7CgoJVFJBQ0UoIiBtb2RlbSBkY2QgY29uc3RydWN0ICV4XG4iLCpzdG9sKTsKCXJldHVybiBTRUdQVFJfR0VUKHVua25vd25bY2lkXSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXZlbnRNYXNrCShVU0VSLjIwOSkKICovClVJTlQxNiBXSU5BUEkgR2V0Q29tbUV2ZW50TWFzazE2KElOVDE2IGNpZCxVSU5UMTYgZm5FdnRDbGVhcikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJV09SRCBldmVudHM7CgogICAgCVRSQUNFKCJjaWQgJWQsIG1hc2sgJWRcbiIsIGNpZCwgZm5FdnRDbGVhcik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKQoJICAgIHJldHVybiAwOwoKICAgICAgICBpZiAoKGNpZCZGTEFHX0xQVCkgfHwgIVZhbGlkQ09NUG9ydChjaWQpKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgoJZXZlbnRzID0gKihXT1JEKikodW5rbm93bltjaWRdKSAmIGZuRXZ0Q2xlYXI7CgkqKFdPUkQqKSh1bmtub3duW2NpZF0pICY9IH5mbkV2dENsZWFyOwoJcmV0dXJuIGV2ZW50czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1TdGF0ZTE2CShVU0VSLjIwMSkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tU3RhdGUxNihMUERDQjE2IGxwZGNiKQp7CglzdHJ1Y3QgdGVybWlvcyBwb3J0OwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXBcbiIsIGxwZGNiLT5JZCwgbHBkY2IpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QobHBkY2ItPklkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCWlmICh0Y2dldGF0dHIocHRyLT5mZCwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gLTE7Cgl9CgoJcG9ydC5jX2NjW1ZNSU5dID0gMDsKCXBvcnQuY19jY1tWVElNRV0gPSAxOwoKI2lmZGVmIElNQVhCRUwKCXBvcnQuY19pZmxhZyAmPSB+KElTVFJJUHxCUktJTlR8SUdOQ1J8SUNSTkx8SU5MQ1J8SU1BWEJFTCk7CiNlbHNlCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSKTsKI2VuZGlmCglwb3J0LmNfaWZsYWcgfD0gKElHTkJSSyk7CgoJcG9ydC5jX29mbGFnICY9IH4oT1BPU1QpOwoKCXBvcnQuY19jZmxhZyAmPSB+KEhVUENMKTsKCXBvcnQuY19jZmxhZyB8PSBDTE9DQUwgfCBDUkVBRDsKCglwb3J0LmNfbGZsYWcgJj0gfihJQ0FOT058RUNIT3xJU0lHKTsKCXBvcnQuY19sZmxhZyB8PSBOT0ZMU0g7CgogICAgCVRSQUNFKCJiYXVkcmF0ZSAlZFxuIixscGRjYi0+QmF1ZFJhdGUpOwojaWZkZWYgQ0JBVUQKCXBvcnQuY19jZmxhZyAmPSB+Q0JBVUQ7Cglzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewoJCWNhc2UgMTEwOgoJCWNhc2UgQ0JSXzExMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzMDA6CgkJY2FzZSBDQlJfMzAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjMwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDYwMDoKCQljYXNlIENCUl82MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTIwMDoKCQljYXNlIENCUl8xMjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjEyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAyNDAwOgoJCWNhc2UgQ0JSXzI0MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMjQwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDQ4MDA6CgkJY2FzZSBDQlJfNDgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0ODAwOwoJCQlicmVhazsJCQoJCWNhc2UgOTYwMDoKCQljYXNlIENCUl85NjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjk2MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAxOTIwMDoKCQljYXNlIENCUl8xOTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxOTIwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDM4NDAwOgoJCWNhc2UgQ0JSXzM4NDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjM4NDAwOwoJCQlicmVhazsJCQojaWZkZWYgQjU3NjAwCgkJY2FzZSA1NzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI1NzYwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSA1NzYwMToKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTUyMDA7CgkJCWJyZWFrOwkJCiNlbmRpZgoJCWRlZmF1bHQ6CgkJCXB0ci0+Y29tbWVycm9yID0gSUVfQkFVRFJBVEU7CgkJCXJldHVybiAtMTsKCX0KI2VsaWYgIWRlZmluZWQoX19FTVhfXykKICAgICAgICBzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewogICAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xMTA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTEwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxMjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzI0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMjQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ4MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl80ODAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjQ4MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfOTYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI5NjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTkyMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xOTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxOTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM4NDAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzg0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMzg0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5jb21tZXJyb3IgPSBJRV9CQVVEUkFURTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBwb3J0LmNfaXNwZWVkID0gcG9ydC5jX29zcGVlZDsKI2VuZGlmCiAgICAJVFJBQ0UoImJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7Cglwb3J0LmNfY2ZsYWcgJj0gfkNTSVpFOwoJc3dpdGNoIChscGRjYi0+Qnl0ZVNpemUpIHsKCQljYXNlIDU6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzU7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M3OwoJCQlicmVhazsKCQljYXNlIDg6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzg7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CgkJCXJldHVybiAtMTsKCX0KCiAgICAJVFJBQ0UoImZQYXJpdHkgJWQgUGFyaXR5ICVkXG4iLGxwZGNiLT5mUGFyaXR5LCBscGRjYi0+UGFyaXR5KTsKCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCk7CglpZiAobHBkY2ItPmZQYXJpdHkpCiAgICAgICAgICAgIHBvcnQuY19pZmxhZyB8PSBJTlBDSzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHBvcnQuY19pZmxhZyAmPSB+SU5QQ0s7CiAgICAgICAgc3dpdGNoIChscGRjYi0+UGFyaXR5KSB7CiAgICAgICAgICAgICAgICBjYXNlIE5PUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgT0REUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gKFBBUkVOQiB8IFBBUk9ERCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBFVkVOUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gUEFSRU5COwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgkKCiAgICAJVFJBQ0UoInN0b3BiaXRzICVkXG4iLGxwZGNiLT5TdG9wQml0cyk7CgoJc3dpdGNoIChscGRjYi0+U3RvcEJpdHMpIHsKCQljYXNlIE9ORVNUT1BCSVQ6CgkJCQlwb3J0LmNfY2ZsYWcgJj0gfkNTVE9QQjsKCQkJCWJyZWFrOwoJCWNhc2UgVFdPU1RPUEJJVFM6CgkJCQlwb3J0LmNfY2ZsYWcgfD0gQ1NUT1BCOwoJCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJcHRyLT5jb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKCQkJcmV0dXJuIC0xOwoJfQojaWZkZWYgQ1JUU0NUUwoKCWlmIChscGRjYi0+ZkR0cmZsb3cgfHwgbHBkY2ItPmZSdHNmbG93IHx8IGxwZGNiLT5mT3V0eEN0c0Zsb3cpCgkJcG9ydC5jX2NmbGFnIHw9IENSVFNDVFM7CgoJaWYgKGxwZGNiLT5mRHRyRGlzYWJsZSkgCgkJcG9ydC5jX2NmbGFnICY9IH5DUlRTQ1RTOwojZW5kaWYJCglpZiAobHBkY2ItPmZJblgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT047CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9OOwoJaWYgKGxwZGNiLT5mT3V0WCkKCQlwb3J0LmNfaWZsYWcgfD0gSVhPRkY7CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9GRjsKCglwdHItPmV2dGNoYXIgPSBscGRjYi0+RXZ0Q2hhcjsKCglpZiAodGNzZXRhdHRyKHB0ci0+ZmQsIFRDU0FEUkFJTiwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gRkFMU0U7Cgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1TdGF0ZQkoVVNFUi4yMDIpCiAqLwpJTlQxNiBXSU5BUEkgR2V0Q29tbVN0YXRlMTYoSU5UMTYgY2lkLCBMUERDQjE2IGxwZGNiKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglzdHJ1Y3QgdGVybWlvcyBwb3J0OwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXBcbiIsIGNpZCwgbHBkY2IpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCWlmICh0Y2dldGF0dHIocHRyLT5mZCwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gLTE7Cgl9CglscGRjYi0+SWQgPSBjaWQ7CiNpZm5kZWYgX19FTVhfXwojaWZkZWYgQ0JBVUQKICAgICAgICBzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENCQVVEKSB7CiNlbHNlCiAgICAgICAgc3dpdGNoIChwb3J0LmNfb3NwZWVkKSB7CiNlbmRpZgoJCWNhc2UgQjExMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTEwOwoJCQlicmVhazsKCQljYXNlIEIzMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDMwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjEyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjI0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjQ4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjk2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE5MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMzg0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgQjU3NjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgQjExNTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNTc2MDE7CgkJCWJyZWFrOwojZW5kaWYKCX0KI2VuZGlmCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENTSVpFKSB7CgkJY2FzZSBDUzU6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDU7CgkJCWJyZWFrOwoJCWNhc2UgQ1M2OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA2OwoJCQlicmVhazsKCQljYXNlIENTNzoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNzsKCQkJYnJlYWs7CgkJY2FzZSBDUzg6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDg7CgkJCWJyZWFrOwoJfQkKCQogICAgICAgIGlmKHBvcnQuY19pZmxhZyAmIElOUENLKQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IFRSVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IEZBTFNFOwoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REKSkgewoJCWNhc2UgMDoKCQkJbHBkY2ItPlBhcml0eSA9IE5PUEFSSVRZOwoJCQlicmVhazsKCQljYXNlIFBBUkVOQjoKCQkJbHBkY2ItPlBhcml0eSA9IEVWRU5QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgKFBBUkVOQiB8IFBBUk9ERCk6CgkJCWxwZGNiLT5QYXJpdHkgPSBPRERQQVJJVFk7CQkKCQkJYnJlYWs7Cgl9CgoJaWYgKHBvcnQuY19jZmxhZyAmIENTVE9QQikKCQlscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCWVsc2UKCQlscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwoKCWxwZGNiLT5SbHNUaW1lb3V0ID0gNTA7CglscGRjYi0+Q3RzVGltZW91dCA9IDUwOyAKCWxwZGNiLT5Ec3JUaW1lb3V0ID0gNTA7CglscGRjYi0+Zk51bGwgPSAwOwoJbHBkY2ItPmZDaEV2dCA9IDA7CglscGRjYi0+ZkJpbmFyeSA9IDE7CglscGRjYi0+ZkR0ckRpc2FibGUgPSAwOwoKI2lmZGVmIENSVFNDVFMKCglpZiAocG9ydC5jX2NmbGFnICYgQ1JUU0NUUykgewoJCWxwZGNiLT5mRHRyZmxvdyA9IDE7CgkJbHBkY2ItPmZSdHNmbG93ID0gMTsKCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gMTsKCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gMTsKCX0gZWxzZSAKI2VuZGlmCgkJbHBkY2ItPmZEdHJEaXNhYmxlID0gMTsKCglpZiAocG9ydC5jX2lmbGFnICYgSVhPTikKCQlscGRjYi0+ZkluWCA9IDE7CgllbHNlCgkJbHBkY2ItPmZJblggPSAwOwoKCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9GRikKCQlscGRjYi0+Zk91dFggPSAxOwoJZWxzZQoJCWxwZGNiLT5mT3V0WCA9IDA7Ci8qCglscGRjYi0+WG9uQ2hhciA9IAoJbHBkY2ItPlhvZmZDaGFyID0gCiAqLwoJbHBkY2ItPlhvbkxpbSA9IDEwOwoJbHBkY2ItPlhvZmZMaW0gPSAxMDsKCglscGRjYi0+RXZ0Q2hhciA9IHB0ci0+ZXZ0Y2hhcjsKCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKFVTRVIuMjA2KQogKi8KSU5UMTYgV0lOQVBJIFRyYW5zbWl0Q29tbUNoYXIxNihJTlQxNiBjaWQsQ0hBUiBjaFRyYW5zbWl0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQsIGRhdGEgJWQgXG4iLCBjaWQsIGNoVHJhbnNtaXQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJaWYgKHB0ci0+eG1pdCA+PSAwKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfVFhGVUxMOwoJICByZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+b2J1Zl9oZWFkID09IHB0ci0+b2J1Zl90YWlsKSB7CgkgIC8qIHRyYW5zbWl0IHF1ZXVlIGVtcHR5LCB0cnkgdG8gdHJhbnNtaXQgZGlyZWN0bHkgKi8KCSAgaWYgKHdyaXRlKHB0ci0+ZmQsICZjaFRyYW5zbWl0LCAxKSA9PSAtMSkgewoJICAgIC8qIGRpZG4ndCB3b3JrLCBxdWV1ZSBpdCAqLwoJICAgIHB0ci0+eG1pdCA9IGNoVHJhbnNtaXQ7CgkgIH0KCX0gZWxzZSB7CgkgIC8qIGRhdGEgaW4gcXVldWUsIGxldCB0aGlzIGNoYXIgYmUgdHJhbnNtaXR0ZWQgbmV4dCAqLwoJICBwdHItPnhtaXQgPSBjaFRyYW5zbWl0OwoJfQoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVW5nZXRDb21tQ2hhcgkoVVNFUi4yMTIpCiAqLwpJTlQxNiBXSU5BUEkgVW5nZXRDb21tQ2hhcjE2KElOVDE2IGNpZCxDSEFSIGNoVW5nZXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCAoY2hhciAlZClcbiIsIGNpZCwgY2hVbmdldCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQkKCglpZiAocHRyLT51bmdldD49MCkgewoJICAvKiBjaGFyYWN0ZXIgYWxyZWFkeSBxdWV1ZWQgKi8KCSAgLyogRklYTUU6IHdoaWNoIGVycm9yIHdvdWxkIFdpbmRvd3MgcmV0dXJuPyAqLwoJICBwdHItPmNvbW1lcnJvciA9IENFX1JYT1ZFUjsKCSAgcmV0dXJuIC0xOwoJfQoKCXB0ci0+dW5nZXQgPSBjaFVuZ2V0OwoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJUmVhZENvbW0JKFVTRVIuMjA0KQogKi8KSU5UMTYgV0lOQVBJIFJlYWRDb21tMTYoSU5UMTYgY2lkLExQU1RSIGxwdkJ1ZixJTlQxNiBjYlJlYWQpCnsKCWludCBzdGF0dXMsIGxlbmd0aDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCUxQU1RSIG9yZ0J1ZiA9IGxwdkJ1ZjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwLCBsZW5ndGggJWRcbiIsIGNpZCwgbHB2QnVmLCBjYlJlYWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJLyogcmVhZCB1bmdldCBjaGFyYWN0ZXIgKi8KCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkJKmxwdkJ1ZisrID0gcHRyLT51bmdldDsKCQlwdHItPnVuZ2V0ID0gLTE7CgoJCWxlbmd0aCA9IDE7Cgl9IGVsc2UKCSAJbGVuZ3RoID0gMDsKCgkvKiByZWFkIGZyb20gcmVjZWl2ZSBidWZmZXIgKi8KCXdoaWxlIChsZW5ndGggPCBjYlJlYWQpIHsKCSAgc3RhdHVzID0gKChwdHItPmlidWZfaGVhZCA8IHB0ci0+aWJ1Zl90YWlsKSA/CgkJICAgIHB0ci0+aWJ1Zl9zaXplIDogcHRyLT5pYnVmX2hlYWQpIC0gcHRyLT5pYnVmX3RhaWw7CgkgIGlmICghc3RhdHVzKSBicmVhazsKCSAgaWYgKChjYlJlYWQgLSBsZW5ndGgpIDwgc3RhdHVzKQoJICAgIHN0YXR1cyA9IGNiUmVhZCAtIGxlbmd0aDsKCgkgIG1lbWNweShscHZCdWYsIHB0ci0+aW5idWYgKyBwdHItPmlidWZfdGFpbCwgc3RhdHVzKTsKCSAgcHRyLT5pYnVmX3RhaWwgKz0gc3RhdHVzOwoJICBpZiAocHRyLT5pYnVmX3RhaWwgPj0gcHRyLT5pYnVmX3NpemUpCgkgICAgcHRyLT5pYnVmX3RhaWwgPSAwOwoJICBscHZCdWYgKz0gc3RhdHVzOwoJICBsZW5ndGggKz0gc3RhdHVzOwoJfQoKCVRSQUNFKCIlLipzXG4iLCBsZW5ndGgsIG9yZ0J1Zik7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJV3JpdGVDb21tCShVU0VSLjIwNSkKICovCklOVDE2IFdJTkFQSSBXcml0ZUNvbW0xNihJTlQxNiBjaWQsIExQU1RSIGxwdkJ1ZiwgSU5UMTYgY2JXcml0ZSkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgCgkJY2lkLCBscHZCdWYsIGNiV3JpdGUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgkKCVRSQUNFKCIlLipzXG4iLCBjYldyaXRlLCBscHZCdWYgKTsKCglsZW5ndGggPSAwOwoJd2hpbGUgKGxlbmd0aCA8IGNiV3JpdGUpIHsKCSAgaWYgKChwdHItPm9idWZfaGVhZCA9PSBwdHItPm9idWZfdGFpbCkgJiYgKHB0ci0+eG1pdCA8IDApKSB7CgkgICAgLyogbm8gZGF0YSBxdWV1ZWQsIHRyeSB0byB3cml0ZSBkaXJlY3RseSAqLwoJICAgIHN0YXR1cyA9IHdyaXRlKHB0ci0+ZmQsIGxwdkJ1ZiwgY2JXcml0ZSAtIGxlbmd0aCk7CgkgICAgaWYgKHN0YXR1cyA+IDApIHsKCSAgICAgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgICAgICBsZW5ndGggKz0gc3RhdHVzOwoJICAgICAgY29udGludWU7CgkgICAgfQoJICB9CgkgIC8qIGNhbid0IHdyaXRlIGRpcmVjdGx5LCBwdXQgaW50byB0cmFuc21pdCBidWZmZXIgKi8KCSAgc3RhdHVzID0gKChwdHItPm9idWZfdGFpbCA+IHB0ci0+b2J1Zl9oZWFkKSA/CgkJICAgIChwdHItPm9idWZfdGFpbC0xKSA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl9oZWFkOwoJICBpZiAoIXN0YXR1cykgYnJlYWs7CgkgIGlmICgoY2JXcml0ZSAtIGxlbmd0aCkgPCBzdGF0dXMpCgkgICAgc3RhdHVzID0gY2JXcml0ZSAtIGxlbmd0aDsKCSAgbWVtY3B5KGxwdkJ1ZiwgcHRyLT5vdXRidWYgKyBwdHItPm9idWZfaGVhZCwgc3RhdHVzKTsKCSAgcHRyLT5vYnVmX2hlYWQgKz0gc3RhdHVzOwoJICBpZiAocHRyLT5vYnVmX2hlYWQgPj0gcHRyLT5vYnVmX3NpemUpCgkgICAgcHRyLT5vYnVmX2hlYWQgPSAwOwoJICBscHZCdWYgKz0gc3RhdHVzOwoJICBsZW5ndGggKz0gc3RhdHVzOwoJfQoKCXB0ci0+Y29tbWVycm9yID0gMDsJCglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24gICAoVVNFUi4yNDYpCiAqLwpCT09MMTYgV0lOQVBJIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24xNiggSU5UMTYgY2lkLCBIV05EMTYgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjYldyaXRlTm90aWZ5LCBJTlQxNiBjYk91dFF1ZXVlICkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKCIoJWQsICV4LCAlZCwgJWQpXG4iLCBjaWQsIGh3bmQsIGNiV3JpdGVOb3RpZnksIGNiT3V0UXVldWUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfQkFESUQ7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT53bmQgPSBod25kOwoJcHRyLT5uX3JlYWQgPSBjYldyaXRlTm90aWZ5OwoJcHRyLT5uX3dyaXRlID0gY2JPdXRRdWV1ZTsKCXJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCQQkJKEtFUk5FTDMyLjE0KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQShMUENTVFIgZGV2aWNlLExQRENCIGxwZGNiKQp7CglyZXR1cm4gQnVpbGRDb21tRENCQW5kVGltZW91dHNBKGRldmljZSxscGRjYixOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCQW5kVGltZW91dHNBCShLRVJORUwzMi4xNSkKICovCkJPT0wgV0lOQVBJIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzQShMUENTVFIgZGV2aWNlLCBMUERDQiBscGRjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKQp7CglpbnQJcG9ydDsKCWNoYXIJKnB0ciwqdGVtcDsKCglUUkFDRSgiKCVzLCVwLCVwKVxuIixkZXZpY2UsbHBkY2IsbHB0aW1lb3V0cyk7CgoJaWYgKCFsc3RybmNtcGlBKGRldmljZSwiQ09NIiwzKSkgewoJCXBvcnQ9ZGV2aWNlWzNdLScwJzsKCQlpZiAocG9ydC0tPT0wKSB7CgkJCUVSUigiQlVHISBDT00wIGNhbid0IGV4aXN0cyEuXG4iKTsKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkKCQkJcmV0dXJuIEZBTFNFOwoJCWlmICgqKGRldmljZSs0KSE9JzonKQoJCQlyZXR1cm4gRkFMU0U7CgkJdGVtcD0oTFBTVFIpKGRldmljZSs1KTsKCX0gZWxzZQoJCXRlbXA9KExQU1RSKWRldmljZTsKCgltZW1zZXQobHBkY2IsIDAsIHNpemVvZihEQ0IpKTsgLyogaW5pdGlhbGl6ZSAqLwoKCWxwZGNiLT5EQ0JsZW5ndGgJPSBzaXplb2YoRENCKTsKCWlmIChzdHJjaHIodGVtcCwnLCcpKSB7CS8qIG9sZCBzdHlsZSAqLwoJCURDQjE2CWRjYjE2OwoJCUJPT0wxNglyZXQ7CgkJY2hhcglsYXN0PXRlbXBbc3RybGVuKHRlbXApLTFdOwoKCQlyZXQ9QnVpbGRDb21tRENCMTYoZGV2aWNlLCZkY2IxNik7CgkJaWYgKCFyZXQpCgkJCXJldHVybiBGQUxTRTsKCQlscGRjYi0+QmF1ZFJhdGUJCT0gZGNiMTYuQmF1ZFJhdGU7CgkJbHBkY2ItPkJ5dGVTaXplCQk9IGRjYjE2LkJ5dGVTaXplOwoJCWxwZGNiLT5mQmluYXJ5CQk9IGRjYjE2LmZCaW5hcnk7CgkJbHBkY2ItPlBhcml0eQkJPSBkY2IxNi5QYXJpdHk7CgkJbHBkY2ItPmZQYXJpdHkJCT0gZGNiMTYuZlBhcml0eTsKCQlscGRjYi0+Zk51bGwJCT0gZGNiMTYuZk51bGw7CgkJbHBkY2ItPlN0b3BCaXRzCQk9IGRjYjE2LlN0b3BCaXRzOwoJCWlmIChsYXN0ID09ICd4JykgewoJCQlscGRjYi0+ZkluWAkJPSBUUlVFOwoJCQlscGRjYi0+Zk91dFgJCT0gVFJVRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mRHRyQ29udHJvbAk9IERUUl9DT05UUk9MX0VOQUJMRTsKCQkJbHBkY2ItPmZSdHNDb250cm9sCT0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCX0gZWxzZSBpZiAobGFzdD09J3AnKSB7CgkJCWxwZGNiLT5mSW5YCQk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dFgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0eEN0c0Zsb3cJPSBUUlVFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gVFJVRTsKCQkJbHBkY2ItPmZEdHJDb250cm9sCT0gRFRSX0NPTlRST0xfSEFORFNIQUtFOwoJCQlscGRjYi0+ZlJ0c0NvbnRyb2wJPSBSVFNfQ09OVFJPTF9IQU5EU0hBS0U7CgkJfSBlbHNlIHsKCQkJbHBkY2ItPmZJblgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0WAkJPSBGQUxTRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mRHRyQ29udHJvbAk9IERUUl9DT05UUk9MX0VOQUJMRTsKCQkJbHBkY2ItPmZSdHNDb250cm9sCT0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCX0KCQlscGRjYi0+WG9uQ2hhcgk9IGRjYjE2LlhvbkNoYXI7CgkJbHBkY2ItPlhvZmZDaGFyCT0gZGNiMTYuWG9mZkNoYXI7CgkJbHBkY2ItPkVycm9yQ2hhcj0gZGNiMTYuUGVDaGFyOwoJCWxwZGNiLT5mRXJyb3JDaGFyPSBkY2IxNi5mUGVDaGFyOwoJCWxwZGNiLT5Fb2ZDaGFyCT0gZGNiMTYuRW9mQ2hhcjsKCQlscGRjYi0+RXZ0Q2hhcgk9IGRjYjE2LkV2dENoYXI7CgkJbHBkY2ItPlhvbkxpbQk9IGRjYjE2LlhvbkxpbTsKCQlscGRjYi0+WG9mZkxpbQk9IGRjYjE2LlhvZmZMaW07CgkJcmV0dXJuIFRSVUU7Cgl9CglwdHI9c3RydG9rKHRlbXAsIiAiKTsgCgl3aGlsZSAocHRyKSB7CgkJRFdPUkQJZmxhZyx4OwoKCQlmbGFnPTA7CgkJaWYgKCFzdHJuY21wKCJiYXVkPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJzdG9wPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5TdG9wQml0cyA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJkYXRhPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJwYXJpdHk9IixwdHIsNykpIHsKCQkJbHBkY2ItPmZQYXJpdHkJPSBUUlVFOwoJCQlzd2l0Y2ggKHB0cls4XSkgewoJCQljYXNlICdOJzpjYXNlICduJzoKCQkJCWxwZGNiLT5mUGFyaXR5CT0gRkFMU0U7CgkJCQlscGRjYi0+UGFyaXR5CT0gTk9QQVJJVFk7CgkJCQlicmVhazsKCQkJY2FzZSAnRSc6Y2FzZSAnZSc6CgkJCQlscGRjYi0+UGFyaXR5CT0gRVZFTlBBUklUWTsKCQkJCWJyZWFrOwoJCQljYXNlICdPJzpjYXNlICdvJzoKCQkJCWxwZGNiLT5QYXJpdHkJPSBPRERQQVJJVFk7CgkJCQlicmVhazsKCQkJY2FzZSAnTSc6Y2FzZSAnbSc6CgkJCQlscGRjYi0+UGFyaXR5CT0gTUFSS1BBUklUWTsKCQkJCWJyZWFrOwoJCQl9CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFmbGFnKQoJCQlFUlIoIlVuaGFuZGxlZCBzcGVjaWZpZXIgJyVzJywgcGxlYXNlIHJlcG9ydC5cbiIscHRyKTsKCQlwdHI9c3RydG9rKE5VTEwsIiAiKTsKCX0KCWlmIChscGRjYi0+QmF1ZFJhdGU9PTExMCkKCQlscGRjYi0+U3RvcEJpdHMgPSAyOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVwkJKEtFUk5FTDMyLjE2KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQW5kVGltZW91dHNXKCBMUENXU1RSIGRldmlkLCBMUERDQiBscGRjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cyApCnsKCUxQU1RSCWRldmlkQTsKCUJPT0wJcmV0OwoKCVRSQUNFKCIoJXAsJXAsJXApXG4iLGRldmlkLGxwZGNiLGxwdGltZW91dHMpOwoJZGV2aWRBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXZpZCApOwoJcmV0PUJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzQShkZXZpZEEsbHBkY2IsbHB0aW1lb3V0cyk7CiAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRldmlkQSApOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCVwkJKEtFUk5FTDMyLjE3KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCVyhMUENXU1RSIGRldmlkLExQRENCIGxwZGNiKQp7CglyZXR1cm4gQnVpbGRDb21tRENCQW5kVGltZW91dHNXKGRldmlkLGxwZGNiLE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBDT01NX0dldFJlYWRGZAogKiAgUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgcmVhZGluZy4KICogIE1ha2Ugc3VyZSB0byBjbG9zZSB0aGUgaGFuZGxlIGFmdGVyd2FyZHMhCiAqLwpzdGF0aWMgaW50IENPTU1fR2V0UmVhZEZkKCBIQU5ETEUgaGFuZGxlKQp7CiAgICBpbnQgZmQ7CiAgICBzdHJ1Y3QgZ2V0X3JlYWRfZmRfcmVxdWVzdCAqcmVxID0gZ2V0X3JlcV9idWZmZXIoKTsKICAgIHJlcS0+aGFuZGxlID0gaGFuZGxlOwogICAgc2VydmVyX2NhbGxfZmQoIFJFUV9HRVRfUkVBRF9GRCwgLTEsICZmZCApOwogICAgcmV0dXJuIGZkOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBDT01NX0dldFdyaXRlRmQKICogIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHdyaXRpbmcuCiAqICBNYWtlIHN1cmUgdG8gY2xvc2UgdGhlIGhhbmRsZSBhZnRlcndhcmRzIQogKi8Kc3RhdGljIGludCBDT01NX0dldFdyaXRlRmQoIEhBTkRMRSBoYW5kbGUpCnsKICAgIGludCBmZDsKICAgIHN0cnVjdCBnZXRfd3JpdGVfZmRfcmVxdWVzdCAqcmVxID0gZ2V0X3JlcV9idWZmZXIoKTsKICAgIHJlcS0+aGFuZGxlID0gaGFuZGxlOwogICAgc2VydmVyX2NhbGxfZmQoIFJFUV9HRVRfV1JJVEVfRkQsIC0xLCAmZmQgKTsKICAgIHJldHVybiBmZDsKfQoKLyogRklYTUU6IGhhdmluZyB0aGVzZSBnbG9iYWwgZm9yIHdpbjMyIGZvciBub3cgKi8KaW50IGNvbW1lcnJvcj0wLGV2ZW50bWFzaz0wOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1CcmVhawkJKEtFUk5FTDMyLjQ0OSkKICovCkJPT0wgV0lOQVBJIFNldENvbW1CcmVhayhIQU5ETEUgaGFuZGxlKQp7CglGSVhNRSgiaGFuZGxlICVkLCBzdHViIVxuIiwgaGFuZGxlKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tQnJlYWsJCShLRVJORUwzMi4yMCkKICovCkJPT0wgV0lOQVBJIENsZWFyQ29tbUJyZWFrKEhBTkRMRSBoYW5kbGUpCnsKCUZJWE1FKCJoYW5kbGUgJWQsIHN0dWIhXG4iLCBoYW5kbGUpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKEtFUk5FTDMyLjIxNCkKICovCkJPT0wgV0lOQVBJIEVzY2FwZUNvbW1GdW5jdGlvbihIQU5ETEUgaGFuZGxlLFVJTlQgbkZ1bmN0aW9uKQp7CglpbnQgZmQ7CglzdHJ1Y3QgdGVybWlvcwlwb3J0OwoKICAgIAlUUkFDRSgiaGFuZGxlICVkLCBmdW5jdGlvbj0lZFxuIiwgaGFuZGxlLCBuRnVuY3Rpb24pOwoJZmQgPSBDT01NX0dldFdyaXRlRmQoaGFuZGxlKTsKCWlmKGZkPDApCgkJcmV0dXJuIEZBTFNFOwoKCWlmICh0Y2dldGF0dHIoZmQsJnBvcnQpID09IC0xKSB7CgkJY29tbWVycm9yPVdpbkVycm9yKCk7CgkJY2xvc2UoZmQpOwoJCXJldHVybiBGQUxTRTsKCX0KCglzd2l0Y2ggKG5GdW5jdGlvbikgewoJCWNhc2UgUkVTRVRERVY6CgkJCWJyZWFrOwkJCQkJCgojaWZkZWYgVElPQ01fRFRSCgkJY2FzZSBDTFJEVFI6CgkJCXBvcnQuY19jZmxhZyAmPSBUSU9DTV9EVFI7CgkJCWJyZWFrOwojZW5kaWYKCiNpZmRlZiBUSU9DTV9SVFMKCQljYXNlIENMUlJUUzoKCQkJcG9ydC5jX2NmbGFnICY9IFRJT0NNX1JUUzsKCQkJYnJlYWs7CiNlbmRpZgoJCiNpZmRlZiBDUlRTQ1RTCgkJY2FzZSBTRVREVFI6CgkJCXBvcnQuY19jZmxhZyB8PSBDUlRTQ1RTOwoJCQlicmVhazsKCgkJY2FzZSBTRVRSVFM6CgkJCXBvcnQuY19jZmxhZyB8PSBDUlRTQ1RTOwoJCQlicmVhazsKI2VuZGlmCgoJCWNhc2UgU0VUWE9GRjoKCQkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJCQlicmVhazsKCgkJY2FzZSBTRVRYT046CgkJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJCQlicmVhazsKCQljYXNlIFNFVEJSRUFLOgoJCQlGSVhNRSgic2V0YnJlYWssIHN0dWJcbiIpOwovKgkJCXB0ci0+c3VzcGVuZGVkID0gMTsgKi8KCQkJYnJlYWs7CgkJY2FzZSBDTFJCUkVBSzoKCQkJRklYTUUoImNscmJyZWFrLCBzdHViXG4iKTsKLyoJCQlwdHItPnN1c3BlbmRlZCA9IDA7ICovCgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCVdBUk4oIihoYW5kbGU9JWQsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwgCgkJCWhhbmRsZSwgbkZ1bmN0aW9uKTsKCQkJYnJlYWs7CQkJCQoJfQoJCglpZiAodGNzZXRhdHRyKGZkLCBUQ1NBRFJBSU4sICZwb3J0KSA9PSAtMSkgewoJCWNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJY2xvc2UoZmQpOwoJCXJldHVybiBGQUxTRTsJCgl9IGVsc2UgewoJCWNvbW1lcnJvciA9IDA7CgkJY2xvc2UoZmQpOwoJCXJldHVybiBUUlVFOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBQdXJnZUNvbW0gICAgICAgIChLRVJORUwzMi41NTcpCiAqLwpCT09MIFdJTkFQSSBQdXJnZUNvbW0oIEhBTkRMRSBoYW5kbGUsIERXT1JEIGZsYWdzKSAKewogICAgIGludCBmZDsKCiAgICAgVFJBQ0UoImhhbmRsZSAlZCwgZmxhZ3MgJWx4XG4iLCBoYW5kbGUsIGZsYWdzKTsKCiAgICAgZmQgPSBDT01NX0dldFdyaXRlRmQoaGFuZGxlKTsKICAgICBpZihmZDwwKQogICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgIC8qCiAgICAgKiogbm90IGV4YWN0bHkgc3VyZSBob3cgdGhlc2UgYXJlIGRpZmZlcmVudAogICAgICoqIFBlcmhhcHMgaWYgd2UgaGFkIG91ciBvd24gaW50ZXJuYWwgcXVldWVzLCBvbmUgZmx1c2hlcyB0aGVtCiAgICAgKiogYW5kIHRoZSBvdGhlciBmbHVzaGVzIHRoZSBrZXJuZWwncyBidWZmZXJzLgogICAgICovCiAgICAgaWYoZmxhZ3MmUFVSR0VfVFhBQk9SVCkKICAgICB7CiAgICAgICAgIHRjZmx1c2goZmQsVENPRkxVU0gpOwogICAgIH0KICAgICBpZihmbGFncyZQVVJHRV9SWEFCT1JUKQogICAgIHsKICAgICAgICAgdGNmbHVzaChmZCxUQ0lGTFVTSCk7CiAgICAgfQogICAgIGlmKGZsYWdzJlBVUkdFX1RYQ0xFQVIpCiAgICAgewogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICB9CiAgICAgaWYoZmxhZ3MmUFVSR0VfUlhDTEVBUikKICAgICB7CiAgICAgICAgIHRjZmx1c2goZmQsVENJRkxVU0gpOwogICAgIH0KICAgICBjbG9zZShmZCk7CgogICAgIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tRXJyb3IJKEtFUk5FTDMyLjIxKQogKi8KQk9PTCBXSU5BUEkgQ2xlYXJDb21tRXJyb3IoSU5UIGhhbmRsZSxMUERXT1JEIGVycm9ycyxMUENPTVNUQVQgbHBTdGF0KQp7CiAgICBpbnQgZmQ7CgogICAgZmQ9Q09NTV9HZXRSZWFkRmQoaGFuZGxlKTsKICAgIGlmKDA+ZmQpIAogICAgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAobHBTdGF0KSAKICAgIHsKCWxwU3RhdC0+c3RhdHVzID0gMDsKCglpZihpb2N0bChmZCwgVElPQ09VVFEsICZscFN0YXQtPmNiT3V0UXVlKSkKCSAgICBXQVJOKCJpb2N0bCByZXR1cm5lZCBlcnJvclxuIik7CgoJaWYoaW9jdGwoZmQsIFRJT0NJTlEsICZscFN0YXQtPmNiSW5RdWUpKQoJICAgIFdBUk4oImlvY3RsIHJldHVybmVkIGVycm9yXG4iKTsKICAgIH0KCiAgICBjbG9zZShmZCk7CgogICAgVFJBQ0UoImhhbmRsZSAlZCBjYkluUXVlID0gJWxkIGNiT3V0UXVlID0gJWxkXG4iLAogICAgICAgICAgICAgICAgaGFuZGxlLAogICAgICAgICAgICAgICAgbHBTdGF0LT5jYkluUXVlLAogICAgICAgICAgICAgICAgbHBTdGF0LT5jYk91dFF1ZSk7CgogICAgaWYoZXJyb3JzKQogICAgICAgICplcnJvcnMgPSAwOwoKICAgIC8qCiAgICAqKiBBZnRlciBhbiBhc3luY2hyb25vdXMgd3JpdGUgb3BwZXJhdGlvbiwgdGhlCiAgICAqKiBhcHAgd2lsbCBjYWxsIENsZWFyQ29tbUVycm9yIHRvIHNlZSBpZiB0aGUKICAgICoqIHJlc3VsdHMgYXJlIHJlYWR5IHlldC4gSXQgd2FpdHMgZm9yIEVSUk9SX0lPX1BFTkRJTkcKICAgICovCiAgICBjb21tZXJyb3IgPSBFUlJPUl9JT19QRU5ESU5HOwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTZXR1cENvbW0gICAgICAgKEtFUk5FTDMyLjY3NikKICovCkJPT0wgV0lOQVBJIFNldHVwQ29tbSggSEFORExFIGhhbmRsZSwgRFdPUkQgaW5zaXplLCBEV09SRCBvdXRzaXplKQp7CiAgICBpbnQgZmQ7CgogICAgRklYTUUoImluc2l6ZSAlbGQgb3V0c2l6ZSAlbGQgdW5pbXBsZW1lbnRlZCBzdHViXG4iLCBpbnNpemUsIG91dHNpemUpOwogICAgZmQ9Q09NTV9HZXRXcml0ZUZkKGhhbmRsZSk7CiAgICBpZigwPmZkKQogICAgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgIHJldHVybiBUUlVFOwp9IAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1NYXNrCShLRVJORUwzMi4xNTYpCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tTWFzayhIQU5ETEUgaGFuZGxlLExQRFdPUkQgZXZ0bWFzaykKewogICAgaW50IGZkOwoKICAgIFRSQUNFKCJoYW5kbGUgJWQsIG1hc2sgJXBcbiIsIGhhbmRsZSwgZXZ0bWFzayk7CiAgICBpZigwPihmZD1DT01NX0dldFJlYWRGZChoYW5kbGUpKSkgCiAgICB7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgY2xvc2UoZmQpOwogICAgKmV2dG1hc2sgPSBldmVudG1hc2s7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1NYXNrCShLRVJORUwzMi40NTEpCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tTWFzayhJTlQgaGFuZGxlLERXT1JEIGV2dG1hc2spCnsKICAgIGludCBmZDsKCiAgICBUUkFDRSgiaGFuZGxlICVkLCBtYXNrICVseFxuIiwgaGFuZGxlLCBldnRtYXNrKTsKICAgIGlmKDA+KGZkPUNPTU1fR2V0V3JpdGVGZChoYW5kbGUpKSkgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgIGV2ZW50bWFzayA9IGV2dG1hc2s7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1TdGF0ZSAgICAoS0VSTkVMMzIuNDUyKQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbVN0YXRlKElOVCBoYW5kbGUsTFBEQ0IgbHBkY2IpCnsKICAgICBzdHJ1Y3QgdGVybWlvcyBwb3J0OwogICAgIGludCBmZDsKCiAgICAgVFJBQ0UoImhhbmRsZSAlZCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKCiAgICAgaWYgKChmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpKSA8IDApIHJldHVybiBGQUxTRTsKCiAgICAgaWYgKHRjZ2V0YXR0cihmZCwmcG9ydCkgPT0gLTEpIHsKICAgICAgICAgY29tbWVycm9yID0gV2luRXJyb3IoKTsKICAgICAgICAgY2xvc2UoIGZkICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CgoJcG9ydC5jX2NjW1ZNSU5dID0gMDsKCXBvcnQuY19jY1tWVElNRV0gPSAxOwoKI2lmZGVmIElNQVhCRUwKCXBvcnQuY19pZmxhZyAmPSB+KElTVFJJUHxCUktJTlR8SUdOQ1J8SUNSTkx8SU5MQ1J8SU1BWEJFTCk7CiNlbHNlCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSKTsKI2VuZGlmCglwb3J0LmNfaWZsYWcgfD0gKElHTkJSSyk7CgoJcG9ydC5jX29mbGFnICY9IH4oT1BPU1QpOwoKCXBvcnQuY19jZmxhZyAmPSB+KEhVUENMKTsKCXBvcnQuY19jZmxhZyB8PSBDTE9DQUwgfCBDUkVBRDsKCglwb3J0LmNfbGZsYWcgJj0gfihJQ0FOT058RUNIT3xJU0lHKTsKCXBvcnQuY19sZmxhZyB8PSBOT0ZMU0g7CgogICAgIC8qCiAgICAgKiogTUpNIC0gcmVtb3ZlZCBkZWZhdWx0IGJhdWRyYXRlIHNldHRpbmdzCiAgICAgKiogVFJBQ0UoY29tbSwiYmF1ZHJhdGUgJWxkXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CiAgICAgKi8KI2lmZGVmIENCQVVECglwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwoJc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKCQljYXNlIDExMDoKCQljYXNlIENCUl8xMTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTEwOwoJCQlicmVhazsJCQoJCWNhc2UgMzAwOgoJCWNhc2UgQ0JSXzMwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA2MDA6CgkJY2FzZSBDQlJfNjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjYwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDEyMDA6CgkJY2FzZSBDQlJfMTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMjQwMDoKCQljYXNlIENCUl8yNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjI0MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA0ODAwOgoJCWNhc2UgQ0JSXzQ4MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNDgwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDk2MDA6CgkJY2FzZSBDQlJfOTYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI5NjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTkyMDA6CgkJY2FzZSBDQlJfMTkyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTkyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzODQwMDoKCQljYXNlIENCUl8zODQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzODQwMDsKCQkJYnJlYWs7CQkKCQlkZWZhdWx0OgoJCQljb21tZXJyb3IgPSBJRV9CQVVEUkFURTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJCXJldHVybiBGQUxTRTsKCX0KI2VsaWYgIWRlZmluZWQoX19FTVhfXykKICAgICAgICBzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewogICAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xMTA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTEwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxMjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzI0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMjQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ4MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl80ODAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjQ4MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfOTYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI5NjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTkyMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xOTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxOTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM4NDAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzg0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMzg0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVycm9yID0gSUVfQkFVRFJBVEU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQogICAgICAgIHBvcnQuY19pc3BlZWQgPSBwb3J0LmNfb3NwZWVkOwojZW5kaWYKICAgIAlUUkFDRSgiYnl0ZXNpemUgJWRcbiIsbHBkY2ItPkJ5dGVTaXplKTsKCXBvcnQuY19jZmxhZyAmPSB+Q1NJWkU7Cglzd2l0Y2ggKGxwZGNiLT5CeXRlU2l6ZSkgewoJCWNhc2UgNToKCQkJcG9ydC5jX2NmbGFnIHw9IENTNTsKCQkJYnJlYWs7CgkJY2FzZSA2OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M2OwoJCQlicmVhazsKCQljYXNlIDc6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzc7CgkJCWJyZWFrOwoJCWNhc2UgODoKCQkJcG9ydC5jX2NmbGFnIHw9IENTODsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJY29tbWVycm9yID0gSUVfQllURVNJWkU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CgogICAgCVRSQUNFKCJmUGFyaXR5ICVkIFBhcml0eSAlZFxuIixscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSk7Cglwb3J0LmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOwoJaWYgKGxwZGNiLT5mUGFyaXR5KQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgfD0gSU5QQ0s7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgIHN3aXRjaCAobHBkY2ItPlBhcml0eSkgewogICAgICAgICAgICAgICAgY2FzZSBOT1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE9ERFBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRVZFTlBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IFBBUkVOQjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBjb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CgkKCiAgICAJVFJBQ0UoInN0b3BiaXRzICVkXG4iLGxwZGNiLT5TdG9wQml0cyk7Cglzd2l0Y2ggKGxwZGNiLT5TdG9wQml0cykgewoJCWNhc2UgT05FU1RPUEJJVDoKCQkJCXBvcnQuY19jZmxhZyAmPSB+Q1NUT1BCOwoJCQkJYnJlYWs7CgkJY2FzZSBUV09TVE9QQklUUzoKCQkJCXBvcnQuY19jZmxhZyB8PSBDU1RPUEI7CgkJCQlicmVhazsKCQlkZWZhdWx0OgoJCQljb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJCXJldHVybiBGQUxTRTsKCX0KI2lmZGVmIENSVFNDVFMKCWlmICgJbHBkY2ItPmZPdXR4Q3RzRmxvdyAJCQl8fAoJCWxwZGNiLT5mRHRyQ29udHJvbCA9PSBEVFJfQ09OVFJPTF9FTkFCTEV8fAoJCWxwZGNiLT5mUnRzQ29udHJvbCA9PSBSVFNfQ09OVFJPTF9FTkFCTEUKCSkKCQlwb3J0LmNfY2ZsYWcgfD0gQ1JUU0NUUzsKCWlmIChscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRElTQUJMRSkKCQlwb3J0LmNfY2ZsYWcgJj0gfkNSVFNDVFM7CgojZW5kaWYJCglpZiAobHBkY2ItPmZJblgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT047CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9OOwoJaWYgKGxwZGNiLT5mT3V0WCkKCQlwb3J0LmNfaWZsYWcgfD0gSVhPRkY7CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9GRjsKCglpZiAodGNzZXRhdHRyKGZkLFRDU0FEUkFJTiwmcG9ydCk9PS0xKSB7CgkJY29tbWVycm9yID0gV2luRXJyb3IoKTsJCiAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKCQlyZXR1cm4gRkFMU0U7Cgl9IGVsc2UgewoJCWNvbW1lcnJvciA9IDA7CiAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKCQlyZXR1cm4gVFJVRTsKCX0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKEtFUk5FTDMyLjE1OSkKICovCkJPT0wgV0lOQVBJIEdldENvbW1TdGF0ZShJTlQgaGFuZGxlLCBMUERDQiBscGRjYikKewogICAgIHN0cnVjdCB0ZXJtaW9zIHBvcnQ7CiAgICAgaW50IGZkOwoKICAgICBUUkFDRSgiaGFuZGxlICVkLCBwdHIgJXBcbiIsIGhhbmRsZSwgbHBkY2IpOwoKICAgICBpZiAoKGZkID0gQ09NTV9HZXRSZWFkRmQoaGFuZGxlKSkgPCAwKSByZXR1cm4gRkFMU0U7CgogICAgIGlmICh0Y2dldGF0dHIoZmQsICZwb3J0KSA9PSAtMSkgewogICAgICAgIFRSQUNFKCJ0Y2dldGF0dHIoJWQsIC4uLikgcmV0dXJuZWQgLTEiLGZkKTsKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCXJldHVybiBGQUxTRTsKCX0KICAgICBjbG9zZSggZmQgKTsKI2lmbmRlZiBfX0VNWF9fCiNpZmRlZiBDQkFVRAogICAgICAgIHN3aXRjaCAocG9ydC5jX2NmbGFnICYgQ0JBVUQpIHsKI2Vsc2UKICAgICAgICBzd2l0Y2ggKHBvcnQuY19vc3BlZWQpIHsKI2VuZGlmCgkJY2FzZSBCMTEwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTA7CgkJCWJyZWFrOwoJCWNhc2UgQjMwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzAwOwoJCQlicmVhazsKCQljYXNlIEI2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMjQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMjQwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNDgwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNDgwMDsKCQkJYnJlYWs7CgkJY2FzZSBCOTYwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gOTYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTkyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDE5MjAwOwoJCQlicmVhazsKCQljYXNlIEIzODQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzg0MDA7CgkJCWJyZWFrOwoJfQojZW5kaWYKCXN3aXRjaCAocG9ydC5jX2NmbGFnICYgQ1NJWkUpIHsKCQljYXNlIENTNToKCQkJbHBkY2ItPkJ5dGVTaXplID0gNTsKCQkJYnJlYWs7CgkJY2FzZSBDUzY6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDY7CgkJCWJyZWFrOwoJCWNhc2UgQ1M3OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA3OwoJCQlicmVhazsKCQljYXNlIENTODoKCQkJbHBkY2ItPkJ5dGVTaXplID0gODsKCQkJYnJlYWs7Cgl9CQoJCiAgICAgICAgaWYocG9ydC5jX2lmbGFnICYgSU5QQ0spCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gRkFMU0U7Cglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIChQQVJFTkIgfCBQQVJPREQpKSB7CgkJY2FzZSAwOgoJCQlscGRjYi0+UGFyaXR5ID0gTk9QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgUEFSRU5COgoJCQlscGRjYi0+UGFyaXR5ID0gRVZFTlBBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSAoUEFSRU5CIHwgUEFST0REKToKCQkJbHBkY2ItPlBhcml0eSA9IE9ERFBBUklUWTsJCQoJCQlicmVhazsKCX0KCglpZiAocG9ydC5jX2NmbGFnICYgQ1NUT1BCKQoJCWxwZGNiLT5TdG9wQml0cyA9IFRXT1NUT1BCSVRTOwoJZWxzZQoJCWxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CgoJbHBkY2ItPmZOdWxsID0gMDsKCWxwZGNiLT5mQmluYXJ5ID0gMTsKCiNpZmRlZiBDUlRTQ1RTCgoJaWYgKHBvcnQuY19jZmxhZyAmIENSVFNDVFMpIHsKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPSBEVFJfQ09OVFJPTF9FTkFCTEU7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSAxOwoJCWxwZGNiLT5mT3V0eERzckZsb3cgPSAxOwoJfSBlbHNlIAojZW5kaWYKCXsKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPSBEVFJfQ09OVFJPTF9ESVNBQkxFOwoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0RJU0FCTEU7Cgl9CglpZiAocG9ydC5jX2lmbGFnICYgSVhPTikKCQlscGRjYi0+ZkluWCA9IDE7CgllbHNlCgkJbHBkY2ItPmZJblggPSAwOwoKCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9GRikKCQlscGRjYi0+Zk91dFggPSAxOwoJZWxzZQoJCWxwZGNiLT5mT3V0WCA9IDA7Ci8qCglscGRjYi0+WG9uQ2hhciA9IAoJbHBkY2ItPlhvZmZDaGFyID0gCiAqLwoJbHBkY2ItPlhvbkxpbSA9IDEwOwoJbHBkY2ItPlhvZmZMaW0gPSAxMDsKCgljb21tZXJyb3IgPSAwOwoKICAgICBUUkFDRSgiT0tcbiIpOwogCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKEtFUk5FTDMyLjUzNSkKICovCkJPT0wgV0lOQVBJIFRyYW5zbWl0Q29tbUNoYXIoSU5UIGNpZCxDSEFSIGNoVHJhbnNtaXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJRklYTUUoIiglZCwnJWMnKSwgdXNlIHdpbjMyIGhhbmRsZSFcbiIsY2lkLGNoVHJhbnNtaXQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiBGQUxTRTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiBGQUxTRTsKCX0KCWlmICh3cml0ZShwdHItPmZkLCAodm9pZCAqKSAmY2hUcmFuc21pdCwgMSkgPT0gLTEpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIEZBTFNFOwoJfSAgZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiBUUlVFOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVRpbWVvdXRzCQkoS0VSTkVMMzIuMTYwKQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVRpbWVvdXRzKElOVCBjaWQsTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cykKewoJRklYTUUoIigleCwlcCk6c3R1Yi5cbiIsY2lkLGxwdGltZW91dHMpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tVGltZW91dHMJCShLRVJORUwzMi40NTMpCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tVGltZW91dHMoSU5UIGNpZCxMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKSB7CglGSVhNRSgiKCV4LCVwKTpzdHViLlxuIixjaWQsbHB0aW1lb3V0cyk7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRDb21tTW9kZW1TdGF0dXMgICAoS0VSTkVMMzIuMjg1KQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbU1vZGVtU3RhdHVzKEhBTkRMRSBoRmlsZSxMUERXT1JEIGxwTW9kZW1TdGF0ICkKewoJRklYTUUoIiglZCAlcClcbiIsaEZpbGUsbHBNb2RlbVN0YXQgKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgV2FpdENvbW1FdmVudCAgIChLRVJORUwzMi43MTkpCiAqLwpCT09MIFdJTkFQSSBXYWl0Q29tbUV2ZW50KEhBTkRMRSBoRmlsZSxMUERXT1JEIGV2ZW50bWFzayAsTFBPVkVSTEFQUEVEIG92ZXJsYXBwZWQpCnsKCUZJWE1FKCIoJWQgJXAgJXAgKVxuIixoRmlsZSwgZXZlbnRtYXNrLG92ZXJsYXBwZWQpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0Q29tbVByb3BlcnRpZXMgICAoS0VSTkVMMzIuPz8/KQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVByb3BlcnRpZXMoSEFORExFIGhGaWxlLCBMUERDQiAqZGNiKQp7CiAgICBGSVhNRSgiKCVkICVwIClcbiIsaEZpbGUsZGNiKTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldENvbW1Qcm9wZXJ0aWVzICAgKEtFUk5FTDMyLj8/PykKICovCkJPT0wgV0lOQVBJIFNldENvbW1Qcm9wZXJ0aWVzKEhBTkRMRSBoRmlsZSwgTFBEQ0IgZGNiKQp7CiAgICBGSVhNRSgiKCVkICVwIClcbiIsaEZpbGUsZGNiKTsKICAgIHJldHVybiBUUlVFOwp9Cgo=