LyoKICogIE1HdG9vbC0xLjMKICogIEZpbGU6IE1HdG9vbC5jCiAqICBNYWludGFpbmVyOiBLaXJrQE1vcmdlbkdyYXVlbgogKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogdGhlIG9yaWdpbmFsIFh0b29sIGlzIGNvcHlyaWdodGVkIGJ5IEh5cCAqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgojcHJhZ21hIHN0cmljdF90eXBlcwoKcHJvdGVjdGVkIGZ1bmN0aW9ucyB2aXJ0dWFsIGluaGVyaXQgIi9zdGQvdXRpbC9wYXRoIjsKaW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKCiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CgojaWYgIWRlZmluZWQoUVVFUllDQUNIRUQpCiNkZWZpbmUgUVVFUllDQUNIRUQgNDA5NgojZW5kaWYKI2lmICFkZWZpbmVkIChTRVRDQUNIRUQpCiNkZWZpbmUgU0VUQ0FDSEVEIDQwOTYKI2VuZGlmCiNpbmNsdWRlIDxtb3ZpbmcuaD4KI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCiNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgojaW5jbHVkZSA8dXNlcmluZm8uaD4KI2luY2x1ZGUgPGRlZmluZXMuaD4KCiNpbmNsdWRlICJNR3Rvb2wvdG9vbC5oIgoKI2luY2x1ZGUgIk1HdG9vbC90b29sbGliLmgiCgojZGVmaW5lIFhEQkcgMQoKbm9zYXZlIG9iamVjdCAgY2xvbmVyOwpub3NhdmUgb2JqZWN0ICBtc2d0bz1OVUxMOwpub3NhdmUgc3RyaW5nICptYW5wYXRoPSh7VE9PTF9QQVRIKyIvbWFuLmQvIiwKCQkJICIvZG9jL2VmdW4vIiwKCQkJICIvZG9jL2xmdW4vIiwKCQkJICIvZG9jL3cvIiwKCQkJICIvZG9jL2hlbHBkaXIvIiwKCQkJICIvZG9jL0xQQy8iLAoJCQkgIi9kb2Mvc3RkLyIsCgkJCSAiL2RvYy9jb25jZXB0cy8iLAoJCQkgIiJ9KTsKbm9zYXZlIHN0cmluZyAgbW9yZWZpbGU9TlVMTDsKbm9zYXZlIHN0cmluZyAqc2NyaXB0bGluZT1OVUxMOwpub3NhdmUgc3RyaW5nICpoaXN0b3J5PWFsbG9jYXRlKE1BWF9ISVNUT1JZKTsKbm9zYXZlIGludCAgICAgbW9yZWZsYWc9RkFMU0U7Cm5vc2F2ZSBpbnQgICAgIG1vcmVvZmZzZXQ9MTsKbm9zYXZlIGludCAgICAgdGVybT1OVUxMOwpub3NhdmUgaW50ICAgICBzY3JpcHRzaXplPU5VTEw7Cm5vc2F2ZSBpbnQgICAgIG5vc3RvcmU9RkFMU0U7Cm5vc2F2ZSBpbnQgICAgIHhsaWdodD0wOwpub3NhdmUgaW50ICAgICBwaXBlX2luPUZBTFNFOwpub3NhdmUgaW50ICAgICBwaXBlX291dD1GQUxTRTsKbm9zYXZlIGludCAgICAgcGlwZV9vdnI9VFJVRTsKbm9zYXZlIHN0cmluZyAgcGlwZV9pZj1OVUxMOwpub3NhdmUgc3RyaW5nICBwaXBlX29mPU5VTEw7Cm5vc2F2ZSBpbnQgICAgIHh0az1GQUxTRTsKbm9zYXZlIG1hcHBpbmcgdmFyaWFibGU9KFtdKTsKbm9zYXZlIHN0cmluZyAqY21kczsKcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBsaW5lX2J1ZmZlcj0oW10pOwpwcml2YXRlIG5vc2F2ZSBzdHJpbmcgbGluZV9idWZmZXJfbmFtZT0iIjsKcHJpdmF0ZSBub3NhdmUgc3RyaW5nIG1vcmVfc2VhcmNoZXhwcj0iIjsKaW50ICAgIG1vcmVsaW5lcz1NT1JFX0xJTkVTOwppbnQgICAgbW9kaT0oTU9ERV9GSVJTVHxNT0RFX1BST1RFQ1R8TU9ERV9TSE9SVCk7CgojaW5jbHVkZSAiTUd0b29sL3Rvb2xsaWIuYyIKI2luY2x1ZGUgIk1HdG9vbC90b29sY21kLmMiCgojZGVmaW5lIFNhZmVSZXR1cm4oeCkgXAp7IFwKICBjbWRzPSh7fSk7IFwKICBwaXBlX2luPUZBTFNFOyBcCiAgcGlwZV9vZj1OVUxMOyBcCiAgcGlwZV9vdnI9VFJVRTsgXAogIHBpcGVfb3V0PUZBTFNFOyBcCiAgcGlwZV9vZj1OVUxMOyBcCiAgcmV0dXJuICh4KTsgXAp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogY2hlY2sgc29tZSBzZWN1cml0eSBhc3BlY3RzCiAqLwoKc3RhdGljIGludCBzZWN1cml0eSgpCnsKICBvYmplY3QgcHJldjsKIAogIGlmKCBwcm9jZXNzX2NhbGwoKSB8fCBnZXR1aWQoKSE9Z2V0dWlkKGNsb25lcikgKSByZXR1cm4gRkFMU0U7IC8vIFJ1bWF0YQoKICBUSygiVUlEOiAiK2dldHVpZChNRSkrIiBjbG9uZXI6IitnZXR1aWQoY2xvbmVyKSk7Ci8vICBUSygicHJldjogIitvYmplY3RfbmFtZShQUkVWKSsiIG1lOiIrb2JqZWN0X25hbWUoTUUpKTsKICBpZihwcmV2PVBSRVYpCiAgewogICAgaWYoIWNsb25lcikKICAgICAgcmV0dXJuIFRSVUU7CiAgICBpZihnZXR1aWQocHJldik9PVJPT1RJRHx8SVNfQVJDSChwcmV2KSkKICAgICAgcmV0dXJuIFRSVUU7CiAgICBpZihwcmV2PT1NRSkKICAgICAgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gc2VjdXJlX2xldmVsKCk+PXF1ZXJ5X3dpel9sZXZlbChjbG9uZXIpOyAvLyBSdW1hdGEKICAgIC8vcmV0dXJuIGdldHVpZChwcmV2KT09Z2V0dWlkKCkmJmdldGV1aWQocHJldik9PWdldGV1aWQoKSYmY2xvbmVyPT1SVFA7CiAgfQogIGVsc2UKICAgIHJldHVybiBjbG9uZXI9PU5VTEw7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBvd24gd3JpdGUgZnVuY3Rpb24KICovCgpzdGF0aWMgaW50IFdyaXRlKHN0cmluZyBzdHIpCnsKICBpZighc3RyaW5ncChzdHIpIHx8IHN0cj09IiIpCiAgICByZXR1cm4gRkFMU0U7CiAgaWYoIWNsb25lciAmJiBvYmplY3RwKHRoaXNfcGxheWVyKCkpKQogICAgd3JpdGUoc3RyKTsKICBlbHNlCiAgICB0ZWxsX29iamVjdChjbG9uZXIsIHN0cik7CiAgcmV0dXJuIFRSVUU7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBvd24gY29tbWFuZCBmdW5jdGlvbgogKi8KCnN0YXRpYyBpbnQgQ29tbWFuZChzdHJpbmcgc3RyKQp7CiAgaW50IGk7CiAgVEsoIkNvbW1hbmQ6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOwogIG5vc3RvcmUrKzsKICBpZihNT0RFKE1PREVfRUNITykpCiAgICBXTE4oIkRvaW5nOiAiK3N0cik7CiAgaT0oaW50KWNsb25lci0+Y29tbWFuZF9tZShzdHIpOwogIG5vc3RvcmUtLTsKICByZXR1cm4gaTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIG9iamVjdCBzZWFyY2hpbmcKICovCgpzdGF0aWMgdmFyYXJncyBvYmplY3QgWEZpbmRPYmooc3RyaW5nIHN0ciwgaW50IHNpbGVudCkKewogIG9iamVjdCBvYmosIGVudjsKICBzdHJpbmcgKnN0cnM7CiAgaW50IGksIHMsIGNudDsKICAKICBpZighc3RyKQogICAgcmV0dXJuIE5VTEw7CiAgVEsoIlhGaW5kT2JqOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKICBlbnY9RU5WKGNsb25lcik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxcLiIsIrAwMSIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcXF4iLCAisDAyIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxcJCIsICKwMDMiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXFxcXCIsICJcXCIpOwogIGlmIChmaW5kX29iamVjdChzdHIpKSByZXR1cm4gZmluZF9vYmplY3Qoc3RyKTsKICBpZiAoZmlsZV9zaXplKHN0cik+MSkgewogICAgIHJldHVybiBsb2FkX29iamVjdChzdHIpOwogIH0KICBzPXNpemVvZihzdHJzPXN0cmlwX2V4cGxvZGUoc3RyLCAiLiIpKTsKICB3aGlsZShzLS0pCiAgewogICAgaWYoc3Ryc1tpXT09Im0ifHxzdHJzW2ldPT0ibWUiKQogICAgICBzdHJzW2ldPVJOQU1FKGNsb25lcik7CiAgICBlbHNlIGlmKHN0cnNbaV09PSJoInx8c3Ryc1tpXT09ImhlcmUiKQogICAgICBzdHJzW2ldPW9iamVjdF9uYW1lKEVOVihjbG9uZXIpKTsKICAgIGlmKG9iaj1GaW5kT2JqKHN0cnNbaSsrXSxlbnYsKHNpbGVudD8xOjApKSkKICAgICAgZW52PW9iajsKICAgIGVsc2UKICAgICAgYnJlYWs7CiAgfQogIHJldHVybiBvYmo7Cn0KCnN0YXRpYyB2YXJhcmdzIG9iamVjdCBGaW5kT2JqKHN0cmluZyBzdHIsIG9iamVjdCBlbnYsIGludCBzaWxlbnQpCnsKICBvYmplY3Qgb2JqLCAqaW52OwogIHN0cmluZyB0bXA7CiAgaW50IG51bSwgZTsKICAKICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgfHwgIW9iamVjdHAoZW52KSkKICAgIHJldHVybiBOVUxMOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICKwMDEiLCAiLiIpOwogIHdoaWxlKHN0cltlKytdPT0nXicpCiAgICA7CiAgc3RyPXN0clstLWUuLjwxXTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAisDAyIiwgIl4iKTsKICBpZihvYmo9VmFyVG9PYmooc3RyKSkKICAgIDsKICBlbHNlIGlmKHN0clswXT09JwMnKQogICAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIrAwMyIsICIkIik7CiAgZWxzZSBpZihzc2NhbmYoc3RyLCAiJWQiLCBudW0pJiYoaW52PWFsbF9pbnZlbnRvcnkoZW52KSkpCiAgewogICAgaWYobnVtPjAmJm51bTw9c2l6ZW9mKGludikpCiAgICAgIG9iaj1pbnZbbnVtLTFdOwogICAgZWxzZQogICAgewogICAgICBXRExOKCJTcGVjaWZpZWQgb2JqZWN0IG51bWJlciBvdXQgb2YgcmFuZ2UgWzEtIitzaXplb2YoaW52KSsiXSIpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICB9CiAgaWYob2JqfHwob2JqPXByZXNlbnQoc3RyLCBlbnYpKXx8CiAgICAgKG9iaj1maW5kX3BsYXllcihMT1dFUihzdHIpKSl8fAogICAgIChvYmo9ZmluZF9saXZpbmcoc3RyKSl8fAogICAgIChvYmo9ZmluZF9vYmplY3QobG9uZ19wYXRoKHN0cikpKSkKICB7CiAgICB3aGlsZShlLS0pCiAgICB7CiAgICAgIGlmKCEob2JqPUVOVihvYmopKSkKICAgICAgewoJVygiU3BlY2lmaWVkIG9iamVjdCBoYXMgbm8gZW52aXJvbm1lbnQgWyIpOwoJd2hpbGUoZS0tKQoJICBXKCJeIik7CglXRExOKHN0cisiXSIpOwoJcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZQogICAgaWYoIXNpbGVudCkKICAgICAgV0RMTigiU3BlY2lmaWVkIG9iamVjdCBkb2VzIG5vdCBleGlzdCBbIitzdHIrIl0iKTsKICByZXR1cm4gb2JqOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb2JqZWN0IHZhcmlhYmxlIGhhbmRsaW5nCiAqLwoKc3RhdGljIG9iamVjdCBWYXJUb09iaihzdHJpbmcgc3RyKQp7CiAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpIHx8IHN0clswXSE9JyQnKQogICAgcmV0dXJuIE5VTEw7CiAgc3dpdGNoKHN0cikKICB7CiAgICBjYXNlICIkbSI6CiAgICBjYXNlICIkbWUiOgogICAgcmV0dXJuIGNsb25lcjsKICAgIGNhc2UgIiRoIjoKICAgIGNhc2UgIiRoZXJlIjoKICAgIHJldHVybiBFTlYoY2xvbmVyKTsKICAgIGRlZmF1bHQ6CiAgICByZXR1cm4gdmFyaWFibGVbc3RyWzEuLjwxXV07CiAgfQogIHJldHVybihOVUxMKTsgLy9uZXZlciByZWFjaGVkCn0KCnN0YXRpYyBzdHJpbmcgVmFyVG9GaWxlKHN0cmluZyBzdHIpCnsKICByZXR1cm4gc291cmNlX2ZpbGVfbmFtZShWYXJUb09iaihzdHIpKTsKfQoKc3RhdGljIHN0cmluZyBWYXJUb1B1cmVGaWxlKHN0cmluZyBzdHIpCnsKICByZXR1cm4gcHVyZV9maWxlX25hbWUoVmFyVG9PYmooc3RyKSk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBvYmplY3QgZGVzY3JpcHRpb24gcHJpbnRpbmcKICovCgpzdGF0aWMgdm9pZCBQcmludE9iaihvYmplY3Qgb2JqLCBzdHJpbmcgZmlsZSkKewogIG9iamVjdCBpdGVtLCB0bXA7CiAgc3RyaW5nIHN0cjsKICBpbnQgaTsKCiAgU0VDVVJFMSgpOwogIGlmKCFvYmopCiAgICByZXR1cm47CiAgUHJpbnRTaG9ydCgiU2hvcnQ6ICIsIG9iaiwgZmlsZSk7CiAgaWYoIWZpbGV8fGZpbGU9PSIiKQogICAgV0xOKCJMb25nIDoiKTsKICBlbHNlCiAgICB3cml0ZV9maWxlKGZpbGUsIkxvbmcgOlxuIik7CiAgaWYocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmopKQogICAgc3RyPWNhcGl0YWxpemUoZ2V0dWlkKG9iaikpOwogIGVsc2UKICB7CiAgICBpZihvYmplY3RfbmFtZShvYmopWzAuLjI2XT09Ii9kL3VudGVyd2VsdC9vYmpla3RlL3RlZGR5IyIgJiYKICAgICAgIElTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkKICAgICAgc3RyPSJFaW4gVGVkZHkgKHN0dW1tKSI7CiAgICBlbHNlCiAgICB7CiAgICAgIGlmKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfSU5UX0xPTkcpKQoJOwogICAgICBlbHNlIGlmKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfTE9ORykpCgk7CiAgICAgIGVsc2UKCXN0cj0iLSBubyBsb25nIGRlc2NyaXB0aW9uIC1cbiI7CiAgICB9CiAgfQogIGlmKCFmaWxlfHxmaWxlPT0iIikKICAgIFcoc3RyKTsKICBlbHNlCiAgICB3cml0ZV9maWxlKGZpbGUsc3RyKTsKICBGT1JBTEwoaXRlbSwgb2JqKQogIHsKICAgIGlmKCFpKQogICAgICBpZighZmlsZXx8ZmlsZT09IiIpCglXTE4oIkNvbnRlbnQ6Iik7CiAgICAgIGVsc2UKCXdyaXRlX2ZpbGUoZmlsZSwiQ29udGVudDpcbiIpOwogICAgUHJpbnRTaG9ydChBUklHSFQoKytpKyIuICIsIDQsICIgIiksIGl0ZW0sIGZpbGUpOwogIH0KfQoKc3RhdGljIHN0cmluZyBPYmpGaWxlKG9iamVjdCBvYmopCnsKICByZXR1cm4gIlsiK3Nob3J0X3BhdGgob2JqZWN0X25hbWUob2JqKSkrIl0iOwp9CgpzdGF0aWMgdmFyYXJncyB2b2lkIFByaW50U2hvcnQoc3RyaW5nIHByZSwgb2JqZWN0IG9iaiwgc3RyaW5nIGZpbGUpCnsKICBzdHJpbmcgc3RyOwoKICBTRUNVUkUxKCk7CiAgaWYoIW9iaikKICAgIHJldHVybjsKICBpZihNT0RFKE1PREVfU0hPUlQpKQogIHsKICAgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iaikpCiAgICAgIHN0cj1jYXBpdGFsaXplKGdldHVpZChvYmopKTsKICAgIGVsc2UKICAgIHsKICAgICAgaWYoISgoc3RyPShzdHJpbmcpb2JqLT5RdWVyeVByb3AoUF9JTlRfU0hPUlQpKXx8CgkgICAoc3RyPShzdHJpbmcpb2JqLT5RdWVyeVByb3AoUF9TSE9SVCkpKSkKCWlmKGlzX3BsYXllcihvYmopKQoJICBzdHI9Q1JOQU1FKG9iaikrIiAoaW52aXNpYmxlKSI7CgllbHNlCgkgIHN0cj0iLSBubyBzaG9ydCBkZXNjcmlwdGlvbiAtIjsKICAgIH0KICAgIHN0cj1BTEVGVChzcHJpbnRmKCIlTyAiLHN0ciksIDM0LCAiLiIpKyIgIjsKICB9CiAgZWxzZQogICAgc3RyPSIiOwogIGlmKGludGVyYWN0aXZlKG9iaikpCiAgICBzdHIrPSJpIjsKICBlbHNlIGlmKGxpdmluZyhvYmopKQogICAgc3RyKz0ibCI7CiAgZWxzZQogICAgc3RyKz0iLiI7CiAgc3RyKz0oc2hhZG93KG9iaiwgMCkgPyAicyIgOiAiLiIpOwogIGlmKCFmaWxlfHxmaWxlPT0iIikKICAgIFdMTigocHJlK0NBUChzdHIpKyIgIitPYmpGaWxlKG9iaikpWzAuLjc5XSk7CiAgZWxzZQogICAgd3JpdGVfZmlsZShmaWxlLChwcmUrQ0FQKHN0cikrIiAiK09iakZpbGUob2JqKSlbMC4uNzldKyJcbiIpOwp9CgpzdGF0aWMgdmFyYXJncyB2b2lkIERlZXBQcmludFNob3J0KG9iamVjdCBlbnYsIGludCBpbmRlbnQsIHN0cmluZyBwcmUsIHN0cmluZyBmaWxlKQp7CiAgaW50IGk7CiAgb2JqZWN0IGl0ZW07CiAgc3RyaW5nIHN0cjsKICAKICBTRUNVUkUxKCk7CiAgaWYoIWVudikKICAgIHJldHVybjsKICBmb3IoaT1pbmRlbnQsc3RyPSIiOyBpLS07IHN0cis9IiAgIik7CiAgaWYocHJlKQogICAgc3RyKz1wcmU7CiAgaWYoIWZpbGV8fGZpbGU9PSIiKQogICAgVyhzdHIpOwogIGVsc2UKICAgIHdyaXRlX2ZpbGUoZmlsZSxzdHIpOwogIGkrKzsKICBQcmludFNob3J0KCIiLGVudixmaWxlKTsKICBGT1JBTEwoaXRlbSwgZW52KQogICAgRGVlcFByaW50U2hvcnQoaXRlbSxpbmRlbnQrMSxBUklHSFQoKCsraSkrIi4gIiw0LCIgIiksZmlsZSk7Cn0KCnN0YXRpYyBzdHJpbmcgYnJlYWtfc3RyaW5nX2hhcmQoc3RyaW5nIHN0ciwgaW50IGxlbiwgc3RyaW5nIHByZSkKewogIGludCBzLHAsdDsKICBzdHJpbmcgdG1wOwoKICBpZighc3RyfHwhKHM9c2l6ZW9mKHN0cikpKQogICAgcmV0dXJuICIiOwogIHQ9bGVuLShwPXNpemVvZihwcmUpKS0xOwoKICB0bXA9IiI7CiAgd2hpbGUocCtzPmxlbikKICB7CiAgICB0bXArPXByZStzdHJbMC4udF0rIlxuIjsKCXN0cj1zdHJbdCsxLi5dOwoJcy09dDsKICB9CiAgaWYoc2l6ZW9mKHN0cikpCiAgICB0bXArPXByZStzdHJbMC4uXSsiXG4iOwogIHJldHVybiB0bXA7Cn0KICAKc3RhdGljIHZvaWQgZHByb3Aoc3RyaW5nIGtleSwgbWl4ZWQgZGF0YSwgb2JqZWN0IG9iaikKewogIGlmKHBpcGVfb3V0JiZwaXBlX29mKQogICAgd3JpdGVfZmlsZShwaXBlX29mLGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhvYmotPlF1ZXJ5UHJvcChrZXkpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOwogIGVsc2UKICAgIFcoYnJlYWtfc3RyaW5nX2hhcmQobWl4ZWRfdG9fc3RyaW5nKG9iai0+UXVlcnlQcm9wKGtleSksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7Cn0KCnN0YXRpYyBzdHJpbmcgcHJvcGZsYWdzKHN0cmluZyBrZXksIG9iamVjdCBvYikKewogIGludCB0bXA7CiAgc3RyaW5nICpmbGFnczsKICB0bXA9KGludClvYi0+UXVlcnkoa2V5LDEpOwogIGZsYWdzPSh7fSk7CiAgdG1wJlNBVkUgPwkgICAgICAgZmxhZ3MrPSh7IlNBViJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CiAgdG1wJlBST1RFQ1RFRCA/ICAgICAgZmxhZ3MrPSh7IlBSTyJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CiAgdG1wJlNFQ1VSRUQgPyAgICAgICAgZmxhZ3MrPSh7IlNFQyJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CiAgdG1wJk5PU0VUTUVUSE9EID8gICAgZmxhZ3MrPSh7Ik5TTSJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CiAgdG1wJlNFVE1OT1RGT1VORCA/ICAgZmxhZ3MrPSh7IlNNTiJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CiAgdG1wJlFVRVJZTU5PVEZPVU5EID8gZmxhZ3MrPSh7IlFNTiJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CiAgdG1wJlFVRVJZQ0FDSEVEID8gICAgZmxhZ3MrPSh7IlFDQSJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CiAgdG1wJlNFVENBQ0hFRCA/ICAgICAgZmxhZ3MrPSh7IlNDQSJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CiAgcmV0dXJuICIiK2ltcGxvZGUoZmxhZ3MsInwiKTsKfQoKc3RhdGljIHZvaWQgZHByb3AyKHN0cmluZyBrZXksIG1peGVkIGRhdGEsIG9iamVjdCBvYikKewogIGlmKHBpcGVfb3V0JiZwaXBlX29mKQogICAgd3JpdGVfZmlsZShwaXBlX29mLGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhwcm9wZmxhZ3Moa2V5LG9iKSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKICBlbHNlCiAgICBXKGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhwcm9wZmxhZ3Moa2V5LG9iKSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKfQoKc3RhdGljIG1peGVkIHByb3BtZXRob2RzKHN0cmluZyBrZXksIG9iamVjdCBvYikKewogIHJldHVybiAobWl4ZWQpb2ItPlF1ZXJ5KGtleSwyKTsKfQoKc3RhdGljIHZvaWQgZHByb3AzKHN0cmluZyBrZXksIG1peGVkIGRhdGEsIG9iamVjdCBvYikKewogIGlmKHBpcGVfb3V0JiZwaXBlX29mKQogICAgd3JpdGVfZmlsZShwaXBlX29mLGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhwcm9wbWV0aG9kcyhrZXksb2IpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOwogIGVsc2UKICAgIFcoYnJlYWtfc3RyaW5nX2hhcmQobWl4ZWRfdG9fc3RyaW5nKHByb3BtZXRob2RzKGtleSxvYiksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7Cn0KCnN0YXRpYyB2b2lkIER1bXBQcm9wZXJ0aWVzKG9iamVjdCBvYmosIGludCBmbGFnKQp7CiAgU0VDVVJFMSgpOwogIGlmKCFvYmopCiAgICByZXR1cm47CiAgUElQRV9ERUxFVEUocGlwZV9vZik7CiAgc3dpdGNoIChmbGFnKSB7CiAgICBjYXNlIDA6CiAgICAgIHdhbGtfbWFwcGluZygoKG1hcHBpbmcgKikob2JqLT5fX3F1ZXJ5X3Byb3BlcnRpZXMoKSkpWzBdLCMnZHByb3Asb2JqKTsgLy8nKQogICAgICBicmVhazsKICAgIGNhc2UgMToKICAgICAgd2Fsa19tYXBwaW5nKCgobWFwcGluZyAqKShvYmotPl9fcXVlcnlfcHJvcGVydGllcygpKSlbMF0sIydkcHJvcDIsb2JqKTsgLy8nKQogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgd2Fsa19tYXBwaW5nKCgobWFwcGluZyAqKShvYmotPl9fcXVlcnlfcHJvcGVydGllcygpKSlbMF0sIydkcHJvcDMsb2JqKTsgLy8nKQogICAgICBicmVhazsKICB9Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBtb3Zpbmcgb2JqZWN0cwogKi8KCnN0YXRpYyBpbnQgTW92ZU9iaihvYmplY3Qgb2JqMSwgb2JqZWN0IG9iajIsIGludCBzaWxlbnQpCnsKICBpbnQgZXJyOwogIG9iamVjdCBvbGRlbnY7CgogIFNFQ1VSRTIoRkFMU0UpOwogIGlmKCEob2JqMSYmb2JqMikpCiAgICByZXR1cm4gRkFMU0U7CiAgb2xkZW52PUVOVihvYmoxKTsKICBlcnI9KGludClvYmoxLT5tb3ZlKG9iajIsIE1fU0lMRU5UfE1fTk9DSEVDSyk7CiAgaWYoIXNpbGVudCkKICAgIHN3aXRjaChlcnIpCiAgICB7CiAgICAgIGNhc2UgTUVfUExBWUVSOgogICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgTUVfUExBWUVSIik7CiAgICAgIGlmKG9sZGVudiAmJiBvbGRlbnYgIT0gRU5WKG9iajEpKQoJV0RMTigiT2JqZWN0IGhhcyBiZWVuIG1vdmVkIik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgICAgY2FzZSBNRV9UT09fSEVBVlk6CiAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCBNRV9UT09fSEVBVlkiKTsKICAgICAgaWYob2xkZW52ICYmIG9sZGVudiAhPSBFTlYob2JqMSkpCglXRExOKCJPYmplY3QgaGFzIGJlZW4gbW92ZWQiKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgICBjYXNlIE1FX0NBTlRfVFBPUlRfSU46CiAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCBNRV9DQU5UX1RQT1JUX0lOIik7CiAgICAgIGlmKG9sZGVudiAmJiBvbGRlbnYgIT0gRU5WKG9iajEpKQoJV0RMTigiT2JqZWN0IGhhcyBiZWVuIG1vdmVkIik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgICAgY2FzZSBNRV9DQU5UX1RQT1JUX09VVDoKICAgICAgV0RMTigiT2JqZWN0IHJldHVybmVkIE1FX0NBTlRfVFBPUlRfT1VUIik7CiAgICAgIGlmKG9sZGVudiAmJiBvbGRlbnYgIT0gRU5WKG9iajEpKQoJV0RMTigiT2JqZWN0IGhhcyBiZWVuIG1vdmVkIik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgICAgZGVmYXVsdDoKICAgICAgV0RMTigiT2JqZWN0IHJldHVybmVkIHVua25vd24gcmV0dXJuIHZhbHVlIik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICByZXR1cm4gVFJVRTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHNhdmUgZGVzdHJ1Y3Rpbmcgb2Ygb2JqZWN0cwogKi8KCnN0YXRpYyB2b2lkIERlc3RydWN0KG9iamVjdCBvYmopCnsKICBpZighb2JqIHx8ICF0aGlzX29iamVjdCgpKQogICAgcmV0dXJuOwogIGNhdGNoKG9iai0+cmVtb3ZlKCkpOwogIGlmKG9iamVjdHAob2JqKSAmJiAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmopKQogICAgZGVzdHJ1Y3Qob2JqKTsKfQoKc3RhdGljIHZvaWQgRGVlcENsZWFuKG9iamVjdCBvYmopCnsKICBpZighb2JqKQogICAgcmV0dXJuOwogIGZpbHRlcihmaWx0ZXIoZGVlcF9pbnZlbnRvcnkob2JqKSwgImlzX25vdF9wbGF5ZXIiLCBNRSksCgkgICAgICAgIkRlc3RydWN0IiwgTUUpOwogIGlmKGlzX25vdF9wbGF5ZXIob2JqKSkKICAgIERlc3RydWN0KG9iaik7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBTaG93IHRoZSBpbmhlcml0YW5jZSB0cmVlIG9mIG9iamVjdHMKICovCgpzdGF0aWMgb2JqZWN0ICpTdWJOb2RlcyhvYmplY3Qgb2JqKQp7CiAgaW50IHM7CiAgb2JqZWN0ICpvYmpzOwogIHN0cmluZyAqaW5saXN0OwogIAogIGlmKCFvYmopCiAgICByZXR1cm4gTlVMTDsKICBpbmxpc3Q9aW5oZXJpdF9saXN0KG9iaik7CiAgcz1zaXplb2YoaW5saXN0KTsKICBvYmpzPSh7fSk7CiAgd2hpbGUocy0tPjEpCiAgICBvYmpzPSh7ZmluZF9vYmplY3QoaW5saXN0W3NdKX0pK29ianM7CiAgcmV0dXJuIG9ianM7Cn0KCnN0YXRpYyB2b2lkIEluaGVyaXRhbmNlKG9iamVjdCBvYmosIHN0cmluZyBmdW5jLCBzdHJpbmcgcHJlKQp7CiAgaW50IGksIHM7CiAgb2JqZWN0ICpsbjsKICBzdHJpbmcgc3RyOwogIAogIGlmKCFvYmopCiAgICByZXR1cm47CiAgc3RyPXByZSsiICIrT2JqRmlsZShvYmopOwogIGlmKGZ1bmMpCiAgewogICAgc3RyPUFMRUZUKHN0cisiICIsIDUwLCAiLiIpOwogICAgaWYoZnVuY3Rpb25fZXhpc3RzKGZ1bmMsIG9iaik9PW9iamVjdF9uYW1lKG9iaikpCiAgICAgIHN0cis9QVJJR0hUKCIgIitmdW5jLCAxOSwgIi4iKTsKICAgIGVsc2UKICAgICAgc3RyKz1BUklHSFQoIiIsIDE5LCAiLiIpOwogIH0KICBpZihwaXBlX291dCYmcGlwZV9vZikKICAgIHdyaXRlX2ZpbGUocGlwZV9vZixzdHIrIlxuIik7CiAgZWxzZQogICAgV0xOKHN0cik7CiAgbG49U3ViTm9kZXMob2JqKTsKICBmb3IoaT0wOyBpPHNpemVvZihsbik7IGkrKykKICAgIGxuPWxuLVN1Yk5vZGVzKGxuW2ldKTsKICBzPXNpemVvZihsbik7CiAgZm9yKGk9MDsgaTxzOyBpKyspCiAgICBJbmhlcml0YW5jZShsbltpXSwgZnVuYywgcHJlKyIuLi4uLiIpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZmlsZSBuYW1lIGhhbmRsaW5nCiAqLwoKc3RhdGljIHN0cmluZyBYRmlsZShzdHJpbmcgZmlsZSkKewogIFRLKCJYRmlsZTogZmlsZTogIisoZmlsZT9maWxlOiIoTlVMTCkiKSk7CiAgaWYoZmlsZSkKICAgIHN3aXRjaChmaWxlWzBdKQogICAgewogICAgICBjYXNlICdAJzoKCXJldHVybiBzb3VyY2VfZmlsZV9uYW1lKFhGaW5kT2JqKGZpbGVbMS4uPDFdKSk7CiAgICAgIGNhc2UgJyQnOgoJcmV0dXJuIHNvdXJjZV9maWxlX25hbWUoWEZpbmRPYmooZmlsZSkpOwogICAgICBkZWZhdWx0OgoJcmV0dXJuIG9sZF9leHBsb2RlKGxvbmdfcGF0aChmaWxlKSwiIyIpWzBdOwogICAgfQogIHJldHVybiBOVUxMOwp9CgpzdGF0aWMgc3RyaW5nIFhGaW5kRmlsZShzdHJpbmcgZmlsZSkKewogIFRLKCJYRmluZEZpbGU6IGZpbGU6ICIrKGZpbGU/ZmlsZToiKE5VTEwpIikpOwogIGlmKGZpbGU9WEZpbGUoZmlsZSkpCiAgewogICAgaWYoZmlsZV9zaXplKGZpbGUpPj0wKQogICAgICByZXR1cm4gZmlsZTsKICAgIGlmKGZpbGVbPDMuLjwxXSE9Ii5jIiAmJiBmaWxlX3NpemUoZmlsZSsiLmMiKT4wKQogICAgICByZXR1cm4gZmlsZSsiLmMiOwogIH0KICBXRExOKCJGaWxlIG5vdCBmb3VuZCBvciBub3QgcmVhZGFibGUgWyIrc2hvcnRfcGF0aChmaWxlKSsiXSIpOwogIHJldHVybiBOVUxMOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZmlsZSBwcmludGluZywgc2VhcmNoaW5nIGFuZCBleGVjdXRpbmcKICovCgpzdGF0aWMgdm9pZCBYTW9yZUZpbGUoc3RyaW5nIGZpbGUsIGludCBmbGFnKQp7CiAgaW50IHMsc2l6ZTsKICAKICBTRUNVUkUxKCk7CiAgaWYoIWZpbGUpCiAgICByZXR1cm47CiAgCiAgLy8gdGVybT0oc3RyaW5nKWNsb25lci0+UXVlcnlQcm9wKFBfVFRZKSE9ImR1bWIiOwogIGlmKChzaXplPShmaWxlX3NpemUobW9yZWZpbGU9bG9uZ19wYXRoKGZpbGUpKSkpPjApCiAgewogICAgaWYoc2l6ZT4xMDAwMDApCiAgICAgIFdETE4oIldhcm5pbmc6IGxhcmdlIGZpbGUiKTsKICAgIE1vcmVGaWxlKE5VTEwpOwogIH0KICBlbHNlIGlmKGZsYWcpCiAgICBXRExOKCJDYW5ub3QgcmVhZCBmaWxlIik7Cn0KCi8qCnN0YXRpYyBzdHJpbmcgcmVhZF9idWZmZXIoc3RyaW5nIGZpbGVuYW1lLCBpbnQgc3RhcnQsIGludCBudW1iZXIpCnsKICBtaXhlZCB0bXA7CiAgc3RyaW5nIHJlc3VsdDsKICBpbnQgY3VycmVudDsKCiAgaWYoIWZpbGVuYW1lfHxmaWxlbmFtZT09IiIpCiAgICByZXR1cm4gIiI7CiAgaWYobnVtYmVyPD0xKQogICAgbnVtYmVyPTE7CiAgbnVtYmVyLS07CiAgcmVzdWx0PSIiOwogIGlmKGZpbGVuYW1lIT1saW5lX2J1ZmZlcl9uYW1lKQogIHsKICAgIC8vIFRLKCJyZWFkX2J1ZmZlcjogaW5pdGlhbGl6aW5nIik7CiAgICBsaW5lX2J1ZmZlcj0oW10pOwogICAgbGluZV9idWZmZXJfbmFtZT1maWxlbmFtZTsKICAgIGN1cnJlbnQ9MDsKICB9CiAgZWxzZQogICAgY3VycmVudD1zdGFydDsKCiAgd2hpbGUoY3VycmVudDw9c3RhcnQrbnVtYmVyICYmIHN0cmluZ3AoKHRtcD1sb2FkX2J1ZmZlcihjdXJyZW50KyspKSkpCiAgICBpZihjdXJyZW50Pj1zdGFydCkKICAgICAgcmVzdWx0Kz10bXA7CiAgcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIHN0cmluZyBsb2FkX2J1ZmZlcihpbnQgbGluZSkKewogIGludCBpLCBjdXJyZW50LCBzdGFydCwgbGVuZ3RoLCAqaWR4OwoKICBpZihpbnRwKGxpbmVfYnVmZmVyW2xpbmVdKSkKICB7CiAgICAvLyBUSygibG9hZF9idWZmZXI6IE5vdGZvdW5kOiAiK2xpbmUpOwogICAgY3VycmVudD1saW5lOwogICAgd2hpbGUoY3VycmVudD4wJiZpbnRwKGxpbmVfYnVmZmVyWy0tY3VycmVudF0pKTsKICAgIGZvcihpPWN1cnJlbnQ7aTw9bGluZTtpKyspCiAgICB7CiAgICAgIC8vIFRLKCJsb2FkX2J1ZmZlcjogdHJ5aW5nOiAiK2kpOwogICAgICBpZihpPjApCglpZHg9bGluZV9idWZmZXJbaS0xXTsKICAgICAgZWxzZQoJaWR4PSh7MCwwfSk7CiAgICAgIGxlbmd0aD1yZWFkX2xpbmUoKHN0YXJ0PWlkeFswXStpZHhbMV0pKTsKICAgICAgLy8gVEsoImxvYWRfYnVmZmVyOiAiK3N0YXJ0KyIvIitsZW5ndGgpOwogICAgICBsaW5lX2J1ZmZlcltpXT0oe3N0YXJ0LGxlbmd0aH0pOwogICAgfQogIH0KICBpZHg9bGluZV9idWZmZXJbbGluZV07CiAgcmV0dXJuCiAgICByZWFkX2J5dGVzKGxpbmVfYnVmZmVyX25hbWUsaWR4WzBdLGlkeFsxXSk7Cn0KCnN0YXRpYyBpbnQgcmVhZF9saW5lKGludCBvZmZzZXQpCnsKICBtaXhlZCBsb2NfYnVmOwogIGludCBsZW5ndGgsIHBvczsKCiAgLy8gVEsoInJlYWRfbGluZTogIitvZmZzZXQpOwogIGxlbmd0aD0wOwogIHdoaWxlKCFpbnRwKChsb2NfYnVmPXJlYWRfYnl0ZXMobGluZV9idWZmZXJfbmFtZSxvZmZzZXQrbGVuZ3RoLDEwMjQpKSkpCiAgewogICAgaWYoKHBvcz1tZW1iZXIobG9jX2J1ZiwnXG4nKSk+PTApCiAgICAgIHJldHVybiBsZW5ndGgrcG9zKzE7CiAgICBsZW5ndGgrPTEwMjQ7CiAgfQogIHJldHVybiBsZW5ndGg7Cn0KKi8KCnN0YXRpYyB2b2lkIE1vcmVGaWxlKHN0cmluZyBzdHIpCnsKICBpbnQgaSwgb2ZmOwogIHN0cmluZyBmLCBsLCByOwogIAogIFNFQ1VSRTEoKTsKICAKICBpZiAoc3RyIC8qJiYgc2l6ZW9mKHN0cikqLykKICB7CgkJaWYoICFzaXplb2Yoc3RyKSApIHN0cj0iXDAiOwogICAgaWYodGVybSkKICAgICAgVygiG00bWzFNIik7CiAgICBzd2l0Y2goc3RyWzBdKQogICAgewogICAgICBjYXNlICdxJzoKICAgICAgY2FzZSAneCc6CiAgICAgIG1vcmVmbGFnPUZBTFNFOwogICAgICBtb3Jlb2Zmc2V0PTE7CiAgICAgIGlmKG1vcmVmaWxlPT1UTVBfRklMRXx8bW9yZWZpbGU9PVBJUEVfRklMRSkKCXJtKG1vcmVmaWxlKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIGJyZWFrOwogICAgICBjYXNlICdQJzoKICAgICAgY2FzZSAnVSc6CiAgICAgIG1vcmVmbGFnPUZBTFNFOwogICAgICBtb3Jlb2Zmc2V0PW1vcmVvZmZzZXQtbW9yZWxpbmVzOwogICAgICBjYXNlICdwJzoKICAgICAgY2FzZSAndSc6CiAgICAgIG1vcmVvZmZzZXQ9bW9yZW9mZnNldC0yKm1vcmVsaW5lczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ0QnOgogICAgICBjYXNlICdOJzoKICAgICAgbW9yZW9mZnNldCs9bW9yZWxpbmVzOwogICAgICBjYXNlIDA6CS8qIFJFVFVSTiAqLwogICAgICBjYXNlICdkJzoKICAgICAgaWYobW9yZWZsYWcpCiAgICAgIHsKCW1vcmVmbGFnPUZBTFNFOwoJbW9yZW9mZnNldD0xOwoJaWYobW9yZWZpbGU9PVRNUF9GSUxFKQoJICBybShtb3JlZmlsZSk7CglyZXR1cm47CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJy8nOgogICAgICBtb3Jlb2Zmc2V0LS07CiAgICAgIG1vcmVfc2VhcmNoZXhwcj1zdHJbMS4uPDFdOwogICAgICBjYXNlICduJzoKICAgICAgaT1tb3Jlb2Zmc2V0LW1vcmVsaW5lcysxOwogICAgICBpZihtb3JlX3NlYXJjaGV4cHI9PSIiKQogICAgICB7CglXRExOKCJObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iKTsKCXJldHVybjsKICAgICAgfQogICAgICBpZighcmVnZXhwKCh7ImR1bW15In0pLCBtb3JlX3NlYXJjaGV4cHIpKQoJV0RMTigiQmFkIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOwogICAgICBlbHNlCgl3aGlsZSgobD1yZWFkX2ZpbGUobW9yZWZpbGUsIGkrKywgMSkpJiYKCSAgICAgICFzaXplb2YocmVnZXhwKCh7bH0pLCBtb3JlX3NlYXJjaGV4cHIpKSkKCSAgOwogICAgICBpZihsKQogICAgICB7CglXTE4oIioqKiBTa2lwcGluZyAuLi4iKTsKCW1vcmVvZmZzZXQ9aS0xOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewoJV0xOKCIqKiogUGF0dGVybiBub3QgZm91bmQiKTsKCW1vcmVvZmZzZXQtPW1vcmVsaW5lczsKICAgICAgfQogICAgICBicmVhazsKICAgICAgY2FzZSAnMCcuLic5JzoKICAgICAgc3NjYW5mKHN0ciwgIiVkIiwgaSk7CiAgICAgIG1vcmVvZmZzZXQ9aTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBtb3Jlb2Zmc2V0PTE7CiAgICBtb3JlZmxhZz1GQUxTRTsKICB9CiAgaWYobW9yZW9mZnNldDwxKQogICAgbW9yZW9mZnNldD0xOwogIGlmKENhdEZpbGUoKSkKICAgIFcoIioqKiBNb3JlOiBxLHUsVSxkLEQsLzxyZWdleHA+LDxsaW5lPiBbIisobW9yZW9mZnNldC0xKSsiXSAqKiogIik7CiAgZWxzZQogIHsKICAgIFcoIioqKiBNb3JlOiBxLHUsVSxkLEQsLzxyZWdleHA+LDxsaW5lPiBbIisobW9yZW9mZnNldC0xKSsiPUVPRl0gKioqICIpOwogICAgbW9yZWZsYWc9VFJVRTsKICB9CiAgaW5wdXRfdG8oIk1vcmVGaWxlIik7CiAgcmV0dXJuOwp9CgovLyBTY2hhZGUgZWlnZW50bGljaCBkYXMgaWNoIGVzIG5ldXNjaHJlaWJlbiBtdXNzdGUsIGFiZXIgZXMgaXN0Ci8vIHNjaG5lbGxlciBuZXUgZ2VzY2hyaWViZW4gYWxzIGR1cmNoIGRpZSB1bmRva3VtZW50aWVyZW4gYWx0ZW4gRnVua3Rpb25lbgovLyBkdXJjaHp1c3RlaWdlbi4uLiAqc2V1ZnoqCi8vCQkJCQkgIFBhZHJlaWMKCnN0YXRpYyBzdHJpbmcgbGFzdF9maWxlLCAqbGFzdF9maWxlX2J1ZmZlcjsKc3RhdGljIGludCAgICBsYXN0X2ZpbGVfZGF0ZSwgbGFzdF9maWxlX3NpemUsIGxhc3RfZmlsZV9jb21wbGV0ZTsKCnN0YXRpYyBzdHJpbmcgc3JlYWRfbGluZShpbnQgbnVtKQp7CiAgIGlmICghbW9yZWZpbGUpIHJldHVybiAiIjsKICAgaWYgKGxhc3RfZmlsZSE9bW9yZWZpbGUgfHwgbGFzdF9maWxlX2RhdGUhPWZpbGVfdGltZShtb3JlZmlsZSkpIHsKICAgICAgaWYgKCEobGFzdF9maWxlPXJlYWRfYnl0ZXMobW9yZWZpbGUsIDAsIDUwMDAwKSkpIHJldHVybiAiIjsKICAgICAgbGFzdF9maWxlX2RhdGU9ZmlsZV90aW1lKG1vcmVmaWxlKTsKICAgICAgbGFzdF9maWxlX2J1ZmZlcj1leHBsb2RlKGxhc3RfZmlsZSwgIlxuIik7CiAgICAgIGxhc3RfZmlsZV9zaXplPXNpemVvZihsYXN0X2ZpbGVfYnVmZmVyKTsKICAgICAgaWYgKHNpemVvZihsYXN0X2ZpbGUpPT01MDAwMCAmJiBsYXN0X2ZpbGVbPDFdIT0nXG4nKSB7CgkgbGFzdF9maWxlX3NpemUtLTsgLy8gbGV0enRlIFplaWxlIG5pY2h0IHZvbGxzdGFlbmRpZyBnZWxlc2VuCgkgbGFzdF9maWxlX2NvbXBsZXRlPTA7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoZmlsZV9zaXplKG1vcmVmaWxlKT41MDAwMCkKCWxhc3RfZmlsZV9jb21wbGV0ZT0wOwogICAgICBlbHNlIGxhc3RfZmlsZV9jb21wbGV0ZT0xOwogICAgICBsYXN0X2ZpbGU9bW9yZWZpbGU7CiAgIH0KICAgaWYgKG51bT09MCkgbnVtPTE7CiAgIC8vIGJlaSB6dSBncm9zc2VuIEZpbGVzIG5pY2h0IG1laHIgYWxsZXMgYnVmZmVybi4uLgogICBpZiAobnVtPmxhc3RfZmlsZV9zaXplKSB7CiAgICAgIGlmIChsYXN0X2ZpbGVfY29tcGxldGUpIHJldHVybiAiIjsKICAgICAgcmV0dXJuIChyZWFkX2ZpbGUobW9yZWZpbGUsIG51bSwgMSkgfHwgIiIpOwogICB9CiAgIHJldHVybiBsYXN0X2ZpbGVfYnVmZmVyW251bS0xXSsiXG4iOwp9CgpzdGF0aWMgaW50IENhdEZpbGUoKQp7CiAgaW50IGVuZDsKICBzdHJpbmcgbDsKICAKICBlbmQ9bW9yZW9mZnNldCttb3JlbGluZXM7CiAgd2hpbGUobW9yZW9mZnNldDxlbmQpCi8vICAgIGlmKChsPXJlYWRfZmlsZShtb3JlZmlsZSwgbW9yZW9mZnNldCwgMSkpIT0iIikKICAgIGlmKChsPXNyZWFkX2xpbmUobW9yZW9mZnNldCkpIT0iIikKICAgIHsKICAgICAgbW9yZW9mZnNldCsrOwogICAgICBXKGwpOwogICAgfQogICAgZWxzZQogICAgICByZXR1cm4gRkFMU0U7Ci8vICBpZihyZWFkX2ZpbGUobW9yZWZpbGUsIG1vcmVvZmZzZXQrMSwgMSkhPSIiKQogIGlmKHNyZWFkX2xpbmUobW9yZW9mZnNldCsxKSE9IiIpCiAgICByZXR1cm4gVFJVRTsKICBlbHNlCiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBpbnQgWEdyZXBGaWxlKHN0cmluZyBwYXQsIHN0cmluZyBmaWxlLCBpbnQgbW9kZSkKewogIGludCBpLCBqLCBmLCBzLCBmc2l6ZTsKICBzdHJpbmcgdGZpbGUsICp0bXAsICp0cywgdDsKICAKICBTRUNVUkUyKEZBTFNFKTsKICBUSygiWEdyZXBGaWxlOiBwYXQ6ICIrcGF0KyIgZmlsZTogIitmaWxlKyIgbW9kZTogIittb2RlKTsKICBpZighKHBhdCYmZmlsZSkpCiAgICByZXR1cm4gRkFMU0U7CiAgdGZpbGU9VE1QX0ZJTEU7CiAgZnNpemU9ZmlsZV9zaXplKGZpbGUpOwogIGZvcihpPTAsZj0wOyBpPGZzaXplICYmIHQ9cmVhZF9ieXRlcyhmaWxlLCBpLCA1MDAwMCk7IGkrPTUwMDAwKQogICAgdG1wPXN0cmlwX2V4cGxvZGUodCwiXG4iKTsKICAgIGlmICh0ICYmIHRbPDFdIT0nXG4nICYmIHNpemVvZih0KT09NTAwMDApIHsKICAgICAgIGktPXNpemVvZih0bXBbPDFdKTsKICAgICAgIHRtcD10bXBbMC4uPDJdOwogICAgfQogICAgaWYocz1zaXplb2YodG1wKSkKICAgIHsKICAgICAgZm9yKGo9MDtqPHM7aisrKQogICAgICB7CglpZihzaXplb2YodHM9cmVnZXhwKCh7KG1vZGUmWEdSRVBfSUNBU0U/bG93ZXJfY2FzZSh0bXBbal0pOnRtcFtqXSl9KSxwYXQpKSkKCXsKCSAgaWYoIShtb2RlJlhHUkVQX1JFVkVSVCkpCgkgICB7CgkgICAgIGlmKCFmKyspCgkgICAgICAgd3JpdGVfZmlsZSh0ZmlsZSwgIioqKiBGaWxlOiAiK2ZpbGUrIiAqKipcbiIpOwoJICAgICB3cml0ZV9maWxlKHRmaWxlLCB0bXBbal0rIlxuIik7CgkgICB9Cgl9CgllbHNlIGlmKG1vZGUmWEdSRVBfUkVWRVJUKQoJewoJICBpZighZisrKQoJICAgIHdyaXRlX2ZpbGUodGZpbGUsICIqKiogRmlsZTogIitmaWxlKyIgKioqXG4iKTsKCSAgd3JpdGVfZmlsZSh0ZmlsZSwgdG1wW2pdKyJcbiIpOwoJfQogICAgICB9CiAgICB9CiAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyB2b2lkIFhFeGVjRmlsZShpbnQgbGluZSkKewogIGludCBpOwogIAogIGlmKCFzY3JpcHRsaW5lKQogICAgcmV0dXJuOwogIGZvcihpPWxpbmU7IGk8c2NyaXB0c2l6ZSYmaTxsaW5lK0VYRUNfTElORVM7IGkrKykKICB7CiAgICBpZighc2NyaXB0bGluZVtpXSkKICAgICAgY29udGludWU7CiAgICBpZighQ29tbWFuZChzY3JpcHRsaW5lW2ldKSkKICAgIHsKICAgICAgc2NyaXB0bGluZT1OVUxMOwogICAgICByZXR1cm47CiAgICB9CiAgfQogIGlmKGk8c2NyaXB0c2l6ZSkKICAgIGNhbGxfb3V0KCJYRXhlY0ZpbGUiLCBFWEVDX1RJTUUsIGkpOwogIGVsc2UKICAgIHNjcmlwdGxpbmU9TlVMTDsKfQoKc3RhdGljIHZvaWQgWG10cFNjcmlwdChzdHJpbmcgZGlyLCBzdHJpbmcgZmlsZSwgc3RyaW5nIG9wdCkKewogIGludCBzLCB0OwogIHN0cmluZyAqZmlsZXM7CiAgCiAgcz1zaXplb2YoZmlsZXM9Z2V0X2RpcihkaXIrIi8qIikpOwogIHdoaWxlKHMtLSkKICB7CiAgICB0PXNpemVvZihmaWxlc1tzXSktMTsKICAgIGlmKGZpbGVzW3NdID09ICIuLiIgfHwgZmlsZXNbc10gPT0gIi4iIHx8IGZpbGVzW3NdW3RdID09ICd+JyB8fAogICAgICAgKGZpbGVzW3NdWzBdID09ICcjJyAmJiBmaWxlc1tzXVt0XSA9PSAnIycpKQogICAgICBjb250aW51ZTsKICAgIGlmKGZpbGVfc2l6ZShkaXIrIi8iK2ZpbGVzW3NdKT09LTIpCiAgICB7CiAgICAgIHdyaXRlX2ZpbGUoZmlsZSwgIm1rZGlyICIrZmlsZXNbc10rIiA7IGNkICIrZmlsZXNbc10rIlxuIik7CiAgICAgIFhtdHBTY3JpcHQoZGlyKyIvIitmaWxlc1tzXSwgZmlsZSwgb3B0KTsKICAgICAgd3JpdGVfZmlsZShmaWxlLCAiY2QgLi5cbiIpOwogICAgfQogICAgZWxzZQogICAgICB3cml0ZV9maWxlKGZpbGUsICJtdHAgLXIgIitvcHQrIiAiK2RpcisiLyIrZmlsZXNbc10rIlxuIik7CiAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogIHBsYXllciBwcm9wZXJ0aWVzIGhhbmRsaW5nCiAqLwoKc3RhdGljIHN0cmluZyBQbGF5ZXJJZGxlKG9iamVjdCBvYmopCnsKICBzdHJpbmcgc3RyOwogIGludCBpLCB0bXA7CiAgCiAgaWYoIW9iaikKICAgIHJldHVybiBOVUxMOwogIGlmKChpPXF1ZXJ5X2lkbGUob2JqKSk+PTYwKQogIHsKICAgIHN0cj1BUklHSFQoIiIrKGkvMzYwMCksIDIsICIwIik7CiAgICBpLT0oaS8zNjAwKSozNjAwOwogICAgc3RyKz0iJyIrQVJJR0hUKCIiKyhpLzYwKSwgMiwgIjAiKTsKICB9CiAgZWxzZQogICAgc3RyPSIuLi4uLiI7CiAgcmV0dXJuIHN0cjsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJBZ2Uob2JqZWN0IG9iaikKewogIHN0cmluZyBzdHI7CiAgaW50IGksIHRtcDsKICAKICBpZighb2JqKQogICAgcmV0dXJuIE5VTEw7CiAgaT0oaW50KW9iai0+UXVlcnlQcm9wKFBfQUdFKTsKICBzdHI9IiAiK0FSSUdIVCgiIisoaS80MzIwMCksIDQsICIuIik7CiAgaS09KGkvNDMyMDApKjQzMjAwOwogIHJldHVybiBzdHIrIjoiK0FSSUdIVCgiIisoaS8xODAwKSwgMiwgIjAiKTsKfQoKc3RhdGljIHN0cmluZyBjcm5hbWUob2JqZWN0IHdobykKewogIHN0cmluZyB1aWQsIGxuYW1lOwoKICBpZigodWlkPWdldHVpZCh3aG8pKT09Uk9PVElEICYmIAogICAgIG9iamVjdF9uYW1lKHdobylbMC4uN109PSIvc2VjdXJlLyIgJiYKICAgICAobG5hbWU9KHN0cmluZyl3aG8tPmxvZ2lubmFtZSgpKSkKICAgIHJldHVybiBDQVAobG5hbWUpOwogIHJldHVybiBDQVAodWlkKTsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJXaG8ob2JqZWN0IG9iaikKewogIG9iamVjdCB0bXA7CiAgc3RyaW5nIHN0ciwgc3RtcDsKICBzdHI9QVJJR0hUKCIiK0xFVkVMKG9iaikgICwgIDMsICIgIik7CiAgc3RyKz1BTEVGVCgiICIrY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKTsKICBzdHIrPVBsYXllckFnZShvYmopOwogIHN0cis9KChpbnQpb2JqLT5RdWVyeVByb3AoUF9HRU5ERVIpPT0xID8gIiBtICIgOiAiIGYgIik7CiAgc3RyKz0ob2JqLT5RdWVyeVByb3AoUF9GUk9HKSkgID8gImYiIDogIi4iOwogIHN0cis9KG9iai0+UXVlcnlQcm9wKFBfR0hPU1QpKSA/ICJnIiA6ICIuIjsKICBzdHIrPShvYmotPlF1ZXJ5UHJvcChQX0lOVklTKSkgPyAiaSIgOiAiLiI7CiAgc3RyKz0ocXVlcnlfZWRpdGluZyhvYmopfHxxdWVyeV9pbnB1dF9wZW5kaW5nKG9iaikgPyAiZSIgOiAiLiIpOwogIHN0cis9KG9iai0+UXVlcnlQcm9wKFBfQVdBWSkpICA/ICJhIiA6ICIuIjsKICBzdHIrPSIgIitQbGF5ZXJJZGxlKG9iaikrIiAiOwogIHN0cis9KHRtcD1FTlYob2JqKSkgPyBPYmpGaWxlKHRtcCkgOiAiLSBmYWJyaWMgb2Ygc3BhY2UgLSI7CiAgcmV0dXJuIHN0cjsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJNYWlsKG9iamVjdCBvYmosIGludCBmbGFnKQp7CiAgc3RyaW5nIHByZTsKICAKICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKICByZXR1cm4gcHJlKyJtYWlsOiAiK29iai0+UXVlcnlQcm9wKFBfTUFJTEFERFIpOwp9CgpzdGF0aWMgc3RyaW5nIFBsYXllcklQKG9iamVjdCBvYmosIGludCBmbGFnKQp7CiAgc3RyaW5nIHByZTsKICAKICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKICByZXR1cm4gcHJlKyJob3N0OiAiK3F1ZXJ5X2lwX25hbWUob2JqKSsiICgiK3F1ZXJ5X2lwX251bWJlcihvYmopKyIpIjsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJSYWNlKG9iamVjdCBvYmosIGludCBmbGFnKQp7CiAgc3RyaW5nIHRtcCwgcHJlOwogIAogIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOwogIHByZT1wcmUrInJhY2U6ICIrQUxFRlQob2JqLT5RdWVyeVByb3AoUF9SQUNFKSsiICIsIDEwLCAiLiIpKyIgZ3VpbGQ6ICI7CiAgdG1wPShzdHJpbmcpb2JqLT5RdWVyeVByb3AoUF9HVUlMRCk7CiAgcmV0dXJuIHRtcCA/IHByZSt0bXAgOiBwcmUrIi0gbm9uZSAtIjsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJEb21haW4ob2JqZWN0IG9iaiwgaW50IGZsYWcpCnsKICBpbnQgaSwgczsKICBtaXhlZCAqdWluZm87CiAgc3RyaW5nICpkb21haW5zLCBwcmU7CiAgCiAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CiAgcHJlKz0iZG9tYWlubG9yZCBvZjogIjsKICB1aW5mbz0obWl4ZWQqKU1BU1RFUi0+Z2V0X3VzZXJpbmZvKGdldHVpZChvYmopKTsKICBpZih1aW5mbyYmKGRvbWFpbnM9dWluZm9bM10pJiYocz1zaXplb2YoZG9tYWlucykpKQogIHsKICAgIGZvcihpPTA7IGk8czsgaSsrKQogICAgewogICAgICBwcmUgKz0gQ0FQKGRvbWFpbnNbaV0pOwogICAgICBpZihpPHMtMSkKCXByZSArPSAiLCAiOwogICAgfQogIH0KICByZXR1cm4gcHJlOwp9CgpzdGF0aWMgc3RyaW5nIFBsYXllclN0YXRzKG9iamVjdCBvYmosIGludCBmbGFnKQp7CiAgc3RyaW5nIHByZTsKICAKICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKICBwcmUrPSJocD0iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX0hQKSwgMywgIjAiKTsKICBwcmUrPSIvIitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9NQVhfSFApLCAzLCAiMCIpOwogIHByZSs9IiBzcD0iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX1NQKSwgMywgIjAiKTsKICBwcmUrPSIvIitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9NQVhfU1ApLCAzLCAiMCIpOwogIHByZSs9IiBmb29kPSIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfRk9PRCksIDMsICIwIik7CiAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX0ZPT0QpLCAzLCAiMCIpOwogIHByZSs9IiBkcmluaz0iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX0RSSU5LKSwgMywgIjAiKTsKICBwcmUrPSIvIitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9NQVhfRFJJTkspLCAzLCAiMCIpOwogIHByZSs9IiBleHBzPSIrb2JqLT5RdWVyeVByb3AoUF9YUCk7CiAgcmV0dXJuIHByZTsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJTbm9vcChvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIHN0cmluZyB0bXAsIHByZTsKICBvYmplY3QgdmljdGltOwogIAogIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOwogIHByZT1wcmUrImlzIHNub29wZWQgYnk6ICI7CiAgaWYodmljdGltPXF1ZXJ5X3Nub29wKG9iaikpCiAgICBwcmUrPUFSSUdIVCgiICIrY3JuYW1lKHZpY3RpbSksIDEyLCAiLiIpOwogIGVsc2UKICAgIHByZSs9Ii4uLi4uLi4uLi4uLiI7CiAgcmV0dXJuIHByZTsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJDbWRBdmcob2JqZWN0IG9iaiwgaW50IGZsYWcpCnsKICBzdHJpbmcgcHJlOwogIAogIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOwogIHJldHVybiBwcmUrImNtZGF2ZzogIisoaW50KW9iai0+X3F1ZXJ5X2NvbW1hbmRfYXZlcmFnZSgpOwp9CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIG1zZyBpbnB1dCB0byBvYmplY3RzCiAqLwoKc3RhdGljIHZvaWQgWE1zZ1NheShzdHJpbmcgc3RyKQp7CiAgaWYoc3RyPT0iLiJ8fHN0cj09IioqIikKICB7CiAgICBXTE4oIltFbmQgb2YgbWVzc2FnZV0iKTsKICAgIHNheSgiW0VuZCBvZiBtZXNzYWdlXVxuIik7CiAgfQogIGVsc2UKICB7CiAgICBzYXkoc3RyKyJcbiIpOwogICAgaW5wdXRfdG8oIlhNc2dTYXkiKTsKICB9Cn0KCnN0YXRpYyB2b2lkIFhNc2dUZWxsKHN0cmluZyBzdHIpCnsKICBpZihzdHI9PSIuInx8c3RyPT0iKioiKQogIHsKICAgIFdMTigiW0VuZCBvZiBtZXNzYWdlXSIpOwogICAgdGVsbF9vYmplY3QobXNndG8sICJbRW5kIG9mIG1lc3NhZ2VdXG4iKTsKICB9CiAgZWxzZQogIHsKICAgIHRlbGxfb2JqZWN0KG1zZ3RvLCBzdHIrIlxuIik7CiAgICBpbnB1dF90bygiWE1zZ1RlbGwiKTsKICB9Cn0KCnN0YXRpYyB2b2lkIFhNc2dTaG91dChzdHJpbmcgc3RyKQp7CiAgaWYoc3RyPT0iLiJ8fHN0cj09IioqIikKICB7CiAgICBXTE4oIltFbmQgb2YgbWVzc2FnZV0iKTsKICAgIHNob3V0KCJbRW5kIG9mIG1lc3NhZ2VdXG4iKTsKICB9CiAgZWxzZQogIHsKICAgIHNob3V0KHN0cisiXG4iKTsKICAgIGlucHV0X3RvKCJYTXNnU2hvdXQiKTsKICB9Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBvd24gb2JqZWN0IG1vdmluZwogKi8KCmludCBtb3ZlKG1peGVkIGRlc3QpCnsKICBtb3ZlX29iamVjdChNRSwgY2xvbmVyP2Nsb25lcjpkZXN0KTsKICByZXR1cm4gVFJVRTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIG9iamVjdCBpZAogKi8KCmludCBpZChzdHJpbmcgc3RyKQp7CiAgaWYoIXNlY3VyaXR5KCkmJk1PREUoTU9ERV9TQ0FOQ0hLKSYmUlRQJiYhSVNfQVJDSChSVFApKQogICAgV0RMTihjcm5hbWUoUlRQKSsiIHNjYW5uZWQgeW91IChpZCkgWyIrcXVlcnlfdmVyYigpKyJdICIrCgkgKFBSRVYgPyBPYmpGaWxlKFBSRVYpIDogIltkZXN0cnVjdGVkIG9iamVjdF0iKSk7CiAgcmV0dXJuIExPV0VSKHN0cik9PUxPV0VSKFRPT0xfTkFNRSk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBzaG9ydCBhbmQgbG9uZyBkZXNjcmlwdGlvbgogKi8KCnN0cmluZyBzaG9ydCgpCnsKICByZXR1cm4gX3F1ZXJ5X3Nob3J0KCkrIi5cbiI7Cn0KCnN0cmluZyBfcXVlcnlfc2hvcnQoKQp7CiAgc3RyaW5nIHNoOyAvLyBhZGRlZCBieSBSdW1hdGEKICBpZihjbG9uZXIpCiAgewogICAgaWYoKCFzZWN1cml0eSgpKSYmTU9ERShNT0RFX1NDQU5DSEspJiYhSVNfQVJDSChSVFApKQogICAgICBXRExOKGNybmFtZShSVFApKyIgc2Nhbm5lZCB5b3UgKHNob3J0KSBbIitxdWVyeV92ZXJiKCkrIl0gIisKCSAgIChQUkVWID8gT2JqRmlsZShQUkVWKSA6ICJbZGVzdHJ1Y3RlZCBvYmplY3RdIikpOwoJaWYoIHNoPVF1ZXJ5KFBfU0hPUlQpICkgcmV0dXJuIHNoOyAvLyBhZGRlZCBieSBSdW1hdGEKICAgIHJldHVybiBjbG9uZXItPm5hbWUoV0VTU0VOKSsiICIrVE9PTF9USVRMRSsiIFsiKwogICAgICBjdGltZSh0aW1lKCkpWzExLi4xOF0rIl0iOwogIH0KICByZXR1cm4gVE9PTF9USVRMRTsKfQoKc3RyaW5nIGxvbmcoKQp7CiAgcmV0dXJuIF9xdWVyeV9sb25nKCk7Cn0KCnN0cmluZyBfcXVlcnlfbG9uZygpCnsKICBpZihjbG9uZXImJiFzZWN1cml0eSgpJiZNT0RFKE1PREVfU0NBTkNISykmJiFJU19BUkNIKFJUUCkpCiAgewogICAgV0RMTihjcm5hbWUoUlRQKSsiIHNjYW5uZWQgeW91IChsb25nKSBbIitxdWVyeV92ZXJiKCkrIl0gIisKCSAoUFJFViA/IE9iakZpbGUoUFJFVikgOiAiW2Rlc3RydWN0ZWQgb2JqZWN0XSIpKTsKICB9CiAgcmV0dXJuIAogICAgIlRoaXMgaXMgIitUT09MX05BTUUrIiB2ZXJzaW9uICIrVE9PTF9WRVJTSU9OKwogICAgIiAobWFpbnRhaW5lZCBieSBLaXJrQE1vcmdlbkdyYXVlbilcbiIrCiAgICAiT3JpZ2luYWwgY29weXJpZ2h0IGhlbGQgYnkgSHlwLlxuIisKICAgICJHYW1lZHJpdmVyIHBhdGNobGV2ZWw6ICIrX19WRVJTSU9OX18rIiBtYXN0ZXIgb2JqZWN0OiAiK19fTUFTVEVSX09CSkVDVF9fKwogICAgIlxuXG5EbyAneGhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIjsKfQoKc3RyaW5nIG5hbWUobWl4ZWQgZHVtbXkxLCBtaXhlZCBkdW1teTIpCnsKICByZXR1cm4gX3F1ZXJ5X3Nob3J0KCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBsaWdodCBzdHVmZgogKi8KCmludCBfcXVlcnlfbGlnaHQoKQp7CiAgcmV0dXJuIHhsaWdodDsKfQoKaW50IF9zZXRfbGlnaHQoaW50IHgpCnsKICByZXR1cm4geGxpZ2h0Owp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogQXV0b2xvYWRpbmcKICovCgptaXhlZCAqX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkKewogIHJldHVybiBBVVRPTE9BRF9BUkdTOwp9Cgp2b2lkIF9zZXRfYXV0b2xvYWRvYmoobWl4ZWQgKmFyZ3MpCnsKICBXTE4oVE9PTF9USVRMRSsiIC4uLiIpOwogIGlmKCFwb2ludGVycChhcmdzKSkKICAgIDsKICBlbHNlIGlmKHNpemVvZihhcmdzKSE9MykKICAgIDsKICBlbHNlIGlmKCFzdHJpbmdwKGFyZ3NbMF0pKQogICAgOwogIGVsc2UgaWYoIWludHAoYXJnc1sxXSkpCiAgICA7CiAgZWxzZSBpZighaW50cChhcmdzWzJdKSkKICAgIDsKICBlbHNlCiAgewogICAgaWYoKHN0cmluZylhcmdzWzBdIT1UT09MX0lOVEVSTkFMKQogICAgewogICAgICBXTE4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CiAgICAgIFdMTigiKioqCSAgICBORVcgRURJVElPTiAgICAgICoqKiIpOwogICAgICBXTE4oIioqKglkbyAneHRvb2wgbmV3cycgZm9yICAqKioiKTsKICAgICAgV0xOKCIqKioJIG1vcmUgaW5mb3JtYXRpb24gICAgKioqIik7CiAgICAgIFdMTigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKICAgIH0KICAgIG1vZGk9KGludClhcmdzWzFdOwogICAgbW9yZWxpbmVzPShpbnQpYXJnc1syXTsKICAgIHJldHVybjsKICB9CiAgVygiKGJhZCBhdXRvbG9hZCwgdXNpbmcgZGVmYXVsdClcbiIpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogY3JlYXRpb24sIHVwZGF0aW5nIGFuZCBpbml0aWFsaXphdGlvbiBzdHVmZgogKi8KCnZvaWQgdXBkYXRlX3Rvb2wobWl4ZWQgKmFyZ3MsIG9iamVjdCBvYmopCnsKICBTRUNVUkUxKCk7CiAgaWYoIShvYmomJmFyZ3MpKQogICAgcmV0dXJuOwogIERlc3RydWN0KFBSRVYpOwogIF9zZXRfYXV0b2xvYWRvYmooYXJncyk7CiAgbW92ZShvYmopOwp9Cgp2b2lkIGNyZWF0ZSgpCnsKICBvYmplY3Qgb2JqOwogIAogIGlmKG1lbWJlcihvYmplY3RfbmFtZSgpLCcjJyk8MCkKICAgIHJldHVybjsKICBpZighY2xvbmVyJiYhKChjbG9uZXI9VFApfHwoY2xvbmVyPUVOVihNRSkpKSYmIWludGVyYWN0aXZlKGNsb25lcikpCiAgICBkZXN0cnVjdChNRSk7CiAgaWYoIUlTX0xFQVJORVIoY2xvbmVyKSkKICAgIGRlc3RydWN0KE1FKTsKICBTZXRQcm9wKFBfTk9EUk9QLCJEYXMgd2FlcmUgenUgZ2VmYWVocmxpY2guXG4iKTsKICBTZXRQcm9wKFBfTkVWRVJEUk9QLDEpOwogIFNldFByb3AoUF9OT0JVWSwxKTsKICBpZihmaWxlX3NpemUoU0FWRV9GSUxFKyIubyIpPjApCiAgewogICAgV0RMTigiTG9hZGluZyAiK1RPT0xfVElUTEUrIiBzZXR0aW5ncyIpOwogICAgcmVzdG9yZV9vYmplY3QoU0FWRV9GSUxFKTsKICB9CiAgaWYoTU9ERShNT0RFX0ZJUlNUKSkKICAgIGNhbGxfb3V0KCJtb3ZlIiwwLGNsb25lcik7CiAgY2FsbF9vdXQoImFkZF9pbnNlcnRfaG9vayIsMSxNRSk7Cn0KCnZvaWQgVEsoc3RyaW5nIHN0cikKewogIGlmICgheHRrKQogICAgcmV0dXJuOwogIHRlbGxfb2JqZWN0KGNsb25lciwiWFRPT0w6ICIrc3RyKyJcbiIpOwp9CgppbnQgWHRrKHN0cmluZyBzdHIpCnsKICB4dGs9IXh0azsKICBXRExOKCJYdG9vbCBpbnRlcm5hbCB0cmFjaW5nICIrKHh0az8iZW5hYmxlZCI6ImRpc2FibGVkIikpOwogIHJldHVybiBUUlVFOwp9Cgp2b2lkIGFkZF9pbnNlcnRfaG9vayhvYmplY3Qgb2JqKQp7CiAgaWYob2JqZWN0cChvYmopKQogICAgY2xvbmVyLT5BZGRJbnNlcnRIb29rKG9iaik7Cn0KCnZvaWQgaW5pdCgpCnsKICBvYmplY3QgZmlyc3QsIHByZXY7CiAgCiAgaWYobWVtYmVyKG9iamVjdF9uYW1lKCksJyMnKTwwKSByZXR1cm47CiAgZmlyc3Q9Zmlyc3RfaW52ZW50b3J5KEVOVihNRSkpOwogIGlmKE1PREUoTU9ERV9QUk9URUNUKSYmaXNfcGxheWVyKGZpcnN0KSYmIUlTX0FSQ0goZmlyc3QpKQogIHsKICAgIFdETE4oIldBUk5JTkc6ICIrY3JuYW1lKGZpcnN0KSsiIHRyaWVkIHRvIG1vdmUgaW50byB5b3VyIGludmVudG9yeSIpOwogICAgdGVsbF9vYmplY3QoZmlyc3QsICJZb3UgY2Fubm90IG1vdmUgeW91cnNlbGYgaW50byAiKwoJCWNybmFtZShjbG9uZXIpKyIncyBpbnZlbnRvcnkuXG4iKTsKICAgIGNhbGxfb3V0KCJEcm9wT2JqIiwwLGZpcnN0KTsKICAgIHJldHVybjsKICB9CiAgZWxzZSBpZihNT0RFKE1PREVfRklSU1QpJiZmaXJzdCE9TUUpCiAgICBtb3ZlKGNsb25lcik7CiAgZWxzZSBhY3Rpb25zKCk7Cn0KCnZvaWQgRHJvcE9iaihvYmplY3Qgb2JqKQp7CiAgaWYoIW9ianx8IW9iamVjdHAob2JqKSkKICAgIHJldHVybjsKICBvYmotPm1vdmUoRU5WKGNsb25lciksTV9OT0NIRUNLfE1fTk9fU0hPVyk7Cn0KCiNkZWZpbmUgQUNUSU9OU1wKKFtcCiAgInhjYWxsb3V0cyIgOiAiWGNhbGxvdXRzIjswOzEsXAogICJ4Y2FsbCIgICAgIDogIlhjYWxsIjswOzEsXAogICJ4Y2F0IiAgICAgIDogIlhjYXQiOzE7MSxcCiAgInhjZCIgICAgICAgOiAiWGNkIjswOzAsXAogICJ4Y2xlYW4iICAgIDogIlhjbGVhbiI7MDswLFwKICAieGNsb25lIiAgICA6ICJYY2xvbmUiOzA7MCxcCiAgInh1Y2xvbmUiICAgOiAiWHVjbG9uZSI7MDswLFwKICAieGNtZHMiICAgICA6ICJYY21kcyI7MDsxLFwKICAieGRiZyIgICAgICA6ICJYZGJnIjswOzAsXAogICJ4ZGNsZWFuIiAgIDogIlhkY2xlYW4iOzA7MCxcCiAgInhkZGVzIiAgICAgOiAiWGRkZXMiOzA7MCxcCiAgInhkZXMiICAgICAgOiAiWGRlcyI7MDswLFwKICAieGRlc3QiICAgICA6ICJYZGVzIjswOzAsXAogICJ4ZGxvb2siICAgIDogIlhkbG9vayI7MDsxLFwKICAieGRvIiAgICAgICA6ICJYZG8iOzA7MCxcCiAgInhkdXBkYXRlIiAgOiAiWGR1cGRhdGUiOzA7MCxcCiAgInhlY2hvIiAgICAgOiAiWGVjaG8iOzA7MCxcCiAgInhldmFsIiAgICAgOiAiWGV2YWwiOzA7MSxcCiAgInhmb3JhbGwiICAgOiAiWGZvcmFsbCI7MDswLFwKICAieGdvdG8iICAgICA6ICJYZ290byI7MDswLFwKICAieGhiZWF0cyIgICA6ICJYaGJlYXRzIjswOzEsXAogICJ4Z3JlcCIgICAgIDogIlhncmVwIjsxOzEsXAogICJ4aGVhZCIgICAgIDogIlhoZWFkIjsxOzEsXAogICJ4aGVscCIgICAgIDogIlhoZWxwIjswOzAsXAogICJ4aW52ZW50b3J5IjogIlhpbnZlbnRvcnkiOzA7MSxcCiAgInhpZHMiICAgICAgOiAiWGlkcyI7MDswLFwKICAieGluZm8iICAgICA6ICJYaW5mbyI7MDswLFwKICAieGluaGVyaXQiICA6ICJYaW5oZXJpdCI7MDsxLFwKICAieGxhZyIgICAgICA6ICJYbGFnIjswOzAsXAogICJ4bGlnaHQiICAgIDogIlhsaWdodCI7MDswLFwKICAieGxvYWQiICAgICA6ICJYbG9hZCI7MDswLFwKICAieGxvb2siICAgICA6ICJYbG9vayI7MDsxLFwKICAieGxwYyIgICAgICA6ICJYbHBjIjswOzAsXAogICJ4bWFuIiAgICAgIDogIlhtYW4iOzA7MCxcCiAgInhtb3JlIiAgICAgOiAiWG1vcmUiOzE7MCxcCiAgInhtb3ZlIiAgICAgOiAiWG1vdmUiOzA7MCxcCiAgInhtc2ciICAgICAgOiAiWG1zZyI7MTswLFwKICAieG10cCIgICAgICA6ICJYbXRwIjswOzAsXAogICJ4cHJvYyIgICAgIDogIlhwcm9jIjswOzEsXAogICJ4cHJvZiIgICAgIDogIlhwcm9mIjswOzAsXAogICJ4cHJvcHMiICAgIDogIlhwcm9wcyI7MDsxLFwKICAieHF1aXQiICAgICA6ICJYcXVpdCI7MDswLFwKICAieHNjYW4iICAgICA6ICJYc2NhbiI7MDswLFwKICAieHNldCIgICAgICA6ICJYc2V0IjswOzAsXAogICJ4c2giICAgICAgIDogIlhzaCI7MDswLFwKICAieHNvcnQiICAgICA6ICJYc29ydCI7MTsxLFwKICAieHRhaWwiICAgICA6ICJYdGFpbCI7MTsxLFwKICAieHRrIiAgICAgICA6ICJYdGsiOzA7MCxcCiAgInh0b29sIiAgICAgOiAiWHRvb2wiOzA7MCxcCiAgInh0cmFjZSIgICAgOiAiWHRyYWNlIjswOzAsXAogICJ4dHJhbnMiICAgIDogIlh0cmFucyI7MDswLFwKICAieHVwZGF0ZSIgICA6ICJYdXBkYXRlIjswOzAsXAogICJ4d2MiICAgICAgIDogIlh3YyI7MTswLFwKICAieHdobyIgICAgICA6ICJYd2hvIjswOzEsXAogIF0pCgpzdGF0aWMgc3RyaW5nIFByZXBhcmVMaW5lKHN0cmluZyBzdHIpCnsKICByZXR1cm4gc3RyOwp9CgpzdGF0aWMgc3RyaW5nIFF1b3RlTGluZShzdHJpbmcgc3RyKQp7CiAgc3RyaW5nICp0bXAsKnRtcDI7CiAgaW50IGksIGkyLCBsZW4sIGxlbjIsIHFkLCBxczsKCiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFxcXCIsIrBCU0hMIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFxcIiIsIrBEQkxRIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFxcJyIsIrBTR0xRIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFx8IiwisFBJUEUiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJ8fCIsIrBPUk9SIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiLT4iLCKwTEFSUiIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcJCIsIrBET0xSIik7CiAgdG1wPXJlZ2V4cGxvZGUoc3RyLCIoXCJ8JykiKTsKICBsZW49c2l6ZW9mKHRtcCk7CiAgcWQ9cXM9MDsKICBmb3IoaT0wO2k8bGVuO2krKykKICB7CiAgICBpZihpJTIpCiAgICB7CiAgICAgIGlmKHRtcFtpXT09IiciKQoJcWQ9KCFxcz8hcWQ6cWQpOwogICAgICBlbHNlCglxcz0oIXFkPyFxczpxcyk7CiAgICAgIGlmKCh0bXBbaV09PSJcIiImJiFxZCl8fCh0bXBbaV09PSInIiYmIXFzKSkKCXRtcFtpXT0iIjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYoIXFkKQogICAgICB7CglsZW4yPXNpemVvZih0bXAyPXJlZ2V4cGxvZGUodG1wW2ldLCJcXCRbXiBdW14gXSoiKSk7Cglmb3IoaTI9MDtpMjxsZW4yO2kyKyspCgkgIGlmKGkyJTIpCgkgIHsKCSAgICBUSygiUXVvdGVMaW5lOiAiK3RtcDJbaTJdWzEuLl0pOwoJICAgIHRtcDJbaTJdPShzdHJpbmcpWEZpbmRPYmooKHRtcDJbaTJdKVsxLi5dKTsKCSAgfQoJdG1wW2ldPWltcGxvZGUodG1wMiwiIik7CiAgICAgIH0KICAgIH0KICB9CiAgaWYocWR8fHFzKQogICAgcmV0dXJuIE5VTEw7CiAgc3RyPWltcGxvZGUodG1wLCIiKTsKICBUSygiUXVvdGVMaW5lOiBzdHI6ICIrc3RyKTsKICByZXR1cm4gc3RyOwp9CgpzdGF0aWMgc3RyaW5nIFVucXVvdGVMaW5lKHN0cmluZyBzdHIpCnsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwQlNITCIsIlxcIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisERCTFEiLCJcIiIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBTR0xRIiwiXCciKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwRFFVTyIsIiIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBTUVVPIiwiIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisFBJUEUiLCJ8Iik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisE9ST1IiLCJ8fCIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBMQVJSIiwiLT4iKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwRE9MUiIsIiQiKTsKICBUSygiVW5xdW90ZUxpbmU6IHN0cjogIitzdHIpOwogIHJldHVybiBzdHI7Cn0KCnN0YXRpYyBzdHJpbmcgKkV4cGxvZGVDbWRzKHN0cmluZyBzdHIpCnsKICBzdHJpbmcgKnRtcDsKICAKICB0bXA9cmVnZXhwbG9kZShzdHIsIlxcfHw+fD4+Iik7CiAgd2hpbGUodG1wWzwxXT09IiIpCiAgICB0bXA9dG1wWzAuLjwyXTsKICByZXR1cm4gdG1wOwp9Cgp2YXJhcmdzIGludCBQYXJzZUxpbmUoc3RyaW5nIHN0cikKewogIHN0cmluZyB2ZXJiLCBhcmc7CiAgaW50IHJldDsKICAKICBUSygiUGFyc2VMaW5lOiBzdHI6ICIrKHN0cj9zdHI6IiIpKTsKICBpZighc2l6ZW9mKGNtZHMpKQogIHsKICAgIC8vIHRoaXMgaXMgYSBzaW5nbGUgY29tbWFuZCBvciBiZWdpbm5pbmcgb2YgYSBjb21tYW5kIHBpcGUKICAgIHZlcmI9cXVlcnlfdmVyYigpOwoKICAgIC8vIHJldHVybiBvbiB1bmtub3duIGNvbW1hbmRzCiAgICBpZighdmVyYnx8IXNpemVvZih2ZXJiKXx8IUdldEZ1bmModmVyYixUUlVFKSkKICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIHN0cj0oc3RyaW5nKXRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCk7CiAgICBwaXBlX2luPUZBTFNFOwogICAgcGlwZV9vZj1OVUxMOwogICAgcGlwZV9vdnI9VFJVRTsKICAgIHBpcGVfb3V0PUZBTFNFOwogICAgcGlwZV9vZj1OVUxMOwogICAgLy8gcGFzcyBhcmd1bWVudHMgdG8gc29tZSBzcGVjaWFsIGZ1bmN0aW9ucyB1bnBhcnNlZAogICAgaWYobWVtYmVyKCh7InhscGMiLCJ4Y2FsbCIsInhldmFsIn0pLHZlcmIpPj0wKQogICAgewojaWZkZWYgWERCRwogICAgICBUSygiUGFyc2VMaW5lOiBzcGVjaWFsIGZ1bmM6ICIrdmVyYik7CiNlbmRpZgogICAgICByZXQ9Q2FsbEZ1bmModmVyYixzdHIpOwogICAgICBTYWZlUmV0dXJuKHJldCk7CiAgICB9CiAgICAvLyBvaywgaGVyZSB3ZSBnbwogICAgcGlwZV9pbj1waXBlX291dD1GQUxTRTsKICAgIHBpcGVfaWY9cGlwZV9vZj1OVUxMOwogICAgcGlwZV9vdnI9VFJVRTsKICAgIGlmKGZpbGVfc2l6ZShQSVBFX0ZJTEUpPj0wKQogICAgICBybShQSVBFX0ZJTEUpOwogICAgaWYgKHN0ciYmc3RyIT0iIikJICAKICAgIHsKICAgICAgaWYoIShzdHI9UXVvdGVMaW5lKHN0cikpKQogICAgICB7CglXRExOKCJVbnRlcm1pbmF0ZWQgcXVvdGF0aW9uIik7CglTYWZlUmV0dXJuKFRSVUUpOwogICAgICB9CiAgICAgIGNtZHM9RXhwbG9kZUNtZHMoc3RyKTsKICAgIH0KICAgIGVsc2UKICAgICAgY21kcz0oeyIifSk7CiAgICBhcmc9c3RyaXBfc3RyaW5nKGNtZHNbMF0pOwogIH0KICBlbHNlCiAgewogICAgY21kc1swXT1zdHJpcF9zdHJpbmcoY21kc1swXSk7CiAgICBUSygiUGFyc2VMaW5lOiBjbWRzWzBdOiAiK2NtZHNbMF0pOwogICAgaWYoc3NjYW5mKGNtZHNbMF0sIiVzICVzIix2ZXJiLGFyZykhPTIpCiAgICB7CiAgICAgIHZlcmI9Y21kc1swXTsKICAgICAgYXJnPSIiOwogICAgfQogIH0KICBjbWRzPWNtZHNbMS4uXTsKICBUSygiUGFyc2VMaW5lOiB2ZXJiOiAiK3ZlcmIpOwogIGlmICghdmVyYnx8IXNpemVvZih2ZXJiKXx8IUdldEZ1bmModmVyYixUUlVFKSkKICAgIFNhZmVSZXR1cm4oRkFMU0UpOwogIFRLKCJQYXJzZUxpbmUoMSk6IGFyZzogIithcmcrIiBjbWRzOiAiK3NwcmludGYoIiVPIixjbWRzKSk7CiAgc3dpdGNoKHNpemVvZihjbWRzKSkKICB7CiAgICBjYXNlIDA6CiAgICByZXQ9Q2FsbEZ1bmModmVyYixzdHJpcF9zdHJpbmcoVW5xdW90ZUxpbmUoYXJnKSkpOwogICAgU2FmZVJldHVybihyZXQpOwogICAgYnJlYWs7CiAgICAKICAgIGNhc2UgMToKICAgIFdETE4oIk1pc3NpbmcgcmhzIG9mIGNvbW1hbmQgcGlwZSIpOwogICAgU2FmZVJldHVybihUUlVFKTsKICAgIGJyZWFrOwogICAgCiAgICBkZWZhdWx0OgogICAgcGlwZV9vdXQ9VFJVRTsKICAgIHN3aXRjaChjbWRzWzBdKQogICAgewogICAgICBjYXNlICJ8IjoKICAgICAgcGlwZV9vZj1QSVBFX0ZJTEU7CiAgICAgIHBpcGVfb3ZyPVRSVUU7CiAgICAgIGNtZHM9Y21kc1sxLi5dOwogICAgICBicmVhazsKICAgICAgCiAgICAgIGNhc2UgIj4iOgogICAgICBwaXBlX292cj1UUlVFOwogICAgICBpZihzaXplb2YoY21kcykhPTIpCiAgICAgIHsKCVdETE4oIklsbGVnYWwgSU8gcmVkaXJlY3Rpb24iKTsKCVNhZmVSZXR1cm4oVFJVRSk7CiAgICAgIH0KICAgICAgcGlwZV9vZj1jbWRzWzFdOwogICAgICBjbWRzPSh7fSk7CiAgICAgIGJyZWFrOwogICAgICAKICAgICAgY2FzZSAiPj4iOgogICAgICBwaXBlX292cj1GQUxTRTsKICAgICAgaWYoc2l6ZW9mKGNtZHMpIT0yKQogICAgICB7CglXRExOKCJJbGxlZ2FsIElPIHJlZGlyZWN0aW9uIik7CglTYWZlUmV0dXJuKFRSVUUpOwogICAgICB9CiAgICAgIHBpcGVfb2Y9Y21kc1sxXTsKICAgICAgY21kcz0oe30pOwogICAgICBicmVhazsKICAgIH0KICB9CiAgVEsoIlBhcnNlTGluZSgyKTogYXJnOiAiK2FyZysiIGNtZHM6ICIrc3ByaW50ZigiJU8iLGNtZHMpKTsKICBpZighQ2FsbEZ1bmModmVyYixzdHJpcF9zdHJpbmcoYXJnKSkpCiAgICBTYWZlUmV0dXJuKEZBTFNFKTsKICBwaXBlX2luPXBpcGVfb3V0OwogIHBpcGVfaWY9cGlwZV9vZjsKICBwaXBlX292cj1GQUxTRTsKICBwaXBlX291dD1GQUxTRTsKICBwaXBlX29mPU5VTEw7CiAgaWYoc2l6ZW9mKGNtZHMpKQogICAgY2FsbF9vdXQoIlBhcnNlTGluZSIsMCk7CiAgZWxzZQogICAgU2FmZVJldHVybihUUlVFKTsKICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIGludCBDYWxsRnVuYyhzdHJpbmcgdmVyYiwgc3RyaW5nIHN0cikKewogIHN0cmluZyBmdW47CgogIGZ1bj1HZXRGdW5jKHZlcmIsRkFMU0UpOwojaWZkZWYgWERCRwogIFRLKCJDYWxsRnVuYzogdmVyYjogIit2ZXJiKyIgc3RyOiAiK3N0cik7CiAgVEsoIkNhbGxGdW5jOiByZXNvbHZlZCBmdW5jdGlvbjogIisoZnVuP2Z1bjoiKHVucmVzb2x2ZWQpIikpOwojZW5kaWYKICBpZihzdHI9PSIiKQogICAgc3RyPU5VTEw7CiAgcmV0dXJuIGZ1bj8oaW50KWNhbGxfb3RoZXIoTUUsZnVuLHN0cik6RkFMU0U7Cn0KCnN0YXRpYyBzdHJpbmcgR2V0RnVuYyhzdHJpbmcgdmVyYiwgaW50IHRlc3QpCnsKICBzdHJpbmcgZnVuLCprZXlzLGtleTsKICBpbnQgaSxsZW47CgogIFRLKCJHZXRGdW5jOiB2ZXJiOiAiK3ZlcmIpOwoKICBpZih2ZXJiWzAuLjBdIT0ieCIpIC8vIEFzc3VtZSBhbGwgY29tbWFuZHMgc3RhcnQgd2l0aCAieCIKICAgIHJldHVybiAwOwoKICBpZiAoIShmdW49KHN0cmluZylBQ1RJT05TW3ZlcmIsMF0pKSB7IC8vIFRyeSBleGFjdCBoaXQgZmlyc3QKICAgIGtleT0iIjsKICAgIGxlbj1zaXplb2YodmVyYik7CiAgICBmb3IgKGk9c2l6ZW9mKGtleXM9bV9pbmRpY2VzKEFDVElPTlMpKS0xO2k+PTA7aS0tKSB7CiAgICAgIFRLKCIgIHRyeWluZzogIitrZXlzW2ldKTsKICAgICAgaWYoc2l6ZW9mKGtleXNbaV0pPj1sZW4mJmtleXNbaV1bMC4ubGVuLTFdPT12ZXJiKSB7CglpZihzaXplb2Yoa2V5KSkgewoJICBXTE4oIkRhcyBpc3QgbmljaHQgZWluZGV1dGlnIC4uLiIpOwoJICByZXR1cm4gMDsKCX0KCWZ1bj1BQ1RJT05TW2tleXNbaV0sMF07CglrZXk9a2V5c1tpXTsKCS8vYnJlYWs7CiAgICAgIH0KICAgIH0KICB9IGVsc2UKICAgIGtleT12ZXJiOwoKICBpZih0ZXN0KQogICAgcmV0dXJuIGZ1bjsKICAKICBpZiAoa2V5KSB7CiNpZmRlZiBYREJHCiAgICBUSygiR2V0RnVuYzogZnVuOiAiK2Z1bisiIChrZXk6ICIra2V5KyIpXG4iKwogICAgICAgInBpcGVfaW46ICIrKHBpcGVfaW4/IlRSVUUgICI6IkZBTFNFICIpKyhwaXBlX2lmP3BpcGVfaWY6IihOVUxMKSIpKyJcbiIrCiAgICAgICAicGlwZV9vdXQ6ICIrKHBpcGVfb3V0PyJUUlVFICAiOiJGQUxTRSAiKSsocGlwZV9vZj9waXBlX29mOiIoTlVMTCkiKSsiXG4iKwogICAgICAgInBpcGVfb3ZyOiAiKyhwaXBlX292cj8iVFJVRSI6IkZBTFNFIikpOwojZW5kaWYKICAgIGlmIChwaXBlX2luJiYhQUNUSU9OU1trZXksUElQRV9JTl0pCiAgICB7CiAgICAgIC8vIHRoaXMgY29tbWFuZCBkb2VzIG5vdCByZWFkIHBpcGVzCiNpZmRlZiBYREJHCiAgICAgIFRLKCJJbGxlZ2FsIHJocyBvZiBjb21tYW5kIHBpcGUgXCIiK2Z1bisiXCJcbiIpOwojZW5kaWYKICAgICAgbm90aWZ5X2ZhaWwoIklsbGVnYWwgcmhzIG9mIGNvbW1hbmQgcGlwZSBcIiIrZnVuKyJcIlxuIik7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgZWxzZSBpZiAocGlwZV9vdXQmJiFBQ1RJT05TW2tleSxQSVBFX09VVF0pCiAgICB7CiAgICAgIC8vIHRoaXMgY29tbWFuZCBkb2VzIG5vdCBmZWVkIHBpcGVzCiNpZmRlZiBYREJHCiAgICAgIFRLKCJJbGxlZ2FsIGxocyBvZiBjb21tYW5kIHBpcGUgXCIiK2Z1bisiXCJcbiIpOwojZW5kaWYKICAgICAgbm90aWZ5X2ZhaWwoIklsbGVnYWwgbGhzIG9mIGNvbW1hbmQgcGlwZSBcIiIrZnVuKyJcIlxuIik7CiAgICAgIHJldHVybiAwOwogICAgfQogIH0KICByZXR1cm4gZnVuOwp9Cgp2b2lkIGFjdGlvbnMoKQp7CiAgaWYgKCFjbG9uZXJ8fCFSVFB8fGNsb25lcj09UlRQfHxxdWVyeV93aXpfbGV2ZWwoY2xvbmVyKTw9cXVlcnlfd2l6X2xldmVsKFJUUCkpCiAgICBhZGRfYWN0aW9uKCJQYXJzZUxpbmUiLCIiLDEpOwogIGFkZF9hY3Rpb24oIkNvbW1hbmRTY2FuIiwgIiIsIDEpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogIHRoZSBjaGVja2luZyBzdHVmZgogKi8KCnZvaWQgSW5zZXJ0Tm90aWZ5KG9iamVjdCBvYmopCnsKICBpZighY2xvbmVyKQogICAgcmV0dXJuOwogIGlmKE1PREUoTU9ERV9GSVJTVCkgJiYgZmluZF9jYWxsX291dCgibW92ZSIpPT0tMSkKICAgIGNhbGxfb3V0KCJtb3ZlIiwwLGNsb25lcik7CiAgaWYoTU9ERShNT0RFX0lOVkNIRUNLKSkKICAgIHdyaXRlX25ld2ludm9iaihvYmopOwp9CgpzdGF0aWMgdm9pZCBWYXJDaGVjayhpbnQgc2hvdykKewogIGludCBpLCBzOwogIGZvcmVhY2goc3RyaW5nIGssIG1peGVkIHYgOiB2YXJpYWJsZSkKICB7CiAgICBpZiAodikgY29udGludWU7CiAgICBpZihzaG93KSBXRExOKCIqKiogVmFyaWFibGUgJCIraysiIGhhcyBiZWVuIGRlc3RydWN0ZWQiKTsKICAgIG1fZGVsZXRlKHZhcmlhYmxlLCBrKTsKICB9Cn0KCgppbnQgd3JpdGVfbmV3aW52b2JqKG9iamVjdCBvYmopCnsKICBpZihvYmopIFdETE4oIioqKiBOZXcgb2JqZWN0IGluIGludmVudG9yeSAiK09iakZpbGUob2JqKSk7CiAgcmV0dXJuKDEpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogIGNhdGNoIGFsbCBjb21tYW5kcywgYWJzb3JiIGZvcmNlcyBhbmQgY2hlY2sgaGlzdG9yeQogKi8KCmludCBDb21tYW5kU2NhbihzdHJpbmcgYXJnKQp7CiAgc3RyaW5nIHZlcmIsIGNtZDsKICBvYmplY3QgcnRwOwogIHJ0cD1SVFA7CgogIGlmKCFjbG9uZXImJiEoY2xvbmVyPXJ0cCkpIGRlc3RydWN0KE1FKTsKCiAgaWYoKCFNT0RFKE1PREVfUFJPVEVDVCkpfHxzZWN1cml0eSgpfHwKICAgICBxdWVyeV93aXpfbGV2ZWwoY2xvbmVyKTxxdWVyeV93aXpfbGV2ZWwocnRwKSkKICB7CiAgICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKICAgIGlmKHZlcmImJkRvSGlzdG9yeSh2ZXJiKyhhcmcgPyAiICIrYXJnIDogIiIpKSkKICAgICAgcmV0dXJuIFRSVUU7CiAgICBub3N0b3JlPUZBTFNFOwogICAgcmV0dXJuIEZBTFNFOwogIH0KICBlbHNlCiAgewogICAgaWYocnRwKQogICAgewogICAgICBXRExOKCJZb3VyICIrVE9PTF9USVRMRSsiIHByb3RlY3RzIHlvdSBmcm9tIGEgZm9yY2UgYnkgIitjcm5hbWUocnRwKSsKCSAgICIgWyIrcXVlcnlfdmVyYigpKyhhcmcgPyAiICIrYXJnKyJdIiA6ICJdIikpOwogICAgICB0ZWxsX29iamVjdChydHAsIGNybmFtZShjbG9uZXIpKyIncyAiK1RPT0xfVElUTEUrCgkJICAiIGFic29yYmVzIHlvdXIgZm9yY2UuXG4iKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgV0RMTigiWW91ciAiK1RPT0xfVElUTEUrIiBwcm90ZWN0cyB5b3UgZnJvbSBhIGZvcmNlIFsiKwoJICAgcXVlcnlfdmVyYigpKyhhcmcgPyAiICIrYXJnKyJdIiA6ICJdIikpOwogICAgfQogICAgcmV0dXJuIFRSVUU7CiAgfQp9CgppbnQgRG9IaXN0b3J5KHN0cmluZyBsaW5lKQp7CiAgaW50IGk7CiAgc3RyaW5nIGNtZCwgKnN0cnM7CiAgCiAgU0VDVVJFMihGQUxTRSk7CiAgaWYoIXN0cmluZ3AobGluZSkgfHwgIXNpemVvZihsaW5lKSkKICAgIHJldHVybiBUUlVFOwogIGVsc2UgaWYobGluZT09IiUhIikKICB7CiAgICBXTE4oIkN1cnJlbnQgY29tbWFuZCBoaXN0b3J5OiIpOwogICAgZm9yKGk9TUFYX0hJU1RPUlk7IGk7IC0taSkKICAgICAgaWYoaGlzdG9yeVtpLTFdKQogICAgICB7CglXKCIgIitBUklHSFQoIiIraSwgMiwgIiAiKSsiOiAiKTsKCWlmKHNpemVvZihoaXN0b3J5W2ktMV0pPjcwKQoJICBXTE4oQUxFRlQoaGlzdG9yeVtpLTFdLCA3MCwgIiAiKSk7CgllbHNlCgkgIFdMTihoaXN0b3J5W2ktMV0pOwogICAgICB9CiAgICByZXR1cm4gVFJVRTsKICB9CiAgZWxzZSBpZihsaW5lWzAuLjFdPT0iJSUiICYmIChjbWQ9aGlzdG9yeVswXStsaW5lWzIuLjwxXSkpCiAgewogICAgQ29tbWFuZChjbWQpOwogICAgcmV0dXJuIFRSVUU7CiAgfQogIGVsc2UgaWYobGluZVswXT09J14nJiYoc3Rycz1zdHJpcF9leHBsb2RlKGxpbmUsICJeIikpKQogIHsKICAgIGlmKHNpemVvZihzdHJzKSYmc3Ryc1swXSYmKGNtZD1oaXN0b3J5WzBdKSkKICAgIHsKICAgICAgaWYoc2l6ZW9mKHN0cnMpPT0yKQoJY21kPXN0cmluZ19yZXBsYWNlKGNtZCwgc3Ryc1swXSwgc3Ryc1sxXSk7CiAgICAgIGVsc2UKCWNtZD1zdHJpbmdfcmVwbGFjZShjbWQsIHN0cnNbMF0sICIiKTsKICAgICAgbm9zdG9yZS0tOwogICAgICBDb21tYW5kKGNtZCk7CiAgICAgIG5vc3RvcmUrKzsKICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgfQogIGVsc2UgaWYobGluZVswXT09JyUnICYmIChzc2NhbmYobGluZVsxLi48MV0sICIlZCIsIGkpKSkKICB7CiAgICBpPSBpPjAgPyBpIDogMTsKICAgIGk9IGk8PU1BWF9ISVNUT1JZID8gaSA6IE1BWF9ISVNUT1JZOwogICAgaWYoY21kPWhpc3RvcnlbaS0xXSkKICAgICAgQ29tbWFuZChjbWQpOwogICAgcmV0dXJuIFRSVUU7CiAgfQogIGVsc2UgaWYobGluZVswXT09JyUnKQogIHsKICAgIGZvcihpPTA7IGk8TUFYX0hJU1RPUlk7IGkrKykKICAgIHsKICAgICAgaWYoaGlzdG9yeVtpXSYmCgkgaGlzdG9yeVtpXVswLi5zaXplb2YobGluZSktMl09PWxpbmVbMS4uIDwxXSkKICAgICAgewoJQ29tbWFuZChoaXN0b3J5W2ldKTsKCXJldHVybiBUUlVFOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UgaWYobm9zdG9yZTwxKQogICAgaGlzdG9yeT0oe2xpbmV9KStoaXN0b3J5WzAuLk1BWF9ISVNUT1JZLTJdOwogIHJldHVybiBGQUxTRTsKfQoK