I3ByYWdtYSBzdHJpY3RfdHlwZXMKCi8qIG5lZGl0LmMKICAgRWRpdG9yIGZ1ZXIgbmV3cywgbWFpbCB1c3cuCiAgIFZlcnNpb24gMSAoQykgMTk5MyBMb2NvCiAgIFZlcnNpb24gMiAoQykgMTk5NSBXYXJnb24KCiAgIFZlcndlbmR1bmcgYXVzc2VyaGFsYiB2b24gTW9yZ2VuZ3JhdWVuIGlzdCBnZXN0YXR0ZXQgdW50ZXIgZm9sZ2VuZGVuCiAgIEJlZGluZ3VuZ2VuOgogICAtIEJlbnV0enVuZyBlcmZvbGd0IGF1ZiBlaWdlbmUgR2VmYWhyLiBKZWdsaWNoZSBWZXJhbnR3b3J0dW5nIHdpcmQKICAgICBhYmdlbGVobnQuCiAgIC0gQXVjaCBpbiB2ZXJhZW5kZXJ0ZW4gb2RlciBhYmdlbGVpdGV0ZW4gT2JqZWt0ZW4gbXVzcyBlaW4gSGlud2VpcyBhdWYKICAgICBkaWUgSGVya3VuZnQgZXJoYWx0ZW4gYmxlaWJlbi4KICAgRWluIFVwZGF0ZS1TZXJ2aWNlIGJlc3RlaHQgbmljaHQuCgogICBBbndlbmR1bmc6CiAgICAjaW5oZXJpdCAiL21haWwvbmVkaXQiOyAgICAgICh6dXNhZXR6bGljaCB6dSBhbmRlcmVuIGluaGVyaXRzKQoKICAgICBuZWRpdChzdHJpbmcgZnVuY25hbWUpOyAgICAgICAgICAgICAgICAgICAgb2RlcgogICAgbmVkaXQoc3RyaW5nIGZ1bmNuYW1lLHN0cmluZyBwcmV0ZXh0KTsKICAgIE5hY2ggQmVlbmRpZ3VuZyBkZXMgRWRpdG9ycyB3aXJkIGRpZSBGdW5rdGlvbiBmdW5jbmFtZSBhdWZnZXJ1ZmVuLgogICAgU2llIGJla29tbXQgYWxzIEFyZ3VtZW50IGVpbmVuIHN0cmluZyBtaXQgZGVtIGZlcnRpZ2VuIGVkaXRpZXJ0ZW4gVGV4dAogICAgdWViZXJnZWJlbiBiencuIDAsIHdlbm4gZGVyIEVkaXRvciBtaXQgfnEgYWJnZWJyb2NoZW4gd3VyZGUuCiAgICBPcHRpb25hbGVzIEFyZ3VtZW50IHByZXRleHQgaXN0IGRlciB6dSBlZGl0aWVyZW5kZSBUZXh0LiBXZW5uIDAgb2RlciBuaWNodAogICAgdWViZXJnZWJlbiwgd2lyZCBlaW4gbmV1ZXIgVGV4dCBiZWdvbm5lbi4KKi8KCiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CiNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KI2luY2x1ZGUgPGRlZmluZXMuaD4KI2luY2x1ZGUgPGlucHV0X3RvLmg+CgojZGVmaW5lIFRQIHRoaXNfcGxheWVyKCkKCiNkZWZpbmUgRl9PVlIgMSAgLy8gT3ZlcndyaXRlLU1vZHVzCiNkZWZpbmUgRl9CTEsgMiAgLy8gQmxvY2tzYXR6CgojZGVmaW5lIE1BWF9MSU5FUyAxMDAwCgpzdGF0aWMgbWl4ZWQgbmVkaXR0ZXh0LCBuZXhpdGZ1bmMsIGVkaXRvcl91c2VkOwpzdGF0aWMgaW50IGJzdGFydCwgYmVuZDsgIC8vIEFuZmFuZyB1bmQgRW5kZSBkZXMgQmxvY2tzCnN0YXRpYyBpbnQgY3VyOyAgICAgICAgICAgLy8gQWt0dWVsbGUgWmVpbGUKc3RhdGljIGludCBsZW47ICAgICAgICAgICAvLyBMYWVuZ2UgZGVzIEdlc2FtdHRleHRlcwpzdGF0aWMgaW50IGZsYWdzOyAgICAgICAgICAvLyBPdmVyd3JpdGVtb2R1cwoKc3RhdGljIGludCBnZXRfZWRpdF9saW5lKHN0cmluZyBzdHIpOwpzdGF0aWMgaW50IFNob3dXcml0dGVuKGludCBmLCBpbnQgbCwgaW50IG51bSk7CnN0YXRpYyBzdHJpbmcga2lsbGN0cmwoIHN0cmluZyBzdHIgKTsKc3RhdGljIGludCBTaG93SGVscCgpOwpzdGF0aWMgaW50IGRlbExpbmUoaW50IGwpOwpzdGF0aWMgdm9pZCBkZWxCbG9jaygpOwpzdGF0aWMgaW50IGlucHV0X2Z1bmMoKTsKdmFyYXJncyBzdGF0aWMgdm9pZCBtb3ZlQmxvY2soaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgcmVhbCk7Cgp2b2lkIGluaXRfcmVzY3VlKCkgewogIGFkZF9hY3Rpb24oIlJlc2N1ZVRleHQiLCJ+ciIpOwp9Cgpwcml2YXRlIHN0cmluZyBuZWRpdF9wcm9tcHQoKQp7CiAgaWYgKHNpemVvZihuZWRpdHRleHQpIDw9IE1BWF9MSU5FUykKICAgIHJldHVybigiXSIpOwogIGVsc2UgewogICAgbmVkaXR0ZXh0ID0gbmVkaXR0ZXh0WzAuLk1BWF9MSU5FUy0xXTsKICAgIGxlbiA9IE1BWF9MSU5FUzsKICAgIGlmIChjdXIgPj0gTUFYX0xJTkVTKQogICAgICBjdXIgPSBNQVhfTElORVMtMTsKICAgIGlmIChic3RhcnQgPj0gTUFYX0xJTkVTKQogICAgICBic3RhcnQgPSBNQVhfTElORVMtMTsKICAgIGlmIChiZW5kID49IE1BWF9MSU5FUykKICAgICAgYmVuZCA9IE1BWF9MSU5FUy0xOwogICAgcmV0dXJuIHNwcmludGYoIioqKiBNZWhyIGFscyAlZCBaZWlsZW4hIFRleHQgd3VyZGUgYWJnZXNjaG5pdHRlbiEgKioqXG5dIiwgTUFYX0xJTkVTKTsKICB9Cn0KCnN0YXRpYyB2YXJhcmdzIGludCBuZWRpdChzdHJpbmcgZXhpdGZ1bmMsc3RyaW5nIHByZXRleHQpIHsKICBpZiAoZWRpdG9yX3VzZWQpIHsKICAgIHdyaXRlKCJPZmZlbnNpY2h0bGljaCBzY2hyZWlidCBoaWVyIHNjaG9uIGplbWFuZCBkcmFuLiBTb3JyeS5cbiIrCiAgICAgICAgICAgICAgICAgICAgICAgICIoRmFsbHMgZHUgZXMgc2VsYnN0IGJpc3QsIHRpcHBlIH5yIHp1ciBXaWVkZXJhdWZuYWhtZSBlaW5lciB2ZXJsb3JlbmVuIFNpdHp1bmcpXG4iKTsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKCFwcmV0ZXh0KSBuZWRpdHRleHQ9KHsiIn0pOwogIGVsc2UgbmVkaXR0ZXh0PWV4cGxvZGUocHJldGV4dCwiXG4iKTsKICBic3RhcnQgPSAwOwogIGJlbmQgPSBjdXIgPSBsZW4gPSBzaXplb2YobmVkaXR0ZXh0KS0xOwogIG5leGl0ZnVuYz1leGl0ZnVuYzsKICBmbGFncyA9IDA7CiAgZWRpdG9yX3VzZWQ9KHN0cmluZylUUC0+cXVlcnlfcmVhbF9uYW1lKCk7CiAgaWYgKHByZXRleHQpCiAgICBnZXRfZWRpdF9saW5lKCJ+eiIpOwogIGVsc2UgewogICAgLy9uZWRpdF9wcm9tcHQoKTsKICAgIGlucHV0X3RvKCJnZXRfZWRpdF9saW5lIiwgSU5QVVRfUFJPTVBULCBuZWRpdF9wcm9tcHQoKSk7CiAgfQogIHJldHVybiAxOwp9CgpzdGF0aWMgaW50IGdldF9lZGl0X2xpbmUoc3RyaW5nIHN0cikgewogIGludCBlcnI7CiAgaW50IHNwYWNlczsKICBpbnQgZmZsYWc7CiAgaW50IHNsOwoKICBpZiAoIXN0cikgc3RyPSIiOwogIHN0cj1raWxsY3RybChzdHIpOyAvKiBrbGVpbmVyIGhhY2sgd2VnZW4gQ1RSTC1jaGFycy4gKi8KICBmZmxhZyA9IDA7CgogIHNsID0gc2l6ZW9mKHN0cik7CgogIGlmIChzdHI9PSIqKiIgfHwgc3RyPT0ifi4iIHx8IHN0cj09Ii4iKSB7CiAgICBlZGl0b3JfdXNlZD0wOwogICAgc3RyID0gaW1wbG9kZShuZWRpdHRleHQsICJcbiIpOwogICAgbmVkaXR0ZXh0ID0gMDsKICAgIGNhbGxfb3RoZXIodGhpc19vYmplY3QoKSxuZXhpdGZ1bmMsc3RyKTsKICAgIHJldHVybiAxOwogIH0KICBpZiAoc3RyWzAuLjBdPT0gIn4iICYmIHNsID49IDIpIHsKICAgIGlmIChzbCA9PSAyKSB7CiAgICAgIHN3aXRjaChzdHJbMC4uMV0pIHsKICAgICAgLy8gQWJicnVjaDoKICAgICAgY2FzZSAifnEiOgogICAgICAgIGVkaXRvcl91c2VkID0gMDsKICAgICAgICByZXR1cm4gY2FsbF9vdGhlcih0aGlzX29iamVjdCgpLCBuZXhpdGZ1bmMsIDApOwogICAgICAvLyBUZW1wb3JhZXIgcmF1c2dlaGVuOgogICAgICBjYXNlICJ+ISI6CiAgICAgICAgd3JpdGUoIk1pdCB+ciBrYW5uc3QgRHUgd2VpdGVyc2NocmVpYmVuLlxuIik7CiAgICAgICAgaW5pdF9yZXNjdWUoKTsKICAgICAgICByZXR1cm4gMTsKICAgICAgLy8gR2VzYW10ZW4gVGV4dCBhbnplaWdlbgogICAgICBjYXNlICJ+UiI6CiAgICAgICAgZmZsYWcgPSAxOwogICAgICBjYXNlICJ+ciI6CiAgICAgICAgcmV0dXJuIFNob3dXcml0dGVuKDAsIGxlbiwgZmZsYWcpOwogICAgICAvLyBBdXNzY2huaXR0IHVtIEN1cnNvciBhbnplaWdlbgogICAgICBjYXNlICJ+WiI6CiAgICAgICAgZmZsYWcgPSAxOwogICAgICBjYXNlICJ+eiI6CiAgICAgICAgaW50IGYgPSAoY3VyID4gNSkgPyBjdXItNSA6IDA7CiAgICAgICAgaW50IGwgPSAoY3VyIDwgbGVuLTUpID8gY3VyICsgNSA6IGxlbjsKICAgICAgICByZXR1cm4gU2hvd1dyaXR0ZW4oZiwgbCwgZmZsYWcpOwogICAgICAvLyBIaWxmZXNlaXRlIGFuemVpZ2VuOgogICAgICBjYXNlICJ+aCI6CiAgICAgICAgcmV0dXJuIFNob3dIZWxwKCk7CiAgICAgIC8vIFplaWxlIHVlYmVyIEN1cnNvciBsb2VzY2hlbjoKICAgICAgY2FzZSAifmQiOgogICAgICAgIHJldHVybiBkZWxMaW5lKGN1ci0xKTsKICAgICAgLy8gQmxvY2sgbG9lc2NoZW46CiAgICAgIGNhc2UgIn5EIjoKICAgICAgICBkZWxCbG9jaygpOwogICAgICAgIHdyaXRlKCAiQmxvY2sgZ2Vsb2VzY2h0LlxuIiApOwogICAgICAgIHJldHVybiBpbnB1dF9mdW5jKCk7CiAgICAgIC8vIE92ZXJ3cml0ZS1Nb2R1cyB0b2dnZWxuOgogICAgICBjYXNlICJ+diI6CiAgICAgICAgZmxhZ3MgXj0gRl9PVlI7CiAgICAgICAgcHJpbnRmKCIlc21vZHVzIGVpbmdlc2NoYWx0ZXQuXG4iLAogICAgICAgICAgICAgIChmbGFncyAmIEZfT1ZSKSA/ICJVZWJlcnNjaHJlaWIiIDogIkVpbmZ1ZWdlIik7CiAgICAgICAgcmV0dXJuIGlucHV0X2Z1bmMoKTsKICAgICAgLy8gQmxvY2tzYXR6IHRvZ2dlbG46CiAgICAgIGNhc2UgIn5iIjoKICAgICAgICBmbGFncyBePSBGX0JMSzsKICAgICAgICBwcmludGYoIiVzc2F0eiBha3RpdmllcnQuXG4iLAogICAgICAgICAgICAgIChmbGFncyAmIEZfQkxLKSA/ICJCbG9jayIgOiAiRmxhdHRlciIpOwogICAgICAgIHJldHVybiBpbnB1dF9mdW5jKCk7CiAgICAgIC8vIFN0YXR1c2luZm8gYW56ZWlnZW46CiAgICAgIGNhc2UgIn5zIjoKICAgICAgICBwcmludGYoIlplaWxlOiAlZCB8IExhZW5nZTogJWQgfCBCU3RhcnQ6ICVkIHwgQkVuZGU6ICVkIHwgIgogICAgICAgICAgICAgICAiTW9kdXM6ICVzLyVzLlxuIiwKICAgICAgICAgICAgICAgIGN1ciwgbGVuLCBic3RhcnQsIGJlbmQsIChmbGFncyZGX09WUik/IlVlYmVyLiI6IkVpbmZnLiIsCiAgICAgICAgICAgICAgICAoZmxhZ3MmRl9CTEspPyJCbG9ja3NhdHoiOiJGbGF0dGVyc2F0eiIpOwogICAgICAgIHJldHVybiBpbnB1dF9mdW5jKCk7CiAgICAgIC8vIEJsb2NrIHZlcnNjaGllYmVuOgogICAgICBjYXNlICJ+bSI6CiAgICAgICAgbW92ZUJsb2NrKGJzdGFydCwgYmVuZCwgMSk7CiAgICAgICAgcmV0dXJuIGlucHV0X2Z1bmMoKTsKICAgICAgLy8gQmxvY2sgdW1mb3JtYXRpZXJlbjoKICAgICAgY2FzZSAifkYiOgogICAgICAgIGludCBicyA9IGJzdGFydDsKICAgICAgICBzdHIgPSBpbXBsb2RlKG5lZGl0dGV4dFtic3RhcnQuLmJlbmRdLCAiICIpOwogICAgICAgIGRlbEJsb2NrKCk7CiAgICAgICAgYnN0YXJ0ID0gYmVuZCA9IGN1ciA9IGJzOwogICAgICAgIGZmbGFnID0gLTE7CiAgICAgICAgd3JpdGUoIkJsb2NrIHd1cmRlIHVtZm9ybWF0aWVydC5cbiIpOwogICAgICAgIGJyZWFrOwogICAgICAvLyBaZWlsZSB1bWZvcm1hdGllcmVuOgogICAgICBjYXNlICJ+ZiI6CiAgICAgICAgc3RyID0gbmVkaXR0ZXh0W2N1cl07CiAgICAgICAgbmVkaXR0ZXh0ID0gbmVkaXR0ZXh0WzAuLmN1ci0xXSArIG5lZGl0dGV4dFtjdXIrMS4uXTsKICAgICAgICBpZiAoY3VyIDw9IGJzdGFydCkKICAgICAgICAgIGJzdGFydC0tOwogICAgICAgIGlmIChjdXIgPD0gYmVuZCkKICAgICAgICAgIGJlbmQtLTsKICAgICAgICBsZW4gLS07CiAgICAgICAgZmZsYWcgPSAtMTsKICAgICAgICB3cml0ZSgiWmVpbGUgd3VyZGUgdW1mb3JtYXRpZXJ0LlxuIik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gLy8gc3dpdGNoCiAgICB9IC8vIGlmIChzbCA9PSAyKQogICAgZWxzZSB7CiAgICAgIC8vIEN1cnNvcmJld2VndW5nZW4gYW4gYmVzdGltbXRlIFN0ZWxsZW46CiAgICAgIGlmIChzdHJbMC4uMV0gPT0gIn5jIiAmJiBzbCA9PSAzKSB7CiAgICAgICAgZmZsYWcgPSAxOwogICAgICAgIHN3aXRjaChzdHJbMl0pIHsKICAgICAgICAgIGNhc2UgJ3UnOiBzcGFjZXMgPSAtMTsgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnZCc6IHNwYWNlcyA9IDE7ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd0Jzogc3BhY2VzID0gLWxlbjsgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2InOiBzcGFjZXMgPSBsZW47ICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAncyc6IHNwYWNlcyA9IGJzdGFydCAtIGN1cjsgYnJlYWs7CiAgICAgICAgICBjYXNlICdlJzogc3BhY2VzID0gYmVuZCAtIGN1cjsgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6ICBzcGFjZXMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZmbGFnID0gMDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gQ3Vyc29yYmV3ZWd1bmcgbWl0IFplaWxlbm51bW1lcm46CiAgICAgIGlmIChzcGFjZXMgfHwgc3NjYW5mKHN0ciwgIn5jJWQiLCBzcGFjZXMpID09IDEpIHsKICAgICAgICBpZiAoZmZsYWc+MCB8fCBzdHJbMi4uMl0gPT0gIisiIHx8IHN0clsyLi4yXSA9PSAiLSIpCiAgICAgICAgICBjdXIgKz0gc3BhY2VzOwogICAgICAgIGVsc2UKICAgICAgICAgIGN1ciA9IHNwYWNlcy0xOwoKICAgICAgICBpZiAoY3VyIDwgMCkKICAgICAgICAgIGN1ciA9IDA7CiAgICAgICAgZWxzZSBpZiAoY3VyID4gbGVuKQogICAgICAgICAgY3VyID0gbGVuOwoKICAgICAgICBwcmludGYoIiVzXG4iLG5lZGl0dGV4dFtjdXJdKTsKICAgICAgICByZXR1cm4gaW5wdXRfZnVuYygpOwogICAgICB9CiAgICAgIC8vIEJsb2NrZ3JlbnplbiBzZXR6ZW46CiAgICAgIGlmICgoZXJyID0gKHN0clswLi4yXSA9PSAifmJzIikpIHx8IChzdHJbMC4uMl09PSJ+YmUiKSkgewogICAgICAgIHN0cmluZyBvdXQsIHA7CiAgICAgICAgaW50IHBvczsKCiAgICAgICAgaW50IHZhbGlkID0gLTE7CgogICAgICAgIGlmIChzbCA9PSAzKQogICAgICAgICAgcG9zID0gdmFsaWQgPSBjdXI7CiAgICAgICAgZWxzZSBpZiAoc3NjYW5mKHN0clszLi5dLCAiJWQlcyIsIHBvcywgcCkgPT0gMiAmJiBwPT0iIikKICAgICAgICAgIHZhbGlkID0gcG9zLS07CgogICAgICAgIGlmICh2YWxpZCA+PSAwKSB7CiAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgIGJzdGFydCA9IHBvczsKICAgICAgICAgICAgaWYgKHBvcyA+IGJlbmQpCiAgICAgICAgICAgICAgYmVuZCA9IGxlbjsKICAgICAgICAgICAgb3V0ID0gIkJsb2NrYW5mYW5nIjsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAocG9zIDwgYnN0YXJ0KQogICAgICAgICAgICAgIGJzdGFydCA9IDA7CiAgICAgICAgICAgIGJlbmQgPSBwb3M7CiAgICAgICAgICAgIGlmIChsZW4gJiYgYmVuZCA9PSBsZW4pCiAgICAgICAgICAgICAgYmVuZC0tOwogICAgICAgICAgICBvdXQgPSAiQmxvY2tlbmRlIjsKICAgICAgICAgIH0KICAgICAgICAgIHByaW50ZigiJXMgZ2VzZXR6dC5cbiIsIG91dCk7CiAgICAgICAgICByZXR1cm4gaW5wdXRfZnVuYygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRXJzZXR6ZW46CiAgICAgIGlmICgoc2l6ZW9mKHN0cikgPj0gOCkgJiYgc3RyWzAuLjFdID09ICJ+cyIpIHsKICAgICAgICBzdHJpbmcgKnMxLCAqczI7CiAgICAgICAgaW50IG07CgogICAgICAgIG0gPSAoc3RyWzJdID09ICcgJykgPyAzIDogMjsKCiAgICAgICAgaWYgKHNpemVvZihzMSA9IGV4cGxvZGUoc3RyW20uLl0sIHN0clttLi5tXSkpID09IDQpIHsKICAgICAgICAgIHMyID0gZXhwbG9kZShuZWRpdHRleHRbY3VyXSwgczFbMV0pOwogICAgICAgICAgaWYgKHNpemVvZihzMikgPiAxKSB7CiAgICAgICAgICAgIHMyWzFdID0gczJbMF0rczFbMl0rczJbMV07CiAgICAgICAgICAgIG5lZGl0dGV4dFtjdXJdID0gaW1wbG9kZShzMlsxLi5dLCBzMVsxXSk7CiAgICAgICAgICAgIGlmIChzMVszXSA9PSAicCIpCiAgICAgICAgICAgICAgcHJpbnRmKCIlc1xuIiwgbmVkaXR0ZXh0W2N1cl0pOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgd3JpdGUoIk9LLlxuIik7CiAgICAgICAgICAgIC8vbmVkaXRfcHJvbXB0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHJpbnRmKCJcIiVzXCIgbmljaHQgZ2VmdW5kZW4hXG4iLCBzMVsxXSk7CiAgICAgICAgICAgIC8vbmVkaXRfcHJvbXB0KCk7CiAgICAgICAgICB9CgogICAgICAgICAgaW5wdXRfdG8oImdldF9lZGl0X2xpbmUiLCBJTlBVVF9QUk9NUFQsIG5lZGl0X3Byb21wdCgpKTsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgfQogICAgfSAvLyBpZiAoc2wgPiAyKQogIH0gLy8gaWYgKHN0clswLi4wXSA9PSAifiIpCgogIHNwYWNlcz0oc2l6ZW9mKHN0cikgJiYgKHN0clswXT09JyAnIHx8IHN0clswXT09J1x0JykpOwogIGlmIChzcGFjZXMpIHN0cj0iJCIrc3RyOyAgLyogS2xlaW5lciBoYWNrIHdlZ2VuIGZ1ZWhyZW5kZW4gTGVlcnplaWNoZW4gKi8KICBzdHI9YnJlYWtfc3RyaW5nKHN0ciw3OCwwLChmbGFncyZGX0JMSykgPyBCU19CTE9DS3xCU19OT19QQVJJTkRFTlQgOiAwKTsKICBpZiAoc3BhY2VzKSBzdHI9c3RyWzEuLjwxXTsKICBpZiAoICgoc3RyWzAuLjFdPT0ifnIiICYmIHNpemVvZihzdHIpPjIpIHx8IHN0clswLi4xXT09In5pIikgJiYgCiAgICAgICBJU19MRUFSTkVSKFRQKSApIAogIHsKICAgIHN0cj1zdHJbMi4uPDJdOwogICAgaWYgKHN0clswLi4wXT09IiAiKSBzdHI9c3RyWzEuLjwxXTsKICAgIGlmICghc3RyIHx8IGNhdGNoKGVycj1maWxlX3NpemUoc3RyPShzdHJpbmcpIi9zZWN1cmUvbWFzdGVyIi0+X2dldF9wYXRoKHN0cixnZXR1aWQoVFApKSkpIHx8IGVycjwwKSB7CiAgICAgIHdyaXRlKCJGaWxlIG5pY2h0IGdlZnVuZGVuLlxuIik7CiAgICAgIC8vbmVkaXRfcHJvbXB0KCk7CiAgICAgIGlucHV0X3RvKCJnZXRfZWRpdF9saW5lIiwgSU5QVVRfUFJPTVBULCBuZWRpdF9wcm9tcHQoKSk7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgc3RyPXJlYWRfZmlsZShzdHIpOwogICAgaWYgKCFzdHIpewogICAgICB3cml0ZSgiWnUgZ3Jvc3MhXG4iKTsKICAgICAgLy9uZWRpdF9wcm9tcHQoKTsKICAgICAgaW5wdXRfdG8oImdldF9lZGl0X2xpbmUiLCBJTlBVVF9QUk9NUFQsIG5lZGl0X3Byb21wdCgpKTsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICB3cml0ZSgiT2suXG4iKTsKICB9CiAgaWYgKHN0cj09IiIgfHwgIXN0cikgc3RyPSJcbiI7CiAgewogICAgc3RyaW5nICp4OwogICAgaW50IHN4OwoKICAgIHggPSBleHBsb2RlKHN0ciwgIlxuIilbMC4uPDJdOwogICAgc3ggPSBzaXplb2YoeCk7CgogICAgaWYgKGZsYWdzJkZfT1ZSICYmICFmZmxhZykgewogICAgICBuZWRpdHRleHQgPSBuZWRpdHRleHRbMC4uY3VyLTFdICsgeCArIG5lZGl0dGV4dFtjdXIrMS4uXTsKICAgICAgc3gtLTsKICAgIH0KICAgIGVsc2UKICAgICAgbmVkaXR0ZXh0ID0gbmVkaXR0ZXh0WzAuLmN1ci0xXSArIHggKyBuZWRpdHRleHRbY3VyLi5dOwoKICAgIGlmIChjdXIgPCBic3RhcnQpCiAgICAgIGJzdGFydCArPSBzeDsKICAgIGlmIChjdXIgPD0gYmVuZCkKICAgICAgYmVuZCArPSAoc3ggKyBmZmxhZyk7CiAgICBjdXIgKz0gKHN4ICsgZmZsYWcgKyAoKGZsYWdzJkZfT1ZSKSA/IDE6MCkpOwogICAgbGVuICs9IHN4OwoKICAgIC8vIEthbm4gYmVpbSBVbWZvcm1hdGllcmVuIGRlcyBsZXR6dGVuIEFic2Nobml0dHMgdm9ya29tbWVuLgogICAgaWYgKG5lZGl0dGV4dFtsZW5dICE9ICIiKSB7CiAgICAgIG5lZGl0dGV4dCArPSAoeyAiIiB9KTsKICAgICAgbGVuKys7CiAgICB9CiAgfQogIC8vbmVkaXRfcHJvbXB0KCk7CiAgaW5wdXRfdG8oImdldF9lZGl0X2xpbmUiLCBJTlBVVF9QUk9NUFQsIG5lZGl0X3Byb21wdCgpKTsKICByZXR1cm4gMTsKfQoKc3RhdGljIGludCBkZWxMaW5lKGludCBsKQp7CiAgc3RyaW5nIHByOwogIGlmIChsIDwgMCkKICAgIHByPSJEYSBpc3Qgbml4IG1laHIgenVtIExvZXNjaGVuIVxuXSI7CiAgZWxzZSB7CiAgICBpZiAoYnN0YXJ0ID49IGwpCiAgICAgIGJzdGFydC0tOwogICAgaWYgKGJlbmQgPj0gbCkKICAgICAgYmVuZC0tOwogICAgaWYgKGN1ciA+PSBsKQogICAgICBjdXItLTsKICAgIGxlbi0tOwogICAgbmVkaXR0ZXh0PShuZWRpdHRleHRbMC4ubC0xXStuZWRpdHRleHRbbCsxLi5dKTsKICAgIHdyaXRlKCJWb3JoZXJpZ2UgWmVpbGUgZ2Vsb2VzY2h0LlxuIik7CiAgICBwcj1uZWRpdF9wcm9tcHQoKTsKICB9CiAgaW5wdXRfdG8oImdldF9lZGl0X2xpbmUiLCBJTlBVVF9QUk9NUFQsIHByKTsKICByZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQgZGVsQmxvY2soKQp7CiAgaWYgKGN1ciA+IGJzdGFydCkgewogICAgaWYgKGN1ciA8PSBiZW5kKQogICAgICBjdXIgPSBic3RhcnQ7CiAgICBlbHNlCiAgICAgIGN1ciAtPSAoYmVuZCAtIGJzdGFydCArIDEpOwogIH0KICBpZiAoYmVuZCA9PSBsZW4pCiAgICBuZWRpdHRleHQgPSBuZWRpdHRleHRbMC4uYnN0YXJ0LTFdOwogIGVsc2UKICAgIG5lZGl0dGV4dCA9IG5lZGl0dGV4dFswLi5ic3RhcnQtMV0gKyBuZWRpdHRleHRbYmVuZCsxLi5dOwoKICBiZW5kID0gbGVuID0gc2l6ZW9mKG5lZGl0dGV4dCktMTsKICBic3RhcnQgPSAwOwogIGlmIChjdXIgPiBsZW4pCiAgICBjdXIgPSBsZW47Cn0KCnZhcmFyZ3Mgc3RhdGljIHZvaWQgbW92ZUJsb2NrKGludCBzdGFydCwgaW50IGVuZCwgaW50IHJlYWwpCnsKICBpbnQgYmxlbjsKICBzdHJpbmcgKmJsb2NrOwoKICBpZiAoY3VyID49IHN0YXJ0ICYmIGN1ciA8PSBlbmQpCiAgICB3cml0ZSgiQWJlciBkZXIgQ3Vyc29yIHN0ZWh0IGlubmVyaGFsYiBkZXMgQmxvY2tzIVxuIik7CiAgZWxzZSB7CiAgICBibG9jayA9IG5lZGl0dGV4dFtzdGFydC4uZW5kXTsKICAgIGJsZW4gPSBzaXplb2YoYmxvY2spLTE7CiAgICBkZWxCbG9jaygpOwogICAgbmVkaXR0ZXh0ID0gbmVkaXR0ZXh0WzAuLmN1ci0xXSArIGJsb2NrICsgbmVkaXR0ZXh0W2N1ci4uXTsKICAgIGlmIChyZWFsKSB7CiAgICAgIGJzdGFydCA9IGN1cjsKICAgICAgYmVuZCA9IGN1ciArIGJsZW47CiAgICB9CiAgICBsZW4gKz0gKGJsZW4rMSk7CiAgICB3cml0ZSgiT0suXG4iKTsKICB9Cn0KCiNkZWZpbmUgVU1MQVVUIChbIFwKICAgICfkJzogImFlIiwgXAogICAgJ/YnOiAib2UiLCBcCiAgICAn/Cc6ICJ1ZSIsIFwKICAgICfEJzogIkFlIiwgXAogICAgJ9YnOiAiT2UiLCBcCiAgICAn3Cc6ICJVZSIsIFwKICAgICffJzogInNzIiAgXSkKCnN0YXRpYyBzdHJpbmcga2lsbGN0cmwoIHN0cmluZyBzdHIgKQp7CiAgICBpbnQgaSwgajsKICAgIHN0cmluZyB0bXA7CgogICAgdG1wID0gIiI7CiAgICAKICAgIGZvciAoIGogPSBzaXplb2Yoc3RyKSwgaSA9IDA7IGkgPCBqOyBpKysgKQogICAgICAgIHRtcCArPSAoVU1MQVVUW3N0cltpXV0gfHwgc3RyW2kuLmldKTsKCiAgICB0bXAgPSByZWdyZXBsYWNlKCB0bXAsICJbXiAtflx0XSIsICIiLCAxICk7CiAgICAKICAgIGlmIChzaXplb2YodG1wKSAmJiAgdG1wWzBdIDwgMzIgKQogICAgICAgIHJldHVybiB0bXBbMS4uXTsKICAKICAgIHJldHVybiB0bXA7Cn0KCm1peGVkIFJlc2N1ZVRleHQoKSB7CiAgaWYgKCFuZWRpdHRleHQgfHwgIWVkaXRvcl91c2VkKQogICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJEdSBoYXN0IG5peCBhbmdlZmFuZ2VuIHp1IHNjaHJlaWJlbiFcbiIpLDA7CiAgaWYgKFRQLT5xdWVyeV9yZWFsX25hbWUoKSE9ZWRpdG9yX3VzZWQpCiAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkhpZXIgc2NocmVpYnQgIitjYXBpdGFsaXplKGVkaXRvcl91c2VkKSsiIVxuIiksMDsKICBpZiAocXVlcnlfaW5wdXRfcGVuZGluZyhUUCkpCiAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkR1IHNjaHJlaWJzdCBnZXJhZGUgc2Nob24gaXJnZW5kd2FzLiBTb3JyeS4uLlxuIiksMDsKICByZXR1cm4gU2hvd1dyaXR0ZW4oMCwgbGVuLCAwKTsKfQoKc3RhdGljIGludCBTaG93V3JpdHRlbihpbnQgZiwgaW50IGwsIGludCBudW0pIHsKICBzdHJpbmcgcywgdCwgYywgcCwgaW47CiAgaW50IGk7CgogIGlmIChudW0pIHsKICAgIGlmIChsID49IDEwMCkgewogICAgICBwID0gIiUzZCVzJXMiOwogICAgICBpbiA9ICIgIjsKICAgIH0KICAgIGVsc2UgewogICAgICBwID0gIiUyZCVzJXMiOwogICAgICBpbiA9ICIgICI7CiAgICB9CiAgfQogIGVsc2UKICAgIGluID0gIiI7CgogIGZvciAodD0iIiwgaT1sLTE7IGk+PWY7IGktLSkgewogICAgaWYgKGkgPT0gY3VyKQogICAgICBjID0gKCAoKGkgPT0gYmVuZCkgfHwgKGkgPT0gYnN0YXJ0KSkgPyAiIyIgOiAiKiIpOwogICAgZWxzZSBpZiAoaT09YnN0YXJ0IHx8IGk9PWJlbmQpCiAgICAgIGMgPSAiPiI7CiAgICBlbHNlIGMgPSAiOiI7CgogICAgaWYgKG51bSkKICAgICAgdCA9IChzcHJpbnRmKHAsIGkrMSwgYywgbmVkaXR0ZXh0W2ldKVswLi43NV0gKyAiXG4iICsgdCk7CiAgICBlbHNlCiAgICAgIHQgPSAoYyArIG5lZGl0dGV4dFtpXSsiXG4iICsgdCk7CiAgfQoKICBpZiAobD09bGVuKSB7CiAgICBpZiAobGVuID09IGN1cikKICAgICAgYyA9ICggKGxlbiA9PSBiZW5kKSA/ICIjIiA6ICIqIik7CiAgICBlbHNlIGlmIChsZW49PWJlbmQpCiAgICAgIGMgPSAiPiI7CiAgICBlbHNlIGMgPSAiICI7CiAgfQogIGVsc2UgYz0gIiAiOwoKICBzPSJEYXMgaGFzdCBEdSBiaXNoZXIgZ2VzY2hyaWViZW46XG4iK2luKyIgXAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXAoiK3QraW4rYysiXAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI7CiAgdGhpc19wbGF5ZXIoKS0+TW9yZShzLDAsc3ltYm9sX2Z1bmN0aW9uKCJpbnB1dF9mdW5jIix0aGlzX29iamVjdCgpKSk7CiAgcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgU2hvd0hlbHAoKSB7CiAgdGhpc19wbGF5ZXIoKS0+TW9yZSgiXAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXApEZXIgRWRpdG9yIHZlcnN0ZWh0IGZvbGdlbmRlIEJlZmVobGU6XG5cCi0tLSBEYXRlaWtvbW1hbmRvczpcblwKfmggICAgICAgICAgICBkaWVzZSBIaWxmc3NlaXRlXG5cCn5yIC8gflIgICAgIHplaWd0IGFuLCB3YXMgRHUgYmlzaGVyIGdlc2NocmllYmVuIGhhc3RcblwKfnogLyB+WiAgICAgemVpZ3QgZGVuIFRleHRhdXNzY2huaXR0IHVtIGRlbiBDdXJzb3IgaGVydW1cblwKIisoSVNfV0laQVJEKFRQKSA/ICJcCn5pIGZpbGVuYW1lIGZ1ZWd0IGVpbmUgRGF0ZWkgaW4gZGVuIFRleHQgZWluIChhdWNoIH5yIGZpbGVuYW1lKVxuXAoiIDogIiIgKSsgIlwKfnEgICAgICAgICAgICBicmljaHQgYWJcblwKKiogb2RlciAuICAgYmVlbmRldCBzYXViZXJcblwKITxjbWQ+ICAgICAgICAgICAgZnVlaHJ0IDxjbWQ+IGF1cywgd2llIHdlbm4gRHUgZ2VyYWRlIG5pY2h0IHNjaHJlaWJlbiB3dWVyZGVzdFxuXAp+ISAgICAgICAgICAgIHZlcmxhZXNzdCBkZW4gRWRpdG9yIHZvcnVlYmVyZ2VoZW5kXG5cCn5zICAgICAgICAgICAgU3RhdHVzaW5mb3JtYXRpb25lbiBhbnplaWdlblxuXAp+YiAgICAgICAgICAgIFdlY2hzZWx0IHp3aXNjaGVuIEZsYXR0ZXItIChkZWZhdWx0KSB1bmQgQmxvY2tzYXR6XG5cCi0tLSB6ZWlsZW5vcmllbnRpZXJ0ZSBLb21tYW5kb3M6XG5cCn5kICAgICAgICAgICAgbG9lc2NodCBkaWUgbGV0enRlIFplaWxlIChUZXh0LSwgbmljaHQgRWluZ2FiZXplaWxlKVxuXAp+diAgICAgICAgICAgIHdlY2hzZWx0IHp3aXNjaGVuIEVpbmZ1ZWdlLSAoZGVmYXVsdCkgdW5kIFVlYmVyc2NocmVpYm1vZHVzXG5cCn5zICFzMSFzMiEgIEVyc2V0enQgZGFzIGVyc3RlIFZvcmtvbW1uaXMgZGVzIFN0cmluZ3MgczEgZHVyY2ggZGVuIFN0cmluZyBzMlxuXAogICAgICAgICAgICBpbiBkZXIgYWt0dWVsbGVuIFplaWxlLlxuXAogICAgICAgICAgICBTdGF0dCBkdXJjaCAhIGtvZW5uZW4gZGllIFN0cmluZ3MgYXVjaCBkdXJjaCBiZWxpZWJpZ2UgYW5kZXJlXG5cCiAgICAgICAgICAgIFplaWNoZW4gZ2V0cmVubnQgd2VyZGVuLCBkaWUgd2VkZXIgaW4gczEgbm9jaCBpbiBzMiB2b3Jrb21tZW4uXG5cCn5mICAgICAgICAgICAgRm9ybWF0aWVydCBkaWUgYWt0dWVsbGUgWmVpbGUgbmV1XG5cCi0tLSBDdXJzb3Jrb21tYW5kb3M6XG5cCn5jdSAvIH5jZCAgIEN1cnNvciB1bSBlaW5lIFplaWxlIG5hY2ggb2Jlbi91bnRlbiBiZXdlZ2VuXG5cCn5jdCAvIH5jYiAgIEN1cnNvciBhbiBBbmZhbmcvRW5kZSBkZXMgVGV4dGVzIGJld2VnZW5cblwKfmNzIC8gfmNlICAgQ3Vyc29yIGFuIEJsb2NrYW5mYW5nL0Jsb2NrZW5kZSBiZXdlZ2VuXG5cCn5jPG5yPiAgICAgICAgICAgIEN1cnNvciBuYWNoIFplaWxlIDxucj4gYmV3ZWdlblxuXAp+Yys8bnI+ICAgICBDdXJzb3IgdW0gPG5yPiBaZWlsZW4gbmFjaCB1bnRlbiBiZXdlZ2VuXG5cCn5jLTxucj4gICAgIEN1cnNvciB1bSA8bnI+IFplaWxlbiBuYWNoIG9iZW4gYmV3ZWdlblxuXAotLS0gYmxvY2tvcmllbnRpZXJ0ZSBLb21tYW5kb3M6XG5cCn5icy9+YnM8bnI+IHNldHp0IEJsb2NrYW5mYW5nIGF1ZiBDdXJzb3Jwb3NpdGlvbiBiencuIGF1ZiBaZWlsZSA8bnI+XG5cCn5iZS9+YmU8bnI+IHNldHp0IEJsb2NrZW5kZSBhdWYgQ3Vyc29ycG9zaXRpb24gYnp3LiBhdWYgWmVpbGUgPG5yPlxuXAp+RiAgICAgICAgICAgIGZvcm1hdGllcnQgZGVuIEJsb2NrIG5ldVxuXAp+RCAgICAgICAgICAgIGxvZXNjaHQgZGVuIG1hcmtpZXJ0ZW4gQmxvY2tcblwKfm0gICAgICAgICAgICB2ZXJzY2hpZWJ0IGRlbiBtYXJraWVydGVuIEJsb2NrIGFuIGRpZSBDdXJzb3Jwb3NpdGlvblxuXAotLS1cblwKQWxsZXMgYW5kZXJlIGdpbHQgYWxzIFRleHQuIFVlYmVybGFuZ2UgWmVpbGVuIHdlcmRlbiBhdWYgZWluZSBtYXhpbWFsZVxuXApMYWVuZ2Ugdm9uIDc4IFplaWNoZW4gdW1nZWJyb2NoZW4uXG5cCk5hY2ggfiEsIG9kZXIgd2VubiBtYW4gd2FlaHJlbmQgZGVzIFNjaHJlaWJlbnMgbmV0enRvdCB3aXJkLCBrYW5uIG1hbiBtaXRcblwKIH5yIHdpZWRlciBpbiBkZW4gRWRpdG9yIGVpbnN0ZWlnZW4uXG5cCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cCiIsIDAsIHN5bWJvbF9mdW5jdGlvbigiaW5wdXRfZnVuYyIsIHRoaXNfb2JqZWN0KCkpKTsKICByZXR1cm4gMTsKfQoKc3RhdGljIGludCBpbnB1dF9mdW5jKCkgewogIC8vbmVkaXRfcHJvbXB0KCk7CiAgaW5wdXRfdG8oImdldF9lZGl0X2xpbmUiLCBJTlBVVF9QUk9NUFQsIG5lZGl0X3Byb21wdCgpKTsKICByZXR1cm4gMTsKfQo=