I2luY2x1ZGUgIi4uL2hhdXMuaCIKCmluaGVyaXQgIi9wL3NlcnZpY2Uvd2FyZ29uL3NtL3N0YXRlbWFjaGluZSI7CgojaW5jbHVkZSAiL3Avc2VydmljZS93YXJnb24vc20vc3RhdGVtYWNoaW5lLmgiCiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CgojZGVmaW5lIFNUQVRFX0lETEUgICAgICAgICAgIDAKI2RlZmluZSBTVEFURV9IT1VTRSAgICAgICAgICAxCiNkZWZpbmUgU1RBVEVfUk9PTSAgICAgICAgICAgMgojZGVmaW5lIFNUQVRFX0NIRVNUICAgICAgICAgIDMKI2RlZmluZSBTVEFURV9ERVRBSUwgICAgICAgICA0CiNkZWZpbmUgU1RBVEVfUkRFVEFJTCAgICAgICAgNQojZGVmaW5lIFNUQVRFX0NPTU1BTkQgICAgICAgIDYKI2RlZmluZSBTVEFURV9GSU5BTElaRSAgICAgICA3CiNkZWZpbmUgU1RBVEVfRVhJVFMgICAgICAgICAgOAoKI2RlZmluZSBTSUdfSU5JVElBTElaRSAgICAgICAwCiNkZWZpbmUgU0lHX0hPVVNFICAgICAgICAgICAgMQojZGVmaW5lIFNJR19IT1VTRV9ET05FICAgICAgIDIKI2RlZmluZSBTSUdfUk9PTSAgICAgICAgICAgICAzCiNkZWZpbmUgU0lHX0RPX0NIRVNUICAgICAgICAgNAojZGVmaW5lIFNJR19ET19ERVRBSUwgICAgICAgIDUKI2RlZmluZSBTSUdfREVUQUlMX0RPTkUgICAgICA2CiNkZWZpbmUgU0lHX1JERVRBSUxfRE9ORSAgICAgNwojZGVmaW5lIFNJR19DT01NQU5EX0RPTkUgICAgIDgKI2RlZmluZSBTSUdfRE9fRVhJVFMgICAgICAgICA5CiNkZWZpbmUgU0lHX1JPT01fRE9ORSAgICAgICAxMAoKcHJpdmF0ZSBub3NhdmUgc3RyaW5nIGZpbGU7CnByaXZhdGUgbm9zYXZlIGludCAgICBmaW5hbDsKcHJpdmF0ZSBub3NhdmUgb2JqZWN0IHJhdW07CnByaXZhdGUgbm9zYXZlIGludCAgICBucjsKcHJpdmF0ZSBub3NhdmUgb2JqZWN0IGhhdXNtZWlzdGVyOwpwcml2YXRlIG5vc2F2ZSBtaXhlZCAgaG1hcmdzOwoKc3RyaW5nIGR1bXAob2JqZWN0IGVudiwgaW50IGZpbmFsLCBtaXhlZCBhcmdzKTsKCnByaXZhdGUgc3RyaW5nIHNwZWNpYWwoc3RyaW5nIHN0cik7CnByaXZhdGUgdm9pZCByZW1vdmVPdXRwdXRGaWxlKCk7CnByaXZhdGUgdm9pZCBkdW1wSG91c2UoKTsKcHJpdmF0ZSB2b2lkIGR1bXBSb29tSGVhZGVyKCk7CnByaXZhdGUgdm9pZCBkdW1wQ2hlc3QoKTsKcHJpdmF0ZSB2b2lkIGR1bXBEZXRhaWxzKCk7CnByaXZhdGUgdm9pZCBkdW1wUmVhZERldGFpbHMoKTsKcHJpdmF0ZSB2b2lkIGR1bXBDb21tYW5kcygpOwpwcml2YXRlIHZvaWQgZG9GaW5hbGl6ZSgpOwpwcml2YXRlIHZvaWQgZHVtcEV4aXRzKCk7CnByaXZhdGUgdm9pZCBkdW1wUm9vbVRyYWlsZXIoKTsKcHJpdmF0ZSB2b2lkIGRvUmV0dXJuKCk7CnByaXZhdGUgdm9pZCBzUHJvcChzdHJpbmcgZmlsZSwgc3RyaW5nIHBOYW1lLCBzdHJpbmcgcFN0cik7CnN0YXRpYyB2b2lkIG1Qcm9wKHN0cmluZyBmaWxlLCBzdHJpbmcgcE5hbWUsIG1peGVkIG1hcF9sZGZpZWQsIGludCBwb3MsIGludCBzaWduYWwpOwpzdGF0aWMgdm9pZCBjUHJvcChzdHJpbmcgZmlsZSwgc3RyaW5nIHBOYW1lLCBtaXhlZCBjbWQsIGludCBwb3MsIGludCBzaWduYWwpOwpwcml2YXRlIHZvaWQgcHJldHR5U3RyaW5nKHN0cmluZyBmaWxlLCBzdHJpbmcgKnN0ciwgaW50IGluZGVudCk7CnByaXZhdGUgdm9pZCBwcmV0dHlBcnJheShzdHJpbmcgZmlsZSwgc3RyaW5nICphcnIsIGludCBzZXApOwpwcml2YXRlIHZvaWQgaGVhZGVyUm9vbSgpOwpwcml2YXRlIHZvaWQgdHJhaWxlclJvb20oKTsKcHJpdmF0ZSB2b2lkIGhlYWRlckhvdXNlKCk7CnByaXZhdGUgdm9pZCB0cmFpbGVySG91c2UoKTsKCmNyZWF0ZSgpCnsKICA6OmNyZWF0ZSgpOwogIHNldGV1aWQoZ2V0dWlkKCkpOwogIAogIEFkZFN0YXRlKFNUQVRFX0lETEUsIDAsIDApOwogIEFkZFN0YXRlKFNUQVRFX0hPVVNFLCAgICAjJ2R1bXBIb3VzZSwgMCk7CiAgQWRkU3RhdGUoU1RBVEVfUk9PTSwgICAgICMnZHVtcFJvb21IZWFkZXIsIDApOwogIEFkZFN0YXRlKFNUQVRFX0NIRVNULCAgICAjJ2R1bXBDaGVzdCwgMCk7CiAgQWRkU3RhdGUoU1RBVEVfREVUQUlMLCAgICMnZHVtcERldGFpbHMsIDApOwogIEFkZFN0YXRlKFNUQVRFX1JERVRBSUwsICAjJ2R1bXBSZWFkRGV0YWlscywgMCk7CiAgQWRkU3RhdGUoU1RBVEVfQ09NTUFORCwgICMnZHVtcENvbW1hbmRzLCAwKTsKICBBZGRTdGF0ZShTVEFURV9GSU5BTElaRSwgIydkb0ZpbmFsaXplLCAwKTsKICBBZGRTdGF0ZShTVEFURV9FWElUUywgICAgIydkdW1wRXhpdHMsIDApOwoKICBBZGRUcmFuc2l0aW9uKFNNX0lOVkFMSUQsIFNJR19JTklUSUFMSVpFLCBTVEFURV9JRExFLCAwKTsKCiAgLy8gWnVzdGFuZHN1ZWJlcmdhZW5nZSB6dW0gU2NocmVpYmVuIGRlcyBIYXVzZXMKICBBZGRUcmFuc2l0aW9uKFNUQVRFX0lETEUsIFNJR19IT1VTRSwgU1RBVEVfSE9VU0UsICMncmVtb3ZlT3V0cHV0RmlsZSk7CiAgQWRkVHJhbnNpdGlvbihTVEFURV9IT1VTRSwgU0lHX0hPVVNFX0RPTkUsIFNUQVRFX0lETEUsICMnZG9SZXR1cm4pOwoKICAvLyBadXN0YW5kc3VlYmVyZ2FlbmdlIHp1bSBTY2hyZWliZW4gZWluZXMgUmF1bXMKICBBZGRUcmFuc2l0aW9uKFNUQVRFX0lETEUsICAgICBTSUdfUk9PTSwgICAgICBTVEFURV9ST09NLCAjJ3JlbW92ZU91dHB1dEZpbGUpOwogIEFkZFRyYW5zaXRpb24oU1RBVEVfUk9PTSwgICAgIFNJR19ET19DSEVTVCwgIFNUQVRFX0NIRVNUKTsKICBBZGRUcmFuc2l0aW9uKFNUQVRFX1JPT00sICAgICBTSUdfRE9fREVUQUlMLCBTVEFURV9ERVRBSUwpOwogIEFkZFRyYW5zaXRpb24oU1RBVEVfQ0hFU1QsICAgIFNJR19ET19ERVRBSUwsIFNUQVRFX0RFVEFJTCk7CiAgQWRkVHJhbnNpdGlvbihTVEFURV9ERVRBSUwsICAgU0lHX0RFVEFJTF9ET05FLCAgU1RBVEVfUkRFVEFJTCk7CiAgQWRkVHJhbnNpdGlvbihTVEFURV9SREVUQUlMLCAgU0lHX1JERVRBSUxfRE9ORSwgU1RBVEVfQ09NTUFORCk7CiAgQWRkVHJhbnNpdGlvbihTVEFURV9DT01NQU5ELCAgU0lHX0NPTU1BTkRfRE9ORSwgU1RBVEVfRklOQUxJWkUpOwogIEFkZFRyYW5zaXRpb24oU1RBVEVfRklOQUxJWkUsIFNJR19ET19FWElUUywgIFNUQVRFX0VYSVRTKTsKICBBZGRUcmFuc2l0aW9uKFNUQVRFX0ZJTkFMSVpFLCBTSUdfUk9PTV9ET05FLCBTVEFURV9JRExFLCAjJ2RvUmV0dXJuKTsKICBBZGRUcmFuc2l0aW9uKFNUQVRFX0VYSVRTLCAgICBTSUdfUk9PTV9ET05FLCBTVEFURV9JRExFLCAjJ2R1bXBSb29tVHJhaWxlcik7CiAgCiAgU3RhdGVUcmFuc2l0aW9uKFNJR19JTklUSUFMSVpFKTsKfQoKCi8vIEVyemV1Z2Ugbm9ybWFsZW4gTFBDLVF1ZWxsY29kZSBhdXMgZWluZW0gSGF1cyBvZGVyIFJhdW0uCi8vCi8vIFBhcmFtZXRlcjoKLy8gICBlbnY6IERhcyBIYXVzIG9kZXIgZGVyIFJhdW0sIGF1cyBkZW0gUXVlbGxjb2RlIGVyemV1Z3Qgd2VyZGVuIHNvbGwKLy8gICBmaW46IEZhbGxzIGdsZWljaCAwLCBzbyB3aXJkIFF1ZWxsY29kZSBmdWVyIFR5cG9maXhlcyBvLmFlLgovLyAgICAgICAgZXJ6ZXVndDsgZGFzIGVyemV1Z3RlIEZpbGUgaGVpc3N0IGltbWVyICdmaXhlZC5jJy4KLy8gICAgICAgIEFuZGVybmZhbGxzIHdpcmQgUXVlbGxjb2RlIGZ1ZXIgZWluIGVpZ2Vuc3RhZW5kaWdlcyBPYmpla3QKLy8gICAgICAgIGVyemV1Z3QuIERpZXNlcyBrYW5uIHouQi4genVtIEFuc2NobHVzcyBhbHMgIk1hZ2llcmhhdXMiCi8vICAgICAgICB2ZXJ3ZW5kZXQgd2VyZGVuLiBEaWUgZXJ6ZXVndGVuIEZpbGVzIGhlaXNzZW4KLy8gICAgICAgICdyZXAvPG5hbWU+cmF1bTxucj4uYycgYnp3LiAncmVwLzxuYW1lPmhhdXMuYycuIEJlZmluZGV0IHNpY2gKLy8gICAgICAgIGluIGRlbSBSYXVtIGRpZSBUcnVoZSwgd2lyZCB6dXNhZXR6bGljaCBkaWUgRGF0ZWkKLy8gICAgICAgICdyZXAvPG5hbWU+dHJ1aGUuYycgZ2VzY2hyaWViZW4uCi8vCi8vIFJ1ZWNrZ2FiZXdlcnQ6Ci8vICAgRGVyIERhdGVpbmFtZSwgaW4gZGVuIGRpZSBEYXRlbiBnZXNjaHJpZWJlbiB3dXJkZW4uCgpzdHJpbmcKZHVtcChvYmplY3QgZW52LCBpbnQgZmluLCBtaXhlZCBhcmdzKQp7CiAgc3RyaW5nIG91dDsKICBpbnQgbnVtOwoKICBoYXVzbWVpc3RlciA9IHByZXZpb3VzX29iamVjdCgpOwogIGhtYXJncyA9IGFyZ3M7CiAgCiAgaWYgKFF1ZXJ5U3RhdGUoKSAhPSBTVEFURV9JRExFKQogIHsKICAgIHdyaXRlKCJEZXIgR2VuZXJhdG9yIGFyYmVpdGV0IG5vY2guLi5cbkJpdHRlIHdhcnRlbiFcbiIpOwogICAgcmV0dXJuICI8a2VpbmUgRGF0ZWkgZ2VuZXJpZXJ0PlxuIjsKICB9CiAgCiAgLy8gRmFsbHMgZWluIFJhdW0gZ2VuZXJpZXJ0IHdpcmQsIGVyaGFlbHQgPG5yPiBkaWUgUmF1bW51bW1lci4KICAvLyBCZWkgZGVyIEF1c3NlbmFuc2ljaHQgZGVzIEhhdXNlcyB3aXJkIDxucj4gYXVmIC0xIGdlc2V0enQuCiAgaWYgKHNzY2FuZihvYmplY3RfbmFtZShlbnYpLCAiJXNyYXVtJWQiLCBvdXQsIG51bSkgPCAyKQogIHsKICAgIG51bSA9IC0xOwogIH0KICAKICBpZiAoZmluKQogIHsKICAgIG91dCA9IFBBVEgrInJlcC8iK2Vudi0+UXVlcnlPd25lcigpOwoKICAgIGlmIChudW0gPj0gMCkKICAgIHsKICAgICAgb3V0ICs9ICJyYXVtIitudW0rIi5jIjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgb3V0ICs9ICJoYXVzLmMiOwogICAgfQogIH0KICBlbHNlCiAgewogICAgb3V0ID0gUEFUSCsiZml4ZWQuYyI7CiAgfQoKICAvLyBJbmZvcm1hdGlvbmVuIGZ1ZXIgZGllIFN0YXRlbWFjaGluZSBzZXR6ZW4KICBmaWxlID0gb3V0OwogIGZpbmFsID0gZmluOwogIHJhdW0gPSBlbnY7CiAgbnIgPSBudW07CgogIGlmIChudW0gPj0gMCkKICB7CiAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX1JPT00pOwogIH0KICBlbHNlCiAgewogICAgU3RhdGVUcmFuc2l0aW9uKFNJR19IT1VTRSk7CiAgfQogIHJldHVybiBvdXQ7Cn0KCi8vIFNvbmRlcnplaWNoZW4gXCwgIiB1bmQgVEFCIGtvcnJla3QgdW13YW5kZWxuCnByaXZhdGUgc3RyaW5nIHNwZWNpYWwoc3RyaW5nIHMpCnsKICBzID0gaW1wbG9kZShleHBsb2RlKHMsICJcXCIpLCAiXFxcXCIpOwogIHMgPSBpbXBsb2RlKGV4cGxvZGUocywgIlx0IiksICJcXHQiKTsKICBzID0gaW1wbG9kZShleHBsb2RlKHMsICJcIiIpLCAiXFxcIiIpOwoKICByZXR1cm4gczsKfQoKLyoqKiBGdW5rdGlvbmVuIHp1bSBHZW5lcmllcmVuIGVpbmVyIERhdGVpIGF1cyBkZW4gUHJvcGVydGllcyBkZXMgSGF1c2VzICoqKi8KCiNkZWZpbmUgRVhJVF9UTVBMICJcIi9wbGF5ZXJzLyVzL3NlaGVyaGF1cy8lc3JhdW0lZFwiIgoKcHJpdmF0ZSB2b2lkCnJlbW92ZU91dHB1dEZpbGUoKQp7CiAgY2F0Y2gocm0oZmlsZSkpOwp9Cgpwcml2YXRlIHZvaWQKZHVtcEhvdXNlKCkKewogIGhlYWRlckhvdXNlKCk7CiAgCiAgc1Byb3AoZmlsZSwgIlBfU0hPUlQiLCByYXVtLT5RdWVyeVByb3AoUF9TSE9SVCkpOwogIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CiAgc1Byb3AoZmlsZSwgIlBfTE9ORyIsIHJhdW0tPlF1ZXJ5UHJvcChQX0xPTkcpKTsKICB3cml0ZV9maWxlKGZpbGUsICJcbiIpOwoKICBpZiAoZmluYWwpCiAgewogICAgbWl4ZWQgbjsKCiAgICB3cml0ZV9maWxlKGZpbGUsICIgIFNldFByb3AoUF9OT0dFVCwgMSk7XG4iKTsKICAgIHdyaXRlX2ZpbGUoZmlsZSwKICAgICAgICAgICAgICAgIiAgU2V0UHJvcChQX0dFTkRFUiwgIisKICAgICAgICAgICAgICAgKHsiTkVVVEVSIiwiTUFMRSIsIkZFTUFMRSJ9KVtyYXVtLT5RdWVyeVByb3AoUF9HRU5ERVIpXSsKICAgICAgICAgICAgICAgIiApO1xuICBTZXRQcm9wKFBfTkFNRSwgIik7CiAgICBuID0gcmF1bS0+UXVlcnlQcm9wKFBfTkFNRSk7CgogICAgaWYgKHN0cmluZ3AobikpCiAgICB7CiAgICAgIHdyaXRlX2ZpbGUoZmlsZSwgIlwiIituKyJcIiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBwcmV0dHlBcnJheShmaWxlLCBuLCAwKTsKICAgIH0KICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiApO1xuXG4gIEFkZElkKCAiKTsKICAgIHByZXR0eUFycmF5KGZpbGUsCiAgICAgICAgICAgICAgICByYXVtLT5RdWVyeVByb3AoUF9JRFMpLSh7ICJzZWhlXHJoYXVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIityYXVtLT5RdWVyeU93bmVyKCkrImhhdXMiIH0pLAogICAgICAgICAgICAgICAgMCk7CiAgICB3cml0ZV9maWxlKGZpbGUsICIgKTtcbiIpOwogIH0KICB0cmFpbGVySG91c2UoKTsKCiAgU3RhdGVUcmFuc2l0aW9uKFNJR19IT1VTRV9ET05FKTsKfQoKcHJpdmF0ZSB2b2lkCmR1bXBSb29tSGVhZGVyKCkKewogIGhlYWRlclJvb20oKTsKICAKICBzUHJvcChmaWxlLCAiUF9JTlRfU0hPUlQiLCByYXVtLT5RdWVyeVByb3AoUF9JTlRfU0hPUlQpKTsKICB3cml0ZV9maWxlKGZpbGUsICJcbiIpOwogIHNQcm9wKGZpbGUsICJQX0lOVF9MT05HIiwgcmF1bS0+UXVlcnlQcm9wKFBfSU5UX0xPTkcpKTsKICB3cml0ZV9maWxlKGZpbGUsICJcbiIpOwoKICBpZiAoZmluYWwgJiYgcmF1bS0+UXVlcnlQcm9wKEhfQ0hFU1QpKQogIHsKICAgIFN0YXRlVHJhbnNpdGlvbihTSUdfRE9fQ0hFU1QpOwogIH0KICBlbHNlCiAgewogICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ET19ERVRBSUwpOwogIH0KfQoKcHJpdmF0ZSB2b2lkCmR1bXBDaGVzdCgpCnsKICBtaXhlZCBuOwogIHN0cmluZyBjZmlsZTsKICBvYmplY3QgY2hlc3Q7CgogIGNmaWxlID0gUEFUSCsicmVwLyIrcmF1bS0+UXVlcnlPd25lcigpKyJ0cnVoZS5jIjsKICBjaGVzdCA9IHByZXNlbnQoVFJVSEUsIHJhdW0pOwogIAogIGNhdGNoKHJtKGNmaWxlKSk7CgogIHdyaXRlX2ZpbGUoY2ZpbGUsCiAgICAgICAgICAgICAiI2luY2x1ZGUgPHByb3BlcnRpZXMuaD5cbiNpbmNsdWRlIDxtb3ZpbmcuaD5cblxuIgogICAgICAgICAgICAgImluaGVyaXQgXCIvZC93dWVzdGUvZHVyaWFuL2JlaGFlbHRlclwiO1xuXG4iCiAgICAgICAgICAgICAidm9pZCBjcmVhdGUoKVxue1xuICBpZighY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47XG5cbiIKICAgICAgICAgICAgICIgIDo6Y3JlYXRlKCk7XG5cbiIgKTsKICBzUHJvcChjZmlsZSwgIlBfU0hPUlQiLCBjaGVzdC0+UXVlcnlQcm9wKFBfU0hPUlQpKTsKICBzUHJvcChjZmlsZSwgIlBfTE9ORyIsICBjaGVzdC0+UXVlcnlQcm9wKFBfTE9ORykpOwoKICB3cml0ZV9maWxlKGNmaWxlLCAiICBTZXRQcm9wKFBfTk9HRVQsIDEpO1xuIik7CiAgd3JpdGVfZmlsZShjZmlsZSwKICAgICAgICAgICAgICIgIFNldFByb3AoUF9HRU5ERVIsICIrCiAgICAgICAgICAgICAoeyJORVVURVIiLCJNQUxFIiwiRkVNQUxFIn0pW2NoZXN0LT5RdWVyeVByb3AoUF9HRU5ERVIpXSsKICAgICAgICAgICAgICIgKTtcbiAgU2V0UHJvcChQX05BTUUsICIpOwoKICBuID0gY2hlc3QtPlF1ZXJ5UHJvcChQX05BTUUpOwogIGlmIChzdHJpbmdwKG4pKQogIHsKICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICJcIiIrbisiXCIiKTsKICB9CiAgZWxzZQogIHsKICAgIHByZXR0eUFycmF5KGZpbGUsIG4sIDApOwogIH0KICB3cml0ZV9maWxlKGNmaWxlLCAiICk7XG5cbiAgQWRkSWQoICIpOwogIHByZXR0eUFycmF5KGNmaWxlLCBjaGVzdC0+UXVlcnlQcm9wKFBfSURTKS0oeyBUUlVIRSB9KSwgMCk7CiAgd3JpdGVfZmlsZShjZmlsZSwgIiApO1xuIik7CgogIGlmICgobj1jaGVzdC0+UXVlcnlQcm9wKFBfQURKRUNUSVZFUykpICYmIHNpemVvZihuKSkKICB7CiAgICB3cml0ZV9maWxlKGNmaWxlLCAiXG4gIEFkZEFkamVjdGl2ZSggIik7CiAgICBwcmV0dHlBcnJheShjZmlsZSwgbiwgMCk7CiAgICB3cml0ZV9maWxlKGNmaWxlLCAiICk7XG4iKTsKICB9CiAgaWYgKChuPWNoZXN0LT5RdWVyeVByb3AoUF9OQU1FX0FESikpICYmIHNpemVvZihuKSkKICB7CiAgICB3cml0ZV9maWxlKGNmaWxlLCAiXG4gIFNldFByb3AoUF9OQU1FX0FESiwgIik7CiAgICBwcmV0dHlBcnJheShjZmlsZSwgbiwgMCk7CiAgICB3cml0ZV9maWxlKGNmaWxlLCAiICk7XG4iKTsKICB9CiAgd3JpdGVfZmlsZShjZmlsZSwgIn1cbiIpOwoKICBTdGF0ZVRyYW5zaXRpb24oU0lHX0RPX0RFVEFJTCk7Cn0KCnByaXZhdGUgdm9pZApkdW1wRGV0YWlscygpCnsKICBtYXBwaW5nIHByb3A7CiAgbWl4ZWQgZGV0OwogIAogIHByb3AgPSByYXVtLT5RdWVyeVByb3AoUF9ERVRBSUxTKTsKCiAgaWYgKHNpemVvZihwcm9wKSkKICB7CiAgICBkZXQgPSBWRVJXQUxURVItPlBDcnVuY2gocHJvcCk7CiAgICAvLyBuZXh0IHN0YXRlIHRyYW5zaXRpb24gaGFwcGVucyB3aGVuIGRvX21Qcm9wIGlzIGRvbmUKICAgIG1Qcm9wKGZpbGUsICJBZGREZXRhaWwiLCBkZXQsIHNpemVvZihkZXQpLTEsIFNJR19ERVRBSUxfRE9ORSk7CiAgfQogIGVsc2UKICB7CiAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX0RFVEFJTF9ET05FKTsKICB9Cn0KCnByaXZhdGUgdm9pZApkdW1wUmVhZERldGFpbHMoKQp7CiAgbWFwcGluZyBwcm9wOwogIG1peGVkIHJkZXQ7CiAgCiAgcHJvcCA9IHJhdW0tPlF1ZXJ5UHJvcChQX1JFQURfREVUQUlMUyk7CgogIGlmIChzaXplb2YocHJvcCkpCiAgewogICAgcmRldCA9IFZFUldBTFRFUi0+UENydW5jaChwcm9wKTsKICAgIC8vIG5leHQgc3RhdGUgdHJhbnNpdGlvbiBoYXBwZW5zIHdoZW4gZG9fbVByb3AgaXMgZG9uZQogICAgbVByb3AoZmlsZSwgIkFkZFJlYWREZXRhaWwiLCByZGV0LCBzaXplb2YocmRldCktMSwgU0lHX1JERVRBSUxfRE9ORSk7CiAgfQogIGVsc2UKICB7CiAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX1JERVRBSUxfRE9ORSk7CiAgfQp9Cgpwcml2YXRlIHZvaWQKZHVtcENvbW1hbmRzKCkKewogIG1hcHBpbmcgY29tbTsKICBtaXhlZCBjbWQ7CiAgCiAgY29tbSA9IHJhdW0tPlF1ZXJ5UHJvcChIX0NPTU1BTkRTKTsKCiAgaWYgKHNpemVvZihjb21tKSkKICB7CiAgICBjbWQgPSBWRVJXQUxURVItPlBDcnVuY2goY29tbSk7CiAgICAvLyBuZXh0IHN0YXRlIHRyYW5zaXRpb24gaGFwcGVucyB3aGVuIGRvX2NQcm9wIGlzIGRvbmUKICAgIGNQcm9wKGZpbGUsICJBZGRVc2VyQ21kIiwgY21kLCBzaXplb2YoY21kKS0xLCBTSUdfQ09NTUFORF9ET05FKTsKICB9CiAgZWxzZQogIHsKICAgIFN0YXRlVHJhbnNpdGlvbihTSUdfQ09NTUFORF9ET05FKTsKICB9Cn0KCnByaXZhdGUgdm9pZApkb0ZpbmFsaXplKCkKewogIGlmIChmaW5hbCkKICB7CiAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX0RPX0VYSVRTKTsKICB9CiAgZWxzZQogIHsKICAgIFN0YXRlVHJhbnNpdGlvbihTSUdfUk9PTV9ET05FKTsKICB9Cn0KCnByaXZhdGUgdm9pZApkdW1wRXhpdHMoKQp7CiAgc3RyaW5nICprLCBvOwogIG1hcHBpbmcgcHJvcDsKICBpbnQgaSwgbnVtOwoKICBwcm9wID0gcmF1bS0+UXVlcnlQcm9wKFBfRVhJVFMpOwogIGsgPSBtX2luZGljZXMocHJvcCk7CiAgaWYgKG1lbWJlcihrLCAicmF1cyIpID49IDApCiAgewogICAgayAtPSAoeyAicmF1cyIgfSk7CiAgICB3cml0ZV9maWxlKGZpbGUsIHNwcmludGYoIiAgQWRkRXhpdCggXCJyYXVzXCIsIFwiJXNcIik7XG4iLCBwcm9wWyJyYXVzIl0pKTsKICB9CiAgCiAgZm9yIChpPXNpemVvZihrKS0xOyBpPj0wOyBpLS0pCiAgewogICAgaWYgKHNzY2FuZihwcm9wW2tbaV1dLCBQQVRIKyIlc3JhdW0lZCIsIG8sIG51bSkgIT0gMikKICAgIHsKICAgICAgcHJpbnRmKCJLb21pc2NoZXIgRXhpdCAoJU8pXG4lcyAtPiAlc1xuIiwgcmF1bSwga1tpXSwgcHJvcFtrW2ldXSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmIChvID09IHJhdW0tPlF1ZXJ5T3duZXIoKSkKICAgICAgewogICAgICAgIG8gPSBzcHJpbnRmKEVYSVRfVE1QTCwgbywgbywgbnVtKTsKICAgICAgICB3cml0ZV9maWxlKGZpbGUsIHNwcmludGYoIiAgQWRkRXhpdCggXCIlc1wiLCAlcyk7XG4iLCBrW2ldLCBvKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgd3JpdGVfZmlsZShmaWxlLAogICAgICAgICAgICAgICAgICAgc3ByaW50ZigiICBBZGRFeGl0KCBcIiVzXCIsIFwiJXNcIik7XG4iLCBrW2ldLCBwcm9wW2tbaV1dKSk7CiAgICAgICAgcHJpbnRmKCJFeGl0IHZvbiAlTyBuYWNoICVzIVxuIiwgcmF1bSwgcHJvcFtrW2ldXSk7CiAgICAgIH0KICAgIH0KICB9CiAgU3RhdGVUcmFuc2l0aW9uKFNJR19ST09NX0RPTkUpOwp9Cgpwcml2YXRlIHZvaWQKZHVtcFJvb21UcmFpbGVyKCkKewogIHRyYWlsZXJSb29tKCk7CiAgZG9SZXR1cm4oKTsKfQoKcHJpdmF0ZSB2b2lkCmRvUmV0dXJuKCkKewogIGlmIChoYXVzbWVpc3RlciAhPSAwKQogIHsKICAgIGFwcGx5KCMnY2FsbF9vdGhlciwgaGF1c21laXN0ZXIsICJHZW5lcmF0aW9uRG9uZSIsIGhtYXJncyk7CiAgfQogIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOwp9Cgpwcml2YXRlIHZvaWQKc1Byb3Aoc3RyaW5nIGYsIHN0cmluZyBwTmFtZSwgc3RyaW5nIHBTdHIpCnsKICBzdHJpbmcgKnN0cjsKCiAgd3JpdGVfZmlsZShmLCAiICBTZXRQcm9wKCAiK3BOYW1lKyIsIik7CgogIGlmICghcFN0cikKICB7CiAgICB3cml0ZV9maWxlKGYsICIwICk7XG4iKTsKICAgIHJldHVybjsKICB9CgogIHBTdHIgPSBzcGVjaWFsKHBTdHIpOwoKICBpZiAoc2l6ZW9mKHN0cj1vbGRfZXhwbG9kZShwU3RyLCJcbiIpKSA+IDEpCiAgewogICAgcHJldHR5U3RyaW5nKGYsIHN0ciwgNCk7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoc2l6ZW9mKHN0cik9PTApCiAgICB7CiAgICAgIHN0ciA9ICh7IiJ9KTsKICAgIH0KICAgIHdyaXRlX2ZpbGUoZiwgIlxuICAgICBcIiIrc3RyWzBdKTsKCiAgICBpZiAocFN0cls8MV0gPT0gJ1xuJykKICAgIHsKICAgICAgd3JpdGVfZmlsZShmLCAiXFxuXCIiKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgd3JpdGVfZmlsZShmLCAiXCIiKTsKICAgIH0KICB9CiAgd3JpdGVfZmlsZShmLCAiICk7XG4iKTsKfQoKc3RhdGljIHZvaWQKbVByb3Aoc3RyaW5nIGZpbGUsIHN0cmluZyBwTmFtZSwgbWl4ZWQgY21kLCBpbnQgcG9zLCBpbnQgc2lnbmFsKQp7CiAgaW50IGk7CiAgc3RyaW5nICplcSwgdDE7CiAgCiAgZm9yIChpID0gcG9zOyAoaSA+PSAwKSAmJiAoZ2V0X2V2YWxfY29zdCgpID4gMTAwMDApOyAtLWkpCiAgewogICAgd3JpdGVfZmlsZShmaWxlLCAiICAiK3BOYW1lKyIoXG4gICAgIik7CiAgICBlcSA9IGNtZFtpXVswXTsKICAgIHQxID0gY21kW2ldWzFdOwoKICAgIHByZXR0eUFycmF5KGZpbGUsIGVxLCAwKTsKICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiwgIik7CgogICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDEpLCAiXG4iKSwgNik7CiAgICB3cml0ZV9maWxlKGZpbGUsICIgKTtcbiIpOwogIH0KCiAgLy8gRmFsbHMgd2lyIGRpZSBldmFsX2Nvc3QgYXVzZ2VyZWl6dCBoYWJlbiwgYWJlciBub2NoIG5pY2h0CiAgLy8gYWxsZSBFaW50cuRnZSBiZWFyYmVpdGV0IHd1cmRlbiwgd2lyZCBqZXR6dCBkaWUgbmFlY2hzdGUKICAvLyBSdW5kZSBnZXN0YXJ0ZXQKICBpZiAoaSA+PSAwKQogIHsKICAgIGNhbGxfb3V0KCJtUHJvcCIsIDEsIGZpbGUsIHBOYW1lLCBjbWQsIGksIHNpZ25hbCk7CiAgfQogIGVsc2UKICB7CiAgICAvLyBBbnNvbnN0ZW4gd2VjaHNlbG4gd2lyIGpldHp0IGluIGRlbiBuYWVjaHN0ZW4gWnVzdGFuZAogICAgd3JpdGVfZmlsZShmaWxlLCAiXG4iKTsKICAgIFN0YXRlVHJhbnNpdGlvbihzaWduYWwpOwogIH0KfQoKc3RhdGljIHZvaWQKY1Byb3Aoc3RyaW5nIGZpbGUsIHN0cmluZyBwTmFtZSwgbWl4ZWQgY21kLCBpbnQgcG9zLCBpbnQgc2lnbmFsKQp7CiAgc3RyaW5nIHQxLCB0MjsKICBtaXhlZCAgZXE7CiAgaW50IGk7CgogIGZvciAoaSA9IHBvczsgKGkgPj0gMCkgJiYgKGdldF9ldmFsX2Nvc3QoKSA+IDEwMDAwKTsgLS1pKQogIHsKICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiAgIitwTmFtZSsiKFxuICAgICIpOwogICAgZXEgPSBjbWRbaV1bMF07CiAgICB0MSA9IGNtZFtpXVsxXTsKICAgIHQyID0gY21kW2ldWzJdOwoKICAgIHByZXR0eUFycmF5KGZpbGUsIGVxLCAxKTsKICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiwgMCwgIik7CgogICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDEpLCAiXG4iKSwgNCk7CiAgICB3cml0ZV9maWxlKGZpbGUsICIsICIpOwogICAgCiAgICBpZiAodDIpCiAgICB7CiAgICAgIHByZXR0eVN0cmluZyhmaWxlLCBvbGRfZXhwbG9kZShzcGVjaWFsKHQyKSwgIlxuIiksIDQpOwogICAgfQogICAgZWxzZQogICAgewogICAgICB3cml0ZV9maWxlKGZpbGUsICIwIik7CiAgICB9CiAgICAKICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiApO1xuIik7CiAgfQoKICAvLyBGYWxscyB3aXIgZGllIGV2YWxfY29zdCBhdXNnZXJlaXp0IGhhYmVuLCBhYmVyIG5vY2ggbmljaHQKICAvLyBhbGxlIEVpbnRy5GdlIGJlYXJiZWl0ZXQgd3VyZGVuLCB3aXJkIGpldHp0IGRpZSBuYWVjaHN0ZQogIC8vIFJ1bmRlIGdlc3RhcnRldAogIGlmIChpID49IDApCiAgewogICAgY2FsbF9vdXQoImNQcm9wIiwgMSwgZmlsZSwgcE5hbWUsIGNtZCwgaSwgc2lnbmFsKTsKICB9CiAgZWxzZQogIHsKICAgIC8vIEFuc29uc3RlbiB3ZWNoc2VsbiB3aXIgamV0enQgaW4gZGVuIG5hZWNoc3RlbiBadXN0YW5kCiAgICB3cml0ZV9maWxlKGZpbGUsICJcbiIpOwogICAgU3RhdGVUcmFuc2l0aW9uKHNpZ25hbCk7CiAgfQp9Cgpwcml2YXRlIHZvaWQKcHJldHR5U3RyaW5nKHN0cmluZyBmLCBzdHJpbmcgKnN0ciwgaW50IGluZGVudCkKewogIHN0cmluZyBpbmQ7CiAgaW50IGk7CgogIGluZCA9IGV4dHJhY3QoIlxuICAgICAgICAgICIsMCxpbmRlbnQpOwoKICBpZiAoIXNpemVvZihzdHIpKQogIHsKICAgIHdyaXRlX2ZpbGUoZiwgaW5kKyIgXCJcXG5cIiIpOwogICAgcmV0dXJuOwogIH0KCiAgd3JpdGVfZmlsZShmLCBpbmQrIiBcIiIrc3RyWzBdKyJcXG5cIiIpOwoKICBmb3IgKGk9MTsgaTxzaXplb2Yoc3RyKTsgaSsrKQogIHsKICAgIHdyaXRlX2ZpbGUoZiwgaW5kKyIrXCIiK3N0cltpXSsiXFxuXCIiKTsKICB9Cn0KCnByaXZhdGUgdm9pZApwcmV0dHlBcnJheShzdHJpbmcgZiwgc3RyaW5nICphcnIsIGludCBzZXApCnsKICBpbnQgaSxqOwogIHN0cmluZyByZXMsIHQxLCB0MjsKCiAgd3JpdGVfZmlsZShmLCAiKHsiKTsKCiAgaWYgKHNpemVvZihhcnIpKQogIHsKICAgIHQxID0gKCJcIiIrYXJyWzBdKyJcIiIpOwogICAgcmVzID0gIiAiK3QxOwogICAgdDIgPSAiIjsKCiAgICBmb3IgKGk9MSwgaj1zaXplb2YoYXJyKTsgaTxqOyBpKyspCiAgICB7CiAgICAgIHQyID0gIlwiIithcnJbaV0rIlwiIjsKICAgICAgaWYgKCFzZXApCiAgICAgIHsKCWlmICgoc2l6ZW9mKHQxKSArIHNpemVvZih0MikpID4gNjkpCiAgICAgICAgewoJICByZXMgKz0gKCIsXG4gICAgICAgIit0Mik7CgkgIHQxID0gdDI7CgkgIHQyID0gIiI7Cgl9CgllbHNlIHsKCSAgdDEgKz0gKCIsICIrdDIpOwoJICByZXMgKz0gKCIsICIrdDIpOwoJfQogICAgICB9CiAgICAgIGVsc2UgewoJcmVzICs9ICgiLFxuICAgICAgICIrdDIpOwogICAgICB9CiAgICB9CiAgfQogIHdyaXRlX2ZpbGUoZiwgcmVzICsgIiB9KSIgKTsKfQoKcHJpdmF0ZSB2b2lkCmhlYWRlclJvb20oKQp7CiAgaWYgKGZpbmFsKQogIHsKICAgIHdyaXRlX2ZpbGUoZmlsZSwKICAgICAgICAgICAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG5cbiIKICAgICAgICAgICAgICAgImluaGVyaXQgXCJzdGQvcm9vbVwiO1xuIgogICAgICAgICAgICAgICAiaW5oZXJpdCBcIiIrUEFUSCsibW9kdWxlcy91c2VyY21kXCI7XG5cbiIKICAgICAgICAgICAgICAgImNyZWF0ZSgpXG4iCiAgICAgICAgICAgICAgICJ7XG4iCiAgICAgICAgICAgICAgICIgIHJvb206OmNyZWF0ZSgpO1xuIgogICAgICAgICAgICAgICAiICB1c2VyY21kOjpjcmVhdGUoKTtcblxuIgogICAgICAgICAgICAgICAiICBTZXRQcm9wKFBfTElHSFQsIDEpO1xuIgogICAgICAgICAgICAgICAiICBTZXRQcm9wKFBfSU5ET09SUywgMSk7XG5cbiIpOwogIH0KICBlbHNlCiAgewogICAgd3JpdGVfZmlsZShmaWxlLAogICAgICAgICAgICAgICAiI2luY2x1ZGUgXCJoYXVzLmhcIlxuIgogICAgICAgICAgICAgICAiI2luY2x1ZGUgPHByb3BlcnRpZXMuaD5cblxuIgogICAgICAgICAgICAgICAiaW5oZXJpdCBSQVVNO1xuIgogICAgICAgICAgICAgICAiaW5oZXJpdCBcIi9zdGQvdGhpbmcvbW92aW5nXCI7XG5cbiIKICAgICAgICAgICAgICAgImNyZWF0ZSgpXG4iCiAgICAgICAgICAgICAgICJ7XG4iCiAgICAgICAgICAgICAgICIgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47XG4iCiAgICAgICAgICAgICAgICIgIDo6Y3JlYXRlKCk7XG5cbiIKICAgICAgICAgICAgICAgIiAgU2V0T3duZXIoXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCIsICIrbnIrIik7XG4iCiAgICAgICAgICAgICAgICIgIExvYWQoKTtcblxuIgogICAgICAgICAgICAgICAiICBTZXRQcm9wKFBfREVUQUlMUywgKFtdKSk7XG4iCiAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9SRUFEX0RFVEFJTFMsIChbXSkpO1xuXG4iKTsKICB9Cn0KCnByaXZhdGUgdm9pZAp0cmFpbGVyUm9vbSgpCnsKICBpZiAoZmluYWwpCiAgewogICAgd3JpdGVfZmlsZShmaWxlLCAifVxuIik7CiAgfQogIGVsc2UKICB7CiAgICB3cml0ZV9maWxlKGZpbGUsCiAgICAgICAgICAgICAgICIgIFNhdmUoMSk7XG5cbiIKICAgICAgICAgICAgICAgIiAgeyBvYmplY3QgcmF1bTtcbiIKICAgICAgICAgICAgICAgIiAgICBpZiAocmF1bSA9IGZpbmRfb2JqZWN0KFJBVU1OQU1FKCIKICAgICAgICAgICAgICAgIlwiIityYXVtLT5RdWVyeU93bmVyKCkrIlwiLCAiK25yKyIpKSlcbiIKICAgICAgICAgICAgICAgIiAgICAgIHJhdW0tPkxvYWQoKTtcbiIKICAgICAgICAgICAgICAgIiAgfVxuXG4iCiAgICAgICAgICAgICAgICIgIGNhbGxfb3V0KFwicmVtb3ZlXCIsMCk7XG4iCiAgICAgICAgICAgICAgICJ9XG4iKTsKICB9Cn0KCnByaXZhdGUgdm9pZApoZWFkZXJIb3VzZSgpCnsKICBpZiAoZmluYWwpCiAgewogICAgd3JpdGVfZmlsZShmaWxlLAogICAgICAgICAgICAgICAiI2luY2x1ZGUgPHByb3BlcnRpZXMuaD5cbiIKICAgICAgICAgICAgICAgIiNpbmNsdWRlIDxtb3ZpbmcuaD5cbiIKICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiIitQQVRIKyJoYXVzLmhcIlxuXG4iCiAgICAgICAgICAgICAgICJpbmhlcml0IFwic3RkL3RoaW5nXCI7XG4iCiAgICAgICAgICAgICAgICJpbmhlcml0IEhBVVNUVUVSO1xuXG4iCiAgICAgICAgICAgICAgICJjcmVhdGUoKVxuIgogICAgICAgICAgICAgICAie1xuIgogICAgICAgICAgICAgICAiICB0aGluZzo6Y3JlYXRlKCk7XG4iCiAgICAgICAgICAgICAgICIgIGhhdXN0dWVyOjpjcmVhdGUoKTtcblxuIik7CiAgfQogIGVsc2UKICB7CiAgICB3cml0ZV9maWxlKGZpbGUsCiAgICAgICAgICAgICAgICIjaW5jbHVkZSBcImhhdXMuaFwiXG4iCiAgICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuXG4iCiAgICAgICAgICAgICAgICJpbmhlcml0IEhBVVM7XG4iCiAgICAgICAgICAgICAgICJpbmhlcml0IFwiL3N0ZC90aGluZy9tb3ZpbmdcIjtcblxuIgogICAgICAgICAgICAgICAiY3JlYXRlKClcbiIKICAgICAgICAgICAgICAgIntcbiIKICAgICAgICAgICAgICAgIiAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjtcbiIKICAgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIgogICAgICAgICAgICAgICAiICBTZXRPd25lcihcIiIrcmF1bS0+UXVlcnlPd25lcigpKyJcIlxuIgogICAgICAgICAgICAgICAiICBMb2FkKCk7XG5cbiIpOwogIH0KfQoKcHJpdmF0ZSB2b2lkCnRyYWlsZXJIb3VzZSgpCnsKICBpZiAoZmluYWwpCiAgewogICAgd3JpdGVfZmlsZShmaWxlLCByZWFkX2ZpbGUoUEFUSCsidG9vbHMvaGF1cy5hcHgiKSk7CiAgICB3cml0ZV9maWxlKGZpbGUsICIgIHRoaXNfcGxheWVyKCktPm1vdmUoIik7CiAgICB3cml0ZV9maWxlKGZpbGUsIHNwcmludGYoRVhJVF9UTVBMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdW0tPlF1ZXJ5T3duZXIoKSwgcmF1bS0+UXVlcnlPd25lcigpLCAwKSk7CiAgICB3cml0ZV9maWxlKGZpbGUsCiAgICAgICAgICAgICAgICIsXG5cdFx0XHRNX0dPLCAwLCBcImJldHJpdHQgXCIrbmFtZShXRU4sMSksIFwia29tbXQgaGVyZWluXCIpO1xuIgogICAgICAgICAgICAgICAiICByZXR1cm4gMTtcbn1cbiIpOwogICAgaWYgKCFyYXVtLT5RdWVyeVByb3AoUF9TSE9SVCkpCiAgICB7CiAgICAgIHdyaXRlX2ZpbGUoZmlsZSwKICAgICAgICAgICAgICAgICAiXG5zdHJpbmcgc2hvcnQoKVxuIgogICAgICAgICAgICAgICAgICJ7XG4iCiAgICAgICAgICAgICAgICAgIiAgc3RyaW5nIHJldDtcblxuIgogICAgICAgICAgICAgICAgICIgIHJldCA9IDo6c2hvcnQoKTtcbiIKICAgICAgICAgICAgICAgICAiICBpZiAocHJldmlvdXNfb2JqZWN0KCkgIT0gZW52aXJvbm1lbnQoKSAmJiAhcmV0KVxuIgogICAgICAgICAgICAgICAgICIgICAgcmV0ID1cIlwiO1xuXG4iCiAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHJldDtcbiIKICAgICAgICAgICAgICAgICAifVxuIik7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICB3cml0ZV9maWxlKGZpbGUsCiAgICAgICAgICAgICAgICIgIFNhdmUoMSk7XG5cbiIKICAgICAgICAgICAgICAgIiAgeyBvYmplY3QgcmF1bTtcbiIKICAgICAgICAgICAgICAgIiAgICBpZiAocmF1bSA9IGZpbmRfb2JqZWN0KEhBVVNOQU1FKCIKICAgICAgICAgICAgICAgIlwiIityYXVtLT5RdWVyeU93bmVyKCkrIlwiKSkpXG4iCiAgICAgICAgICAgICAgICIgICAgICByYXVtLT5Mb2FkKCk7XG4iCiAgICAgICAgICAgICAgICIgIH1cblxuIgogICAgICAgICAgICAgICAiICBjYWxsX291dChcInJlbW92ZVwiLDApO1xufVxuIik7CiAgfQp9Cg==