LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQogKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAqIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgIm9zL215bmV3dC5oIgojaW5jbHVkZSAiY29uc29sZS9jb25zb2xlLmgiCiNpbmNsdWRlICJzaGVsbC9zaGVsbC5oIgojaW5jbHVkZSAicGFyc2UvcGFyc2UuaCIKI2luY2x1ZGUgIm5vZGUvbG9yYV9wcml2LmgiCiNpbmNsdWRlICJub2RlL2xvcmEuaCIKCmV4dGVybiB2b2lkCmxvcmFfYXBwX3NoZWxsX3R4ZF9mdW5jKHVpbnQ4X3QgcG9ydCwgTG9SYU1hY0V2ZW50SW5mb1N0YXR1c190IHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgTWNwc190IHBrdF90eXBlLCBzdHJ1Y3Qgb3NfbWJ1ZiAqb20pOwoKZXh0ZXJuIHZvaWQKbG9yYV9hcHBfc2hlbGxfcnhkX2Z1bmModWludDhfdCBwb3J0LCBMb1JhTWFjRXZlbnRJbmZvU3RhdHVzX3Qgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICBNY3BzX3QgcGt0X3R5cGUsIHN0cnVjdCBvc19tYnVmICpvbSk7CgpleHRlcm4gdm9pZApsb3JhX2FwcF9zaGVsbF9qb2luX2NiKExvUmFNYWNFdmVudEluZm9TdGF0dXNfdCBzdGF0dXMsIHVpbnQ4X3QgYXR0ZW1wdHMpOwoKZXh0ZXJuIHZvaWQKbG9yYV9hcHBfc2hlbGxfbGlua19jaGtfY2IoTG9SYU1hY0V2ZW50SW5mb1N0YXR1c190IHN0YXR1cywgdWludDhfdCBudW1fZ3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVtb2RfbWFyZ2luKTsKCiNkZWZpbmUgTE9SQV9BUFBfU0hFTExfTUFYX0FQUF9QQVlMT0FEICAoMjUwKQpzdGF0aWMgdWludDhfdCBsYXNfY21kX2FwcF90eF9idWZbTE9SQV9BUFBfU0hFTExfTUFYX0FQUF9QQVlMT0FEXTsKCnN0cnVjdCBtaWJfcGFpciB7CiAgICBjaGFyICptaWJfbmFtZTsKICAgIE1pYl90IG1pYl9wYXJhbTsKfTsKCnN0YXRpYyBzdHJ1Y3QgbWliX3BhaXIgbG9yYV9taWJbXSA9IHsKICAgIHsiZGV2aWNlX2NsYXNzIiwgICAgTUlCX0RFVklDRV9DTEFTU30sCiAgICB7Im53a19qb2luZWQiLCAgICAgIE1JQl9ORVRXT1JLX0pPSU5FRH0sCiAgICB7ImFkciIsICAgICAgICAgICAgIE1JQl9BRFJ9LAogICAgeyJuZXRfaWQiLCAgICAgICAgICBNSUJfTkVUX0lEfSwKICAgIHsiZGV2X2FkZHIiLCAgICAgICAgTUlCX0RFVl9BRERSfSwKICAgIHsibndrX3NrZXkiLCAgICAgICAgTUlCX05XS19TS0VZfSwKICAgIHsiYXBwX3NrZXkiLCAgICAgICAgTUlCX0FQUF9TS0VZfSwKICAgIHsicHViX253ayIsICAgICAgICAgTUlCX1BVQkxJQ19ORVRXT1JLfSwKICAgIHsicmVwZWF0ZXIiLCAgICAgICAgTUlCX1JFUEVBVEVSX1NVUFBPUlR9LAogICAgeyJyeDJfY2hhbiIsICAgICAgICBNSUJfUlgyX0NIQU5ORUx9LAogICAgeyJyeDJfZGVmX2NoYW4iLCAgICBNSUJfUlgyX0RFRkFVTFRfQ0hBTk5FTH0sCiAgICB7ImNoYW5fbWFzayIsICAgICAgIE1JQl9DSEFOTkVMU19NQVNLfSwKICAgIHsiY2hhbl9kZWZfbWFzayIsICAgTUlCX0NIQU5ORUxTX0RFRkFVTFRfTUFTS30sCiAgICB7ImNoYW5fbmJfcmVwIiwgICAgIE1JQl9DSEFOTkVMU19OQl9SRVB9LAogICAgeyJtYXhfcnhfd2luX2R1ciIsICBNSUJfTUFYX1JYX1dJTkRPV19EVVJBVElPTn0sCiAgICB7InJ4X2RlbGF5MSIsICAgICAgIE1JQl9SRUNFSVZFX0RFTEFZXzF9LAogICAgeyJyeF9kZWxheTIiLCAgICAgICBNSUJfUkVDRUlWRV9ERUxBWV8yfSwKICAgIHsiam9pbl9hY2NfZGVsYXkxIiwgTUlCX0pPSU5fQUNDRVBUX0RFTEFZXzF9LAogICAgeyJqb2luX2FjY19kZWxheTIiLCBNSUJfSk9JTl9BQ0NFUFRfREVMQVlfMn0sCiAgICB7ImNoYW5fZHIiLCAgICAgICAgIE1JQl9DSEFOTkVMU19EQVRBUkFURX0sCiAgICB7ImNoYW5fZGVmX2RyIiwgICAgIE1JQl9DSEFOTkVMU19ERUZBVUxUX0RBVEFSQVRFfSwKICAgIHsiY2hhbl90eF9wd3IiLCAgICAgTUlCX0NIQU5ORUxTX1RYX1BPV0VSfSwKICAgIHsiY2hhbl9kZWZfdHhfcHdyIiwgTUlCX0NIQU5ORUxTX0RFRkFVTFRfVFhfUE9XRVJ9LAogICAgeyJ1cGxpbmtfY250ciIsICAgICBNSUJfVVBMSU5LX0NPVU5URVJ9LAogICAgeyJkb3dubGlua19jbnRyIiwgICBNSUJfRE9XTkxJTktfQ09VTlRFUn0sCiAgICB7Im11bHRpY2FzdF9jaGFuIiwgIE1JQl9NVUxUSUNBU1RfQ0hBTk5FTH0sCiAgICB7InN5c19tYXhfcnhfZXJyIiwgIE1JQl9TWVNURU1fTUFYX1JYX0VSUk9SfSwKICAgIHsibWluX3J4X3N5bWJvbHMiLCAgTUlCX01JTl9SWF9TWU1CT0xTfSwKICAgIHtOVUxMLCAoTWliX3QpMH0KfTsKCnN0YXRpYyBpbnQgbGFzX2NtZF93cl9taWIoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKc3RhdGljIGludCBsYXNfY21kX3JkX21pYihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpzdGF0aWMgaW50IGxhc19jbWRfd3JfZGV2X2V1aShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpzdGF0aWMgaW50IGxhc19jbWRfcmRfZGV2X2V1aShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpzdGF0aWMgaW50IGxhc19jbWRfd3JfYXBwX2V1aShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpzdGF0aWMgaW50IGxhc19jbWRfcmRfYXBwX2V1aShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpzdGF0aWMgaW50IGxhc19jbWRfd3JfYXBwX2tleShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpzdGF0aWMgaW50IGxhc19jbWRfcmRfYXBwX2tleShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpzdGF0aWMgaW50IGxhc19jbWRfYXBwX3BvcnQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKc3RhdGljIGludCBsYXNfY21kX2FwcF90eChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpzdGF0aWMgaW50IGxhc19jbWRfam9pbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpzdGF0aWMgaW50IGxhc19jbWRfbGlua19jaGsoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKCnN0YXRpYyBzdHJ1Y3Qgc2hlbGxfY21kIGxhc19jbWRzW10gPSB7CiAgICB7CiAgICAgICAgLnNjX2NtZCA9ICJsYXNfd3JfbWliIiwKICAgICAgICAuc2NfY21kX2Z1bmMgPSBsYXNfY21kX3dyX21pYiwKICAgIH0sCiAgICB7CiAgICAgICAgLnNjX2NtZCA9ICJsYXNfcmRfbWliIiwKICAgICAgICAuc2NfY21kX2Z1bmMgPSBsYXNfY21kX3JkX21pYiwKICAgIH0sCiAgICB7CiAgICAgICAgLnNjX2NtZCA9ICJsYXNfcmRfZGV2X2V1aSIsCiAgICAgICAgLnNjX2NtZF9mdW5jID0gbGFzX2NtZF9yZF9kZXZfZXVpLAogICAgfSwKICAgIHsKICAgICAgICAuc2NfY21kID0gImxhc193cl9kZXZfZXVpIiwKICAgICAgICAuc2NfY21kX2Z1bmMgPSBsYXNfY21kX3dyX2Rldl9ldWksCiAgICB9LAogICAgewogICAgICAgIC5zY19jbWQgPSAibGFzX3JkX2FwcF9ldWkiLAogICAgICAgIC5zY19jbWRfZnVuYyA9IGxhc19jbWRfcmRfYXBwX2V1aSwKICAgIH0sCiAgICB7CiAgICAgICAgLnNjX2NtZCA9ICJsYXNfd3JfYXBwX2V1aSIsCiAgICAgICAgLnNjX2NtZF9mdW5jID0gbGFzX2NtZF93cl9hcHBfZXVpLAogICAgfSwKICAgIHsKICAgICAgICAuc2NfY21kID0gImxhc19yZF9hcHBfa2V5IiwKICAgICAgICAuc2NfY21kX2Z1bmMgPSBsYXNfY21kX3JkX2FwcF9rZXksCiAgICB9LAogICAgewogICAgICAgIC5zY19jbWQgPSAibGFzX3dyX2FwcF9rZXkiLAogICAgICAgIC5zY19jbWRfZnVuYyA9IGxhc19jbWRfd3JfYXBwX2tleSwKICAgIH0sCiAgICB7CiAgICAgICAgLnNjX2NtZCA9ICJsYXNfYXBwX3BvcnQiLAogICAgICAgIC5zY19jbWRfZnVuYyA9IGxhc19jbWRfYXBwX3BvcnQsCiAgICB9LAogICAgewogICAgICAgIC5zY19jbWQgPSAibGFzX2FwcF90eCIsCiAgICAgICAgLnNjX2NtZF9mdW5jID0gbGFzX2NtZF9hcHBfdHgsCiAgICB9LAogICAgewogICAgICAgIC5zY19jbWQgPSAibGFzX2pvaW4iLAogICAgICAgIC5zY19jbWRfZnVuYyA9IGxhc19jbWRfam9pbiwKICAgIH0sCiAgICB7CiAgICAgICAgLnNjX2NtZCA9ICJsYXNfbGlua19jaGsiLAogICAgICAgIC5zY19jbWRfZnVuYyA9IGxhc19jbWRfbGlua19jaGssCiAgICB9LAogICAgewogICAgICAgIE5VTEwsIE5VTEwsCiNpZiBNWU5FV1RfVkFMKFNIRUxMX0NNRF9IRUxQKQogICAgICAgIE5VTEwKI2VuZGlmCiAgICB9LAp9OwoKI2RlZmluZSBMQVNfTlVNX0NMSV9DTURTICAoc2l6ZW9mIGxhc19jbWRzIC8gc2l6ZW9mIGxhc19jbWRzWzBdKQoKdm9pZApsYXNfY21kX2Rpc3BfYnl0ZV9zdHIodWludDhfdCAqYnl0ZXMsIGludCBsZW4pCnsKICAgIGludCBpOwoKICAgIGlmIChsZW4gPiAwKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7ICsraSkgewogICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiJTAyeDoiLCBieXRlc1tpXSk7CiAgICAgICAgfQogICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlMDJ4XG4iLCBieXRlc1tsZW4gLSAxXSk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmxhc19jbWRfZGlzcF9jaGFuX21hc2sodWludDE2X3QgKm1hc2spCnsKICAgIHVpbnQxNl90IGk7CiAgICB1aW50MTZfdCBsZW47CiAgICB1aW50MTZfdCBtYXhfY2hhbnM7CiAgICBQaHlQYXJhbV90IHBoeV9wYXJhbTsKICAgIEdldFBoeVBhcmFtc190IGdldFBoeTsKCiAgICBpZiAoIW1hc2spIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZ2V0UGh5LkF0dHJpYnV0ZSA9IFBIWV9NQVhfTkJfQ0hBTk5FTFM7CiAgICBwaHlfcGFyYW0gPSBSZWdpb25HZXRQaHlQYXJhbShMT1JBX05PREVfUkVHSU9OLCAmZ2V0UGh5KTsKICAgIG1heF9jaGFucyA9IHBoeV9wYXJhbS5WYWx1ZTsKCiAgICBsZW4gPSBtYXhfY2hhbnMgLyAxNjsKICAgIGlmICgobGVuICogMTYpICE9IG1heF9jaGFucykgewogICAgICAgIGxlbiArPSAxOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyArK2kpIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiJTA0eDoiLCBtYXNrW2ldKTsKICAgIH0KICAgIGNvbnNvbGVfcHJpbnRmKCIlMDR4XG4iLCBtYXNrW2xlbiAtIDFdKTsKfQoKLyoqCiAqIERpc3BsYXkgbGlzdCBvZiBNQUMgbWlicwogKgogKi8Kc3RhdGljIHZvaWQKbGFzX2NtZF9zaG93X21pYnModm9pZCkKewogICAgc3RydWN0IG1pYl9wYWlyICptcDsKCiAgICBtcCA9ICZsb3JhX21pYlswXTsKICAgIHdoaWxlIChtcC0+bWliX25hbWUgIT0gTlVMTCkgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlc1xuIiwgbXAtPm1pYl9uYW1lKTsKICAgICAgICArK21wOwogICAgfQp9CgpzdGF0aWMgc3RydWN0IG1pYl9wYWlyICoKbGFzX2ZpbmRfbWliX2J5X25hbWUoY2hhciAqbWlibmFtZSkKewogICAgc3RydWN0IG1pYl9wYWlyICptcDsKCiAgICBtcCA9ICZsb3JhX21pYlswXTsKICAgIHdoaWxlIChtcC0+bWliX25hbWUgIT0gTlVMTCkgewogICAgICAgIGlmICghc3RyY21wKG1pYm5hbWUsIG1wLT5taWJfbmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuIG1wOwogICAgICAgIH0KICAgICAgICArK21wOwogICAgfQoKICAgIHJldHVybiBOVUxMOwp9CgpzdGF0aWMgdm9pZApsYXNfY21kX3dyX21pYl9oZWxwKHZvaWQpCnsKICAgIGNvbnNvbGVfcHJpbnRmKCJsYXNfd3JfbWliIDxtaWJfbmFtZT4gPHZhbD4gd2hlcmUgbWliX25hbWUgaXMgb25lIG9mOlxuIik7CiAgICBsYXNfY21kX3Nob3dfbWlicygpOwp9CgpzdGF0aWMgaW50Cmxhc19wYXJzZV9ib29sKGNoYXIgKnN0cikKewogICAgaW50IHJjOwoKICAgIGlmICghc3RyY21wKHN0ciwgIjAiKSkgewogICAgICAgIHJjID0gMDsKICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICIxIikpIHsKICAgICAgICByYyA9IDE7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnZhbGlkIHZhbHVlLiBWYWxpZCB2YWx1ZXMgYXJlIDAgb3IgMVxuIik7CiAgICAgICAgcmMgPSAtMTsKICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCnN0YXRpYyBpbnQKbGFzX2NtZF93cl9taWIoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBpbnQgcmM7CiAgICBpbnQgcGxlbjsKICAgIHVpbnQ4X3Qga2V5W0xPUkFfS0VZX0xFTl07CiAgICB1aW50MTZfdCBtYXNrWzE2XTsKICAgIGludCBtYXNrX2xlbjsKICAgIHN0cnVjdCBtaWJfcGFpciAqbXA7CiAgICBNaWJSZXF1ZXN0Q29uZmlybV90IG1pYjsKICAgIEdldFBoeVBhcmFtc190IGdldFBoeTsKICAgIFBoeVBhcmFtX3QgcGh5X3BhcmFtOwoKICAgIGlmIChhcmdjIDwgMykgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnZhbGlkICMgb2YgYXJndW1lbnRzXG4iKTsKICAgICAgICBnb3RvIHdyX21pYl9lcnI7CiAgICB9CgogICAgaWYgKHN0cmNtcChhcmd2WzFdLCAiaGVscCIpID09IDApIHsKICAgICAgICBsYXNfY21kX3dyX21pYl9oZWxwKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXAgPSBsYXNfZmluZF9taWJfYnlfbmFtZShhcmd2WzFdKTsKICAgIGlmIChtcCA9PSBOVUxMKSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIk5vIG1pYiBuYW1lZCAlc1xuIixhcmd2WzFdKTsKICAgICAgICBnb3RvIHdyX21pYl9lcnI7CiAgICB9CgogICAgLyogcGFyc2UgdmFsdWUgKi8KICAgIG1pYi5UeXBlID0gbXAtPm1pYl9wYXJhbTsKICAgIHN3aXRjaCAobWliLlR5cGUpIHsKICAgICAgICBjYXNlIE1JQl9ERVZJQ0VfQ0xBU1M6CiAgICAgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbMl0sICJBIikpIHsKICAgICAgICAgICAgICAgIG1pYi5QYXJhbS5DbGFzcyA9IENMQVNTX0E7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiQiIpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiQ2xhc3MgQiBkZXZpY2VzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIkMiKSkgewogICAgICAgICAgICAgICAgbWliLlBhcmFtLkNsYXNzID0gQ0xBU1NfQzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnZhbGlkIHZhbHVlLiBWYWxpZCB2YWx1ZXMgYXJlIEEsIEIgb3IgQ1xuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9ORVRXT1JLX0pPSU5FRDoKICAgICAgICAgICAgcmMgPSBsYXNfcGFyc2VfYm9vbChhcmd2WzJdKTsKICAgICAgICAgICAgaWYgKHJjID09IDApIHsKICAgICAgICAgICAgICAgIG1pYi5QYXJhbS5Jc05ldHdvcmtKb2luZWQgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyYyA9PSAxKSB7CiAgICAgICAgICAgICAgICBtaWIuUGFyYW0uSXNOZXR3b3JrSm9pbmVkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FEUjoKICAgICAgICAgICAgcmMgPSBsYXNfcGFyc2VfYm9vbChhcmd2WzJdKTsKICAgICAgICAgICAgaWYgKHJjID09IDApIHsKICAgICAgICAgICAgICAgIG1pYi5QYXJhbS5BZHJFbmFibGUgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyYyA9PSAxKSB7CiAgICAgICAgICAgICAgICBtaWIuUGFyYW0uQWRyRW5hYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX05FVF9JRDoKICAgICAgICAgICAgbWliLlBhcmFtLk5ldElEID0gKHVpbnQzMl90KXBhcnNlX3VsbChhcmd2WzJdLCAmcmMpOwogICAgICAgICAgICBpZiAocmMpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgdmFsdWVcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfREVWX0FERFI6CiAgICAgICAgICAgIG1pYi5QYXJhbS5EZXZBZGRyID0gKHVpbnQzMl90KXBhcnNlX3VsbChhcmd2WzJdLCAmcmMpOwogICAgICAgICAgICBpZiAocmMpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgdmFsdWVcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfTldLX1NLRVk6CiAgICAgICAgICAgIHJjID0gcGFyc2VfYnl0ZV9zdHJlYW0oYXJndlsyXSwgTE9SQV9LRVlfTEVOLCBrZXksICZwbGVuKTsKICAgICAgICAgICAgaWYgKHJjIHx8IChwbGVuICE9IExPUkFfS0VZX0xFTikpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJLZXkgZG9lcyBub3QgcGFyc2UuIE11c3QgYmUgMTYgYnl0ZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBzZXBhcmF0ZWQgYnkgOiBvciAtXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1pYi5QYXJhbS5Od2tTS2V5ID0ga2V5OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BUFBfU0tFWToKICAgICAgICAgICAgcmMgPSBwYXJzZV9ieXRlX3N0cmVhbShhcmd2WzJdLCBMT1JBX0tFWV9MRU4sIGtleSwgJnBsZW4pOwogICAgICAgICAgICBpZiAocmMgfHwgKHBsZW4gIT0gTE9SQV9LRVlfTEVOKSkgewogICAgICAgICAgICAgICAgY29uc29sZV9wcmludGYoIktleSBkb2VzIG5vdCBwYXJzZS4gTXVzdCBiZSAxNiBieXRlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIHNlcGFyYXRlZCBieSA6IG9yIC1cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWliLlBhcmFtLkFwcFNLZXkgPSBrZXk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1BVQkxJQ19ORVRXT1JLOgogICAgICAgICAgICByYyA9IGxhc19wYXJzZV9ib29sKGFyZ3ZbMl0pOwogICAgICAgICAgICBpZiAocmMgPT0gMCkgewogICAgICAgICAgICAgICAgbWliLlBhcmFtLkVuYWJsZVB1YmxpY05ldHdvcmsgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyYyA9PSAxKSB7CiAgICAgICAgICAgICAgICBtaWIuUGFyYW0uRW5hYmxlUHVibGljTmV0d29yayA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9SRVBFQVRFUl9TVVBQT1JUOgogICAgICAgICAgICByYyA9IGxhc19wYXJzZV9ib29sKGFyZ3ZbMl0pOwogICAgICAgICAgICBpZiAocmMgPT0gMCkgewogICAgICAgICAgICAgICAgbWliLlBhcmFtLkVuYWJsZVJlcGVhdGVyU3VwcG9ydCA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJjID09IDEpIHsKICAgICAgICAgICAgICAgIG1pYi5QYXJhbS5FbmFibGVSZXBlYXRlclN1cHBvcnQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQ0hBTk5FTFM6CiAgICAgICAgICAgIC8vbWliLlBhcmFtLkNoYW5uZWxMaXN0OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9SWDJfQ0hBTk5FTDoKICAgICAgICAgICAgLy9taWIuUGFyYW0uUngyQ2hhbm5lbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfUlgyX0RFRkFVTFRfQ0hBTk5FTDoKICAgICAgICAgICAgLy9taWIuUGFyYW0uUngyQ2hhbm5lbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQ0hBTk5FTFNfREVGQVVMVF9NQVNLOgogICAgICAgICAgICAvKiBOT1RFOiBmYWxsLXRocm91Z2ggaW50ZW50aW9uYWwgKi8KICAgICAgICBjYXNlIE1JQl9DSEFOTkVMU19NQVNLOgogICAgICAgICAgICBtZW1zZXQobWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKCiAgICAgICAgICAgIGdldFBoeS5BdHRyaWJ1dGUgPSBQSFlfTUFYX05CX0NIQU5ORUxTOwogICAgICAgICAgICBwaHlfcGFyYW0gPSBSZWdpb25HZXRQaHlQYXJhbShMT1JBX05PREVfUkVHSU9OLCAmZ2V0UGh5KTsKICAgICAgICAgICAgbWFza19sZW4gPSBwaHlfcGFyYW0uVmFsdWUgLyA4OwogICAgICAgICAgICBpZiAoKG1hc2tfbGVuICogOCkgIT0gcGh5X3BhcmFtLlZhbHVlKSB7CiAgICAgICAgICAgICAgICBtYXNrX2xlbiArPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBOT1RFOiByZS11c2Ugb2Yga2V5IGhlcmUgZm9yIHRlbXAgYnVmZmVyIHN0b3JhZ2UgKi8KICAgICAgICAgICAgcmMgPSBwYXJzZV9ieXRlX3N0cmVhbShhcmd2WzJdLCBtYXNrX2xlbiwga2V5LCAmcGxlbik7CiAgICAgICAgICAgIGlmIChyYyB8fCAocGxlbiAhPSBtYXNrX2xlbikpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJNYXNrIGRvZXMgbm90IHBhcnNlLiBNdXN0IGJlICVkIGJ5dGVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgc2VwYXJhdGVkIGJ5IDogb3IgLVxuIiwgbWFza19sZW4pOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIGNvbnN0cnVjdCBtYXNrIGZyb20gYnl0ZSBzdHJlYW0gKi8KICAgICAgICAgICAgcmMgPSAwOwogICAgICAgICAgICBmb3IgKHBsZW4gPSAwOyBwbGVuIDwgbWFza19sZW47IHBsZW4gKz0gMikgewogICAgICAgICAgICAgICAgbWFza1tyY10gPSBrZXlbcGxlbl07CiAgICAgICAgICAgICAgICBpZiAoKG1hc2tfbGVuICYgMSkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIG1hc2tbcmNdICs9ICgodWludDE2X3Qpa2V5W3BsZW4gKyAxXSkgPDwgODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICsrcmM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtaWIuVHlwZSA9PSBNSUJfQ0hBTk5FTFNfREVGQVVMVF9NQVNLKSB7CiAgICAgICAgICAgICAgICBtaWIuUGFyYW0uQ2hhbm5lbHNEZWZhdWx0TWFzayA9IG1hc2s7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtaWIuUGFyYW0uQ2hhbm5lbHNNYXNrID0gbWFzazsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9DSEFOTkVMU19OQl9SRVA6CiAgICAgICAgICAgIC8vbWliLlBhcmFtLkNoYW5uZWxOYlJlcDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfTUFYX1JYX1dJTkRPV19EVVJBVElPTjoKICAgICAgICAgICAgLy9taWIuUGFyYW0uTWF4UnhXaW5kb3c7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1JFQ0VJVkVfREVMQVlfMToKICAgICAgICAgICAgLy9taWIuUGFyYW0uUmVjZWl2ZURlbGF5MTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfUkVDRUlWRV9ERUxBWV8yOgogICAgICAgICAgICAvL21pYi5QYXJhbS5SZWNlaXZlRGVsYXkyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9KT0lOX0FDQ0VQVF9ERUxBWV8xOgogICAgICAgICAgICAvL21pYi5QYXJhbS5Kb2luQWNjZXB0RGVsYXkxOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9KT0lOX0FDQ0VQVF9ERUxBWV8yOgogICAgICAgICAgICAvL21pYi5QYXJhbS5Kb2luQWNjZXB0RGVsYXkyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9DSEFOTkVMU19ERUZBVUxUX0RBVEFSQVRFOgogICAgICAgICAgICBtaWIuUGFyYW0uQ2hhbm5lbHNEZWZhdWx0RGF0YXJhdGUgPSBwYXJzZV9sbChhcmd2WzJdLCAmcmMpOwogICAgICAgICAgICBpZiAocmMpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgdmFsdWVcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQ0hBTk5FTFNfREFUQVJBVEU6CiAgICAgICAgICAgIG1pYi5QYXJhbS5DaGFubmVsc0RhdGFyYXRlID0gcGFyc2VfbGwoYXJndlsyXSwgJnJjKTsKICAgICAgICAgICAgaWYgKHJjKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiVW5hYmxlIHRvIHBhcnNlIHZhbHVlXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0NIQU5ORUxTX0RFRkFVTFRfVFhfUE9XRVI6CiAgICAgICAgICAgIC8vbWliR2V0LlBhcmFtLkNoYW5uZWxzRGVmYXVsdFR4UG93ZXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0NIQU5ORUxTX1RYX1BPV0VSOgogICAgICAgICAgICAvL21pYi5QYXJhbS5DaGFubmVsc1R4UG93ZXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1VQTElOS19DT1VOVEVSOgogICAgICAgICAgICAvL21pYi5QYXJhbS5VcExpbmtDb3VudGVyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9ET1dOTElOS19DT1VOVEVSOgogICAgICAgICAgICAvL21pYi5QYXJhbS5Eb3duTGlua0NvdW50ZXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX01VTFRJQ0FTVF9DSEFOTkVMOgogICAgICAgICAgICAvL21pYi5QYXJhbS5NdWx0aWNhc3RMaXN0ID0gTXVsdGljYXN0Q2hhbm5lbHM7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGFzc2VydCgwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKExvUmFNYWNNaWJTZXRSZXF1ZXN0Q29uZmlybSgmbWliKSAhPSBMT1JBTUFDX1NUQVRVU19PSykgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJNaWIgbm90IGFibGUgdG8gYmUgc2V0XG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBjb25zb2xlX3ByaW50ZigibWliICVzIHNldFxuIiwgbXAtPm1pYl9uYW1lKTsKCiAgICByZXR1cm4gMDsKCndyX21pYl9lcnI6CiAgICBsYXNfY21kX3dyX21pYl9oZWxwKCk7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKbGFzX2NtZF9yZF9taWJfaGVscCh2b2lkKQp7CiAgICBjb25zb2xlX3ByaW50ZigibGFzX3JkX21pYiA8bWliX25hbWU+IHdoZXJlIG1pYl9uYW1lIGlzIG9uZSBvZjpcbiIpOwogICAgbGFzX2NtZF9zaG93X21pYnMoKTsKfQoKc3RhdGljIGludApsYXNfY21kX3JkX21pYihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIHN0cnVjdCBtaWJfcGFpciAqbXA7CiAgICBMb1JhTWFjU3RhdHVzX3Qgc3RhdDsKICAgIE1pYlJlcXVlc3RDb25maXJtX3QgbWliR2V0OwoKICAgIGlmIChhcmdjICE9IDIpIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiSW52YWxpZCAjIG9mIGFyZ3VtZW50c1xuIik7CiAgICAgICAgZ290byByZF9taWJfZXJyOwogICAgfQoKICAgIGlmIChzdHJjbXAoYXJndlsxXSwgImhlbHAiKSA9PSAwKSB7CiAgICAgICAgbGFzX2NtZF9yZF9taWJfaGVscCgpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG1wID0gbGFzX2ZpbmRfbWliX2J5X25hbWUoYXJndlsxXSk7CiAgICBpZiAobXAgPT0gTlVMTCkgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJObyBtaWIgbmFtZWQgJXNcbiIsYXJndlsxXSk7CiAgICAgICAgZ290byByZF9taWJfZXJyOwogICAgfQoKICAgIC8qIFJlYWQgdGhlIG1pYiB2YWx1ZSAqLwogICAgbWliR2V0LlR5cGUgPSBtcC0+bWliX3BhcmFtOwogICAgc3RhdCA9IExvUmFNYWNNaWJHZXRSZXF1ZXN0Q29uZmlybSgmbWliR2V0KTsKICAgIGlmIChzdGF0ICE9IExPUkFNQUNfU1RBVFVTX09LKSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIk1pYiBsb29rdXAgZmFpbHVyZVxuIik7CiAgICAgICAgZ290byByZF9taWJfZXJyOwogICAgfQoKICAgIGNvbnNvbGVfcHJpbnRmKCIlcz0iLCBtcC0+bWliX25hbWUpOwogICAgLyogRGlzcGxheSB0aGUgdmFsdWUgKi8KICAgIHN3aXRjaCAobWliR2V0LlR5cGUpIHsKICAgICAgICBjYXNlIE1JQl9ERVZJQ0VfQ0xBU1M6CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlY1xuIiwgJ0EnICsgbWliR2V0LlBhcmFtLkNsYXNzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfTkVUV09SS19KT0lORUQ6CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlZFxuIiwgbWliR2V0LlBhcmFtLklzTmV0d29ya0pvaW5lZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FEUjoKICAgICAgICAgICAgY29uc29sZV9wcmludGYoIiVkXG4iLCBtaWJHZXQuUGFyYW0uQWRyRW5hYmxlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfTkVUX0lEOgogICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiJTA4bHhcbiIsIG1pYkdldC5QYXJhbS5OZXRJRCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0RFVl9BRERSOgogICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiJTA4bHhcbiIsIG1pYkdldC5QYXJhbS5EZXZBZGRyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfTldLX1NLRVk6CiAgICAgICAgICAgIGxhc19jbWRfZGlzcF9ieXRlX3N0cihtaWJHZXQuUGFyYW0uTndrU0tleSwgTE9SQV9LRVlfTEVOKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQVBQX1NLRVk6CiAgICAgICAgICAgIGxhc19jbWRfZGlzcF9ieXRlX3N0cihtaWJHZXQuUGFyYW0uQXBwU0tleSwgTE9SQV9LRVlfTEVOKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfUFVCTElDX05FVFdPUks6CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlZFxuIiwgbWliR2V0LlBhcmFtLkVuYWJsZVB1YmxpY05ldHdvcmspOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9SRVBFQVRFUl9TVVBQT1JUOgogICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiJWRcbiIsIG1pYkdldC5QYXJhbS5FbmFibGVSZXBlYXRlclN1cHBvcnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9DSEFOTkVMUzoKICAgICAgICAgICAgLy9taWJHZXQuUGFyYW0uQ2hhbm5lbExpc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1JYMl9DSEFOTkVMOgogICAgICAgICAgICAvL21pYkdldC5QYXJhbS5SeDJDaGFubmVsOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9SWDJfREVGQVVMVF9DSEFOTkVMOgogICAgICAgICAgICAvL21pYkdldC5QYXJhbS5SeDJDaGFubmVsOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9DSEFOTkVMU19ERUZBVUxUX01BU0s6CiAgICAgICAgICAgIGxhc19jbWRfZGlzcF9jaGFuX21hc2sobWliR2V0LlBhcmFtLkNoYW5uZWxzRGVmYXVsdE1hc2spOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9DSEFOTkVMU19NQVNLOgogICAgICAgICAgICBsYXNfY21kX2Rpc3BfY2hhbl9tYXNrKG1pYkdldC5QYXJhbS5DaGFubmVsc01hc2spOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9DSEFOTkVMU19OQl9SRVA6CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIldVxuIiwgbWliR2V0LlBhcmFtLkNoYW5uZWxOYlJlcCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX01BWF9SWF9XSU5ET1dfRFVSQVRJT046CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlbHVcbiIsIG1pYkdldC5QYXJhbS5NYXhSeFdpbmRvdyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1JFQ0VJVkVfREVMQVlfMToKICAgICAgICAgICAgY29uc29sZV9wcmludGYoIiVsdVxuIiwgbWliR2V0LlBhcmFtLlJlY2VpdmVEZWxheTEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9SRUNFSVZFX0RFTEFZXzI6CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlbHVcbiIsIG1pYkdldC5QYXJhbS5SZWNlaXZlRGVsYXkyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfSk9JTl9BQ0NFUFRfREVMQVlfMToKICAgICAgICAgICAgY29uc29sZV9wcmludGYoIiVsdVxuIiwgbWliR2V0LlBhcmFtLkpvaW5BY2NlcHREZWxheTEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9KT0lOX0FDQ0VQVF9ERUxBWV8yOgogICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiJWx1XG4iLCBtaWJHZXQuUGFyYW0uSm9pbkFjY2VwdERlbGF5Mik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0NIQU5ORUxTX0RFRkFVTFRfREFUQVJBVEU6CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlZFxuIiwgbWliR2V0LlBhcmFtLkNoYW5uZWxzRGVmYXVsdERhdGFyYXRlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQ0hBTk5FTFNfREFUQVJBVEU6CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlZFxuIiwgbWliR2V0LlBhcmFtLkNoYW5uZWxzRGF0YXJhdGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9DSEFOTkVMU19ERUZBVUxUX1RYX1BPV0VSOgogICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiJWRcbiIsIG1pYkdldC5QYXJhbS5DaGFubmVsc0RlZmF1bHRUeFBvd2VyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQ0hBTk5FTFNfVFhfUE9XRVI6CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlZFxuIiwgbWliR2V0LlBhcmFtLkNoYW5uZWxzVHhQb3dlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1VQTElOS19DT1VOVEVSOgogICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiJWx1XG4iLCBtaWJHZXQuUGFyYW0uVXBMaW5rQ291bnRlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0RPV05MSU5LX0NPVU5URVI6CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlbHVcbiIsIG1pYkdldC5QYXJhbS5Eb3duTGlua0NvdW50ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9NVUxUSUNBU1RfQ0hBTk5FTDoKICAgICAgICAgICAgLy9taWJHZXQuUGFyYW0uTXVsdGljYXN0TGlzdCA9IE11bHRpY2FzdENoYW5uZWxzOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBhc3NlcnQoMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIDA7CgpyZF9taWJfZXJyOgogICAgbGFzX2NtZF9yZF9taWJfaGVscCgpOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbGFzX2NtZF9yZF9kZXZfZXVpKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaWYgKGFyZ2MgIT0gMSkgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnZhbGlkICMgb2YgYXJndW1lbnRzLiBVc2FnZTogbGFzX3JkX2Rldl9ldWlcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGxhc19jbWRfZGlzcF9ieXRlX3N0cihnX2xvcmFfZGV2X2V1aSwgTE9SQV9FVUlfTEVOKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50Cmxhc19jbWRfd3JfZGV2X2V1aShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGludCByYzsKICAgIGludCBwbGVuOwogICAgdWludDhfdCBldWlbTE9SQV9FVUlfTEVOXTsKCiAgICBpZiAoYXJnYyA8IDIpIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiSW52YWxpZCAjIG9mIGFyZ3VtZW50cy4iCiAgICAgICAgICAgICAgICAgICAgICAgIiBVc2FnZTogbGFzX3dyX2Rldl9ldWkgPHh4Onh4Onh4Onh4Onh4Onh4Onh4Onh4PlxuIik7CiAgICB9CgogICAgcmMgPSBwYXJzZV9ieXRlX3N0cmVhbShhcmd2WzFdLCBMT1JBX0VVSV9MRU4sIGV1aSwgJnBsZW4pOwogICAgaWYgKHJjIHx8IChwbGVuICE9IExPUkFfRVVJX0xFTikpIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiRVVJIGRvZXMgbm90IHBhcnNlLiBNdXN0IGJlIDggYnl0ZXMiCiAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgc2VwYXJhdGVkIGJ5IDogb3IgLVxuIik7CiAgICB9IGVsc2UgewogICAgICAgIG1lbWNweShnX2xvcmFfZGV2X2V1aSwgZXVpLCBMT1JBX0VVSV9MRU4pOwogICAgfQoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50Cmxhc19jbWRfcmRfYXBwX2V1aShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGlmIChhcmdjICE9IDEpIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiSW52YWxpZCAjIG9mIGFyZ3VtZW50cy4gVXNhZ2U6IGxhc19yZF9hcHBfZXVpXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBsYXNfY21kX2Rpc3BfYnl0ZV9zdHIoZ19sb3JhX2FwcF9ldWksIExPUkFfRVVJX0xFTik7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludApsYXNfY21kX3dyX2FwcF9ldWkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBpbnQgcmM7CiAgICBpbnQgcGxlbjsKICAgIHVpbnQ4X3QgZXVpW0xPUkFfRVVJX0xFTl07CgogICAgaWYgKGFyZ2MgPCAyKSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIkludmFsaWQgIyBvZiBhcmd1bWVudHMuIgogICAgICAgICAgICAgICAgICAgICAgICIgVXNhZ2U6IGxhc193cl9hcHBfZXVpIDx4eDp4eDp4eDp4eDp4eDp4eDp4eDp4eD5cbiIpOwogICAgfQoKICAgIHJjID0gcGFyc2VfYnl0ZV9zdHJlYW0oYXJndlsxXSwgTE9SQV9FVUlfTEVOLCBldWksICZwbGVuKTsKICAgIGlmIChyYyB8fCAocGxlbiAhPSBMT1JBX0VVSV9MRU4pKSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIkVVSSBkb2VzIG5vdCBwYXJzZS4gTXVzdCBiZSA4IGJ5dGVzIgogICAgICAgICAgICAgICAgICAgICAgICIgYW5kIHNlcGFyYXRlZCBieSA6IG9yIC1cbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBtZW1jcHkoZ19sb3JhX2FwcF9ldWksIGV1aSwgTE9SQV9FVUlfTEVOKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludApsYXNfY21kX3JkX2FwcF9rZXkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBpZiAoYXJnYyAhPSAxKSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIkludmFsaWQgIyBvZiBhcmd1bWVudHMuIFVzYWdlOiBsYXNfcmRfYXBwX2tleVxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbGFzX2NtZF9kaXNwX2J5dGVfc3RyKGdfbG9yYV9hcHBfa2V5LCBMT1JBX0tFWV9MRU4pOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbGFzX2NtZF93cl9hcHBfa2V5KGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50IHJjOwogICAgaW50IHBsZW47CiAgICB1aW50OF90IGtleVtMT1JBX0tFWV9MRU5dOwoKICAgIGlmIChhcmdjIDwgMikgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnZhbGlkICMgb2YgYXJndW1lbnRzLiIKICAgICAgICAgICAgICAgICAgICAgICAiIFVzYWdlOiBsYXNfd3JfYXBwX2tleSA8eHg6eHg6eHg6eHg6eHg6eHg6eHg6eHg6eHg6eHgiCiAgICAgICAgICAgICAgICAgICAgICAgIjp4eDp4eDp4eDp4eDp4eDp4eFxuIik7CiAgICB9CgogICAgcmMgPSBwYXJzZV9ieXRlX3N0cmVhbShhcmd2WzFdLCBMT1JBX0tFWV9MRU4sIGtleSwgJnBsZW4pOwogICAgaWYgKHJjIHx8IChwbGVuICE9IExPUkFfS0VZX0xFTikpIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiS2V5IGRvZXMgbm90IHBhcnNlLiBNdXN0IGJlIDE2IGJ5dGVzIGFuZCBzZXBhcmF0ZWQgYnkiCiAgICAgICAgICAgICAgICAgICAgICAgIiA6IG9yIC1cbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIHsKICAgICAgICBtZW1jcHkoZ19sb3JhX2FwcF9rZXksIGtleSwgTE9SQV9LRVlfTEVOKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludApsYXNfY21kX2FwcF9wb3J0KGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50IHJjOwogICAgdWludDhfdCBwb3J0OwogICAgdWludDhfdCByZXRyaWVzOwoKICAgIGlmIChhcmdjIDwgMykgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnZhbGlkICMgb2YgYXJndW1lbnRzLlxuIik7CiAgICAgICAgZ290byBjbWRfYXBwX3BvcnRfZXJyOwogICAgfQoKICAgIHBvcnQgPSBwYXJzZV91bGxfYm91bmRzKGFyZ3ZbMl0sIDEsIDI1NSwgJnJjKTsKICAgIGlmIChyYyAhPSAwKSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIkludmFsaWQgcG9ydCAlcy4gTXVzdCBiZSAxIC0gMjU1XG4iLCBhcmd2WzJdKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoIXN0cmNtcChhcmd2WzFdLCAib3BlbiIpKSB7CiAgICAgICAgcmMgPSBsb3JhX2FwcF9wb3J0X29wZW4ocG9ydCwgbG9yYV9hcHBfc2hlbGxfdHhkX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9yYV9hcHBfc2hlbGxfcnhkX2Z1bmMpOwogICAgICAgIGlmIChyYyA9PSBMT1JBX0FQUF9TVEFUVVNfT0spIHsKICAgICAgICAgICAgY29uc29sZV9wcmludGYoIk9wZW5lZCBhcHAgcG9ydCAldVxuIiwgcG9ydCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZV9wcmludGYoIkZhaWxlZCB0byBvcGVuIGFwcCBwb3J0ICV1IGVycj0lZFxuIiwgcG9ydCwgcmMpOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiY2xvc2UiKSkgewogICAgICAgIHJjID0gbG9yYV9hcHBfcG9ydF9jbG9zZShwb3J0KTsKICAgICAgICBpZiAocmMgPT0gTE9SQV9BUFBfU1RBVFVTX09LKSB7CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJDbG9zZWQgYXBwIHBvcnQgJXVcbiIsIHBvcnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJGYWlsZWQgdG8gY2xvc2UgYXBwIHBvcnQgJXUgZXJyPSVkXG4iLCBwb3J0LCByYyk7CiAgICAgICAgfQogICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICJjZmciKSkgewogICAgICAgIGlmIChhcmdjICE9IDQpIHsKICAgICAgICAgICAgY29uc29sZV9wcmludGYoIkludmFsaWQgIyBvZiBhcmd1bWVudHMuXG4iKTsKICAgICAgICAgICAgZ290byBjbWRfYXBwX3BvcnRfZXJyOwogICAgICAgIH0KICAgICAgICByZXRyaWVzID0gcGFyc2VfdWxsX2JvdW5kcyhhcmd2WzNdLCAxLCBNQVhfQUNLX1JFVFJJRVMsICZyYyk7CiAgICAgICAgaWYgKHJjKSB7CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnZhbGlkICMgb2YgcmV0cmllcy4gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIChpbmNsdXN2ZSlcbiIsIE1BWF9BQ0tfUkVUUklFUyk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgcmMgPSBsb3JhX2FwcF9wb3J0X2NmZyhwb3J0LCByZXRyaWVzKTsKICAgICAgICBpZiAocmMgPT0gTE9SQV9BUFBfU1RBVFVTX09LKSB7CiAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJBcHAgcG9ydCAldSBjb25maWd1cmVkIHcvcmV0cmllcz0ldVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgcmV0cmllcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZV9wcmludGYoIkNhbm5vdCBjb25maWd1cmUgcG9ydCAldSBlcnI9JWRcbiIsIHBvcnQsIHJjKTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgInNob3ciKSkgewogICAgICAgIGlmIChyYyA9PSBMT1JBX0FQUF9TVEFUVVNfT0spIHsKICAgICAgICAgICAgY29uc29sZV9wcmludGYoImFwcCBwb3J0ICV1XG4iLCBwb3J0KTsKICAgICAgICAgICAgLyogWFhYOiBpbXBsZW1lbnQgKi8KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiQ2Fubm90IHNob3cgYXBwIHBvcnQgJXUgZXJyPSVkXG4iLCBwb3J0LCByYyk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiSW52YWxpZCBwb3J0IGNvbW1hbmQuXG4iKTsKICAgICAgICBnb3RvIGNtZF9hcHBfcG9ydF9lcnI7CiAgICB9CgogICAgcmV0dXJuIDA7CgpjbWRfYXBwX3BvcnRfZXJyOgogICAgY29uc29sZV9wcmludGYoIlVzYWdlOlxuIik7CiAgICBjb25zb2xlX3ByaW50ZigiXHRsYXNfYXBwX3BvcnQgb3BlbiA8cG9ydCBudW0+XG4iKTsKICAgIGNvbnNvbGVfcHJpbnRmKCJcdGxhc19hcHBfcG9ydCBjbG9zZSA8cG9ydCBudW0+XG4iKTsKICAgIGNvbnNvbGVfcHJpbnRmKCJcdGxhc19hcHBfcG9ydCBjZmcgPHBvcnQgbnVtPiA8cmV0cmllcz5cbiIpOwogICAgY29uc29sZV9wcmludGYoIlxub3QgaW1wbGVtZW50ZWQhIGxhc19hcHBfcG9ydCBzaG93IDxwb3J0IG51bSB8IGFsbD5cbiIpOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbGFzX2NtZF9hcHBfdHgoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBpbnQgcmM7CiAgICB1aW50OF90IHBvcnQ7CiAgICB1aW50OF90IGxlbjsKICAgIHVpbnQ4X3QgcGt0X3R5cGU7CiAgICBzdHJ1Y3Qgb3NfbWJ1ZiAqb207CiAgICBNY3BzX3QgbWNwc190eXBlOwoKICAgIGlmIChhcmdjIDwgNCkgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnZhbGlkICMgb2YgYXJndW1lbnRzXG4iKTsKICAgICAgICBnb3RvIGNtZF9hcHBfdHhfZXJyOwogICAgfQoKICAgIHBvcnQgPSBwYXJzZV91bGxfYm91bmRzKGFyZ3ZbMV0sIDEsIDI1NSwgJnJjKTsKICAgIGlmIChyYyAhPSAwKSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIkludmFsaWQgcG9ydCAlcy4gTXVzdCBiZSAxIC0gMjU1XG4iLCBhcmd2WzJdKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGxlbiA9IHBhcnNlX3VsbF9ib3VuZHMoYXJndlsyXSwgMSwgTE9SQV9BUFBfU0hFTExfTUFYX0FQUF9QQVlMT0FELCAmcmMpOwogICAgaWYgKHJjICE9IDApIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiSW52YWxpZCBsZW5ndGguIE11c3QgYmUgMSAtICV1XG4iLAogICAgICAgICAgICAgICAgICAgICAgIExPUkFfQVBQX1NIRUxMX01BWF9BUFBfUEFZTE9BRCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBwa3RfdHlwZSA9IHBhcnNlX3VsbF9ib3VuZHMoYXJndlszXSwgMCwgMSwgJnJjKTsKICAgIGlmIChyYyAhPSAwKSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIkludmFsaWQgdHlwZS4gTXVzdCBiZSAwICh1bmNvbmZpcm1lZCkgb3IgMSAoY29uZmlybWVkKSIKICAgICAgICAgICAgICAgICAgICAgICAiXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobG9yYV9hcHBfbXR1KCkgPCBsZW4pIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiQ2FuIHNlbmQgYXQgbWF4ICVkIGJ5dGVzXG4iLCBsb3JhX2FwcF9tdHUoKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogQXR0ZW1wdCB0byBhbGxvY2F0ZSBhIG1idWYgKi8KICAgIG9tID0gbG9yYV9wa3RfYWxsb2MoKTsKICAgIGlmICghb20pIHsKICAgICAgICBjb25zb2xlX3ByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIG1idWZcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIEdldCBjb3JyZWN0IHBhY2tldCB0eXBlLiAqLwogICAgaWYgKHBrdF90eXBlID09IDApIHsKICAgICAgICBtY3BzX3R5cGUgPSBNQ1BTX1VOQ09ORklSTUVEOwogICAgfSBlbHNlIHsKICAgICAgICBtY3BzX3R5cGUgPSBNQ1BTX0NPTkZJUk1FRDsKICAgIH0KCiAgICByYyA9IG9zX21idWZfY29weWludG8ob20sIDAsIGxhc19jbWRfYXBwX3R4X2J1ZiwgbGVuKTsKICAgIGFzc2VydChyYyA9PSAwKTsKCiAgICByYyA9IGxvcmFfYXBwX3BvcnRfc2VuZChwb3J0LCBtY3BzX3R5cGUsIG9tKTsKICAgIGlmIChyYykgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJGYWlsZWQgdG8gc2VuZCB0byBwb3J0ICV1IGVycj0lZFxuIiwgcG9ydCwgcmMpOwogICAgICAgIG9zX21idWZfZnJlZV9jaGFpbihvbSk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJQYWNrZXQgc2VudCBvbiBwb3J0ICV1XG4iLCBwb3J0KTsKICAgIH0KCiAgICByZXR1cm4gMDsKCmNtZF9hcHBfdHhfZXJyOgogICAgY29uc29sZV9wcmludGYoIlVzYWdlOlxuIik7CiAgICBjb25zb2xlX3ByaW50ZigiXHRsYXNfYXBwX3R4IDxwb3J0PiA8bGVuPiA8dHlwZT5cbiIpOwogICAgY29uc29sZV9wcmludGYoIldoZXJlOlxuIik7CiAgICBjb25zb2xlX3ByaW50ZigiXHRwb3J0ID0gcG9ydCBudW1iZXIgb24gd2hpY2ggdG8gc2VuZFxuIik7CiAgICBjb25zb2xlX3ByaW50ZigiXHRsZW4gPSBzaXplIG4gYnl0ZXMgb2YgYXBwIGRhdGFcbiIpOwogICAgY29uc29sZV9wcmludGYoIlx0dHlwZSA9IDAgZm9yIHVuY29uZmlybWVkLCAxIGZvciBjb25maXJtZWRcbiIpOwogICAgY29uc29sZV9wcmludGYoIlx0ZXg6IGxhc19hcHBfdHggMTAgMjAgMVxuIik7CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbGFzX2NtZF9saW5rX2NoayhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGludCByYzsKCiAgICByYyA9IGxvcmFfYXBwX2xpbmtfY2hlY2soKTsKICAgIGlmIChyYykgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJMaW5rIGNoZWNrIHN0YXJ0IGZhaWx1cmUgZXJyPSVkXG4iLCByYyk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJTZW5kaW5nIGxpbmsgY2hlY2tcbiIpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbGFzX2NtZF9qb2luKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50IHJjOwogICAgdWludDhfdCBhdHRlbXB0czsKCiAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBhdHRlbXB0cyAqLwogICAgaWYgKGFyZ2MgIT0gMikgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnZhbGlkICMgb2YgYXJndW1lbnRzXG4iKTsKICAgICAgICBnb3RvIGNtZF9qb2luX2VycjsKICAgIH0KCiAgICBhdHRlbXB0cyA9IHBhcnNlX3VsbF9ib3VuZHMoYXJndlsxXSwgMCwgMjU1LCAmcmMpOwogICAgaWYgKHJjKSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIkVycm9yOiBjb3VsZCBub3QgcGFyc2UgYXR0ZW1wdHMuIE11c3QgYmUgMCAtIDI1NVxuIik7CgogICAgfQoKICAgIHJjID0gbG9yYV9hcHBfam9pbihnX2xvcmFfZGV2X2V1aSwgZ19sb3JhX2FwcF9ldWksIGdfbG9yYV9hcHBfa2V5LGF0dGVtcHRzKTsKICAgIGlmIChyYykgewogICAgICAgIGNvbnNvbGVfcHJpbnRmKCJKb2luIGF0dGVtcHQgc3RhcnQgZmFpbHVyZSBlcnI9JWRcbiIsIHJjKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZV9wcmludGYoIkF0dGVtcHRpbmcgdG8gam9pbi4uLlxuIik7CiAgICB9CiAgICByZXR1cm4gMDsKCmNtZF9qb2luX2VycjoKICAgIGNvbnNvbGVfcHJpbnRmKCJVc2FnZTpcbiIpOwogICAgY29uc29sZV9wcmludGYoIlx0bGFzX2pvaW4gPGF0dGVtcHRzPlxuIik7CiAgICBjb25zb2xlX3ByaW50ZigiV2hlcmU6XG4iKTsKICAgIGNvbnNvbGVfcHJpbnRmKCJcdGF0dGVtcHRzID0gIyBvZiBqb2luIHJlcXVlc3RzIHRvIHNlbmQgYmVmb3JlIGZhaWx1cmUiCiAgICAgICAgICAgICAgICAgICAiICgwIC0yNTUp31xuIik7CiAgICBjb25zb2xlX3ByaW50ZigiXHRleDogbGFzX2pvaW4gMTBcbiIpOwogICAgcmV0dXJuIDA7Cn0KCnZvaWQKbGFzX2NtZF9pbml0KHZvaWQpCnsKICAgIGludCBpOwogICAgaW50IHJjOwoKICAgIC8qIFNldCB0aGUgam9pbiBjYWxsYmFjayAqLwogICAgbG9yYV9hcHBfc2V0X2pvaW5fY2IobG9yYV9hcHBfc2hlbGxfam9pbl9jYik7CgogICAgLyogU2V0IGxpbmsgY2hlY2sgY2FsbGJhY2sgKi8KICAgIGxvcmFfYXBwX3NldF9saW5rX2NoZWNrX2NiKGxvcmFfYXBwX3NoZWxsX2xpbmtfY2hrX2NiKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTEFTX05VTV9DTElfQ01EUzsgaSsrKSB7CiAgICAgICAgcmMgPSBzaGVsbF9jbWRfcmVnaXN0ZXIobGFzX2NtZHMgKyBpKTsKICAgICAgICBTWVNJTklUX1BBTklDX0FTU0VSVF9NU0coCiAgICAgICAgICAgIHJjID09IDAsICJGYWlsZWQgdG8gcmVnaXN0ZXIgbG9yYSBhcHAgc2hlbGwgQ0xJIGNvbW1hbmRzIik7CiAgICB9CgogICAgLyogSW5pdCBhcHAgdHggcGF5bG9hZCB0byBpbmNyZW1lbnRpbmcgcGF0dGVybiAqLwogICAgZm9yIChpID0gMDsgaSA8IExPUkFfQVBQX1NIRUxMX01BWF9BUFBfUEFZTE9BRDsgKytpKSB7CiAgICAgICAgbGFzX2NtZF9hcHBfdHhfYnVmW2ldID0gaTsKICAgIH0KfQo=