Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥替换规则|设置@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmLkZpbGXlt6XlhbdcIixcInBhdGhcIjpcIkZpbGUuanNcIixcInJ1bGVcIjpcImNvbnN0IEZpbGUgPSBqYXZhLmlvLkZpbGU7XFxuY29uc3Qge1xcbiAgICBGaWxlcyxcXG4gICAgUGF0aHMsXFxuICAgIFN0YW5kYXJkQ29weU9wdGlvbixcXG4gICAgU3RhbmRhcmRPcGVuT3B0aW9uXFxufSA9IGphdmEubmlvLmZpbGU7XFxuY29uc3QgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmc7XFxubGV0IGphdmFTY29wZSA9IG5ldyBKYXZhSW1wb3J0ZXIoamF2YS5pbywgamF2YS5sYW5nLCBqYXZhLmxhbmcucmVmbGVjdCwgamF2YS51dGlsLlZlY3Rvcik7XFxuXFxuZnVuY3Rpb24gZGVsZXRlRmxpZXMoZmlsZU5hbWUpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7XFxuICAgIGlmICghZmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpOaWh+S7tuWksei0pe+8mlxcXCIgKyBmaWxlTmFtZSArIFxcXCLmlofku7bkuI3lrZjlnKhcXFwiKTtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGUoZmlsZU5hbWUpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlRGlyZWN0b3J5KGZpbGVOYW1lKTtcXG4gICAgICAgIH1cXG5cXG4gICAgfVxcblxcbn1cXG4vKipcXG4gKiDliKDpmaTljZXkuKrmlofku7ZcXG4gKiBcXG4gKiBAcGFyYW0gZmlsZU5hbWVcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOaWh+S7tueahOaWh+S7tuWQjVxcbiAqIEByZXR1cm4g5Y2V5Liq5paH5Lu25Yig6Zmk5oiQ5Yqf6L+U5ZuedHJ1ZSzlkKbliJnov5Tlm55mYWxzZVxcbiAqL1xcbmZ1bmN0aW9uIGRlbGV0ZUZpbGUoZmlsZU5hbWUpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7XFxuICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgIGZpbGUuZGVsZXRlKCk7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcIiArIGZpbGVOYW1lICsgXFxcIuaIkOWKn++8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcIiArIGZpbGVOYW1lICsgXFxcIuWksei0pe+8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxuXFxufVxcbi8qKlxcbiAqIOWIoOmZpOebruW9le+8iOaWh+S7tuWkue+8ieS7peWPiuebruW9leS4i+eahOaWh+S7tlxcbiAqIFxcbiAqIEBwYXJhbSBkaXJcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOebruW9leeahOaWh+S7tui3r+W+hFxcbiAqIEByZXR1cm4g55uu5b2V5Yig6Zmk5oiQ5Yqf6L+U5ZuedHJ1ZSzlkKbliJnov5Tlm55mYWxzZVxcbiAqL1xcbmZ1bmN0aW9uIGRlbGV0ZURpcmVjdG9yeShkaXIpIHtcXG4gICAgLy8g5aaC5p6cZGly5LiN5Lul5paH5Lu25YiG6ZqU56ym57uT5bC+77yM6Ieq5Yqo5re75Yqg5paH5Lu25YiG6ZqU56ymXFxuICAgIGlmICghZGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkge1xcbiAgICAgICAgZGlyID0gZGlyICsgRmlsZS5zZXBhcmF0b3I7XFxuICAgIH1cXG4gICAgbGV0IGRpckZpbGUgPSBuZXcgRmlsZShkaXIpO1xcbiAgICAvLyDlpoLmnpxkaXLlr7nlupTnmoTmlofku7bkuI3lrZjlnKjvvIzmiJbogIXkuI3mmK/kuIDkuKrnm67lvZXvvIzliJnpgIDlh7pcXG4gICAgaWYgKCFkaXJGaWxlLmV4aXN0cygpIHx8ICFkaXJGaWxlLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgIC8vbG9nKFxcXCLliKDpmaTnm67lvZXlpLHotKVcXFwiICsgZGlyICsgXFxcIuebruW9leS4jeWtmOWcqO+8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxuICAgIGxldCBmbGFnID0gdHJ1ZTtcXG4gICAgLy8g5Yig6Zmk5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2KOWMheaLrOWtkOebruW9lSlcXG4gICAgbGV0IGZpbGVzID0gZGlyRmlsZS5saXN0RmlsZXMoKTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgLy8g5Yig6Zmk5a2Q5paH5Lu2XFxuICAgICAgICBpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHtcXG4gICAgICAgICAgICBmbGFnID0gZGVsZXRlRmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7XFxuICAgICAgICAgICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7IC8vIOWIoOmZpOWtkOebruW9lVxcbiAgICAgICAgICAgIGZsYWcgPSBkZWxldGVEaXJlY3RvcnkoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpO1xcbiAgICAgICAgICAgIGlmICghZmxhZykge1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk55uu5b2V5aSx6LSlXFxcIik7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG4gICAgLy8g5Yig6Zmk5b2T5YmN55uu5b2VXFxuICAgIGlmIChkaXJGaWxlLmRlbGV0ZSgpKSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk55uu5b2VXFxcIiArIGRpciArIFxcXCLmiJDlip/vvIFcXFwiKTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpOebruW9lVxcXCIgKyBkaXIgKyBcXFwi5aSx6LSl77yBXFxcIik7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0RmlsZVRpbWUocGF0aCkge1xcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKHBhdGgpO1xcbiAgICBsZXQgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTtcXG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShsYXN0TW9kaWZpZWQpO1xcbiAgICByZXR1cm4gZGF0ZS5nZXRUaW1lKCk7XFxufVxcblxcbmZ1bmN0aW9uIGdldE5hbWUocGF0aCkge1xcbiAgICByZXR1cm4gbmV3IEZpbGUocGF0aCkuZ2V0TmFtZSgpICsgXFxcIlxcXCI7XFxufVxcblxcbmZ1bmN0aW9uIGdldEZpbGVQYXRoKHBhdGgsIHR5cGUsIGV4cGFuZCkge1xcbiAgICB0eXBlID0gdHlwZSB8fCBcXFwiZmlsZVxcXCI7XFxuICAgIGlmICghW1xcXCJmaWxlXFxcIiwgXFxcImRpclxcXCJdLmluY2x1ZGVzKHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXFxcIuexu+Wei+mUmeivr1xcXCIpO1xcbiAgICBsZXQgZmlsZVR5cGUgPSB0eXBlID09PSBcXFwiZmlsZVxcXCIgPyBcXFwiaXNGaWxlXFxcIiA6IFxcXCJpc0RpcmVjdG9yeVxcXCI7XFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUocGF0aCk7XFxuICAgIGxldCBhcnJheSA9IGZpbGUubGlzdEZpbGVzKCkgfHwgW107XFxuICAgIGxldCBwYXRoTGlzdCA9IFtdO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBpZiAoYXJyYXlbaV1bZmlsZVR5cGVdKCkpIHtcXG4gICAgICAgICAgICBwYXRoTGlzdC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgbmFtZTogYXJyYXlbaV0uZ2V0TmFtZSgpICsgXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgIHBhdGg6IGFycmF5W2ldLmdldFBhdGgoKSArIFxcXCJcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGV4cGFuZCkge1xcbiAgICAgICAgcGF0aExpc3QgPSBwYXRoTGlzdC5maWx0ZXIoaXQgPT4gaXQubmFtZS5lbmRzV2l0aChleHBhbmQpKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcGF0aExpc3Q7XFxufVxcblxcbmZ1bmN0aW9uIHJlbmFtZUZpbGUoZnJvbVBhdGgsIG5hbWUpIHtcXG4gICAgbGV0IGZyb21GaWxlID0gbmV3IEZpbGUoZnJvbVBhdGgpO1xcbiAgICBsZXQgdG9GaWxlID0gbmV3IEZpbGUoZnJvbUZpbGUuZ2V0UGFyZW50KCkgKyBcXFwiL1xcXCIgKyBuYW1lKTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICghZnJvbUZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodG9GaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgaWYgKCFkZWxldGVGbGllcyh0b1BhdGgpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBGaWxlcy5tb3ZlKGZyb21GaWxlLnRvUGF0aCgpLCB0b0ZpbGUudG9QYXRoKCksIFN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HKTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBtb3ZlRmlsZXMoZnJvbVBhdGgsIHRvUGF0aCkge1xcbiAgICBsZXQgZnJvbUZpbGUgPSBuZXcgRmlsZShmcm9tUGF0aCk7XFxuICAgIGxldCB0b0ZpbGUgPSBuZXcgRmlsZSh0b1BhdGgpO1xcbiAgICB0cnkge1xcbiAgICAgICAgaWYgKCFmcm9tRmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0b0ZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgICAgICBpZiAoIWRlbGV0ZUZsaWVzKHRvUGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIEZpbGVzLm1vdmUoZnJvbUZpbGUudG9QYXRoKCksIHRvRmlsZS50b1BhdGgoKSwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGZpbGVXcml0ZShwYXRoLCBjb250ZW50KSB7XFxuICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoLCBjb250ZW50KVxcbn1cXG5cXG5mdW5jdGlvbiBmaWxlV3JpdGVBcHBlbmQocGF0aCwgY29udGVudCkge1xcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKHBhdGgpO1xcbiAgICBsZXQgcGF0aHMgPSBmaWxlLnRvUGF0aCgpO1xcbiAgICBpZiAoZmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgRmlsZXMud3JpdGUocGF0aHMsIG5ldyBqYXZhU3RyaW5nKGNvbnRlbnQpLmdldEJ5dGVzKCksIFN0YW5kYXJkT3Blbk9wdGlvbi5BUFBFTkQpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGgsIGNvbnRlbnQpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldFRvdGFsU2l6ZU9mRmlsZXNJbkRpcihmaWxlKSB7XFxuICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XFxuICAgICAgICByZXR1cm4gZmlsZS5sZW5ndGgoKTtcXG4gICAgfVxcbiAgICBsZXQgY2hpbGRyZW4gPSBmaWxlLmxpc3RGaWxlcygpO1xcbiAgICBsZXQgdG90YWwgPSAwO1xcbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcXG4gICAgICAgICAgICB0b3RhbCArPSBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIoY2hpbGQpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiB0b3RhbDtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0RmlsZVNpemUoZmlsZVBhdGgpIHtcXG4gICAgLy9CeXRlXFxuICAgIGxldCBzaXplID0gZ2V0VG90YWxTaXplT2ZGaWxlc0luRGlyKG5ldyBGaWxlKGZpbGVQYXRoKSk7XFxuICAgIGlmIChzaXplIDwgMCkge1xcbiAgICAgICAgcmV0dXJuIG51bGw7XFxuICAgIH1cXG4gICAgbGV0IHVuaXRGb3JtID0gW1xcXCJCeXRlXFxcIiwgXFxcIktCXFxcIiwgXFxcIk1CXFxcIiwgXFxcIkdCXFxcIiwgXFxcIlRCXFxcIl07XFxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB1bml0Rm9ybS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcbiAgICAgICAgaWYgKHNpemUgPiAxMDI0KSB7XFxuICAgICAgICAgICAgc2l6ZSAvPSAxMDI0O1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHNpemUpICsgdW5pdEZvcm1baV07XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCJFUlJPUjrmlbDlgLzov4flpKdcXFwiO1xcbn1cXG4vL+WujOaVtOWQiOW5tlxcbi8qXFxuZnVuY3Rpb24gZmlsZUNvbWJpbmUoZmlsZXNJbnB1dCwgZmlsZU91dCwgZXh0ZW5zaW9uLCBpbnRlcmNlcHQpIHtcXG4gICAgd2l0aChqYXZhU2NvcGUpIHtcXG4gICAgICAgIGNvbnN0IFRNUF9CVUZGRVJfU0laRSA9IDB4MzAwMDA7XFxuICAgICAgICBjb25zdCBCVUZGRVJfU0laRSA9IDB4MzAwMDAwO1xcbiAgICAgICAgLy/lkIjlubbkuLTml7bmlofku7ZcXG4gICAgICAgIGxldCBpbnB1dEZpbGUgPSBuZXcgRmlsZShmaWxlc0lucHV0KTtcXG4gICAgICAgIGxldCB0bXBGaWxlID0gbmV3IEZpbGUoZmlsZU91dCArIFxcXCIudG1wXFxcIik7XFxuICAgICAgICBsZXQgdG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpKTtcXG4gICAgICAgIGxldCBpbnB1dEZpbGVzID0gaW5wdXRGaWxlLmxpc3RGaWxlcygpO1xcbiAgICAgICAgbGV0IHRieXMgPSBBcnJheS5uZXdJbnN0YW5jZShCeXRlLlRZUEUsIFRNUF9CVUZGRVJfU0laRSk7XFxuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGlucHV0RmlsZXMpIHtcXG4gICAgICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpO1xcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gMDtcXG4gICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBpcy5yZWFkKHRieXMpKSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgdG9zLndyaXRlKHRieXMsIDAsIGxlbik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICB0b3MuY2xvc2UoKTtcXG4gICAgICAgIC8v6KeE5YiZ5pu/5o2i6KeE5YiZO1xcbiAgICAgICAgbGV0IG91dEZpbGUgPSBuZXcgRmlsZShmaWxlT3V0KTtcXG4gICAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0ID09PSBcXFwiZnVuY3Rpb25cXFwiKSB7XFxuICAgICAgICAgICAgbGV0IHRpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRmlsZSk7XFxuICAgICAgICAgICAgbGV0IG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTtcXG4gICAgICAgICAgICBsZXQgbGVuID0gMDtcXG4gICAgICAgICAgICBsZXQgYnlzID0gQXJyYXkubmV3SW5zdGFuY2UoQnl0ZS5UWVBFLCBCVUZGRVJfU0laRSk7XFxuICAgICAgICAgICAgd2hpbGUgKChsZW4gPSB0aXMucmVhZChieXMpKSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICBsZXQgbmJ5cyA9IGludGVyY2VwdChuZXcgU3RyaW5nKGJ5cywwLGxlbikpO1xcbiAgICAgICAgICAgICAgICBvcy53cml0ZShuYnlzLCAwLCBuYnlzLmxlbmd0aCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7XFxuICAgICAgICAgICAgdGlzLmNsb3NlKCk7XFxuICAgICAgICAgICAgb3MuY2xvc2UoKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaWYgKG91dEZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgICAgICAgICAgb3V0RmlsZS5kZWxldGUoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdG1wRmlsZS5yZW5hbWVUbyhvdXRGaWxlKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn0qL1xcbi8v5q6LXFxuZnVuY3Rpb24gZmlsZVJ1bGUoZmlsZXNJbnB1dCwgZmlsZU91dCwgaW50ZXJjZXB0KSB7XFxuICAgIHdpdGgoamF2YVNjb3BlKSB7XFxuICAgICAgICBjb25zdCBCVUZGRVJfU0laRSA9IDB4MzAwMDAwO1xcbiAgICAgICAgbGV0IHRtcEZpbGUgPSBuZXcgRmlsZShmaWxlc0lucHV0KTtcXG4gICAgICAgIGlmKCEodG1wRmlsZS5leGlzdHMoKSYmdG1wRmlsZS5pc0ZpbGUoKSkpe1xcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBvdXRGaWxlID0gbmV3IEZpbGUoZmlsZU91dCk7XFxuXFxuICAgICAgICBsZXQgdGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBGaWxlKTtcXG4gICAgICAgIGxldCBvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKSk7XFxuICAgICAgICBsZXQgbGVuID0gMDtcXG4gICAgICAgIGxldCBieXMgPSBBcnJheS5uZXdJbnN0YW5jZShCeXRlLlRZUEUsIEJVRkZFUl9TSVpFKTtcXG4gICAgICAgIHdoaWxlICgobGVuID0gdGlzLnJlYWQoYnlzKSkgIT0gLTEpIHtcXG4gICAgICAgICAgICBsZXQgbmJ5cyA9IGludGVyY2VwdChuZXcgU3RyaW5nKGJ5cywwLGxlbikpO1xcbiAgICAgICAgICAgIG9zLndyaXRlKG5ieXMsIDAsIG5ieXMubGVuZ3RoKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7XFxuICAgICAgICB0aXMuY2xvc2UoKTtcXG4gICAgICAgIG9zLmNsb3NlKCk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfVxcbn1cXG5cXG4kLmV4cG9ydHMgPSB7XFxuICAgIGdldEZpbGVUaW1lOiAocGF0aCkgPT4gZ2V0RmlsZVRpbWUocGF0aCksXFxuICAgIGdldEZpbGVQYXRoOiAocGF0aCwgdHlwZSwgZXhwYW5kKSA9PiBnZXRGaWxlUGF0aChwYXRoLCB0eXBlLCBleHBhbmQpLFxcbiAgICBkZWxldGVGbGllczogKHBhdGgpID0+IGRlbGV0ZUZsaWVzKHBhdGgpLFxcbiAgICByZW5hbWVGaWxlOiAocGF0aCwgbmFtZSkgPT4gcmVuYW1lRmlsZShwYXRoLCBuYW1lKSxcXG4gICAgbW92ZUZpbGVzOiAoZnJvbVBhdGgsIHRvUGF0aCkgPT4gbW92ZUZpbGVzKGZyb21QYXRoLCB0b1BhdGgpLFxcbiAgICBmaWxlV3JpdGU6IChwYXRoLCBjb250ZW50KSA9PiBmaWxlV3JpdGUocGF0aCwgY29udGVudCksXFxuICAgIGZpbGVXcml0ZUFwcGVuZDogKHBhdGgsIGNvbnRlbnQpID0+IGZpbGVXcml0ZUFwcGVuZChwYXRoLCBjb250ZW50KSxcXG4gICAgZ2V0TmFtZTogKHBhdGgpID0+IGdldE5hbWUocGF0aCksXFxuICAgIGdldEZpbGVTaXplOiAoZmlsZVBhdGgpID0+IGdldEZpbGVTaXplKGZpbGVQYXRoKSxcXG4gICAgZmlsZVJ1bGU6IChmaWxlc0lucHV0LCBmaWxlT3V0LCBpbnRlcmNlcHQpID0+IGZpbGVSdWxlKGZpbGVzSW5wdXQsIGZpbGVPdXQsIGludGVyY2VwdClcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJ0ZXh0XzJcIixcIm5hbWVcIjpcIiN2LuS4i+i9veWIl+ihqC3mma7pgJrkuIvovb1cIixcInBhdGhcIjpcImRvd25sb2FkLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHZpZXdDb25maWcgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgY2hhcHRlckxpc3Q6IFtdLFxcbiAgICBpbmZvOiB7fSxcXG4gICAgZGVmYXVsdFZpZXc6IFxcXCIwXFxcIlxcbn0sIE1ZX1BBUkFNUyk7XFxudmlld0NvbmZpZy5pbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgIHJ1bGVOYW1lOiBcXFwiXFxcIixcXG4gICAgYm9va05hbWU6IFxcXCJcXFwiLFxcbiAgICBib29rVG9wUGljOiBcXFwiXFxcIixcXG4gICAgcGFyc2VDb2RlOiBcXFwiXFxcIixcXG4gICAgdHlwZTogXFxcImNvbWljXFxcIixcXG59LCB2aWV3Q29uZmlnLmluZm8pO1xcbmxldCB7XFxuICAgIGNoYXB0ZXJMaXN0LFxcbiAgICBpbmZvLFxcbiAgICBkZWZhdWx0Vmlld1xcbn0gPSB2aWV3Q29uZmlnO1xcbnNldFBhZ2VUaXRsZShcXFwi6YCJ5oup5ZmofFxcXCIgKyBpbmZvLmJvb2tOYW1lKVxcblxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcblxcbmNvbnN0IGRlZl9Eb1ZpX1N0eWxlID0gQ29uZmlnLmRlZl9Eb1ZpX1N0eWxlO1xcbmNvbnN0IE1ZX0lEID0gaW5mby5ydWxlTmFtZSArIFxcXCIvL1xcXCIgKyBpbmZvLmJvb2tOYW1lO1xcblxcblxcbmxldCBpc1N0YXJ0ID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKTtcXG5sZXQgdmlld01vZGUgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6dmlld01vZGVcXFwiLCBkZWZhdWx0Vmlldyk7XFxubGV0IGlzUmV2ZXJzZSA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjppc1JldmVyc2VcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCB0YWdGaWx0ZXIgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6dGFnRmlsdGVyXFxcIiwgQ29uZmlnLmRlZl9Eb1ZpX1R5cGUpO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoTVlfSUQpID0+IHtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6dmlld01vZGVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6Y29tcGxldGVkXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIpO1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjp0YWdGaWx0ZXJcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6cGFnZU51bVxcXCIpO1xcbn0sIE1ZX0lEKSk7XFxuXFxubGV0IGxheW91dCA9IFtdO1xcblxcbmlmIChpc1N0YXJ0ID09PSBcXFwiMVxcXCIpIHtcXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnZpZXdNb2RlXFxcIiwgZGVmYXVsdFZpZXcpO1xcbiAgICB2aWV3TW9kZSA9IFxcXCIxXFxcIjtcXG59XFxuXFxubGV0IGJhY2t1cENoYXB0ZXJMaXN0ID0gY2hhcHRlckxpc3Q7XFxuaWYgKHR5cGVvZiBjaGFwdGVyTGlzdCA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgY2hhcHRlckxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgY2hhcHRlckxpc3QpIHx8IFxcXCJbXVxcXCIpO1xcbn1cXG5sZXQgY2hhcHRlckFsbCA9IGNoYXB0ZXJMaXN0O1xcbmNoYXB0ZXJMaXN0ID0gY2hhcHRlckxpc3QubWFwKChpdGVtLCBDSUQpID0+IHtcXG4gICAgaXRlbS5DSUQgPSBDSUQ7XFxuICAgIHJldHVybiBpdGVtO1xcbn0pO1xcbmxldCBwYWdlTnVtID0gTnVtYmVyKGdldE15VmFyKE1ZX0lEICsgXFxcIjpwYWdlTnVtXFxcIiwgXFxcIjFcXFwiKSk7XFxubGV0IGNoYXB0ZXJDaHVuayA9IFtjaGFwdGVyTGlzdF0uY29uY2F0KFRvb2wuY2h1bmsoY2hhcHRlckxpc3QsIENvbmZpZy52aWV3UGFnZVNpemUpKTtcXG5jaGFwdGVyTGlzdCA9IGNoYXB0ZXJDaHVua1twYWdlTnVtXSB8fCBbXTtcXG5cXG5mdW5jdGlvbiBzZXRUeXBlKCkge1xcbiAgICBsZXQgc2V0ID0gKHRhZywgcHV0KSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihwdXQsIHRhZyk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH07XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAwID09IHBhZ2VOdW0gPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIChcXFwi5YWo6YOoKFxcXCIgKyBjaGFwdGVyQWxsLmxlbmd0aCArIFxcXCIpXFxcIikuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiBcXFwi5YWo6YOoKFxcXCIgKyBjaGFwdGVyQWxsLmxlbmd0aCArIFxcXCIpXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIDAsIE1ZX0lEICsgXFxcIjpwYWdlTnVtXFxcIiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoYXB0ZXJDaHVuay5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IHRhZ1RleHQgPSAoaSAtIDEpICogQ29uZmlnLnZpZXdQYWdlU2l6ZSArIFxcXCItXFxcIiArICgoaSAtIDEpICogQ29uZmlnLnZpZXdQYWdlU2l6ZSArIGNoYXB0ZXJDaHVua1tpXS5sZW5ndGgpO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpID09IHBhZ2VOdW0gPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHRhZ1RleHQuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiB0YWdUZXh0LFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIGksIE1ZX0lEICsgXFxcIjpwYWdlTnVtXFxcIiksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0YWdGaWx0ZXIgPT09IFxcXCIwXFxcIiA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuWFqOmDqFxcXCIuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiBcXFwi5YWo6YOoXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIFxcXCIwXFxcIiwgTVlfSUQgKyBcXFwiOnRhZ0ZpbHRlclxcXCIpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHRhZ0ZpbHRlciA9PT0gXFxcIjFcXFwiID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5pyq5LiL6L29XFxcIi5mb250Y29sb3IoXFxcIiMyM0FENkZcXFwiKSA6IFxcXCLmnKrkuIvovb1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldCwgXFxcIjFcXFwiLCBNWV9JRCArIFxcXCI6dGFnRmlsdGVyXFxcIiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFwiMlxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLlt7LkuIvovb1cXFwiLmZvbnRjb2xvcihcXFwiIzIzQUQ2RlxcXCIpIDogXFxcIuW3suS4i+i9vVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoc2V0LCBcXFwiMlxcXCIsIE1ZX0lEICsgXFxcIjp0YWdGaWx0ZXJcXFwiKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgfSk7XFxufVxcbmxldCBjaGFwdGVyVGVhbSA9IFtdO1xcbmxldCByZWNvcmQgPSBbXTtcXG5pZiAoaW5mby50eXBlID09PSBcXFwiY29taWNcXFwiKSB7XFxuICAgIGxldCBsYXp5ID0gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgbGV0IGZpbGVsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChpbnB1dCk7XFxuICAgICAgICBsZXQgcGljbGlzdCA9IGZpbGVsaXN0Lm1hcCgoaXRlbSwgaSkgPT4gXFxcImZpbGU6Ly9cXFwiICsgaW5wdXQgKyBcXFwiL1xcXCIgKyAoaSArIDEpICsgXFxcIi5qcGdcXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwicGljczovL1xcXCIgKyBwaWNsaXN0LmpvaW4oXFxcIiYmXFxcIik7XFxuICAgIH0pO1xcblxcbiAgICBmdW5jdGlvbiBjb21GdW4oaSwgaXRlbSkge1xcbiAgICAgICAgbGV0IHJvb3RQYXRoID0gQ29uZmlnLmNvbWljUGF0aCArIFxcXCIvXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFwiL1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIi9cXFwiICsgaSArIFxcXCIkQSRcXFwiICsgaXRlbS50aXRsZTtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogcm9vdFBhdGggKyBsYXp5LFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGksXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1tpbmZvLnR5cGUgKyBcXFwiUGF0aFxcXCJdICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIGluZm8uYm9va05hbWUsIFxcXCJkaXJcXFwiKS5mb3JFYWNoKChmaWxlKSA9PiB7XFxuICAgICAgICBsZXQgYXR0ID0gVG9vbC5zcGxpdChmaWxlLm5hbWUsIFxcXCIkXFxcIiwgMik7XFxuICAgICAgICBpZiAoYXR0Lmxlbmd0aCA9PT0gMyAmJiBhdHRbMV0gPT09IChcXFwiQVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVjb3JkLnB1c2goYXR0WzJdKTtcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgZnVuY3Rpb24gY29tRnVuKGksIGl0ZW0pIHtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbE1haW5Cb2R5I2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpLFxcbiAgICAgICAgICAgICAgICBwYXRoOiBDb25maWcubm92ZWxQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiL1xcXCIgKyBpICsgXFxcIiRBJFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIi50eHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgRmlsZS5nZXRGaWxlUGF0aChDb25maWdbaW5mby50eXBlICsgXFxcIlBhdGhcXFwiXSArIFxcXCIvXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFwiL1xcXCIgKyBpbmZvLmJvb2tOYW1lLCBcXFwiZmlsZVxcXCIsIFxcXCIudHh0XFxcIikuZm9yRWFjaCgoZmlsZSkgPT4ge1xcbiAgICAgICAgbGV0IGF0dCA9IFRvb2wuc3BsaXQoZmlsZS5uYW1lLCBcXFwiJFxcXCIsIDIpO1xcbiAgICAgICAgaWYgKGF0dC5sZW5ndGggPT09IDMgJiYgYXR0WzFdID09PSAoXFxcIkFcXFwiKSkge1xcbiAgICAgICAgICAgIHJlY29yZC5wdXNoKGF0dFsyXS5zbGljZSgwLCBhdHRbMl0ubGFzdEluZGV4T2YoXFxcIi5cXFwiKSkpO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gY2xpY2tEb3dubG9hZChpdGVtLCBpbmZvLCBNWV9JRCwgaSkge1xcbiAgICBsZXQgbG9hZGluZ1RlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpsb2FkaW5nVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICBsZXQgRWxlbWVudEluZGV4ID0gbG9hZGluZ1RlYW0uaW5kZXhPZihpKTtcXG4gICAgaWYgKEVsZW1lbnRJbmRleCA+IC0xKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29XFxcIjtcXG5cXG4gICAgbG9hZGluZ1RlYW0ucHVzaChpKTtcXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkobG9hZGluZ1RlYW0pKTtcXG4gICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAmOKAmFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGlcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxldCByZXN1bHQgPSBcXFwidG9hc3Q6Ly/kuIvovb3lpLHotKVcXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgdG9hc3QoXFxcIuW8gOWni+S4i+i9vTpcXFwiICsgaXRlbS50aXRsZSk7XFxuICAgICAgICBsZXQgZG93bmxvYWQgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Eb3dubG9hZC5leGUuanNcXFwiKTtcXG4gICAgICAgIHJlc3VsdCA9IGRvd25sb2FkKGl0ZW0sIGluZm8sIE1ZX0lELCBpKTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwi4oCd4oCdXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJ0b2FzdDovL+W3suS4i+i9vVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgfSBmaW5hbGx5IHtcXG4gICAgICAgIGxvYWRpbmdUZWFtLnNwbGljZShFbGVtZW50SW5kZXgsIDEpO1xcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkobG9hZGluZ1RlYW0pKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiBzaW5nbGVWaWV3KCkge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWPjei9rOWIl+ihqFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlzUmV2ZXJzZSwgTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6aXNSZXZlcnNlXFxcIiwgaXNSZXZlcnNlID09PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaXNSZXZlcnNlLCBNWV9JRCksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/aWQ9MzNudkRxYkhIN0hXJnNpemU9NDgmZm9ybWF0PWdpZiZ0b2tlbj1cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzJcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaJuemHj+S4i+i9vVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGxvYWRpbmdUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICBpZiAobG9hZGluZ1RlYW0ubGVuZ3RoID4gMCkgcmV0dXJuIFxcXCJ0b2FzdDovL+i/mOacieS7u+WKoeayoeacieWujOaIkFxcXCI7XFxuICAgICAgICAgICAgaWYgKGdldEFwcFZlcnNpb24oKSA8IDI1OTQpIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrlvIDmlL5cXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjp2aWV3TW9kZVxcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuXFxuICAgICAgICB9LCBNWV9JRCksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD0wdWFmYU1OenhqODgmdG9rZW49XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl8yXFxcIlxcbiAgICB9KTtcXG4gICAgc2V0VHlwZSgpO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBsZXQgbG9hZGluZ1RlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpsb2FkaW5nVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICBmb3IgKGxldCBpID0gMCwgaXRlbSA9IGNoYXB0ZXJMaXN0WzBdOyBpIDwgY2hhcHRlckxpc3QubGVuZ3RoOyBpdGVtID0gY2hhcHRlckxpc3RbKytpXSkge1xcbiAgICAgICAgbGV0IGlzX2Rvd25sb2FkID0gcmVjb3JkLmluY2x1ZGVzKGl0ZW0udGl0bGUpO1xcbiAgICAgICAgaWYgKGlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaChjb21GdW4oaXRlbS5DSUQsIGl0ZW0pKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoIWlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcIjJcXFwiKSB7XFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBsb2FkaW5nVGVhbS5pbmNsdWRlcyhpdGVtLkNJRCkgPyBcXFwi4oCY4oCYXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwi4oCZ4oCZXFxcIiA6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShjbGlja0Rvd25sb2FkLCBpdGVtLCBpbmZvLCBNWV9JRCwgaXRlbS5DSUQpLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaXRlbS5DSURcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gY2xpY2tDaG9vc2UodGl0bGUsIE1ZX0lELCBpKSB7XFxuICAgIGxldCBpc1N0YXJ0ID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKTtcXG4gICAgaWYgKGlzU3RhcnQgPT09IFxcXCIxXFxcIikgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOS4i+i9vS4uLlxcXCI7XFxuICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgbGV0IEVsZW1lbnRJbmRleCA9IGJhdGNoVGVhbS5pbmRleE9mKGkpO1xcbiAgICBpZiAoRWxlbWVudEluZGV4ID4gLTEpIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBiYXRjaFRlYW0uc3BsaWNlKEVsZW1lbnRJbmRleCwgMSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAmOKAmFxcXCIgKyB0aXRsZSArIFxcXCLigJnigJlcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGJhdGNoVGVhbS5wdXNoKGkpO1xcbiAgICB9XFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG59XFxuXFxuZnVuY3Rpb24gYmF0Y2hWaWV3KCkge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWNlemAieS4i+i9vVxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/aWQ9UElpY3ZGNmViek1uJnNpemU9NDgmZm9ybWF0PWdpZiZ0b2tlbj1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIpID09PSBcXFwiMVxcXCIpIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjmibnph4/kuIvovb1cXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjp2aWV3TW9kZVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCJcXG4gICAgfSk7XFxuICAgIGxldCBzdGFydCA9IENvbmZpZy52aWV3UGFnZVNpemUgKiBNYXRoLm1heChwYWdlTnVtIC0gMSwgMCk7XFxuICAgIGxldCBlbmQgPSBzdGFydCArIGNoYXB0ZXJMaXN0Lmxlbmd0aDtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLpgInmi6nlhajpg6hcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2Zvcm1hdD1naWYmaWQ9MUhWY0hMb056cml0JnRva2VuPVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHN0YXJ0LCBlbmQsIE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG4gICAgICAgICAgICBsZXQgY2hvb3NlVGVhbSA9IFRvb2wucmFuZ2Uoc3RhcnQsIGVuZCk7XFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IEFycmF5LmZyb20obmV3IFNldChiYXRjaFRlYW0uY29uY2F0KGNob29zZVRlYW0pKSk7XFxuICAgICAgICAgICAgbGV0IGNvbXBsZXRlZCA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmNvbXBsZXRlZFxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIoKGkpID0+ICFjb21wbGV0ZWQuaW5jbHVkZXMoaSkpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgc3RhcnQsIGVuZCwgTVlfSUQpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWPlua2iOWFqOmDqFxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD1IekVqUHBJM05MOEQmdG9rZW49XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoc3RhcnQsIGVuZCwgTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbiAgICAgICAgICAgIGxldCBjaG9vc2VUZWFtID0gbmV3IFNldChUb29sLnJhbmdlKHN0YXJ0LCBlbmQpKTtcXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih4ID0+ICFjaG9vc2VUZWFtLmhhcyh4KSk7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBzdGFydCwgZW5kLCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi56Gu6K6k6YCJ5LitXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPXRNcnZ0YzZUOWhWYiZ0b2tlbj1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIsIFxcXCItMVxcXCIpICE9PSBcXFwiLTFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjkuIvovb0uLi5cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIGJhdGNoVGVhbS5sZW5ndGggPT09IDAgPyBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHmnInpgIlcXFwiIDogXFxcImhpa2VyOi8vcGFnZS9CYXRjaC52aWV3I25vUmVmcmVzaCMjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIjtcXG4gICAgICAgIH0sIE1ZX0lEKSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbmV3V2luZG93OiB0cnVlLFxcbiAgICAgICAgICAgIHdpbmRvd0lkOiBNWV9JRCArIFxcXCIvL+aJuemHj+S4i+i9vVxcXCIsXFxuICAgICAgICAgICAgTVlfSUQ6IE1ZX0lELFxcbiAgICAgICAgICAgIGNoYXB0ZXJMaXN0OiBiYWNrdXBDaGFwdGVyTGlzdCxcXG4gICAgICAgICAgICBpbmZvOiBpbmZvXFxuICAgICAgICB9LFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiXFxuICAgIH0pO1xcbiAgICBzZXRUeXBlKCk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgbGV0IGNvbXBsZXRlZCA9IFtdO1xcbiAgICBmb3IgKGxldCBpID0gMCwgaXRlbSA9IGNoYXB0ZXJMaXN0WzBdOyBpIDwgY2hhcHRlckxpc3QubGVuZ3RoOyBpdGVtID0gY2hhcHRlckxpc3RbKytpXSkge1xcbiAgICAgICAgbGV0IGlzX2Rvd25sb2FkID0gcmVjb3JkLmluY2x1ZGVzKGl0ZW0udGl0bGUpO1xcbiAgICAgICAgaWYgKGlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgY29tcGxldGVkLnB1c2goaXRlbS5DSUQpO1xcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goY29tRnVuKGl0ZW0uQ0lELCBpdGVtKSk7XFxuICAgICAgICB9IGVsc2UgaWYgKCFpc19kb3dubG9hZCAmJiB0YWdGaWx0ZXIgIT09IFxcXCIyXFxcIikge1xcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogYmF0Y2hUZWFtLmluY2x1ZGVzKGl0ZW0uQ0lEKSA/IFxcXCLigJjigJhcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJnigJlcXFwiIDogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGNsaWNrQ2hvb3NlLCBpdGVtLnRpdGxlLCBNWV9JRCwgaXRlbS5DSUQpLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaXRlbS5DSURcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmNvbXBsZXRlZFxcXCIsIEpTT04uc3RyaW5naWZ5KGNvbXBsZXRlZCkpO1xcbn1cXG5zd2l0Y2ggKHZpZXdNb2RlKSB7XFxuICAgIGNhc2UgXFxcIjBcXFwiOlxcbiAgICAgICAgc2luZ2xlVmlldygpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgXFxcIjFcXFwiOlxcbiAgICAgICAgYmF0Y2hWaWV3KCk7XFxuICAgICAgICBicmVhaztcXG59XFxuaWYgKGlzUmV2ZXJzZSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGNoYXB0ZXJUZWFtLnJldmVyc2UoKTtcXG59XFxubGF5b3V0LnB1c2guYXBwbHkobGF5b3V0LCBjaGFwdGVyVGVhbSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7mibnph4/kuIvovb3lmahcIixcInBhdGhcIjpcIkJhdGNoLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmxldCB7XFxuICAgIGNoYXB0ZXJMaXN0LFxcbiAgICBpbmZvLFxcbiAgICBNWV9JRFxcbn0gPSBNWV9QQVJBTVM7XFxuc2V0UGFnZVRpdGxlKFxcXCLkuIvovb3lmah8XFxcIitpbmZvLmJvb2tOYW1lKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKE1ZX0lEKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIpO1xcbiAgICByZWZyZXNoUGFnZSgpO1xcbn0sIE1ZX0lEKSk7XFxuXFxubGV0IGlzU3RhcnQgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIsIFxcXCIwXFxcIik7XFxubGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBsYXlvdXQgPSBbXTtcXG5cXG5sZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuaWYodHlwZW9mIGNoYXB0ZXJMaXN0ID09PSBcXFwic3RyaW5nXFxcIil7XFxuICAgIGNoYXB0ZXJMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIitjaGFwdGVyTGlzdCl8fFxcXCJbXVxcXCIpO1xcbn1cXG5sZXQgY2hhcHRlclRlYW0gPSBiYXRjaFRlYW0ubWFwKHYgPT4ge1xcbiAgICBsZXQgY2hhcHRlckl0ZW0gPSBjaGFwdGVyTGlzdFt2XTtcXG4gICAgY2hhcHRlckl0ZW0uQ0lEID0gdjtcXG4gICAgcmV0dXJuIGNoYXB0ZXJJdGVtO1xcbn0pO1xcbmlmIChpc1N0YXJ0ID09PSBcXFwiMFxcXCIpIHtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlvIDlp4vkuIvovb1bXFxcIiArIGNoYXB0ZXJUZWFtLmxlbmd0aCArIFxcXCJdXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICBsZXQgZG93bmxvYWQgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9CYXRjaFN0YXRpc3RpY3MuanNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gZG93bmxvYWQoY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSB8fCBcXFwidG9hc3Q6Ly/kuIvovb3plJnor69cXFwiO1xcbiAgICAgICAgfSwgY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOW8gOWni+S4i+i9vVxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Lu75Yqh5YiX6KGo77yaXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgfSk7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY2hhcHRlclRlYW0pIHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxufSBlbHNlIHtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkuIvovb3ov5vluqY6MC9cXFwiK2NoYXB0ZXJUZWFtLmxlbmd0aCxcXG4gICAgICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ3ilofilofilofilofilofilofilofilofilofilodcXFwiLmZvbnRjb2xvcihcXFwiI2U1ZTFlNFxcXCIpK1xcXCIgMCVcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3ov5vluqZcXFwiLFxcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlkI7lj7DkuIvovb1cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiZnVuYzovL2JhY2tncm91bmRcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxuICAgIH0pO1xcblxcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogW1xcXCJb5Y+W5raI5LiL6L29XVxcXCIsIFxcXCJb5q2j5Zyo5YGc5q2iLi4uXVxcXCIsIFxcXCJb6L+U5ZueXVxcXCIsIFxcXCJb5aSE55CG5aSx6LSlXVxcXCIsIFxcXCJb6YeN5paw5byA5aeLXVxcXCJdW3N0YXR1c10sXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFxcXCIwXFxcIikge1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlvmraPlnKjlgZzmraIuLi5dXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOWPlua2iOS4i+i9veS7u+WKoVxcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5pqC5YGcLi4uXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gXFxcIjJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sumAgOWHuuS4i+i9veWZqFxcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChbXFxcIjNcXFwiLCBcXFwiNFxcXCJdLmluY2x1ZGVzKHN0YXR1cykpIHtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIpO1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6bG9nXFxcIik7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ph43mlrDngrnlh7vkuIvovb1cXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgTVlfSUQpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3mjqfliLZcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxzdHJvbmc+5LiL6L295pel5b+XPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgICAgIFxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85pel5b+XXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6XFxcIuKAnOKAnOKAneKAnSQ+XFxcIitcXFwi5byA5aeL5LiL6L29Li4uLi4uXFxcIi5mb250Y29sb3IoXFxcIiMwMGZmMDBcXFwiKSxcXG4gICAgICAgIHVybDpcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjbG9nIzBcXFwiLFxcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOmZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmZy7mibnph4/kuIvovb3nu5/orqFcIixcInBhdGhcIjpcIkJhdGNoU3RhdGlzdGljcy5qc1wiLFwicnVsZVwiOlwiY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcblxcbmZ1bmN0aW9uIHRhc2sodGFza1BhcmFtKSB7XFxuICAgIGxldCByZXN1bHQgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9CYXRjaC5leGUuanNcXFwiKSh0YXNrUGFyYW0pO1xcbiAgICByZXR1cm4gcmVzdWx0O1xcbn1cXG5cXG4kLmV4cG9ydHMgPSBmdW5jdGlvbihjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpIHtcXG4gICAgaWYgKGNoYXB0ZXJUZWFtLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+epuueahOS4i+i9vemYn+WIl1xcXCI7XFxuICAgIH1cXG4gICAgdmFyIGNvdW50ID0gMDtcXG4gICAgdmFyIHRhc2tDb3VudCA9IGNoYXB0ZXJUZWFtLmxlbmd0aDtcXG4gICAgdmFyIHN1Y2Nlc3NDSUQgPSBbXTtcXG4gICAgdmFyIGZhaWxOYW1lID0gW107XFxuICAgIHZhciBsb2dDb3VudCA9IDE7XFxuICAgIHZhciB0YXNrVGVhbSA9IGNoYXB0ZXJUZWFtLm1hcChjaGFwdGVySXRlbSA9PiAoe1xcbiAgICAgICAgZnVuYzogdGFzayxcXG4gICAgICAgIGlkOiBjaGFwdGVySXRlbS50aXRsZSxcXG4gICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgICAgY2hhcHRlckl0ZW06IGNoYXB0ZXJJdGVtLFxcbiAgICAgICAgICAgIGluZm86IGluZm8sXFxuICAgICAgICAgICAgTVlfSUQ6IE1ZX0lEXFxuICAgICAgICB9XFxuICAgIH0pKTtcXG4gICAgbGV0IGxvZ051bSA9IENvbmZpZy5sb2dOdW07XFxuXFxuICAgIGZ1bmN0aW9uIHB1dExvZyh0ZXh0KSB7XFxuICAgICAgICBsb2codGV4dCk7XFxuICAgICAgICBpZiAobG9nQ291bnQgPj0gbG9nTnVtKSB7XFxuICAgICAgICAgICAgZGVsZXRlSXRlbShNWV9JRCArIFxcXCIjbG9nI1xcXCIgKyAobG9nQ291bnQgLSAxMCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgYWRkSXRlbUFmdGVyKE1ZX0lEICsgXFxcInx85pel5b+XXFxcIiwge1xcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwiJD5cXFwiICsgdGV4dCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI2xvZyNcXFwiICsgbG9nQ291bnRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxvZ0NvdW50Kys7XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gbGlzdGVuZXIocGVyY2gsIGlkLCBlcnJvciwgQ0lEKSB7XFxuICAgICAgICBjb3VudCsrO1xcbiAgICAgICAgbGV0IGlzU3VjY2VzcyA9IGZhbHNlO1xcbiAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XFxuICAgICAgICAgICAgZmFpbE5hbWUucHVzaChpZCk7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCJbbGlzdGVuZXJd5LiL6L295aSx6LSl77yaXFxcIiArIGlkICsgXFxcIjxFUlJPUkAgXFxcIiArIGVycm9yICsgXFxcIj5cXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoQ0lEID49IDApIHtcXG4gICAgICAgICAgICBzdWNjZXNzQ0lELnB1c2goQ0lEKTtcXG4gICAgICAgICAgICBsZXQgcmF0aW8gPSAoY291bnQgLyB0YXNrQ291bnQpLnRvRml4ZWQoNCk7XFxuICAgICAgICAgICAgbGV0IHN0cmlwQ291bnQgPSBNYXRoLmNlaWwocmF0aW8gKiAxMCk7XFxuICAgICAgICAgICAgaXNTdWNjZXNzID0gdHJ1ZTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLkuIvovb3ov5vluqbvvJpcXFwiICsgc3VjY2Vzc0NJRC5sZW5ndGggKyBcXFwiL1xcXCIgKyB0YXNrQ291bnQsXFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuKWh1xcXCIucmVwZWF0KHN0cmlwQ291bnQpLmZvbnRjb2xvcihcXFwiI2ZmYWMyZFxcXCIpICsgXFxcIuKWh1xcXCIucmVwZWF0KDEwIC0gc3RyaXBDb3VudCkuZm9udGNvbG9yKFxcXCIjZTVlMWU0XFxcIikgKyBcXFwiIFxcXCIgKyAocmF0aW8gKiAxMDApICsgXFxcIiVcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L296L+b5bqmXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCJbbGlzdGVuZXJd5bey5a6M5oiQ5LiL6L2977yaXFxcIiArIGlkKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoQ0lEID09PSAtMSkge1xcbiAgICAgICAgICAgIGZhaWxOYW1lLnB1c2goaWQpO1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwiW2xpc3RlbmVyXeW3suWBnOatou+8mlxcXCIgKyBpZCk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodGFza0NvdW50ICE9PSBjb3VudCkgcmV0dXJuO1xcbiAgICAgICAgaWYgKHN1Y2Nlc3NDSUQubGVuZ3RoID09PSB0YXNrQ291bnQpIHtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi4paHXFxcIi5yZXBlYXQoMTApLmZvbnRjb2xvcihcXFwiIzAwZmYwMFxcXCIpICsgXFxcIiAxMDAlXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9vei/m+W6plxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgbGV0IGZhaWxUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih2ID0+ICFzdWNjZXNzQ0lELmluY2x1ZGVzKHYpKTtcXG4gICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShmYWlsVGVhbSkpO1xcbiAgICAgICAgaWYgKGZhaWxUZWFtLmxlbmd0aCA+IDAgJiYgc3RhdHVzICE9PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjNcXFwiKTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIuS4i+i9veWksei0pTpbXFxcIiArIGZhaWxOYW1lLmpvaW4oXFxcIl3vvIxbXFxcIikgKyBcXFwiXeOAglxcXCIpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlvlpITnkIblpLHotKVdXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIGlmIChmYWlsVGVhbS5sZW5ndGggPiAwICYmIHN0YXR1cyA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCI0XFxcIik7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCJbbGlzdGVuZXJdI+W3suWBnOatouaJgOacieS7u+WKoe+8jOS9huW3suaciei/m+W6puS4jeS8mua2iOWksSNcXFwiKTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCJb6YeN5paw5byA5aeLXVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3mjqfliLZcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIyXFxcIik7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCLkuIvovb3ku7vliqFbXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiXeW3suWFqOmDqOaIkOWKn+WujOaIkFxcXCIpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlvov5Tlm55dXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgdG9hc3QoXFxcIuS4i+i9veS7u+WKoVtcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCJd5bey5a6M5oiQXFxcIik7XFxuICAgIH1cXG4gICAgbGV0IHRhc2tUZWFtQ2h1bmsgPSBbXTtcXG4gICAgaWYgKENvbmZpZy50aHJlYWROdW0gPiAwKSB7XFxuICAgICAgICB0YXNrVGVhbUNodW5rID0gVG9vbC5jaHVuayh0YXNrVGVhbSwgQ29uZmlnLnRocmVhZE51bSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB0YXNrVGVhbUNodW5rID0gW3Rhc2tUZWFtXTtcXG4gICAgfVxcbiAgICBmb3IgKGxldCB0YXNrTGlzdCBvZiB0YXNrVGVhbUNodW5rKSB7XFxuICAgICAgICBiZSh0YXNrTGlzdCwge1xcbiAgICAgICAgICAgIGZ1bmM6IGxpc3RlbmVyXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgIGlmIChzdGF0dXMgPT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgbGV0IGZhaWxUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih2ID0+ICFzdWNjZXNzQ0lELmluY2x1ZGVzKHYpKTtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkoZmFpbFRlYW0pKTtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjRcXFwiKTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl0j5bey5YGc5q2i5omA5pyJ5Lu75Yqh77yM5L2G5bey5pyJ6L+b5bqm5LiN5Lya5raI5aSxI1xcXCIpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlvph43mlrDlvIDlp4tdXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9XFxuXFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2ZnLuaJuemHj+S4u+eoi+W6j1wiLFwicGF0aFwiOlwiQmF0Y2guZXhlLmpzXCIsXCJydWxlXCI6XCJjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG5cXG5mdW5jdGlvbiBjb21pYyh0YXNrUGFyYW0pIHtcXG4gICAgbGV0IHtcXG4gICAgICAgIGNoYXB0ZXJJdGVtLFxcbiAgICAgICAgaW5mbyxcXG4gICAgICAgIE1ZX0lELFxcbiAgICB9ID0gdGFza1BhcmFtO1xcbiAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCJcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICByZXR1cm4gLTE7XFxuICAgIH1cXG4gICAgbGV0IG1haW5QYXRoID0gQ29uZmlnLmNvbWljUGF0aCArIFxcXCIvXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFwiL1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIi9cXFwiO1xcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIGNoYXB0ZXJJdGVtLkNJRCArIFxcXCIkQiRcXFwiICsgY2hhcHRlckl0ZW0udGl0bGUgKyBcXFwiL1xcXCI7XFxuICAgIGxldCBwaWNMaXN0O1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IGdldFBpY0xpc3QgPSBuZXcgRnVuY3Rpb24oXFxcImlucHV0XFxcIiwgXFxcInVybFxcXCIsIFxcXCJyZXR1cm4gXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXG4gICAgICAgIHBpY0xpc3QgPSBnZXRQaWNMaXN0KGNoYXB0ZXJJdGVtLnVybCwgY2hhcHRlckl0ZW0udXJsKTtcXG4gICAgICAgIGlmICh0eXBlb2YgcGljTGlzdCA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICBwaWNMaXN0ID0gcGljTGlzdC5yZXBsYWNlKFxcXCJwaWNzOi8vXFxcIiwgXFxcIlxcXCIpLnNwbGl0KFxcXCImJlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBlLm1lc3NhZ2UgPSBcXFwiPOa8q+eUu+WbvueJh+ino+aekOmUmeivr++8mlxcXCIgKyBlLm1lc3NhZ2UgKyBcXFwiPlxcXCI7XFxuICAgICAgICB0aHJvdyBlO1xcbiAgICB9XFxuICAgIGNvbnN0IEwgPSBwaWNMaXN0Lmxlbmd0aDtcXG4gICAgaWYoTD09PTApe1xcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+v77ya5Zu+54mH6ZO+5o6l6L+U5Zue5Li656m6PlxcXCIpO1xcbiAgICB9XFxuICAgIGlmIChpbmZvLmJvb2tUb3BQaWMpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGJvb2tUb3BQaWMgPSBUb29sLmhpa2VyUGljKGluZm8uYm9va1RvcFBpYyk7XFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKGJvb2tUb3BQaWNbMF0sIG1haW5QYXRoICsgaW5mby5ib29rTmFtZSArIFxcXCIuanBnXFxcIiwgYm9va1RvcFBpY1sxXSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKFxcXCI85bCB6Z2i5LiL6L296ZSZ6K+v77yaXFxcIiArIGUubWVzc2FnZSArIFxcXCI+XFxcIik7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgdmFyIHNjaGVkdWxlID0gbmV3IE1hcChbXFxuICAgICAgICBbTCwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcIuW3suS4i+i9vTEwMCVcXFwiKV0sXFxuICAgICAgICBbfn4oMC45MCAqIEwpLCAoKSA9PiBsb2coY2hhcHRlckl0ZW0udGl0bGUgKyBcXFwi5bey5LiL6L29OTAlK1xcXCIpXSxcXG4gICAgICAgIFt+figwLjc1ICogTCksICgpID0+IGxvZyhjaGFwdGVySXRlbS50aXRsZSArIFxcXCLlt7LkuIvovb03NSUrXFxcIildLFxcbiAgICAgICAgW35+KDAuNTAgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcIuW3suS4i+i9vTUwJStcXFwiKV0sXFxuICAgICAgICBbfn4oMC4yNSAqIEwpLCAoKSA9PiBsb2coY2hhcHRlckl0ZW0udGl0bGUgKyBcXFwi5bey5LiL6L29MjUlK1xcXCIpXVxcbiAgICBdKTtcXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBMOyBpKyspIHtcXG4gICAgICAgIGxldCBwaWMgPSBUb29sLmhpa2VyUGljKHBpY0xpc3RbaV0pO1xcbiAgICAgICAgcmVxdWlyZURvd25sb2FkKHBpY1swXSwgY2hhcHRlclBhdGggKyAoaSArIDEpICsgXFxcIi5qcGdcXFwiLCBwaWNbMV0pO1xcbiAgICAgICAgc2NoZWR1bGUuaGFzKGkgKyAxKSAmJiBzY2hlZHVsZS5nZXQoaSArIDEpKCk7XFxuICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCJcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIC0xO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIEZpbGUucmVuYW1lRmlsZShjaGFwdGVyUGF0aCwgY2hhcHRlckl0ZW0uQ0lEICsgXFxcIiRBJFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSk7XFxuICAgIHJldHVybiBjaGFwdGVySXRlbS5DSUQ7XFxufVxcblxcbmZ1bmN0aW9uIG5vdmVsKHRhc2tQYXJhbSkge1xcbiAgICBsZXQge1xcbiAgICAgICAgY2hhcHRlckl0ZW0sXFxuICAgICAgICBpbmZvLFxcbiAgICAgICAgTVlfSUQsXFxuICAgIH0gPSB0YXNrUGFyYW07XFxuICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIlxcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgIHJldHVybiAtMTtcXG4gICAgfVxcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcubm92ZWxQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiL1xcXCI7XFxuICAgIGxldCBjaGFwdGVyUGF0aCA9IG1haW5QYXRoICsgY2hhcHRlckl0ZW0uQ0lEICsgXFxcIiRBJFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSArIFxcXCIudHh0XFxcIjtcXG4gICAgbGV0IGNvbnRlbnQgPSBcXFwiXFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBnZXRDb250ZW50ID0gbmV3IEZ1bmN0aW9uKFxcXCJpbnB1dFxcXCIsIFxcXCJ1cmxcXFwiLCBcXFwicmV0dXJuIFxcXCIgKyBpbmZvLnBhcnNlQ29kZSk7XFxuICAgICAgICBjb250ZW50ID0gZ2V0Q29udGVudChjaGFwdGVySXRlbS51cmwsIGNoYXB0ZXJJdGVtLnVybCk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGUubWVzc2FnZSA9IFxcXCI85bCP6K+05q2j5paH6Kej5p6Q6ZSZ6K+v77yaXFxcIiArIGUubWVzc2FnZSArIFxcXCI+XFxcIjtcXG4gICAgICAgIHRocm93IGU7XFxuICAgIH1cXG4gICAgaWYgKCFjb250ZW50KSB7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIjzlsI/or7TmraPmlofop6PmnpDplJnor6/vvJrmraPmlofov5Tlm57kuLrnqbo+XFxcIik7XFxuICAgIH1cXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgYm9va1RvcFBpYyA9IFRvb2wuaGlrZXJQaWMoaW5mby5ib29rVG9wUGljKTtcXG4gICAgICAgICAgICByZXF1aXJlRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcIi5qcGdcXFwiLCBib29rVG9wUGljWzFdKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIjzlsIHpnaLkuIvovb3plJnor6/vvJpcXFwiICsgZS5tZXNzYWdlICsgXFxcIj5cXFwiKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBGaWxlLmZpbGVXcml0ZShjaGFwdGVyUGF0aCwgY29udGVudC5yZXBsYWNlKC88c2NyaXB0Pi4qPzxcXFxcL3NjcmlwdD4vZ21pLCBcXFwiXFxcIikudHJpbVJpZ2h0KCkpO1xcbiAgICAvL0ZpbGUucmVuYW1lRmlsZShjaGFwdGVyUGF0aCwgY2hhcHRlckl0ZW0uQ0lEICsgXFxcIiRBJFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSk7XFxuICAgIHJldHVybiBjaGFwdGVySXRlbS5DSUQ7XFxufVxcbnZhciAkZXhlID0ge1xcbiAgICBjb21pYzogY29taWMsXFxuICAgIG5vdmVsOiBub3ZlbFxcbn07XFxuJC5leHBvcnRzID0gZnVuY3Rpb24odGFza1BhcmFtKSB7XFxuICAgIHJldHVybiAkZXhlW3Rhc2tQYXJhbS5pbmZvLnR5cGVdKHRhc2tQYXJhbSk7XFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmZy7mma7pgJrkuLvnqIvluo9cIixcInBhdGhcIjpcIkRvd25sb2FkLmV4ZS5qc1wiLFwicnVsZVwiOlwiY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcbmNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcIik7XFxuXFxuZnVuY3Rpb24gbm92ZWwoaXRlbSwgaW5mbywgTVlfSUQsIG9yZGVyKSB7XFxuICAgIGxldCBtYWluUGF0aCA9IENvbmZpZy5ub3ZlbFBhdGggKyBcXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCIvXFxcIjtcXG4gICAgbGV0IGNoYXB0ZXJQYXRoID0gbWFpblBhdGggKyBvcmRlciArIFxcXCIkQSRcXFwiICsgaXRlbS50aXRsZSArIFxcXCIudHh0XFxcIjtcXG4gICAgbGV0IGNvbnRlbnQgPSBcXFwiXFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBnZXRDb250ZW50ID0gbmV3IEZ1bmN0aW9uKFxcXCJpbnB1dFxcXCIsIFxcXCJ1cmxcXFwiLCBcXFwicmV0dXJuIFxcXCIgKyBpbmZvLnBhcnNlQ29kZSk7XFxuICAgICAgICBjb250ZW50ID0gZ2V0Q29udGVudChpdGVtLnVybCwgaXRlbS51cmwpIHx8IFxcXCJcXFwiO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBlLm1lc3NhZ2UgPSBcXFwiPOWwj+ivtOato+aWh+ino+aekOmUmeivrz4gXFxcIiArIGUubWVzc2FnZTtcXG4gICAgICAgIHRocm93IGU7XFxuICAgIH1cXG4gICAgaWYgKCFjb250ZW50KSB7XFxuICAgICAgICB0b2FzdChcXFwi5bCP6K+05Li656m6XFxcIik7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIjzlsI/or7TmraPmlofop6PmnpDplJnor6/vvJrmraPmlofov5Tlm57kuLrnqbo+XFxcIik7XFxuICAgIH1cXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgYm9va1RvcFBpYyA9IFRvb2wuaGlrZXJQaWMoaW5mby5ib29rVG9wUGljKTtcXG4gICAgICAgICAgICByZXF1aXJlRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcIi5qcGdcXFwiLCBib29rVG9wUGljWzFdKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIjzlsIHpnaLkuIvovb3plJnor68+IFxcXCIgKyBlLm1lc3NhZ2UpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIEZpbGUuZmlsZVdyaXRlKGNoYXB0ZXJQYXRoLCBjb250ZW50LnJlcGxhY2UoLzxzY3JpcHQ+Lio/PFxcXFwvc2NyaXB0Pi9nbWksIFxcXCJcXFwiKS50cmltUmlnaHQoKSk7XFxuICAgIC8vRmlsZS5yZW5hbWVGaWxlKGNoYXB0ZXJQYXRoLCBvcmRlciArIFxcXCIkQSRcXFwiICsgaXRlbS50aXRsZSArIFxcXCIudHh0XFxcIik7XFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCJAXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwiIOS4i+i9veWujOaIkFxcXCI7XFxufVxcblxcbmZ1bmN0aW9uIGNvbWljKGl0ZW0sIGluZm8sIE1ZX0lELCBvcmRlcikge1xcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiL1xcXCI7XFxuICAgIGxldCBjaGFwdGVyUGF0aCA9IG1haW5QYXRoICsgb3JkZXIgKyBcXFwiJEIkXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwiL1xcXCI7XFxuICAgIGxldCBwaWNMaXN0ID0gW107XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgZ2V0UGljTGlzdCA9IG5ldyBGdW5jdGlvbihcXFwiaW5wdXRcXFwiLCBcXFwicmV0dXJuXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXG4gICAgICAgIHBpY0xpc3QgPSBnZXRQaWNMaXN0KGl0ZW0udXJsKTtcXG4gICAgICAgIGlmICh0eXBlb2YgcGljTGlzdCA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICBwaWNMaXN0ID0gcGljTGlzdC5yZXBsYWNlKFxcXCJwaWNzOi8vXFxcIiwgXFxcIlxcXCIpLnNwbGl0KFxcXCImJlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBlLm1lc3NhZ2UgPSBcXFwiPOa8q+eUu+WbvueJh+ino+aekOmUmeivrz4gXFxcIiArIGUubWVzc2FnZTtcXG4gICAgICAgIHRocm93IGU7XFxuICAgIH1cXG5cXG4gICAgY29uc3QgTCA9IHBpY0xpc3QubGVuZ3RoO1xcbiAgICBpZihMPT09MCl7XFxuICAgICAgICB0b2FzdChcXFwi5Zu+54mH6ZO+5o6l5Li656m6XFxcIik7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIjzmvKvnlLvlm77niYfop6PmnpDplJnor6/vvJrlm77niYfpk77mjqXov5Tlm57kuLrnqbo+XFxcIik7XFxuICAgIH1cXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgYm9va1RvcFBpYyA9IFRvb2wuaGlrZXJQaWMoaW5mby5ib29rVG9wUGljKTtcXG4gICAgICAgICAgICByZXF1aXJlRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcIi5qcGdcXFwiLCBib29rVG9wUGljWzFdKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIjzlsIHpnaLkuIvovb3plJnor68+IFxcXCIgKyBlLm1lc3NhZ2UpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHZhciBzY2hlZHVsZSA9IG5ldyBNYXAoW1xcbiAgICAgICAgW0wsICgpID0+IGxvZyhpdGVtLnRpdGxlICsgXFxcIuW3suS4i+i9vTEwMCVcXFwiKV0sXFxuICAgICAgICBbfn4oMC45MCAqIEwpLCAoKSA9PiBsb2coaXRlbS50aXRsZSArIFxcXCLlt7LkuIvovb05MCUrXFxcIildLFxcbiAgICAgICAgW35+KDAuNzUgKiBMKSwgKCkgPT4gbG9nKGl0ZW0udGl0bGUgKyBcXFwi5bey5LiL6L29NzUlK1xcXCIpXSxcXG4gICAgICAgIFt+figwLjUwICogTCksICgpID0+IGxvZyhpdGVtLnRpdGxlICsgXFxcIuW3suS4i+i9vTUwJStcXFwiKV0sXFxuICAgICAgICBbfn4oMC4yNSAqIEwpLCAoKSA9PiBsb2coaXRlbS50aXRsZSArIFxcXCLlt7LkuIvovb0yNSUrXFxcIildXFxuICAgIF0pO1xcblxcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IEw7IGkrKykge1xcbiAgICAgICAgbGV0IHBpYyA9IFRvb2wuaGlrZXJQaWMocGljTGlzdFtpXSk7XFxuICAgICAgICByZXF1aXJlRG93bmxvYWQocGljWzBdLCBjaGFwdGVyUGF0aCArIChpICsgMSkgKyBcXFwiLmpwZ1xcXCIsIHBpY1sxXSk7XFxuICAgICAgICBzY2hlZHVsZS5oYXMoaSArIDEpICYmIHNjaGVkdWxlLmdldChpICsgMSkoKTtcXG4gICAgfVxcblxcbiAgICBGaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIG9yZGVyICsgXFxcIiRBJFxcXCIgKyBpdGVtLnRpdGxlKTtcXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIkBcXFwiICsgaXRlbS50aXRsZSArIFxcXCIg5LiL6L295a6M5oiQXFxcIjtcXG59XFxudmFyICRleGUgPSB7XFxuICAgIGNvbWljOiBjb21pYyxcXG4gICAgbm92ZWw6IG5vdmVsXFxufTtcXG4kLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVtLCBpbmZvLCBNWV9JRCwgb3JkZXIpIHtcXG4gICAgcmV0dXJuICRleGVbaW5mby50eXBlXShpdGVtLCBpbmZvLCBNWV9JRCwgb3JkZXIpO1xcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjZi7pgJrnlKjlt6XlhbdcIixcInBhdGhcIjpcIlRvb2wuanNcIixcInJ1bGVcIjpcIiQuZXhwb3J0cyA9IHtcXG4gICAgc3BsaXQodGV4dCwgdGFyZ2V0LCBjb3VudCkge1xcbiAgICAgICAgY291bnQgPSBjb3VudCA9PT0gdW5kZWZpbmVkID8gMSA6IGNvdW50O1xcbiAgICAgICAgbGV0IGFycmF5ID0gW3RleHRdO1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XFxuICAgICAgICAgICAgdGV4dCA9IGFycmF5W2ldO1xcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRleHQuaW5kZXhPZih0YXJnZXQpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGFycmF5W2ldID0gdGV4dC5zbGljZSgwLCBpbmRleCk7XFxuICAgICAgICAgICAgYXJyYXlbaSArIDFdID0gdGV4dC5zbGljZShpbmRleCArIHRhcmdldC5sZW5ndGgpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGFycmF5O1xcbiAgICB9LFxcbiAgICBjaHVuayhhcnIsIHNpemUpIHtcXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpICs9IHNpemUpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnIuc2xpY2UoaSwgaSArIHNpemUpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGhpa2VyUGljKHVybCkge1xcbiAgICAgICAgdmFyIGhlYWRlcnMgPSB7fTtcXG4gICAgICAgIGxldCB1cmxzID0gdXJsLnNwbGl0KFxcXCJAXFxcIik7XFxuICAgICAgICBsZXQgcGljVXJsID0gdXJscy5zaGlmdCgpO1xcbiAgICAgICAgbGV0IGxlbmd0aCA9IHVybHMubGVuZ3RoO1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSB1cmxzW2ldLnNwbGl0KFxcXCI9XFxcIik7XFxuICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gW3BpY1VybCwgaGVhZGVyc107XFxuICAgIH0sXFxuICAgIHJhbmdlKHN0YXJ0LCBlbmQpIHtcXG4gICAgICAgIHJldHVybiBBcnJheShlbmQgLSBzdGFydCkuZmlsbCgwKS5tYXAoKGVsLCBpKSA9PiBzdGFydCArIGkpO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2ouQ29uZmlnXCIsXCJwYXRoXCI6XCJDb25maWcuanNvblwiLFwicnVsZVwiOlwiY29uc3QgQ29uZmlnID0gT2JqZWN0LmFzc2lnbih7XFxuICAgIGhvbWVQYXRoOiBcXFwiL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9sb2NhbE1hbmFnZXJcXFwiLFxcbiAgICBsb2dOdW06IDEwLFxcbiAgICB0aHJlYWROdW06IDE2LFxcbiAgICBkZWZfaXNQYWdpbmF0ZTogXFxcIjFcXFwiLCAvLzHpu5jorqTlvIDlkK/liIbpobXvvIww6buY6K6k5YWz6ZetXFxuICAgIHZpZXdQYWdlU2l6ZTogMjAwLFxcbiAgICBkZWZfUGljOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9waWM0XFxcIixcXG4gICAgZGVmX0xvcmRfVHlwZTogXFxcImNvbWljXFxcIixcXG4gICAgZGVmX1ZpZXdfU3R5bGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICBkZWZfRG9WaV9TdHlsZTogXFxcInRleHRfMlxcXCIsXFxuICAgIGRlZl9Eb1ZpX1R5cGU6IFxcXCIxXFxcIiwgLy8w5YWo6YOoLCAx5pyq5a6M5oiQ77yMMuW3suWujOaIkFxcbn0sIEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcbmNvbnN0IFBBVEhTID0ge1xcbiAgICBub3ZlbFBhdGg6IFxcXCIv5bCP6K+0L1xcXCIsXFxuICAgIGNvbWljUGF0aDogXFxcIi/mvKvnlLsvXFxcIixcXG4gICAgbm92ZWxGdWxsUGF0aDogXFxcIi/lsI/or7TlkIjlubYvXFxcIlxcbn1cXG5cXG5cXG5PYmplY3Qua2V5cyhQQVRIUykuZm9yRWFjaChrZXkgPT4gQ29uZmlnW2tleV0gPSBDb25maWcuaG9tZVBhdGggKyBQQVRIU1trZXldKTtcXG4kLmV4cG9ydHMgPSBDb25maWc7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7kuLvpobXpnaJcIixcInBhdGhcIjpcIk1haW4udmlld1wiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gbWFpbigpIHtcXG4gICAgdmFyIGxheW91dCA9IFtdO1xcbiAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcbiAgICBsZXQgdHlwZSA9IGdldE15VmFyKFxcXCIudHlwZVxcXCIsIENvbmZpZy5kZWZfTG9yZF9UeXBlKTtcXG4gICAgbGV0IHRhZyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnW3R5cGUgKyBcXFwiUGF0aFxcXCJdLCBcXFwiZGlyXFxcIik7XFxuICAgIGxldCB0Z251bSA9IGdldE15VmFyKFxcXCIudGdudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKE1ZX0lEKSA9PiB7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJzZWFyY2hLZXlcXFwiKTtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcIi50Z251bVxcXCIpO1xcbiAgICB9KSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0eXBlID09PSBcXFwiY29taWNcXFwiID8gXFxcIuKXiea8q+eUu1xcXCIgOiBcXFwi4peL5ryr55S7XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcXFwiY29taWNcXFwiKSByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIudHlwZVxcXCIsIFxcXCJjb21pY1xcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIi50Z251bVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgdHlwZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdHlwZSA9PT0gXFxcIm5vdmVsXFxcIiA/IFxcXCLil4nlsI/or7RcXFwiIDogXFxcIuKXi+Wwj+ivtFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHR5cGUpID0+IHtcXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXFxcIm5vdmVsXFxcIikgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxDb2xsZWN0ZWQudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIudHlwZVxcXCIsIFxcXCJub3ZlbFxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIi50Z251bVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgdHlwZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgIH0pO1xcbiAgICBpZiAodGFnLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLkuIDmnKzkuZ/msqHmnIko6L+b5YWl6K6+572uKVxcXCIuYmlnKCksXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBNWV9SVUxFLnZlcnNpb24sXFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGxheW91dCk7XFxuICAgIH1cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdXJsOiAnXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcIitpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc5L2g5oOz6KaB55qEI1xcXCIgKyB0eXBlICsgXFxcIiMuLi4uLi5cXFwiLFxcbiAgICAgICAgdGl0bGU6ICfmkJzntKInLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHJ1bGVzOiAkLnRvU3RyaW5nKCh0YWcsIHR5cGUpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGFycjEgPSBbXTtcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWcubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGFycjEucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInRpdGxlXFxcIjogdGFnW2ldLm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInNlYXJjaF91cmxcXFwiOiBcXFwiaGlrZXI6Ly9lbXB0eT9pc0FsbD0xJnNlYXJjaFRlcm1zPSoqJnR5cGU9XFxcIiArIHR5cGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInNlYXJjaEZpbmRcXFwiOiBcXFwianM6JC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvU2VhcmNoLnZpZXc/cnVsZT0nK01ZX1JVTEUuX3RpdGxlKTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJyMSk7XFxuICAgICAgICAgICAgfSwgdGFnLCB0eXBlKSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdzZWFyY2hLZXknLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcignc2VhcmNoS2V5JyxpbnB1dClcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJjigJjimpnorr7nva7igJnigJlcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgIHZlcnNpb246IE1ZX1JVTEUudmVyc2lvblxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgXFxuXFxuICAgIGZvciAobGV0IGkgaW4gdGFnKSB7XFxuICAgICAgICBsZXQgaXQgPSB0YWdbaV07XFxuICAgICAgICBpZiAodGdudW0gPT09IGkpIHtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIGl0Lm5hbWUgKyBcXFwi4oCd4oCdXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkVS5idWlsZCgkVShbXFxcIuWIoOmZpOivpeebruW9lVxcXCIsIFxcXCLot7PovazlsI/nqIvluo9cXFwiXSwgMSwgXFxcIumAieaLqeaTjeS9nFxcXCIpLnNlbGVjdCgobmFtZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxcXCLot7PovazlsI/nqIvluo9cXFwiID09PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9ob21lQFxcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlbihbXFxcIuivpeaTjeS9nOS4jeS8muWIoOmZpOWwj+eoi+W6j++8jOS9huivpeWwj+eoi+W6j+S4i+i9veeahOaJgOaciea8q+eUu+Wwhuiiq+WIoOmZpFxcXCJdKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgaXQubmFtZSkuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZsaWVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiLnRnbnVtXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIGl0LnBhdGgpKVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5uYW1lLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoaSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiLnRnbnVtXFxcIiwgaSk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgaSksXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IHBhdGggPSB0YWdbdGdudW1dLnBhdGg7XFxuICAgIGxldCBtaGxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGgsIFxcXCJkaXJcXFwiKTtcXG5cXG4gICAgaWYgKG1obGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5LiA5pys5Lmf5rKh5pyJXFxcIi5iaWcoKSxcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGxheW91dCk7XFxuICAgIH1cXG4gICAgbGV0IHBhZ2VVcmwgPSB0eXBlID09PSBcXFwibm92ZWxcXFwiID8gXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbEJyb3dzZXIudmlld1xcXCIgOiBcXFwiaGlrZXI6Ly9wYWdlL0NvbWljQnJvd3Nlci52aWV3XFxcIjtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBtaGxpc3QpIHtcXG4gICAgICAgIGxldCBwaWMgPSBmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgaXRlbS5wYXRoICsgXFxcIi9cXFwiICsgaXRlbS5uYW1lICsgXFxcIi5qcGdcXFwiKSA/IGl0ZW0ucGF0aCArIFxcXCIvXFxcIiArIGl0ZW0ubmFtZSArIFxcXCIuanBnXFxcIiA6IENvbmZpZy5kZWZfUGljO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgcGljX3VybDogcGljLFxcbiAgICAgICAgICAgIHVybDogcGFnZVVybCArIFxcXCI/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSxcXG4gICAgICAgICAgICBleHRyYTogaXRlbVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxufVxcbm1haW4oKTtcIn0se1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiI3Yu5ryr55S75p+l55yLXCIsXCJwYXRoXCI6XCJDb21pY0Jyb3dzZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxuaWYgKGdldFBhcmFtKFxcXCJoYXNQYXJhbXNcXFwiKSA9PT0gXFxcInRydWVcXFwiKSB7XFxuICAgIE1ZX1BBUkFNUyA9IHtcXG4gICAgICAgIHBhdGg6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicGF0aFxcXCIpKSxcXG4gICAgICAgIG5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwibmFtZVxcXCIpKVxcbiAgICB9XFxufVxcbmxldCBwYXRoID0gTVlfUEFSQU1TLnBhdGg7XFxuc2V0UGFnZVRpdGxlKFxcXCJDVnxcXFwiICsgTVlfUEFSQU1TLm5hbWUpXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuXFxudmFyIGxheW91dCA9IFtdO1xcbmxldCBtb2RlID0gZ2V0TXlWYXIoXFxcIi5tb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgaXNSZXZlcnNlID0gZ2V0TXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiLCBcXFwiMFxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5tb2RlXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiKTtcXG59KSk7XFxuY29uc3QgY29taWNTdGF0dXM9bmV3IE1hcChbW1xcXCJBXFxcIixcXFwiXFxcIl0sW1xcXCJCXFxcIixcXFwi4oCY4oCYW+acquWujOaIkF3igJnigJlcXFwiXV0pO1xcbmZ1bmN0aW9uIGdldFRpdGxlKHRpdGxlKSB7XFxuICAgIGxldCB0aXRsZXMgPSBUb29sLnNwbGl0KHRpdGxlLCBcXFwiJFxcXCIsIDIpO1xcbiAgICByZXR1cm4gY29taWNTdGF0dXMuZ2V0KHRpdGxlc1sxXSkrdGl0bGVzWzJdIHx8IHRpdGxlO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5Yig6Zmk5pW05pysXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTliKDpmaTmlbTmnKzmvKvnlLvvvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmxpZXMocGF0aCkpIHtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9LCBwYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogW1xcXCLnnIvmvKvnlLtcXFwiLCBcXFwi5Yig6Zmk56ug6IqCXFxcIl1bbW9kZV0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobW9kZSkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIi5tb2RlXFxcIiwgbW9kZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBtb2RlKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSlcXG5sZXQgbWhsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFwiZGlyXFxcIik7XFxubWhsaXN0LnNvcnQoKGEsIGIpID0+IHtcXG4gICAgYSA9IChhLm5hbWUubWF0Y2goL1xcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcbiAgICBiID0gKGIubmFtZS5tYXRjaCgvXFxcXGQrLykgfHwgW10pWzBdIHx8IDA7XFxuICAgIHJldHVybiBhIC0gYjtcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLnq6DoioIgXFxcIi5iaWcoKSArIChcXFwi5YWx5pyJOlxcXCIgKyBtaGxpc3QubGVuZ3RoICsgXFxcIueroFxcXCIpLnNtYWxsKCksXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBpc1JldmVyc2UpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5sZXQgYXJyYXkgPSBbXTtcXG5sZXQgbGF6eSA9ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGlucHV0KTtcXG4gICAgbGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+IFxcXCJmaWxlOi8vXFxcIiArIGlucHV0ICsgXFxcIi9cXFwiICsgKGkgKyAxKSArIFxcXCIuanBnXFxcIik7XFxuICAgIHJldHVybiBcXFwicGljczovL1xcXCIgKyBwaWNsaXN0LmpvaW4oXFxcIiYmXFxcIik7XFxufSlcXG5pZiAobW9kZSA9PT0gXFxcIjBcXFwiKSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgbWhsaXN0KSB7XFxuICAgICAgICBhcnJheS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogZ2V0VGl0bGUoaXRlbS5uYW1lKSxcXG4gICAgICAgICAgICB1cmw6IGl0ZW0ucGF0aCtsYXp5LFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufSBlbHNlIHtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBtaGxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0VGl0bGUoaXRlbS5uYW1lKTtcXG4gICAgICAgIGFycmF5LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgICAgIHVybDogJChcXFwi56Gu6K6k5Yig6ZmkW1xcXCIgKyBuYW1lICsgXFxcIl3vvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZsaWVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LCBpdGVtLnBhdGgpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmlmIChpc1JldmVyc2UgPT09IFxcXCIxXFxcIikge1xcbiAgICBhcnJheS5yZXZlcnNlKCk7XFxufVxcbmxheW91dC5wdXNoLmFwcGx5KGxheW91dCwgYXJyYXkpO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu6IGa5ZCI5pCc57SiXCIsXCJwYXRoXCI6XCJTZWFyY2gudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanM/cnVsZT1cXFwiICsgTVlfUlVMRS5fdGl0bGUpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uP3J1bGU9XFxcIiArIE1ZX1JVTEUuX3RpdGxlKTtcXG5sZXQgY29taWNSdWxlRGlycyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnW2dldFBhcmFtKFxcXCJ0eXBlXFxcIikrXFxcIlBhdGhcXFwiXSwgXFxcImRpclxcXCIpO1xcbmlmIChnZXRQYXJhbShcXFwiaXNBbGxcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGNvbWljUnVsZURpcnMgPSBjb21pY1J1bGVEaXJzLmZpbHRlcihpdGVtID0+IGl0ZW0ubmFtZSA9PT0gTVlfUlVMRS50aXRsZSk7XFxufVxcblxcbmxldCBzZWFyY2hSZXN1bHQgPSBbXTtcXG5sZXQgc2VhcmNoVGVybXMgPSBnZXRQYXJhbShcXFwic2VhcmNoVGVybXNcXFwiKTtcXG5sZXQgdGVybXNBcnIgPSBzZWFyY2hUZXJtcy5zcGxpdChcXFwiXFxcIikubWFwKHQgPT4gdC5yZXBsYWNlKC9cXFxcKnxcXFxcLnxcXFxcP3xcXFxcK3xcXFxcJHxcXFxcXnxcXFxcW3xcXFxcXXxcXFxcKHxcXFxcKXxcXFxce3xcXFxcfXxcXFxcfHxcXFxcL3xcXFxcXFxcXC9nLCBrID0+IFxcXCJcXFxcXFxcXFxcXCIgKyBrKSk7XFxubGV0IHJlZyA9IG5ldyBSZWdFeHAodGVybXNBcnIuam9pbihcXFwiLipcXFwiKSxcXFwiaVxcXCIpO1xcbmxldCBwYWdlVXJsPWdldFBhcmFtKFxcXCJ0eXBlXFxcIik9PT1cXFwibm92ZWxcXFwiP1xcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFwiOlxcXCJoaWtlcjovL3BhZ2UvQ29taWNCcm93c2VyLnZpZXdcXFwiO1xcbmZvciAobGV0IHNvbkRpciBvZiBjb21pY1J1bGVEaXJzKSB7XFxuICAgIGxldCBjb21pY0xpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHNvbkRpci5wYXRoLCBcXFwiZGlyXFxcIik7XFxuICAgIGZvciAobGV0IGNvbWljIG9mIGNvbWljTGlzdCkge1xcbiAgICAgICAgaWYgKHJlZy50ZXN0KGNvbWljLm5hbWUpKSB7XFxuICAgICAgICAgICAgc2VhcmNoUmVzdWx0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogY29taWMubmFtZSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogY29taWMucGF0aCArIFxcXCIvXFxcIiArIGNvbWljLm5hbWUgKyBcXFwiLmpwZ1xcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogcGFnZVVybCtcXFwiP3J1bGU9XFxcIiArIE1ZX1JVTEUuX3RpdGxlLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBzb25EaXIubmFtZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IGNvbWljXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG59XFxuc2V0UmVzdWx0KHNlYXJjaFJlc3VsdCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7orr7nva5cIixcInBhdGhcIjpcIlNldHRpbmcudmlld1wiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKE1ZX1JVTEUudGl0bGUgKyBcXFwifOiuvue9rlxcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuXFxubGV0IGxheW91dCA9IFtdO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c3Ryb25nPuWfuuehgOiuvue9rjwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLnm67lvZXot6/lvoRcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/c2V0dGluZ1R5cGU9Y29udGVudHNcXFwiLFxcbiAgICBkZXNjOiBDb25maWcuaG9tZVBhdGgsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLorr7nva7pu5jorqTlsIHpnaJcXFwiLFxcbiAgICBkZXNjOiBDb25maWcuZGVmX1BpYyxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3NldHRpbmdUeXBlPWRlZmF1bHRQaWNcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c3Ryb25nPuS4i+i9veWZqOiuvue9rjwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcblxcbmZ1bmN0aW9uIHNldE51bShrZXksIHRlc3QpIHtcXG4gICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgIGlucHV0ID0gcGFyc2VJbnQoaW5wdXQpO1xcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0KSkgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeaVsOWtl1xcXCI7XFxuICAgIGlmICghdGVzdChpbnB1dCkpIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3nrKblkIjmnaHku7ZcXFwiO1xcbiAgICBDb25maWdba2V5XSA9IGlucHV0O1xcbiAgICBzYXZlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpKTtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG59XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcImxvZ+aVsFxcXCIsXFxuICAgIHVybDogJChDb25maWcubG9nTnVtLCBcXFwiMDxOPDEwMFxcXCIpLmlucHV0KHNldE51bSwgXFxcImxvZ051bVxcXCIsIGl0ID0+IGl0ID4gMCAmJiBpdCA8IDEwMCksXFxuICAgIGRlc2M6IFxcXCJcXFwiICsgQ29uZmlnLmxvZ051bSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIhuaJueS4i+i9veaVsCgw5LiN5byA5ZCvKVxcXCIsXFxuICAgIHVybDogJChcXFwiXFxcIiArIENvbmZpZy50aHJlYWROdW0sIFxcXCJOPi0xXFxcIikuaW5wdXQoc2V0TnVtLCBcXFwidGhyZWFkTnVtXFxcIiwgaXQgPT4gaXQgPiAtMSksXFxuICAgIGRlc2M6IFxcXCJcXFwiICsgQ29uZmlnLnRocmVhZE51bSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuXFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzdHJvbmc+5bCP6K+06ZiF6K+75Zmo6K6+572uPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIum7mOiupOW8gOWQr+WIhumhtemYheivu1xcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoZGVmX2lzUGFnaW5hdGUpID0+IHtcXG4gICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJjb25maWcuanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcblxcbiAgICAgICAgQ29uZmlnLmRlZl9pc1BhZ2luYXRlID0gZGVmX2lzUGFnaW5hdGUgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIjtcXG5cXG4gICAgICAgIHNhdmVGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZykpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgQ29uZmlnLmRlZl9pc1BhZ2luYXRlKSxcXG4gICAgZGVzYzogQ29uZmlnLmRlZl9pc1BhZ2luYXRlID09PSBcXFwiMFxcXCIgPyBcXFwi5LiN5byA5ZCvXFxcIiA6IFxcXCLlvIDlkK9cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5q+P6aG15pyA5aSn56ug5pWwXFxcIixcXG4gICAgdXJsOiAkKENvbmZpZy52aWV3UGFnZVNpemUsIFxcXCIzMDxOPDUwMFxcXCIpLmlucHV0KHNldE51bSwgXFxcInZpZXdQYWdlU2l6ZVxcXCIsIGl0ID0+IGl0ID4gMzAgJiYgaXQgPCA1MDApLFxcbiAgICBkZXNjOiBcXFwiXFxcIiArIENvbmZpZy52aWV3UGFnZVNpemUsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmm7/mjaLop4TliJlcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/c2V0dGluZ1R5cGU9cmVwbGFjZVJ1bGVcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c3Ryb25nPuWFtuS7luiuvue9rjwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLop4TliJnlj5HluIPpobVcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbHZlcjogTVlfUEFSQU1TLnZlcnNpb24gfHwgXFxcIuiOt+WPlueJiOacrOWksei0pe+8jOiHquihjOafpeeci1xcXCIsXFxuICAgICAgICBpZDogXFxcIjM1NTlcXFwiXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLlhbPkuo7lpoLkvZXosIPnlKhcXFwiLFxcbiAgICB1cmw6IFxcXCJodHRwczovL3F1bi5xcS5jb20vcXF3ZWIvcXVucHJvL3NoYXJlP193dj0zJl93d3Y9MTI4Jmludml0ZUNvZGU9MUhGeUJKJmZyb209MjQ2NjEwJmJpej1rYVxcXCIsXFxuICAgIGRlc2M6IFxcXCLor6bnu4bngrnlh7vliqDlhaXpopHpgZPvvIzpopHpgZPph4xATG95RGdJa1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmgaLlpI3pu5jorqTorr7nva5cXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruiupOaBouWkjem7mOiupOiuvue9ru+8n1xcXCIpLmNvbmZpcm0oKCkgPT4ge1xcbiAgICAgICAgZGVsZXRlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mgaLlpI3lrozmiJBcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4heeQhue8k+WtmFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/c2V0dGluZ1R5cGU9Y2FjaGVcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG4vKlxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmuIXpmaTlsI/or7TliIbpobXorrDlvZVcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruiupOa4hemZpOWwj+ivtOWIhumhteiusOW9le+8n1xcXCIpLmNvbmZpcm0oKCkgPT4ge1xcbiAgICAgICAgZGVsZXRlRmlsZShcXFwibm92ZWxGb290cHJpbnQuanNvblxcXCIpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+a4hemZpOWujOaIkFxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG4qL1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwidGV4dF8xXCIsXCJuYW1lXCI6XCIjdi7lsI/or7Tmn6XnnItcIixcInBhdGhcIjpcIk5vdmVsQnJvd3Nlci52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5pZiAoZ2V0UGFyYW0oXFxcImhhc1BhcmFtc1xcXCIpID09PSBcXFwidHJ1ZVxcXCIpIHtcXG4gICAgTVlfUEFSQU1TID0ge1xcbiAgICAgICAgcGF0aDogZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJwYXRoXFxcIikpLFxcbiAgICAgICAgbmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJuYW1lXFxcIikpXFxuICAgIH1cXG59XFxubGV0IHBhdGggPSBNWV9QQVJBTVMucGF0aDtcXG5zZXRQYWdlVGl0bGUoXFxcIk5WfFxcXCIgKyBNWV9QQVJBTVMubmFtZSk7XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgZm9vdDogMCxcXG4gICAgaXNSZXBsYWNlOiB0cnVlXFxufSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKSk7XFxubGV0IGlkID0gXFxcIiNcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxudmFyIGxheW91dCA9IFtdO1xcbmxldCBtb2RlID0gZ2V0TXlWYXIoXFxcIi5tb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgbW9kZTIgPSBnZXRNeVZhcihcXFwiLm1vZGUyXFxcIiwgQ29uZmlnLmRlZl9pc1BhZ2luYXRlKTtcXG5cXG5sZXQgaXNSZXZlcnNlID0gZ2V0TXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiLCBcXFwiMFxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5tb2RlXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5tb2RlMlxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIuaXNSZXZlcnNlXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5wYWdlTnVtXFxcIik7XFxufSkpO1xcblxcbmZ1bmN0aW9uIGdldFRpdGxlKHRpdGxlKSB7XFxuICAgIGxldCB0aXRsZXMgPSBUb29sLnNwbGl0KHRpdGxlLCBcXFwiJFxcXCIsIDIpO1xcbiAgICByZXR1cm4gdGl0bGVzWzJdICE9PSB1bmRlZmluZWQgPyB0aXRsZXNbMl0uc2xpY2UoMCwgdGl0bGVzWzJdLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpIDogdGl0bGU7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLliKDpmaTmlbTmnKxcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruiupOWIoOmZpOaVtOacrOWwj+ivtO+8n1xcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICBpZiAoRmlsZS5kZWxldGVGbGllcyhwYXRoKSkge1xcbiAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICB9XFxuICAgIH0sIHBhdGgpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBbXFxcIueci+Wwj+ivtFxcXCIsIFxcXCLliKDpmaTnq6DoioJcXFwiXVttb2RlXSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChtb2RlKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiLm1vZGVcXFwiLCBtb2RlID09PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH0sIG1vZGUpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCY4oCY5pu05aSa5Yqf6IO9ID7igJnigJlcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbn0pO1xcblxcbmZ1bmN0aW9uIHR4dChwYXRocykge1xcbiAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5ZCI5bm2Li4uXFxcIik7XFxuICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgIGNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcIik7XFxuICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuXFxuICAgIGxldCBmaWxlbGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aHMucGF0aCwgXFxcImZpbGVcXFwiLCBcXFwiLnR4dFxcXCIpO1xcbiAgICBsZXQgbGlzdExlbmd0aCA9IGZpbGVsaXN0Lmxlbmd0aDtcXG4gICAgaWYgKGxpc3RMZW5ndGggPT09IDApIHtcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v56m655qE56ug6IqCXFxcIjtcXG4gICAgfVxcbiAgICBjb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgc2VsZWN0ZWQ6IFtdLFxcbiAgICAgICAgaXNSZXBsYWNlOiB0cnVlXFxuICAgIH0sIEpTT04ucGFyc2UoJC5sb2cocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRocy5wYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikpIHx8IFxcXCJ7fVxcXCIpKTtcXG4gICAgbGV0IGJ1ZmlsZWxpc3QgPSBbXTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCBmaWxlID0gZmlsZWxpc3RbaV07XFxuICAgICAgICBsZXQgZmlsZUluZm8gPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcIiRcXFwiLCAyKTtcXG4gICAgICAgIGJ1ZmlsZWxpc3QucHVzaCh7XFxuICAgICAgICAgICAgbmFtZTogZmlsZUluZm9bMl0uc2xpY2UoMCwgZmlsZUluZm9bMl0ubGFzdEluZGV4T2YoXFxcIi5cXFwiKSksXFxuICAgICAgICAgICAgcGF0aDogXFxcImZpbGU6Ly9cXFwiICsgZmlsZS5wYXRoLFxcbiAgICAgICAgICAgIGlkOiBOdW1iZXIoZmlsZUluZm9bMF0pIHx8IDBcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGJ1ZmlsZWxpc3Quc29ydCgoYSwgYikgPT4gYS5pZCAtIGIuaWQpO1xcbiAgICBsZXQgZW50aXJlUGF0aCA9IHBhdGhzLnBhdGgucmVwbGFjZShDb25maWcubm92ZWxQYXRoLCBDb25maWcubm92ZWxGdWxsUGF0aCkgKyBcXFwiLnR4dFxcXCI7XFxuICAgIGxldCBlbnRpcmVQYXRodG8gPSBib29rSW5mby5pc1JlcGxhY2UgPyBlbnRpcmVQYXRoICsgXFxcIi50bXBcXFwiIDogZW50aXJlUGF0aDtcXG5cXG4gICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyBlbnRpcmVQYXRoKSkge1xcbiAgICAgICAgdG9hc3QoXFxcIuWIneWni+WMluaWh+S7tlxcXCIpO1xcbiAgICAgICAgaWYgKCFGaWxlLmRlbGV0ZUZsaWVzKGVudGlyZVBhdGgpKSB7XFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yid5aeL5YyW5aSx6LSlXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuWIneWni+WMluaIkOWKn1xcXCIpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgaXRlbSA9IGJ1ZmlsZWxpc3RbaV07XFxuICAgICAgICBsZXQgY29udGVudCA9IHJlcXVlc3QoaXRlbS5wYXRoKTtcXG4gICAgICAgIEZpbGUuZmlsZVdyaXRlQXBwZW5kKGVudGlyZVBhdGh0bywgaXRlbS5uYW1lICsgXFxcIlxcXFxu44CA44CAXFxcIiArIGNvbnRlbnQucmVwbGFjZSgvXlxcXFxzK3xcXFxccyskL2dtLCBcXFwiXFxcIikuc3BsaXQoL1xcXFxuKy8pLmpvaW4oXFxcIlxcXFxy44CA44CAXFxcIikgKyBcXFwiXFxcXG5cXFxcblxcXCIpO1xcbiAgICB9XFxuXFxuICAgIGlmIChib29rSW5mby5pc1JlcGxhY2UpIHtcXG4gICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgIGxldCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7XFxuICAgICAgICBsZXQgcmVwbGFjZVBhdHRlcm4gPSBbXFxcInJlcGxhY2VcXFwiLCBcXFwicmVwbGFjZUFsbFxcXCJdO1xcbiAgICAgICAgbGV0IGZsYWcgPSBGaWxlLmZpbGVSdWxlKGVudGlyZVBhdGh0bywgZW50aXJlUGF0aCwgKGphdmFTdHJpbmcpID0+IHtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcbiAgICAgICAgICAgICAgICBpZiAoIWJvb2tJbmZvLnNlbGVjdGVkLmluY2x1ZGVzKHJlcGxhY2VSdWxlLmlkKSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IHJlcGxhY2UgPSByZXBsYWNlUGF0dGVyblswICsgcmVwbGFjZVJ1bGUuaXNSZWdleF07XFxuICAgICAgICAgICAgICAgIGphdmFTdHJpbmcgPSBqYXZhU3RyaW5nW3JlcGxhY2VdKHJlcGxhY2VSdWxlLnBhdHRlcm4sIHJlcGxhY2VSdWxlLnJlcGxhY2VtZW50KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGphdmFTdHJpbmcuZ2V0Qnl0ZXMoKTtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5ZCI5bm25aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG5cXG4gICAgfVxcbiAgICBoaWRlTG9hZGluZygpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v5ZCI5bm25a6M5oiQXFxcIjtcXG59XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWQiOW5tuWwj+ivtFxcXCIsXFxuICAgIHVybDogJChcXFwi56Gu5a6a5ZCI5bm2P1xcXFxu5Lya6KaG55uW5bey5pyJVFhUXFxcIikuY29uZmlybSh0eHQsIE1ZX1BBUkFNUyksXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBbXFxcIuKYkOWIhumhtVxcXCIsIFxcXCLimJHliIbpobVcXFwiXVttb2RlMl0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobW9kZTIpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCIubW9kZTJcXFwiLCBtb2RlMiA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgbW9kZTIpLFxcbiAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWHgOWMllxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbEN1c3RvbS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjXFxcIixcXG4gICAgZXh0cmE6IE1ZX1BBUkFNUyxcXG4gICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLlpJbpg6jmn6XnnItcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHBhdGgpID0+IHtcXG4gICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuICAgICAgICBsZXQgZW50aXJlUGF0aCA9IHBhdGgucmVwbGFjZShDb25maWcubm92ZWxQYXRoLCBDb25maWcubm92ZWxGdWxsUGF0aCkgKyBcXFwiLnR4dFxcXCI7XFxuICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIGVudGlyZVBhdGgpKSB7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuiwg+eUqOesrOS4ieaWueW6lOeUqOaJk+W8gOaWh+S7tlxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwib3BlbkZpbGU6Ly9maWxlOi8vXFxcIiArIGVudGlyZVBhdGhcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acrOWcsOaaguaXoOWPr+S+m+WklumDqOaJk+W8gOeahHR4dOaWh+S7tu+8jOivt+WFiOWQiOW5tuWwj+ivtO+8gVxcXCJcXG4gICAgICAgIH1cXG4gICAgfSwgcGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5cXG5sZXQgbWhsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFwiZmlsZVxcXCIsIFxcXCIudHh0XFxcIik7XFxubWhsaXN0LnNvcnQoKGEsIGIpID0+IHtcXG4gICAgYSA9IChhLm5hbWUubWF0Y2goL1xcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcbiAgICBiID0gKGIubmFtZS5tYXRjaCgvXFxcXGQrLykgfHwgW10pWzBdIHx8IDA7XFxuICAgIHJldHVybiBhIC0gYjtcXG59KTtcXG5sZXQgY2hhcHRlckxpc3QgPSBbXTtcXG5sZXQgY2hhcHRlckNvdW50ID0gbWhsaXN0Lmxlbmd0aDtcXG5cXG5pZiAobW9kZTIgPT09IFxcXCIxXFxcIikge1xcbiAgICBsZXQgbWhsaXN0Q2h1bmsgPSBUb29sLmNodW5rKG1obGlzdCwgQ29uZmlnLnZpZXdQYWdlU2l6ZSk7XFxuICAgIGxldCB2aWV3UGFnZUNvdW50ID0gbWhsaXN0Q2h1bmsubGVuZ3RoO1xcbiAgICBsZXQgZGVmUGFnZSA9ICh2aWV3UGFnZUNvdW50IC0gMSA8IGJvb2tJbmZvLmZvb3QgPyAwIDogYm9va0luZm8uZm9vdCkgfHwgMDtcXG4gICAgbGV0IHBhZ2VOdW0gPSBOdW1iZXIoZ2V0TXlWYXIoXFxcIi5wYWdlTnVtXFxcIiwgXFxcIlxcXCIgKyBkZWZQYWdlKSk7XFxuICAgIGNoYXB0ZXJMaXN0ID0gbWhsaXN0Q2h1bmtbcGFnZU51bV0gfHwgW107XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLnq6DoioIgXFxcIi5iaWcoKSArIChcXFwi5pys6aG1OlxcXCIgKyBjaGFwdGVyTGlzdC5sZW5ndGggKyBcXFwiIOWFseaciTpcXFwiICsgY2hhcHRlckNvdW50ICsgXFxcIueroCDlvZPliY06XFxcIiArIChwYWdlTnVtICsgMSkgKyBcXFwiL1xcXCIgKyB2aWV3UGFnZUNvdW50KS5zbWFsbCgpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpc1JldmVyc2UpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBpc1JldmVyc2UpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIui3s+mbhlxcXCIsXFxuICAgICAgICB1cmw6ICQoY2hhcHRlckNvdW50LCBcXFwi6L6T5YWl6Lez6L2s56ug6IqCIDEtXFxcIiArIGNoYXB0ZXJDb3VudCkuaW5wdXQoKGNoYXB0ZXJDb3VudCwgcGFnZU51bSwgdmlld1BhZ2VTaXplLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gTnVtYmVyKGlucHV0KTtcXG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0TnVtKSB8fCBpbnB1dE51bSA8IDAgfHwgaW5wdXROdW0gPiBjaGFwdGVyQ291bnQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeato+ehruiMg+WbtOWGheeahOaVsOWtl1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlucHV0TnVtID0gTWF0aC5mbG9vcigoaW5wdXROdW0gKyB2aWV3UGFnZVNpemUpIC8gdmlld1BhZ2VTaXplKSAtIDE7XFxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPT09IGlucHV0TnVtKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5b2T5YmN6aG16Z2iXFxcIjtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnBhZ2VOdW1cXFwiLCBcXFwiXFxcIiArIGlucHV0TnVtKTtcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIH0sIGNoYXB0ZXJDb3VudCwgcGFnZU51bSwgQ29uZmlnLnZpZXdQYWdlU2l6ZSwgcGF0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNVxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6Lez6aG1XFxcIixcXG4gICAgICAgIHVybDogJChwYWdlTnVtICsgMSwgXFxcIui3s+i9rOmhteaVsCAxLVxcXCIgKyB2aWV3UGFnZUNvdW50KS5pbnB1dCgodmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IE51bWJlcihpbnB1dCkgLSAxO1xcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5wdXROdW0pIHx8IGlucHV0TnVtIDwgMCB8fCBpbnB1dE51bSA+IHZpZXdQYWdlQ291bnQgLSAxKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaXmraPnoa7ojIPlm7TlhoXnmoTmlbDlrZdcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAocGFnZU51bSA9PT0gaW5wdXROdW0pIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjlvZPliY3pobXpnaJcXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIucGFnZU51bVxcXCIsIFxcXCJcXFwiICsgaW5wdXROdW0pO1xcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIH0sIHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzVcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS4iuS4gOmhtVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHBhZ2VOdW0sIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSBwYWdlTnVtIC0gMTtcXG4gICAgICAgICAgICBpZiAoaW5wdXROdW0gPCAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/mmK/nrKzkuIDpobXkuoZcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnBhZ2VOdW1cXFwiLCBcXFwiXFxcIiArIGlucHV0TnVtKTtcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIHBhZ2VOdW0sIHBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzVcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS4i+S4gOmhtVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSBwYWdlTnVtICsgMTtcXG4gICAgICAgICAgICBpZiAoaW5wdXROdW0gPiB2aWV3UGFnZUNvdW50IC0gMSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5ZCO5LiA6aG15LqGXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5wYWdlTnVtXFxcIiwgXFxcIlxcXCIgKyBpbnB1dE51bSk7XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCB2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF81XFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmnKvpobVcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gdmlld1BhZ2VDb3VudCAtIDE7XFxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPT09IGlucHV0TnVtIHx8IGlucHV0TnVtID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5ZCO5LiA6aG15LqGXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5wYWdlTnVtXFxcIiwgXFxcIlxcXCIgKyBpbnB1dE51bSk7XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCB2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF81XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBjaGFwdGVyTGlzdCA9IG1obGlzdDtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIueroOiKgiBcXFwiLmJpZygpICsgKFxcXCLlhbHmnIk6XFxcIiArIGNoYXB0ZXJDb3VudCArIFxcXCLnq6BcXFwiKS5zbWFsbCgpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpc1JldmVyc2UpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBpc1JldmVyc2UpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgIH0pO1xcbn1cXG5sZXQgYXJyYXkgPSBbXTtcXG5pZiAobW9kZSA9PT0gXFxcIjBcXFwiKSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY2hhcHRlckxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0VGl0bGUoaXRlbS5uYW1lKTtcXG4gICAgICAgIGFycmF5LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbE1haW5Cb2R5I2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgsXFxuICAgICAgICAgICAgICAgIGRpclBhdGg6IHBhdGgsXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IENvbmZpZy5kZWZfVmlld19TdHlsZVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59IGVsc2Uge1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNoYXB0ZXJMaXN0KSB7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldFRpdGxlKGl0ZW0ubmFtZSk7XFxuICAgICAgICBhcnJheS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbmFtZSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIuehruiupOWIoOmZpFtcXFwiICsgbmFtZSArIFxcXCJd77yfXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGbGllcyhwYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSwgaXRlbS5wYXRoKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogQ29uZmlnLmRlZl9WaWV3X1N0eWxlXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5pZiAoaXNSZXZlcnNlID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYXJyYXkucmV2ZXJzZSgpO1xcbn1cXG5sYXlvdXQucHVzaC5hcHBseShsYXlvdXQsIGFycmF5KTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuWwj+ivtOato+aWh+mYheivu1wiLFwicGF0aFwiOlwiTm92ZWxNYWluQm9keVwiLFwicnVsZVwiOlwianM6XFxudmFyIGxheW91dCA9IFtdO1xcbmxldCBjb250ZW50ID0gcmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBNWV9QQVJBTVMucGF0aCk7XFxuLy9jb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9cXFxcbnxcXFxcci9nLCBcXFwiPGJyPlxcXCIpLnJlcGxhY2UoLygmbmJzcDspKy9nLFxcXCIgXFxcIik7XFxuY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgc2VsZWN0ZWQ6IFtdLFxcbiAgICBpc1JlcGxhY2U6IHRydWVcXG59LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgTVlfUEFSQU1TLmRpclBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKSk7XFxuXFxuaWYgKGJvb2tJbmZvLmlzUmVwbGFjZSkge1xcbiAgICBsZXQgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmcoY29udGVudCk7XFxuICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgbGV0IHJlcGxhY2VQYXR0ZXJuID0gW1xcXCJyZXBsYWNlXFxcIiwgXFxcInJlcGxhY2VBbGxcXFwiXTtcXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJ1bGVMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XFxuICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXG4gICAgICAgIGlmICghYm9va0luZm8uc2VsZWN0ZWQuaW5jbHVkZXMocmVwbGFjZVJ1bGUuaWQpKSB7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmVwbGFjZSA9IHJlcGxhY2VQYXR0ZXJuWzAgKyByZXBsYWNlUnVsZS5pc1JlZ2V4XTtcXG4gICAgICAgIGphdmFTdHJpbmcgPSBqYXZhU3RyaW5nW3JlcGxhY2VdKHJlcGxhY2VSdWxlLnBhdHRlcm4sIHJlcGxhY2VSdWxlLnJlcGxhY2VtZW50KTtcXG4gICAgfVxcbiAgICBjb250ZW50ID0gU3RyaW5nKGphdmFTdHJpbmcpO1xcbn1cXG5jb250ZW50ID0gXFxcIuOAgOOAgFxcXCIgKyBjb250ZW50LnJlcGxhY2UoL15cXFxccyt8XFxcXHMrJC9nbSwgXFxcIlxcXCIpLnNwbGl0KC9cXFxcbisvKS5qb2luKFxcXCI8YnI+44CA44CAXFxcIik7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIHRpdGxlOiAoXFxcIjxzdHJvbmc+XFxcIiArIE1ZX1BBUkFNUy50aXRsZSArIFxcXCI8L3N0cm9uZz5cXFwiKS5iaWcoKSxcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBjb250ZW50LFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0U2l6ZTogMTgsXFxuICAgICAgICBjbGljazogdHJ1ZVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJ0ZXh0XzFcIixcIm5hbWVcIjpcIiN2LuWwj+ivtOWFqOmbhuafpeeci1wiLFwicGF0aFwiOlwiTm92ZWxDb2xsZWN0ZWQudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcbmxldCBydWxlbERpciA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnLm5vdmVsRnVsbFBhdGgsIFxcXCJkaXJcXFwiKTtcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxuXFxuZnVuY3Rpb24gb3BlcmF0aW9uKHBhdGgpIHtcXG4gICAgc3dpdGNoIChpbnB1dCkge1xcbiAgICAgICAgY2FzZSBcXFwi5YiG5LqrXFxcIjpcXG4gICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICBjYXNlIFxcXCLliKDpmaRcXFwiOlxcbiAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmxpZXMocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgY2FzZSBcXFwi5rW36ZiU6aKE6KeIXFxcIjpcXG4gICAgICAgICAgICByZXR1cm4gXFxcImVkaXRGaWxlOi8vZmlsZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgY2FzZSBcXFwi5omT5byA5pa55byPXFxcIjpcXG4gICAgICAgICAgICByZXR1cm4gXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICB9XFxufVxcbmZvciAobGV0IHJ1bGVQYXRocyBvZiBydWxlbERpcikge1xcbiAgICBsZXQgbm92ZWxzID0gRmlsZS5nZXRGaWxlUGF0aChydWxlUGF0aHMucGF0aCwgXFxcImZpbGVcXFwiKTtcXG4gICAgZm9yIChsZXQgbm92ZWwgb2Ygbm92ZWxzKSB7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IG5vdmVsLm5hbWUsXFxuICAgICAgICAgICAgdXJsOiAkKFtcXFwi5YiG5LqrXFxcIiwgXFxcIuWIoOmZpFxcXCIsIFxcXCLmtbfpmJTpooTop4hcXFwiLCBcXFwi5omT5byA5pa55byPXFxcIl0sIDEpLnNlbGVjdChvcGVyYXRpb24sIG5vdmVsLnBhdGgpLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCLmnaXmupDvvJpcXFwiICsgcnVsZVBhdGhzLm5hbWUsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5pZiAobGF5b3V0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXCI+5ZWl6YO95rKh5pyJ6IC2PC9oMT4nLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn1cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuabtOWkmuiuvue9rlwiLFwicGF0aFwiOlwiU2V0dGluZy9Nb3JlLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFwiKTtcXG5cXG5jb25zdCBzZXR0aW5nVHlwZSA9IE1ZX1BBUkFNUy5zZXR0aW5nVHlwZSB8fCBnZXRQYXJhbShcXFwic2V0dGluZ1R5cGVcXFwiKTtcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGlkID0gXFxcIiNcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuc3dpdGNoIChzZXR0aW5nVHlwZSkge1xcbiAgICBjYXNlIFxcXCJjYWNoZVxcXCI6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIua4hemZpOe8k+WtmHzorr7nva5cXFwiKTtcXG4gICAgICAgIGNvbnN0IGtub3duTGlzdCA9IG5ldyBNYXAoW1xcbiAgICAgICAgICAgIFtGaWxlLmdldE5hbWUoQ29uZmlnLm5vdmVsUGF0aCksIFxcXCIj566h55CG5ZmoI+Wwj+ivtOe8k+WtmOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcIl0sXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcuY29taWNQYXRoKSwgXFxcIiPnrqHnkIblmagj5ryr55S757yT5a2Y55uu5b2VW+S4jeW7uuiurua4hemZpF1cXFwiXSxcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5ub3ZlbEZ1bGxQYXRoKSwgXFxcIiPnrqHnkIblmagj5bCP6K+05ZCI5bm255uu5b2VW+WPr+S7pea4hemZpF1cXFwiXSxcXG4gICAgICAgICAgICBbXFxcImRy56ug6IqC57yT5a2YXFxcIiwgXFxcIumBk+mVv+aooeadv+S4tOaXtue8k+WtmFvlu7rorq7muIXpmaRdXFxcIl1cXG4gICAgICAgIF0pO1xcblxcbiAgICAgICAgbGV0IGNhY2hlRGlyID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWcuaG9tZVBhdGgsIFxcXCJkaXJcXFwiKTtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFuQ2FjaGUocGF0aCkge1xcbiAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmxpZXMocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgKGxldCBjYWNoZSBvZiBjYWNoZURpcikge1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGNhY2hlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLlpKflsI/vvJpcXFwiICsgRmlsZS5nZXRGaWxlU2l6ZShjYWNoZS5wYXRoKSArIFxcXCJcXFxcbuaPj+i/sO+8mlxcXCIgKyBrbm93bkxpc3QuZ2V0KGNhY2hlLm5hbWUpIHx8IFxcXCLmnKrnn6Xnm67lvZVb6aOO6Zmp5pyq55+lXVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCLnoa7orqTmuIXpmaQgXFxcIiArIGNhY2hlLm5hbWUgKyBcXFwiID9cXFwiKS5jb25maXJtKGNsZWFuQ2FjaGUsIGNhY2hlLnBhdGgpXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLlhajpg6jmuIXpmaQoXFxcIiArIEZpbGUuZ2V0RmlsZVNpemUoQ29uZmlnLmhvbWVQYXRoKSArIFxcXCIpXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwi56Gu6K6k5riF6Zmk5YWo6YOo57yT5a2Y5pWw5o2uP1xcXCIpLmNvbmZpcm0oY2xlYW5DYWNoZSwgQ29uZmlnLmhvbWVQYXRoKVxcbiAgICAgICAgfSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSBcXFwiZGVmYXVsdFBpY1xcXCI6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIum7mOiupOWwgemdonzorr7nva5cXFwiKTtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIHNldERlZmF1bHRQaWModXJsKSB7XFxuICAgICAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgQ29uZmlnLmRlZl9QaWMgPSB1cmw7XFxuICAgICAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNDsgaSsrKSB7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWbvueJh1xcXCIgKyBpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzNcXFwiLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9waWNcXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldERlZmF1bHRQaWMsIFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX3BpY1xcXCIgKyBpKVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgXFxcInJlcGxhY2VSdWxlXFxcIjpcXG4gICAgICAgIGlmIChNWV9QQVJBTVMuaXNSZWZyZXNoKSB7XFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHJlZnJlc2hQYWdlKCkpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi5pu/5o2i6KeE5YiZfOiuvue9rlxcXCIpO1xcbiAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5paw5bu65pu/5o2iXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZWRpdFJlcGxhY2VSdWxlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/aXNOZXc9dHJ1ZVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuWvvOWHuuinhOWImVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCLnoa7orqTlr7zlh7pcXFwiICsgcnVsZUxpc3QubGVuZ3RoICsgXFxcIuadoeinhOWIme+8n1xcXFxuKHtob21lUHRhaH0vcmVwbGFjZVJ1bGUuanNvbilcXFwiKS5jb25maXJtKChudW0pID0+IHtcXG4gICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHNhdmVQdGEgPSBDb25maWcuaG9tZVBhdGggKyBcXFwiL3JlcGxhY2VSdWxlLmpzb25cXFwiO1xcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUoc2F2ZVB0YSwgcmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICAgICAgbG9nKFxcXCJcXFxcbui3r+W+hO+8mlxcXCIgKyBzYXZlUHRhICsgXFxcIlxcXFxu5a+85Ye66KeE5YiZIFxcXCIgKyBudW0gKyBcXFwiIOadoVxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vXFxcIiArIHNhdmVQdGE7XFxuICAgICAgICAgICAgfSwgcnVsZUxpc3QubGVuZ3RoKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIlxcXCIsIFxcXCLovpPlhaXop4TliJnmlofku7bot6/lvoQoKi5qc29uKVxcXCIsIFxcXCLop4TliJnlr7zlhaVcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpID8gaW5wdXQgOiBcXFwiZmlsZTovL1xcXCIgKyBpbnB1dFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZVRleHQgPSByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICAgICAgaWYgKCFydWxlVGV4dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluaWh+S7tuS4uuepulxcXCI7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UnVsZUxpc3QgPSBKU09OLnBhcnNlKHJ1bGVUZXh0KTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdDb3VudCA9IDAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291bnQgPSAwO1xcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiBuZXdSdWxlTGlzdCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdSdWxlID0gbmV3UnVsZUxpc3RbaV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW5ld1J1bGUuaGFzT3duUHJvcGVydHkoXFxcInJlcGxhY2VtZW50XFxcIil8fCFuZXdSdWxlLmhhc093blByb3BlcnR5KFxcXCJwYXR0ZXJuXFxcIil8fCFuZXdSdWxlLmhhc093blByb3BlcnR5KFxcXCJuYW1lXFxcIil8fChuZXdSdWxlLnNjb3BlQ29udGVudD09PXVuZGVmaW5lZD9mYWxzZTohbmV3UnVsZS5zY29wZUNvbnRlbnQpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZCA9IG5ld1J1bGUuaWQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UnVsZS5pZCA9IGlkIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZEluZGV4ID0gcnVsZUxpc3QuZmluZEluZGV4KHJ1bGUgPT4gcnVsZS5pZCA9PT0gaWQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEluZGV4ID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291bnQrKztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUxpc3Quc3BsaWNlKGlkSW5kZXgsIDEsIG5ld1J1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50Kys7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVMaXN0LnB1c2gobmV3UnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShydWxlTGlzdCkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwiXFxcXG7ot6/lvoTvvJpcXFwiICsgaW5wdXQgKyBcXFwiXFxcXG7mgLvop4TliJnmlbDvvJpcXFwiICsgbmV3UnVsZUxpc3QubGVuZ3RoICsgXFxcIlxcXFxu5pu05paw6KeE5YiZIFxcXCIgKyB1cGRhdGVDb3VudCArIFxcXCIg5p2hXFxcXHTmlrDlop7op4TliJkgXFxcIiArIG5ld0NvdW50ICsgXFxcIiDmnaFcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr7zlhaXmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr7zlhaXlpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcbiAgICAgICAgICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHJlcGxhY2VSdWxlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZyA9IHJ1bGVMaXN0LnNwbGljZShpbmRleCwgMSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxuICAgICAgICAgICAgICAgICAgICAvL2RlbGV0ZUl0ZW1CeUNscyhpZCArIFxcXCIuXFxcIiArIGluZGV4KTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLliKDpmaTmiJDlip9cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIGlkLCBpKSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiLlxcXCIgKyBpXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnvJbovpFcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZWRpdFJlcGxhY2VSdWxlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/aW5kZXg9XFxcIiArIGksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiLlxcXCIgKyBpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSBcXFwiY29udGVudHNcXFwiOlxcbiAgICAgICAgbGV0IGYgPSByZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00NTAzXFxcIik7XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuebruW9leiuvue9rnzorr7nva5cXFwiKTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIumAieaLqeaWh+S7tuWkuVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShpZCkuZXh0cmE7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgICAgICAgICB9LGlkKSxcXG4gICAgICAgICAgICAgICAgcGF0dGVybjogMVxcbiAgICAgICAgICAgIH0pKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgICAgICBkZXNjOiBcXFwi5pSv5oyBaGlrZXI6Ly9maWxlc+i3r+W+hCjor6Xmk43kvZzkuI3kvJrliJ3lp4vljJbnm67lvZUpXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IENvbmZpZy5ob21lUGF0aCxcXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihpZCwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9LCBpZCksXFxuICAgICAgICAgICAgICAgIGlkOmlkXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLnoa7orqRcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZ2V0TXlWYXIoaWQsIGZpbmRJdGVtKGlkKS5leHRyYS5kZWZhdWx0VmFsdWUgfHwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKSkgaW5wdXQgPSBnZXRQYXRoKGlucHV0KS5zbGljZSg3KTtcXG4gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ob21lUGF0aCA9PSBpbnB1dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+aYr+W9k+WJjeebruW9lVxcXCI7XFxuICAgICAgICAgICAgICAgIENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgICAgIENvbmZpZy5ob21lUGF0aCA9IGlucHV0O1xcbiAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpKTtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5L+d5a2YXFxcIjtcXG4gICAgICAgICAgICB9LCBpZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgYnJlYWs7XFxufVxcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu57yW6L6R5pu/5o2i6KeE5YiZXCIsXCJwYXRoXCI6XCJlZGl0UmVwbGFjZVJ1bGUudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgaXNOZXcgPSBNWV9QQVJBTVMuaXNOZXcgfHwgZ2V0UGFyYW0oXFxcImlzTmV3XFxcIik7XFxuY29uc3QgaW5kZXggPSBNWV9QQVJBTVMuaW5kZXggfHwgTnVtYmVyKGdldFBhcmFtKFxcXCJpbmRleFxcXCIpKTtcXG5sZXQgbGF5b3V0ID0gW107XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5uYW1lXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5yZXBsYWNlbWVudFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmZpcnN0XFxcIik7XFxuICAgIC8vY2xlYXJNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5zY29wZVxcXCIpO1xcbn0pKTtcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxubGV0IGlkID0gXFxcIiNcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuLy9sZXQgcmVwbGFjZVJ1bGUgPSBpc05ldyA9PSBcXFwidHJ1ZVxcXCI/e306cnVsZUxpc3RbaW5kZXhdO1xcbmlmIChpc05ldyA9PSBcXFwidHJ1ZVxcXCIpIHtcXG4gICAgcmVwbGFjZVJ1bGUgPSB7XFxuICAgICAgICBpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksXFxuICAgICAgICBpc1JlZ2V4OiBmYWxzZSxcXG4gICAgfVxcbn0gZWxzZSB7XFxuICAgIHJlcGxhY2VSdWxlID0gcnVsZUxpc3RbaW5kZXhdO1xcbn1cXG4vL+mmluasoeWIneWni+WMllxcbmlmKGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmZpcnN0XFxcIixcXFwiXFxcIik9PVxcXCJcXFwiKXtcXG4gICAgcHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXCIsIFxcXCJcXFwiICsgcmVwbGFjZVJ1bGUuaXNSZWdleCk7XFxuICAgIHB1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmZpcnN0XFxcIixcXFwiMVxcXCIpO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5ou36LSdXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCBhdHQgPSBbXFxcIm5hbWVcXFwiLCBcXFwiaXNSZWdleFxcXCIsIFxcXCJwYXR0ZXJuXFxcIiwgXFxcInJlcGxhY2VtZW50XFxcIl07XFxuICAgICAgICBsZXQganNvbiA9IHt9O1xcbiAgICAgICAgYXR0LmZvckVhY2goa2V5ID0+IHtcXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5cXFwiICsga2V5LCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgaWYgKGtleSA9PT0gXFxcImlzUmVnZXhcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IFxcXCJ0cnVlXFxcIiA/IHRydWUgOiBmYWxzZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAganNvbltrZXldID0gdmFsdWU7XFxuICAgICAgICB9KTtcXG4gICAgICAgIGNvcHkoSlNPTi5zdHJpbmdpZnkoanNvbikpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLnspjotLRcXFwiLFxcbiAgICB1cmw6ICQoXFxcInt7Y2xpcGJvYXJkfX1cXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShpbnB1dCk7XFxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikgfHwganNvbi5wYXR0ZXJuID09IHVuZGVmaW5lZCkgcmV0dXJuO1xcbiAgICAgICAgICAgIGxldCBhdHQgPSBbXFxcIm5hbWVcXFwiLCBcXFwiaXNSZWdleFxcXCIsIFxcXCJwYXR0ZXJuXFxcIiwgXFxcInJlcGxhY2VtZW50XFxcIl07XFxuICAgICAgICAgICAgYXR0LmZvckVhY2goa2V5ID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuXFxcIiArIGtleSwgU3RyaW5nKGpzb25ba2V5XSkpO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLmm7/mjaLop4TliJnlkI3np7BcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXCIsIHJlcGxhY2VSdWxlLm5hbWUpLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5uYW1lXFxcIixpbnB1dCk7J1xcbiAgICB9XFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuabv+aNouinhOWImVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogLTEsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFwiLCByZXBsYWNlUnVsZS5wYXR0ZXJuKSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucGF0dGVyblxcXCIsIGlucHV0KTsnXFxuICAgIH1cXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5piv5ZCm5L2/55So5q2j5YiZ6KGo6L6+5byP77yaXFxcIiArIGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFwiKSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgbGV0IGlzUmVnZXggPSBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcIikgPT09IFxcXCJ0cnVlXFxcIiA/IGZhbHNlIDogdHJ1ZTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBpZFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmmK/lkKbkvb/nlKjmraPliJnooajovr7lvI/vvJpcXFwiICsgaXNSZWdleFxcbiAgICAgICAgfSk7XFxuICAgICAgICBwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcIiwgXFxcIlxcXCIgKyBpc1JlZ2V4KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIGlkKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IGlkXFxuICAgIH1cXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5pu/5o2i5Li6XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAtMSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucmVwbGFjZW1lbnRcXFwiLCByZXBsYWNlUnVsZS5yZXBsYWNlbWVudCksXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcIixpbnB1dCk7J1xcbiAgICB9XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocmVwbGFjZVJ1bGUsIGlzTmV3LCBpbmRleCkgPT4ge1xcbiAgICAgICAgbGV0IHBhdHRlcm4gPSBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKCFwYXR0ZXJuKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+abv+aNouinhOWImeS4jeiDveS4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBPYmplY3QuYXNzaWduKHJlcGxhY2VSdWxlLCB7XFxuICAgICAgICAgICAgbmFtZTogZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBpc1JlZ2V4OiBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcIikgPT09IFxcXCJ0cnVlXFxcIiA/IHRydWUgOiBmYWxzZSxcXG4gICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLFxcbiAgICAgICAgICAgIHJlcGxhY2VtZW50OiBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5yZXBsYWNlbWVudFxcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICBpZiAoaXNOZXcgPT0gXFxcInRydWVcXFwiKSB7XFxuICAgICAgICAgICAgcnVsZUxpc3QucHVzaChyZXBsYWNlUnVsZSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJ1bGVMaXN0LnNwbGljZShpbmRleCwgMSwgcmVwbGFjZVJ1bGUpO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2F2ZUZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShydWxlTGlzdCkpO1xcbiAgICAgICAgYmFjaygpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/neWtmOaIkOWKn1xcXCI7XFxuICAgIH0sIHJlcGxhY2VSdWxlLCBpc05ldywgaW5kZXgpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbn0pO1xcblxcbi8qXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuabv+aNouiMg+WbtFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogLTEsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5zY29wZVxcXCIsaW5wdXQpOydcXG4gICAgfVxcbn0pO1xcblxcbiovXFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7lsI/or7TkuKrmgKfljJblh4DljJZcIixcInBhdGhcIjpcIk5vdmVsQ3VzdG9tLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5pu/5o2i6KeE5YiZfFxcXCIgKyBNWV9QQVJBTVMubmFtZSk7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbmxldCBpZCA9IFxcXCIjXFxcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcblxcbmNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgIGZvb3Q6IDAsXFxuICAgIGlzUmVwbGFjZTogdHJ1ZSxcXG4gICAgc2VsZWN0ZWQ6IFtdXFxufSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIE1ZX1BBUkFNUy5wYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcblxcbmxldCBsYXlvdXQgPSBbXTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBbXFxcIuKYkOWHgOWMllxcXCIsIFxcXCLimJHlh4DljJZcXFwiXVswICsgYm9va0luZm8uaXNSZXBsYWNlXSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgkaWQsIHBhdGgpID0+IHtcXG5cXG4gICAgICAgIHZhciBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICBsZXQgaXNSZXBsYWNlID0gYm9va0luZm8uaXNSZXBsYWNlPT09dW5kZWZpbmVkP3RydWU6Ym9va0luZm8uaXNSZXBsYWNlO1xcbiAgICAgICAgYm9va0luZm8uaXNSZXBsYWNlID0gIWlzUmVwbGFjZTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oJGlkLCB7XFxuICAgICAgICAgICAgdGl0bGU6IGlzUmVwbGFjZSA/IFxcXCLimJDlh4DljJZcXFwiIDogXFxcIuKYkeWHgOWMllxcXCIsXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIGlkICsgXFxcIiMtMVxcXCIsIE1ZX1BBUkFNUy5wYXRoKSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBpZCArIFxcXCIjLTFcXFwiXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLnvJbovpHop4TliJlcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/c2V0dGluZ1R5cGU9cmVwbGFjZVJ1bGVcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgIGV4dHJhOntcXG4gICAgICAgIGlzUmVmcmVzaDogdHJ1ZVxcbiAgICB9XFxufSk7XFxuZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJ1bGVMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XFxuICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcbiAgICBsZXQgaXNUcnVlID0gYm9va0luZm8uc2VsZWN0ZWQuaW5jbHVkZXMocmVwbGFjZVJ1bGUuaWQpO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogKGlzVHJ1ZSA/IFxcXCLil49cXFwiIDogXFxcIuKXi1xcXCIpICsgcmVwbGFjZVJ1bGUubmFtZSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgeTogMCxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaXNUcnVlOiBpc1RydWUsXFxuICAgICAgICAgICAgaWQ6IGlkICsgaSxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5byA5ZCvXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoJGlkLCByZXBsYWNlUnVsZSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChmaW5kSXRlbSgkaWQpLmV4dHJhLmlzVHJ1ZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5byA5ZCvXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IFtdXFxuICAgICAgICAgICAgfSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKSk7XFxuICAgICAgICAgICAgYm9va0luZm8uc2VsZWN0ZWQucHVzaChyZXBsYWNlUnVsZS5pZCk7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSgkaWQsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLil49cXFwiICsgcmVwbGFjZVJ1bGUubmFtZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlzVHJ1ZTogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiAkaWQsXFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaWQgKyBpLCByZXBsYWNlUnVsZSwgTVlfUEFSQU1TLnBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWFs+mXrVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCRpZCwgcmVwbGFjZVJ1bGUsIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBpZiAoIWZpbmRJdGVtKCRpZCkuZXh0cmEuaXNUcnVlKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LlhbPpl61cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogW11cXG4gICAgICAgICAgICB9LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpKTtcXG4gICAgICAgICAgICBib29rSW5mby5zZWxlY3RlZC5zcGxpY2UoYm9va0luZm8uc2VsZWN0ZWQuaW5kZXhPZihyZXBsYWNlUnVsZS5pZCksIDEpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oJGlkLCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4peLXFxcIiArIHJlcGxhY2VSdWxlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpc1RydWU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICRpZCxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpZCArIGksIHJlcGxhY2VSdWxlLCBNWV9QQVJBTVMucGF0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxufVxcblxcbnNldFJlc3VsdChsYXlvdXQpO1wifV0sXCJwYXJhbXNcIjpcIntcXFwibGluZVZpc2libGVcXFwiOmZhbHNlfVwiLFwic2F2ZWRcIjpmYWxzZSxcInRpdGxlXCI6XCLmnKzlnLDotYTmupDnrqHnkIZcIixcInZlcnNpb25cIjowLFwidXJsXCI6XCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/c2V0dGluZ1R5cGU9cmVwbGFjZVJ1bGVcIixcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJmaW5kX3J1bGVcIjpcImpzOlxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFwiKTtcXG5cXG5jb25zdCBzZXR0aW5nVHlwZSA9IE1ZX1BBUkFNUy5zZXR0aW5nVHlwZSB8fCBnZXRQYXJhbShcXFwic2V0dGluZ1R5cGVcXFwiKTtcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGlkID0gXFxcIiNcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuc3dpdGNoIChzZXR0aW5nVHlwZSkge1xcbiAgICBjYXNlIFxcXCJjYWNoZVxcXCI6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIua4hemZpOe8k+WtmHzorr7nva5cXFwiKTtcXG4gICAgICAgIGNvbnN0IGtub3duTGlzdCA9IG5ldyBNYXAoW1xcbiAgICAgICAgICAgIFtGaWxlLmdldE5hbWUoQ29uZmlnLm5vdmVsUGF0aCksIFxcXCIj566h55CG5ZmoI+Wwj+ivtOe8k+WtmOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcIl0sXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcuY29taWNQYXRoKSwgXFxcIiPnrqHnkIblmagj5ryr55S757yT5a2Y55uu5b2VW+S4jeW7uuiurua4hemZpF1cXFwiXSxcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5ub3ZlbEZ1bGxQYXRoKSwgXFxcIiPnrqHnkIblmagj5bCP6K+05ZCI5bm255uu5b2VW+WPr+S7pea4hemZpF1cXFwiXSxcXG4gICAgICAgICAgICBbXFxcImRy56ug6IqC57yT5a2YXFxcIiwgXFxcIumBk+mVv+aooeadv+S4tOaXtue8k+WtmFvlu7rorq7muIXpmaRdXFxcIl1cXG4gICAgICAgIF0pO1xcblxcbiAgICAgICAgbGV0IGNhY2hlRGlyID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWcuaG9tZVBhdGgsIFxcXCJkaXJcXFwiKTtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFuQ2FjaGUocGF0aCkge1xcbiAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmxpZXMocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgKGxldCBjYWNoZSBvZiBjYWNoZURpcikge1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGNhY2hlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLlpKflsI/vvJpcXFwiICsgRmlsZS5nZXRGaWxlU2l6ZShjYWNoZS5wYXRoKSArIFxcXCJcXFxcbuaPj+i/sO+8mlxcXCIgKyBrbm93bkxpc3QuZ2V0KGNhY2hlLm5hbWUpIHx8IFxcXCLmnKrnn6Xnm67lvZVb6aOO6Zmp5pyq55+lXVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCLnoa7orqTmuIXpmaQgXFxcIiArIGNhY2hlLm5hbWUgKyBcXFwiID9cXFwiKS5jb25maXJtKGNsZWFuQ2FjaGUsIGNhY2hlLnBhdGgpXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLlhajpg6jmuIXpmaQoXFxcIiArIEZpbGUuZ2V0RmlsZVNpemUoQ29uZmlnLmhvbWVQYXRoKSArIFxcXCIpXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwi56Gu6K6k5riF6Zmk5YWo6YOo57yT5a2Y5pWw5o2uP1xcXCIpLmNvbmZpcm0oY2xlYW5DYWNoZSwgQ29uZmlnLmhvbWVQYXRoKVxcbiAgICAgICAgfSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSBcXFwiZGVmYXVsdFBpY1xcXCI6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIum7mOiupOWwgemdonzorr7nva5cXFwiKTtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIHNldERlZmF1bHRQaWModXJsKSB7XFxuICAgICAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgQ29uZmlnLmRlZl9QaWMgPSB1cmw7XFxuICAgICAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNDsgaSsrKSB7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWbvueJh1xcXCIgKyBpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzNcXFwiLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9waWNcXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldERlZmF1bHRQaWMsIFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX3BpY1xcXCIgKyBpKVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgXFxcInJlcGxhY2VSdWxlXFxcIjpcXG4gICAgICAgIGlmIChNWV9QQVJBTVMuaXNSZWZyZXNoKSB7XFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHJlZnJlc2hQYWdlKCkpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi5pu/5o2i6KeE5YiZfOiuvue9rlxcXCIpO1xcbiAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5paw5bu65pu/5o2iXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZWRpdFJlcGxhY2VSdWxlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/aXNOZXc9dHJ1ZVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuWvvOWHuuinhOWImVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCLnoa7orqTlr7zlh7pcXFwiICsgcnVsZUxpc3QubGVuZ3RoICsgXFxcIuadoeinhOWIme+8n1xcXFxuKHtob21lUHRhaH0vcmVwbGFjZVJ1bGUuanNvbilcXFwiKS5jb25maXJtKChudW0pID0+IHtcXG4gICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHNhdmVQdGEgPSBDb25maWcuaG9tZVBhdGggKyBcXFwiL3JlcGxhY2VSdWxlLmpzb25cXFwiO1xcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUoc2F2ZVB0YSwgcmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICAgICAgbG9nKFxcXCJcXFxcbui3r+W+hO+8mlxcXCIgKyBzYXZlUHRhICsgXFxcIlxcXFxu5a+85Ye66KeE5YiZIFxcXCIgKyBudW0gKyBcXFwiIOadoVxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vXFxcIiArIHNhdmVQdGE7XFxuICAgICAgICAgICAgfSwgcnVsZUxpc3QubGVuZ3RoKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIlxcXCIsIFxcXCLovpPlhaXop4TliJnmlofku7bot6/lvoQoKi5qc29uKVxcXCIsIFxcXCLop4TliJnlr7zlhaVcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpID8gaW5wdXQgOiBcXFwiZmlsZTovL1xcXCIgKyBpbnB1dFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZVRleHQgPSByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICAgICAgaWYgKCFydWxlVGV4dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluaWh+S7tuS4uuepulxcXCI7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UnVsZUxpc3QgPSBKU09OLnBhcnNlKHJ1bGVUZXh0KTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdDb3VudCA9IDAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291bnQgPSAwO1xcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiBuZXdSdWxlTGlzdCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdSdWxlID0gbmV3UnVsZUxpc3RbaV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW5ld1J1bGUuaGFzT3duUHJvcGVydHkoXFxcInJlcGxhY2VtZW50XFxcIil8fCFuZXdSdWxlLmhhc093blByb3BlcnR5KFxcXCJwYXR0ZXJuXFxcIil8fCFuZXdSdWxlLmhhc093blByb3BlcnR5KFxcXCJuYW1lXFxcIil8fChuZXdSdWxlLnNjb3BlQ29udGVudD09PXVuZGVmaW5lZD9mYWxzZTohbmV3UnVsZS5zY29wZUNvbnRlbnQpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZCA9IG5ld1J1bGUuaWQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UnVsZS5pZCA9IGlkIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZEluZGV4ID0gcnVsZUxpc3QuZmluZEluZGV4KHJ1bGUgPT4gcnVsZS5pZCA9PT0gaWQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEluZGV4ID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291bnQrKztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUxpc3Quc3BsaWNlKGlkSW5kZXgsIDEsIG5ld1J1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50Kys7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVMaXN0LnB1c2gobmV3UnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShydWxlTGlzdCkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwiXFxcXG7ot6/lvoTvvJpcXFwiICsgaW5wdXQgKyBcXFwiXFxcXG7mgLvop4TliJnmlbDvvJpcXFwiICsgbmV3UnVsZUxpc3QubGVuZ3RoICsgXFxcIlxcXFxu5pu05paw6KeE5YiZIFxcXCIgKyB1cGRhdGVDb3VudCArIFxcXCIg5p2hXFxcXHTmlrDlop7op4TliJkgXFxcIiArIG5ld0NvdW50ICsgXFxcIiDmnaFcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr7zlhaXmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr7zlhaXlpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcbiAgICAgICAgICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHJlcGxhY2VSdWxlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZyA9IHJ1bGVMaXN0LnNwbGljZShpbmRleCwgMSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxuICAgICAgICAgICAgICAgICAgICAvL2RlbGV0ZUl0ZW1CeUNscyhpZCArIFxcXCIuXFxcIiArIGluZGV4KTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLliKDpmaTmiJDlip9cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIGlkLCBpKSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiLlxcXCIgKyBpXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnvJbovpFcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZWRpdFJlcGxhY2VSdWxlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/aW5kZXg9XFxcIiArIGksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiLlxcXCIgKyBpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSBcXFwiY29udGVudHNcXFwiOlxcbiAgICAgICAgbGV0IGYgPSByZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00NTAzXFxcIik7XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuebruW9leiuvue9rnzorr7nva5cXFwiKTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIumAieaLqeaWh+S7tuWkuVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShpZCkuZXh0cmE7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgICAgICAgICB9LGlkKSxcXG4gICAgICAgICAgICAgICAgcGF0dGVybjogMVxcbiAgICAgICAgICAgIH0pKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgICAgICBkZXNjOiBcXFwi5pSv5oyBaGlrZXI6Ly9maWxlc+i3r+W+hCjor6Xmk43kvZzkuI3kvJrliJ3lp4vljJbnm67lvZUpXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IENvbmZpZy5ob21lUGF0aCxcXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihpZCwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9LCBpZCksXFxuICAgICAgICAgICAgICAgIGlkOmlkXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLnoa7orqRcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZ2V0TXlWYXIoaWQsIGZpbmRJdGVtKGlkKS5leHRyYS5kZWZhdWx0VmFsdWUgfHwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKSkgaW5wdXQgPSBnZXRQYXRoKGlucHV0KS5zbGljZSg3KTtcXG4gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ob21lUGF0aCA9PSBpbnB1dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+aYr+W9k+WJjeebruW9lVxcXCI7XFxuICAgICAgICAgICAgICAgIENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgICAgIENvbmZpZy5ob21lUGF0aCA9IGlucHV0O1xcbiAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpKTtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5L+d5a2YXFxcIjtcXG4gICAgICAgICAgICB9LCBpZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgYnJlYWs7XFxufVxcbnNldFJlc3VsdChsYXlvdXQpO1wiLFwiZ3JvdXBcIjpcIuKRoOaOqOiNkFwiLFwidWFcIjpcIm1vYmlsZVwiLFwicHJlUnVsZVwiOlwiXCIsXCJwYWdlc1wiOlwiW3tcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiNmLkZpbGXlt6XlhbdcXFwiLFxcXCJwYXRoXFxcIjpcXFwiRmlsZS5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBGaWxlID0gamF2YS5pby5GaWxlO1xcXFxuY29uc3Qge1xcXFxuICAgIEZpbGVzLFxcXFxuICAgIFBhdGhzLFxcXFxuICAgIFN0YW5kYXJkQ29weU9wdGlvbixcXFxcbiAgICBTdGFuZGFyZE9wZW5PcHRpb25cXFxcbn0gPSBqYXZhLm5pby5maWxlO1xcXFxuY29uc3QgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmc7XFxcXG5sZXQgamF2YVNjb3BlID0gbmV3IEphdmFJbXBvcnRlcihqYXZhLmlvLCBqYXZhLmxhbmcsIGphdmEubGFuZy5yZWZsZWN0LCBqYXZhLnV0aWwuVmVjdG9yKTtcXFxcblxcXFxuZnVuY3Rpb24gZGVsZXRlRmxpZXMoZmlsZU5hbWUpIHtcXFxcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTtcXFxcbiAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHtcXFxcbiAgICAgICAgLy9sb2coXFxcXFxcXCLliKDpmaTmlofku7blpLHotKXvvJpcXFxcXFxcIiArIGZpbGVOYW1lICsgXFxcXFxcXCLmlofku7bkuI3lrZjlnKhcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBpZiAoZmlsZS5pc0ZpbGUoKSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGUoZmlsZU5hbWUpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZURpcmVjdG9yeShmaWxlTmFtZSk7XFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgIH1cXFxcblxcXFxufVxcXFxuLyoqXFxcXG4gKiDliKDpmaTljZXkuKrmlofku7ZcXFxcbiAqIFxcXFxuICogQHBhcmFtIGZpbGVOYW1lXFxcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOaWh+S7tueahOaWh+S7tuWQjVxcXFxuICogQHJldHVybiDljZXkuKrmlofku7bliKDpmaTmiJDlip/ov5Tlm550cnVlLOWQpuWImei/lOWbnmZhbHNlXFxcXG4gKi9cXFxcbmZ1bmN0aW9uIGRlbGV0ZUZpbGUoZmlsZU5hbWUpIHtcXFxcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTtcXFxcbiAgICBpZiAoZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgIGZpbGUuZGVsZXRlKCk7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcXFxcXCIgKyBmaWxlTmFtZSArIFxcXFxcXFwi5oiQ5Yqf77yBXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICAvL2xvZyhcXFxcXFxcIuWIoOmZpOWNleS4quaWh+S7tlxcXFxcXFwiICsgZmlsZU5hbWUgKyBcXFxcXFxcIuWksei0pe+8gVxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgIH1cXFxcblxcXFxufVxcXFxuLyoqXFxcXG4gKiDliKDpmaTnm67lvZXvvIjmlofku7blpLnvvInku6Xlj4rnm67lvZXkuIvnmoTmlofku7ZcXFxcbiAqIFxcXFxuICogQHBhcmFtIGRpclxcXFxuICogICAgICAgICAgICDooqvliKDpmaTnm67lvZXnmoTmlofku7bot6/lvoRcXFxcbiAqIEByZXR1cm4g55uu5b2V5Yig6Zmk5oiQ5Yqf6L+U5ZuedHJ1ZSzlkKbliJnov5Tlm55mYWxzZVxcXFxuICovXFxcXG5mdW5jdGlvbiBkZWxldGVEaXJlY3RvcnkoZGlyKSB7XFxcXG4gICAgLy8g5aaC5p6cZGly5LiN5Lul5paH5Lu25YiG6ZqU56ym57uT5bC+77yM6Ieq5Yqo5re75Yqg5paH5Lu25YiG6ZqU56ymXFxcXG4gICAgaWYgKCFkaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7XFxcXG4gICAgICAgIGRpciA9IGRpciArIEZpbGUuc2VwYXJhdG9yO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgZGlyRmlsZSA9IG5ldyBGaWxlKGRpcik7XFxcXG4gICAgLy8g5aaC5p6cZGly5a+55bqU55qE5paH5Lu25LiN5a2Y5Zyo77yM5oiW6ICF5LiN5piv5LiA5Liq55uu5b2V77yM5YiZ6YCA5Ye6XFxcXG4gICAgaWYgKCFkaXJGaWxlLmV4aXN0cygpIHx8ICFkaXJGaWxlLmlzRGlyZWN0b3J5KCkpIHtcXFxcbiAgICAgICAgLy9sb2coXFxcXFxcXCLliKDpmaTnm67lvZXlpLHotKVcXFxcXFxcIiArIGRpciArIFxcXFxcXFwi55uu5b2V5LiN5a2Y5Zyo77yBXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxuICAgIGxldCBmbGFnID0gdHJ1ZTtcXFxcbiAgICAvLyDliKDpmaTmlofku7blpLnkuIvnmoTmiYDmnInmlofku7Yo5YyF5ous5a2Q55uu5b2VKVxcXFxuICAgIGxldCBmaWxlcyA9IGRpckZpbGUubGlzdEZpbGVzKCk7XFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAvLyDliKDpmaTlrZDmlofku7ZcXFxcbiAgICAgICAgaWYgKGZpbGVzW2ldLmlzRmlsZSgpKSB7XFxcXG4gICAgICAgICAgICBmbGFnID0gZGVsZXRlRmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7XFxcXG4gICAgICAgICAgICBpZiAoIWZsYWcpIHtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHsgLy8g5Yig6Zmk5a2Q55uu5b2VXFxcXG4gICAgICAgICAgICBmbGFnID0gZGVsZXRlRGlyZWN0b3J5KGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpKTtcXFxcbiAgICAgICAgICAgIGlmICghZmxhZykge1xcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGlmICghZmxhZykge1xcXFxuICAgICAgICAvL2xvZyhcXFxcXFxcIuWIoOmZpOebruW9leWksei0pVxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgIH1cXFxcbiAgICAvLyDliKDpmaTlvZPliY3nm67lvZVcXFxcbiAgICBpZiAoZGlyRmlsZS5kZWxldGUoKSkge1xcXFxuICAgICAgICAvL2xvZyhcXFxcXFxcIuWIoOmZpOebruW9lVxcXFxcXFwiICsgZGlyICsgXFxcXFxcXCLmiJDlip/vvIFcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5Yig6Zmk55uu5b2VXFxcXFxcXCIgKyBkaXIgKyBcXFxcXFxcIuWksei0pe+8gVxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0RmlsZVRpbWUocGF0aCkge1xcXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUocGF0aCk7XFxcXG4gICAgbGV0IGxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7XFxcXG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShsYXN0TW9kaWZpZWQpO1xcXFxuICAgIHJldHVybiBkYXRlLmdldFRpbWUoKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0TmFtZShwYXRoKSB7XFxcXG4gICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldE5hbWUoKSArIFxcXFxcXFwiXFxcXFxcXCI7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldEZpbGVQYXRoKHBhdGgsIHR5cGUsIGV4cGFuZCkge1xcXFxuICAgIHR5cGUgPSB0eXBlIHx8IFxcXFxcXFwiZmlsZVxcXFxcXFwiO1xcXFxuICAgIGlmICghW1xcXFxcXFwiZmlsZVxcXFxcXFwiLCBcXFxcXFxcImRpclxcXFxcXFwiXS5pbmNsdWRlcyh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi57G75Z6L6ZSZ6K+vXFxcXFxcXCIpO1xcXFxuICAgIGxldCBmaWxlVHlwZSA9IHR5cGUgPT09IFxcXFxcXFwiZmlsZVxcXFxcXFwiID8gXFxcXFxcXCJpc0ZpbGVcXFxcXFxcIiA6IFxcXFxcXFwiaXNEaXJlY3RvcnlcXFxcXFxcIjtcXFxcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKHBhdGgpO1xcXFxuICAgIGxldCBhcnJheSA9IGZpbGUubGlzdEZpbGVzKCkgfHwgW107XFxcXG4gICAgbGV0IHBhdGhMaXN0ID0gW107XFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICBpZiAoYXJyYXlbaV1bZmlsZVR5cGVdKCkpIHtcXFxcbiAgICAgICAgICAgIHBhdGhMaXN0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIG5hbWU6IGFycmF5W2ldLmdldE5hbWUoKSArIFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgcGF0aDogYXJyYXlbaV0uZ2V0UGF0aCgpICsgXFxcXFxcXCJcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgaWYgKGV4cGFuZCkge1xcXFxuICAgICAgICBwYXRoTGlzdCA9IHBhdGhMaXN0LmZpbHRlcihpdCA9PiBpdC5uYW1lLmVuZHNXaXRoKGV4cGFuZCkpO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gcGF0aExpc3Q7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHJlbmFtZUZpbGUoZnJvbVBhdGgsIG5hbWUpIHtcXFxcbiAgICBsZXQgZnJvbUZpbGUgPSBuZXcgRmlsZShmcm9tUGF0aCk7XFxcXG4gICAgbGV0IHRvRmlsZSA9IG5ldyBGaWxlKGZyb21GaWxlLmdldFBhcmVudCgpICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBuYW1lKTtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBpZiAoIWZyb21GaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHRvRmlsZS5leGlzdHMoKSkge1xcXFxuICAgICAgICAgICAgaWYgKCFkZWxldGVGbGllcyh0b1BhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIEZpbGVzLm1vdmUoZnJvbUZpbGUudG9QYXRoKCksIHRvRmlsZS50b1BhdGgoKSwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpO1xcXFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBtb3ZlRmlsZXMoZnJvbVBhdGgsIHRvUGF0aCkge1xcXFxuICAgIGxldCBmcm9tRmlsZSA9IG5ldyBGaWxlKGZyb21QYXRoKTtcXFxcbiAgICBsZXQgdG9GaWxlID0gbmV3IEZpbGUodG9QYXRoKTtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBpZiAoIWZyb21GaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHRvRmlsZS5leGlzdHMoKSkge1xcXFxuICAgICAgICAgICAgaWYgKCFkZWxldGVGbGllcyh0b1BhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIEZpbGVzLm1vdmUoZnJvbUZpbGUudG9QYXRoKCksIHRvRmlsZS50b1BhdGgoKSwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpO1xcXFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBmaWxlV3JpdGUocGF0aCwgY29udGVudCkge1xcXFxuICAgIHdyaXRlRmlsZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGgsIGNvbnRlbnQpXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGZpbGVXcml0ZUFwcGVuZChwYXRoLCBjb250ZW50KSB7XFxcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShwYXRoKTtcXFxcbiAgICBsZXQgcGF0aHMgPSBmaWxlLnRvUGF0aCgpO1xcXFxuICAgIGlmIChmaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgIEZpbGVzLndyaXRlKHBhdGhzLCBuZXcgamF2YVN0cmluZyhjb250ZW50KS5nZXRCeXRlcygpLCBTdGFuZGFyZE9wZW5PcHRpb24uQVBQRU5EKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoLCBjb250ZW50KTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldFRvdGFsU2l6ZU9mRmlsZXNJbkRpcihmaWxlKSB7XFxcXG4gICAgaWYgKGZpbGUuaXNGaWxlKCkpIHtcXFxcbiAgICAgICAgcmV0dXJuIGZpbGUubGVuZ3RoKCk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7XFxcXG4gICAgbGV0IHRvdGFsID0gMDtcXFxcbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xcXFxuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xcXFxuICAgICAgICAgICAgdG90YWwgKz0gZ2V0VG90YWxTaXplT2ZGaWxlc0luRGlyKGNoaWxkKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gdG90YWw7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldEZpbGVTaXplKGZpbGVQYXRoKSB7XFxcXG4gICAgLy9CeXRlXFxcXG4gICAgbGV0IHNpemUgPSBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIobmV3IEZpbGUoZmlsZVBhdGgpKTtcXFxcbiAgICBpZiAoc2l6ZSA8IDApIHtcXFxcbiAgICAgICAgcmV0dXJuIG51bGw7XFxcXG4gICAgfVxcXFxuICAgIGxldCB1bml0Rm9ybSA9IFtcXFxcXFxcIkJ5dGVcXFxcXFxcIiwgXFxcXFxcXCJLQlxcXFxcXFwiLCBcXFxcXFxcIk1CXFxcXFxcXCIsIFxcXFxcXFwiR0JcXFxcXFxcIiwgXFxcXFxcXCJUQlxcXFxcXFwiXTtcXFxcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdW5pdEZvcm0ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXFxcbiAgICAgICAgaWYgKHNpemUgPiAxMDI0KSB7XFxcXG4gICAgICAgICAgICBzaXplIC89IDEwMjQ7XFxcXG4gICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwoc2l6ZSkgKyB1bml0Rm9ybVtpXTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gXFxcXFxcXCJFUlJPUjrmlbDlgLzov4flpKdcXFxcXFxcIjtcXFxcbn1cXFxcbi8v5a6M5pW05ZCI5bm2XFxcXG4vKlxcXFxuZnVuY3Rpb24gZmlsZUNvbWJpbmUoZmlsZXNJbnB1dCwgZmlsZU91dCwgZXh0ZW5zaW9uLCBpbnRlcmNlcHQpIHtcXFxcbiAgICB3aXRoKGphdmFTY29wZSkge1xcXFxuICAgICAgICBjb25zdCBUTVBfQlVGRkVSX1NJWkUgPSAweDMwMDAwO1xcXFxuICAgICAgICBjb25zdCBCVUZGRVJfU0laRSA9IDB4MzAwMDAwO1xcXFxuICAgICAgICAvL+WQiOW5tuS4tOaXtuaWh+S7tlxcXFxuICAgICAgICBsZXQgaW5wdXRGaWxlID0gbmV3IEZpbGUoZmlsZXNJbnB1dCk7XFxcXG4gICAgICAgIGxldCB0bXBGaWxlID0gbmV3IEZpbGUoZmlsZU91dCArIFxcXFxcXFwiLnRtcFxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHRvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKSk7XFxcXG4gICAgICAgIGxldCBpbnB1dEZpbGVzID0gaW5wdXRGaWxlLmxpc3RGaWxlcygpO1xcXFxuICAgICAgICBsZXQgdGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgVE1QX0JVRkZFUl9TSVpFKTtcXFxcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBpbnB1dEZpbGVzKSB7XFxcXG4gICAgICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IDA7XFxcXG4gICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBpcy5yZWFkKHRieXMpKSAhPSAtMSkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0b3Mud3JpdGUodGJ5cywgMCwgbGVuKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0b3MuY2xvc2UoKTtcXFxcbiAgICAgICAgLy/op4TliJnmm7/mjaLop4TliJk7XFxcXG4gICAgICAgIGxldCBvdXRGaWxlID0gbmV3IEZpbGUoZmlsZU91dCk7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0ID09PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGxldCB0aXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpO1xcXFxuICAgICAgICAgICAgbGV0IG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTtcXFxcbiAgICAgICAgICAgIGxldCBsZW4gPSAwO1xcXFxuICAgICAgICAgICAgbGV0IGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgQlVGRkVSX1NJWkUpO1xcXFxuICAgICAgICAgICAgd2hpbGUgKChsZW4gPSB0aXMucmVhZChieXMpKSAhPSAtMSkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBuYnlzID0gaW50ZXJjZXB0KG5ldyBTdHJpbmcoYnlzLDAsbGVuKSk7XFxcXG4gICAgICAgICAgICAgICAgb3Mud3JpdGUobmJ5cywgMCwgbmJ5cy5sZW5ndGgpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgdG1wRmlsZS5kZWxldGUoKTtcXFxcbiAgICAgICAgICAgIHRpcy5jbG9zZSgpO1xcXFxuICAgICAgICAgICAgb3MuY2xvc2UoKTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGlmIChvdXRGaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgICAgICAgICAgb3V0RmlsZS5kZWxldGUoKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHRtcEZpbGUucmVuYW1lVG8ob3V0RmlsZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG59Ki9cXFxcbi8v5q6LXFxcXG5mdW5jdGlvbiBmaWxlUnVsZShmaWxlc0lucHV0LCBmaWxlT3V0LCBpbnRlcmNlcHQpIHtcXFxcbiAgICB3aXRoKGphdmFTY29wZSkge1xcXFxuICAgICAgICBjb25zdCBCVUZGRVJfU0laRSA9IDB4MzAwMDAwO1xcXFxuICAgICAgICBsZXQgdG1wRmlsZSA9IG5ldyBGaWxlKGZpbGVzSW5wdXQpO1xcXFxuICAgICAgICBpZighKHRtcEZpbGUuZXhpc3RzKCkmJnRtcEZpbGUuaXNGaWxlKCkpKXtcXFxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgb3V0RmlsZSA9IG5ldyBGaWxlKGZpbGVPdXQpO1xcXFxuXFxcXG4gICAgICAgIGxldCB0aXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpO1xcXFxuICAgICAgICBsZXQgb3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSkpO1xcXFxuICAgICAgICBsZXQgbGVuID0gMDtcXFxcbiAgICAgICAgbGV0IGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgQlVGRkVSX1NJWkUpO1xcXFxuICAgICAgICB3aGlsZSAoKGxlbiA9IHRpcy5yZWFkKGJ5cykpICE9IC0xKSB7XFxcXG4gICAgICAgICAgICBsZXQgbmJ5cyA9IGludGVyY2VwdChuZXcgU3RyaW5nKGJ5cywwLGxlbikpO1xcXFxuICAgICAgICAgICAgb3Mud3JpdGUobmJ5cywgMCwgbmJ5cy5sZW5ndGgpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7XFxcXG4gICAgICAgIHRpcy5jbG9zZSgpO1xcXFxuICAgICAgICBvcy5jbG9zZSgpO1xcXFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbiQuZXhwb3J0cyA9IHtcXFxcbiAgICBnZXRGaWxlVGltZTogKHBhdGgpID0+IGdldEZpbGVUaW1lKHBhdGgpLFxcXFxuICAgIGdldEZpbGVQYXRoOiAocGF0aCwgdHlwZSwgZXhwYW5kKSA9PiBnZXRGaWxlUGF0aChwYXRoLCB0eXBlLCBleHBhbmQpLFxcXFxuICAgIGRlbGV0ZUZsaWVzOiAocGF0aCkgPT4gZGVsZXRlRmxpZXMocGF0aCksXFxcXG4gICAgcmVuYW1lRmlsZTogKHBhdGgsIG5hbWUpID0+IHJlbmFtZUZpbGUocGF0aCwgbmFtZSksXFxcXG4gICAgbW92ZUZpbGVzOiAoZnJvbVBhdGgsIHRvUGF0aCkgPT4gbW92ZUZpbGVzKGZyb21QYXRoLCB0b1BhdGgpLFxcXFxuICAgIGZpbGVXcml0ZTogKHBhdGgsIGNvbnRlbnQpID0+IGZpbGVXcml0ZShwYXRoLCBjb250ZW50KSxcXFxcbiAgICBmaWxlV3JpdGVBcHBlbmQ6IChwYXRoLCBjb250ZW50KSA9PiBmaWxlV3JpdGVBcHBlbmQocGF0aCwgY29udGVudCksXFxcXG4gICAgZ2V0TmFtZTogKHBhdGgpID0+IGdldE5hbWUocGF0aCksXFxcXG4gICAgZ2V0RmlsZVNpemU6IChmaWxlUGF0aCkgPT4gZ2V0RmlsZVNpemUoZmlsZVBhdGgpLFxcXFxuICAgIGZpbGVSdWxlOiAoZmlsZXNJbnB1dCwgZmlsZU91dCwgaW50ZXJjZXB0KSA9PiBmaWxlUnVsZShmaWxlc0lucHV0LCBmaWxlT3V0LCBpbnRlcmNlcHQpXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcInRleHRfMlxcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7kuIvovb3liJfooagt5pmu6YCa5LiL6L29XFxcIixcXFwicGF0aFxcXCI6XFxcImRvd25sb2FkLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCB2aWV3Q29uZmlnID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgY2hhcHRlckxpc3Q6IFtdLFxcXFxuICAgIGluZm86IHt9LFxcXFxuICAgIGRlZmF1bHRWaWV3OiBcXFxcXFxcIjBcXFxcXFxcIlxcXFxufSwgTVlfUEFSQU1TKTtcXFxcbnZpZXdDb25maWcuaW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgIHJ1bGVOYW1lOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgIGJvb2tOYW1lOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgIGJvb2tUb3BQaWM6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgcGFyc2VDb2RlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgIHR5cGU6IFxcXFxcXFwiY29taWNcXFxcXFxcIixcXFxcbn0sIHZpZXdDb25maWcuaW5mbyk7XFxcXG5sZXQge1xcXFxuICAgIGNoYXB0ZXJMaXN0LFxcXFxuICAgIGluZm8sXFxcXG4gICAgZGVmYXVsdFZpZXdcXFxcbn0gPSB2aWV3Q29uZmlnO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi6YCJ5oup5ZmofFxcXFxcXFwiICsgaW5mby5ib29rTmFtZSlcXFxcblxcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuXFxcXG5jb25zdCBkZWZfRG9WaV9TdHlsZSA9IENvbmZpZy5kZWZfRG9WaV9TdHlsZTtcXFxcbmNvbnN0IE1ZX0lEID0gaW5mby5ydWxlTmFtZSArIFxcXFxcXFwiLy9cXFxcXFxcIiArIGluZm8uYm9va05hbWU7XFxcXG5cXFxcblxcXFxubGV0IGlzU3RhcnQgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmlzU3RhcnRcXFxcXFxcIik7XFxcXG5sZXQgdmlld01vZGUgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnZpZXdNb2RlXFxcXFxcXCIsIGRlZmF1bHRWaWV3KTtcXFxcbmxldCBpc1JldmVyc2UgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmlzUmV2ZXJzZVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgdGFnRmlsdGVyID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjp0YWdGaWx0ZXJcXFxcXFxcIiwgQ29uZmlnLmRlZl9Eb1ZpX1R5cGUpO1xcXFxuXFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoTVlfSUQpID0+IHtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6bG9hZGluZ1RlYW1cXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOnZpZXdNb2RlXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpjb21wbGV0ZWRcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6dGFnRmlsdGVyXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpwYWdlTnVtXFxcXFxcXCIpO1xcXFxufSwgTVlfSUQpKTtcXFxcblxcXFxubGV0IGxheW91dCA9IFtdO1xcXFxuXFxcXG5pZiAoaXNTdGFydCA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnZpZXdNb2RlXFxcXFxcXCIsIGRlZmF1bHRWaWV3KTtcXFxcbiAgICB2aWV3TW9kZSA9IFxcXFxcXFwiMVxcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG5sZXQgYmFja3VwQ2hhcHRlckxpc3QgPSBjaGFwdGVyTGlzdDtcXFxcbmlmICh0eXBlb2YgY2hhcHRlckxpc3QgPT09IFxcXFxcXFwic3RyaW5nXFxcXFxcXCIpIHtcXFxcbiAgICBjaGFwdGVyTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIGNoYXB0ZXJMaXN0KSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxufVxcXFxubGV0IGNoYXB0ZXJBbGwgPSBjaGFwdGVyTGlzdDtcXFxcbmNoYXB0ZXJMaXN0ID0gY2hhcHRlckxpc3QubWFwKChpdGVtLCBDSUQpID0+IHtcXFxcbiAgICBpdGVtLkNJRCA9IENJRDtcXFxcbiAgICByZXR1cm4gaXRlbTtcXFxcbn0pO1xcXFxubGV0IHBhZ2VOdW0gPSBOdW1iZXIoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpwYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKSk7XFxcXG5sZXQgY2hhcHRlckNodW5rID0gW2NoYXB0ZXJMaXN0XS5jb25jYXQoVG9vbC5jaHVuayhjaGFwdGVyTGlzdCwgQ29uZmlnLnZpZXdQYWdlU2l6ZSkpO1xcXFxuY2hhcHRlckxpc3QgPSBjaGFwdGVyQ2h1bmtbcGFnZU51bV0gfHwgW107XFxcXG5cXFxcbmZ1bmN0aW9uIHNldFR5cGUoKSB7XFxcXG4gICAgbGV0IHNldCA9ICh0YWcsIHB1dCkgPT4ge1xcXFxuICAgICAgICBwdXRNeVZhcihwdXQsIHRhZyk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAwID09IHBhZ2VOdW0gPyBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgKFxcXFxcXFwi5YWo6YOoKFxcXFxcXFwiICsgY2hhcHRlckFsbC5sZW5ndGggKyBcXFxcXFxcIilcXFxcXFxcIikuZm9udGNvbG9yKFxcXFxcXFwiIzIzQUQ2RlxcXFxcXFwiKSA6IFxcXFxcXFwi5YWo6YOoKFxcXFxcXFwiICsgY2hhcHRlckFsbC5sZW5ndGggKyBcXFxcXFxcIilcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoc2V0LCAwLCBNWV9JRCArIFxcXFxcXFwiOnBhZ2VOdW1cXFxcXFxcIiksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2hhcHRlckNodW5rLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCB0YWdUZXh0ID0gKGkgLSAxKSAqIENvbmZpZy52aWV3UGFnZVNpemUgKyBcXFxcXFxcIi1cXFxcXFxcIiArICgoaSAtIDEpICogQ29uZmlnLnZpZXdQYWdlU2l6ZSArIGNoYXB0ZXJDaHVua1tpXS5sZW5ndGgpO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaSA9PSBwYWdlTnVtID8gXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIHRhZ1RleHQuZm9udGNvbG9yKFxcXFxcXFwiIzIzQUQ2RlxcXFxcXFwiKSA6IHRhZ1RleHQsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIGksIE1ZX0lEICsgXFxcXFxcXCI6cGFnZU51bVxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuWFqOmDqFxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMyM0FENkZcXFxcXFxcIikgOiBcXFxcXFxcIuWFqOmDqFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIFxcXFxcXFwiMFxcXFxcXFwiLCBNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFxcXFxcIjFcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuacquS4i+i9vVxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMyM0FENkZcXFxcXFxcIikgOiBcXFxcXFxcIuacquS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIFxcXFxcXFwiMVxcXFxcXFwiLCBNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFxcXFxcIjJcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuW3suS4i+i9vVxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMyM0FENkZcXFxcXFxcIikgOiBcXFxcXFxcIuW3suS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIFxcXFxcXFwiMlxcXFxcXFwiLCBNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5sZXQgY2hhcHRlclRlYW0gPSBbXTtcXFxcbmxldCByZWNvcmQgPSBbXTtcXFxcbmlmIChpbmZvLnR5cGUgPT09IFxcXFxcXFwiY29taWNcXFxcXFxcIikge1xcXFxuICAgIGxldCBsYXp5ID0gJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGlucHV0KTtcXFxcbiAgICAgICAgbGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+IFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgaW5wdXQgKyBcXFxcXFxcIi9cXFxcXFxcIiArIChpICsgMSkgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiArIHBpY2xpc3Quam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgZnVuY3Rpb24gY29tRnVuKGksIGl0ZW0pIHtcXFxcbiAgICAgICAgbGV0IHJvb3RQYXRoID0gQ29uZmlnLmNvbWljUGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXFxcXFwiL1xcXFxcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiL1xcXFxcXFwiICsgaSArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBpdGVtLnRpdGxlO1xcXFxuICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCcXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCLigJ3igJ1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogcm9vdFBhdGggKyBsYXp5LFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGksXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgRmlsZS5nZXRGaWxlUGF0aChDb25maWdbaW5mby50eXBlICsgXFxcXFxcXCJQYXRoXFxcXFxcXCJdICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lLCBcXFxcXFxcImRpclxcXFxcXFwiKS5mb3JFYWNoKChmaWxlKSA9PiB7XFxcXG4gICAgICAgIGxldCBhdHQgPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcXFxcXCIkXFxcXFxcXCIsIDIpO1xcXFxuICAgICAgICBpZiAoYXR0Lmxlbmd0aCA9PT0gMyAmJiBhdHRbMV0gPT09IChcXFxcXFxcIkFcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlY29yZC5wdXNoKGF0dFsyXSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgZnVuY3Rpb24gY29tRnVuKGksIGl0ZW0pIHtcXFxcbiAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwi4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL05vdmVsTWFpbkJvZHkjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCIjXFxcXFxcXCIgKyBpLFxcXFxuICAgICAgICAgICAgICAgIHBhdGg6IENvbmZpZy5ub3ZlbFBhdGggKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIiArIGkgKyBcXFxcXFxcIiRBJFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwiLnR4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgRmlsZS5nZXRGaWxlUGF0aChDb25maWdbaW5mby50eXBlICsgXFxcXFxcXCJQYXRoXFxcXFxcXCJdICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lLCBcXFxcXFxcImZpbGVcXFxcXFxcIiwgXFxcXFxcXCIudHh0XFxcXFxcXCIpLmZvckVhY2goKGZpbGUpID0+IHtcXFxcbiAgICAgICAgbGV0IGF0dCA9IFRvb2wuc3BsaXQoZmlsZS5uYW1lLCBcXFxcXFxcIiRcXFxcXFxcIiwgMik7XFxcXG4gICAgICAgIGlmIChhdHQubGVuZ3RoID09PSAzICYmIGF0dFsxXSA9PT0gKFxcXFxcXFwiQVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmVjb3JkLnB1c2goYXR0WzJdLnNsaWNlKDAsIGF0dFsyXS5sYXN0SW5kZXhPZihcXFxcXFxcIi5cXFxcXFxcIikpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjbGlja0Rvd25sb2FkKGl0ZW0sIGluZm8sIE1ZX0lELCBpKSB7XFxcXG4gICAgbGV0IGxvYWRpbmdUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmxvYWRpbmdUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgRWxlbWVudEluZGV4ID0gbG9hZGluZ1RlYW0uaW5kZXhPZihpKTtcXFxcbiAgICBpZiAoRWxlbWVudEluZGV4ID4gLTEpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29XFxcXFxcXCI7XFxcXG5cXFxcbiAgICBsb2FkaW5nVGVhbS5wdXNoKGkpO1xcXFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6bG9hZGluZ1RlYW1cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkobG9hZGluZ1RlYW0pKTtcXFxcbiAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCY4oCYXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCLigJnigJlcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI1xcXFxcXFwiICsgaVxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGV0IHJlc3VsdCA9IFxcXFxcXFwidG9hc3Q6Ly/kuIvovb3lpLHotKVcXFxcXFxcIjtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICB0b2FzdChcXFxcXFxcIuW8gOWni+S4i+i9vTpcXFxcXFxcIiArIGl0ZW0udGl0bGUpO1xcXFxuICAgICAgICBsZXQgZG93bmxvYWQgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRG93bmxvYWQuZXhlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXN1bHQgPSBkb3dubG9hZChpdGVtLCBpbmZvLCBNWV9JRCwgaSk7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCcXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCLigJ3igJ1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+W3suS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgIH0gZmluYWxseSB7XFxcXG4gICAgICAgIGxvYWRpbmdUZWFtLnNwbGljZShFbGVtZW50SW5kZXgsIDEpO1xcXFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmxvYWRpbmdUZWFtXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGxvYWRpbmdUZWFtKSk7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiByZXN1bHQ7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNpbmdsZVZpZXcoKSB7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlj43ovazliJfooahcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGlzUmV2ZXJzZSwgTVlfSUQpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNSZXZlcnNlXFxcXFxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIjFcXFxcXFxcIiA6IFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgaXNSZXZlcnNlLCBNWV9JRCksXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/aWQ9MzNudkRxYkhIN0hXJnNpemU9NDgmZm9ybWF0PWdpZiZ0b2tlbj1cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl8yXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuaJuemHj+S4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpsb2FkaW5nVGVhbVxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAobG9hZGluZ1RlYW0ubGVuZ3RoID4gMCkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ov5jmnInku7vliqHmsqHmnInlrozmiJBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGlmIChnZXRBcHBWZXJzaW9uKCkgPCAyNTk0KSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acquW8gOaUvlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjp2aWV3TW9kZVxcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG5cXFxcbiAgICAgICAgfSwgTVlfSUQpLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2Zvcm1hdD1naWYmaWQ9MHVhZmFNTnp4ajg4JnRva2VuPVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uXzJcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIHNldFR5cGUoKTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpsb2FkaW5nVGVhbVxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgZm9yIChsZXQgaSA9IDAsIGl0ZW0gPSBjaGFwdGVyTGlzdFswXTsgaSA8IGNoYXB0ZXJMaXN0Lmxlbmd0aDsgaXRlbSA9IGNoYXB0ZXJMaXN0WysraV0pIHtcXFxcbiAgICAgICAgbGV0IGlzX2Rvd25sb2FkID0gcmVjb3JkLmluY2x1ZGVzKGl0ZW0udGl0bGUpO1xcXFxuICAgICAgICBpZiAoaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaChjb21GdW4oaXRlbS5DSUQsIGl0ZW0pKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmICghaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFxcXFxcIjJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGxvYWRpbmdUZWFtLmluY2x1ZGVzKGl0ZW0uQ0lEKSA/IFxcXFxcXFwi4oCY4oCYXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCLigJnigJlcXFxcXFxcIiA6IGl0ZW0udGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoY2xpY2tEb3dubG9hZCwgaXRlbSwgaW5mbywgTVlfSUQsIGl0ZW0uQ0lEKSxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGl0ZW0uQ0lEXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjbGlja0Nob29zZSh0aXRsZSwgTVlfSUQsIGkpIHtcXFxcbiAgICBsZXQgaXNTdGFydCA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiKTtcXFxcbiAgICBpZiAoaXNTdGFydCA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29Li4uXFxcXFxcXCI7XFxcXG4gICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgIGxldCBFbGVtZW50SW5kZXggPSBiYXRjaFRlYW0uaW5kZXhPZihpKTtcXFxcbiAgICBpZiAoRWxlbWVudEluZGV4ID4gLTEpIHtcXFxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI1xcXFxcXFwiICsgaVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgYmF0Y2hUZWFtLnNwbGljZShFbGVtZW50SW5kZXgsIDEpO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCY4oCYXFxcXFxcXCIgKyB0aXRsZSArIFxcXFxcXFwi4oCZ4oCZXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI1xcXFxcXFwiICsgaVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgYmF0Y2hUZWFtLnB1c2goaSk7XFxcXG4gICAgfVxcXFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcXFxuICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gYmF0Y2hWaWV3KCkge1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Y2V6YCJ5LiL6L29XFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/aWQ9UElpY3ZGNmViek1uJnNpemU9NDgmZm9ybWF0PWdpZiZ0b2tlbj1cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIpID09PSBcXFxcXFxcIjFcXFxcXFxcIikgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mraPlnKjmibnph4/kuIvovb1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6dmlld01vZGVcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgTVlfSUQpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxldCBzdGFydCA9IENvbmZpZy52aWV3UGFnZVNpemUgKiBNYXRoLm1heChwYWdlTnVtIC0gMSwgMCk7XFxcXG4gICAgbGV0IGVuZCA9IHN0YXJ0ICsgY2hhcHRlckxpc3QubGVuZ3RoO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6YCJ5oup5YWo6YOoXFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD0xSFZjSExvTnpyaXQmdG9rZW49XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChzdGFydCwgZW5kLCBNWV9JRCkgPT4ge1xcXFxuICAgICAgICAgICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IGNob29zZVRlYW0gPSBUb29sLnJhbmdlKHN0YXJ0LCBlbmQpO1xcXFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gQXJyYXkuZnJvbShuZXcgU2V0KGJhdGNoVGVhbS5jb25jYXQoY2hvb3NlVGVhbSkpKTtcXFxcbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWQgPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6Y29tcGxldGVkXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIoKGkpID0+ICFjb21wbGV0ZWQuaW5jbHVkZXMoaSkpO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoYmF0Y2hUZWFtKSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSwgc3RhcnQsIGVuZCwgTVlfSUQpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Y+W5raI5YWo6YOoXFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD1IekVqUHBJM05MOEQmdG9rZW49XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChzdGFydCwgZW5kLCBNWV9JRCkgPT4ge1xcXFxuICAgICAgICAgICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IGNob29zZVRlYW0gPSBuZXcgU2V0KFRvb2wucmFuZ2Uoc3RhcnQsIGVuZCkpO1xcXFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih4ID0+ICFjaG9vc2VUZWFtLmhhcyh4KSk7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICB9LCBzdGFydCwgZW5kLCBNWV9JRCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfNFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLnoa7orqTpgInkuK1cXFxcXFxcIixcXFxcbiAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPXRNcnZ0YzZUOWhWYiZ0b2tlbj1cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIsIFxcXFxcXFwiLTFcXFxcXFxcIikgIT09IFxcXFxcXFwiLTFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29Li4uXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gYmF0Y2hUZWFtLmxlbmd0aCA9PT0gMCA/IFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHmnInpgIlcXFxcXFxcIiA6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0JhdGNoLnZpZXcjbm9SZWZyZXNoIyNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgTVlfSUQpLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgbmV3V2luZG93OiB0cnVlLFxcXFxuICAgICAgICAgICAgd2luZG93SWQ6IE1ZX0lEICsgXFxcXFxcXCIvL+aJuemHj+S4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgTVlfSUQ6IE1ZX0lELFxcXFxuICAgICAgICAgICAgY2hhcHRlckxpc3Q6IGJhY2t1cENoYXB0ZXJMaXN0LFxcXFxuICAgICAgICAgICAgaW5mbzogaW5mb1xcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIHNldFR5cGUoKTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgY29tcGxldGVkID0gW107XFxcXG4gICAgZm9yIChsZXQgaSA9IDAsIGl0ZW0gPSBjaGFwdGVyTGlzdFswXTsgaSA8IGNoYXB0ZXJMaXN0Lmxlbmd0aDsgaXRlbSA9IGNoYXB0ZXJMaXN0WysraV0pIHtcXFxcbiAgICAgICAgbGV0IGlzX2Rvd25sb2FkID0gcmVjb3JkLmluY2x1ZGVzKGl0ZW0udGl0bGUpO1xcXFxuICAgICAgICBpZiAoaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgY29tcGxldGVkLnB1c2goaXRlbS5DSUQpO1xcXFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaChjb21GdW4oaXRlbS5DSUQsIGl0ZW0pKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmICghaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFxcXFxcIjJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGJhdGNoVGVhbS5pbmNsdWRlcyhpdGVtLkNJRCkgPyBcXFxcXFxcIuKAmOKAmFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwi4oCZ4oCZXFxcXFxcXCIgOiBpdGVtLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKGNsaWNrQ2hvb3NlLCBpdGVtLnRpdGxlLCBNWV9JRCwgaXRlbS5DSUQpLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI1xcXFxcXFwiICsgaXRlbS5DSURcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBkZWZfRG9WaV9TdHlsZVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpjb21wbGV0ZWRcXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoY29tcGxldGVkKSk7XFxcXG59XFxcXG5zd2l0Y2ggKHZpZXdNb2RlKSB7XFxcXG4gICAgY2FzZSBcXFxcXFxcIjBcXFxcXFxcIjpcXFxcbiAgICAgICAgc2luZ2xlVmlldygpO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlIFxcXFxcXFwiMVxcXFxcXFwiOlxcXFxuICAgICAgICBiYXRjaFZpZXcoKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG59XFxcXG5pZiAoaXNSZXZlcnNlID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGNoYXB0ZXJUZWFtLnJldmVyc2UoKTtcXFxcbn1cXFxcbmxheW91dC5wdXNoLmFwcGx5KGxheW91dCwgY2hhcHRlclRlYW0pO1xcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu5om56YeP5LiL6L295ZmoXFxcIixcXFwicGF0aFxcXCI6XFxcIkJhdGNoLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQge1xcXFxuICAgIGNoYXB0ZXJMaXN0LFxcXFxuICAgIGluZm8sXFxcXG4gICAgTVlfSURcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLkuIvovb3lmah8XFxcXFxcXCIraW5mby5ib29rTmFtZSk7XFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoTVlfSUQpID0+IHtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIik7XFxcXG4gICAgcmVmcmVzaFBhZ2UoKTtcXFxcbn0sIE1ZX0lEKSk7XFxcXG5cXFxcbmxldCBpc1N0YXJ0ID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgbGF5b3V0ID0gW107XFxcXG5cXFxcbmxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbmlmKHR5cGVvZiBjaGFwdGVyTGlzdCA9PT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIil7XFxcXG4gICAgY2hhcHRlckxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIrY2hhcHRlckxpc3QpfHxcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxufVxcXFxubGV0IGNoYXB0ZXJUZWFtID0gYmF0Y2hUZWFtLm1hcCh2ID0+IHtcXFxcbiAgICBsZXQgY2hhcHRlckl0ZW0gPSBjaGFwdGVyTGlzdFt2XTtcXFxcbiAgICBjaGFwdGVySXRlbS5DSUQgPSB2O1xcXFxuICAgIHJldHVybiBjaGFwdGVySXRlbTtcXFxcbn0pO1xcXFxuaWYgKGlzU3RhcnQgPT09IFxcXFxcXFwiMFxcXFxcXFwiKSB7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlvIDlp4vkuIvovb1bXFxcXFxcXCIgKyBjaGFwdGVyVGVhbS5sZW5ndGggKyBcXFxcXFxcIl1cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIGxldCBkb3dubG9hZCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9CYXRjaFN0YXRpc3RpY3MuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gZG93bmxvYWQoY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSB8fCBcXFxcXFxcInRvYXN0Oi8v5LiL6L296ZSZ6K+vXFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzlvIDlp4vkuIvovb1cXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLku7vliqHliJfooajvvJpcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjaGFwdGVyVGVhbSkge1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG5cXFxcbn0gZWxzZSB7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkuIvovb3ov5vluqY6MC9cXFxcXFxcIitjaGFwdGVyVGVhbS5sZW5ndGgsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi4oCc4oCc4oCd4oCd4paH4paH4paH4paH4paH4paH4paH4paH4paH4paHXFxcXFxcXCIuZm9udGNvbG9yKFxcXFxcXFwiI2U1ZTFlNFxcXFxcXFwiKStcXFxcXFxcIiAwJVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L296L+b5bqmXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5ZCO5Y+w5LiL6L29XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJmdW5jOi8vYmFja2dyb3VuZFxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogW1xcXFxcXFwiW+WPlua2iOS4i+i9vV1cXFxcXFxcIiwgXFxcXFxcXCJb5q2j5Zyo5YGc5q2iLi4uXVxcXFxcXFwiLCBcXFxcXFxcIlvov5Tlm55dXFxcXFxcXCIsIFxcXFxcXFwiW+WkhOeQhuWksei0pV1cXFxcXFxcIiwgXFxcXFxcXCJb6YeN5paw5byA5aeLXVxcXFxcXFwiXVtzdGF0dXNdLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBcXFxcXFxcIjBcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwiW+ato+WcqOWBnOatoi4uLl1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3mjqfliLZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mraPlnKjlj5bmtojkuIvovb3ku7vliqFcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5pqC5YGcLi4uXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gXFxcXFxcXCIyXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LpgIDlh7rkuIvovb3lmahcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoW1xcXFxcXFwiM1xcXFxcXFwiLCBcXFxcXFxcIjRcXFxcXFxcIl0uaW5jbHVkZXMoc3RhdHVzKSkge1xcXFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOmxvZ1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6YeN5paw54K55Ye75LiL6L29XFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgTVlfSUQpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3mjqfliLZcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIjxzdHJvbmc+5LiL6L295pel5b+XPC9zdHJvbmc+XFxcXFxcXCIuYmlnKCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzml6Xlv5dcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTpcXFxcXFxcIuKAnOKAnOKAneKAnSQ+XFxcXFxcXCIrXFxcXFxcXCLlvIDlp4vkuIvovb0uLi4uLi5cXFxcXFxcIi5mb250Y29sb3IoXFxcXFxcXCIjMDBmZjAwXFxcXFxcXCIpLFxcXFxuICAgICAgICB1cmw6XFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCIjbG9nIzBcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOmZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI2ZnLuaJuemHj+S4i+i9vee7n+iuoVxcXCIsXFxcInBhdGhcXFwiOlxcXCJCYXRjaFN0YXRpc3RpY3MuanNcXFwiLFxcXCJydWxlXFxcIjpcXFwiY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuXFxcXG5mdW5jdGlvbiB0YXNrKHRhc2tQYXJhbSkge1xcXFxuICAgIGxldCByZXN1bHQgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQmF0Y2guZXhlLmpzXFxcXFxcXCIpKHRhc2tQYXJhbSk7XFxcXG4gICAgcmV0dXJuIHJlc3VsdDtcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzID0gZnVuY3Rpb24oY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSB7XFxcXG4gICAgaWYgKGNoYXB0ZXJUZWFtLmxlbmd0aCA9PT0gMCkge1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+epuueahOS4i+i9vemYn+WIl1xcXFxcXFwiO1xcXFxuICAgIH1cXFxcbiAgICB2YXIgY291bnQgPSAwO1xcXFxuICAgIHZhciB0YXNrQ291bnQgPSBjaGFwdGVyVGVhbS5sZW5ndGg7XFxcXG4gICAgdmFyIHN1Y2Nlc3NDSUQgPSBbXTtcXFxcbiAgICB2YXIgZmFpbE5hbWUgPSBbXTtcXFxcbiAgICB2YXIgbG9nQ291bnQgPSAxO1xcXFxuICAgIHZhciB0YXNrVGVhbSA9IGNoYXB0ZXJUZWFtLm1hcChjaGFwdGVySXRlbSA9PiAoe1xcXFxuICAgICAgICBmdW5jOiB0YXNrLFxcXFxuICAgICAgICBpZDogY2hhcHRlckl0ZW0udGl0bGUsXFxcXG4gICAgICAgIHBhcmFtOiB7XFxcXG4gICAgICAgICAgICBjaGFwdGVySXRlbTogY2hhcHRlckl0ZW0sXFxcXG4gICAgICAgICAgICBpbmZvOiBpbmZvLFxcXFxuICAgICAgICAgICAgTVlfSUQ6IE1ZX0lEXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KSk7XFxcXG4gICAgbGV0IGxvZ051bSA9IENvbmZpZy5sb2dOdW07XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBwdXRMb2codGV4dCkge1xcXFxuICAgICAgICBsb2codGV4dCk7XFxcXG4gICAgICAgIGlmIChsb2dDb3VudCA+PSBsb2dOdW0pIHtcXFxcbiAgICAgICAgICAgIGRlbGV0ZUl0ZW0oTVlfSUQgKyBcXFxcXFxcIiNsb2cjXFxcXFxcXCIgKyAobG9nQ291bnQgLSAxMCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGFkZEl0ZW1BZnRlcihNWV9JRCArIFxcXFxcXFwifHzml6Xlv5dcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIiQ+XFxcXFxcXCIgKyB0ZXh0LFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNsb2cjXFxcXFxcXCIgKyBsb2dDb3VudFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbG9nQ291bnQrKztcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBsaXN0ZW5lcihwZXJjaCwgaWQsIGVycm9yLCBDSUQpIHtcXFxcbiAgICAgICAgY291bnQrKztcXFxcbiAgICAgICAgbGV0IGlzU3VjY2VzcyA9IGZhbHNlO1xcXFxuICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcXFxcbiAgICAgICAgICAgIGZhaWxOYW1lLnB1c2goaWQpO1xcXFxuICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwiW2xpc3RlbmVyXeS4i+i9veWksei0pe+8mlxcXFxcXFwiICsgaWQgKyBcXFxcXFxcIjxFUlJPUkAgXFxcXFxcXCIgKyBlcnJvciArIFxcXFxcXFwiPlxcXFxcXFwiKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChDSUQgPj0gMCkge1xcXFxuICAgICAgICAgICAgc3VjY2Vzc0NJRC5wdXNoKENJRCk7XFxcXG4gICAgICAgICAgICBsZXQgcmF0aW8gPSAoY291bnQgLyB0YXNrQ291bnQpLnRvRml4ZWQoNCk7XFxcXG4gICAgICAgICAgICBsZXQgc3RyaXBDb3VudCA9IE1hdGguY2VpbChyYXRpbyAqIDEwKTtcXFxcbiAgICAgICAgICAgIGlzU3VjY2VzcyA9IHRydWU7XFxcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLkuIvovb3ov5vluqbvvJpcXFxcXFxcIiArIHN1Y2Nlc3NDSUQubGVuZ3RoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyB0YXNrQ291bnQsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFxcXFxcXFwi4paHXFxcXFxcXCIucmVwZWF0KHN0cmlwQ291bnQpLmZvbnRjb2xvcihcXFxcXFxcIiNmZmFjMmRcXFxcXFxcIikgKyBcXFxcXFxcIuKWh1xcXFxcXFwiLnJlcGVhdCgxMCAtIHN0cmlwQ291bnQpLmZvbnRjb2xvcihcXFxcXFxcIiNlNWUxZTRcXFxcXFxcIikgKyBcXFxcXFxcIiBcXFxcXFxcIiArIChyYXRpbyAqIDEwMCkgKyBcXFxcXFxcIiVcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L296L+b5bqmXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHB1dExvZyhcXFxcXFxcIltsaXN0ZW5lcl3lt7LlrozmiJDkuIvovb3vvJpcXFxcXFxcIiArIGlkKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChDSUQgPT09IC0xKSB7XFxcXG4gICAgICAgICAgICBmYWlsTmFtZS5wdXNoKGlkKTtcXFxcbiAgICAgICAgICAgIHB1dExvZyhcXFxcXFxcIltsaXN0ZW5lcl3lt7LlgZzmraLvvJpcXFxcXFxcIiArIGlkKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAodGFza0NvdW50ICE9PSBjb3VudCkgcmV0dXJuO1xcXFxuICAgICAgICBpZiAoc3VjY2Vzc0NJRC5sZW5ndGggPT09IHRhc2tDb3VudCkge1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFxcXFxcXFwi4paHXFxcXFxcXCIucmVwZWF0KDEwKS5mb250Y29sb3IoXFxcXFxcXCIjMDBmZjAwXFxcXFxcXCIpICsgXFxcXFxcXCIgMTAwJVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3ov5vluqZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGZhaWxUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih2ID0+ICFzdWNjZXNzQ0lELmluY2x1ZGVzKHYpKTtcXFxcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoZmFpbFRlYW0pKTtcXFxcbiAgICAgICAgaWYgKGZhaWxUZWFtLmxlbmd0aCA+IDAgJiYgc3RhdHVzICE9PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwi5LiL6L295aSx6LSlOltcXFxcXFxcIiArIGZhaWxOYW1lLmpvaW4oXFxcXFxcXCJd77yMW1xcXFxcXFwiKSArIFxcXFxcXFwiXeOAglxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIlvlpITnkIblpLHotKVdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9veaOp+WItlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAoZmFpbFRlYW0ubGVuZ3RoID4gMCAmJiBzdGF0dXMgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBwdXRMb2coXFxcXFxcXCJbbGlzdGVuZXJdI+W3suWBnOatouaJgOacieS7u+WKoe+8jOS9huW3suaciei/m+W6puS4jeS8mua2iOWksSNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCJb6YeN5paw5byA5aeLXVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3mjqfliLZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIyXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwi5LiL6L295Lu75YqhW1xcXFxcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiXeW3suWFqOmDqOaIkOWKn+WujOaIkFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIlvov5Tlm55dXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9veaOp+WItlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdG9hc3QoXFxcXFxcXCLkuIvovb3ku7vliqFbXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCJd5bey5a6M5oiQXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgdGFza1RlYW1DaHVuayA9IFtdO1xcXFxuICAgIGlmIChDb25maWcudGhyZWFkTnVtID4gMCkge1xcXFxuICAgICAgICB0YXNrVGVhbUNodW5rID0gVG9vbC5jaHVuayh0YXNrVGVhbSwgQ29uZmlnLnRocmVhZE51bSk7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdGFza1RlYW1DaHVuayA9IFt0YXNrVGVhbV07XFxcXG4gICAgfVxcXFxuICAgIGZvciAobGV0IHRhc2tMaXN0IG9mIHRhc2tUZWFtQ2h1bmspIHtcXFxcbiAgICAgICAgYmUodGFza0xpc3QsIHtcXFxcbiAgICAgICAgICAgIGZ1bmM6IGxpc3RlbmVyXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoc3RhdHVzID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCBmYWlsVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIodiA9PiAhc3VjY2Vzc0NJRC5pbmNsdWRlcyh2KSk7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShmYWlsVGVhbSkpO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCI0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwiW2xpc3RlbmVyXSPlt7LlgZzmraLmiYDmnInku7vliqHvvIzkvYblt7LmnInov5vluqbkuI3kvJrmtojlpLEjXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwiW+mHjeaWsOW8gOWni11cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L295o6n5Yi2XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjZmcu5om56YeP5Li756iL5bqPXFxcIixcXFwicGF0aFxcXCI6XFxcIkJhdGNoLmV4ZS5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFxcXFxcIik7XFxcXG5cXFxcbmZ1bmN0aW9uIGNvbWljKHRhc2tQYXJhbSkge1xcXFxuICAgIGxldCB7XFxcXG4gICAgICAgIGNoYXB0ZXJJdGVtLFxcXFxuICAgICAgICBpbmZvLFxcXFxuICAgICAgICBNWV9JRCxcXFxcbiAgICB9ID0gdGFza1BhcmFtO1xcXFxuICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgcmV0dXJuIC0xO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCI7XFxcXG4gICAgbGV0IGNoYXB0ZXJQYXRoID0gbWFpblBhdGggKyBjaGFwdGVySXRlbS5DSUQgKyBcXFxcXFxcIiRCJFxcXFxcXFwiICsgY2hhcHRlckl0ZW0udGl0bGUgKyBcXFxcXFxcIi9cXFxcXFxcIjtcXFxcbiAgICBsZXQgcGljTGlzdDtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgZ2V0UGljTGlzdCA9IG5ldyBGdW5jdGlvbihcXFxcXFxcImlucHV0XFxcXFxcXCIsIFxcXFxcXFwidXJsXFxcXFxcXCIsIFxcXFxcXFwicmV0dXJuIFxcXFxcXFwiICsgaW5mby5wYXJzZUNvZGUpO1xcXFxuICAgICAgICBwaWNMaXN0ID0gZ2V0UGljTGlzdChjaGFwdGVySXRlbS51cmwsIGNoYXB0ZXJJdGVtLnVybCk7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgcGljTGlzdCA9PT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcGljTGlzdCA9IHBpY0xpc3QucmVwbGFjZShcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikuc3BsaXQoXFxcXFxcXCImJlxcXFxcXFwiKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgZS5tZXNzYWdlID0gXFxcXFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+v77yaXFxcXFxcXCIgKyBlLm1lc3NhZ2UgKyBcXFxcXFxcIj5cXFxcXFxcIjtcXFxcbiAgICAgICAgdGhyb3cgZTtcXFxcbiAgICB9XFxcXG4gICAgY29uc3QgTCA9IHBpY0xpc3QubGVuZ3RoO1xcXFxuICAgIGlmKEw9PT0wKXtcXFxcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwiPOa8q+eUu+WbvueJh+ino+aekOmUmeivr++8muWbvueJh+mTvuaOpei/lOWbnuS4uuepuj5cXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIGlmIChpbmZvLmJvb2tUb3BQaWMpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcXFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKGJvb2tUb3BQaWNbMF0sIG1haW5QYXRoICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiLmpwZ1xcXFxcXFwiLCBib29rVG9wUGljWzFdKTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwiPOWwgemdouS4i+i9vemUmeivr++8mlxcXFxcXFwiICsgZS5tZXNzYWdlICsgXFxcXFxcXCI+XFxcXFxcXCIpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHZhciBzY2hlZHVsZSA9IG5ldyBNYXAoW1xcXFxuICAgICAgICBbTCwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb0xMDAlXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuOTAgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb05MCUrXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuNzUgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb03NSUrXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuNTAgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb01MCUrXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuMjUgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb0yNSUrXFxcXFxcXCIpXVxcXFxuICAgIF0pO1xcXFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBwaWMgPSBUb29sLmhpa2VyUGljKHBpY0xpc3RbaV0pO1xcXFxuICAgICAgICByZXF1aXJlRG93bmxvYWQocGljWzBdLCBjaGFwdGVyUGF0aCArIChpICsgMSkgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIiwgcGljWzFdKTtcXFxcbiAgICAgICAgc2NoZWR1bGUuaGFzKGkgKyAxKSAmJiBzY2hlZHVsZS5nZXQoaSArIDEpKCk7XFxcXG4gICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAtMTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBGaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIGNoYXB0ZXJJdGVtLkNJRCArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSk7XFxcXG4gICAgcmV0dXJuIGNoYXB0ZXJJdGVtLkNJRDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbm92ZWwodGFza1BhcmFtKSB7XFxcXG4gICAgbGV0IHtcXFxcbiAgICAgICAgY2hhcHRlckl0ZW0sXFxcXG4gICAgICAgIGluZm8sXFxcXG4gICAgICAgIE1ZX0lELFxcXFxuICAgIH0gPSB0YXNrUGFyYW07XFxcXG4gICAgaWYgKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICByZXR1cm4gLTE7XFxcXG4gICAgfVxcXFxuICAgIGxldCBtYWluUGF0aCA9IENvbmZpZy5ub3ZlbFBhdGggKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIjtcXFxcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIGNoYXB0ZXJJdGVtLkNJRCArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSArIFxcXFxcXFwiLnR4dFxcXFxcXFwiO1xcXFxuICAgIGxldCBjb250ZW50ID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgZ2V0Q29udGVudCA9IG5ldyBGdW5jdGlvbihcXFxcXFxcImlucHV0XFxcXFxcXCIsIFxcXFxcXFwidXJsXFxcXFxcXCIsIFxcXFxcXFwicmV0dXJuIFxcXFxcXFwiICsgaW5mby5wYXJzZUNvZGUpO1xcXFxuICAgICAgICBjb250ZW50ID0gZ2V0Q29udGVudChjaGFwdGVySXRlbS51cmwsIGNoYXB0ZXJJdGVtLnVybCk7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBlLm1lc3NhZ2UgPSBcXFxcXFxcIjzlsI/or7TmraPmlofop6PmnpDplJnor6/vvJpcXFxcXFxcIiArIGUubWVzc2FnZSArIFxcXFxcXFwiPlxcXFxcXFwiO1xcXFxuICAgICAgICB0aHJvdyBlO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoIWNvbnRlbnQpIHtcXFxcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwiPOWwj+ivtOato+aWh+ino+aekOmUmeivr++8muato+aWh+i/lOWbnuS4uuepuj5cXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIGlmIChpbmZvLmJvb2tUb3BQaWMpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcXFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKGJvb2tUb3BQaWNbMF0sIG1haW5QYXRoICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiLmpwZ1xcXFxcXFwiLCBib29rVG9wUGljWzFdKTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwiPOWwgemdouS4i+i9vemUmeivr++8mlxcXFxcXFwiICsgZS5tZXNzYWdlICsgXFxcXFxcXCI+XFxcXFxcXCIpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIEZpbGUuZmlsZVdyaXRlKGNoYXB0ZXJQYXRoLCBjb250ZW50LnJlcGxhY2UoLzxzY3JpcHQ+Lio/PFxcXFxcXFxcL3NjcmlwdD4vZ21pLCBcXFxcXFxcIlxcXFxcXFwiKS50cmltUmlnaHQoKSk7XFxcXG4gICAgLy9GaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIGNoYXB0ZXJJdGVtLkNJRCArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSk7XFxcXG4gICAgcmV0dXJuIGNoYXB0ZXJJdGVtLkNJRDtcXFxcbn1cXFxcbnZhciAkZXhlID0ge1xcXFxuICAgIGNvbWljOiBjb21pYyxcXFxcbiAgICBub3ZlbDogbm92ZWxcXFxcbn07XFxcXG4kLmV4cG9ydHMgPSBmdW5jdGlvbih0YXNrUGFyYW0pIHtcXFxcbiAgICByZXR1cm4gJGV4ZVt0YXNrUGFyYW0uaW5mby50eXBlXSh0YXNrUGFyYW0pO1xcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjZmcu5pmu6YCa5Li756iL5bqPXFxcIixcXFwicGF0aFxcXCI6XFxcIkRvd25sb2FkLmV4ZS5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFxcXFxcIik7XFxcXG5cXFxcbmZ1bmN0aW9uIG5vdmVsKGl0ZW0sIGluZm8sIE1ZX0lELCBvcmRlcikge1xcXFxuICAgIGxldCBtYWluUGF0aCA9IENvbmZpZy5ub3ZlbFBhdGggKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIjtcXFxcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIG9yZGVyICsgXFxcXFxcXCIkQSRcXFxcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFxcXFxcIi50eHRcXFxcXFxcIjtcXFxcbiAgICBsZXQgY29udGVudCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IGdldENvbnRlbnQgPSBuZXcgRnVuY3Rpb24oXFxcXFxcXCJpbnB1dFxcXFxcXFwiLCBcXFxcXFxcInVybFxcXFxcXFwiLCBcXFxcXFxcInJldHVybiBcXFxcXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXFxcbiAgICAgICAgY29udGVudCA9IGdldENvbnRlbnQoaXRlbS51cmwsIGl0ZW0udXJsKSB8fCBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgZS5tZXNzYWdlID0gXFxcXFxcXCI85bCP6K+05q2j5paH6Kej5p6Q6ZSZ6K+vPiBcXFxcXFxcIiArIGUubWVzc2FnZTtcXFxcbiAgICAgICAgdGhyb3cgZTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKCFjb250ZW50KSB7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi5bCP6K+05Li656m6XFxcXFxcXCIpO1xcXFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCI85bCP6K+05q2j5paH6Kej5p6Q6ZSZ6K+v77ya5q2j5paH6L+U5Zue5Li656m6PlxcXFxcXFwiKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGJvb2tUb3BQaWMgPSBUb29sLmhpa2VyUGljKGluZm8uYm9va1RvcFBpYyk7XFxcXG4gICAgICAgICAgICByZXF1aXJlRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCIuanBnXFxcXFxcXCIsIGJvb2tUb3BQaWNbMV0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coXFxcXFxcXCI85bCB6Z2i5LiL6L296ZSZ6K+vPiBcXFxcXFxcIiArIGUubWVzc2FnZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgRmlsZS5maWxlV3JpdGUoY2hhcHRlclBhdGgsIGNvbnRlbnQucmVwbGFjZSgvPHNjcmlwdD4uKj88XFxcXFxcXFwvc2NyaXB0Pi9nbWksIFxcXFxcXFwiXFxcXFxcXCIpLnRyaW1SaWdodCgpKTtcXFxcbiAgICAvL0ZpbGUucmVuYW1lRmlsZShjaGFwdGVyUGF0aCwgb3JkZXIgKyBcXFxcXFxcIiRBJFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwiLnR4dFxcXFxcXFwiKTtcXFxcbiAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiQFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwiIOS4i+i9veWujOaIkFxcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjb21pYyhpdGVtLCBpbmZvLCBNWV9JRCwgb3JkZXIpIHtcXFxcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCI7XFxcXG4gICAgbGV0IGNoYXB0ZXJQYXRoID0gbWFpblBhdGggKyBvcmRlciArIFxcXFxcXFwiJEIkXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCIvXFxcXFxcXCI7XFxcXG4gICAgbGV0IHBpY0xpc3QgPSBbXTtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgZ2V0UGljTGlzdCA9IG5ldyBGdW5jdGlvbihcXFxcXFxcImlucHV0XFxcXFxcXCIsIFxcXFxcXFwicmV0dXJuXFxcXFxcXCIgKyBpbmZvLnBhcnNlQ29kZSk7XFxcXG4gICAgICAgIHBpY0xpc3QgPSBnZXRQaWNMaXN0KGl0ZW0udXJsKTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBwaWNMaXN0ID09PSBcXFxcXFxcInN0cmluZ1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBwaWNMaXN0ID0gcGljTGlzdC5yZXBsYWNlKFxcXFxcXFwicGljczovL1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKS5zcGxpdChcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBlLm1lc3NhZ2UgPSBcXFxcXFxcIjzmvKvnlLvlm77niYfop6PmnpDplJnor68+IFxcXFxcXFwiICsgZS5tZXNzYWdlO1xcXFxuICAgICAgICB0aHJvdyBlO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIGNvbnN0IEwgPSBwaWNMaXN0Lmxlbmd0aDtcXFxcbiAgICBpZihMPT09MCl7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi5Zu+54mH6ZO+5o6l5Li656m6XFxcXFxcXCIpO1xcXFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+v77ya5Zu+54mH6ZO+5o6l6L+U5Zue5Li656m6PlxcXFxcXFwiKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGJvb2tUb3BQaWMgPSBUb29sLmhpa2VyUGljKGluZm8uYm9va1RvcFBpYyk7XFxcXG4gICAgICAgICAgICByZXF1aXJlRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCIuanBnXFxcXFxcXCIsIGJvb2tUb3BQaWNbMV0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coXFxcXFxcXCI85bCB6Z2i5LiL6L296ZSZ6K+vPiBcXFxcXFxcIiArIGUubWVzc2FnZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgdmFyIHNjaGVkdWxlID0gbmV3IE1hcChbXFxcXG4gICAgICAgIFtMLCAoKSA9PiBsb2coaXRlbS50aXRsZSArIFxcXFxcXFwi5bey5LiL6L29MTAwJVxcXFxcXFwiKV0sXFxcXG4gICAgICAgIFt+figwLjkwICogTCksICgpID0+IGxvZyhpdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb05MCUrXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuNzUgKiBMKSwgKCkgPT4gbG9nKGl0ZW0udGl0bGUgKyBcXFxcXFxcIuW3suS4i+i9vTc1JStcXFxcXFxcIildLFxcXFxuICAgICAgICBbfn4oMC41MCAqIEwpLCAoKSA9PiBsb2coaXRlbS50aXRsZSArIFxcXFxcXFwi5bey5LiL6L29NTAlK1xcXFxcXFwiKV0sXFxcXG4gICAgICAgIFt+figwLjI1ICogTCksICgpID0+IGxvZyhpdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb0yNSUrXFxcXFxcXCIpXVxcXFxuICAgIF0pO1xcXFxuXFxcXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBMOyBpKyspIHtcXFxcbiAgICAgICAgbGV0IHBpYyA9IFRvb2wuaGlrZXJQaWMocGljTGlzdFtpXSk7XFxcXG4gICAgICAgIHJlcXVpcmVEb3dubG9hZChwaWNbMF0sIGNoYXB0ZXJQYXRoICsgKGkgKyAxKSArIFxcXFxcXFwiLmpwZ1xcXFxcXFwiLCBwaWNbMV0pO1xcXFxuICAgICAgICBzY2hlZHVsZS5oYXMoaSArIDEpICYmIHNjaGVkdWxlLmdldChpICsgMSkoKTtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBGaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIG9yZGVyICsgXFxcXFxcXCIkQSRcXFxcXFxcIiArIGl0ZW0udGl0bGUpO1xcXFxuICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCJAXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCIg5LiL6L295a6M5oiQXFxcXFxcXCI7XFxcXG59XFxcXG52YXIgJGV4ZSA9IHtcXFxcbiAgICBjb21pYzogY29taWMsXFxcXG4gICAgbm92ZWw6IG5vdmVsXFxcXG59O1xcXFxuJC5leHBvcnRzID0gZnVuY3Rpb24oaXRlbSwgaW5mbywgTVlfSUQsIG9yZGVyKSB7XFxcXG4gICAgcmV0dXJuICRleGVbaW5mby50eXBlXShpdGVtLCBpbmZvLCBNWV9JRCwgb3JkZXIpO1xcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjZi7pgJrnlKjlt6XlhbdcXFwiLFxcXCJwYXRoXFxcIjpcXFwiVG9vbC5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCIkLmV4cG9ydHMgPSB7XFxcXG4gICAgc3BsaXQodGV4dCwgdGFyZ2V0LCBjb3VudCkge1xcXFxuICAgICAgICBjb3VudCA9IGNvdW50ID09PSB1bmRlZmluZWQgPyAxIDogY291bnQ7XFxcXG4gICAgICAgIGxldCBhcnJheSA9IFt0ZXh0XTtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XFxcXG4gICAgICAgICAgICB0ZXh0ID0gYXJyYXlbaV07XFxcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0ZXh0LmluZGV4T2YodGFyZ2V0KTtcXFxcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGFycmF5W2ldID0gdGV4dC5zbGljZSgwLCBpbmRleCk7XFxcXG4gICAgICAgICAgICBhcnJheVtpICsgMV0gPSB0ZXh0LnNsaWNlKGluZGV4ICsgdGFyZ2V0Lmxlbmd0aCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIGFycmF5O1xcXFxuICAgIH0sXFxcXG4gICAgY2h1bmsoYXJyLCBzaXplKSB7XFxcXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcXFxcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkgKz0gc2l6ZSkge1xcXFxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyLnNsaWNlKGksIGkgKyBzaXplKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXFxcbiAgICB9LFxcXFxuICAgIGhpa2VyUGljKHVybCkge1xcXFxuICAgICAgICB2YXIgaGVhZGVycyA9IHt9O1xcXFxuICAgICAgICBsZXQgdXJscyA9IHVybC5zcGxpdChcXFxcXFxcIkBcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBwaWNVcmwgPSB1cmxzLnNoaWZ0KCk7XFxcXG4gICAgICAgIGxldCBsZW5ndGggPSB1cmxzLmxlbmd0aDtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IHVybHNbaV0uc3BsaXQoXFxcXFxcXCI9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFtwaWNVcmwsIGhlYWRlcnNdO1xcXFxuICAgIH0sXFxcXG4gICAgcmFuZ2Uoc3RhcnQsIGVuZCkge1xcXFxuICAgICAgICByZXR1cm4gQXJyYXkoZW5kIC0gc3RhcnQpLmZpbGwoMCkubWFwKChlbCwgaSkgPT4gc3RhcnQgKyBpKTtcXFxcbiAgICB9XFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI2ouQ29uZmlnXFxcIixcXFwicGF0aFxcXCI6XFxcIkNvbmZpZy5qc29uXFxcIixcXFwicnVsZVxcXCI6XFxcImNvbnN0IENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgIGhvbWVQYXRoOiBcXFxcXFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvbG9jYWxNYW5hZ2VyXFxcXFxcXCIsXFxcXG4gICAgbG9nTnVtOiAxMCxcXFxcbiAgICB0aHJlYWROdW06IDE2LFxcXFxuICAgIGRlZl9pc1BhZ2luYXRlOiBcXFxcXFxcIjFcXFxcXFxcIiwgLy8x6buY6K6k5byA5ZCv5YiG6aG177yMMOm7mOiupOWFs+mXrVxcXFxuICAgIHZpZXdQYWdlU2l6ZTogMjAwLFxcXFxuICAgIGRlZl9QaWM6IFxcXFxcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9waWM0XFxcXFxcXCIsXFxcXG4gICAgZGVmX0xvcmRfVHlwZTogXFxcXFxcXCJjb21pY1xcXFxcXFwiLFxcXFxuICAgIGRlZl9WaWV3X1N0eWxlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIGRlZl9Eb1ZpX1N0eWxlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgIGRlZl9Eb1ZpX1R5cGU6IFxcXFxcXFwiMVxcXFxcXFwiLCAvLzDlhajpg6gsIDHmnKrlrozmiJDvvIwy5bey5a6M5oiQXFxcXG59LCBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG5jb25zdCBQQVRIUyA9IHtcXFxcbiAgICBub3ZlbFBhdGg6IFxcXFxcXFwiL+Wwj+ivtC9cXFxcXFxcIixcXFxcbiAgICBjb21pY1BhdGg6IFxcXFxcXFwiL+a8q+eUuy9cXFxcXFxcIixcXFxcbiAgICBub3ZlbEZ1bGxQYXRoOiBcXFxcXFxcIi/lsI/or7TlkIjlubYvXFxcXFxcXCJcXFxcbn1cXFxcblxcXFxuXFxcXG5PYmplY3Qua2V5cyhQQVRIUykuZm9yRWFjaChrZXkgPT4gQ29uZmlnW2tleV0gPSBDb25maWcuaG9tZVBhdGggKyBQQVRIU1trZXldKTtcXFxcbiQuZXhwb3J0cyA9IENvbmZpZztcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7kuLvpobXpnaJcXFwiLFxcXCJwYXRoXFxcIjpcXFwiTWFpbi52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuZnVuY3Rpb24gbWFpbigpIHtcXFxcbiAgICB2YXIgbGF5b3V0ID0gW107XFxcXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXFxcXFwiKTtcXFxcbiAgICBsZXQgdHlwZSA9IGdldE15VmFyKFxcXFxcXFwiLnR5cGVcXFxcXFxcIiwgQ29uZmlnLmRlZl9Mb3JkX1R5cGUpO1xcXFxuICAgIGxldCB0YWcgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1t0eXBlICsgXFxcXFxcXCJQYXRoXFxcXFxcXCJdLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcbiAgICBsZXQgdGdudW0gPSBnZXRNeVZhcihcXFxcXFxcIi50Z251bVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKE1ZX0lEKSA9PiB7XFxcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJzZWFyY2hLZXlcXFxcXFxcIik7XFxcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIudGdudW1cXFxcXFxcIik7XFxcXG4gICAgfSkpO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHR5cGUgPT09IFxcXFxcXFwiY29taWNcXFxcXFxcIiA/IFxcXFxcXFwi4peJ5ryr55S7XFxcXFxcXCIgOiBcXFxcXFxcIuKXi+a8q+eUu1xcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFxcXFxcXFwiY29taWNcXFxcXFxcIikgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIudHlwZVxcXFxcXFwiLCBcXFxcXFxcImNvbWljXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcIi50Z251bVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgdHlwZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHR5cGUgPT09IFxcXFxcXFwibm92ZWxcXFxcXFxcIiA/IFxcXFxcXFwi4peJ5bCP6K+0XFxcXFxcXCIgOiBcXFxcXFxcIuKXi+Wwj+ivtFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFxcXFxcXFwibm92ZWxcXFxcXFxcIikgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL05vdmVsQ29sbGVjdGVkLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi50eXBlXFxcXFxcXCIsIFxcXFxcXFwibm92ZWxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwiLnRnbnVtXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCB0eXBlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG4gICAgaWYgKHRhZy5sZW5ndGggPT09IDApIHtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuS4gOacrOS5n+ayoeaciSjov5vlhaXorr7nva4pXFxcXFxcXCIuYmlnKCksXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBNWV9SVUxFLnZlcnNpb24sXFxcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIHJldHVybiBzZXRSZXN1bHQobGF5b3V0KTtcXFxcbiAgICB9XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB1cmw6ICdcXFxcXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcXFxcXCIraW5wdXQnLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuaQnOS9oOaDs+imgeeahCNcXFxcXFxcIiArIHR5cGUgKyBcXFxcXFxcIiMuLi4uLi5cXFxcXFxcIixcXFxcbiAgICAgICAgdGl0bGU6ICfmkJzntKInLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHJ1bGVzOiAkLnRvU3RyaW5nKCh0YWcsIHR5cGUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgYXJyMSA9IFtdO1xcXFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGFycjEucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInRpdGxlXFxcXFxcXCI6IHRhZ1tpXS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJzZWFyY2hfdXJsXFxcXFxcXCI6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eT9pc0FsbD0xJnNlYXJjaFRlcm1zPSoqJnR5cGU9XFxcXFxcXCIgKyB0eXBlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJzZWFyY2hGaW5kXFxcXFxcXCI6IFxcXFxcXFwianM6JC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvU2VhcmNoLnZpZXc/cnVsZT0nK01ZX1JVTEUuX3RpdGxlKTtcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJyMSk7XFxcXG4gICAgICAgICAgICB9LCB0YWcsIHR5cGUpLFxcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignc2VhcmNoS2V5JywgJycpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXFxcXFwicHV0TXlWYXIoJ3NlYXJjaEtleScsaW5wdXQpXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIFxcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCY4oCY4pqZ6K6+572u4oCZ4oCZXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6e1xcXFxuICAgICAgICAgICAgdmVyc2lvbjogTVlfUlVMRS52ZXJzaW9uXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBcXFxcblxcXFxuICAgIGZvciAobGV0IGkgaW4gdGFnKSB7XFxcXG4gICAgICAgIGxldCBpdCA9IHRhZ1tpXTtcXFxcbiAgICAgICAgaWYgKHRnbnVtID09PSBpKSB7XFxcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCcXFxcXFxcXCIgKyBpdC5uYW1lICsgXFxcXFxcXCLigJ3igJ1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkVS5idWlsZCgkVShbXFxcXFxcXCLliKDpmaTor6Xnm67lvZVcXFxcXFxcIiwgXFxcXFxcXCLot7PovazlsI/nqIvluo9cXFxcXFxcIl0sIDEsIFxcXFxcXFwi6YCJ5oup5pON5L2cXFxcXFxcXCIpLnNlbGVjdCgobmFtZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoXFxcXFxcXCLot7PovazlsI/nqIvluo9cXFxcXFxcIiA9PT0gaW5wdXQpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vaG9tZUBcXFxcXFxcIiArIG5hbWU7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlbihbXFxcXFxcXCLor6Xmk43kvZzkuI3kvJrliKDpmaTlsI/nqIvluo/vvIzkvYbor6XlsI/nqIvluo/kuIvovb3nmoTmiYDmnInmvKvnlLvlsIbooqvliKDpmaRcXFxcXFxcIl0pO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSwgaXQubmFtZSkuY29uZmlybSgocGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZsaWVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwiLnRnbnVtXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSwgaXQucGF0aCkpXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogaXQubmFtZSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoaSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLnRnbnVtXFxcXFxcXCIsIGkpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSwgaSksXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBsZXQgcGF0aCA9IHRhZ1t0Z251bV0ucGF0aDtcXFxcbiAgICBsZXQgbWhsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcblxcXFxuICAgIGlmIChtaGxpc3QubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLkuIDmnKzkuZ/msqHmnIlcXFxcXFxcIi5iaWcoKSxcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KVxcXFxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGxheW91dCk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBwYWdlVXJsID0gdHlwZSA9PT0gXFxcXFxcXCJub3ZlbFxcXFxcXFwiID8gXFxcXFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFxcXFxcIiA6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbWljQnJvd3Nlci52aWV3XFxcXFxcXCI7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBtaGxpc3QpIHtcXFxcbiAgICAgICAgbGV0IHBpYyA9IGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIGl0ZW0ucGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsgaXRlbS5uYW1lICsgXFxcXFxcXCIuanBnXFxcXFxcXCIpID8gaXRlbS5wYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpdGVtLm5hbWUgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIiA6IENvbmZpZy5kZWZfUGljO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lLFxcXFxuICAgICAgICAgICAgcGljX3VybDogcGljLFxcXFxuICAgICAgICAgICAgdXJsOiBwYWdlVXJsICsgXFxcXFxcXCI/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUudGl0bGUsXFxcXG4gICAgICAgICAgICBleHRyYTogaXRlbVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxcXG59XFxcXG5tYWluKCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcInRleHRfMVxcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7mvKvnlLvmn6XnnItcXFwiLFxcXCJwYXRoXFxcIjpcXFwiQ29taWNCcm93c2VyLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5pZiAoZ2V0UGFyYW0oXFxcXFxcXCJoYXNQYXJhbXNcXFxcXFxcIikgPT09IFxcXFxcXFwidHJ1ZVxcXFxcXFwiKSB7XFxcXG4gICAgTVlfUEFSQU1TID0ge1xcXFxuICAgICAgICBwYXRoOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJwYXRoXFxcXFxcXCIpKSxcXFxcbiAgICAgICAgbmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwibmFtZVxcXFxcXFwiKSlcXFxcbiAgICB9XFxcXG59XFxcXG5sZXQgcGF0aCA9IE1ZX1BBUkFNUy5wYXRoO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwiQ1Z8XFxcXFxcXCIgKyBNWV9QQVJBTVMubmFtZSlcXFxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXFxcXFwiKTtcXFxcblxcXFxudmFyIGxheW91dCA9IFtdO1xcXFxubGV0IG1vZGUgPSBnZXRNeVZhcihcXFxcXFxcIi5tb2RlXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmxldCBpc1JldmVyc2UgPSBnZXRNeVZhcihcXFxcXFxcIi5pc1JldmVyc2VcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIubW9kZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLmlzUmV2ZXJzZVxcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmNvbnN0IGNvbWljU3RhdHVzPW5ldyBNYXAoW1tcXFxcXFxcIkFcXFxcXFxcIixcXFxcXFxcIlxcXFxcXFwiXSxbXFxcXFxcXCJCXFxcXFxcXCIsXFxcXFxcXCLigJjigJhb5pyq5a6M5oiQXeKAmeKAmVxcXFxcXFwiXV0pO1xcXFxuZnVuY3Rpb24gZ2V0VGl0bGUodGl0bGUpIHtcXFxcbiAgICBsZXQgdGl0bGVzID0gVG9vbC5zcGxpdCh0aXRsZSwgXFxcXFxcXCIkXFxcXFxcXCIsIDIpO1xcXFxuICAgIHJldHVybiBjb21pY1N0YXR1cy5nZXQodGl0bGVzWzFdKSt0aXRsZXNbMl0gfHwgdGl0bGU7XFxcXG59XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5Yig6Zmk5pW05pysXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k5Yig6Zmk5pW05pys5ryr55S777yfXFxcXFxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXFxcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoRmlsZS5kZWxldGVGbGllcyhwYXRoKSkge1xcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCBwYXRoKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFtcXFxcXFxcIueci+a8q+eUu1xcXFxcXFwiLCBcXFxcXFxcIuWIoOmZpOeroOiKglxcXFxcXFwiXVttb2RlXSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgobW9kZSkgPT4ge1xcXFxuICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5tb2RlXFxcXFxcXCIsIG1vZGUgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCIxXFxcXFxcXCIgOiBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICB9LCBtb2RlKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KVxcXFxubGV0IG1obGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aCwgXFxcXFxcXCJkaXJcXFxcXFxcIik7XFxcXG5taGxpc3Quc29ydCgoYSwgYikgPT4ge1xcXFxuICAgIGEgPSAoYS5uYW1lLm1hdGNoKC9cXFxcXFxcXGQrLykgfHwgW10pWzBdIHx8IDA7XFxcXG4gICAgYiA9IChiLm5hbWUubWF0Y2goL1xcXFxcXFxcZCsvKSB8fCBbXSlbMF0gfHwgMDtcXFxcbiAgICByZXR1cm4gYSAtIGI7XFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLnq6DoioIgXFxcXFxcXCIuYmlnKCkgKyAoXFxcXFxcXCLlhbHmnIk6XFxcXFxcXCIgKyBtaGxpc3QubGVuZ3RoICsgXFxcXFxcXCLnq6BcXFxcXFxcIikuc21hbGwoKSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLmlzUmV2ZXJzZVxcXFxcXFwiLCBpc1JldmVyc2UgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCIxXFxcXFxcXCIgOiBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICB9LCBpc1JldmVyc2UpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxldCBhcnJheSA9IFtdO1xcXFxubGV0IGxhenkgPSAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGlucHV0KTtcXFxcbiAgICBsZXQgcGljbGlzdCA9IGZpbGVsaXN0Lm1hcCgoaXRlbSwgaSkgPT4gXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBpbnB1dCArIFxcXFxcXFwiL1xcXFxcXFwiICsgKGkgKyAxKSArIFxcXFxcXFwiLmpwZ1xcXFxcXFwiKTtcXFxcbiAgICByZXR1cm4gXFxcXFxcXCJwaWNzOi8vXFxcXFxcXCIgKyBwaWNsaXN0LmpvaW4oXFxcXFxcXCImJlxcXFxcXFwiKTtcXFxcbn0pXFxcXG5pZiAobW9kZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIpIHtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIG1obGlzdCkge1xcXFxuICAgICAgICBhcnJheS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBnZXRUaXRsZShpdGVtLm5hbWUpLFxcXFxuICAgICAgICAgICAgdXJsOiBpdGVtLnBhdGgrbGF6eSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufSBlbHNlIHtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIG1obGlzdCkge1xcXFxuICAgICAgICBsZXQgbmFtZSA9IGdldFRpdGxlKGl0ZW0ubmFtZSk7XFxcXG4gICAgICAgIGFycmF5LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTliKDpmaRbXFxcXFxcXCIgKyBuYW1lICsgXFxcXFxcXCJd77yfXFxcXFxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmxpZXMocGF0aCkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9LCBpdGVtLnBhdGgpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IENvbmZpZy5kZWZfVmlld19TdHlsZVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5pZiAoaXNSZXZlcnNlID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGFycmF5LnJldmVyc2UoKTtcXFxcbn1cXFxcbmxheW91dC5wdXNoLmFwcGx5KGxheW91dCwgYXJyYXkpO1xcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu6IGa5ZCI5pCc57SiXFxcIixcXFwicGF0aFxcXCI6XFxcIlNlYXJjaC52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzP3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLl90aXRsZSk7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb24/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUuX3RpdGxlKTtcXFxcbmxldCBjb21pY1J1bGVEaXJzID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWdbZ2V0UGFyYW0oXFxcXFxcXCJ0eXBlXFxcXFxcXCIpK1xcXFxcXFwiUGF0aFxcXFxcXFwiXSwgXFxcXFxcXCJkaXJcXFxcXFxcIik7XFxcXG5pZiAoZ2V0UGFyYW0oXFxcXFxcXCJpc0FsbFxcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBjb21pY1J1bGVEaXJzID0gY29taWNSdWxlRGlycy5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUgPT09IE1ZX1JVTEUudGl0bGUpO1xcXFxufVxcXFxuXFxcXG5sZXQgc2VhcmNoUmVzdWx0ID0gW107XFxcXG5sZXQgc2VhcmNoVGVybXMgPSBnZXRQYXJhbShcXFxcXFxcInNlYXJjaFRlcm1zXFxcXFxcXCIpO1xcXFxubGV0IHRlcm1zQXJyID0gc2VhcmNoVGVybXMuc3BsaXQoXFxcXFxcXCJcXFxcXFxcIikubWFwKHQgPT4gdC5yZXBsYWNlKC9cXFxcXFxcXCp8XFxcXFxcXFwufFxcXFxcXFxcP3xcXFxcXFxcXCt8XFxcXFxcXFwkfFxcXFxcXFxcXnxcXFxcXFxcXFt8XFxcXFxcXFxdfFxcXFxcXFxcKHxcXFxcXFxcXCl8XFxcXFxcXFx7fFxcXFxcXFxcfXxcXFxcXFxcXHx8XFxcXFxcXFwvfFxcXFxcXFxcXFxcXFxcXFwvZywgayA9PiBcXFxcXFxcIlxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcIiArIGspKTtcXFxcbmxldCByZWcgPSBuZXcgUmVnRXhwKHRlcm1zQXJyLmpvaW4oXFxcXFxcXCIuKlxcXFxcXFwiKSxcXFxcXFxcImlcXFxcXFxcIik7XFxcXG5sZXQgcGFnZVVybD1nZXRQYXJhbShcXFxcXFxcInR5cGVcXFxcXFxcIik9PT1cXFxcXFxcIm5vdmVsXFxcXFxcXCI/XFxcXFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFxcXFxcIjpcXFxcXFxcImhpa2VyOi8vcGFnZS9Db21pY0Jyb3dzZXIudmlld1xcXFxcXFwiO1xcXFxuZm9yIChsZXQgc29uRGlyIG9mIGNvbWljUnVsZURpcnMpIHtcXFxcbiAgICBsZXQgY29taWNMaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChzb25EaXIucGF0aCwgXFxcXFxcXCJkaXJcXFxcXFxcIik7XFxcXG4gICAgZm9yIChsZXQgY29taWMgb2YgY29taWNMaXN0KSB7XFxcXG4gICAgICAgIGlmIChyZWcudGVzdChjb21pYy5uYW1lKSkge1xcXFxuICAgICAgICAgICAgc2VhcmNoUmVzdWx0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBjb21pYy5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IGNvbWljLnBhdGggKyBcXFxcXFxcIi9cXFxcXFxcIiArIGNvbWljLm5hbWUgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6IHBhZ2VVcmwrXFxcXFxcXCI/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUuX3RpdGxlLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6IHNvbkRpci5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiBjb21pY1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG5cXFxcbn1cXFxcbnNldFJlc3VsdChzZWFyY2hSZXN1bHQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2Luiuvue9rlxcXCIsXFxcInBhdGhcXFwiOlxcXCJTZXR0aW5nLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoTVlfUlVMRS50aXRsZSArIFxcXFxcXFwifOiuvue9rlxcXFxcXFwiKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXFxcXFwiKTtcXFxcblxcXFxubGV0IGxheW91dCA9IFtdO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPHN0cm9uZz7ln7rnoYDorr7nva48L3N0cm9uZz5cXFxcXFxcIi5iaWcoKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi55uu5b2V6Lev5b6EXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9zZXR0aW5nVHlwZT1jb250ZW50c1xcXFxcXFwiLFxcXFxuICAgIGRlc2M6IENvbmZpZy5ob21lUGF0aCxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6K6+572u6buY6K6k5bCB6Z2iXFxcXFxcXCIsXFxcXG4gICAgZGVzYzogQ29uZmlnLmRlZl9QaWMsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9zZXR0aW5nVHlwZT1kZWZhdWx0UGljXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCI8c3Ryb25nPuS4i+i9veWZqOiuvue9rjwvc3Ryb25nPlxcXFxcXFwiLmJpZygpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmZ1bmN0aW9uIHNldE51bShrZXksIHRlc3QpIHtcXFxcbiAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgaW5wdXQgPSBwYXJzZUludChpbnB1dCk7XFxcXG4gICAgaWYgKE51bWJlci5pc05hTihpbnB1dCkpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K+36L6T5YWl5pWw5a2XXFxcXFxcXCI7XFxcXG4gICAgaWYgKCF0ZXN0KGlucHV0KSkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kuI3nrKblkIjmnaHku7ZcXFxcXFxcIjtcXFxcbiAgICBDb25maWdba2V5XSA9IGlucHV0O1xcXFxuICAgIHNhdmVGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSk7XFxcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcXFxcXCI7XFxcXG59XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwibG9n5pWwXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKENvbmZpZy5sb2dOdW0sIFxcXFxcXFwiMDxOPDEwMFxcXFxcXFwiKS5pbnB1dChzZXROdW0sIFxcXFxcXFwibG9nTnVtXFxcXFxcXCIsIGl0ID0+IGl0ID4gMCAmJiBpdCA8IDEwMCksXFxcXG4gICAgZGVzYzogXFxcXFxcXCJcXFxcXFxcIiArIENvbmZpZy5sb2dOdW0sXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5YiG5om55LiL6L295pWwKDDkuI3lvIDlkK8pXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiXFxcXFxcXCIgKyBDb25maWcudGhyZWFkTnVtLCBcXFxcXFxcIk4+LTFcXFxcXFxcIikuaW5wdXQoc2V0TnVtLCBcXFxcXFxcInRocmVhZE51bVxcXFxcXFwiLCBpdCA9PiBpdCA+IC0xKSxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIlxcXFxcXFwiICsgQ29uZmlnLnRocmVhZE51bSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCI8c3Ryb25nPuWwj+ivtOmYheivu+WZqOiuvue9rjwvc3Ryb25nPlxcXFxcXFwiLmJpZygpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLpu5jorqTlvIDlkK/liIbpobXpmIXor7tcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoZGVmX2lzUGFnaW5hdGUpID0+IHtcXFxcbiAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgICAgIENvbmZpZy5kZWZfaXNQYWdpbmF0ZSA9IGRlZl9pc1BhZ2luYXRlID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwiMVxcXFxcXFwiIDogXFxcXFxcXCIwXFxcXFxcXCI7XFxcXG5cXFxcbiAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgfSwgQ29uZmlnLmRlZl9pc1BhZ2luYXRlKSxcXFxcbiAgICBkZXNjOiBDb25maWcuZGVmX2lzUGFnaW5hdGUgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCLkuI3lvIDlkK9cXFxcXFxcIiA6IFxcXFxcXFwi5byA5ZCvXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5q+P6aG15pyA5aSn56ug5pWwXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKENvbmZpZy52aWV3UGFnZVNpemUsIFxcXFxcXFwiMzA8Tjw1MDBcXFxcXFxcIikuaW5wdXQoc2V0TnVtLCBcXFxcXFxcInZpZXdQYWdlU2l6ZVxcXFxcXFwiLCBpdCA9PiBpdCA+IDMwICYmIGl0IDwgNTAwKSxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIlxcXFxcXFwiICsgQ29uZmlnLnZpZXdQYWdlU2l6ZSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5pu/5o2i6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoIz9zZXR0aW5nVHlwZT1yZXBsYWNlUnVsZVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCI8c3Ryb25nPuWFtuS7luiuvue9rjwvc3Ryb25nPlxcXFxcXFwiLmJpZygpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6KeE5YiZ5Y+R5biD6aG1XFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGx2ZXI6IE1ZX1BBUkFNUy52ZXJzaW9uIHx8IFxcXFxcXFwi6I635Y+W54mI5pys5aSx6LSl77yM6Ieq6KGM5p+l55yLXFxcXFxcXCIsXFxcXG4gICAgICAgIGlkOiBcXFxcXFxcIjM1NTlcXFxcXFxcIlxcXFxuICAgIH0sXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuWFs+S6juWmguS9leiwg+eUqFxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJodHRwczovL3F1bi5xcS5jb20vcXF3ZWIvcXVucHJvL3NoYXJlP193dj0zJl93d3Y9MTI4Jmludml0ZUNvZGU9MUhGeUJKJmZyb209MjQ2NjEwJmJpej1rYVxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+m57uG54K55Ye75Yqg5YWl6aKR6YGT77yM6aKR6YGT6YeMQExveURnSWtcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5oGi5aSN6buY6K6k6K6+572uXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k5oGi5aSN6buY6K6k6K6+572u77yfXFxcXFxcXCIpLmNvbmZpcm0oKCkgPT4ge1xcXFxuICAgICAgICBkZWxldGVGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mgaLlpI3lrozmiJBcXFxcXFxcIjtcXFxcbiAgICB9KSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5riF55CG57yT5a2YXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/c2V0dGluZ1R5cGU9Y2FjaGVcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG4vKlxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIua4hemZpOWwj+ivtOWIhumhteiusOW9lVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuehruiupOa4hemZpOWwj+ivtOWIhumhteiusOW9le+8n1xcXFxcXFwiKS5jb25maXJtKCgpID0+IHtcXFxcbiAgICAgICAgZGVsZXRlRmlsZShcXFxcXFxcIm5vdmVsRm9vdHByaW50Lmpzb25cXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcXFxcXCI7XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuKi9cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJ0ZXh0XzFcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu5bCP6K+05p+l55yLXFxcIixcXFwicGF0aFxcXCI6XFxcIk5vdmVsQnJvd3Nlci52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuaWYgKGdldFBhcmFtKFxcXFxcXFwiaGFzUGFyYW1zXFxcXFxcXCIpID09PSBcXFxcXFxcInRydWVcXFxcXFxcIikge1xcXFxuICAgIE1ZX1BBUkFNUyA9IHtcXFxcbiAgICAgICAgcGF0aDogZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwicGF0aFxcXFxcXFwiKSksXFxcXG4gICAgICAgIG5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFxcXFxcIm5hbWVcXFxcXFxcIikpXFxcXG4gICAgfVxcXFxufVxcXFxubGV0IHBhdGggPSBNWV9QQVJBTVMucGF0aDtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIk5WfFxcXFxcXFwiICsgTVlfUEFSQU1TLm5hbWUpO1xcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXFxcbiAgICBmb290OiAwLFxcXFxuICAgIGlzUmVwbGFjZTogdHJ1ZVxcXFxufSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG5sZXQgaWQgPSBcXFxcXFxcIiNcXFxcXFxcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcXFxudmFyIGxheW91dCA9IFtdO1xcXFxubGV0IG1vZGUgPSBnZXRNeVZhcihcXFxcXFxcIi5tb2RlXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmxldCBtb2RlMiA9IGdldE15VmFyKFxcXFxcXFwiLm1vZGUyXFxcXFxcXCIsIENvbmZpZy5kZWZfaXNQYWdpbmF0ZSk7XFxcXG5cXFxcbmxldCBpc1JldmVyc2UgPSBnZXRNeVZhcihcXFxcXFxcIi5pc1JldmVyc2VcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIubW9kZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLm1vZGUyXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIuaXNSZXZlcnNlXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIucGFnZU51bVxcXFxcXFwiKTtcXFxcbn0pKTtcXFxcblxcXFxuZnVuY3Rpb24gZ2V0VGl0bGUodGl0bGUpIHtcXFxcbiAgICBsZXQgdGl0bGVzID0gVG9vbC5zcGxpdCh0aXRsZSwgXFxcXFxcXCIkXFxcXFxcXCIsIDIpO1xcXFxuICAgIHJldHVybiB0aXRsZXNbMl0gIT09IHVuZGVmaW5lZCA/IHRpdGxlc1syXS5zbGljZSgwLCB0aXRsZXNbMl0ubGFzdEluZGV4T2YoXFxcXFxcXCIuXFxcXFxcXCIpKSA6IHRpdGxlO1xcXFxufVxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuWIoOmZpOaVtOacrFxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuehruiupOWIoOmZpOaVtOacrOWwj+ivtO+8n1xcXFxcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxcXG4gICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmxpZXMocGF0aCkpIHtcXFxcbiAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSwgcGF0aCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFtcXFxcXFxcIueci+Wwj+ivtFxcXFxcXFwiLCBcXFxcXFxcIuWIoOmZpOeroOiKglxcXFxcXFwiXVttb2RlXSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgobW9kZSkgPT4ge1xcXFxuICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5tb2RlXFxcXFxcXCIsIG1vZGUgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCIxXFxcXFxcXCIgOiBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICB9LCBtb2RlKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLigJjigJjmm7TlpJrlip/og70gPuKAmeKAmVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxuZnVuY3Rpb24gdHh0KHBhdGhzKSB7XFxcXG4gICAgc2hvd0xvYWRpbmcoXFxcXFxcXCLmraPlnKjlkIjlubYuLi5cXFxcXFxcIik7XFxcXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgIGNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXFxcXFwiKTtcXFxcbiAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG5cXFxcbiAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGhzLnBhdGgsIFxcXFxcXFwiZmlsZVxcXFxcXFwiLCBcXFxcXFxcIi50eHRcXFxcXFxcIik7XFxcXG4gICAgbGV0IGxpc3RMZW5ndGggPSBmaWxlbGlzdC5sZW5ndGg7XFxcXG4gICAgaWYgKGxpc3RMZW5ndGggPT09IDApIHtcXFxcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/nqbrnmoTnq6DoioJcXFxcXFxcIjtcXFxcbiAgICB9XFxcXG4gICAgY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXFxcbiAgICAgICAgc2VsZWN0ZWQ6IFtdLFxcXFxuICAgICAgICBpc1JlcGxhY2U6IHRydWVcXFxcbiAgICB9LCBKU09OLnBhcnNlKCQubG9nKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRocy5wYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSkgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG4gICAgbGV0IGJ1ZmlsZWxpc3QgPSBbXTtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xcXFxuICAgICAgICBsZXQgZmlsZSA9IGZpbGVsaXN0W2ldO1xcXFxuICAgICAgICBsZXQgZmlsZUluZm8gPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcXFxcXCIkXFxcXFxcXCIsIDIpO1xcXFxuICAgICAgICBidWZpbGVsaXN0LnB1c2goe1xcXFxuICAgICAgICAgICAgbmFtZTogZmlsZUluZm9bMl0uc2xpY2UoMCwgZmlsZUluZm9bMl0ubGFzdEluZGV4T2YoXFxcXFxcXCIuXFxcXFxcXCIpKSxcXFxcbiAgICAgICAgICAgIHBhdGg6IFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgZmlsZS5wYXRoLFxcXFxuICAgICAgICAgICAgaWQ6IE51bWJlcihmaWxlSW5mb1swXSkgfHwgMFxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgYnVmaWxlbGlzdC5zb3J0KChhLCBiKSA9PiBhLmlkIC0gYi5pZCk7XFxcXG4gICAgbGV0IGVudGlyZVBhdGggPSBwYXRocy5wYXRoLnJlcGxhY2UoQ29uZmlnLm5vdmVsUGF0aCwgQ29uZmlnLm5vdmVsRnVsbFBhdGgpICsgXFxcXFxcXCIudHh0XFxcXFxcXCI7XFxcXG4gICAgbGV0IGVudGlyZVBhdGh0byA9IGJvb2tJbmZvLmlzUmVwbGFjZSA/IGVudGlyZVBhdGggKyBcXFxcXFxcIi50bXBcXFxcXFxcIiA6IGVudGlyZVBhdGg7XFxcXG5cXFxcbiAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgZW50aXJlUGF0aCkpIHtcXFxcbiAgICAgICAgdG9hc3QoXFxcXFxcXCLliJ3lp4vljJbmlofku7ZcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmICghRmlsZS5kZWxldGVGbGllcyhlbnRpcmVQYXRoKSkge1xcXFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yid5aeL5YyW5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICB0b2FzdChcXFxcXFxcIuWIneWni+WMluaIkOWKn1xcXFxcXFwiKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBpdGVtID0gYnVmaWxlbGlzdFtpXTtcXFxcbiAgICAgICAgbGV0IGNvbnRlbnQgPSByZXF1ZXN0KGl0ZW0ucGF0aCk7XFxcXG4gICAgICAgIEZpbGUuZmlsZVdyaXRlQXBwZW5kKGVudGlyZVBhdGh0bywgaXRlbS5uYW1lICsgXFxcXFxcXCJcXFxcXFxcXG7jgIDjgIBcXFxcXFxcIiArIGNvbnRlbnQucmVwbGFjZSgvXlxcXFxcXFxccyt8XFxcXFxcXFxzKyQvZ20sIFxcXFxcXFwiXFxcXFxcXCIpLnNwbGl0KC9cXFxcXFxcXG4rLykuam9pbihcXFxcXFxcIlxcXFxcXFxccuOAgOOAgFxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXFxuXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIGlmIChib29rSW5mby5pc1JlcGxhY2UpIHtcXFxcbiAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGxlbiA9IHJ1bGVMaXN0Lmxlbmd0aDtcXFxcbiAgICAgICAgbGV0IHJlcGxhY2VQYXR0ZXJuID0gW1xcXFxcXFwicmVwbGFjZVxcXFxcXFwiLCBcXFxcXFxcInJlcGxhY2VBbGxcXFxcXFxcIl07XFxcXG4gICAgICAgIGxldCBmbGFnID0gRmlsZS5maWxlUnVsZShlbnRpcmVQYXRodG8sIGVudGlyZVBhdGgsIChqYXZhU3RyaW5nKSA9PiB7XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VSdWxlID0gcnVsZUxpc3RbaV07XFxcXG4gICAgICAgICAgICAgICAgaWYgKCFib29rSW5mby5zZWxlY3RlZC5pbmNsdWRlcyhyZXBsYWNlUnVsZS5pZCkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlID0gcmVwbGFjZVBhdHRlcm5bMCArIHJlcGxhY2VSdWxlLmlzUmVnZXhdO1xcXFxuICAgICAgICAgICAgICAgIGphdmFTdHJpbmcgPSBqYXZhU3RyaW5nW3JlcGxhY2VdKHJlcGxhY2VSdWxlLnBhdHRlcm4sIHJlcGxhY2VSdWxlLnJlcGxhY2VtZW50KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBqYXZhU3RyaW5nLmdldEJ5dGVzKCk7XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBpZiAoIWZsYWcpIHtcXFxcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WQiOW5tuWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICB9XFxcXG4gICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WQiOW5tuWujOaIkFxcXFxcXFwiO1xcXFxufVxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuWQiOW5tuWwj+ivtFxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuehruWumuWQiOW5tj9cXFxcXFxcXG7kvJropobnm5blt7LmnIlUWFRcXFxcXFxcIikuY29uZmlybSh0eHQsIE1ZX1BBUkFNUyksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogW1xcXFxcXFwi4piQ5YiG6aG1XFxcXFxcXCIsIFxcXFxcXFwi4piR5YiG6aG1XFxcXFxcXCJdW21vZGUyXSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgobW9kZTIpID0+IHtcXFxcbiAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIubW9kZTJcXFxcXFxcIiwgbW9kZTIgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCIxXFxcXFxcXCIgOiBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgfSwgbW9kZTIpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5YeA5YyWXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbEN1c3RvbS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IE1ZX1BBUkFNUyxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuWklumDqOafpeeci1xcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChwYXRoKSA9PiB7XFxcXG4gICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGVudGlyZVBhdGggPSBwYXRoLnJlcGxhY2UoQ29uZmlnLm5vdmVsUGF0aCwgQ29uZmlnLm5vdmVsRnVsbFBhdGgpICsgXFxcXFxcXCIudHh0XFxcXFxcXCI7XFxcXG4gICAgICAgIGlmIChmaWxlRXhpc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBlbnRpcmVQYXRoKSkge1xcXFxuICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLosIPnlKjnrKzkuInmlrnlupTnlKjmiZPlvIDmlofku7ZcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJvcGVuRmlsZTovL2ZpbGU6Ly9cXFxcXFxcIiArIGVudGlyZVBhdGhcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pys5Zyw5pqC5peg5Y+v5L6b5aSW6YOo5omT5byA55qEdHh05paH5Lu277yM6K+35YWI5ZCI5bm25bCP6K+077yBXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sIHBhdGgpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGV0IG1obGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aCwgXFxcXFxcXCJmaWxlXFxcXFxcXCIsIFxcXFxcXFwiLnR4dFxcXFxcXFwiKTtcXFxcbm1obGlzdC5zb3J0KChhLCBiKSA9PiB7XFxcXG4gICAgYSA9IChhLm5hbWUubWF0Y2goL1xcXFxcXFxcZCsvKSB8fCBbXSlbMF0gfHwgMDtcXFxcbiAgICBiID0gKGIubmFtZS5tYXRjaCgvXFxcXFxcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcXFxuICAgIHJldHVybiBhIC0gYjtcXFxcbn0pO1xcXFxubGV0IGNoYXB0ZXJMaXN0ID0gW107XFxcXG5sZXQgY2hhcHRlckNvdW50ID0gbWhsaXN0Lmxlbmd0aDtcXFxcblxcXFxuaWYgKG1vZGUyID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGxldCBtaGxpc3RDaHVuayA9IFRvb2wuY2h1bmsobWhsaXN0LCBDb25maWcudmlld1BhZ2VTaXplKTtcXFxcbiAgICBsZXQgdmlld1BhZ2VDb3VudCA9IG1obGlzdENodW5rLmxlbmd0aDtcXFxcbiAgICBsZXQgZGVmUGFnZSA9ICh2aWV3UGFnZUNvdW50IC0gMSA8IGJvb2tJbmZvLmZvb3QgPyAwIDogYm9va0luZm8uZm9vdCkgfHwgMDtcXFxcbiAgICBsZXQgcGFnZU51bSA9IE51bWJlcihnZXRNeVZhcihcXFxcXFxcIi5wYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyBkZWZQYWdlKSk7XFxcXG4gICAgY2hhcHRlckxpc3QgPSBtaGxpc3RDaHVua1twYWdlTnVtXSB8fCBbXTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLnq6DoioIgXFxcXFxcXCIuYmlnKCkgKyAoXFxcXFxcXCLmnKzpobU6XFxcXFxcXCIgKyBjaGFwdGVyTGlzdC5sZW5ndGggKyBcXFxcXFxcIiDlhbHmnIk6XFxcXFxcXCIgKyBjaGFwdGVyQ291bnQgKyBcXFxcXFxcIueroCDlvZPliY06XFxcXFxcXCIgKyAocGFnZU51bSArIDEpICsgXFxcXFxcXCIvXFxcXFxcXCIgKyB2aWV3UGFnZUNvdW50KS5zbWFsbCgpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5pc1JldmVyc2VcXFxcXFxcIiwgaXNSZXZlcnNlID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwiMVxcXFxcXFwiIDogXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSwgaXNSZXZlcnNlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIui3s+mbhlxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoY2hhcHRlckNvdW50LCBcXFxcXFxcIui+k+WFpei3s+i9rOeroOiKgiAxLVxcXFxcXFwiICsgY2hhcHRlckNvdW50KS5pbnB1dCgoY2hhcHRlckNvdW50LCBwYWdlTnVtLCB2aWV3UGFnZVNpemUsIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IE51bWJlcihpbnB1dCk7XFxcXG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0TnVtKSB8fCBpbnB1dE51bSA8IDAgfHwgaW5wdXROdW0gPiBjaGFwdGVyQ291bnQpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ivt+i+k+WFpeato+ehruiMg+WbtOWGheeahOaVsOWtl1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaW5wdXROdW0gPSBNYXRoLmZsb29yKChpbnB1dE51bSArIHZpZXdQYWdlU2l6ZSkgLyB2aWV3UGFnZVNpemUpIC0gMTtcXFxcbiAgICAgICAgICAgIGlmIChwYWdlTnVtID09PSBpbnB1dE51bSkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mraPlnKjlvZPliY3pobXpnaJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLnBhZ2VOdW1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIGlucHV0TnVtKTtcXFxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGgsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIH0sIGNoYXB0ZXJDb3VudCwgcGFnZU51bSwgQ29uZmlnLnZpZXdQYWdlU2l6ZSwgcGF0aCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfNVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLot7PpobVcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKHBhZ2VOdW0gKyAxLCBcXFxcXFxcIui3s+i9rOmhteaVsCAxLVxcXFxcXFwiICsgdmlld1BhZ2VDb3VudCkuaW5wdXQoKHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IE51bWJlcihpbnB1dCkgLSAxO1xcXFxuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihpbnB1dE51bSkgfHwgaW5wdXROdW0gPCAwIHx8IGlucHV0TnVtID4gdmlld1BhZ2VDb3VudCAtIDEpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ivt+i+k+WFpeato+ehruiMg+WbtOWGheeahOaVsOWtl1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPT09IGlucHV0TnVtKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ato+WcqOW9k+WJjemhtemdolxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIucGFnZU51bVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiICsgaW5wdXROdW0pO1xcXFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgfSwgdmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfNVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkuIrkuIDpobVcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHBhZ2VOdW0sIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IHBhZ2VOdW0gLSAxO1xcXFxuICAgICAgICAgICAgaWYgKGlucHV0TnVtIDwgMCkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey57uP5piv56ys5LiA6aG15LqGXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5wYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyBpbnB1dE51bSk7XFxcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCBwYWdlTnVtLCBwYXRoKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF81XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuS4i+S4gOmhtVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gcGFnZU51bSArIDE7XFxcXG4gICAgICAgICAgICBpZiAoaW5wdXROdW0gPiB2aWV3UGFnZUNvdW50IC0gMSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5ZCO5LiA6aG15LqGXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5wYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyBpbnB1dE51bSk7XFxcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCB2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF81XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuacq+mhtVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gdmlld1BhZ2VDb3VudCAtIDE7XFxcXG4gICAgICAgICAgICBpZiAocGFnZU51bSA9PT0gaW5wdXROdW0gfHwgaW5wdXROdW0gPT09IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7Lnu4/mmK/mnIDlkI7kuIDpobXkuoZcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLnBhZ2VOdW1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIGlucHV0TnVtKTtcXFxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzVcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufSBlbHNlIHtcXFxcbiAgICBjaGFwdGVyTGlzdCA9IG1obGlzdDtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLnq6DoioIgXFxcXFxcXCIuYmlnKCkgKyAoXFxcXFxcXCLlhbHmnIk6XFxcXFxcXCIgKyBjaGFwdGVyQ291bnQgKyBcXFxcXFxcIueroFxcXFxcXFwiKS5zbWFsbCgpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5pc1JldmVyc2VcXFxcXFxcIiwgaXNSZXZlcnNlID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwiMVxcXFxcXFwiIDogXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSwgaXNSZXZlcnNlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmxldCBhcnJheSA9IFtdO1xcXFxuaWYgKG1vZGUgPT09IFxcXFxcXFwiMFxcXFxcXFwiKSB7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjaGFwdGVyTGlzdCkge1xcXFxuICAgICAgICBsZXQgbmFtZSA9IGdldFRpdGxlKGl0ZW0ubmFtZSk7XFxcXG4gICAgICAgIGFycmF5LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL05vdmVsTWFpbkJvZHkjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgcGF0aDogaXRlbS5wYXRoLFxcXFxuICAgICAgICAgICAgICAgIGRpclBhdGg6IHBhdGgsXFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IENvbmZpZy5kZWZfVmlld19TdHlsZVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59IGVsc2Uge1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY2hhcHRlckxpc3QpIHtcXFxcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRUaXRsZShpdGVtLm5hbWUpO1xcXFxuICAgICAgICBhcnJheS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k5Yig6ZmkW1xcXFxcXFwiICsgbmFtZSArIFxcXFxcXFwiXe+8n1xcXFxcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZsaWVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSwgaXRlbS5wYXRoKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuaWYgKGlzUmV2ZXJzZSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBhcnJheS5yZXZlcnNlKCk7XFxcXG59XFxcXG5sYXlvdXQucHVzaC5hcHBseShsYXlvdXQsIGFycmF5KTtcXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuWwj+ivtOato+aWh+mYheivu1xcXCIsXFxcInBhdGhcXFwiOlxcXCJOb3ZlbE1haW5Cb2R5XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxudmFyIGxheW91dCA9IFtdO1xcXFxubGV0IGNvbnRlbnQgPSByZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgTVlfUEFSQU1TLnBhdGgpO1xcXFxuLy9jb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9cXFxcXFxcXG58XFxcXFxcXFxyL2csIFxcXFxcXFwiPGJyPlxcXFxcXFwiKS5yZXBsYWNlKC8oJm5ic3A7KSsvZyxcXFxcXFxcIiBcXFxcXFxcIik7XFxcXG5jb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgIHNlbGVjdGVkOiBbXSxcXFxcbiAgICBpc1JlcGxhY2U6IHRydWVcXFxcbn0sIEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIE1ZX1BBUkFNUy5kaXJQYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpKTtcXFxcblxcXFxuaWYgKGJvb2tJbmZvLmlzUmVwbGFjZSkge1xcXFxuICAgIGxldCBqYXZhU3RyaW5nID0gamF2YS5sYW5nLlN0cmluZyhjb250ZW50KTtcXFxcbiAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgIGxldCByZXBsYWNlUGF0dGVybiA9IFtcXFxcXFxcInJlcGxhY2VcXFxcXFxcIiwgXFxcXFxcXCJyZXBsYWNlQWxsXFxcXFxcXCJdO1xcXFxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcXFxuICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXFxcbiAgICAgICAgaWYgKCFib29rSW5mby5zZWxlY3RlZC5pbmNsdWRlcyhyZXBsYWNlUnVsZS5pZCkpIHtcXFxcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCByZXBsYWNlID0gcmVwbGFjZVBhdHRlcm5bMCArIHJlcGxhY2VSdWxlLmlzUmVnZXhdO1xcXFxuICAgICAgICBqYXZhU3RyaW5nID0gamF2YVN0cmluZ1tyZXBsYWNlXShyZXBsYWNlUnVsZS5wYXR0ZXJuLCByZXBsYWNlUnVsZS5yZXBsYWNlbWVudCk7XFxcXG4gICAgfVxcXFxuICAgIGNvbnRlbnQgPSBTdHJpbmcoamF2YVN0cmluZyk7XFxcXG59XFxcXG5jb250ZW50ID0gXFxcXFxcXCLjgIDjgIBcXFxcXFxcIiArIGNvbnRlbnQucmVwbGFjZSgvXlxcXFxcXFxccyt8XFxcXFxcXFxzKyQvZ20sIFxcXFxcXFwiXFxcXFxcXCIpLnNwbGl0KC9cXFxcXFxcXG4rLykuam9pbihcXFxcXFxcIjxicj7jgIDjgIBcXFxcXFxcIik7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIixcXFxcbiAgICB0aXRsZTogKFxcXFxcXFwiPHN0cm9uZz5cXFxcXFxcIiArIE1ZX1BBUkFNUy50aXRsZSArIFxcXFxcXFwiPC9zdHJvbmc+XFxcXFxcXCIpLmJpZygpLFxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogY29udGVudCxcXFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGV4dFNpemU6IDE4LFxcXFxuICAgICAgICBjbGljazogdHJ1ZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcInRleHRfMVxcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7lsI/or7Tlhajpm4bmn6XnnItcXFwiLFxcXCJwYXRoXFxcIjpcXFwiTm92ZWxDb2xsZWN0ZWQudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXFxcXFwiKTtcXFxcbmxldCBydWxlbERpciA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnLm5vdmVsRnVsbFBhdGgsIFxcXFxcXFwiZGlyXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgbGF5b3V0ID0gW107XFxcXG5cXFxcbmZ1bmN0aW9uIG9wZXJhdGlvbihwYXRoKSB7XFxcXG4gICAgc3dpdGNoIChpbnB1dCkge1xcXFxuICAgICAgICBjYXNlIFxcXFxcXFwi5YiG5LqrXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJzaGFyZTovL1xcXFxcXFwiICsgcGF0aDtcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICBjYXNlIFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGbGllcyhwYXRoKSkge1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICBjYXNlIFxcXFxcXFwi5rW36ZiU6aKE6KeIXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJlZGl0RmlsZTovL2ZpbGU6Ly9cXFxcXFxcIiArIHBhdGg7XFxcXG4gICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgY2FzZSBcXFxcXFxcIuaJk+W8gOaWueW8j1xcXFxcXFwiOlxcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwib3BlbkZpbGU6Ly9maWxlOi8vXFxcXFxcXCIgKyBwYXRoO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgfVxcXFxufVxcXFxuZm9yIChsZXQgcnVsZVBhdGhzIG9mIHJ1bGVsRGlyKSB7XFxcXG4gICAgbGV0IG5vdmVscyA9IEZpbGUuZ2V0RmlsZVBhdGgocnVsZVBhdGhzLnBhdGgsIFxcXFxcXFwiZmlsZVxcXFxcXFwiKTtcXFxcbiAgICBmb3IgKGxldCBub3ZlbCBvZiBub3ZlbHMpIHtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IG5vdmVsLm5hbWUsXFxcXG4gICAgICAgICAgICB1cmw6ICQoW1xcXFxcXFwi5YiG5LqrXFxcXFxcXCIsIFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCIsIFxcXFxcXFwi5rW36ZiU6aKE6KeIXFxcXFxcXCIsIFxcXFxcXFwi5omT5byA5pa55byPXFxcXFxcXCJdLCAxKS5zZWxlY3Qob3BlcmF0aW9uLCBub3ZlbC5wYXRoKSxcXFxcbiAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwi5p2l5rqQ77yaXFxcXFxcXCIgKyBydWxlUGF0aHMubmFtZSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbmlmIChsYXlvdXQubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFxcXFxcInRleHQtYWxpZ246IGNlbnRlcjtcXFxcXFxcIj7llaXpg73msqHmnInogLY8L2gxPicsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7mm7TlpJrorr7nva5cXFwiLFxcXCJwYXRoXFxcIjpcXFwiU2V0dGluZy9Nb3JlLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG5cXFxcbmNvbnN0IHNldHRpbmdUeXBlID0gTVlfUEFSQU1TLnNldHRpbmdUeXBlIHx8IGdldFBhcmFtKFxcXFxcXFwic2V0dGluZ1R5cGVcXFxcXFxcIik7XFxcXG5cXFxcbmxldCBsYXlvdXQgPSBbXTtcXFxcbmxldCBpZCA9IFxcXFxcXFwiI1xcXFxcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG5zd2l0Y2ggKHNldHRpbmdUeXBlKSB7XFxcXG4gICAgY2FzZSBcXFxcXFxcImNhY2hlXFxcXFxcXCI6XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIua4hemZpOe8k+WtmHzorr7nva5cXFxcXFxcIik7XFxcXG4gICAgICAgIGNvbnN0IGtub3duTGlzdCA9IG5ldyBNYXAoW1xcXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcubm92ZWxQYXRoKSwgXFxcXFxcXCIj566h55CG5ZmoI+Wwj+ivtOe8k+WtmOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcuY29taWNQYXRoKSwgXFxcXFxcXCIj566h55CG5ZmoI+a8q+eUu+e8k+WtmOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcubm92ZWxGdWxsUGF0aCksIFxcXFxcXFwiI+euoeeQhuWZqCPlsI/or7TlkIjlubbnm67lvZVb5Y+v5Lul5riF6ZmkXVxcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgIFtcXFxcXFxcImRy56ug6IqC57yT5a2YXFxcXFxcXCIsIFxcXFxcXFwi6YGT6ZW/5qih5p2/5Li05pe257yT5a2YW+W7uuiurua4hemZpF1cXFxcXFxcIl1cXFxcbiAgICAgICAgXSk7XFxcXG5cXFxcbiAgICAgICAgbGV0IGNhY2hlRGlyID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWcuaG9tZVBhdGgsIFxcXFxcXFwiZGlyXFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFuQ2FjaGUocGF0aCkge1xcXFxuICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmxpZXMocGF0aCkpIHtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/muIXpmaTlrozmiJBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/muIXpmaTlpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBmb3IgKGxldCBjYWNoZSBvZiBjYWNoZURpcikge1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBjYWNoZS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwi5aSn5bCP77yaXFxcXFxcXCIgKyBGaWxlLmdldEZpbGVTaXplKGNhY2hlLnBhdGgpICsgXFxcXFxcXCJcXFxcXFxcXG7mj4/ov7DvvJpcXFxcXFxcIiArIGtub3duTGlzdC5nZXQoY2FjaGUubmFtZSkgfHwgXFxcXFxcXCLmnKrnn6Xnm67lvZVb6aOO6Zmp5pyq55+lXVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFxcXFxcIuehruiupOa4hemZpCBcXFxcXFxcIiArIGNhY2hlLm5hbWUgKyBcXFxcXFxcIiA/XFxcXFxcXCIpLmNvbmZpcm0oY2xlYW5DYWNoZSwgY2FjaGUucGF0aClcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5YWo6YOo5riF6ZmkKFxcXFxcXFwiICsgRmlsZS5nZXRGaWxlU2l6ZShDb25maWcuaG9tZVBhdGgpICsgXFxcXFxcXCIpXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTmuIXpmaTlhajpg6jnvJPlrZjmlbDmja4/XFxcXFxcXCIpLmNvbmZpcm0oY2xlYW5DYWNoZSwgQ29uZmlnLmhvbWVQYXRoKVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSBcXFxcXFxcImRlZmF1bHRQaWNcXFxcXFxcIjpcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXFxcXFwi6buY6K6k5bCB6Z2ifOiuvue9rlxcXFxcXFwiKTtcXFxcblxcXFxuICAgICAgICBmdW5jdGlvbiBzZXREZWZhdWx0UGljKHVybCkge1xcXFxuICAgICAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgQ29uZmlnLmRlZl9QaWMgPSB1cmw7XFxcXG4gICAgICAgICAgICBzYXZlRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZykpO1xcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSA0OyBpKyspIHtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLlm77niYdcXFxcXFxcIiArIGksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibW92aWVfM1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9waWNcXFxcXFxcIiArIGksXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoc2V0RGVmYXVsdFBpYywgXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX3BpY1xcXFxcXFwiICsgaSlcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgXFxcXFxcXCJyZXBsYWNlUnVsZVxcXFxcXFwiOlxcXFxuICAgICAgICBpZiAoTVlfUEFSQU1TLmlzUmVmcmVzaCkge1xcXFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4gcmVmcmVzaFBhZ2UoKSkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIuabv+aNouinhOWImXzorr7nva5cXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuaWsOW7uuabv+aNolxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9lZGl0UmVwbGFjZVJ1bGUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoIz9pc05ldz10cnVlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85Ye66KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTlr7zlh7pcXFxcXFxcIiArIHJ1bGVMaXN0Lmxlbmd0aCArIFxcXFxcXFwi5p2h6KeE5YiZ77yfXFxcXFxcXFxuKHtob21lUHRhaH0vcmVwbGFjZVJ1bGUuanNvbilcXFxcXFxcIikuY29uZmlybSgobnVtKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBzYXZlUHRhID0gQ29uZmlnLmhvbWVQYXRoICsgXFxcXFxcXCIvcmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShzYXZlUHRhLCByZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBsb2coXFxcXFxcXCJcXFxcXFxcXG7ot6/lvoTvvJpcXFxcXFxcIiArIHNhdmVQdGEgKyBcXFxcXFxcIlxcXFxcXFxcbuWvvOWHuuinhOWImSBcXFxcXFxcIiArIG51bSArIFxcXFxcXFwiIOadoVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJzaGFyZTovL1xcXFxcXFwiICsgc2F2ZVB0YTtcXFxcbiAgICAgICAgICAgIH0sIHJ1bGVMaXN0Lmxlbmd0aCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85YWl6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCJcXFxcXFxcIiwgXFxcXFxcXCLovpPlhaXop4TliJnmlofku7bot6/lvoQoKi5qc29uKVxcXFxcXFwiLCBcXFxcXFxcIuinhOWImeWvvOWFpVxcXFxcXFwiKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zdGFydHNXaXRoKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiKSA/IGlucHV0IDogXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBpbnB1dFxcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlVGV4dCA9IHJlcXVlc3QoaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgIGlmICghcnVsZVRleHQpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6I635Y+W5paH5Lu25Li656m6XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1J1bGVMaXN0ID0gSlNPTi5wYXJzZShydWxlVGV4dCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdDb3VudCA9IDAsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb3VudCA9IDA7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gbmV3UnVsZUxpc3QpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdSdWxlID0gbmV3UnVsZUxpc3RbaV07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZighbmV3UnVsZS5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcInJlcGxhY2VtZW50XFxcXFxcXCIpfHwhbmV3UnVsZS5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcInBhdHRlcm5cXFxcXFxcIil8fCFuZXdSdWxlLmhhc093blByb3BlcnR5KFxcXFxcXFwibmFtZVxcXFxcXFwiKXx8KG5ld1J1bGUuc2NvcGVDb250ZW50PT09dW5kZWZpbmVkP2ZhbHNlOiFuZXdSdWxlLnNjb3BlQ29udGVudCkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkID0gbmV3UnVsZS5pZDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1J1bGUuaWQgPSBpZCB8fCBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZEluZGV4ID0gcnVsZUxpc3QuZmluZEluZGV4KHJ1bGUgPT4gcnVsZS5pZCA9PT0gaWQpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkSW5kZXggPiAtMSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvdW50Kys7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUxpc3Quc3BsaWNlKGlkSW5kZXgsIDEsIG5ld1J1bGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb3VudCsrO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVMaXN0LnB1c2gobmV3UnVsZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFxcXFxcIlxcXFxcXFxcbui3r+W+hO+8mlxcXFxcXFwiICsgaW5wdXQgKyBcXFxcXFxcIlxcXFxcXFxcbuaAu+inhOWImeaVsO+8mlxcXFxcXFwiICsgbmV3UnVsZUxpc3QubGVuZ3RoICsgXFxcXFxcXCJcXFxcXFxcXG7mm7TmlrDop4TliJkgXFxcXFxcXCIgKyB1cGRhdGVDb3VudCArIFxcXFxcXFwiIOadoVxcXFxcXFxcdOaWsOWinuinhOWImSBcXFxcXFxcIiArIG5ld0NvdW50ICsgXFxcXFxcXCIg5p2hXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WvvOWFpeaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5a+85YWl5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcnVsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXFxcbiAgICAgICAgICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiByZXBsYWNlUnVsZS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXFxcXFwiLlxcXFxcXFwiICsgaSxcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGlkLCBpbmRleCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgZyA9IHJ1bGVMaXN0LnNwbGljZShpbmRleCwgMSk7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlSXRlbUJ5Q2xzKGlkICsgXFxcXFxcXCIuXFxcXFxcXCIgKyBpbmRleCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLliKDpmaTmiJDlip9cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9LCBpZCwgaSksXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXFxcXFwiLlxcXFxcXFwiICsgaVxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIue8lui+kVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvZWRpdFJlcGxhY2VSdWxlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/aW5kZXg9XFxcXFxcXCIgKyBpLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFxcXFxcIi5cXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXFxcXFwiLlxcXFxcXFwiICsgaVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgXFxcXFxcXCJjb250ZW50c1xcXFxcXFwiOlxcXFxuICAgICAgICBsZXQgZiA9IHJlcXVpcmUoXFxcXFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00NTAzXFxcXFxcXCIpO1xcXFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLnm67lvZXorr7nva586K6+572uXFxcXFxcXCIpO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLpgInmi6nmlofku7blpLlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXFxcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoaWQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKGlkKS5leHRyYTtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpZCwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgICAgICAgICAgICAgfSxpZCksXFxcXG4gICAgICAgICAgICAgICAgcGF0dGVybjogMVxcXFxuICAgICAgICAgICAgfSkpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwi5pSv5oyBaGlrZXI6Ly9maWxlc+i3r+W+hCjor6Xmk43kvZzkuI3kvJrliJ3lp4vljJbnm67lvZUpXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogQ29uZmlnLmhvbWVQYXRoLFxcXFxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKChpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihpZCwgaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgIH0sIGlkKSxcXFxcbiAgICAgICAgICAgICAgICBpZDppZFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLnoa7orqRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCBpbnB1dCA9IGdldE15VmFyKGlkLCBmaW5kSXRlbShpZCkuZXh0cmEuZGVmYXVsdFZhbHVlIHx8IFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFxcXFxcImhpa2VyOi8vZmlsZXMvXFxcXFxcXCIpKSBpbnB1dCA9IGdldFBhdGgoaW5wdXQpLnNsaWNlKDcpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChDb25maWcuaG9tZVBhdGggPT0gaW5wdXQpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey57uP5piv5b2T5YmN55uu5b2VXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgQ29uZmlnLmhvbWVQYXRoID0gaW5wdXQ7XFxcXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpKTtcXFxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7Lkv53lrZhcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0sIGlkKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgYnJlYWs7XFxcXG59XFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7nvJbovpHmm7/mjaLop4TliJlcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZWRpdFJlcGxhY2VSdWxlLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBpc05ldyA9IE1ZX1BBUkFNUy5pc05ldyB8fCBnZXRQYXJhbShcXFxcXFxcImlzTmV3XFxcXFxcXCIpO1xcXFxuY29uc3QgaW5kZXggPSBNWV9QQVJBTVMuaW5kZXggfHwgTnVtYmVyKGdldFBhcmFtKFxcXFxcXFwiaW5kZXhcXFxcXFxcIikpO1xcXFxubGV0IGxheW91dCA9IFtdO1xcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLm5hbWVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLmZpcnN0XFxcXFxcXCIpO1xcXFxuICAgIC8vY2xlYXJNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuc2NvcGVcXFxcXFxcIik7XFxcXG59KSk7XFxcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxubGV0IGlkID0gXFxcXFxcXCIjXFxcXFxcXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXFxcbi8vbGV0IHJlcGxhY2VSdWxlID0gaXNOZXcgPT0gXFxcXFxcXCJ0cnVlXFxcXFxcXCI/e306cnVsZUxpc3RbaW5kZXhdO1xcXFxuaWYgKGlzTmV3ID09IFxcXFxcXFwidHJ1ZVxcXFxcXFwiKSB7XFxcXG4gICAgcmVwbGFjZVJ1bGUgPSB7XFxcXG4gICAgICAgIGlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcXFxcbiAgICAgICAgaXNSZWdleDogZmFsc2UsXFxcXG4gICAgfVxcXFxufSBlbHNlIHtcXFxcbiAgICByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2luZGV4XTtcXFxcbn1cXFxcbi8v6aaW5qyh5Yid5aeL5YyWXFxcXG5pZihnZXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuZmlyc3RcXFxcXFxcIixcXFxcXFxcIlxcXFxcXFwiKT09XFxcXFxcXCJcXFxcXFxcIil7XFxcXG4gICAgcHV0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIHJlcGxhY2VSdWxlLmlzUmVnZXgpO1xcXFxuICAgIHB1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5maXJzdFxcXFxcXFwiLFxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbn1cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmi7fotJ1cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgIGxldCBhdHQgPSBbXFxcXFxcXCJuYW1lXFxcXFxcXCIsIFxcXFxcXFwiaXNSZWdleFxcXFxcXFwiLCBcXFxcXFxcInBhdHRlcm5cXFxcXFxcIiwgXFxcXFxcXCJyZXBsYWNlbWVudFxcXFxcXFwiXTtcXFxcbiAgICAgICAgbGV0IGpzb24gPSB7fTtcXFxcbiAgICAgICAgYXR0LmZvckVhY2goa2V5ID0+IHtcXFxcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5cXFxcXFxcIiArIGtleSwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcXFxcXFxcImlzUmVnZXhcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IFxcXFxcXFwidHJ1ZVxcXFxcXFwiID8gdHJ1ZSA6IGZhbHNlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAganNvbltrZXldID0gdmFsdWU7XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBjb3B5KEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLnspjotLRcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCJ7e2NsaXBib2FyZH19XFxcXFxcXCIpLmlucHV0KCgpID0+IHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShpbnB1dCk7XFxcXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSB8fCBqc29uLnBhdHRlcm4gPT0gdW5kZWZpbmVkKSByZXR1cm47XFxcXG4gICAgICAgICAgICBsZXQgYXR0ID0gW1xcXFxcXFwibmFtZVxcXFxcXFwiLCBcXFxcXFxcImlzUmVnZXhcXFxcXFxcIiwgXFxcXFxcXCJwYXR0ZXJuXFxcXFxcXCIsIFxcXFxcXFwicmVwbGFjZW1lbnRcXFxcXFxcIl07XFxcXG4gICAgICAgICAgICBhdHQuZm9yRWFjaChrZXkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5cXFxcXFxcIiArIGtleSwgU3RyaW5nKGpzb25ba2V5XSkpO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLmm7/mjaLop4TliJnlkI3np7BcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5uYW1lXFxcXFxcXCIsIHJlcGxhY2VSdWxlLm5hbWUpLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5uYW1lXFxcXFxcXCIsaW5wdXQpOydcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLmm7/mjaLop4TliJlcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIGhlaWdodDogLTEsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFxcXFxcIiwgcmVwbGFjZVJ1bGUucGF0dGVybiksXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFxcXFxcIiwgaW5wdXQpOydcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmmK/lkKbkvb/nlKjmraPliJnooajovr7lvI/vvJpcXFxcXFxcIiArIGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcXFxcXCIpLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcXFxuICAgICAgICBsZXQgaXNSZWdleCA9IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcXFxcXCIpID09PSBcXFxcXFxcInRydWVcXFxcXFxcIiA/IGZhbHNlIDogdHJ1ZTtcXFxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBpZFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuaYr+WQpuS9v+eUqOato+WImeihqOi+vuW8j++8mlxcXFxcXFwiICsgaXNSZWdleFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIGlzUmVnZXgpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgfSwgaWQpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBpZFxcXFxuICAgIH1cXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLmm7/mjaLkuLpcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIGhlaWdodDogLTEsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcXFxcXCIsIHJlcGxhY2VSdWxlLnJlcGxhY2VtZW50KSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUucmVwbGFjZW1lbnRcXFxcXFxcIixpbnB1dCk7J1xcXFxuICAgIH1cXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuS/neWtmFxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChyZXBsYWNlUnVsZSwgaXNOZXcsIGluZGV4KSA9PiB7XFxcXG4gICAgICAgIGxldCBwYXR0ZXJuID0gZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmICghcGF0dGVybikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mm7/mjaLop4TliJnkuI3og73kuLrnqbpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBPYmplY3QuYXNzaWduKHJlcGxhY2VSdWxlLCB7XFxcXG4gICAgICAgICAgICBuYW1lOiBnZXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIGlzUmVnZXg6IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcXFxcXCIpID09PSBcXFxcXFxcInRydWVcXFxcXFxcIiA/IHRydWUgOiBmYWxzZSxcXFxcbiAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4sXFxcXG4gICAgICAgICAgICByZXBsYWNlbWVudDogZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoaXNOZXcgPT0gXFxcXFxcXCJ0cnVlXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJ1bGVMaXN0LnB1c2gocmVwbGFjZVJ1bGUpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcnVsZUxpc3Quc3BsaWNlKGluZGV4LCAxLCByZXBsYWNlUnVsZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxcXG4gICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFxcXFxcIjtcXFxcbiAgICB9LCByZXBsYWNlUnVsZSwgaXNOZXcsIGluZGV4KSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG59KTtcXFxcblxcXFxuLypcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi5pu/5o2i6IyD5Zu0XFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6IC0xLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnNjb3BlXFxcXFxcXCIsaW5wdXQpOydcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuKi9cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuWwj+ivtOS4quaAp+WMluWHgOWMllxcXCIsXFxcInBhdGhcXFwiOlxcXCJOb3ZlbEN1c3RvbS52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5pu/5o2i6KeE5YiZfFxcXFxcXFwiICsgTVlfUEFSQU1TLm5hbWUpO1xcXFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbmxldCBpZCA9IFxcXFxcXFwiI1xcXFxcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG5cXFxcbmNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgZm9vdDogMCxcXFxcbiAgICBpc1JlcGxhY2U6IHRydWUsXFxcXG4gICAgc2VsZWN0ZWQ6IFtdXFxcXG59LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBNWV9QQVJBTVMucGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG5cXFxcbmxldCBsYXlvdXQgPSBbXTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogW1xcXFxcXFwi4piQ5YeA5YyWXFxcXFxcXCIsIFxcXFxcXFwi4piR5YeA5YyWXFxcXFxcXCJdWzAgKyBib29rSW5mby5pc1JlcGxhY2VdLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgkaWQsIHBhdGgpID0+IHtcXFxcblxcXFxuICAgICAgICB2YXIgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgaXNSZXBsYWNlID0gYm9va0luZm8uaXNSZXBsYWNlPT09dW5kZWZpbmVkP3RydWU6Ym9va0luZm8uaXNSZXBsYWNlO1xcXFxuICAgICAgICBib29rSW5mby5pc1JlcGxhY2UgPSAhaXNSZXBsYWNlO1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKCRpZCwge1xcXFxuICAgICAgICAgICAgdGl0bGU6IGlzUmVwbGFjZSA/IFxcXFxcXFwi4piQ5YeA5YyWXFxcXFxcXCIgOiBcXFxcXFxcIuKYkeWHgOWMllxcXFxcXFwiLFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0sIGlkICsgXFxcXFxcXCIjLTFcXFxcXFxcIiwgTVlfUEFSQU1TLnBhdGgpLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBpZCArIFxcXFxcXFwiIy0xXFxcXFxcXCJcXFxcbiAgICB9LFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLnvJbovpHop4TliJlcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP3NldHRpbmdUeXBlPXJlcGxhY2VSdWxlXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6e1xcXFxuICAgICAgICBpc1JlZnJlc2g6IHRydWVcXFxcbiAgICB9XFxcXG59KTtcXFxcbmZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcXFxuICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcXFxuICAgIGxldCBpc1RydWUgPSBib29rSW5mby5zZWxlY3RlZC5pbmNsdWRlcyhyZXBsYWNlUnVsZS5pZCk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogKGlzVHJ1ZSA/IFxcXFxcXFwi4pePXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1xcXFxcXFwiKSArIHJlcGxhY2VSdWxlLm5hbWUsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICB5OiAwLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaXNUcnVlOiBpc1RydWUsXFxcXG4gICAgICAgICAgICBpZDogaWQgKyBpLFxcXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuW8gOWQr1xcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoJGlkLCByZXBsYWNlUnVsZSwgcGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGZpbmRJdGVtKCRpZCkuZXh0cmEuaXNUcnVlKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LlvIDlkK9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IFtdXFxcXG4gICAgICAgICAgICB9LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgIGJvb2tJbmZvLnNlbGVjdGVkLnB1c2gocmVwbGFjZVJ1bGUuaWQpO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSgkaWQsIHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLil49cXFxcXFxcIiArIHJlcGxhY2VSdWxlLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVlOiB0cnVlLFxcXFxuICAgICAgICAgICAgICAgICAgICBpZDogJGlkLFxcXFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIGlkICsgaSwgcmVwbGFjZVJ1bGUsIE1ZX1BBUkFNUy5wYXRoKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWFs+mXrVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoJGlkLCByZXBsYWNlUnVsZSwgcGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKCFmaW5kSXRlbSgkaWQpLmV4dHJhLmlzVHJ1ZSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5YWz6ZetXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBbXVxcXFxuICAgICAgICAgICAgfSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICBib29rSW5mby5zZWxlY3RlZC5zcGxpY2UoYm9va0luZm8uc2VsZWN0ZWQuaW5kZXhPZihyZXBsYWNlUnVsZS5pZCksIDEpO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSgkaWQsIHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLil4tcXFxcXFxcIiArIHJlcGxhY2VSdWxlLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICRpZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCBpZCArIGksIHJlcGxhY2VSdWxlLCBNWV9QQVJBTVMucGF0aCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn1dXCJ9IiwidGl0bGUiOiLmm7/mjaLop4TliJl86K6+572uIn0=
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement