IyEgL2Jpbi9zaAouICIke3NyY2Rpcj0ufS9pbml0LnNoIjsgcGF0aF9wcmVwZW5kXyAuIC4uL3NyYwoKIyBUZXN0IG9mIGdldHRleHQgZmFjaWxpdGllcyBpbiB0aGUgUHl0aG9uIGxhbmd1YWdlLgoKIyBOb3RlOiBUaGlzIHRlc3QgZmFpbHMgd2l0aCBQeXRob24gMi4zIC4uLiAyLjcgd2hlbiBhbiBVVEYtOCBsb2NhbGUgaXMgcHJlc2VudC4KIyBJdCBsb29rcyBsaWtlIGEgYnVnIGluIFB5dGhvbidzIGdldHRleHQucHkuIFRoaXMgaGVyZSBpcyBhIHF1aWNrIHdvcmthcm91bmQ6ClVURjhfTE9DQUxFX1VOU1VQUE9SVEVEPXllcwoKY2F0IDw8XEVPRiA+IHByb2cxLnB5CmltcG9ydCBnZXR0ZXh0CgpnZXR0ZXh0LnRleHRkb21haW4oJ3Byb2cnKQpnZXR0ZXh0LmJpbmR0ZXh0ZG9tYWluKCdwcm9nJywgJy4nKQoKcHJpbnQgZ2V0dGV4dC5nZXR0ZXh0KCInWW91ciBjb21tYW5kLCBwbGVhc2U/JywgYXNrZWQgdGhlIHdhaXRlci4iKQpwcmludCBnZXR0ZXh0LmdldHRleHQoIiUob2xkQ3VycmVuY3kpcyBpcyByZXBsYWNlZCBieSAlKG5ld0N1cnJlbmN5KXMuIikgXAogICAgICAlIHsgJ29sZEN1cnJlbmN5JzogIkZGIiwgJ25ld0N1cnJlbmN5JyA6ICJFVVIiIH0KRU9GCgo6ICR7WEdFVFRFWFQ9eGdldHRleHR9CiR7WEdFVFRFWFR9IC1vIHByb2cudG1wIC0tb21pdC1oZWFkZXIgLS1uby1sb2NhdGlvbiBwcm9nMS5weSB8fCBFeGl0IDEKTENfQUxMPUMgdHIgLWQgJ1xyJyA8IHByb2cudG1wID4gcHJvZy5wb3QgfHwgRXhpdCAxCgpjYXQgPDxFT0YgPiBwcm9nLm9rCm1zZ2lkICInWW91ciBjb21tYW5kLCBwbGVhc2U/JywgYXNrZWQgdGhlIHdhaXRlci4iCm1zZ3N0ciAiIgoKIywgcHl0aG9uLWZvcm1hdAptc2dpZCAiJShvbGRDdXJyZW5jeSlzIGlzIHJlcGxhY2VkIGJ5ICUobmV3Q3VycmVuY3kpcy4iCm1zZ3N0ciAiIgpFT0YKCjogJHtESUZGPWRpZmZ9CiR7RElGRn0gcHJvZy5vayBwcm9nLnBvdCB8fCBFeGl0IDEKCmNhdCA8PFxFT0YgPiBmci5wbwptc2dpZCAiIgptc2dzdHIgIiIKIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xXG4iCiJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiA+IDEpO1xuIgoKbXNnaWQgIidZb3VyIGNvbW1hbmQsIHBsZWFzZT8nLCBhc2tlZCB0aGUgd2FpdGVyLiIKbXNnc3RyICKrVm90cmUgY29tbWFuZGUsIHMnaWwgdm91cyBwbGFpdLssIGRpdCBsZSBnYXLnb24uIgoKIyBSZXZlcnNlIHRoZSBhcmd1bWVudHMuCiMsIHB5dGhvbi1mb3JtYXQKbXNnaWQgIiUob2xkQ3VycmVuY3kpcyBpcyByZXBsYWNlZCBieSAlKG5ld0N1cnJlbmN5KXMuIgptc2dzdHIgIiUobmV3Q3VycmVuY3kpcyByZW1wbGFjZSAlKG9sZEN1cnJlbmN5KXMuIgpFT0YKCjogJHtNU0dNRVJHRT1tc2dtZXJnZX0KJHtNU0dNRVJHRX0gLXEgLW8gZnIucG8udG1wIGZyLnBvIHByb2cucG90IHx8IEV4aXQgMQpMQ19BTEw9QyB0ciAtZCAnXHInIDwgZnIucG8udG1wID4gZnIucG8ubmV3IHx8IEV4aXQgMQoKOiAke0RJRkY9ZGlmZn0KJHtESUZGfSBmci5wbyBmci5wby5uZXcgfHwgRXhpdCAxCgp0ZXN0IC1kIGZyIHx8IG1rZGlyIGZyCnRlc3QgLWQgZnIvTENfTUVTU0FHRVMgfHwgbWtkaXIgZnIvTENfTUVTU0FHRVMKCjogJHtNU0dGTVQ9bXNnZm10fQoke01TR0ZNVH0gLW8gZnIvTENfTUVTU0FHRVMvcHJvZy5tbyBmci5wbwoKIyBUZXN0IGZvciBwcmVzZW5jZSBvZiBweXRob24gdmVyc2lvbiAyLjAgb3IgbmV3ZXIuCihweXRob24gLVYpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAogIHx8IHsgZWNobyAiU2tpcHBpbmcgdGVzdDogcHl0aG9uIG5vdCBmb3VuZCI7IEV4aXQgNzc7IH0KY2FzZSBgcHl0aG9uIC1jICdpbXBvcnQgc3lzOyBwcmludCBzeXMuaGV4dmVyc2lvbiA+PSAweDIwMDAwRjAnYCBpbgogIDEgfCBUcnVlKSA7OwogICopIGVjaG8gIlNraXBwaW5nIHRlc3Q6IHB5dGhvbiB2ZXJzaW9uIHRvbyBvbGQiOyBFeGl0IDc3OzsKZXNhYwoKOiAke0RJRkY9ZGlmZn0KY2F0IDw8XEVPRiA+IHByb2cub2sKq1ZvdHJlIGNvbW1hbmRlLCBzJ2lsIHZvdXMgcGxhaXS7LCBkaXQgbGUgZ2Fy529uLgpFVVIgcmVtcGxhY2UgRkYuCkVPRgpjYXQgPDxcRU9GID4gcHJvZy5va3UKwqtWb3RyZSBjb21tYW5kZSwgcydpbCB2b3VzIHBsYWl0wrssIGRpdCBsZSBnYXLDp29uLgpFVVIgcmVtcGxhY2UgRkYuCkVPRgoKOiAke0xPQ0FMRV9GUj1mcl9GUn0KOiAke0xPQ0FMRV9GUl9VVEY4PWZyX0ZSLlVURi04fQppZiB0ZXN0ICRMT0NBTEVfRlIgIT0gbm9uZTsgdGhlbgogIHByZXBhcmVfbG9jYWxlXyBmciAkTE9DQUxFX0ZSCiAgTEFOR1VBR0U9IExDX0FMTD0kTE9DQUxFX0ZSIHB5dGhvbiBwcm9nMS5weSA+IHByb2cub3V0IHx8IEV4aXQgMQogICR7RElGRn0gcHJvZy5vayBwcm9nLm91dCB8fCBFeGl0IDEKZmkKaWYgdGVzdCAteiAiJFVURjhfTE9DQUxFX1VOU1VQUE9SVEVEIjsgdGhlbgogIGlmIHRlc3QgJExPQ0FMRV9GUl9VVEY4ICE9IG5vbmU7IHRoZW4KICAgIHByZXBhcmVfbG9jYWxlXyBmciAkTE9DQUxFX0ZSX1VURjgKICAgIExBTkdVQUdFPSBMQ19BTEw9JExPQ0FMRV9GUl9VVEY4IHB5dGhvbiBwcm9nMS5weSA+IHByb2cub3V0IHx8IEV4aXQgMQogICAgJHtESUZGfSBwcm9nLm9rdSBwcm9nLm91dCB8fCBFeGl0IDEKICBmaQogIGlmIHRlc3QgJExPQ0FMRV9GUiA9IG5vbmUgJiYgdGVzdCAkTE9DQUxFX0ZSX1VURjggPSBub25lOyB0aGVuCiAgICBpZiB0ZXN0IC1mIC91c3IvYmluL2xvY2FsZWRlZjsgdGhlbgogICAgICBlY2hvICJTa2lwcGluZyB0ZXN0OiBubyBmcmVuY2ggbG9jYWxlIGlzIGluc3RhbGxlZCIKICAgIGVsc2UKICAgICAgZWNobyAiU2tpcHBpbmcgdGVzdDogbm8gZnJlbmNoIGxvY2FsZSBpcyBzdXBwb3J0ZWQiCiAgICBmaQogICAgRXhpdCA3NwogIGZpCmVsc2UKICBpZiB0ZXN0ICRMT0NBTEVfRlIgPSBub25lOyB0aGVuCiAgICBpZiB0ZXN0IC1mIC91c3IvYmluL2xvY2FsZWRlZjsgdGhlbgogICAgICBlY2hvICJTa2lwcGluZyB0ZXN0OiBubyB0cmFkaXRpb25hbCBmcmVuY2ggbG9jYWxlIGlzIGluc3RhbGxlZCIKICAgIGVsc2UKICAgICAgZWNobyAiU2tpcHBpbmcgdGVzdDogbm8gdHJhZGl0aW9uYWwgZnJlbmNoIGxvY2FsZSBpcyBzdXBwb3J0ZWQiCiAgICBmaQogICAgRXhpdCA3NwogIGZpCmZpCgpFeGl0IDAK