LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICB1bmljb2RlZGF0YSAtLSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFVuaWNvZGUgNS4yIGRhdGEgYmFzZS4KCiAgIERhdGEgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBVbmljb2RlIDUuMiBVbmljb2RlRGF0YS50eHQgZmlsZS4KCiAgIFdyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgogICBNb2RpZmllZCBmb3IgUHl0aG9uIDIuMCBieSBGcmVkcmlrIEx1bmRoIChmcmVkcmlrQHB5dGhvbndhcmUuY29tKQogICBNb2RpZmllZCBieSBNYXJ0aW4gdi4gTPZ3aXMgKG1hcnRpbkB2LmxvZXdpcy5kZSkKCiAgIENvcHlyaWdodCAoYykgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiUHl0aG9uLmgiCiNpbmNsdWRlICJ1Y25oYXNoLmgiCiNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKCi8qIGNoYXJhY3RlciBwcm9wZXJ0aWVzICovCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OyAgICAgICAvKiBpbmRleCBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlX0NhdGVnb3J5TmFtZXMgKi8KICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgY29tYmluaW5nOyAgICAgIC8qIGNvbWJpbmluZyBjbGFzcyB2YWx1ZSAwIC0gMjU1ICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGJpZGlyZWN0aW9uYWw7ICAvKiBpbmRleCBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlX0JpZGlyZWN0aW9uYWxOYW1lcyAqLwogICAgY29uc3QgdW5zaWduZWQgY2hhciBtaXJyb3JlZDsgICAgICAgLyogdHJ1ZSBpZiBtaXJyb3JlZCBpbiBiaWRpciBtb2RlICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGVhc3RfYXNpYW5fd2lkdGg7ICAgICAgIC8qIGluZGV4IGludG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VW5pY29kZV9FYXN0QXNpYW5XaWR0aCAqLwogICAgY29uc3QgdW5zaWduZWQgY2hhciBub3JtYWxpemF0aW9uX3F1aWNrX2NoZWNrOyAvKiBzZWUgaXNfbm9ybWFsaXplZCgpICovCn0gX1B5VW5pY29kZV9EYXRhYmFzZVJlY29yZDsKCnR5cGVkZWYgc3RydWN0IGNoYW5nZV9yZWNvcmQgewogICAgLyogc2VxdWVuY2Ugb2YgZmllbGRzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbiBtZXJnZV9vbGRfdmVyc2lvbiAqLwogICAgY29uc3QgdW5zaWduZWQgY2hhciBiaWRpcl9jaGFuZ2VkOwogICAgY29uc3QgdW5zaWduZWQgY2hhciBjYXRlZ29yeV9jaGFuZ2VkOwogICAgY29uc3QgdW5zaWduZWQgY2hhciBkZWNpbWFsX2NoYW5nZWQ7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG1pcnJvcmVkX2NoYW5nZWQ7CiAgICBjb25zdCBkb3VibGUgbnVtZXJpY19jaGFuZ2VkOwp9IGNoYW5nZV9yZWNvcmQ7CgovKiBkYXRhIGZpbGUgZ2VuZXJhdGVkIGJ5IFRvb2xzL3VuaWNvZGUvbWFrZXVuaWNvZGVkYXRhLnB5ICovCiNpbmNsdWRlICJ1bmljb2RlZGF0YV9kYi5oIgoKc3RhdGljIGNvbnN0IF9QeVVuaWNvZGVfRGF0YWJhc2VSZWNvcmQqCl9nZXRyZWNvcmRfZXgoUHlfVUNTNCBjb2RlKQp7CiAgICBpbnQgaW5kZXg7CiAgICBpZiAoY29kZSA+PSAweDExMDAwMCkKICAgICAgICBpbmRleCA9IDA7CiAgICBlbHNlIHsKICAgICAgICBpbmRleCA9IGluZGV4MVsoY29kZT4+U0hJRlQpXTsKICAgICAgICBpbmRleCA9IGluZGV4MlsoaW5kZXg8PFNISUZUKSsoY29kZSYoKDE8PFNISUZUKS0xKSldOwogICAgfQoKICAgIHJldHVybiAmX1B5VW5pY29kZV9EYXRhYmFzZV9SZWNvcmRzW2luZGV4XTsKfQoKLyogLS0tLS0tLS0tLS0tLSBQcmV2aW91cy12ZXJzaW9uIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnR5cGVkZWYgc3RydWN0IHByZXZpb3VzX3ZlcnNpb24gewogICAgUHlPYmplY3RfSEVBRAogICAgY29uc3QgY2hhciAqbmFtZTsKICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQqICgqZ2V0cmVjb3JkKShQeV9VQ1M0KTsKICAgIFB5X1VDUzQgKCpub3JtYWxpemF0aW9uKShQeV9VQ1M0KTsKfSBQcmV2aW91c0RCVmVyc2lvbjsKCiNkZWZpbmUgZ2V0X29sZF9yZWNvcmQoc2VsZiwgdikgICAgKCgoKFByZXZpb3VzREJWZXJzaW9uKilzZWxmKS0+Z2V0cmVjb3JkKSh2KSkKCnN0YXRpYyBQeU1lbWJlckRlZiBEQl9tZW1iZXJzW10gPSB7CiAgICAgICAgeyJ1bmlkYXRhX3ZlcnNpb24iLCBUX1NUUklORywgb2Zmc2V0b2YoUHJldmlvdXNEQlZlcnNpb24sIG5hbWUpLCBSRUFET05MWX0sCiAgICAgICAge05VTEx9Cn07CgovKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCnN0YXRpYyBQeVR5cGVPYmplY3QgVUNEX1R5cGU7CiNkZWZpbmUgVUNEX0NoZWNrKG8pIChQeV9UWVBFKG8pPT0mVUNEX1R5cGUpCgpzdGF0aWMgUHlPYmplY3QqCm5ld19wcmV2aW91c192ZXJzaW9uKGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhbmdlX3JlY29yZCogKCpnZXRyZWNvcmQpKFB5X1VDUzQpLAogICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0ICgqbm9ybWFsaXphdGlvbikoUHlfVUNTNCkpCnsKICAgICAgICBQcmV2aW91c0RCVmVyc2lvbiAqc2VsZjsKICAgICAgICBzZWxmID0gUHlPYmplY3RfTmV3KFByZXZpb3VzREJWZXJzaW9uLCAmVUNEX1R5cGUpOwogICAgICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICBzZWxmLT5uYW1lID0gbmFtZTsKICAgICAgICBzZWxmLT5nZXRyZWNvcmQgPSBnZXRyZWNvcmQ7CiAgICAgICAgc2VsZi0+bm9ybWFsaXphdGlvbiA9IG5vcm1hbGl6YXRpb247CiAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKfQoKCnN0YXRpYyBQeV9VQ1M0IGdldHVjaGFyKFB5VW5pY29kZU9iamVjdCAqb2JqKQp7CiAgICBQeV9VTklDT0RFICp2ID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKTsKCiAgICBpZiAoUHlVbmljb2RlX0dFVF9TSVpFKG9iaikgPT0gMSkKICAgICAgICByZXR1cm4gKnY7CiNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCiAgICBlbHNlIGlmICgoUHlVbmljb2RlX0dFVF9TSVpFKG9iaikgPT0gMikgJiYKICAgICAgICAgICAgICgweEQ4MDAgPD0gdlswXSAmJiB2WzBdIDw9IDB4REJGRikgJiYKICAgICAgICAgICAgICgweERDMDAgPD0gdlsxXSAmJiB2WzFdIDw9IDB4REZGRikpCiAgICAgICAgcmV0dXJuICgoKHZbMF0gJiAweDNGRik8PDEwKSB8ICh2WzFdICYgMHgzRkYpKSArIDB4MTAwMDA7CiNlbmRpZgogICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAibmVlZCBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhcyBwYXJhbWV0ZXIiKTsKICAgIHJldHVybiAoUHlfVUNTNCktMTsKfQoKLyogLS0tIE1vZHVsZSBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfZGVjaW1hbF9fZG9jX18sCiJkZWNpbWFsKHVuaWNoclssIGRlZmF1bHRdKVxuXApcblwKUmV0dXJucyB0aGUgZGVjaW1hbCB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdW5pY2hyXG5cCmFzIGludGVnZXIuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgZGVmYXVsdCBpcyByZXR1cm5lZCwgb3IsIGlmXG5cCm5vdCBnaXZlbiwgVmFsdWVFcnJvciBpcyByYWlzZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9kZWNpbWFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgUHlPYmplY3QgKmRlZm9iaiA9IE5VTEw7CiAgICBpbnQgaGF2ZV9vbGQgPSAwOwogICAgbG9uZyByYzsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86ZGVjaW1hbCIsICZQeVVuaWNvZGVfVHlwZSwgJnYsICZkZWZvYmopKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKHNlbGYgJiYgVUNEX0NoZWNrKHNlbGYpKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKSB7CiAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICByYyA9IC0xOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvbGQtPmRlY2ltYWxfY2hhbmdlZCAhPSAweEZGKSB7CiAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgcmMgPSBvbGQtPmRlY2ltYWxfY2hhbmdlZDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFoYXZlX29sZCkKICAgICAgICByYyA9IFB5X1VOSUNPREVfVE9ERUNJTUFMKGMpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIGlmIChkZWZvYmogPT0gTlVMTCkgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYSBkZWNpbWFsIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUHlfSU5DUkVGKGRlZm9iaik7CiAgICAgICAgICAgIHJldHVybiBkZWZvYmo7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhyYyk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9kaWdpdF9fZG9jX18sCiJkaWdpdCh1bmljaHJbLCBkZWZhdWx0XSlcblwKXG5cClJldHVybnMgdGhlIGRpZ2l0IHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlciB1bmljaHIgYXNcblwKaW50ZWdlci4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBkZWZhdWx0IGlzIHJldHVybmVkLCBvciwgaWZcblwKbm90IGdpdmVuLCBWYWx1ZUVycm9yIGlzIHJhaXNlZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2RpZ2l0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgUHlPYmplY3QgKmRlZm9iaiA9IE5VTEw7CiAgICBsb25nIHJjOwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8TzpkaWdpdCIsICZQeVVuaWNvZGVfVHlwZSwgJnYsICZkZWZvYmopKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICByYyA9IFB5X1VOSUNPREVfVE9ESUdJVChjKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICBpZiAoZGVmb2JqID09IE5VTEwpIHsKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJub3QgYSBkaWdpdCIpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFB5X0lOQ1JFRihkZWZvYmopOwogICAgICAgICAgICByZXR1cm4gZGVmb2JqOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcocmMpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfbnVtZXJpY19fZG9jX18sCiJudW1lcmljKHVuaWNoclssIGRlZmF1bHRdKVxuXApcblwKUmV0dXJucyB0aGUgbnVtZXJpYyB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdW5pY2hyXG5cCmFzIGZsb2F0LiBJZiBubyBzdWNoIHZhbHVlIGlzIGRlZmluZWQsIGRlZmF1bHQgaXMgcmV0dXJuZWQsIG9yLCBpZlxuXApub3QgZ2l2ZW4sIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfbnVtZXJpYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIFB5T2JqZWN0ICpkZWZvYmogPSBOVUxMOwogICAgaW50IGhhdmVfb2xkID0gMDsKICAgIGRvdWJsZSByYzsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86bnVtZXJpYyIsICZQeVVuaWNvZGVfVHlwZSwgJnYsICZkZWZvYmopKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKHNlbGYgJiYgVUNEX0NoZWNrKHNlbGYpKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKSB7CiAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICByYyA9IC0xLjA7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9sZC0+ZGVjaW1hbF9jaGFuZ2VkICE9IDB4RkYpIHsKICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICByYyA9IG9sZC0+ZGVjaW1hbF9jaGFuZ2VkOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIWhhdmVfb2xkKQogICAgICAgIHJjID0gUHlfVU5JQ09ERV9UT05VTUVSSUMoYyk7CiAgICBpZiAocmMgPT0gLTEuMCkgewogICAgICAgIGlmIChkZWZvYmogPT0gTlVMTCkgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vdCBhIG51bWVyaWMgY2hhcmFjdGVyIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUHlfSU5DUkVGKGRlZm9iaik7CiAgICAgICAgICAgIHJldHVybiBkZWZvYmo7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyYyk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9jYXRlZ29yeV9fZG9jX18sCiJjYXRlZ29yeSh1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBnZW5lcmFsIGNhdGVnb3J5IGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuXAp1bmljaHIgYXMgc3RyaW5nLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfY2F0ZWdvcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBpbnQgaW5kZXg7CiAgICBQeV9VQ1M0IGM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpjYXRlZ29yeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VW5pY29kZV9UeXBlLCAmdikpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGluZGV4ID0gKGludCkgX2dldHJlY29yZF9leChjKS0+Y2F0ZWdvcnk7CiAgICBpZiAoc2VsZiAmJiBVQ0RfQ2hlY2soc2VsZikpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkICE9IDB4RkYpCiAgICAgICAgICAgIGluZGV4ID0gb2xkLT5jYXRlZ29yeV9jaGFuZ2VkOwogICAgfQogICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKF9QeVVuaWNvZGVfQ2F0ZWdvcnlOYW1lc1tpbmRleF0pOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfYmlkaXJlY3Rpb25hbF9fZG9jX18sCiJiaWRpcmVjdGlvbmFsKHVuaWNocilcblwKXG5cClJldHVybnMgdGhlIGJpZGlyZWN0aW9uYWwgY2F0ZWdvcnkgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG5cCnVuaWNociBhcyBzdHJpbmcuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgYW4gZW1wdHkgc3RyaW5nIGlzXG5cCnJldHVybmVkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfYmlkaXJlY3Rpb25hbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmJpZGlyZWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpbmRleCA9IChpbnQpIF9nZXRyZWNvcmRfZXgoYyktPmJpZGlyZWN0aW9uYWw7CiAgICBpZiAoc2VsZiAmJiBVQ0RfQ2hlY2soc2VsZikpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgICAgIGVsc2UgaWYgKG9sZC0+YmlkaXJfY2hhbmdlZCAhPSAweEZGKQogICAgICAgICAgICBpbmRleCA9IG9sZC0+YmlkaXJfY2hhbmdlZDsKICAgIH0KICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZyhfUHlVbmljb2RlX0JpZGlyZWN0aW9uYWxOYW1lc1tpbmRleF0pOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfY29tYmluaW5nX19kb2NfXywKImNvbWJpbmluZyh1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBjYW5vbmljYWwgY29tYmluaW5nIGNsYXNzIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlXG5cCmNoYXJhY3RlciB1bmljaHIgYXMgaW50ZWdlci4gUmV0dXJucyAwIGlmIG5vIGNvbWJpbmluZyBjbGFzcyBpc1xuXApkZWZpbmVkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfY29tYmluaW5nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgaW50IGluZGV4OwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6Y29tYmluaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5jb21iaW5pbmc7CiAgICBpZiAoc2VsZiAmJiBVQ0RfQ2hlY2soc2VsZikpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgfQogICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhpbmRleCk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9taXJyb3JlZF9fZG9jX18sCiJtaXJyb3JlZCh1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBtaXJyb3JlZCBwcm9wZXJ0eSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcblwKdW5pY2hyIGFzIGludGVnZXIuIFJldHVybnMgMSBpZiB0aGUgY2hhcmFjdGVyIGhhcyBiZWVuIGlkZW50aWZpZWQgYXNcblwKYSBcIm1pcnJvcmVkXCIgY2hhcmFjdGVyIGluIGJpZGlyZWN0aW9uYWwgdGV4dCwgMCBvdGhlcndpc2UuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9taXJyb3JlZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOm1pcnJvcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5taXJyb3JlZDsKICAgIGlmIChzZWxmICYmIFVDRF9DaGVjayhzZWxmKSkgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsIGMpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkKICAgICAgICAgICAgaW5kZXggPSAwOyAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgZWxzZSBpZiAob2xkLT5taXJyb3JlZF9jaGFuZ2VkICE9IDB4RkYpCiAgICAgICAgICAgIGluZGV4ID0gb2xkLT5taXJyb3JlZF9jaGFuZ2VkOwogICAgfQogICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhpbmRleCk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9lYXN0X2FzaWFuX3dpZHRoX19kb2NfXywKImVhc3RfYXNpYW5fd2lkdGgodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgZWFzdCBhc2lhbiB3aWR0aCBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcblwKdW5pY2hyIGFzIHN0cmluZy4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2Vhc3RfYXNpYW5fd2lkdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBpbnQgaW5kZXg7CiAgICBQeV9VQ1M0IGM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITplYXN0X2FzaWFuX3dpZHRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5lYXN0X2FzaWFuX3dpZHRoOwogICAgaWYgKHNlbGYgJiYgVUNEX0NoZWNrKHNlbGYpKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKQogICAgICAgICAgICBpbmRleCA9IDA7IC8qIHVuYXNzaWduZWQgKi8KICAgIH0KICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZyhfUHlVbmljb2RlX0Vhc3RBc2lhbldpZHRoTmFtZXNbaW5kZXhdKTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2RlY29tcG9zaXRpb25fX2RvY19fLAoiZGVjb21wb3NpdGlvbih1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgZGVjb21wb3NpdGlvbiBtYXBwaW5nIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlXG5cCmNoYXJhY3RlciB1bmljaHIgYXMgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW4gY2FzZSBub1xuXApzdWNoIG1hcHBpbmcgaXMgZGVmaW5lZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2RlY29tcG9zaXRpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBjaGFyIGRlY29tcFsyNTZdOwogICAgaW50IGNvZGUsIGluZGV4LCBjb3VudCwgaTsKICAgIHVuc2lnbmVkIGludCBwcmVmaXhfaW5kZXg7CiAgICBQeV9VQ1M0IGM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpkZWNvbXBvc2l0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGNvZGUgPSAoaW50KWM7CgogICAgaWYgKHNlbGYgJiYgVUNEX0NoZWNrKHNlbGYpKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKQogICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoIiIpOyAvKiB1bmFzc2lnbmVkICovCiAgICB9CgogICAgaWYgKGNvZGUgPCAwIHx8IGNvZGUgPj0gMHgxMTAwMDApCiAgICAgICAgaW5kZXggPSAwOwogICAgZWxzZSB7CiAgICAgICAgaW5kZXggPSBkZWNvbXBfaW5kZXgxWyhjb2RlPj5ERUNPTVBfU0hJRlQpXTsKICAgICAgICBpbmRleCA9IGRlY29tcF9pbmRleDJbKGluZGV4PDxERUNPTVBfU0hJRlQpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlJigoMTw8REVDT01QX1NISUZUKS0xKSldOwogICAgfQoKICAgIC8qIGhpZ2ggYnl0ZSBpcyBudW1iZXIgb2YgaGV4IGJ5dGVzICh1c3VhbGx5IG9uZSBvciB0d28pLCBsb3cgYnl0ZQogICAgICAgaXMgcHJlZml4IGNvZGUgKGZyb20qLwogICAgY291bnQgPSBkZWNvbXBfZGF0YVtpbmRleF0gPj4gODsKCiAgICAvKiBYWFg6IGNvdWxkIGFsbG9jYXRlIHRoZSBQeVN0cmluZyB1cCBmcm9udCBpbnN0ZWFkCiAgICAgICAoc3RybGVuKHByZWZpeCkgKyA1ICogY291bnQgKyAxIGJ5dGVzKSAqLwoKICAgIC8qIEJhc2VkIG9uIGhvdyBpbmRleCBpcyBjYWxjdWxhdGVkIGFib3ZlIGFuZCBkZWNvbXBfZGF0YSBpcyBnZW5lcmF0ZWQKICAgICAgIGZyb20gVG9vbHMvdW5pY29kZS9tYWtldW5pY29kZWRhdGEucHksIGl0IHNob3VsZCBub3QgYmUgcG9zc2libGUKICAgICAgIHRvIG92ZXJmbG93IGRlY29tcF9wcmVmaXguICovCiAgICBwcmVmaXhfaW5kZXggPSBkZWNvbXBfZGF0YVtpbmRleF0gJiAyNTU7CiAgICBhc3NlcnQocHJlZml4X2luZGV4IDwgKHNpemVvZihkZWNvbXBfcHJlZml4KS9zaXplb2YoKmRlY29tcF9wcmVmaXgpKSk7CgogICAgLyogY29weSBwcmVmaXggKi8KICAgIGkgPSBzdHJsZW4oZGVjb21wX3ByZWZpeFtwcmVmaXhfaW5kZXhdKTsKICAgIG1lbWNweShkZWNvbXAsIGRlY29tcF9wcmVmaXhbcHJlZml4X2luZGV4XSwgaSk7CgogICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CiAgICAgICAgaWYgKGkpCiAgICAgICAgICAgIGRlY29tcFtpKytdID0gJyAnOwogICAgICAgIGFzc2VydCgoc2l6ZV90KWkgPCBzaXplb2YoZGVjb21wKSk7CiAgICAgICAgUHlPU19zbnByaW50ZihkZWNvbXAgKyBpLCBzaXplb2YoZGVjb21wKSAtIGksICIlMDRYIiwKICAgICAgICAgICAgICAgICAgICAgIGRlY29tcF9kYXRhWysraW5kZXhdKTsKICAgICAgICBpICs9IHN0cmxlbihkZWNvbXAgKyBpKTsKICAgIH0KCiAgICBkZWNvbXBbaV0gPSAnXDAnOwoKICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZyhkZWNvbXApOwp9CgpzdGF0aWMgdm9pZApnZXRfZGVjb21wX3JlY29yZChQeU9iamVjdCAqc2VsZiwgUHlfVUNTNCBjb2RlLCBpbnQgKmluZGV4LCBpbnQgKnByZWZpeCwgaW50ICpjb3VudCkKewogICAgaWYgKGNvZGUgPj0gMHgxMTAwMDApIHsKICAgICAgICAqaW5kZXggPSAwOwogICAgfSBlbHNlIGlmIChzZWxmICYmIFVDRF9DaGVjayhzZWxmKSAmJgogICAgICAgICAgICAgICBnZXRfb2xkX3JlY29yZChzZWxmLCBjb2RlKS0+Y2F0ZWdvcnlfY2hhbmdlZD09MCkgewogICAgICAgIC8qIHVuYXNzaWduZWQgaW4gb2xkIHZlcnNpb24gKi8KICAgICAgICAqaW5kZXggPSAwOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgKmluZGV4ID0gZGVjb21wX2luZGV4MVsoY29kZT4+REVDT01QX1NISUZUKV07CiAgICAgICAgKmluZGV4ID0gZGVjb21wX2luZGV4MlsoKmluZGV4PDxERUNPTVBfU0hJRlQpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUmKCgxPDxERUNPTVBfU0hJRlQpLTEpKV07CiAgICB9CgogICAgLyogaGlnaCBieXRlIGlzIG51bWJlciBvZiBoZXggYnl0ZXMgKHVzdWFsbHkgb25lIG9yIHR3byksIGxvdyBieXRlCiAgICAgICBpcyBwcmVmaXggY29kZSAoZnJvbSovCiAgICAqY291bnQgPSBkZWNvbXBfZGF0YVsqaW5kZXhdID4+IDg7CiAgICAqcHJlZml4ID0gZGVjb21wX2RhdGFbKmluZGV4XSAmIDI1NTsKCiAgICAoKmluZGV4KSsrOwp9CgojZGVmaW5lIFNCYXNlICAgMHhBQzAwCiNkZWZpbmUgTEJhc2UgICAweDExMDAKI2RlZmluZSBWQmFzZSAgIDB4MTE2MQojZGVmaW5lIFRCYXNlICAgMHgxMUE3CiNkZWZpbmUgTENvdW50ICAxOQojZGVmaW5lIFZDb3VudCAgMjEKI2RlZmluZSBUQ291bnQgIDI4CiNkZWZpbmUgTkNvdW50ICAoVkNvdW50KlRDb3VudCkKI2RlZmluZSBTQ291bnQgIChMQ291bnQqTkNvdW50KQoKc3RhdGljIFB5T2JqZWN0KgpuZmRfbmZrZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmlucHV0LCBpbnQgaykKewogICAgUHlPYmplY3QgKnJlc3VsdDsKICAgIFB5X1VOSUNPREUgKmksICplbmQsICpvOwogICAgLyogTG9uZ2VzdCBkZWNvbXBvc2l0aW9uIGluIFVuaWNvZGUgMy4yOiBVK0ZERkEgKi8KICAgIFB5X1VOSUNPREUgc3RhY2tbMjBdOwogICAgUHlfc3NpemVfdCBzcGFjZSwgaXNpemU7CiAgICBpbnQgaW5kZXgsIHByZWZpeCwgY291bnQsIHN0YWNrcHRyOwogICAgdW5zaWduZWQgY2hhciBwcmV2LCBjdXI7CgogICAgc3RhY2twdHIgPSAwOwogICAgaXNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUoaW5wdXQpOwogICAgLyogT3ZlcmFsbG9jYXRlIGF0bW9zdCAxMCBjaGFyYWN0ZXJzLiAqLwogICAgc3BhY2UgPSAoaXNpemUgPiAxMCA/IDEwIDogaXNpemUpICsgaXNpemU7CiAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgc3BhY2UpOwogICAgaWYgKCFyZXN1bHQpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpID0gUHlVbmljb2RlX0FTX1VOSUNPREUoaW5wdXQpOwogICAgZW5kID0gaSArIGlzaXplOwogICAgbyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CgogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgICBzdGFja1tzdGFja3B0cisrXSA9ICppKys7CiAgICAgICAgd2hpbGUoc3RhY2twdHIpIHsKICAgICAgICAgICAgUHlfVU5JQ09ERSBjb2RlID0gc3RhY2tbLS1zdGFja3B0cl07CiAgICAgICAgICAgIC8qIEhhbmd1bCBEZWNvbXBvc2l0aW9uIGFkZHMgdGhyZWUgY2hhcmFjdGVycyBpbgogICAgICAgICAgICAgICBhIHNpbmdsZSBzdGVwLCBzbyB3ZSBuZWVkIGF0bGVhc3QgdGhhdCBtdWNoIHJvb20uICovCiAgICAgICAgICAgIGlmIChzcGFjZSA8IDMpIHsKICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbmV3c2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShyZXN1bHQpICsgMTA7CiAgICAgICAgICAgICAgICBzcGFjZSArPSAxMDsKICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIG5ld3NpemUpID09IC0xKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgbyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCkgKyBuZXdzaXplIC0gc3BhY2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogSGFuZ3VsIERlY29tcG9zaXRpb24uICovCiAgICAgICAgICAgIGlmIChTQmFzZSA8PSBjb2RlICYmIGNvZGUgPCAoU0Jhc2UrU0NvdW50KSkgewogICAgICAgICAgICAgICAgaW50IFNJbmRleCA9IGNvZGUgLSBTQmFzZTsKICAgICAgICAgICAgICAgIGludCBMID0gTEJhc2UgKyBTSW5kZXggLyBOQ291bnQ7CiAgICAgICAgICAgICAgICBpbnQgViA9IFZCYXNlICsgKFNJbmRleCAlIE5Db3VudCkgLyBUQ291bnQ7CiAgICAgICAgICAgICAgICBpbnQgVCA9IFRCYXNlICsgU0luZGV4ICUgVENvdW50OwogICAgICAgICAgICAgICAgKm8rKyA9IEw7CiAgICAgICAgICAgICAgICAqbysrID0gVjsKICAgICAgICAgICAgICAgIHNwYWNlIC09IDI7CiAgICAgICAgICAgICAgICBpZiAoVCAhPSBUQmFzZSkgewogICAgICAgICAgICAgICAgICAgICpvKysgPSBUOwogICAgICAgICAgICAgICAgICAgIHNwYWNlIC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogbm9ybWFsaXphdGlvbiBjaGFuZ2VzICovCiAgICAgICAgICAgIGlmIChzZWxmICYmIFVDRF9DaGVjayhzZWxmKSkgewogICAgICAgICAgICAgICAgUHlfVUNTNCB2YWx1ZSA9ICgoUHJldmlvdXNEQlZlcnNpb24qKXNlbGYpLT5ub3JtYWxpemF0aW9uKGNvZGUpOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBzdGFja1tzdGFja3B0cisrXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBPdGhlciBkZWNvbXBvc2l0aW9ucy4gKi8KICAgICAgICAgICAgZ2V0X2RlY29tcF9yZWNvcmQoc2VsZiwgY29kZSwgJmluZGV4LCAmcHJlZml4LCAmY291bnQpOwoKICAgICAgICAgICAgLyogQ29weSBjaGFyYWN0ZXIgaWYgaXQgaXMgbm90IGRlY29tcG9zYWJsZSwgb3IgaGFzIGEKICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uLCBidXQgd2UgZG8gTkZELiAqLwogICAgICAgICAgICBpZiAoIWNvdW50IHx8IChwcmVmaXggJiYgIWspKSB7CiAgICAgICAgICAgICAgICAqbysrID0gY29kZTsKICAgICAgICAgICAgICAgIHNwYWNlLS07CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBDb3B5IGRlY29tcG9zaXRpb24gb250byB0aGUgc3RhY2ssIGluIHJldmVyc2UKICAgICAgICAgICAgICAgb3JkZXIuICAqLwogICAgICAgICAgICB3aGlsZShjb3VudCkgewogICAgICAgICAgICAgICAgY29kZSA9IGRlY29tcF9kYXRhW2luZGV4ICsgKC0tY291bnQpXTsKICAgICAgICAgICAgICAgIHN0YWNrW3N0YWNrcHRyKytdID0gY29kZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKiBEcm9wIG92ZXJhbGxvY2F0aW9uLiBDYW5ub3QgZmFpbC4gKi8KICAgIFB5VW5pY29kZV9SZXNpemUoJnJlc3VsdCwgUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCkgLSBzcGFjZSk7CgogICAgLyogU29ydCBjYW5vbmljYWxseS4gKi8KICAgIGkgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwogICAgcHJldiA9IF9nZXRyZWNvcmRfZXgoKmkpLT5jb21iaW5pbmc7CiAgICBlbmQgPSBpICsgUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCk7CiAgICBmb3IgKGkrKzsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgY3VyID0gX2dldHJlY29yZF9leCgqaSktPmNvbWJpbmluZzsKICAgICAgICBpZiAocHJldiA9PSAwIHx8IGN1ciA9PSAwIHx8IHByZXYgPD0gY3VyKSB7CiAgICAgICAgICAgIHByZXYgPSBjdXI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAvKiBOb24tY2Fub25pY2FsIG9yZGVyLiBOZWVkIHRvIHN3aXRjaCAqaSB3aXRoIHByZXZpb3VzLiAqLwogICAgICAgIG8gPSBpIC0gMTsKICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICBQeV9VTklDT0RFIHRtcCA9IG9bMV07CiAgICAgICAgICAgIG9bMV0gPSBvWzBdOwogICAgICAgICAgICBvWzBdID0gdG1wOwogICAgICAgICAgICBvLS07CiAgICAgICAgICAgIGlmIChvIDwgUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBwcmV2ID0gX2dldHJlY29yZF9leCgqbyktPmNvbWJpbmluZzsKICAgICAgICAgICAgaWYgKHByZXYgPT0gMCB8fCBwcmV2IDw9IGN1cikKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBwcmV2ID0gX2dldHJlY29yZF9leCgqaSktPmNvbWJpbmluZzsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBpbnQKZmluZF9uZmNfaW5kZXgoUHlPYmplY3QgKnNlbGYsIHN0cnVjdCByZWluZGV4KiBuZmMsIFB5X1VOSUNPREUgY29kZSkKewogICAgaW50IGluZGV4OwogICAgZm9yIChpbmRleCA9IDA7IG5mY1tpbmRleF0uc3RhcnQ7IGluZGV4KyspIHsKICAgICAgICBpbnQgc3RhcnQgPSBuZmNbaW5kZXhdLnN0YXJ0OwogICAgICAgIGlmIChjb2RlIDwgc3RhcnQpCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBpZiAoY29kZSA8PSBzdGFydCArIG5mY1tpbmRleF0uY291bnQpIHsKICAgICAgICAgICAgaW50IGRlbHRhID0gY29kZSAtIHN0YXJ0OwogICAgICAgICAgICByZXR1cm4gbmZjW2luZGV4XS5pbmRleCArIGRlbHRhOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKfQoKc3RhdGljIFB5T2JqZWN0KgpuZmNfbmZrYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmlucHV0LCBpbnQgaykKewogICAgUHlPYmplY3QgKnJlc3VsdDsKICAgIFB5X1VOSUNPREUgKmksICppMSwgKm8sICplbmQ7CiAgICBpbnQgZixsLGluZGV4LGluZGV4MSxjb21iOwogICAgUHlfVU5JQ09ERSBjb2RlOwogICAgUHlfVU5JQ09ERSAqc2tpcHBlZFsyMF07CiAgICBpbnQgY3NraXBwZWQgPSAwOwoKICAgIHJlc3VsdCA9IG5mZF9uZmtkKHNlbGYsIGlucHV0LCBrKTsKICAgIGlmICghcmVzdWx0KQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qIFdlIGFyZSBnb2luZyB0byBtb2RpZnkgcmVzdWx0IGluLXBsYWNlLgogICAgICAgSWYgbmZkX25ma2QgaXMgY2hhbmdlZCB0byBzb21ldGltZXMgcmV0dXJuIHRoZSBpbnB1dCwKICAgICAgIHRoaXMgY29kZSBuZWVkcyB0byBiZSByZXZpZXdlZC4gKi8KICAgIGFzc2VydChyZXN1bHQgIT0gaW5wdXQpOwoKICAgIGkgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwogICAgZW5kID0gaSArIFB5VW5pY29kZV9HRVRfU0laRShyZXN1bHQpOwogICAgbyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CgogIGFnYWluOgogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3NraXBwZWQ7IGluZGV4KyspIHsKICAgICAgICAgIGlmIChza2lwcGVkW2luZGV4XSA9PSBpKSB7CiAgICAgICAgICAgICAgLyogKmkgY2hhcmFjdGVyIGlzIHNraXBwZWQuCiAgICAgICAgICAgICAgICAgUmVtb3ZlIGZyb20gbGlzdC4gKi8KICAgICAgICAgICAgICBza2lwcGVkW2luZGV4XSA9IHNraXBwZWRbY3NraXBwZWQtMV07CiAgICAgICAgICAgICAgY3NraXBwZWQtLTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgZ290byBhZ2FpbjsgLyogY29udGludWUgd2hpbGUgKi8KICAgICAgICAgIH0KICAgICAgfQogICAgICAvKiBIYW5ndWwgQ29tcG9zaXRpb24uIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIDxMVixUPgogICAgICAgICBwYWlycywgc2luY2Ugd2UgYWx3YXlzIGhhdmUgZGVjb21wb3NlZCBkYXRhLiAqLwogICAgICBpZiAoTEJhc2UgPD0gKmkgJiYgKmkgPCAoTEJhc2UrTENvdW50KSAmJgogICAgICAgICAgaSArIDEgPCBlbmQgJiYKICAgICAgICAgIFZCYXNlIDw9IGlbMV0gJiYgaVsxXSA8PSAoVkJhc2UrVkNvdW50KSkgewogICAgICAgICAgaW50IExJbmRleCwgVkluZGV4OwogICAgICAgICAgTEluZGV4ID0gaVswXSAtIExCYXNlOwogICAgICAgICAgVkluZGV4ID0gaVsxXSAtIFZCYXNlOwogICAgICAgICAgY29kZSA9IFNCYXNlICsgKExJbmRleCpWQ291bnQrVkluZGV4KSpUQ291bnQ7CiAgICAgICAgICBpKz0yOwogICAgICAgICAgaWYgKGkgPCBlbmQgJiYKICAgICAgICAgICAgICBUQmFzZSA8PSAqaSAmJiAqaSA8PSAoVEJhc2UrVENvdW50KSkgewogICAgICAgICAgICAgIGNvZGUgKz0gKmktVEJhc2U7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgfQogICAgICAgICAgKm8rKyA9IGNvZGU7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgZiA9IGZpbmRfbmZjX2luZGV4KHNlbGYsIG5mY19maXJzdCwgKmkpOwogICAgICBpZiAoZiA9PSAtMSkgewogICAgICAgICAgKm8rKyA9ICppKys7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvKiBGaW5kIG5leHQgdW5ibG9ja2VkIGNoYXJhY3Rlci4gKi8KICAgICAgaTEgPSBpKzE7CiAgICAgIGNvbWIgPSAwOwogICAgICB3aGlsZSAoaTEgPCBlbmQpIHsKICAgICAgICAgIGludCBjb21iMSA9IF9nZXRyZWNvcmRfZXgoKmkxKS0+Y29tYmluaW5nOwogICAgICAgICAgaWYgKGNvbWIgJiYgKGNvbWIxID09IDAgfHwgY29tYiA9PSBjb21iMSkpIHsKICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgaXMgYmxvY2tlZC4gKi8KICAgICAgICAgICAgICBpMSsrOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgbCA9IGZpbmRfbmZjX2luZGV4KHNlbGYsIG5mY19sYXN0LCAqaTEpOwogICAgICAgICAgLyogKmkxIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoICppLiBJZiAqaTEKICAgICAgICAgICAgIGlzIGEgc3RhcnRlciwgd2UgZG9uJ3QgbmVlZCB0byBsb29rIGZ1cnRoZXIuCiAgICAgICAgICAgICBPdGhlcndpc2UsIHJlY29yZCB0aGUgY29tYmluaW5nIGNsYXNzLiAqLwogICAgICAgICAgaWYgKGwgPT0gLTEpIHsKICAgICAgICAgICAgbm90X2NvbWJpbmFibGU6CiAgICAgICAgICAgICAgaWYgKGNvbWIxID09IDApCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNvbWIgPSBjb21iMTsKICAgICAgICAgICAgICBpMSsrOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaW5kZXggPSBmKlRPVEFMX0xBU1QgKyBsOwogICAgICAgICAgaW5kZXgxID0gY29tcF9pbmRleFtpbmRleCA+PiBDT01QX1NISUZUXTsKICAgICAgICAgIGNvZGUgPSBjb21wX2RhdGFbKGluZGV4MTw8Q09NUF9TSElGVCkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleCYoKDE8PENPTVBfU0hJRlQpLTEpKV07CiAgICAgICAgICBpZiAoY29kZSA9PSAwKQogICAgICAgICAgICAgIGdvdG8gbm90X2NvbWJpbmFibGU7CgogICAgICAgICAgLyogUmVwbGFjZSB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyLiAqLwogICAgICAgICAgKmkgPSBjb2RlOwogICAgICAgICAgLyogTWFyayB0aGUgc2Vjb25kIGNoYXJhY3RlciB1bnVzZWQuICovCiAgICAgICAgICBza2lwcGVkW2Nza2lwcGVkKytdID0gaTE7CiAgICAgICAgICBpMSsrOwogICAgICAgICAgZiA9IGZpbmRfbmZjX2luZGV4KHNlbGYsIG5mY19maXJzdCwgKmkpOwogICAgICAgICAgaWYgKGYgPT0gLTEpCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgKm8rKyA9ICppKys7CiAgICB9CiAgICBpZiAobyAhPSBlbmQpCiAgICAgICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBvIC0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgovKiBSZXR1cm4gMSBpZiB0aGUgaW5wdXQgaXMgY2VydGFpbmx5IG5vcm1hbGl6ZWQsIDAgaWYgaXQgbWlnaHQgbm90IGJlLiAqLwpzdGF0aWMgaW50CmlzX25vcm1hbGl6ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppbnB1dCwgaW50IG5mYywgaW50IGspCnsKICAgIFB5X1VOSUNPREUgKmksICplbmQ7CiAgICB1bnNpZ25lZCBjaGFyIHByZXZfY29tYmluaW5nID0gMCwgcXVpY2tjaGVja19tYXNrOwoKICAgIC8qIEFuIG9sZGVyIHZlcnNpb24gb2YgdGhlIGRhdGFiYXNlIGlzIHJlcXVlc3RlZCwgcXVpY2tjaGVja3MgbXVzdCBiZQogICAgICAgZGlzYWJsZWQuICovCiAgICBpZiAoc2VsZiAmJiBVQ0RfQ2hlY2soc2VsZikpCiAgICAgICAgcmV0dXJuIDA7CgogICAgLyogVGhlIHR3byBxdWlja2NoZWNrIGJpdHMgYXQgdGhpcyBzaGlmdCBtZWFuIDA9WWVzLCAxPU1heWJlLCAyPU5vLAogICAgICAgYXMgZGVzY3JpYmVkIGluIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMTUvI0FubmV4OC4gKi8KICAgIHF1aWNrY2hlY2tfbWFzayA9IDMgPDwgKChuZmMgPyA0IDogMCkgKyAoayA/IDIgOiAwKSk7CgogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKGlucHV0KTsKICAgIGVuZCA9IGkgKyBQeVVuaWNvZGVfR0VUX1NJWkUoaW5wdXQpOwogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgICBjb25zdCBfUHlVbmljb2RlX0RhdGFiYXNlUmVjb3JkICpyZWNvcmQgPSBfZ2V0cmVjb3JkX2V4KCppKyspOwogICAgICAgIHVuc2lnbmVkIGNoYXIgY29tYmluaW5nID0gcmVjb3JkLT5jb21iaW5pbmc7CiAgICAgICAgdW5zaWduZWQgY2hhciBxdWlja2NoZWNrID0gcmVjb3JkLT5ub3JtYWxpemF0aW9uX3F1aWNrX2NoZWNrOwoKICAgICAgICBpZiAocXVpY2tjaGVjayAmIHF1aWNrY2hlY2tfbWFzaykKICAgICAgICAgICAgcmV0dXJuIDA7IC8qIHRoaXMgc3RyaW5nIG1pZ2h0IG5lZWQgbm9ybWFsaXphdGlvbiAqLwogICAgICAgIGlmIChjb21iaW5pbmcgJiYgcHJldl9jb21iaW5pbmcgPiBjb21iaW5pbmcpCiAgICAgICAgICAgIHJldHVybiAwOyAvKiBub24tY2Fub25pY2FsIHNvcnQgb3JkZXIsIG5vdCBub3JtYWxpemVkICovCiAgICAgICAgcHJldl9jb21iaW5pbmcgPSBjb21iaW5pbmc7CiAgICB9CiAgICByZXR1cm4gMTsgLyogY2VydGFpbmx5IG5vcm1hbGl6ZWQgKi8KfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX25vcm1hbGl6ZV9fZG9jX18sCiJub3JtYWxpemUoZm9ybSwgdW5pc3RyKVxuXApcblwKUmV0dXJuIHRoZSBub3JtYWwgZm9ybSAnZm9ybScgZm9yIHRoZSBVbmljb2RlIHN0cmluZyB1bmlzdHIuICBWYWxpZFxuXAp2YWx1ZXMgZm9yIGZvcm0gYXJlICdORkMnLCAnTkZLQycsICdORkQnLCBhbmQgJ05GS0QnLiIpOwoKc3RhdGljIFB5T2JqZWN0Kgp1bmljb2RlZGF0YV9ub3JtYWxpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBjaGFyICpmb3JtOwogICAgUHlPYmplY3QgKmlucHV0OwoKICAgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzTyE6bm9ybWFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtLCAmUHlVbmljb2RlX1R5cGUsICZpbnB1dCkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKFB5VW5pY29kZV9HZXRTaXplKGlucHV0KSA9PSAwKSB7CiAgICAgICAgLyogU3BlY2lhbCBjYXNlIGVtcHR5IGlucHV0IHN0cmluZ3MsIHNpbmNlIHJlc2l6aW5nCiAgICAgICAgICAgdGhlbSAgbGF0ZXIgd291bGQgY2F1c2UgaW50ZXJuYWwgZXJyb3JzLiAqLwogICAgICAgIFB5X0lOQ1JFRihpbnB1dCk7CiAgICAgICAgcmV0dXJuIGlucHV0OwogICAgfQoKICAgIGlmIChzdHJjbXAoZm9ybSwgIk5GQyIpID09IDApIHsKICAgICAgICBpZiAoaXNfbm9ybWFsaXplZChzZWxmLCBpbnB1dCwgMSwgMCkpIHsKICAgICAgICAgICAgUHlfSU5DUkVGKGlucHV0KTsKICAgICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmZjX25ma2Moc2VsZiwgaW5wdXQsIDApOwogICAgfQogICAgaWYgKHN0cmNtcChmb3JtLCAiTkZLQyIpID09IDApIHsKICAgICAgICBpZiAoaXNfbm9ybWFsaXplZChzZWxmLCBpbnB1dCwgMSwgMSkpIHsKICAgICAgICAgICAgUHlfSU5DUkVGKGlucHV0KTsKICAgICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmZjX25ma2Moc2VsZiwgaW5wdXQsIDEpOwogICAgfQogICAgaWYgKHN0cmNtcChmb3JtLCAiTkZEIikgPT0gMCkgewogICAgICAgIGlmIChpc19ub3JtYWxpemVkKHNlbGYsIGlucHV0LCAwLCAwKSkgewogICAgICAgICAgICBQeV9JTkNSRUYoaW5wdXQpOwogICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZmRfbmZrZChzZWxmLCBpbnB1dCwgMCk7CiAgICB9CiAgICBpZiAoc3RyY21wKGZvcm0sICJORktEIikgPT0gMCkgewogICAgICAgIGlmIChpc19ub3JtYWxpemVkKHNlbGYsIGlucHV0LCAwLCAxKSkgewogICAgICAgICAgICBQeV9JTkNSRUYoaW5wdXQpOwogICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZmRfbmZrZChzZWxmLCBpbnB1dCwgMSk7CiAgICB9CiAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgbm9ybWFsaXphdGlvbiBmb3JtIik7CiAgICByZXR1cm4gTlVMTDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogdW5pY29kZSBjaGFyYWN0ZXIgbmFtZSB0YWJsZXMgKi8KCi8qIGRhdGEgZmlsZSBnZW5lcmF0ZWQgYnkgVG9vbHMvdW5pY29kZS9tYWtldW5pY29kZWRhdGEucHkgKi8KI2luY2x1ZGUgInVuaWNvZGVuYW1lX2RiLmgiCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBkYXRhYmFzZSBjb2RlIChjdXQgYW5kIHBhc3RlZCBmcm9tIHRoZSB1bmlkYiBwYWNrYWdlKSAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcKX2dldGhhc2goY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IHNjYWxlKQp7CiAgICBpbnQgaTsKICAgIHVuc2lnbmVkIGxvbmcgaCA9IDA7CiAgICB1bnNpZ25lZCBsb25nIGl4OwogICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgaCA9IChoICogc2NhbGUpICsgKHVuc2lnbmVkIGNoYXIpIHRvdXBwZXIoUHlfQ0hBUk1BU0soc1tpXSkpOwogICAgICAgIGl4ID0gaCAmIDB4ZmYwMDAwMDA7CiAgICAgICAgaWYgKGl4KQogICAgICAgICAgICBoID0gKGggXiAoKGl4Pj4yNCkgJiAweGZmKSkgJiAweDAwZmZmZmZmOwogICAgfQogICAgcmV0dXJuIGg7Cn0KCnN0YXRpYyBjaGFyICpoYW5ndWxfc3lsbGFibGVzW11bM10gPSB7CiAgICB7ICJHIiwgICJBIiwgICAiIiAgIH0sCiAgICB7ICJHRyIsICJBRSIsICAiRyIgIH0sCiAgICB7ICJOIiwgICJZQSIsICAiR0ciIH0sCiAgICB7ICJEIiwgICJZQUUiLCAiR1MiIH0sCiAgICB7ICJERCIsICJFTyIsICAiTiIsIH0sCiAgICB7ICJSIiwgICJFIiwgICAiTkoiIH0sCiAgICB7ICJNIiwgICJZRU8iLCAiTkgiIH0sCiAgICB7ICJCIiwgICJZRSIsICAiRCIgIH0sCiAgICB7ICJCQiIsICJPIiwgICAiTCIgIH0sCiAgICB7ICJTIiwgICJXQSIsICAiTEciIH0sCiAgICB7ICJTUyIsICJXQUUiLCAiTE0iIH0sCiAgICB7ICIiLCAgICJPRSIsICAiTEIiIH0sCiAgICB7ICJKIiwgICJZTyIsICAiTFMiIH0sCiAgICB7ICJKSiIsICJVIiwgICAiTFQiIH0sCiAgICB7ICJDIiwgICJXRU8iLCAiTFAiIH0sCiAgICB7ICJLIiwgICJXRSIsICAiTEgiIH0sCiAgICB7ICJUIiwgICJXSSIsICAiTSIgIH0sCiAgICB7ICJQIiwgICJZVSIsICAiQiIgIH0sCiAgICB7ICJIIiwgICJFVSIsICAiQlMiIH0sCiAgICB7IDAsICAgICJZSSIsICAiUyIgIH0sCiAgICB7IDAsICAgICJJIiwgICAiU1MiIH0sCiAgICB7IDAsICAgIDAsICAgICAiTkciIH0sCiAgICB7IDAsICAgIDAsICAgICAiSiIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiQyIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiSyIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiVCIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiUCIgIH0sCiAgICB7IDAsICAgIDAsICAgICAiSCIgIH0KfTsKCnN0YXRpYyBpbnQKaXNfdW5pZmllZF9pZGVvZ3JhcGgoUHlfVUNTNCBjb2RlKQp7CiAgICByZXR1cm4gKAogICAgICAgICgweDM0MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4NERCNSkgfHwgLyogQ0pLIElkZW9ncmFwaCBFeHRlbnNpb24gQSAqLwogICAgICAgICgweDRFMDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4OUZCQikgfHwgLyogQ0pLIElkZW9ncmFwaCAqLwogICAgICAgICgweDIwMDAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDJBNkQ2KSk7LyogQ0pLIElkZW9ncmFwaCBFeHRlbnNpb24gQiAqLwp9CgpzdGF0aWMgaW50Cl9nZXR1Y25hbWUoUHlPYmplY3QgKnNlbGYsIFB5X1VDUzQgY29kZSwgY2hhciogYnVmZmVyLCBpbnQgYnVmbGVuKQp7CiAgICBpbnQgb2Zmc2V0OwogICAgaW50IGk7CiAgICBpbnQgd29yZDsKICAgIHVuc2lnbmVkIGNoYXIqIHc7CgogICAgaWYgKGNvZGUgPj0gMHgxMTAwMDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKHNlbGYgJiYgVUNEX0NoZWNrKHNlbGYpKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgY29kZSk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKSB7CiAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChTQmFzZSA8PSBjb2RlICYmIGNvZGUgPCBTQmFzZStTQ291bnQpIHsKICAgICAgICAvKiBIYW5ndWwgc3lsbGFibGUuICovCiAgICAgICAgaW50IFNJbmRleCA9IGNvZGUgLSBTQmFzZTsKICAgICAgICBpbnQgTCA9IFNJbmRleCAvIE5Db3VudDsKICAgICAgICBpbnQgViA9IChTSW5kZXggJSBOQ291bnQpIC8gVENvdW50OwogICAgICAgIGludCBUID0gU0luZGV4ICUgVENvdW50OwoKICAgICAgICBpZiAoYnVmbGVuIDwgMjcpCiAgICAgICAgICAgIC8qIFdvcnN0IGNhc2U6IEhBTkdVTCBTWUxMQUJMRSA8MTBjaGFycz4uICovCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHN0cmNweShidWZmZXIsICJIQU5HVUwgU1lMTEFCTEUgIik7CiAgICAgICAgYnVmZmVyICs9IDE2OwogICAgICAgIHN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbTF1bMF0pOwogICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7CiAgICAgICAgc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tWXVsxXSk7CiAgICAgICAgYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW1ZdWzFdKTsKICAgICAgICBzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW1RdWzJdKTsKICAgICAgICBidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVF1bMl0pOwogICAgICAgICpidWZmZXIgPSAnXDAnOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGlmIChpc191bmlmaWVkX2lkZW9ncmFwaChjb2RlKSkgewogICAgICAgIGlmIChidWZsZW4gPCAyOCkKICAgICAgICAgICAgLyogV29yc3QgY2FzZTogQ0pLIFVOSUZJRUQgSURFT0dSQVBILTIwMDAwICovCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHNwcmludGYoYnVmZmVyLCAiQ0pLIFVOSUZJRUQgSURFT0dSQVBILSVYIiwgY29kZSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgLyogZ2V0IG9mZnNldCBpbnRvIHBocmFzZWJvb2sgKi8KICAgIG9mZnNldCA9IHBocmFzZWJvb2tfb2Zmc2V0MVsoY29kZT4+cGhyYXNlYm9va19zaGlmdCldOwogICAgb2Zmc2V0ID0gcGhyYXNlYm9va19vZmZzZXQyWyhvZmZzZXQ8PHBocmFzZWJvb2tfc2hpZnQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlJigoMTw8cGhyYXNlYm9va19zaGlmdCktMSkpXTsKICAgIGlmICghb2Zmc2V0KQogICAgICAgIHJldHVybiAwOwoKICAgIGkgPSAwOwoKICAgIGZvciAoOzspIHsKICAgICAgICAvKiBnZXQgd29yZCBpbmRleCAqLwogICAgICAgIHdvcmQgPSBwaHJhc2Vib29rW29mZnNldF0gLSBwaHJhc2Vib29rX3Nob3J0OwogICAgICAgIGlmICh3b3JkID49IDApIHsKICAgICAgICAgICAgd29yZCA9ICh3b3JkIDw8IDgpICsgcGhyYXNlYm9va1tvZmZzZXQrMV07CiAgICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICB3b3JkID0gcGhyYXNlYm9va1tvZmZzZXQrK107CiAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgaWYgKGkgPiBidWZsZW4pCiAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogYnVmZmVyIG92ZXJmbG93ICovCiAgICAgICAgICAgIGJ1ZmZlcltpKytdID0gJyAnOwogICAgICAgIH0KICAgICAgICAvKiBjb3B5IHdvcmQgc3RyaW5nIGZyb20gbGV4aWNvbi4gIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUKICAgICAgICAgICB3b3JkIGhhcyBiaXQgNyBzZXQuICB0aGUgbGFzdCB3b3JkIGluIGEgc3RyaW5nIGVuZHMgd2l0aAogICAgICAgICAgIDB4ODAgKi8KICAgICAgICB3ID0gbGV4aWNvbiArIGxleGljb25fb2Zmc2V0W3dvcmRdOwogICAgICAgIHdoaWxlICgqdyA8IDEyOCkgewogICAgICAgICAgICBpZiAoaSA+PSBidWZsZW4pCiAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogYnVmZmVyIG92ZXJmbG93ICovCiAgICAgICAgICAgIGJ1ZmZlcltpKytdID0gKncrKzsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPj0gYnVmbGVuKQogICAgICAgICAgICByZXR1cm4gMDsgLyogYnVmZmVyIG92ZXJmbG93ICovCiAgICAgICAgYnVmZmVyW2krK10gPSAqdyAmIDEyNzsKICAgICAgICBpZiAoKncgPT0gMTI4KQogICAgICAgICAgICBicmVhazsgLyogZW5kIG9mIHdvcmQgKi8KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3RhdGljIGludApfY21wbmFtZShQeU9iamVjdCAqc2VsZiwgaW50IGNvZGUsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lbGVuKQp7CiAgICAvKiBjaGVjayBpZiBjb2RlIGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBuYW1lICovCiAgICBpbnQgaTsKICAgIGNoYXIgYnVmZmVyW05BTUVfTUFYTEVOXTsKICAgIGlmICghX2dldHVjbmFtZShzZWxmLCBjb2RlLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkKICAgICAgICByZXR1cm4gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lbGVuOyBpKyspIHsKICAgICAgICBpZiAodG91cHBlcihQeV9DSEFSTUFTSyhuYW1lW2ldKSkgIT0gYnVmZmVyW2ldKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBidWZmZXJbbmFtZWxlbl0gPT0gJ1wwJzsKfQoKc3RhdGljIHZvaWQKZmluZF9zeWxsYWJsZShjb25zdCBjaGFyICpzdHIsIGludCAqbGVuLCBpbnQgKnBvcywgaW50IGNvdW50LCBpbnQgY29sdW1uKQp7CiAgICBpbnQgaSwgbGVuMTsKICAgICpsZW4gPSAtMTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgY2hhciAqcyA9IGhhbmd1bF9zeWxsYWJsZXNbaV1bY29sdW1uXTsKICAgICAgICBsZW4xID0gc3RybGVuKHMpOwogICAgICAgIGlmIChsZW4xIDw9ICpsZW4pCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmIChzdHJuY21wKHN0ciwgcywgbGVuMSkgPT0gMCkgewogICAgICAgICAgICAqbGVuID0gbGVuMTsKICAgICAgICAgICAgKnBvcyA9IGk7CiAgICAgICAgfQogICAgfQogICAgaWYgKCpsZW4gPT0gLTEpIHsKICAgICAgICAqbGVuID0gMDsKICAgIH0KfQoKc3RhdGljIGludApfZ2V0Y29kZShQeU9iamVjdCogc2VsZiwgY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4sIFB5X1VDUzQqIGNvZGUpCnsKICAgIHVuc2lnbmVkIGludCBoLCB2OwogICAgdW5zaWduZWQgaW50IG1hc2sgPSBjb2RlX3NpemUtMTsKICAgIHVuc2lnbmVkIGludCBpLCBpbmNyOwoKICAgIC8qIENoZWNrIGZvciBoYW5ndWwgc3lsbGFibGVzLiAqLwogICAgaWYgKHN0cm5jbXAobmFtZSwgIkhBTkdVTCBTWUxMQUJMRSAiLCAxNikgPT0gMCkgewogICAgICAgIGludCBsZW4sIEwgPSAtMSwgViA9IC0xLCBUID0gLTE7CiAgICAgICAgY29uc3QgY2hhciAqcG9zID0gbmFtZSArIDE2OwogICAgICAgIGZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmTCwgTENvdW50LCAwKTsKICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgIGZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmViwgVkNvdW50LCAxKTsKICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgIGZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmVCwgVENvdW50LCAyKTsKICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgIGlmIChMICE9IC0xICYmIFYgIT0gLTEgJiYgVCAhPSAtMSAmJiBwb3MtbmFtZSA9PSBuYW1lbGVuKSB7CiAgICAgICAgICAgICpjb2RlID0gU0Jhc2UgKyAoTCpWQ291bnQrVikqVENvdW50ICsgVDsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIC8qIE90aGVyd2lzZSwgaXQncyBhbiBpbGxlZ2FsIHN5bGxhYmxlIG5hbWUuICovCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogQ2hlY2sgZm9yIHVuaWZpZWQgaWRlb2dyYXBocy4gKi8KICAgIGlmIChzdHJuY21wKG5hbWUsICJDSksgVU5JRklFRCBJREVPR1JBUEgtIiwgMjIpID09IDApIHsKICAgICAgICAvKiBGb3VyIG9yIGZpdmUgaGV4ZGlnaXRzIG11c3QgZm9sbG93LiAqLwogICAgICAgIHYgPSAwOwogICAgICAgIG5hbWUgKz0gMjI7CiAgICAgICAgbmFtZWxlbiAtPSAyMjsKICAgICAgICBpZiAobmFtZWxlbiAhPSA0ICYmIG5hbWVsZW4gIT0gNSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgd2hpbGUgKG5hbWVsZW4tLSkgewogICAgICAgICAgICB2ICo9IDE2OwogICAgICAgICAgICBpZiAoKm5hbWUgPj0gJzAnICYmICpuYW1lIDw9ICc5JykKICAgICAgICAgICAgICAgIHYgKz0gKm5hbWUgLSAnMCc7CiAgICAgICAgICAgIGVsc2UgaWYgKCpuYW1lID49ICdBJyAmJiAqbmFtZSA8PSAnRicpCiAgICAgICAgICAgICAgICB2ICs9ICpuYW1lIC0gJ0EnICsgMTA7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBuYW1lKys7CiAgICAgICAgfQogICAgICAgIGlmICghaXNfdW5pZmllZF9pZGVvZ3JhcGgodikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICpjb2RlID0gdjsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvKiB0aGUgZm9sbG93aW5nIGlzIHRoZSBzYW1lIGFzIHB5dGhvbidzIGRpY3Rpb25hcnkgbG9va3VwLCB3aXRoCiAgICAgICBvbmx5IG1pbm9yIGNoYW5nZXMuICBzZWUgdGhlIG1ha2V1bmljb2RlZGF0YSBzY3JpcHQgZm9yIG1vcmUKICAgICAgIGRldGFpbHMgKi8KCiAgICBoID0gKHVuc2lnbmVkIGludCkgX2dldGhhc2gobmFtZSwgbmFtZWxlbiwgY29kZV9tYWdpYyk7CiAgICBpID0gKH5oKSAmIG1hc2s7CiAgICB2ID0gY29kZV9oYXNoW2ldOwogICAgaWYgKCF2KQogICAgICAgIHJldHVybiAwOwogICAgaWYgKF9jbXBuYW1lKHNlbGYsIHYsIG5hbWUsIG5hbWVsZW4pKSB7CiAgICAgICAgKmNvZGUgPSB2OwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgaW5jciA9IChoIF4gKGggPj4gMykpICYgbWFzazsKICAgIGlmICghaW5jcikKICAgICAgICBpbmNyID0gbWFzazsKICAgIGZvciAoOzspIHsKICAgICAgICBpID0gKGkgKyBpbmNyKSAmIG1hc2s7CiAgICAgICAgdiA9IGNvZGVfaGFzaFtpXTsKICAgICAgICBpZiAoIXYpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmIChfY21wbmFtZShzZWxmLCB2LCBuYW1lLCBuYW1lbGVuKSkgewogICAgICAgICAgICAqY29kZSA9IHY7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBpbmNyID0gaW5jciA8PCAxOwogICAgICAgIGlmIChpbmNyID4gbWFzaykKICAgICAgICAgICAgaW5jciA9IGluY3IgXiBjb2RlX3BvbHk7CiAgICB9Cn0KCnN0YXRpYyBjb25zdCBfUHlVbmljb2RlX05hbWVfQ0FQSSBoYXNoQVBJID0KewogICAgc2l6ZW9mKF9QeVVuaWNvZGVfTmFtZV9DQVBJKSwKICAgIF9nZXR1Y25hbWUsCiAgICBfZ2V0Y29kZQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogUHl0aG9uIGJpbmRpbmdzICovCgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfbmFtZV9fZG9jX18sCiJuYW1lKHVuaWNoclssIGRlZmF1bHRdKVxuXApSZXR1cm5zIHRoZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlciB1bmljaHIgYXMgYVxuXApzdHJpbmcuIElmIG5vIG5hbWUgaXMgZGVmaW5lZCwgZGVmYXVsdCBpcyByZXR1cm5lZCwgb3IsIGlmIG5vdFxuXApnaXZlbiwgVmFsdWVFcnJvciBpcyByYWlzZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9uYW1lKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgY2hhciBuYW1lW05BTUVfTUFYTEVOXTsKICAgIFB5X1VDUzQgYzsKCiAgICBQeVVuaWNvZGVPYmplY3QqIHY7CiAgICBQeU9iamVjdCogZGVmb2JqID0gTlVMTDsKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8TzpuYW1lIiwgJlB5VW5pY29kZV9UeXBlLCAmdiwgJmRlZm9iaikpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKCFfZ2V0dWNuYW1lKHNlbGYsIGMsIG5hbWUsIHNpemVvZihuYW1lKSkpIHsKICAgICAgICBpZiAoZGVmb2JqID09IE5VTEwpIHsKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBzdWNoIG5hbWUiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKICAgICAgICAgICAgcmV0dXJuIGRlZm9iajsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKG5hbWUpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfbG9va3VwX19kb2NfXywKImxvb2t1cChuYW1lKVxuXApcblwKTG9vayB1cCBjaGFyYWN0ZXIgYnkgbmFtZS4gIElmIGEgY2hhcmFjdGVyIHdpdGggdGhlXG5cCmdpdmVuIG5hbWUgaXMgZm91bmQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlXG5cCmNoYXJhY3Rlci4gIElmIG5vdCBmb3VuZCwgS2V5RXJyb3IgaXMgcmFpc2VkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfbG9va3VwKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlfVUNTNCBjb2RlOwogICAgUHlfVU5JQ09ERSBzdHJbMl07CgogICAgY2hhciogbmFtZTsKICAgIGludCBuYW1lbGVuOwogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpsb29rdXAiLCAmbmFtZSwgJm5hbWVsZW4pKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmICghX2dldGNvZGUoc2VsZiwgbmFtZSwgbmFtZWxlbiwgJmNvZGUpKSB7CiAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAidW5kZWZpbmVkIGNoYXJhY3RlciBuYW1lICclcyciLAogICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCiAgICBpZiAoY29kZSA+PSAweDEwMDAwKSB7CiAgICAgICAgc3RyWzBdID0gMHhkODAwICsgKChjb2RlIC0gMHgxMDAwMCkgPj4gMTApOwogICAgICAgIHN0clsxXSA9IDB4ZGMwMCArICgoY29kZSAtIDB4MTAwMDApICYgMHgzZmYpOwogICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc3RyLCAyKTsKICAgIH0KI2VuZGlmCiAgICBzdHJbMF0gPSAoUHlfVU5JQ09ERSkgY29kZTsKICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc3RyLCAxKTsKfQoKLyogWFhYIEFkZCBkb2Mgc3RyaW5ncy4gKi8KCnN0YXRpYyBQeU1ldGhvZERlZiB1bmljb2RlZGF0YV9mdW5jdGlvbnNbXSA9IHsKICAgIHsiZGVjaW1hbCIsIHVuaWNvZGVkYXRhX2RlY2ltYWwsIE1FVEhfVkFSQVJHUywgdW5pY29kZWRhdGFfZGVjaW1hbF9fZG9jX199LAogICAgeyJkaWdpdCIsIHVuaWNvZGVkYXRhX2RpZ2l0LCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX2RpZ2l0X19kb2NfX30sCiAgICB7Im51bWVyaWMiLCB1bmljb2RlZGF0YV9udW1lcmljLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX251bWVyaWNfX2RvY19ffSwKICAgIHsiY2F0ZWdvcnkiLCB1bmljb2RlZGF0YV9jYXRlZ29yeSwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX2NhdGVnb3J5X19kb2NfX30sCiAgICB7ImJpZGlyZWN0aW9uYWwiLCB1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsX19kb2NfX30sCiAgICB7ImNvbWJpbmluZyIsIHVuaWNvZGVkYXRhX2NvbWJpbmluZywgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9jb21iaW5pbmdfX2RvY19ffSwKICAgIHsibWlycm9yZWQiLCB1bmljb2RlZGF0YV9taXJyb3JlZCwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX21pcnJvcmVkX19kb2NfX30sCiAgICB7ImVhc3RfYXNpYW5fd2lkdGgiLCB1bmljb2RlZGF0YV9lYXN0X2FzaWFuX3dpZHRoLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9lYXN0X2FzaWFuX3dpZHRoX19kb2NfX30sCiAgICB7ImRlY29tcG9zaXRpb24iLCB1bmljb2RlZGF0YV9kZWNvbXBvc2l0aW9uLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9kZWNvbXBvc2l0aW9uX19kb2NfX30sCiAgICB7Im5hbWUiLCB1bmljb2RlZGF0YV9uYW1lLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX25hbWVfX2RvY19ffSwKICAgIHsibG9va3VwIiwgdW5pY29kZWRhdGFfbG9va3VwLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX2xvb2t1cF9fZG9jX199LAogICAgeyJub3JtYWxpemUiLCB1bmljb2RlZGF0YV9ub3JtYWxpemUsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfbm9ybWFsaXplX19kb2NfX30sCiAgICB7TlVMTCwgTlVMTH0gICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KfTsKCnN0YXRpYyBQeVR5cGVPYmplY3QgVUNEX1R5cGUgPSB7CiAgICAgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KICAgICAgICAgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLwogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgICJ1bmljb2RlZGF0YS5VQ0QiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KICAgICAgICBzaXplb2YoUHJldmlvdXNEQlZlcnNpb24pLCAgICAgIC8qdHBfYmFzaWNzaXplKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAgICAvKiBtZXRob2RzICovCiAgICAgICAgKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAvKnRwX2RlYWxsb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3Jlc2VydmVkKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwogICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwogICAgICAgIHVuaWNvZGVkYXRhX2Z1bmN0aW9ucywgIC8qdHBfbWV0aG9kcyovCiAgICAgICAgREJfbWVtYmVycywgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwp9OwoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2RvY3N0cmluZywKIlRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2Ugd2hpY2hcblwKZGVmaW5lcyBjaGFyYWN0ZXIgcHJvcGVydGllcyBmb3IgYWxsIFVuaWNvZGUgY2hhcmFjdGVycy4gVGhlIGRhdGEgaW5cblwKdGhpcyBkYXRhYmFzZSBpcyBiYXNlZCBvbiB0aGUgVW5pY29kZURhdGEudHh0IGZpbGUgdmVyc2lvblxuXAo1LjIuMCB3aGljaCBpcyBwdWJsaWNhbGx5IGF2YWlsYWJsZSBmcm9tIGZ0cDovL2Z0cC51bmljb2RlLm9yZy8uXG5cClxuXApUaGUgbW9kdWxlIHVzZXMgdGhlIHNhbWUgbmFtZXMgYW5kIHN5bWJvbHMgYXMgZGVmaW5lZCBieSB0aGVcblwKVW5pY29kZURhdGEgRmlsZSBGb3JtYXQgNS4yLjAgKHNlZVxuXApodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHI0NC90cjQ0LTQuaHRtbCkuIik7CgoKc3RhdGljIHN0cnVjdCBQeU1vZHVsZURlZiB1bmljb2RlZGF0YW1vZHVsZSA9IHsKICAgICAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsCiAgICAgICAgInVuaWNvZGVkYXRhIiwKICAgICAgICB1bmljb2RlZGF0YV9kb2NzdHJpbmcsCiAgICAgICAgLTEsCiAgICAgICAgdW5pY29kZWRhdGFfZnVuY3Rpb25zLAogICAgICAgIE5VTEwsCiAgICAgICAgTlVMTCwKICAgICAgICBOVUxMLAogICAgICAgIE5VTEwKfTsKClB5TU9ESU5JVF9GVU5DClB5SW5pdF91bmljb2RlZGF0YSh2b2lkKQp7CiAgICBQeU9iamVjdCAqbSwgKnY7CgogICAgUHlfVFlQRSgmVUNEX1R5cGUpID0gJlB5VHlwZV9UeXBlOwoKICAgIG0gPSBQeU1vZHVsZV9DcmVhdGUoJnVuaWNvZGVkYXRhbW9kdWxlKTsKICAgIGlmICghbSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAidW5pZGF0YV92ZXJzaW9uIiwgVU5JREFUQV9WRVJTSU9OKTsKICAgIFB5X0lOQ1JFRigmVUNEX1R5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVQ0QiLCAoUHlPYmplY3QqKSZVQ0RfVHlwZSk7CgogICAgLyogUHJldmlvdXMgdmVyc2lvbnMgKi8KICAgIHYgPSBuZXdfcHJldmlvdXNfdmVyc2lvbigiMy4yLjAiLCBnZXRfY2hhbmdlXzNfMl8wLCBub3JtYWxpemF0aW9uXzNfMl8wKTsKICAgIGlmICh2ICE9IE5VTEwpCiAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ1Y2RfM18yXzAiLCB2KTsKCiAgICAvKiBFeHBvcnQgQyBBUEkgKi8KICAgIHYgPSBQeUNhcHN1bGVfTmV3KCh2b2lkICopJmhhc2hBUEksIFB5VW5pY29kZURhdGFfQ0FQU1VMRV9OQU1FLCBOVUxMKTsKICAgIGlmICh2ICE9IE5VTEwpCiAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ1Y25oYXNoX0NBUEkiLCB2KTsKICAgIHJldHVybiBtOwp9CgovKgpMb2NhbCB2YXJpYWJsZXM6CmMtYmFzaWMtb2Zmc2V0OiA0CmluZGVudC10YWJzLW1vZGU6IG5pbApFbmQ6CiovCg==