IyEgL2Jpbi9zaAouICIke3NyY2Rpcj0ufS9pbml0LnNoIjsgcGF0aF9wcmVwZW5kXyAuIC4uL3NyYwoKIyBUZXN0IG9mIGdldHRleHQgZmFjaWxpdGllcyAoaW5jbHVkaW5nIHBsdXJhbCBoYW5kbGluZykgaW4gdGhlIFB5dGhvbgojIGxhbmd1YWdlLgoKIyBOb3RlOiBUaGlzIHRlc3QgZmFpbHMgd2l0aCBQeXRob24gMi4zIC4uLiAyLjcgd2hlbiBhbiBVVEYtOCBsb2NhbGUgaXMgcHJlc2VudC4KIyBJdCBsb29rcyBsaWtlIGEgYnVnIGluIFB5dGhvbidzIGdldHRleHQucHkuIFRoaXMgaGVyZSBpcyBhIHF1aWNrIHdvcmthcm91bmQ6ClVURjhfTE9DQUxFX1VOU1VQUE9SVEVEPXllcwoKY2F0IDw8XEVPRiA+IHByb2cyLnB5CmltcG9ydCBzeXMKaW1wb3J0IGdldHRleHQKCm4gPSBpbnQoc3lzLmFyZ3ZbMV0pCgpnZXR0ZXh0LnRleHRkb21haW4oJ3Byb2cnKQpnZXR0ZXh0LmJpbmR0ZXh0ZG9tYWluKCdwcm9nJywgJy4nKQoKcHJpbnQgZ2V0dGV4dC5nZXR0ZXh0KCInWW91ciBjb21tYW5kLCBwbGVhc2U/JywgYXNrZWQgdGhlIHdhaXRlci4iKQpwcmludCBnZXR0ZXh0Lm5nZXR0ZXh0KCJhIHBpZWNlIG9mIGNha2UiLCIlKGNvdW50KWQgcGllY2VzIG9mIGNha2UiLG4pIFwKICAgICAgJSB7ICdjb3VudCc6IG4gfQpwcmludCBnZXR0ZXh0LmdldHRleHQoIiUob2xkQ3VycmVuY3kpcyBpcyByZXBsYWNlZCBieSAlKG5ld0N1cnJlbmN5KXMuIikgXAogICAgICAlIHsgJ29sZEN1cnJlbmN5JzogIkZGIiwgJ25ld0N1cnJlbmN5JyA6ICJFVVIiIH0KRU9GCgo6ICR7WEdFVFRFWFQ9eGdldHRleHR9CiR7WEdFVFRFWFR9IC1vIHByb2cudG1wIC0tb21pdC1oZWFkZXIgLS1uby1sb2NhdGlvbiBwcm9nMi5weSB8fCBFeGl0IDEKTENfQUxMPUMgdHIgLWQgJ1xyJyA8IHByb2cudG1wID4gcHJvZy5wb3QgfHwgRXhpdCAxCgpjYXQgPDxFT0YgPiBwcm9nLm9rCm1zZ2lkICInWW91ciBjb21tYW5kLCBwbGVhc2U/JywgYXNrZWQgdGhlIHdhaXRlci4iCm1zZ3N0ciAiIgoKIywgcHl0aG9uLWZvcm1hdAptc2dpZCAiYSBwaWVjZSBvZiBjYWtlIgptc2dpZF9wbHVyYWwgIiUoY291bnQpZCBwaWVjZXMgb2YgY2FrZSIKbXNnc3RyWzBdICIiCm1zZ3N0clsxXSAiIgoKIywgcHl0aG9uLWZvcm1hdAptc2dpZCAiJShvbGRDdXJyZW5jeSlzIGlzIHJlcGxhY2VkIGJ5ICUobmV3Q3VycmVuY3kpcy4iCm1zZ3N0ciAiIgpFT0YKCjogJHtESUZGPWRpZmZ9CiR7RElGRn0gcHJvZy5vayBwcm9nLnBvdCB8fCBFeGl0IDEKCmNhdCA8PFxFT0YgPiBmci5wbwptc2dpZCAiIgptc2dzdHIgIiIKIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xXG4iCiJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiA+IDEpO1xuIgoKbXNnaWQgIidZb3VyIGNvbW1hbmQsIHBsZWFzZT8nLCBhc2tlZCB0aGUgd2FpdGVyLiIKbXNnc3RyICKrVm90cmUgY29tbWFuZGUsIHMnaWwgdm91cyBwbGFpdLssIGRpdCBsZSBnYXLnb24uIgoKIyBMZXMgZ2F0ZWF1eCBhbGxlbWFuZHMgc29udCBsZXMgbWVpbGxldXJzIGR1IG1vbmRlLgojLCBweXRob24tZm9ybWF0Cm1zZ2lkICJhIHBpZWNlIG9mIGNha2UiCm1zZ2lkX3BsdXJhbCAiJShjb3VudClkIHBpZWNlcyBvZiBjYWtlIgptc2dzdHJbMF0gInVuIG1vcmNlYXUgZGUgZ2F0ZWF1Igptc2dzdHJbMV0gIiUoY291bnQpZCBtb3JjZWF1eCBkZSBnYXRlYXUiCgojIFJldmVyc2UgdGhlIGFyZ3VtZW50cy4KIywgcHl0aG9uLWZvcm1hdAptc2dpZCAiJShvbGRDdXJyZW5jeSlzIGlzIHJlcGxhY2VkIGJ5ICUobmV3Q3VycmVuY3kpcy4iCm1zZ3N0ciAiJShuZXdDdXJyZW5jeSlzIHJlbXBsYWNlICUob2xkQ3VycmVuY3kpcy4iCkVPRgoKOiAke01TR01FUkdFPW1zZ21lcmdlfQoke01TR01FUkdFfSAtcSAtbyBmci5wby50bXAgZnIucG8gcHJvZy5wb3QgfHwgRXhpdCAxCkxDX0FMTD1DIHRyIC1kICdccicgPCBmci5wby50bXAgPiBmci5wby5uZXcgfHwgRXhpdCAxCgo6ICR7RElGRj1kaWZmfQoke0RJRkZ9IGZyLnBvIGZyLnBvLm5ldyB8fCBFeGl0IDEKCnRlc3QgLWQgZnIgfHwgbWtkaXIgZnIKdGVzdCAtZCBmci9MQ19NRVNTQUdFUyB8fCBta2RpciBmci9MQ19NRVNTQUdFUwoKOiAke01TR0ZNVD1tc2dmbXR9CiR7TVNHRk1UfSAtbyBmci9MQ19NRVNTQUdFUy9wcm9nLm1vIGZyLnBvCgojIFRlc3QgZm9yIHByZXNlbmNlIG9mIHB5dGhvbiB2ZXJzaW9uIDIuMyBvciBuZXdlci4KKHB5dGhvbiAtVikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCiAgfHwgeyBlY2hvICJTa2lwcGluZyB0ZXN0OiBweXRob24gbm90IGZvdW5kIjsgRXhpdCA3NzsgfQpjYXNlIGBweXRob24gLWMgJ2ltcG9ydCBzeXM7IHByaW50IHN5cy5oZXh2ZXJzaW9uID49IDB4MjAzMDBGMCdgIGluCiAgMSB8IFRydWUpIDs7CiAgKikgZWNobyAiU2tpcHBpbmcgdGVzdDogcHl0aG9uIHZlcnNpb24gdG9vIG9sZCI7IEV4aXQgNzc7Owplc2FjCgo6ICR7RElGRj1kaWZmfQpjYXQgPDxcRU9GID4gcHJvZy5vawqrVm90cmUgY29tbWFuZGUsIHMnaWwgdm91cyBwbGFpdLssIGRpdCBsZSBnYXLnb24uCjIgbW9yY2VhdXggZGUgZ2F0ZWF1CkVVUiByZW1wbGFjZSBGRi4KRU9GCmNhdCA8PFxFT0YgPiBwcm9nLm9rdQrCq1ZvdHJlIGNvbW1hbmRlLCBzJ2lsIHZvdXMgcGxhaXTCuywgZGl0IGxlIGdhcsOnb24uCjIgbW9yY2VhdXggZGUgZ2F0ZWF1CkVVUiByZW1wbGFjZSBGRi4KRU9GCgo6ICR7TE9DQUxFX0ZSPWZyX0ZSfQo6ICR7TE9DQUxFX0ZSX1VURjg9ZnJfRlIuVVRGLTh9CmlmIHRlc3QgJExPQ0FMRV9GUiAhPSBub25lOyB0aGVuCiAgcHJlcGFyZV9sb2NhbGVfIGZyICRMT0NBTEVfRlIKICBMQU5HVUFHRT0gTENfQUxMPSRMT0NBTEVfRlIgcHl0aG9uIHByb2cyLnB5IDIgPiBwcm9nLm91dCB8fCBFeGl0IDEKICAke0RJRkZ9IHByb2cub2sgcHJvZy5vdXQgfHwgRXhpdCAxCmZpCmlmIHRlc3QgLXogIiRVVEY4X0xPQ0FMRV9VTlNVUFBPUlRFRCI7IHRoZW4KICBpZiB0ZXN0ICRMT0NBTEVfRlJfVVRGOCAhPSBub25lOyB0aGVuCiAgICBwcmVwYXJlX2xvY2FsZV8gZnIgJExPQ0FMRV9GUl9VVEY4CiAgICBMQU5HVUFHRT0gTENfQUxMPSRMT0NBTEVfRlJfVVRGOCBweXRob24gcHJvZzIucHkgMiA+IHByb2cub3V0IHx8IEV4aXQgMQogICAgJHtESUZGfSBwcm9nLm9rdSBwcm9nLm91dCB8fCBFeGl0IDEKICBmaQogIGlmIHRlc3QgJExPQ0FMRV9GUiA9IG5vbmUgJiYgdGVzdCAkTE9DQUxFX0ZSX1VURjggPSBub25lOyB0aGVuCiAgICBpZiB0ZXN0IC1mIC91c3IvYmluL2xvY2FsZWRlZjsgdGhlbgogICAgICBlY2hvICJTa2lwcGluZyB0ZXN0OiBubyBmcmVuY2ggbG9jYWxlIGlzIGluc3RhbGxlZCIKICAgIGVsc2UKICAgICAgZWNobyAiU2tpcHBpbmcgdGVzdDogbm8gZnJlbmNoIGxvY2FsZSBpcyBzdXBwb3J0ZWQiCiAgICBmaQogICAgRXhpdCA3NwogIGZpCmVsc2UKICBpZiB0ZXN0ICRMT0NBTEVfRlIgPSBub25lOyB0aGVuCiAgICBpZiB0ZXN0IC1mIC91c3IvYmluL2xvY2FsZWRlZjsgdGhlbgogICAgICBlY2hvICJTa2lwcGluZyB0ZXN0OiBubyB0cmFkaXRpb25hbCBmcmVuY2ggbG9jYWxlIGlzIGluc3RhbGxlZCIKICAgIGVsc2UKICAgICAgZWNobyAiU2tpcHBpbmcgdGVzdDogbm8gdHJhZGl0aW9uYWwgZnJlbmNoIGxvY2FsZSBpcyBzdXBwb3J0ZWQiCiAgICBmaQogICAgRXhpdCA3NwogIGZpCmZpCgpFeGl0IDAK