Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvcHlyaWdodCAoQykgTWljcm9zb2Z0LiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLnR4dCBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbi4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyAhISEhIERPIE5PVCBFRElUIFRISVMgRklMRSBXSVRIIEEgTk9STUFMIFRFWFQgRURJVE9SICEhIQoKLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGludmFsaWQgVVRGOCBzZXF1ZW5jZXMgdGhhdCBhbnkgc2FuZSBlZGl0b3Igd291bGQgImZpeCIuCi8vIGJ1dCB3b3VsZCwgaG93ZXZlciBicmVhayB0aGlzIHRlc3QuIElmIHlvdSBkbyBlZGl0IGl0IHRoZW4gbWFrZSBzdXJlIHRoZSBpbnZhbGlkCi8vIHNlcXVlbmNlcyBhcmUgcmV0YWluZWQgaW4gdGhlIGVkaXRlZCBmaWxlIGJlZm9yZSBjaGVja2luZyBpbi4KCmZ1bmN0aW9uIHdyaXRlKGEpIHsKICAgIGlmICh0aGlzLldTY3JpcHQgPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoYSk7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoIjwvYnI+Iik7CiAgICB9CiAgICBlbHNlCiAgICAgICAgV1NjcmlwdC5FY2hvKGEpCn0KCmZ1bmN0aW9uIHRlc3QoYSwgYikgewogIHdyaXRlKGEgPT0gYik7CiAgdmFyIGV2YWxUZXh0ID0gInJlc3VsdCA9IFwiIiArIGEgKyAiXCIiOwogIGV2YWwoZXZhbFRleHQpOwogIHdyaXRlKGEgPT0gcmVzdWx0KTsKfQogIAovLyBTdHJpbmcgY29udGFpbmluZyBpbnZhbGlkIHNlcXVlbmNlIEMwIDIwIHNob3VsZCBiZSBlcXVpdmllbnQgdG8gXHVGRkZEXHUwMDAyMCIKdmFyIEMwMjAgPSAiwCAiOwp2YXIgUmVwMjAgPSAiXHVGRkZEXHUwMDIwIjsKdGVzdChDMDIwLCBSZXAyMCk7CgovLyBFbnN1cmUgYSB2YWxpZCBzZXF1ZW5jZSBnZXRzIHRyYW5zbGF0ZWQgY29ycmVjdGx5Lgp2YXIgQzg4NSA9ICLIhSI7CnZhciB4MDIwNSA9ICJcdTAyMDUiOwp0ZXN0KEM4ODUsIHgwMjA1KTsKCi8vIEVuc3VyZSBzdXJyb2dhdGUgcGFpcnMgYXJlIGVuY29kZWQgY29ycmVjdGx5CnZhciBGMDkwOTA4MCA9ICLwkJCAIjsKdmFyIEQ4MDFEQzAwID0gIlx1RDgwMVx1REMwMCI7CnRlc3QoRjA5MDkwODAsIEQ4MDFEQzAwKTsKCi8vIEVuc3VyZSBpbnZhbGlkIHN1cnJvZ2F0ZSBwYWlycyBhcmUgcmVwbGFjZWQgd2l0aCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzLgp2YXIgRURBMDgxX0VEQjA4MCA9ICLtoIHtsIAiOwp2YXIgUmVweDYgPSAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIjsKdGVzdChFREEwODFfRURCMDgwLCBSZXB4Nik7CgovLyBFbnN1cmUgaW52YWxpZCBjaGFyYWN0ZXJzIGFyZSBub3QgcmVwbGFjZWQgd2l0aCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzLgp2YXIgRUZCRkJGID0gIu+/vyI7CnZhciBSZXB4NyA9ICJcdUZGRkYiOwp0ZXN0KEVGQkZCRiwgUmVweDcpOwo=