ZGlmZiAtLWdpdCBhL3BsYW5ldHN0YWNrL2NvcmUvc3RhdGljL3BhZ2VfYW5hbHl0aWNzLmpzIGIvcGxhbmV0c3RhY2svY29yZS9zdGF0aWMvcGFnZV9hbmFseXRpY3MuanMKaW5kZXggYmY3ZTM3ZC4uMzQ5MWVkYSAxMDA2NDQKLS0tIGEvcGxhbmV0c3RhY2svY29yZS9zdGF0aWMvcGFnZV9hbmFseXRpY3MuanMKKysrIGIvcGxhbmV0c3RhY2svY29yZS9zdGF0aWMvcGFnZV9hbmFseXRpY3MuanMKQEAgLTEsMTI5ICsxLDI1IEBACi1mdW5jdGlvbiBnZXRQYWdlS2luZCgpIHsKLSAgICB2YXIgcGFyZW50Tm9kZVR4dCA9ICQoJyNzZWxlY3RlZE1haW5OYXYnKS50ZXh0KCk7Ci0gICAgcGFyZW50Tm9kZVR4dCA9IHBhcmVudE5vZGVUeHQucmVwbGFjZSgiL1xuIiwiIik7Ci0gICAgcGFyZW50Tm9kZVR4dCA9IHBhcmVudE5vZGVUeHQucmVwbGFjZSgiuyIsIiIpOwotICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnRyaW0oKTsKLSAgICBpZiAocGFyZW50Tm9kZVR4dC5sZW5ndGggPiAwICYmIHBhcmVudE5vZGVUeHQuY2hhckF0KHBhcmVudE5vZGVUeHQubGVuZ3RoLTEpPT0ncycpIHsKLSAgICAgICAgICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnN1YnN0cmluZygwLCBwYXJlbnROb2RlVHh0Lmxlbmd0aC0xKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmVudE5vZGVUeHQ7Ci19Ci0KLWZ1bmN0aW9uIGdldE9iamVjdFF1ZXJ5KCkgewotICAgIHZhciBzZWxlY3RlZE5vZGVUeHQgPSAkKCcjY3VycmVudE9yaWdpbmFsTm9kZScpLnRleHQoKTsKLSAgICBzZWxlY3RlZE5vZGVUeHQgPSBzZWxlY3RlZE5vZGVUeHQudHJpbSgpOwotICAgIHNlbGVjdGVkTm9kZVR4dCA9IHNlbGVjdGVkTm9kZVR4dC5zcGxpdCgnICcpLmpvaW4oJycpOy8vc2VsZWN0ZWROb2RlVHh0LnJlcGxhY2UoIiAiLCAiIikKLSAgICBwYXJlbnROb2RlVHh0ID0gZ2V0UGFnZUtpbmQoKTsKLQotICAgIGlmIChwYXJlbnROb2RlVHh0ID09ICJTbGljZSIpIHsKLSAgICAgICAgcmV0dXJuICImc2xpY2U9IiArIHNlbGVjdGVkTm9kZVR4dDsKLSAgICB9IGVsc2UgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNpdGUiKSB7Ci0gICAgICAgIHJldHVybiAiJnNpdGU9IiArIHNlbGVjdGVkTm9kZVR4dDsKLSAgICB9IGVsc2UgaWYgKHBhcmVudE5vZGVUeHQgPT0gIk5vZGUiKSB7Ci0gICAgICAgIHJldHVybiAiJm5vZGU9IiArIHNlbGVjdGVkTm9kZVR4dDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotfQotCi0KLWZ1bmN0aW9uIHNldFBhZ2VTdGF0SW50KGxhYmVsTmFtZSwgdmFsdWVOYW1lLCBsZWdlbmQsIHVuaXRzLCB2YWx1ZSkgewotICAgICQobGFiZWxOYW1lKS50ZXh0KGxlZ2VuZCkuc2hvdygpOwotICAgICQodmFsdWVOYW1lKS50ZXh0KE1hdGgucm91bmQodmFsdWUpK3VuaXRzKS5zaG93KCk7Ci19Ci0KLWZ1bmN0aW9uIHNldFBhZ2VTdGF0RmxvYXQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlLCBkcCkgewotICAgICQobGFiZWxOYW1lKS50ZXh0KGxlZ2VuZCkuc2hvdygpOwotICAgICQodmFsdWVOYW1lKS50ZXh0KE51bWJlcih2YWx1ZSkudG9GaXhlZChkcCkrdW5pdHMpLnNob3coKTsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gbm9kZSBjb3VudCBhbmQgYXZlcmFnZSBjcHUgdXRpbGl6YXRpb24KIAotZnVuY3Rpb24gdXBkYXRlUGFnZUFuYWx5dGljc0RhdGEoc3VtbWFyeURhdGEpIHsKLSAgICB3aW5kb3cucGFnZUFuYWx5dGljc1VybCA9IHN1bW1hcnlEYXRhWyJkYXRhU291cmNlVXJsIl07Ci0gICAgbGFzdFJvdyA9IHN1bW1hcnlEYXRhLnJvd3MubGVuZ3RoLTE7Ci0KLSAgICBpZiAoc3VtbWFyeURhdGEubXNnKSB7Ci0gICAgICAgICQoIiNtaW5pZGFzaFN0YXR1cyIpLnRleHQoc3VtbWFyeURhdGEubXNnKS5zaG93KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgJCgiI21pbmlkYXNoU3RhdHVzIikudGV4dCgiIikuaGlkZSgpOwotICAgIH0KLQotICAgIGlmIChzdW1tYXJ5RGF0YS5yb3dzLmxlbmd0aCA8PSAwKSB7Ci0gICAgICAgIC8vY29uc29sZS5sb2coIm5vIGRhdGEgcmVjZWl2ZWQgZnJvbSBwYWdlIGFuYWx5dGljcyBhamF4IikKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vT2xkIG1pbmlkYXNoYm9hcmQKLSAgICAvL3NldFBhZ2VTdGF0SW50KCIubm9kZXNMYWJlbCIsICIubm9kZXNWYWx1ZSIsICJOb2RlIENvdW50IiwgIiIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bImNvdW50X2hvc3RuYW1lIl0pOwotICAgIC8vc2V0UGFnZVN0YXRJbnQoIi5jcHVMYWJlbCIsICIuY3B1VmFsdWUiLCAiQXZnIExvYWQiLCAiJSIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bImF2Z19jcHUiXSk7Ci0KLSAgICAvL05ldyBtaW5pRGFzaGJvYXJkCi0gICAgc2V0UGFnZVN0YXRJbnQoIiNtaW5pRGFzaE5vZGVDb3VudExhYmVsIiwgIiNtaW5pRGFzaE5vZGVDb3VudCIsICJOb2RlIENvdW50IiwgIiIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bImNvdW50X2hvc3RuYW1lIl0pOwotICAgIHNldFBhZ2VTdGF0SW50KCIjbWluaURhc2hBdmdMb2FkTGFiZWwiLCAiI21pbmlEYXNoQXZnTG9hZCIsICJBdmcgTG9hZCIsICIlIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsiYXZnX2NwdSJdKTsKLX0KLQotZnVuY3Rpb24gdXBkYXRlUGFnZUFuYWx5dGljcygpIHsKLSAgICB2YXIgdXJsPSAnL2FuYWx5dGljcy9iaWdxdWVyeS8/YXZnPSVjcHUmY291bnQ9JWhvc3RuYW1lJmNhY2hlZD1kZWZhdWx0JyArIGdldE9iamVjdFF1ZXJ5KCk7CitmdW5jdGlvbiB1cGRhdGVQYWdlQ1BVKCkgeworICAgIHZhciB1cmw9Ii9zdGF0cy8/bW9kZWxfbmFtZT0iICsgYWRtaW5fb2JqZWN0X25hbWUgKyAiJnBrPSIgKyBhZG1pbl9vYmplY3RfaWQgKyAiJm1ldGVyPWNwdSIgKyAiJmNvbnRyb2xsZXJfbmFtZT0iICsgYWRtaW5fb2JqZWN0X2NvbnRyb2xsZXI7CisgICAgY29uc29sZS5sb2coImZldGNoaW5nIHN0YXRzIHVybCAiICsgdXJsKTsKICAgICAkLmFqYXgoewogICAgIHVybDogdXJsLAogICAgIGRhdGFUeXBlIDogJ2pzb24nLAogICAgIHR5cGUgOiAnR0VUJywKICAgICBzdWNjZXNzOiBmdW5jdGlvbihuZXdEYXRhKSB7Ci0gICAgICAgIHVwZGF0ZVBhZ2VBbmFseXRpY3NEYXRhKG5ld0RhdGEpOworICAgICAgICBjb25zb2xlLmxvZyhuZXdEYXRhKTsKICAgICAgICAgc2V0VGltZW91dCh1cGRhdGVQYWdlQW5hbHl0aWNzLCAzMDAwMCk7CiAgICAgfSwKICAgICBlcnJvcjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIGNvbnNvbGUubG9nKCJlcnJvciByZXRyaWV2aW5nIHN0YXRpc3RpY3M7IHJldHJ5IGluIDUgc2Vjb25kcyIpOwotICAgICAgICBzZXRUaW1lb3V0KHVwZGF0ZVBhZ2VCYW5kd2lkdGgsIDUwMDApOwotICAgIH0KLX0pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBiYW5kd2lkdGgKLQotZnVuY3Rpb24gdXBkYXRlUGFnZUJhbmR3aWR0aERhdGEoc3VtbWFyeURhdGEpIHsKLSAgICB3aW5kb3cucGFnZUJhbmR3aWR0aFVybCA9IHN1bW1hcnlEYXRhWyJkYXRhU291cmNlVXJsIl07Ci0gICAgbGFzdFJvdyA9IHN1bW1hcnlEYXRhLnJvd3MubGVuZ3RoLTE7Ci0KLSAgICBpZiAoc3VtbWFyeURhdGEucm93cy5sZW5ndGggPD0gMCkgewotICAgICAgICAvL2NvbnNvbGUubG9nKCJubyBkYXRhIHJlY2VpdmVkIGZyb20gcGFnZSBiYW5kd2lkdGggYWpheCIpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvL09sZCBtaW5pZGFzaGJvYXJkCi0gICAgLy9zZXRQYWdlU3RhdEZsb2F0KCIuYmFuZHdpZHRoTGFiZWwiLCAiLmJhbmR3aWR0aFZhbHVlIiwgIkJhbmR3aWR0aCIsICIgR2JwcyIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bInN1bV9jb21wdXRlZF9ieXRlc19zZW50X2Rpdl9lbGFwc2VkIl0qOC4wLzEwMjQvMTAyNC8xMDI0LDIpOwotCi0gICAgLy9OZXcgbWluaWRhc2hib2FyZAotICAgIHNldFBhZ2VTdGF0RmxvYXQoIiNtaW5pRGFzaEJhbmR3aWR0aExhYmVsIiwgIiNtaW5pRGFzaEJhbmR3aWR0aCIsICJCYW5kd2lkdGgiLCAiIEdicHMiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJzdW1fY29tcHV0ZWRfYnl0ZXNfc2VudF9kaXZfZWxhcHNlZCJdKjguMC8xMDI0LzEwMjQvMTAyNCwyKTsKLX0KLQotZnVuY3Rpb24gdXBkYXRlUGFnZUJhbmR3aWR0aCgpIHsKLSAgICB2YXIgdXJsPScvYW5hbHl0aWNzL2JpZ3F1ZXJ5Lz9jb21wdXRlZD0lYnl0ZXNfc2VudC8lZWxhcHNlZCZjYWNoZWQ9ZGVmYXVsdCcgKyBnZXRPYmplY3RRdWVyeSgpOwotCi0gICAgaWYgKGdldFBhZ2VLaW5kKCkhPSJTbGljZSIpIHsKLSAgICAgICAgdXJsID0gdXJsICsgIiZldmVudD1ub2RlX2hlYXJ0YmVhdCI7Ci0gICAgfQotCi0gICAgJC5hamF4KHsKLSAgICB1cmwgOiB1cmwsCi0gICAgZGF0YVR5cGUgOiAnanNvbicsCi0gICAgdHlwZSA6ICdHRVQnLAotICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG5ld0RhdGEpIHsKLSAgICAgICAgdXBkYXRlUGFnZUJhbmR3aWR0aERhdGEobmV3RGF0YSk7Ci0gICAgICAgIHNldFRpbWVvdXQodXBkYXRlUGFnZUJhbmR3aWR0aCwgMzAwMDApOwotICAgIH0sCi0gICAgZXJyb3I6IGZ1bmN0aW9uKCkgewotICAgICAgICBjb25zb2xlLmxvZygiZXJyb3IgcmV0cmlldmluZyBzdGF0aXN0aWNzOyByZXRyeSBpbiA1IHNlY29uZHMiKQotICAgICAgICBzZXRUaW1lb3V0KHVwZGF0ZVBhZ2VCYW5kd2lkdGgsIDUwMDApOwogICAgIH0KIH0pOwogfQogCiAkKCBkb2N1bWVudCApLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgIHVwZGF0ZVBhZ2VBbmFseXRpY3MoKTsKLSAgICB1cGRhdGVQYWdlQmFuZHdpZHRoKCk7Ci19KTsNCisgICAgaWYgKGFkbWluX29iamVjdF9uYW1lID09ICJTbGl2ZXIiICYmIGFkbWluX29iamVjdF9pZCAhPSB1bmRlZmluZWQpIHsKKyAgICAgICAgdXBkYXRlUGFnZUNQVSgpOworICAgIH0KK30pOwogCg==