Ly8KLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAovLwovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gCi8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQovLwoKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87CnVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKCm5hbWVzcGFjZSBEb3RaTGliCnsKCS8vLyA8c3VtbWFyeT4KCS8vLyBJbXBsZW1lbnRzIGEgY29tcHJlc3NlZCA8c2VlIGNyZWY9IlN0cmVhbSIvPiwgaW4gR1ppcCAoLmd6KSBmb3JtYXQuCgkvLy8gPC9zdW1tYXJ5PgoJcHVibGljIGNsYXNzIEdaaXBTdHJlYW0gOiBTdHJlYW0sIElEaXNwb3NhYmxlCgl7CiAgICAgICAgI3JlZ2lvbiBEbGwgSW1wb3J0cwogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIEludFB0ciBnem9wZW4oc3RyaW5nIG5hbWUsIHN0cmluZyBtb2RlKTsKCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZ3pjbG9zZShJbnRQdHIgZ3pGaWxlKTsKCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZ3p3cml0ZShJbnRQdHIgZ3pGaWxlLCBpbnQgZGF0YSwgaW50IGxlbmd0aCk7CgogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6cmVhZChJbnRQdHIgZ3pGaWxlLCBpbnQgZGF0YSwgaW50IGxlbmd0aCk7CgogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6Z2V0YyhJbnRQdHIgZ3pGaWxlKTsKCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZ3pwdXRjKEludFB0ciBnekZpbGUsIGludCBjKTsKCiAgICAgICAgI2VuZHJlZ2lvbgoKICAgICAgICAjcmVnaW9uIFByaXZhdGUgZGF0YQogICAgICAgIHByaXZhdGUgSW50UHRyIF9nekZpbGU7CiAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkID0gZmFsc2U7CiAgICAgICAgcHJpdmF0ZSBib29sIF9pc1dyaXRpbmc7CiAgICAgICAgI2VuZHJlZ2lvbgoKICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBmaWxlIGFzIGEgd3JpdGVhYmxlIEdaaXBTdHJlYW0KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBjb21wcmVzc2VkIGZpbGUgdG8gY3JlYXRlPC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxldmVsIj5UaGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gdXNlIHdoZW4gYWRkaW5nIGRhdGE8L3BhcmFtPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlpMaWJFeGNlcHRpb24iPklmIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBpbnRlcm5hbCB6bGliIGZ1bmN0aW9uPC9leGNlcHRpb24+CgkJcHVibGljIEdaaXBTdHJlYW0oc3RyaW5nIGZpbGVOYW1lLCBDb21wcmVzc0xldmVsIGxldmVsKQoJCXsKICAgICAgICAgICAgX2lzV3JpdGluZyA9IHRydWU7CiAgICAgICAgICAgIF9nekZpbGUgPSBnem9wZW4oZmlsZU5hbWUsIFN0cmluZy5Gb3JtYXQoIndiezB9IiwgKGludClsZXZlbCkpOwogICAgICAgICAgICBpZiAoX2d6RmlsZSA9PSBJbnRQdHIuWmVybykKICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKC0xLCAiQ291bGQgbm90IG9wZW4gIiArIGZpbGVOYW1lKTsKCQl9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gT3BlbnMgYW4gZXhpc3RpbmcgZmlsZSBhcyBhIHJlYWRhYmxlIEdaaXBTdHJlYW0KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIG9wZW48L3BhcmFtPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlpMaWJFeGNlcHRpb24iPklmIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBpbnRlcm5hbCB6bGliIGZ1bmN0aW9uPC9leGNlcHRpb24+CiAgICAgICAgcHVibGljIEdaaXBTdHJlYW0oc3RyaW5nIGZpbGVOYW1lKQogICAgICAgIHsKICAgICAgICAgICAgX2lzV3JpdGluZyA9IGZhbHNlOwogICAgICAgICAgICBfZ3pGaWxlID0gZ3pvcGVuKGZpbGVOYW1lLCAicmIiKTsKICAgICAgICAgICAgaWYgKF9nekZpbGUgPT0gSW50UHRyLlplcm8pCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWkxpYkV4Y2VwdGlvbigtMSwgIkNvdWxkIG5vdCBvcGVuICIgKyBmaWxlTmFtZSk7CgogICAgICAgIH0KICAgICAgICAjZW5kcmVnaW9uCgogICAgICAgICNyZWdpb24gQWNjZXNzIHByb3BlcnRpZXMKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBvZiB0aGlzIHN0cmVhbSBjYW4gYmUgcmVhZCBmcm9tLCBmYWxzZSBvdGhlcndpc2UKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblJlYWQKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gIV9pc1dyaXRpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBSZXR1cm5zIGZhbHNlLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlawogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdHNyZWFtIGlzIHdyaXRlYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZQogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBfaXNXcml0aW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICNlbmRyZWdpb24KICAgIAogICAgICAgICNyZWdpb24gRGVzdHJ1Y3RvciAmIElEaXNwb3NlIHN0dWZmCgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gRGVzdHJveXMgdGhpcyBpbnN0YW5jZQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgfkdaaXBTdHJlYW0oKQogICAgICAgIHsKICAgICAgICAgICAgY2xlYW5VcChmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIENsb3NlcyB0aGUgZXh0ZXJuYWwgZmlsZSBoYW5kbGUKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQogICAgICAgIHsKICAgICAgICAgICAgY2xlYW5VcCh0cnVlKTsKICAgICAgICB9CgogICAgICAgIC8vIERvZXMgdGhlIGFjdHVhbCBjbG9zaW5nIG9mIHRoZSBmaWxlIGhhbmRsZS4KICAgICAgICBwcml2YXRlIHZvaWQgY2xlYW5VcChib29sIGlzRGlzcG9zaW5nKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ3pjbG9zZShfZ3pGaWxlKTsKICAgICAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjZW5kcmVnaW9uCiAgICAKICAgICAgICAjcmVnaW9uIEJhc2ljIHJlYWRpbmcgYW5kIHdyaXRpbmcKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEF0dGVtcHRzIHRvIHJlYWQgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcjwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGVzdGluYXRpb24gYnl0ZSBpbiA8Yz5idWZmZXI8L2M+PC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZDwvcGFyYW0+CiAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZDwvcmV0dXJucz4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE51bGxFeGNlcHRpb24iPklmIDxjPmJ1ZmZlcjwvYz4gaXMgbnVsbDwvZXhjZXB0aW9uPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+SWYgPGM+Y291bnQ8L2M+IG9yIDxjPm9mZnNldDwvYz4gYXJlIG5lZ2F0aXZlPC9leGNlcHRpb24+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPklmIDxjPm9mZnNldDwvYz4gICsgPGM+Y291bnQ8L2M+IGlzICZndDsgYnVmZmVyLkxlbmd0aDwvZXhjZXB0aW9uPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+SWYgdGhpcyBzdHJlYW0gaXMgbm90IHJlYWRhYmxlLjwvZXhjZXB0aW9uPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBkaXNwb3NlZC48L2V4Y2VwdGlvbj4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFDYW5SZWFkKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigpOwogICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gYnVmZmVyLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJHWmlwU3RyZWFtIik7CgogICAgICAgICAgICBHQ0hhbmRsZSBoID0gR0NIYW5kbGUuQWxsb2MoYnVmZmVyLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsKICAgICAgICAgICAgaW50IHJlc3VsdDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGd6cmVhZChfZ3pGaWxlLCBoLkFkZHJPZlBpbm5lZE9iamVjdCgpLlRvSW50MzIoKSArIG9mZnNldCwgY291bnQpOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxseQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBoLkZyZWUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBBdHRlbXB0cyB0byByZWFkIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBieXRlIHRoYXQgd2FzIHJlYWQsIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3Igb3IgRW5kLU9mLUZpbGU8L3JldHVybnM+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkQnl0ZSgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUNhblJlYWQpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsKICAgICAgICAgICAgcmV0dXJuIGd6Z2V0YyhfZ3pGaWxlKTsKICAgICAgICB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gV3JpdGVzIGEgbnVtYmVyIG9mIGJ5dGVzIHRvIHRoZSBzdHJlYW0KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyIj48L3BhcmFtPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij48L3BhcmFtPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPjwvcGFyYW0+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5JZiA8Yz5idWZmZXI8L2M+IGlzIG51bGw8L2V4Y2VwdGlvbj4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPklmIDxjPmNvdW50PC9jPiBvciA8Yz5vZmZzZXQ8L2M+IGFyZSBuZWdhdGl2ZTwvZXhjZXB0aW9uPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5JZiA8Yz5vZmZzZXQ8L2M+ICArIDxjPmNvdW50PC9jPiBpcyAmZ3Q7IGJ1ZmZlci5MZW5ndGg8L2V4Y2VwdGlvbj4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGlzIG5vdCB3cml0ZWFibGUuPC9leGNlcHRpb24+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGRpc3Bvc2VkLjwvZXhjZXB0aW9uPgogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQ2FuV3JpdGUpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwogICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBidWZmZXIuTGVuZ3RoKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsKCiAgICAgICAgICAgIEdDSGFuZGxlIGggPSBHQ0hhbmRsZS5BbGxvYyhidWZmZXIsIEdDSGFuZGxlVHlwZS5QaW5uZWQpOwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGd6d3JpdGUoX2d6RmlsZSwgaC5BZGRyT2ZQaW5uZWRPYmplY3QoKS5Ub0ludDMyKCkgKyBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaC5GcmVlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIHN0cmVhbQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIGJ5dGUgdG8gYWRkIHRvIHRoZSBzdHJlYW0uPC9wYXJhbT4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGlzIG5vdCB3cml0ZWFibGUuPC9leGNlcHRpb24+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGRpc3Bvc2VkLjwvZXhjZXB0aW9uPgogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShieXRlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFDYW5Xcml0ZSkgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwogICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOwoKICAgICAgICAgICAgaW50IHJlc3VsdCA9IGd6cHV0YyhfZ3pGaWxlLCAoaW50KXZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICAgICB9CiAgICAgICAgI2VuZHJlZ2lvbgoKICAgICAgICAjcmVnaW9uIFBvc2l0aW9uICYgbGVuZ3RoIHN0dWZmCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBOb3Qgc3VwcG9ydGVkLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPkFsd2F5cyB0aHJvd248L2V4Y2VwdGlvbj4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRMZW5ndGgobG9uZyB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKICAgICAgICB9CiAgICAKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vICBOb3Qgc3VwcHBvcnRlZC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij48L3BhcmFtPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3JpZ2luIj48L3BhcmFtPgogICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU2Vla09yaWdpbiBvcmlnaW4pCiAgICAgICAgewogICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBGbHVzaGVzIHRoZSA8Yz5HWmlwU3RyZWFtPC9jPi4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cmVtYXJrcz5JbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIFRoaXMgaXMgYmVjYXVzZSBleGNlc3NpdmUKICAgICAgICAvLy8gZmx1c2hpbmcgbWF5IGRlZ3JhZGUgdGhlIGFjaGlldmFibGUgY29tcHJlc3Npb24gcmF0ZXMuPC9yZW1hcmtzPgogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGxlZnQgZW1wdHkgb24gcHVycG9zZQogICAgICAgIH0KICAgIAogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSA8Yz5HWmlwU3RyZWFtPC9jPi4gTm90IHN1cHBwb3J0ZWQuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHJlbWFya3M+SW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQ8L3JlbWFya3M+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUG9zaXRpb24KICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgc3RyZWFtLiBOb3Qgc3VwcHBvcnRlZC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cmVtYXJrcz5JbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZDwvcmVtYXJrcz4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPkFsd2F5cyB0aHJvd248L2V4Y2VwdGlvbj4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgI2VuZHJlZ2lvbgogICAgfQp9Cg==