IiBWaW0gZmlsZXR5cGUgcGx1Z2luIGZpbGUKIiBMYW5ndWFnZToJRGViaWFuIENoYW5nZWxvZwoiIE1haW50YWluZXI6CU1pY2hhZWwgUGllZmVsIDxwaWVmZWxAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+CiIgTGFzdCBDaGFuZ2U6CTIzIE1hcmNoIDIwMDQKCmlmIGV4aXN0cygiZzpkaWRfY2hhbmdlbG9nX2Z0cGx1Z2luIikKICBmaW5pc2gKZW5kaWYKCiIgRG9uJ3QgbG9hZCBhbm90aGVyIHBsdWdpbiAodGhpcyBpcyBnbG9iYWwpCmxldCBnOmRpZF9jaGFuZ2Vsb2dfZnRwbHVnaW4gPSAxCgoiIEhlbHBlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZhcmlvdXMgZGF0YS4KIiBSZXR1cm5zIGZ1bGwgbmFtZSwgZWl0aGVyIGZyb20gJERFQkZVTExOQU1FIG9yIGRlYmlhbmZ1bGxuYW1lLgoiIFRPRE8gSXMgdGhlcmUgYSB3YXkgdG8gZGV0ZXJtaW5lIG5hbWUgZnJvbSBhbnl3aGVyZSBlbHNlPwpmdW5jdGlvbiA8U0lEPkZ1bGxOYW1lKCkKICAgIGlmIGV4aXN0cygiJERFQkZVTExOQU1FIikKCXJldHVybiAkREVCRlVMTE5BTUUKICAgIGVsc2VpZiBleGlzdHMoImc6ZGViaWFuZnVsbG5hbWUiKQoJcmV0dXJuIGc6ZGViaWFuZnVsbG5hbWUKICAgIGVsc2UKCXJldHVybiAiWW91ciBOYW1lIgogICAgZW5kaWYKZW5kZnVuY3Rpb24KCiIgUmV0dXJucyBlbWFpbCBhZGRyZXNzLCBmcm9tICRERUJFTUFJTCwgJEVNQUlMIG9yIGRlYmlhbmVtYWlsLgpmdW5jdGlvbiA8U0lEPkVtYWlsKCkKICAgIGlmIGV4aXN0cygiJERFQkVNQUlMIikKCXJldHVybiAkREVCRU1BSUwKICAgIGVsc2VpZiBleGlzdHMoIiRFTUFJTCIpCglyZXR1cm4gJEVNQUlMCiAgICBlbHNlaWYgZXhpc3RzKCJnOmRlYmlhbmVtYWlsIikKCXJldHVybiBnOmRlYmlhbmZ1bGxlbWFpbAogICAgZWxzZQoJcmV0dXJuICJ5b3VyQGVtYWlsLmFkZHJlc3MiCiAgICBlbmRpZgplbmRmdW5jdGlvbgoKIiBSZXR1cm5zIGRhdGUgaW4gUkZDODIyIGZvcm1hdC4KZnVuY3Rpb24gPFNJRD5EYXRlKCkKICAgIGxldCBzYXZlbGFuZyA9IHY6bGNfdGltZQogICAgZXhlY3V0ZSAibGFuZ3VhZ2UgdGltZSBDIgogICAgbGV0IGRhdGVhbmR0aW1lID0gc3RyZnRpbWUoIiVhLCAlZCAlYiAlWSAlWCAleiIpCiAgICBleGVjdXRlICJsYW5ndWFnZSB0aW1lICIgLiBzYXZlbGFuZwogICAgcmV0dXJuIGRhdGVhbmR0aW1lCmVuZGZ1bmN0aW9uCgpmdW5jdGlvbiA8U0lEPldhcm5JZk5vdFVuZmluYWxpc2VkKCkKICAgIGlmIG1hdGNoKGdldGxpbmUoIi4iKSwgIiAtLSBbWzphbHBoYTpdXVtbOmFsbnVtOl0uXSIpIT0tMQoJZWNob2hsIFdhcm5pbmdNc2cKCWVjaG8gIlRoZSBlbnRyeSBoYXMgbm90IGJlZW4gdW5maW5hbGlzZWQgYmVmb3JlIGVkaXRpbmcuIgoJZWNob2hsIE5vbmUKCXJldHVybiAxCiAgICBlbmRpZgogICAgcmV0dXJuIDAKZW5kZnVuY3Rpb24KCmZ1bmN0aW9uIDxTSUQ+RmluYWxpc2VkKCkKICAgIGxldCBzYXZlbGluZW51bSA9IGxpbmUoIi4iKQogICAgbm9ybWFsIDFHCiAgICBjYWxsIHNlYXJjaCgiXiAtLSAiKQogICAgaWYgbWF0Y2goZ2V0bGluZSgiLiIpLCAiIC0tIFtbOmFscGhhOl1dW1s6YWxudW06XS5dIikhPS0xCglsZXQgcmV0dXJudmFsdWUgPSAxCiAgICBlbHNlCglsZXQgcmV0dXJudmFsdWUgPSAwCiAgICBlbmRpZgogICAgZXhlY3V0ZSBzYXZlbGluZW51bQogICAgcmV0dXJuIHJldHVybnZhbHVlCmVuZGZ1bmN0aW9uCgoiIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIG1lbnVzCmZ1bmN0aW9uIE5ld1ZlcnNpb24oKQogICAgIiBUaGUgbmV3IGVudHJ5IGlzIHVuZmluYWxpc2VkIGFuZCBzaGFsbCBiZSBjaGFuZ2VkCiAgICBhbWVudSBkaXNhYmxlIENoYW5nZWxvZy5OZXdcIFZlcnNpb24KICAgIGFtZW51IGVuYWJsZSBDaGFuZ2Vsb2cuQWRkXCBFbnRyeQogICAgYW1lbnUgZW5hYmxlIENoYW5nZWxvZy5DbG9zZVwgQnVnCiAgICBhbWVudSBlbmFibGUgQ2hhbmdlbG9nLlNldFwgRGlzdHJpYnV0aW9uCiAgICBhbWVudSBlbmFibGUgQ2hhbmdlbG9nLlNldFwgVXJnZW5jeQogICAgYW1lbnUgZGlzYWJsZSBDaGFuZ2Vsb2cuVW5maW5hbGlzZQogICAgYW1lbnUgZW5hYmxlIENoYW5nZWxvZy5GaW5hbGlzZQogICAgY2FsbCBhcHBlbmQoMCwgc3Vic3RpdHV0ZShnZXRsaW5lKDEpLCctXChbWzpkaWdpdDpdXVwrXCkpJywgJy3cXDEpJywgJycpKQogICAgY2FsbCBhcHBlbmQoMSwgIiIpCiAgICBjYWxsIGFwcGVuZCgyLCAiIikKICAgIGNhbGwgYXBwZW5kKDMsICIgLS0gIikKICAgIGNhbGwgYXBwZW5kKDQsICIiKQogICAgY2FsbCBEaXN0cmlidXRpb24oInVuc3RhYmxlIikKICAgIGNhbGwgVXJnZW5jeSgibG93IikKICAgIG5vcm1hbCAxRwogICAgY2FsbCBzZWFyY2goIikiKQogICAgbm9ybWFsIGgKICAgIG5vcm1hbCABCiAgICBjYWxsIHNldGxpbmUoMSwgc3Vic3RpdHV0ZShnZXRsaW5lKDEpLCct3FwoW1s6ZGlnaXQ6XV1cK1wpKScsICctXDEpJywgJycpKQogICAgY2FsbCBBZGRFbnRyeSgpCmVuZGZ1bmN0aW9uCgpmdW5jdGlvbiBBZGRFbnRyeSgpCiAgICBub3JtYWwgMUcKICAgIGNhbGwgc2VhcmNoKCJeIC0tICIpCiAgICBub3JtYWwga2sKICAgIGNhbGwgYXBwZW5kKCIuIiwgIiAgKiAiKQogICAgbm9ybWFsIGpqagogICAgbGV0IHdhcm49PFNJRD5XYXJuSWZOb3RVbmZpbmFsaXNlZCgpCiAgICBub3JtYWwga2sKICAgIGlmIHdhcm4KCWVjaG9obCBNb3JlTXNnCgljYWxsIGlucHV0KCJIaXQgRU5URVIiKQoJZWNob2hsIE5vbmUKICAgIGVuZGlmCiAgICBzdGFydGluc2VydCEKZW5kZnVuY3Rpb24KCmZ1bmN0aW9uIENsb3NlQnVnKCkKICAgIG5vcm1hbCAxRwogICAgY2FsbCBzZWFyY2goIl4gLS0gIikKICAgIGxldCB3YXJuPTxTSUQ+V2FybklmTm90VW5maW5hbGlzZWQoKQogICAgbm9ybWFsIGtrCiAgICBjYWxsIGFwcGVuZCgiLiIsICIgICogIChjbG9zZXM6ICMiIC4gaW5wdXQoIkJ1ZyBudW1iZXIgdG8gY2xvc2U6ICIpIC4gIikiKQogICAgbm9ybWFsIGpebGwKICAgIHN0YXJ0aW5zZXJ0CmVuZGZ1bmN0aW9uCgpmdW5jdGlvbiBEaXN0cmlidXRpb24oZGlzdCkKICAgIGNhbGwgc2V0bGluZSgxLCBzdWJzdGl0dXRlKGdldGxpbmUoMSksICIpIFtbOmxvd2VyOl0gXSo7IiwgIikgIiAuIGE6ZGlzdCAuICI7IiwgIiIpKQplbmRmdW5jdGlvbgoKZnVuY3Rpb24gVXJnZW5jeSh1cmcpCiAgICBjYWxsIHNldGxpbmUoMSwgc3Vic3RpdHV0ZShnZXRsaW5lKDEpLCAidXJnZW5jeT0uKiQiLCAidXJnZW5jeT0iIC4gYTp1cmcsICIiKSkKZW5kZnVuY3Rpb24KCmZ1bmN0aW9uIDxTSUQ+VW5maW5hbGlzZU1lbnUoKQogICAgIiBUaGlzIG1lYW5zIHRoZSBlbnRyeSBzaGFsbCBiZSBjaGFuZ2VkCiAgICBhbWVudSBkaXNhYmxlIENoYW5nZWxvZy5OZXdcIFZlcnNpb24KICAgIGFtZW51IGVuYWJsZSBDaGFuZ2Vsb2cuQWRkXCBFbnRyeQogICAgYW1lbnUgZW5hYmxlIENoYW5nZWxvZy5DbG9zZVwgQnVnCiAgICBhbWVudSBlbmFibGUgQ2hhbmdlbG9nLlNldFwgRGlzdHJpYnV0aW9uCiAgICBhbWVudSBlbmFibGUgQ2hhbmdlbG9nLlNldFwgVXJnZW5jeQogICAgYW1lbnUgZGlzYWJsZSBDaGFuZ2Vsb2cuVW5maW5hbGlzZQogICAgYW1lbnUgZW5hYmxlIENoYW5nZWxvZy5GaW5hbGlzZQplbmRmdW5jdGlvbgoKZnVuY3Rpb24gVW5maW5hbGlzZSgpCiAgICBjYWxsIDxTSUQ+VW5maW5hbGlzZU1lbnUoKQogICAgbm9ybWFsIDFHCiAgICBjYWxsIHNlYXJjaCgiXiAtLSAiKQogICAgY2FsbCBzZXRsaW5lKCIuIiwgIiAtLSAiKQplbmRmdW5jdGlvbgoKZnVuY3Rpb24gPFNJRD5GaW5hbGlzZU1lbnUoKQogICAgIiBUaGlzIG1lYW5zIHRoZSBlbnRyeSBzaG91bGQgbm90IGJlIGNoYW5nZWQgYW55bW9yZQogICAgYW1lbnUgZW5hYmxlIENoYW5nZWxvZy5OZXdcIFZlcnNpb24KICAgIGFtZW51IGRpc2FibGUgQ2hhbmdlbG9nLkFkZFwgRW50cnkKICAgIGFtZW51IGRpc2FibGUgQ2hhbmdlbG9nLkNsb3NlXCBCdWcKICAgIGFtZW51IGRpc2FibGUgQ2hhbmdlbG9nLlNldFwgRGlzdHJpYnV0aW9uCiAgICBhbWVudSBkaXNhYmxlIENoYW5nZWxvZy5TZXRcIFVyZ2VuY3kKICAgIGFtZW51IGVuYWJsZSBDaGFuZ2Vsb2cuVW5maW5hbGlzZQogICAgYW1lbnUgZGlzYWJsZSBDaGFuZ2Vsb2cuRmluYWxpc2UKZW5kZnVuY3Rpb24KCmZ1bmN0aW9uIEZpbmFsaXNlKCkKICAgIGNhbGwgPFNJRD5GaW5hbGlzZU1lbnUoKQogICAgbm9ybWFsIDFHCiAgICBjYWxsIHNlYXJjaCgiXiAtLSAiKQogICAgY2FsbCBzZXRsaW5lKCIuIiwgIiAtLSAiIC4gPFNJRD5GdWxsTmFtZSgpIC4gIiA8IiAuIDxTSUQ+RW1haWwoKSAuICI+ICAiIC4gPFNJRD5EYXRlKCkpCmVuZGZ1bmN0aW9uCgoKZnVuY3Rpb24gPFNJRD5NYWtlTWVudSgpCiAgICBhbWVudSAmQ2hhbmdlbG9nLiZOZXdcIFZlcnNpb24JCQk6Y2FsbCBOZXdWZXJzaW9uKCk8Q1I+CiAgICBhbWVudSBDaGFuZ2Vsb2cuJkFkZFwgRW50cnkJCQkJOmNhbGwgQWRkRW50cnkoKTxDUj4KICAgIGFtZW51IENoYW5nZWxvZy4mQ2xvc2VcIEJ1ZwkJCQk6Y2FsbCBDbG9zZUJ1ZygpPENSPgogICAgbWVudSBDaGFuZ2Vsb2cuLXNlcC0JCQkJPG51bD4KCiAgICBhbWVudSBDaGFuZ2Vsb2cuU2V0XCAmRGlzdHJpYnV0aW9uLiZ1bnN0YWJsZQk6Y2FsbCBEaXN0cmlidXRpb24oInVuc3RhYmxlIik8Q1I+CiAgICBhbWVudSBDaGFuZ2Vsb2cuU2V0XCBEaXN0cmlidXRpb24uJmZyb3plbgkJOmNhbGwgRGlzdHJpYnV0aW9uKCJmcm96ZW4iKTxDUj4KICAgIGFtZW51IENoYW5nZWxvZy5TZXRcIERpc3RyaWJ1dGlvbi4mc3RhYmxlCQk6Y2FsbCBEaXN0cmlidXRpb24oInN0YWJsZSIpPENSPgogICAgbWVudSBDaGFuZ2Vsb2cuU2V0XCBEaXN0cmlidXRpb24uLXNlcC0JCTxudWw+CiAgICBhbWVudSBDaGFuZ2Vsb2cuU2V0XCBEaXN0cmlidXRpb24uZnJvemVuXCB1bnN0YWJsZQk6Y2FsbCBEaXN0cmlidXRpb24oImZyb3plbiB1bnN0YWJsZSIpPENSPgogICAgYW1lbnUgQ2hhbmdlbG9nLlNldFwgRGlzdHJpYnV0aW9uLnN0YWJsZVwgdW5zdGFibGUJOmNhbGwgRGlzdHJpYnV0aW9uKCJzdGFibGUgdW5zdGFibGUiKTxDUj4KICAgIGFtZW51IENoYW5nZWxvZy5TZXRcIERpc3RyaWJ1dGlvbi5zdGFibGVcIGZyb3plbgk6Y2FsbCBEaXN0cmlidXRpb24oInN0YWJsZSBmcm96ZW4iKTxDUj4KICAgIGFtZW51IENoYW5nZWxvZy5TZXRcIERpc3RyaWJ1dGlvbi5zdGFibGVcIGZyb3plblwgdW5zdGFibGUJOmNhbGwgRGlzdHJpYnV0aW9uKCJzdGFibGUgZnJvemVuIHVuc3RhYmxlIik8Q1I+CgogICAgYW1lbnUgQ2hhbmdlbG9nLlNldFwgJlVyZ2VuY3kuJmxvdwkJCTpjYWxsIFVyZ2VuY3koImxvdyIpPENSPgogICAgYW1lbnUgQ2hhbmdlbG9nLlNldFwgVXJnZW5jeS4mbWVkaXVtCQk6Y2FsbCBVcmdlbmN5KCJtZWRpdW0iKTxDUj4KICAgIGFtZW51IENoYW5nZWxvZy5TZXRcIFVyZ2VuY3kuJmhpZ2gJCQk6Y2FsbCBVcmdlbmN5KCJoaWdoIik8Q1I+CgogICAgbWVudSBDaGFuZ2Vsb2cuLXNlcC0JCQkJPG51bD4KICAgIGFtZW51IENoYW5nZWxvZy5VJm5maW5hbGlzZQkJCQk6Y2FsbCBVbmZpbmFsaXNlKCk8Q1I+CiAgICBhbWVudSBDaGFuZ2Vsb2cuJkZpbmFsaXNlCQkJCTpjYWxsIEZpbmFsaXNlKCk8Q1I+CgogICAgaWYgPFNJRD5GaW5hbGlzZWQoKQoJY2FsbCA8U0lEPkZpbmFsaXNlTWVudSgpCiAgICBlbHNlCgljYWxsIDxTSUQ+VW5maW5hbGlzZU1lbnUoKQogICAgZW5kaWYKZW5kZnVuY3Rpb24KCmF1Z3JvdXAgY2hhbmdlbG9nTWVudQphdSBCdWZFbnRlciAqIGlmICZmaWxldHlwZSA9PSAiZGViY2hhbmdlbG9nIiB8IGNhbGwgPFNJRD5NYWtlTWVudSgpIHwgZW5kaWYKYXUgQnVmTGVhdmUgKiBpZiAmZmlsZXR5cGUgPT0gImRlYmNoYW5nZWxvZyIgfCBhdW5tZW51IENoYW5nZWxvZyB8IGVuZGlmCmF1Z3JvdXAgRU5ECgoiIERlYmlhbiBjaGFuZ2Vsb2dzIGFyZSBub3Qgc3VwcG9zZWQgdG8gaGF2ZSBhbnkgb3RoZXIgdGV4dCB3aWR0aCwKIiBzbyB0aGUgdXNlciBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBzZXR0aW5nCnNldGxvY2FsIHR3PTc4CnNldGxvY2FsIGNvbW1lbnRzPWY6KiAKbGV0IGI6dW5kb19mdHBsdWdpbiA9ICJzZXRsb2NhbCB0dzwgY29tbWVudHM8Igo=