diff --git a/_dev/js/cart.js b/_dev/js/cart.js
index 1be55f0..48ae7ea 100644
--- a/_dev/js/cart.js
+++ b/_dev/js/cart.js
@@ -400,117 +400,8 @@ $(function () {
});
$(document).ready(() => {
- prestashop.on("updateCart", (e) => {
- prestashop.cart = e.resp.cart;
- const n = $(".js-cart").data("refresh-url");
- if (!n) return;
- let o = {};
- e &&
- e.reason &&
- (o = {
- id_product_attribute: e.reason.idProductAttribute,
- id_product: e.reason.idProduct,
- }),
- $.post(n, o)
- .then((e) => {
- $(prestashop.selectors.cart.detailedTotals).replaceWith(
- e.cart_detailed_totals,
- ),
- $(prestashop.selectors.cart.summaryItemsSubtotal).replaceWith(
- e.cart_summary_items_subtotal,
- ),
- $(prestashop.selectors.cart.summarySubTotalsContainer).replaceWith(
- e.cart_summary_subtotals_container,
- ),
- $(prestashop.selectors.cart.summaryProducts).replaceWith(
- e.cart_summary_products,
- ),
- $(prestashop.selectors.cart.summaryTotals).replaceWith(
- e.cart_summary_totals,
- ),
- $(prestashop.selectors.cart.detailedActions).replaceWith(
- e.cart_detailed_actions,
- ),
- $(prestashop.selectors.cart.voucher).replaceWith(e.cart_voucher),
- $(prestashop.selectors.cart.overview).replaceWith(e.cart_detailed),
- $(prestashop.selectors.cart.summaryTop).replaceWith(
- e.cart_summary_top,
- ),
- $(prestashop.selectors.cart.productCustomizationId).val(0),
- $(prestashop.selectors.cart.lineProductQuantity).each((e, n) => {
- const r = $(n);
- r.attr("value", r.val());
- }),
- $(prestashop.selectors.checkout.cartPaymentStepRefresh).length &&
- i(),
- prestashop.emit("updatedCart", {
- eventType: "updateCart",
- resp: e,
- });
- })
- .fail((e) => {
- prestashop.emit("handleError", { eventType: "updateCart", resp: e });
- });
- });
const e = $("body");
- e.on("click", '[data-button-action="add-to-cart"]', (e) => {
- e.preventDefaul$;
- const n = $(e.currentTarget.form),
- o = `${n.serialize()}&add=1&action=update`,
- i = n.attr("action"),
- a = $(e.currentTarget);
- a.prop("disabled", !0);
- let s = (e) => {
- e
- .parents(prestashop.selectors.product.addToCart)
- .firs$.find(prestashop.selectors.product.minimalQuantity)
- .addClass("error"),
- e.paren$.find("label").addClass("error");
- };
- const c = n.find("input[min]");
- ((e) => {
- let n = !0;
- return (
- e.each((e, r) => {
- const o = $(r),
- i = parseInt(o.attr("min"), 10);
- i && o.val() < i && (s(o), (n = !1));
- }),
- n
- );
- })(c)
- ? $.post(i, o, null, "json")
- .then((e) => {
- e.hasError
- ? prestashop.emit("handleError", {
- eventType: "addProductToCart",
- resp: e,
- })
- : prestashop.emit("updateCart", {
- reason: {
- idProduct: e.id_product,
- idProductAttribute: e.id_product_attribute,
- idCustomization: e.id_customization,
- linkAction: "add-to-cart",
- cart: e.cart,
- },
- resp: e,
- });
- })
- .fail((e) => {
- prestashop.emit("handleError", {
- eventType: "addProductToCart",
- resp: e,
- });
- })
- .always(() => {
- setTimeout(() => {
- a.prop("disabled", !1);
- }, 1e3);
- })
- : s(c);
- }),
- e.off("submit", '[data-link-action="add-voucher"]'),
+ e.off("submit", '[data-link-action="add-voucher"]'),
e.on("submit", '[data-link-action="add-voucher"]', (e) => {
const promoSubmitBtn = $("#promo-code-form button");
e.preventDefault();
diff --git a/assets/js/theme.js b/assets/js/theme.js
index d83a60d..e2d84db 100644
--- a/assets/js/theme.js
+++ b/assets/js/theme.js
@@ -13,10 +13,10 @@
var modals = [], getCurrent = function() {
return modals.length ? modals[modals.length - 1] : null;
}, selectCurrent = function() {
- var i2, selected = false;
- for (i2 = modals.length - 1; i2 >= 0; i2--) {
- if (modals[i2].$blocker) {
- modals[i2].$blocker.toggleClass("current", !selected).toggleClass("behind", selected);
+ var i, selected = false;
+ for (i = modals.length - 1; i >= 0; i--) {
+ if (modals[i].$blocker) {
+ modals[i].$blocker.toggleClass("current", !selected).toggleClass("behind", selected);
selected = true;
}
}
@@ -255,10 +255,10 @@
return true;
return false;
}
- var f = { animation: "fade", animationDuration: 350, content: null, contentAsHTML: false, contentCloning: false, debug: true, delay: 300, delayTouch: [300, 500], functionInit: null, functionBefore: null, functionReady: null, functionAfter: null, functionFormat: null, IEmin: 6, interactive: false, multiple: false, parent: null, plugins: ["sideTip"], repositionOnScroll: false, restoration: "none", selfDestruction: true, theme: [], timer: 0, trackerInterval: 500, trackOrigin: false, trackTooltip: false, trigger: "hover", triggerClose: { click: false, mouseleave: false, originClick: false, scroll: false, tap: false, touchleave: false }, triggerOpen: { click: false, mouseenter: false, tap: false, touchstart: false }, updateAnimation: "rotate", zIndex: 9999999 }, g = "undefined" != typeof window ? window : null, h = { hasTouchCapability: !(!g || !("ontouchstart" in g || g.DocumentTouch && g.document instanceof g.DocumentTouch || g.navigator.maxTouchPoints)), hasTransitions: e(), IE: false, semVer: "4.2.8", window: g }, i2 = function() {
+ var f = { animation: "fade", animationDuration: 350, content: null, contentAsHTML: false, contentCloning: false, debug: true, delay: 300, delayTouch: [300, 500], functionInit: null, functionBefore: null, functionReady: null, functionAfter: null, functionFormat: null, IEmin: 6, interactive: false, multiple: false, parent: null, plugins: ["sideTip"], repositionOnScroll: false, restoration: "none", selfDestruction: true, theme: [], timer: 0, trackerInterval: 500, trackOrigin: false, trackTooltip: false, trigger: "hover", triggerClose: { click: false, mouseleave: false, originClick: false, scroll: false, tap: false, touchleave: false }, triggerOpen: { click: false, mouseenter: false, tap: false, touchstart: false }, updateAnimation: "rotate", zIndex: 9999999 }, g = "undefined" != typeof window ? window : null, h = { hasTouchCapability: !(!g || !("ontouchstart" in g || g.DocumentTouch && g.document instanceof g.DocumentTouch || g.navigator.maxTouchPoints)), hasTransitions: e(), IE: false, semVer: "4.2.8", window: g }, i = function() {
this.__$emitterPrivate = a({}), this.__$emitterPublic = a({}), this.__instancesLatestArr = [], this.__plugins = {}, this._env = h;
};
- i2.prototype = { __bridge: function(b2, c2, d2) {
+ i.prototype = { __bridge: function(b2, c2, d2) {
if (!c2[d2]) {
var e2 = function() {
};
@@ -318,7 +318,7 @@
return a.extend(f, b2), this;
}, triggerHandler: function() {
return this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic, Array.prototype.slice.apply(arguments)), this;
- } }, a.tooltipster = new i2(), a.Tooltipster = function(b2, c2) {
+ } }, a.tooltipster = new i(), a.Tooltipster = function(b2, c2) {
this.__callbacks = { close: [], open: [] }, this.__closingTime, this.__Content, this.__contentBcr, this.__destroyed = false, this.__$emitterPrivate = a({}), this.__$emitterPublic = a({}), this.__enabled = true, this.__garbageCollector, this.__Geometry, this.__lastPosition, this.__namespace = "tooltipster-" + Math.round(1e6 * Math.random()), this.__options, this.__$originParents, this.__pointerIsOverOrigin = false, this.__previousThemes = [], this.__state = "closed", this.__timeouts = { close: [], open: null }, this.__touchEvents = [], this.__tracker = null, this._$origin, this._$tooltip, this.__init(b2, c2);
}, a.Tooltipster.prototype = { __init: function(b2, c2) {
var d2 = this;
@@ -327,8 +327,8 @@
if (void 0 === d2._$origin.data("tooltipster-initialTitle") && (e2 = d2._$origin.attr("title"), void 0 === e2 && (e2 = null), d2._$origin.data("tooltipster-initialTitle", e2)), null !== d2.__options.content)
d2.__contentSet(d2.__options.content);
else {
- var g2, i3 = d2._$origin.attr("data-tooltip-content");
- i3 && (g2 = a(i3)), g2 && g2[0] ? d2.__contentSet(g2.first()) : d2.__contentSet(e2);
+ var g2, i2 = d2._$origin.attr("data-tooltip-content");
+ i2 && (g2 = a(i2)), g2 && g2[0] ? d2.__contentSet(g2.first()) : d2.__contentSet(e2);
}
d2._$origin.removeAttr("title").addClass("tooltipstered"), d2.__prepareOrigin(), d2.__prepareGC(), a.each(d2.__options.plugins, function(a2, b3) {
d2._plug(b3);
@@ -356,7 +356,7 @@
var e2 = b2._$origin.parent().attr("name");
c2 = a('img[usemap="#' + e2 + '"]');
}
- var f2 = c2[0].getBoundingClientRect(), g2 = a(h.window.document), i3 = a(h.window), j2 = c2, k2 = { available: { document: null, window: null }, document: { size: { height: g2.height(), width: g2.width() } }, window: { scroll: { left: h.window.scrollX || h.window.document.documentElement.scrollLeft, top: h.window.scrollY || h.window.document.documentElement.scrollTop }, size: { height: i3.height(), width: i3.width() } }, origin: { fixedLineage: false, offset: {}, size: { height: f2.bottom - f2.top, width: f2.right - f2.left }, usemapImage: d2 ? c2[0] : null, windowOffset: { bottom: f2.bottom, left: f2.left, right: f2.right, top: f2.top } } };
+ var f2 = c2[0].getBoundingClientRect(), g2 = a(h.window.document), i2 = a(h.window), j2 = c2, k2 = { available: { document: null, window: null }, document: { size: { height: g2.height(), width: g2.width() } }, window: { scroll: { left: h.window.scrollX || h.window.document.documentElement.scrollLeft, top: h.window.scrollY || h.window.document.documentElement.scrollTop }, size: { height: i2.height(), width: i2.width() } }, origin: { fixedLineage: false, offset: {}, size: { height: f2.bottom - f2.top, width: f2.right - f2.left }, usemapImage: d2 ? c2[0] : null, windowOffset: { bottom: f2.bottom, left: f2.left, right: f2.right, top: f2.top } } };
if (d2) {
var l = b2._$origin.attr("shape"), m = b2._$origin.attr("coords");
if (m && (m = m.split(","), a.map(m, function(a2, b3) {
@@ -446,10 +446,10 @@
if ("fixed" != c2._$origin.css("position") && c2.__$originParents.each(function(b3, c3) {
var d2 = a(c3), g3 = d2.css("overflow-x"), h2 = d2.css("overflow-y");
if ("visible" != g3 || "visible" != h2) {
- var i4 = c3.getBoundingClientRect();
- if ("visible" != g3 && (e2.origin.windowOffset.left < i4.left || e2.origin.windowOffset.right > i4.right))
+ var i3 = c3.getBoundingClientRect();
+ if ("visible" != g3 && (e2.origin.windowOffset.left < i3.left || e2.origin.windowOffset.right > i3.right))
return f2 = true, false;
- if ("visible" != h2 && (e2.origin.windowOffset.top < i4.top || e2.origin.windowOffset.bottom > i4.bottom))
+ if ("visible" != h2 && (e2.origin.windowOffset.top < i3.top || e2.origin.windowOffset.bottom > i3.bottom))
return f2 = true, false;
}
return "fixed" == d2.css("position") ? false : void 0;
@@ -458,8 +458,8 @@
else if (c2._$tooltip.css("visibility", "visible"), c2.__options.repositionOnScroll)
c2.reposition(b2);
else {
- var g2 = e2.origin.offset.left - c2.__Geometry.origin.offset.left, i3 = e2.origin.offset.top - c2.__Geometry.origin.offset.top;
- c2._$tooltip.css({ left: c2.__lastPosition.coord.left + g2, top: c2.__lastPosition.coord.top + i3 });
+ var g2 = e2.origin.offset.left - c2.__Geometry.origin.offset.left, i2 = e2.origin.offset.top - c2.__Geometry.origin.offset.top;
+ c2._$tooltip.css({ left: c2.__lastPosition.coord.left + g2, top: c2.__lastPosition.coord.top + i2 });
}
}
c2._trigger({ type: "scroll", event: b2, geo: e2 });
@@ -498,8 +498,8 @@
}), e2.__callbacks.close = [];
};
if ("closed" != e2.__state) {
- var i3 = true, j2 = /* @__PURE__ */ new Date(), k2 = j2.getTime(), l = k2 + e2.__options.animationDuration[1];
- if ("disappearing" == e2.__state && l > e2.__closingTime && e2.__options.animationDuration[1] > 0 && (i3 = false), i3) {
+ var i2 = true, j2 = /* @__PURE__ */ new Date(), k2 = j2.getTime(), l = k2 + e2.__options.animationDuration[1];
+ if ("disappearing" == e2.__state && l > e2.__closingTime && e2.__options.animationDuration[1] > 0 && (i2 = false), i2) {
e2.__closingTime = l, "disappearing" != e2.__state && e2.__stateSet("disappearing");
var m = function() {
clearInterval(e2.__tracker), e2._trigger({ type: "closing", event: b2 }), e2._$tooltip.off("." + e2.__namespace + "-triggerClose").removeClass("tooltipster-dying"), a(h.window).off("." + e2.__namespace + "-triggerClose"), e2.__$originParents.each(function(b3, c3) {
@@ -526,17 +526,17 @@
f2 = false;
} }), f2 && e2.__options.functionBefore && (f2 = e2.__options.functionBefore.call(e2, e2, { event: b2, origin: e2._$origin[0] }))), f2 !== false && null !== e2.__Content) {
c2 && e2.__callbacks.open.push(c2), e2.__callbacks.close = [], e2.__timeoutsClear();
- var g2, i3 = function() {
+ var g2, i2 = function() {
"stable" != e2.__state && e2.__stateSet("stable"), a.each(e2.__callbacks.open, function(a2, b3) {
b3.call(e2, e2, { origin: e2._$origin[0], tooltip: e2._$tooltip[0] });
}), e2.__callbacks.open = [];
};
if ("closed" !== e2.__state)
- g2 = 0, "disappearing" === e2.__state ? (e2.__stateSet("appearing"), h.hasTransitions ? (e2._$tooltip.clearQueue().removeClass("tooltipster-dying").addClass("tooltipster-show"), e2.__options.animationDuration[0] > 0 && e2._$tooltip.delay(e2.__options.animationDuration[0]), e2._$tooltip.queue(i3)) : e2._$tooltip.stop().fadeIn(i3)) : "stable" == e2.__state && i3();
+ g2 = 0, "disappearing" === e2.__state ? (e2.__stateSet("appearing"), h.hasTransitions ? (e2._$tooltip.clearQueue().removeClass("tooltipster-dying").addClass("tooltipster-show"), e2.__options.animationDuration[0] > 0 && e2._$tooltip.delay(e2.__options.animationDuration[0]), e2._$tooltip.queue(i2)) : e2._$tooltip.stop().fadeIn(i2)) : "stable" == e2.__state && i2();
else {
if (e2.__stateSet("appearing"), g2 = e2.__options.animationDuration[0], e2.__contentInsert(), e2.reposition(b2, true), h.hasTransitions ? (e2._$tooltip.addClass("tooltipster-" + e2.__options.animation).addClass("tooltipster-initial").css({ "-moz-animation-duration": e2.__options.animationDuration[0] + "ms", "-ms-animation-duration": e2.__options.animationDuration[0] + "ms", "-o-animation-duration": e2.__options.animationDuration[0] + "ms", "-webkit-animation-duration": e2.__options.animationDuration[0] + "ms", "animation-duration": e2.__options.animationDuration[0] + "ms", "transition-duration": e2.__options.animationDuration[0] + "ms" }), setTimeout(function() {
- "closed" != e2.__state && (e2._$tooltip.addClass("tooltipster-show").removeClass("tooltipster-initial"), e2.__options.animationDuration[0] > 0 && e2._$tooltip.delay(e2.__options.animationDuration[0]), e2._$tooltip.queue(i3));
- }, 0)) : e2._$tooltip.css("display", "none").fadeIn(e2.__options.animationDuration[0], i3), e2.__trackerStart(), a(h.window).on("resize." + e2.__namespace + "-triggerClose", function(b3) {
+ "closed" != e2.__state && (e2._$tooltip.addClass("tooltipster-show").removeClass("tooltipster-initial"), e2.__options.animationDuration[0] > 0 && e2._$tooltip.delay(e2.__options.animationDuration[0]), e2._$tooltip.queue(i2));
+ }, 0)) : e2._$tooltip.css("display", "none").fadeIn(e2.__options.animationDuration[0], i2), e2.__trackerStart(), a(h.window).on("resize." + e2.__namespace + "-triggerClose", function(b3) {
var c3 = a(document.activeElement);
(c3.is("input") || c3.is("textarea")) && a.contains(e2._$tooltip[0], c3[0]) || e2.reposition(b3);
}).on("scroll." + e2.__namespace + "-triggerClose", function(a2) {
@@ -735,8 +735,8 @@
}), "#*$~&" !== d2 ? d2 : this;
}
a.tooltipster.__instancesLatestArr = [];
- var e2 = b2[0] && void 0 !== b2[0].multiple, g2 = e2 && b2[0].multiple || !e2 && f.multiple, h2 = b2[0] && void 0 !== b2[0].content, i3 = h2 && b2[0].content || !h2 && f.content, j2 = b2[0] && void 0 !== b2[0].contentCloning, k2 = j2 && b2[0].contentCloning || !j2 && f.contentCloning, l = b2[0] && void 0 !== b2[0].debug, m = l && b2[0].debug || !l && f.debug;
- return this.length > 1 && (i3 instanceof a || "object" == typeof i3 && null != i3 && i3.tagName) && !k2 && m && console.log(c2), this.each(function() {
+ var e2 = b2[0] && void 0 !== b2[0].multiple, g2 = e2 && b2[0].multiple || !e2 && f.multiple, h2 = b2[0] && void 0 !== b2[0].content, i2 = h2 && b2[0].content || !h2 && f.content, j2 = b2[0] && void 0 !== b2[0].contentCloning, k2 = j2 && b2[0].contentCloning || !j2 && f.contentCloning, l = b2[0] && void 0 !== b2[0].debug, m = l && b2[0].debug || !l && f.debug;
+ return this.length > 1 && (i2 instanceof a || "object" == typeof i2 && null != i2 && i2.tagName) && !k2 && m && console.log(c2), this.each(function() {
var c3 = false, d3 = a(this), e3 = d3.data("tooltipster-ns"), f2 = null;
e3 ? g2 ? c3 = true : m && (console.log("Tooltipster: one or more tooltips are already attached to the element below. Ignoring."), console.log(this)) : c3 = true, c3 && (f2 = new a.Tooltipster(this, b2[0]), e3 || (e3 = []), e3.push(f2.__namespace), d3.data("tooltipster-ns", e3), d3.data(f2.__namespace, f2), f2.__options.functionInit && f2.__options.functionInit.call(f2, f2, { origin: this }), f2._trigger("init")), a.tooltipster.__instancesLatestArr.push(f2);
}), this;
@@ -791,7 +791,7 @@
}, __reposition: function(b2, c2) {
var d2, e2 = this, f2 = e2.__targetFind(c2), g2 = [];
e2.__instance._$tooltip.detach();
- var h2 = e2.__instance._$tooltip.clone(), i3 = a.tooltipster._getRuler(h2), j2 = false, k2 = e2.__instance.option("animation");
+ var h2 = e2.__instance._$tooltip.clone(), i2 = a.tooltipster._getRuler(h2), j2 = false, k2 = e2.__instance.option("animation");
switch (k2 && h2.removeClass("tooltipster-" + k2), a.each(["window", "document"], function(d3, k3) {
var l2 = null;
if (e2.__instance._trigger({ container: k3, helper: c2, satisfied: j2, takeTest: function(a2) {
@@ -803,7 +803,7 @@
if (l2 = null, e2.__instance._trigger({ container: k3, event: b2, helper: c2, mode: d4, results: g2, satisfied: j2, side: n2, takeTest: function(a3) {
l2 = a3;
}, type: "positionTest" }), 1 == l2 || 0 != l2 && 0 == j2) {
- var h3 = { container: k3, distance: m2, fits: null, mode: d4, outerSize: null, side: n2, size: null, target: f2[n2], whole: null }, o2 = "natural" == d4 ? i3.free() : i3.constrain(c2.geo.available[k3][n2].width - m2.horizontal, c2.geo.available[k3][n2].height - m2.vertical), p2 = o2.measure();
+ var h3 = { container: k3, distance: m2, fits: null, mode: d4, outerSize: null, side: n2, size: null, target: f2[n2], whole: null }, o2 = "natural" == d4 ? i2.free() : i2.constrain(c2.geo.available[k3][n2].width - m2.horizontal, c2.geo.available[k3][n2].height - m2.vertical), p2 = o2.measure();
if (h3.size = p2.size, h3.outerSize = { height: p2.size.height + m2.vertical, width: p2.size.width + m2.horizontal }, "natural" == d4 ? c2.geo.available[k3][n2].width >= h3.outerSize.width && c2.geo.available[k3][n2].height >= h3.outerSize.height ? h3.fits = true : h3.fits = false : h3.fits = p2.fits, "window" == k3 && (h3.fits ? "top" == n2 || "bottom" == n2 ? h3.whole = c2.geo.origin.windowOffset.right >= e2.__options.minIntersection && c2.geo.window.size.width - c2.geo.origin.windowOffset.left >= e2.__options.minIntersection : h3.whole = c2.geo.origin.windowOffset.bottom >= e2.__options.minIntersection && c2.geo.window.size.height - c2.geo.origin.windowOffset.top >= e2.__options.minIntersection : h3.whole = false), g2.push(h3), h3.whole)
j2 = true;
else if ("natural" == h3.mode && (h3.fits || h3.size.width <= c2.geo.available[k3][n2].width))
@@ -861,7 +861,7 @@
var m = e2.__options.functionPosition.call(e2, e2.__instance, c2, l);
m && (d2 = m);
}
- i3.destroy();
+ i2.destroy();
var n, o;
"top" == d2.side || "bottom" == d2.side ? (n = { prop: "left", val: d2.target - d2.coord.left }, o = d2.size.width - this.__options.minIntersection) : (n = { prop: "top", val: d2.target - d2.coord.top }, o = d2.size.height - this.__options.minIntersection), n.val < this.__options.minIntersection ? n.val = this.__options.minIntersection : n.val > o && (n.val = o);
var p;
@@ -1042,7 +1042,7 @@
data[key] = originalinput.data(attrName);
}
});
- $2.each(["min", "max", "step"], function(i2, key) {
+ $2.each(["min", "max", "step"], function(i, key) {
if (originalinput.is("[" + key + "]")) {
if (data[key] !== void 0) {
console.warn('Both the "data-bts-' + key + '" data attribute and the "' + key + '" individual attribute were specified, the individual attribute will take precedence on: ', originalinput);
@@ -2477,21 +2477,21 @@
return key === void 0 || hasOwn.call(obj, key);
};
$2.each = function(obj, callback, args) {
- var value, i3 = 0, length = obj.length, isArray = isArraylike(obj);
+ var value, i2 = 0, length = obj.length, isArray = isArraylike(obj);
if (args) {
if (isArray) {
- for (; i3 < length; i3++) {
- value = callback.apply(obj[i3], args);
+ for (; i2 < length; i2++) {
+ value = callback.apply(obj[i2], args);
if (value === false) {
break;
}
}
} else {
- for (i3 in obj) {
- if (!obj.hasOwnProperty(i3)) {
+ for (i2 in obj) {
+ if (!obj.hasOwnProperty(i2)) {
continue;
}
- value = callback.apply(obj[i3], args);
+ value = callback.apply(obj[i2], args);
if (value === false) {
break;
}
@@ -2499,18 +2499,18 @@
}
} else {
if (isArray) {
- for (; i3 < length; i3++) {
- value = callback.call(obj[i3], i3, obj[i3]);
+ for (; i2 < length; i2++) {
+ value = callback.call(obj[i2], i2, obj[i2]);
if (value === false) {
break;
}
}
} else {
- for (i3 in obj) {
- if (!obj.hasOwnProperty(i3)) {
+ for (i2 in obj) {
+ if (!obj.hasOwnProperty(i2)) {
continue;
}
- value = callback.call(obj[i3], i3, obj[i3]);
+ value = callback.call(obj[i2], i2, obj[i2]);
if (value === false) {
break;
}
@@ -2549,21 +2549,21 @@
}
};
$2.extend = function() {
- var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i3 = 1, length = arguments.length, deep = false;
+ var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i2 = 1, length = arguments.length, deep = false;
if (typeof target === "boolean") {
deep = target;
- target = arguments[i3] || {};
- i3++;
+ target = arguments[i2] || {};
+ i2++;
}
if (typeof target !== "object" && $2.type(target) !== "function") {
target = {};
}
- if (i3 === length) {
+ if (i2 === length) {
target = this;
- i3--;
+ i2--;
}
- for (; i3 < length; i3++) {
- if (options = arguments[i3]) {
+ for (; i2 < length; i2++) {
+ if (options = arguments[i2]) {
for (name in options) {
if (!options.hasOwnProperty(name)) {
continue;
@@ -2595,16 +2595,16 @@
if (arr) {
if (isArraylike(Object(arr))) {
(function(first, second) {
- var len = +second.length, j = 0, i3 = first.length;
+ var len = +second.length, j = 0, i2 = first.length;
while (j < len) {
- first[i3++] = second[j++];
+ first[i2++] = second[j++];
}
if (len !== len) {
while (second[j] !== void 0) {
- first[i3++] = second[j++];
+ first[i2++] = second[j++];
}
}
- first.length = i3;
+ first.length = i2;
return first;
})(ret, typeof arr === "string" ? [arr] : arr);
} else {
@@ -2629,7 +2629,7 @@
return q;
};
$2.dequeue = function(elems, type) {
- $2.each(elems.nodeType ? [elems] : elems, function(i3, elem) {
+ $2.each(elems.nodeType ? [elems] : elems, function(i2, elem) {
type = type || "fx";
var queue = $2.queue(elem, type), fn = queue.shift();
if (fn === "inprogress") {
@@ -2687,8 +2687,8 @@
$2.uuid = 0;
var class2type = {}, hasOwn = class2type.hasOwnProperty, toString = class2type.toString;
var types = "Boolean Number String Function Array Date RegExp Object Error".split(" ");
- for (var i2 = 0; i2 < types.length; i2++) {
- class2type["[object " + types[i2] + "]"] = types[i2].toLowerCase();
+ for (var i = 0; i < types.length; i++) {
+ class2type["[object " + types[i] + "]"] = types[i].toLowerCase();
}
$2.fn.init.prototype = $2.fn;
window2.Velocity = { Utilities: $2 };
@@ -2703,12 +2703,12 @@
if (document2.documentMode) {
return document2.documentMode;
} else {
- for (var i2 = 7; i2 > 4; i2--) {
+ for (var i = 7; i > 4; i--) {
var div = document2.createElement("div");
- div.innerHTML = "";
+ div.innerHTML = "";
if (div.getElementsByTagName("span").length) {
div = null;
- return i2;
+ return i;
}
}
}
@@ -2762,16 +2762,16 @@
if (this.slice) {
return slice.call(this, begin, end);
}
- var i2, cloned = [], start = begin >= 0 ? begin : Math.max(0, len + begin), upTo = end < 0 ? len + end : Math.min(end, len), size = upTo - start;
+ var i, cloned = [], start = begin >= 0 ? begin : Math.max(0, len + begin), upTo = end < 0 ? len + end : Math.min(end, len), size = upTo - start;
if (size > 0) {
cloned = new Array(size);
if (this.charAt) {
- for (i2 = 0; i2 < size; i2++) {
- cloned[i2] = this.charAt(start + i2);
+ for (i = 0; i < size; i++) {
+ cloned[i] = this.charAt(start + i);
}
} else {
- for (i2 = 0; i2 < size; i2++) {
- cloned[i2] = this[start + i2];
+ for (i = 0; i < size; i++) {
+ cloned[i] = this[start + i];
}
}
}
@@ -2791,8 +2791,8 @@
};
}
return function(arr, val) {
- for (var i2 = 0; i2 < arr.length; i2++) {
- if (arr[i2] === val) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i] === val) {
return true;
}
}
@@ -2948,7 +2948,7 @@
/* Pause all animations */
pauseAll: function(queueName) {
var currentTime = (/* @__PURE__ */ new Date()).getTime();
- $2.each(Velocity.State.calls, function(i2, activeCall) {
+ $2.each(Velocity.State.calls, function(i, activeCall) {
if (activeCall) {
if (queueName !== undefined$1 && (activeCall[2].queue !== queueName || activeCall[2].queue === false)) {
return true;
@@ -2968,7 +2968,7 @@
/* Resume all animations */
resumeAll: function(queueName) {
(/* @__PURE__ */ new Date()).getTime();
- $2.each(Velocity.State.calls, function(i2, activeCall) {
+ $2.each(Velocity.State.calls, function(i, activeCall) {
if (activeCall) {
if (queueName !== undefined$1 && (activeCall[2].queue !== queueName || activeCall[2].queue === false)) {
return true;
@@ -3024,8 +3024,8 @@
if (arguments.length !== 4) {
return false;
}
- for (var i2 = 0; i2 < 4; ++i2) {
- if (typeof arguments[i2] !== "number" || isNaN(arguments[i2]) || !isFinite(arguments[i2])) {
+ for (var i = 0; i < 4; ++i) {
+ if (typeof arguments[i] !== "number" || isNaN(arguments[i]) || !isFinite(arguments[i])) {
return false;
}
}
@@ -3050,7 +3050,7 @@
return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1);
}
function newtonRaphsonIterate(aX, aGuessT) {
- for (var i3 = 0; i3 < NEWTON_ITERATIONS; ++i3) {
+ for (var i2 = 0; i2 < NEWTON_ITERATIONS; ++i2) {
var currentSlope = getSlope(aGuessT, mX1, mX2);
if (currentSlope === 0) {
return aGuessT;
@@ -3061,12 +3061,12 @@
return aGuessT;
}
function calcSampleValues() {
- for (var i3 = 0; i3 < kSplineTableSize; ++i3) {
- mSampleValues[i3] = calcBezier(i3 * kSampleStepSize, mX1, mX2);
+ for (var i2 = 0; i2 < kSplineTableSize; ++i2) {
+ mSampleValues[i2] = calcBezier(i2 * kSampleStepSize, mX1, mX2);
}
}
function binarySubdivide(aX, aA, aB) {
- var currentX, currentT, i3 = 0;
+ var currentX, currentT, i2 = 0;
do {
currentT = aA + (aB - aA) / 2;
currentX = calcBezier(currentT, mX1, mX2) - aX;
@@ -3075,7 +3075,7 @@
} else {
aA = currentT;
}
- } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i3 < SUBDIVISION_MAX_ITERATIONS);
+ } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i2 < SUBDIVISION_MAX_ITERATIONS);
return currentT;
}
function getTForX(aX) {
@@ -3218,7 +3218,7 @@
["easeOutCirc", [0.075, 0.82, 0.165, 1]],
["easeInOutCirc", [0.785, 0.135, 0.15, 0.86]]
],
- function(i2, easingArray) {
+ function(i, easingArray) {
Velocity.Easings[easingArray[0]] = generateBezier.apply(null, easingArray[1]);
}
);
@@ -3472,9 +3472,9 @@
},
/* Convert the templates into individual hooks then append them to the registered object above. */
register: function() {
- for (var i2 = 0; i2 < CSS.Lists.colors.length; i2++) {
- var rgbComponents = CSS.Lists.colors[i2] === "color" ? "0 0 0 1" : "255 255 255 1";
- CSS.Hooks.templates[CSS.Lists.colors[i2]] = ["Red Green Blue Alpha", rgbComponents];
+ for (var i = 0; i < CSS.Lists.colors.length; i++) {
+ var rgbComponents = CSS.Lists.colors[i] === "color" ? "0 0 0 1" : "255 255 255 1";
+ CSS.Hooks.templates[CSS.Lists.colors[i]] = ["Red Green Blue Alpha", rgbComponents];
}
var rootProperty, hookTemplate, hookNames;
if (IE) {
@@ -3664,9 +3664,9 @@
if ((!IE || IE > 9) && !Velocity.State.isGingerbread) {
CSS.Lists.transformsBase = CSS.Lists.transformsBase.concat(CSS.Lists.transforms3D);
}
- for (var i2 = 0; i2 < CSS.Lists.transformsBase.length; i2++) {
+ for (var i = 0; i < CSS.Lists.transformsBase.length; i++) {
(function() {
- var transformName = CSS.Lists.transformsBase[i2];
+ var transformName = CSS.Lists.transformsBase[i];
CSS.Normalizations.registered[transformName] = function(type, element, propertyValue) {
switch (type) {
case "name":
@@ -3760,9 +3760,9 @@
function augmentDimension(name, element, wantInner) {
var isBorderBox = CSS.getPropertyValue(element, "boxSizing").toString().toLowerCase() === "border-box";
if (isBorderBox === (wantInner || false)) {
- var i3, value, augment = 0, sides = name === "width" ? ["Left", "Right"] : ["Top", "Bottom"], fields = ["padding" + sides[0], "padding" + sides[1], "border" + sides[0] + "Width", "border" + sides[1] + "Width"];
- for (i3 = 0; i3 < fields.length; i3++) {
- value = parseFloat(CSS.getPropertyValue(element, fields[i3]));
+ var i2, value, augment = 0, sides = name === "width" ? ["Left", "Right"] : ["Top", "Bottom"], fields = ["padding" + sides[0], "padding" + sides[1], "border" + sides[0] + "Width", "border" + sides[1] + "Width"];
+ for (i2 = 0; i2 < fields.length; i2++) {
+ value = parseFloat(CSS.getPropertyValue(element, fields[i2]));
if (!isNaN(value)) {
augment += value;
}
@@ -3816,12 +3816,12 @@
return [Velocity.State.prefixMatches[property], true];
} else {
var vendors = ["", "Webkit", "Moz", "ms", "O"];
- for (var i2 = 0, vendorsLength = vendors.length; i2 < vendorsLength; i2++) {
+ for (var i = 0, vendorsLength = vendors.length; i < vendorsLength; i++) {
var propertyPrefixed;
- if (i2 === 0) {
+ if (i === 0) {
propertyPrefixed = property;
} else {
- propertyPrefixed = vendors[i2] + property.replace(/^\w/, function(match) {
+ propertyPrefixed = vendors[i] + property.replace(/^\w/, function(match) {
return match.toUpperCase();
});
}
@@ -4119,7 +4119,7 @@
Velocity.hook = function(elements, arg2, arg3) {
var value;
elements = sanitizeElements(elements);
- $2.each(elements, function(i2, element) {
+ $2.each(elements, function(i, element) {
if (Data(element) === undefined$1) {
Velocity.init(element);
}
@@ -4191,13 +4191,13 @@
if (!/^(stop|finish|finishAll|pause|resume)$/i.test(propertiesMap) && !$2.isPlainObject(options)) {
var startingArgumentPosition = argumentIndex + 1;
options = {};
- for (var i2 = startingArgumentPosition; i2 < arguments.length; i2++) {
- if (!Type.isArray(arguments[i2]) && (/^(fast|normal|slow)$/i.test(arguments[i2]) || /^\d/.test(arguments[i2]))) {
- options.duration = arguments[i2];
- } else if (Type.isString(arguments[i2]) || Type.isArray(arguments[i2])) {
- options.easing = arguments[i2];
- } else if (Type.isFunction(arguments[i2])) {
- options.complete = arguments[i2];
+ for (var i = startingArgumentPosition; i < arguments.length; i++) {
+ if (!Type.isArray(arguments[i]) && (/^(fast|normal|slow)$/i.test(arguments[i]) || /^\d/.test(arguments[i]))) {
+ options.duration = arguments[i];
+ } else if (Type.isString(arguments[i]) || Type.isArray(arguments[i])) {
+ options.easing = arguments[i];
+ } else if (Type.isFunction(arguments[i])) {
+ options.complete = arguments[i];
}
}
}
@@ -4211,10 +4211,10 @@
break;
case "pause":
var currentTime = (/* @__PURE__ */ new Date()).getTime();
- $2.each(elements, function(i3, element) {
+ $2.each(elements, function(i2, element) {
pauseDelayOnElement(element, currentTime);
});
- $2.each(Velocity.State.calls, function(i3, activeCall) {
+ $2.each(Velocity.State.calls, function(i2, activeCall) {
var found = false;
if (activeCall) {
$2.each(activeCall[1], function(k, activeElement) {
@@ -4239,10 +4239,10 @@
});
return getChain();
case "resume":
- $2.each(elements, function(i3, element) {
+ $2.each(elements, function(i2, element) {
resumeDelayOnElement(element);
});
- $2.each(Velocity.State.calls, function(i3, activeCall) {
+ $2.each(Velocity.State.calls, function(i2, activeCall) {
var found = false;
if (activeCall) {
$2.each(activeCall[1], function(k, activeElement) {
@@ -4270,7 +4270,7 @@
case "finish":
case "finishAll":
case "stop":
- $2.each(elements, function(i3, element) {
+ $2.each(elements, function(i2, element) {
if (Data(element) && Data(element).delayTimer) {
clearTimeout(Data(element).delayTimer.setTimeout);
if (Data(element).delayTimer.next) {
@@ -4288,7 +4288,7 @@
}
});
var callsToStop = [];
- $2.each(Velocity.State.calls, function(i3, activeCall) {
+ $2.each(Velocity.State.calls, function(i2, activeCall) {
if (activeCall) {
$2.each(activeCall[1], function(k, activeElement) {
var queueName = options === undefined$1 ? "" : options;
@@ -4312,7 +4312,7 @@
activeTween.endValue = activeTween.currentValue;
});
}
- callsToStop.push(i3);
+ callsToStop.push(i2);
} else if (propertiesMap === "finish" || propertiesMap === "finishAll") {
activeCall[2].duration = 1;
}
@@ -4322,7 +4322,7 @@
}
});
if (propertiesMap === "stop") {
- $2.each(callsToStop, function(i3, j) {
+ $2.each(callsToStop, function(i2, j) {
completeCall(j, true);
});
if (promiseData.promise) {
@@ -4739,13 +4739,13 @@
var dummy = data && data.isSVG ? document2.createElementNS("http://www.w3.org/2000/svg", "rect") : document2.createElement("div");
Velocity.init(dummy);
sameRatioIndicators.myParent.appendChild(dummy);
- $2.each(["overflow", "overflowX", "overflowY"], function(i4, property3) {
+ $2.each(["overflow", "overflowX", "overflowY"], function(i3, property3) {
Velocity.CSS.setPropertyValue(dummy, property3, "hidden");
});
Velocity.CSS.setPropertyValue(dummy, "position", sameRatioIndicators.position);
Velocity.CSS.setPropertyValue(dummy, "fontSize", sameRatioIndicators.fontSize);
Velocity.CSS.setPropertyValue(dummy, "boxSizing", "content-box");
- $2.each(["minWidth", "maxWidth", "width", "minHeight", "maxHeight", "height"], function(i4, property3) {
+ $2.each(["minWidth", "maxWidth", "width", "minHeight", "maxHeight", "height"], function(i3, property3) {
Velocity.CSS.setPropertyValue(dummy, property3, measurement + "%");
});
Velocity.CSS.setPropertyValue(dummy, "paddingLeft", measurement + "em");
@@ -4839,15 +4839,15 @@
var endValue = valueData[0], easing = valueData[1], startValue = valueData[2];
if (CSS.RegEx.isHex.test(endValue)) {
var colorComponents = ["Red", "Green", "Blue"], endValueRGB = CSS.Values.hexToRgb(endValue), startValueRGB = startValue ? CSS.Values.hexToRgb(startValue) : undefined$1;
- for (var i3 = 0; i3 < colorComponents.length; i3++) {
- var dataArray = [endValueRGB[i3]];
+ for (var i2 = 0; i2 < colorComponents.length; i2++) {
+ var dataArray = [endValueRGB[i2]];
if (easing) {
dataArray.push(easing);
}
if (startValueRGB !== undefined$1) {
- dataArray.push(startValueRGB[i3]);
+ dataArray.push(startValueRGB[i2]);
}
- fixPropertyValue(propertyName + colorComponents[i3], dataArray);
+ fixPropertyValue(propertyName + colorComponents[i2], dataArray);
}
continue;
}
@@ -4913,9 +4913,9 @@
$2.dequeue(element);
}
}
- $2.each(elements, function(i3, element) {
+ $2.each(elements, function(i2, element) {
if (Type.isNode(element)) {
- processElement(element, i3);
+ processElement(element, i2);
}
});
opts = $2.extend({}, Velocity.defaults, options);
@@ -4964,13 +4964,13 @@
Velocity.State.calls = compactSparseArray(Velocity.State.calls);
callsLength = Velocity.State.calls.length;
}
- for (var i2 = 0; i2 < callsLength; i2++) {
- if (!Velocity.State.calls[i2]) {
+ for (var i = 0; i < callsLength; i++) {
+ if (!Velocity.State.calls[i]) {
continue;
}
- var callContainer = Velocity.State.calls[i2], call = callContainer[0], opts = callContainer[2], timeStart = callContainer[3], firstTick = !timeStart, tweenDummyValue = null, pauseObject = callContainer[5], millisecondsEllapsed = callContainer[6];
+ var callContainer = Velocity.State.calls[i], call = callContainer[0], opts = callContainer[2], timeStart = callContainer[3], firstTick = !timeStart, tweenDummyValue = null, pauseObject = callContainer[5], millisecondsEllapsed = callContainer[6];
if (!timeStart) {
- timeStart = Velocity.State.calls[i2][3] = timeCurrent - 16;
+ timeStart = Velocity.State.calls[i][3] = timeCurrent - 16;
}
if (pauseObject) {
if (pauseObject.resume === true) {
@@ -4991,7 +4991,7 @@
if (opts.display !== undefined$1 && opts.display !== null && opts.display !== "none") {
if (opts.display === "flex") {
var flexValues = ["-webkit-box", "-moz-box", "-ms-flexbox", "-webkit-flex"];
- $2.each(flexValues, function(i3, flexValue) {
+ $2.each(flexValues, function(i2, flexValue) {
CSS.setPropertyValue(element, "display", flexValue);
});
}
@@ -5065,10 +5065,10 @@
}
}
if (opts.display !== undefined$1 && opts.display !== "none") {
- Velocity.State.calls[i2][2].display = false;
+ Velocity.State.calls[i][2].display = false;
}
if (opts.visibility !== undefined$1 && opts.visibility !== "hidden") {
- Velocity.State.calls[i2][2].visibility = false;
+ Velocity.State.calls[i][2].visibility = false;
}
if (opts.progress) {
opts.progress.call(
@@ -5081,7 +5081,7 @@
);
}
if (percentComplete === 1) {
- completeCall(i2);
+ completeCall(i);
}
}
}
@@ -5095,8 +5095,8 @@
}
var call = Velocity.State.calls[callIndex][0], elements = Velocity.State.calls[callIndex][1], opts = Velocity.State.calls[callIndex][2], resolver = Velocity.State.calls[callIndex][4];
var remainingCallsExist = false;
- for (var i2 = 0, callLength = call.length; i2 < callLength; i2++) {
- var element = call[i2].element;
+ for (var i = 0, callLength = call.length; i < callLength; i++) {
+ var element = call[i].element;
if (!isStopped && !opts.loop) {
if (opts.display === "none") {
CSS.setPropertyValue(element, "display", opts.display);
@@ -5111,7 +5111,7 @@
data.isAnimating = false;
data.rootPropertyValueCache = {};
var transformHAPropertyExists = false;
- $2.each(CSS.Lists.transforms3D, function(i3, transformName) {
+ $2.each(CSS.Lists.transforms3D, function(i2, transformName) {
var defaultValue = /^scale/.test(transformName) ? 1 : 0, currentValue = data.transformCache[transformName];
if (data.transformCache[transformName] !== undefined$1 && new RegExp("^\\(" + defaultValue + "[^.]").test(currentValue)) {
transformHAPropertyExists = true;
@@ -5128,7 +5128,7 @@
CSS.Values.removeClass(element, "velocity-animating");
}
}
- if (!isStopped && opts.complete && !opts.loop && i2 === callLength - 1) {
+ if (!isStopped && opts.complete && !opts.loop && i === callLength - 1) {
try {
opts.complete.call(elements, elements);
} catch (error) {
@@ -5176,7 +5176,7 @@
global2.fn.velocity = animate;
global2.fn.velocity.defaults = Velocity.defaults;
}
- $2.each(["Down", "Up"], function(i2, direction) {
+ $2.each(["Down", "Up"], function(i, direction) {
Velocity.Redirects["slide" + direction] = function(element, options, elementsIndex, elementsSize, elements, promiseData) {
var opts = $2.extend({}, options), begin = opts.begin, complete = opts.complete, inlineValues = {}, computedValues = { height: "", marginTop: "", marginBottom: "", paddingTop: "", paddingBottom: "" };
if (opts.display === undefined$1) {
@@ -5215,7 +5215,7 @@
Velocity(element, computedValues, opts);
};
});
- $2.each(["In", "Out"], function(i2, direction) {
+ $2.each(["In", "Out"], function(i, direction) {
Velocity.Redirects["fade" + direction] = function(element, options, elementsIndex, elementsSize, elements, promiseData) {
var opts = $2.extend({}, options), complete = opts.complete, propertiesMap = { opacity: direction === "In" ? 1 : 0 };
if (elementsIndex !== 0) {
@@ -5927,12 +5927,12 @@
}
function camelize(subject) {
const actionTypeParts = subject.split("-");
- let i2;
+ let i;
let part;
let camelizedSubject = "";
- for (i2 = 0; i2 < actionTypeParts.length; i2 += 1) {
- part = actionTypeParts[i2];
- if (i2 !== 0) {
+ for (i = 0; i < actionTypeParts.length; i += 1) {
+ part = actionTypeParts[i];
+ if (i !== 0) {
part = part.substring(0, 1).toUpperCase() + part.substring(1);
}
camelizedSubject += part;
@@ -6123,81 +6123,8 @@
});
});
$$1(document).ready(() => {
- prestashop$1.on("updateCart", (e2) => {
- prestashop$1.cart = e2.resp.cart;
- const n = $$1(".js-cart").data("refresh-url");
- if (!n)
- return;
- let o = {};
- e2 && e2.reason && (o = {
- id_product_attribute: e2.reason.idProductAttribute,
- id_product: e2.reason.idProduct
- }), $$1.post(n, o).then((e3) => {
- $$1(prestashop$1.selectors.cart.detailedTotals).replaceWith(
- e3.cart_detailed_totals
- ), $$1(prestashop$1.selectors.cart.summaryItemsSubtotal).replaceWith(
- e3.cart_summary_items_subtotal
- ), $$1(prestashop$1.selectors.cart.summarySubTotalsContainer).replaceWith(
- e3.cart_summary_subtotals_container
- ), $$1(prestashop$1.selectors.cart.summaryProducts).replaceWith(
- e3.cart_summary_products
- ), $$1(prestashop$1.selectors.cart.summaryTotals).replaceWith(
- e3.cart_summary_totals
- ), $$1(prestashop$1.selectors.cart.detailedActions).replaceWith(
- e3.cart_detailed_actions
- ), $$1(prestashop$1.selectors.cart.voucher).replaceWith(e3.cart_voucher), $$1(prestashop$1.selectors.cart.overview).replaceWith(e3.cart_detailed), $$1(prestashop$1.selectors.cart.summaryTop).replaceWith(
- e3.cart_summary_top
- ), $$1(prestashop$1.selectors.cart.productCustomizationId).val(0), $$1(prestashop$1.selectors.cart.lineProductQuantity).each((e4, n2) => {
- const r = $$1(n2);
- r.attr("value", r.val());
- }), $$1(prestashop$1.selectors.checkout.cartPaymentStepRefresh).length && i(), prestashop$1.emit("updatedCart", {
- eventType: "updateCart",
- resp: e3
- });
- }).fail((e3) => {
- prestashop$1.emit("handleError", { eventType: "updateCart", resp: e3 });
- });
- });
const e = $$1("body");
- e.on("click", '[data-button-action="add-to-cart"]', (e2) => {
- e2.preventDefaul$;
- const n = $$1(e2.currentTarget.form), o = `${n.serialize()}&add=1&action=update`, i2 = n.attr("action"), a = $$1(e2.currentTarget);
- a.prop("disabled", true);
- let s = (e3) => {
- e3.parents(prestashop$1.selectors.product.addToCart).firs$.find(prestashop$1.selectors.product.minimalQuantity).addClass("error"), e3.paren$.find("label").addClass("error");
- };
- const c = n.find("input[min]");
- ((e3) => {
- let n2 = true;
- return e3.each((e4, r) => {
- const o2 = $$1(r), i3 = parseInt(o2.attr("min"), 10);
- i3 && o2.val() < i3 && (s(o2), n2 = false);
- }), n2;
- })(c) ? $$1.post(i2, o, null, "json").then((e3) => {
- e3.hasError ? prestashop$1.emit("handleError", {
- eventType: "addProductToCart",
- resp: e3
- }) : prestashop$1.emit("updateCart", {
- reason: {
- idProduct: e3.id_product,
- idProductAttribute: e3.id_product_attribute,
- idCustomization: e3.id_customization,
- linkAction: "add-to-cart",
- cart: e3.cart
- },
- resp: e3
- });
- }).fail((e3) => {
- prestashop$1.emit("handleError", {
- eventType: "addProductToCart",
- resp: e3
- });
- }).always(() => {
- setTimeout(() => {
- a.prop("disabled", false);
- }, 1e3);
- }) : s(c);
- }), e.off("submit", '[data-link-action="add-voucher"]'), e.on("submit", '[data-link-action="add-voucher"]', (e2) => {
+ e.off("submit", '[data-link-action="add-voucher"]'), e.on("submit", '[data-link-action="add-voucher"]', (e2) => {
const promoSubmitBtn = $$1("#promo-code-form button");
e2.preventDefault();
const n = $$1(e2.currentTarget), o = n.attr("action");
@@ -6297,8 +6224,8 @@
};
EventEmitter.prototype.emit = function emit(type) {
var args = [];
- for (var i2 = 1; i2 < arguments.length; i2++)
- args.push(arguments[i2]);
+ for (var i = 1; i < arguments.length; i++)
+ args.push(arguments[i]);
var doError = type === "error";
var events2 = this._events;
if (events2 !== void 0)
@@ -6324,8 +6251,8 @@
} else {
var len = handler.length;
var listeners = arrayClone(handler, len);
- for (var i2 = 0; i2 < len; ++i2)
- ReflectApply(listeners[i2], this, args);
+ for (var i = 0; i < len; ++i)
+ ReflectApply(listeners[i], this, args);
}
return true;
};
@@ -6407,7 +6334,7 @@
return this;
};
EventEmitter.prototype.removeListener = function removeListener(type, listener) {
- var list, events2, position, i2, originalListener;
+ var list, events2, position, i, originalListener;
checkListener(listener);
events2 = this._events;
if (events2 === void 0)
@@ -6425,10 +6352,10 @@
}
} else if (typeof list !== "function") {
position = -1;
- for (i2 = list.length - 1; i2 >= 0; i2--) {
- if (list[i2] === listener || list[i2].listener === listener) {
- originalListener = list[i2].listener;
- position = i2;
+ for (i = list.length - 1; i >= 0; i--) {
+ if (list[i] === listener || list[i].listener === listener) {
+ originalListener = list[i].listener;
+ position = i;
break;
}
}
@@ -6448,7 +6375,7 @@
};
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
- var listeners, events2, i2;
+ var listeners, events2, i;
events2 = this._events;
if (events2 === void 0)
return this;
@@ -6467,8 +6394,8 @@
if (arguments.length === 0) {
var keys = Object.keys(events2);
var key;
- for (i2 = 0; i2 < keys.length; ++i2) {
- key = keys[i2];
+ for (i = 0; i < keys.length; ++i) {
+ key = keys[i];
if (key === "removeListener")
continue;
this.removeAllListeners(key);
@@ -6482,8 +6409,8 @@
if (typeof listeners === "function") {
this.removeListener(type, listeners);
} else if (listeners !== void 0) {
- for (i2 = listeners.length - 1; i2 >= 0; i2--) {
- this.removeListener(type, listeners[i2]);
+ for (i = listeners.length - 1; i >= 0; i--) {
+ this.removeListener(type, listeners[i]);
}
}
return this;
@@ -6530,8 +6457,8 @@
};
function arrayClone(arr, n) {
var copy = new Array(n);
- for (var i2 = 0; i2 < n; ++i2)
- copy[i2] = arr[i2];
+ for (var i = 0; i < n; ++i)
+ copy[i] = arr[i];
return copy;
}
function spliceOne(list, index) {
@@ -6541,8 +6468,8 @@
}
function unwrapListeners(arr) {
var ret = new Array(arr.length);
- for (var i2 = 0; i2 < ret.length; ++i2) {
- ret[i2] = arr[i2].listener || arr[i2];
+ for (var i = 0; i < ret.length; ++i) {
+ ret[i] = arr[i].listener || arr[i];
}
return ret;
}
@@ -6716,12 +6643,12 @@
return sprintf2.apply(null, [fmt].concat(argv || []));
}
function sprintf_format(parse_tree, argv) {
- var cursor = 1, tree_length = parse_tree.length, arg, output = "", i2, k, ph, pad, pad_character, pad_length, is_positive, sign;
- for (i2 = 0; i2 < tree_length; i2++) {
- if (typeof parse_tree[i2] === "string") {
- output += parse_tree[i2];
- } else if (typeof parse_tree[i2] === "object") {
- ph = parse_tree[i2];
+ var cursor = 1, tree_length = parse_tree.length, arg, output = "", i, k, ph, pad, pad_character, pad_length, is_positive, sign;
+ for (i = 0; i < tree_length; i++) {
+ if (typeof parse_tree[i] === "string") {
+ output += parse_tree[i];
+ } else if (typeof parse_tree[i] === "object") {
+ ph = parse_tree[i];
if (ph.keys) {
arg = argv[cursor];
for (k = 0; k < ph.keys.length; k++) {
@@ -7100,20 +7027,20 @@
function o() {
}
return o.prototype = t, new o();
- }), function(t, o, i2, s) {
- var n = { _positionClasses: ["bottom-left", "bottom-right", "top-right", "top-left", "bottom-center", "top-center", "mid-center"], _defaultIcons: ["success", "error", "info", "warning"], init: function(o2, i3) {
+ }), function(t, o, i, s) {
+ var n = { _positionClasses: ["bottom-left", "bottom-right", "top-right", "top-left", "bottom-center", "top-center", "mid-center"], _defaultIcons: ["success", "error", "info", "warning"], init: function(o2, i2) {
this.prepareOptions(o2, t.toast.options), this.process();
- }, prepareOptions: function(o2, i3) {
+ }, prepareOptions: function(o2, i2) {
var s2 = {};
- "string" == typeof o2 || o2 instanceof Array ? s2.text = o2 : s2 = o2, this.options = t.extend({}, i3, s2);
+ "string" == typeof o2 || o2 instanceof Array ? s2.text = o2 : s2 = o2, this.options = t.extend({}, i2, s2);
}, process: function() {
this.setup(), this.addToDom(), this.position(), this.bindToast(), this.animate();
}, setup: function() {
var o2 = "";
if (this._toastEl = this._toastEl || t("
", { "class": "jq-toast-single" }), o2 += '', this.options.allowToastClose && (o2 += '×'), this.options.text instanceof Array) {
this.options.heading && (o2 += '' + this.options.heading + "
"), o2 += '';
- for (var i3 = 0; i3 < this.options.text.length; i3++)
- o2 += '- ' + this.options.text[i3] + "
";
+ for (var i2 = 0; i2 < this.options.text.length; i2++)
+ o2 += '- ' + this.options.text[i2] + "
";
o2 += "
";
} else
this.options.heading && (o2 += '' + this.options.heading + "
"), o2 += this.options.text;
@@ -7144,7 +7071,7 @@
}, addToDom: function() {
var o2 = t(".jq-toast-wrap");
if (0 === o2.length ? (o2 = t("", { "class": "jq-toast-wrap" }), t("body").append(o2)) : (!this.options.stack || isNaN(parseInt(this.options.stack, 10))) && o2.empty(), o2.find(".jq-toast-single:hidden").remove(), o2.append(this._toastEl), this.options.stack && !isNaN(parseInt(this.options.stack), 10)) {
- var i3 = o2.find(".jq-toast-single").length, s2 = i3 - this.options.stack;
+ var i2 = o2.find(".jq-toast-single").length, s2 = i2 - this.options.stack;
s2 > 0 && t(".jq-toast-wrap").find(".jq-toast-single").slice(0, s2).remove();
}
this._container = o2;
@@ -7153,8 +7080,8 @@
}, processLoader: function() {
if (!this.canAutoHide() || this.options.loader === false)
return false;
- var t2 = this._toastEl.find(".jq-toast-loader"), o2 = (this.options.hideAfter - 400) / 1e3 + "s", i3 = this.options.loaderBg, s2 = t2.attr("style") || "";
- s2 = s2.substring(0, s2.indexOf("-webkit-transition")), s2 += "-webkit-transition: width " + o2 + " ease-in; -o-transition: width " + o2 + " ease-in; transition: width " + o2 + " ease-in; background-color: " + i3 + ";", t2.attr("style", s2).addClass("jq-toast-loaded");
+ var t2 = this._toastEl.find(".jq-toast-loader"), o2 = (this.options.hideAfter - 400) / 1e3 + "s", i2 = this.options.loaderBg, s2 = t2.attr("style") || "";
+ s2 = s2.substring(0, s2.indexOf("-webkit-transition")), s2 += "-webkit-transition: width " + o2 + " ease-in; -o-transition: width " + o2 + " ease-in; transition: width " + o2 + " ease-in; background-color: " + i2 + ";", t2.attr("style", s2).addClass("jq-toast-loaded");
}, animate: function() {
var t2 = this;
if (this._toastEl.hide(), this._toastEl.trigger("beforeShow"), "fade" === this.options.showHideTransition.toLowerCase() ? this._toastEl.fadeIn(function() {
@@ -7279,22 +7206,22 @@
};
}(commonjsGlobal, function(t) {
function e(t2, e2, s2) {
- var i3;
+ var i2;
return function() {
var n = this, o = arguments, h = function() {
- i3 = null, s2 || t2.apply(n, o);
- }, a = s2 && !i3;
- clearTimeout(i3), i3 = setTimeout(h, e2), a && t2.apply(n, o);
+ i2 = null, s2 || t2.apply(n, o);
+ }, a = s2 && !i2;
+ clearTimeout(i2), i2 = setTimeout(h, e2), a && t2.apply(n, o);
};
}
function s(e2, s2) {
var n, o, h = t(e2).data();
this.$el = t(e2);
for (n in h)
- h.hasOwnProperty(n) && /^offcanvas[A-Z]+/.test(n) && (o = n[i2.length].toLowerCase() + n.substr(i2.length + 1), h[o] = h[n]);
- this.settings = t.extend(true, {}, t.fn[i2].defaults, s2, h), this.name = i2, this.$el.data(this.name + ".opts", this.settings), this.init();
+ h.hasOwnProperty(n) && /^offcanvas[A-Z]+/.test(n) && (o = n[i.length].toLowerCase() + n.substr(i.length + 1), h[o] = h[n]);
+ this.settings = t.extend(true, {}, t.fn[i].defaults, s2, h), this.name = i, this.$el.data(this.name + ".opts", this.settings), this.init();
}
- var i2 = "offcanvas";
+ var i = "offcanvas";
t.extend(s.prototype, { setHeights: function() {
var t2 = this.$outerWrapper.height();
this.$el.data(this.name + ".opts") && (this.$element.css("height", t2), this.settings.overlay && this.$overlay.css("height", t2));
@@ -7316,15 +7243,15 @@
}, init: function() {
var s2 = {};
this.$win = t(window), this.$body = t("body"), this.visible = false, this.$cont = t(this.settings.container), this.$cont.addClass(this.settings.classes.container).children(":not(script)").wrapAll(t("").addClass(this.settings.classes.outer)), this.$outerWrapper = t("." + this.settings.classes.outer).wrapInner(t("").addClass(this.settings.classes.inner)), this.$innerWrapper = t("." + this.settings.classes.inner), this.settings.overlay && (this.$innerWrapper.append(t("").addClass(this.settings.classes.overlay).css("background-color", this.settings.overlayColor)), this.$overlay = t("." + this.settings.classes.overlay)), this.$el.wrap(t("").addClass(this.settings.classes.element)), this.$element = this.$el.parent(), s2[this.settings.origin] = "-" + this.settings.coverage, s2.width = this.settings.coverage, this.$element.css(s2), this.effects = { push: { $el: this.$innerWrapper, from: 0, to: this.settings.coverage }, "slide-in-over": { $el: this.$element, from: "-" + this.settings.coverage, to: 0 } }, this.animationOptions = { easing: this.settings.easing, duration: this.settings.duration }, this.$win.on("resize." + this.name, e(this.setHeights, 300).bind(this)), this.setHeights(), this.$el.trigger("init." + this.name);
- } }), t.fn[i2] = function(e2) {
+ } }), t.fn[i] = function(e2) {
var n, o = arguments;
return void 0 === e2 || "object" == typeof e2 ? this.each(function() {
- t.data(this, "plugin_" + i2) || t.data(this, "plugin_" + i2, new s(this, e2));
+ t.data(this, "plugin_" + i) || t.data(this, "plugin_" + i, new s(this, e2));
}) : "string" == typeof e2 && "_" !== e2[0] && "init" !== e2 && (this.each(function() {
- var h = t.data(this, "plugin_" + i2);
- h instanceof s && "function" == typeof h[e2] && (n = h[e2].apply(h, Array.prototype.slice.call(o, 1))), "destroy" === e2 && t.data(this, "plugin_" + i2, null);
+ var h = t.data(this, "plugin_" + i);
+ h instanceof s && "function" == typeof h[e2] && (n = h[e2].apply(h, Array.prototype.slice.call(o, 1))), "destroy" === e2 && t.data(this, "plugin_" + i, null);
}), void 0 !== n ? n : this);
- }, t.fn[i2].defaults = { classes: { container: i2, element: i2 + "-element", inner: i2 + "-inner", open: i2 + "-open", outer: i2 + "-outer", overlay: i2 + "-overlay" }, container: "body", coverage: "220px", origin: "left", duration: 300, easing: "ease-in-out", effect: "push", overlay: false, overlayColor: "rgba(0, 0, 0, 0.7)" };
+ }, t.fn[i].defaults = { classes: { container: i, element: i + "-element", inner: i + "-inner", open: i + "-open", outer: i + "-outer", overlay: i + "-overlay" }, container: "body", coverage: "220px", origin: "left", duration: 300, easing: "ease-in-out", effect: "push", overlay: false, overlayColor: "rgba(0, 0, 0, 0.7)" };
});
})(jquery_offcanvas_min);
var jquery_offcanvas_minExports = jquery_offcanvas_min.exports;
@@ -7355,8 +7282,8 @@
*/
jo(window, $$1);
touchspin(window, $$1);
- for (const i2 in EventEmitter$1.prototype) {
- prestashop$1[i2] = EventEmitter$1.prototype[i2];
+ for (const i in EventEmitter$1.prototype) {
+ prestashop$1[i] = EventEmitter$1.prototype[i];
}
$$1(() => {
const dropDownEl = $$1(".js-dropdown");
@@ -7472,4 +7399,4 @@
});
});
})(jQuery, prestashop);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuanMiLCJzb3VyY2VzIjpbIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL2pxdWVyeS1tb2RhbC9qcXVlcnkubW9kYWwuanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy90b29sdGlwc3Rlci9kaXN0L2pzL3Rvb2x0aXBzdGVyLmJ1bmRsZS5taW4uanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy9ib290c3RyYXAtdG91Y2hzcGluL2Rpc3QvanF1ZXJ5LmJvb3RzdHJhcC10b3VjaHNwaW4uanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy9qcXVlcnktdG91Y2hzd2lwZS9qcXVlcnkudG91Y2hTd2lwZS5taW4uanMiLCIuLi8uLi9fZGV2L2pzL3NlbGVjdG9ycy5qcyIsIi4uLy4uL19kZXYvanMvdGFicy5qcyIsIi4uLy4uL19kZXYvanMvZWFzeXpvb20uanMiLCIuLi8uLi9fZGV2L2pzL3Jlc3BvbnNpdmUuanMiLCIuLi8uLi9fZGV2L2pzL2NoZWNrb3V0LmpzIiwiLi4vLi4vX2Rldi9qcy9jdXN0b21lci5qcyIsIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL3ZlbG9jaXR5LWFuaW1hdGUvdmVsb2NpdHkuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvdXBkYXRlLXNvdXJjZXMuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvcHJvZHVjdC1taW5pYXR1cmUuanMiLCIuLi8uLi9fZGV2L2pzL2xpc3RpbmcuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvcHJvZHVjdC1zZWxlY3QuanMiLCIuLi8uLi9fZGV2L2pzL3Byb2R1Y3QuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvZGVib3VuY2UuanMiLCIuLi8uLi9fZGV2L2pzL2NhcnQuanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwiLi4vLi4vX2Rldi9qcy9jb21wb25lbnRzL2Ryb3AtZG93bi5qcyIsIi4uLy4uL19kZXYvanMvY29tcG9uZW50cy9mb3JtLmpzIiwiLi4vLi4vX2Rldi9ub2RlX21vZHVsZXMvc3ByaW50Zi1qcy9zcmMvc3ByaW50Zi5qcyIsIi4uLy4uL19kZXYvanMvY29tcG9uZW50cy91c2VQYXNzd29yZFBvbGljeS5qcyIsIi4uLy4uL19kZXYvanMvY29tcG9uZW50cy90b3AtbWVudS5qcyIsIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL2pxdWVyeS10b2FzdC1wbHVnaW4vZGlzdC9qcXVlcnkudG9hc3QubWluLmpzIiwiLi4vLi4vX2Rldi9qcy9jb21wb25lbnRzL2Jsb2NrLWNhcnQuanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy9qcXVlcnktb2ZmY2FudmFzL2Rpc3QvanF1ZXJ5Lm9mZmNhbnZhcy5taW4uanMiLCIuLi8uLi9fZGV2L2pzL3RoZW1lLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgQSBzaW1wbGUgalF1ZXJ5IG1vZGFsIChodHRwOi8vZ2l0aHViLmNvbS9reWxlZm94L2pxdWVyeS1tb2RhbClcbiAgICBWZXJzaW9uIDAuOS4yXG4qL1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgLy8gTWFraW5nIHlvdXIgalF1ZXJ5IHBsdWdpbiB3b3JrIGJldHRlciB3aXRoIG5wbSB0b29sc1xuICAvLyBodHRwOi8vYmxvZy5ucG1qcy5vcmcvcG9zdC8xMTI3MTIxNjk4MzAvbWFraW5nLXlvdXItanF1ZXJ5LXBsdWdpbi13b3JrLWJldHRlci13aXRoLW5wbVxuICBpZih0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIGZhY3RvcnkocmVxdWlyZShcImpxdWVyeVwiKSwgd2luZG93LCBkb2N1bWVudCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZmFjdG9yeShqUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuICB9XG59KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG4gIHZhciBtb2RhbHMgPSBbXSxcbiAgICAgIGdldEN1cnJlbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG1vZGFscy5sZW5ndGggPyBtb2RhbHNbbW9kYWxzLmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICAgIH0sXG4gICAgICBzZWxlY3RDdXJyZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChpPW1vZGFscy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7XG4gICAgICAgICAgaWYgKG1vZGFsc1tpXS4kYmxvY2tlcikge1xuICAgICAgICAgICAgbW9kYWxzW2ldLiRibG9ja2VyLnRvZ2dsZUNsYXNzKCdjdXJyZW50Jywhc2VsZWN0ZWQpLnRvZ2dsZUNsYXNzKCdiZWhpbmQnLHNlbGVjdGVkKTtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgJC5tb2RhbCA9IGZ1bmN0aW9uKGVsLCBvcHRpb25zKSB7XG4gICAgdmFyIHJlbW92ZSwgdGFyZ2V0O1xuICAgIHRoaXMuJGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sICQubW9kYWwuZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIHRoaXMub3B0aW9ucy5kb0ZhZGUgPSAhaXNOYU4ocGFyc2VJbnQodGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiwgMTApKTtcbiAgICB0aGlzLiRibG9ja2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlRXhpc3RpbmcpXG4gICAgICB3aGlsZSAoJC5tb2RhbC5pc0FjdGl2ZSgpKVxuICAgICAgICAkLm1vZGFsLmNsb3NlKCk7IC8vIENsb3NlIGFueSBvcGVuIG1vZGFscy5cbiAgICBtb2RhbHMucHVzaCh0aGlzKTtcbiAgICBpZiAoZWwuaXMoJ2EnKSkge1xuICAgICAgdGFyZ2V0ID0gZWwuYXR0cignaHJlZicpO1xuICAgICAgdGhpcy5hbmNob3IgPSBlbDtcbiAgICAgIC8vU2VsZWN0IGVsZW1lbnQgYnkgaWQgZnJvbSBocmVmXG4gICAgICBpZiAoL14jLy50ZXN0KHRhcmdldCkpIHtcbiAgICAgICAgdGhpcy4kZWxtID0gJCh0YXJnZXQpO1xuICAgICAgICBpZiAodGhpcy4kZWxtLmxlbmd0aCAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuJGJvZHkuYXBwZW5kKHRoaXMuJGVsbSk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgLy9BSkFYXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiRlbG0gPSAkKCc8ZGl2PicpO1xuICAgICAgICB0aGlzLiRib2R5LmFwcGVuZCh0aGlzLiRlbG0pO1xuICAgICAgICByZW1vdmUgPSBmdW5jdGlvbihldmVudCwgbW9kYWwpIHsgbW9kYWwuZWxtLnJlbW92ZSgpOyB9O1xuICAgICAgICB0aGlzLnNob3dTcGlubmVyKCk7XG4gICAgICAgIGVsLnRyaWdnZXIoJC5tb2RhbC5BSkFYX1NFTkQpO1xuICAgICAgICAkLmdldCh0YXJnZXQpLmRvbmUoZnVuY3Rpb24oaHRtbCkge1xuICAgICAgICAgIGlmICghJC5tb2RhbC5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgICAgZWwudHJpZ2dlcigkLm1vZGFsLkFKQVhfU1VDQ0VTUyk7XG4gICAgICAgICAgdmFyIGN1cnJlbnQgPSBnZXRDdXJyZW50KCk7XG4gICAgICAgICAgY3VycmVudC4kZWxtLmVtcHR5KCkuYXBwZW5kKGh0bWwpLm9uKCQubW9kYWwuQ0xPU0UsIHJlbW92ZSk7XG4gICAgICAgICAgY3VycmVudC5oaWRlU3Bpbm5lcigpO1xuICAgICAgICAgIGN1cnJlbnQub3BlbigpO1xuICAgICAgICAgIGVsLnRyaWdnZXIoJC5tb2RhbC5BSkFYX0NPTVBMRVRFKTtcbiAgICAgICAgfSkuZmFpbChmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbC50cmlnZ2VyKCQubW9kYWwuQUpBWF9GQUlMKTtcbiAgICAgICAgICB2YXIgY3VycmVudCA9IGdldEN1cnJlbnQoKTtcbiAgICAgICAgICBjdXJyZW50LmhpZGVTcGlubmVyKCk7XG4gICAgICAgICAgbW9kYWxzLnBvcCgpOyAvLyByZW1vdmUgZXhwZWN0ZWQgbW9kYWwgZnJvbSB0aGUgbGlzdFxuICAgICAgICAgIGVsLnRyaWdnZXIoJC5tb2RhbC5BSkFYX0NPTVBMRVRFKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuJGVsbSA9IGVsO1xuICAgICAgdGhpcy5hbmNob3IgPSBlbDtcbiAgICAgIHRoaXMuJGJvZHkuYXBwZW5kKHRoaXMuJGVsbSk7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH07XG5cbiAgJC5tb2RhbC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6ICQubW9kYWwsXG5cbiAgICBvcGVuOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBtID0gdGhpcztcbiAgICAgIHRoaXMuYmxvY2soKTtcbiAgICAgIHRoaXMuYW5jaG9yLmJsdXIoKTtcbiAgICAgIGlmKHRoaXMub3B0aW9ucy5kb0ZhZGUpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICBtLnNob3coKTtcbiAgICAgICAgfSwgdGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiAqIHRoaXMub3B0aW9ucy5mYWRlRGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgICAkKGRvY3VtZW50KS5vZmYoJ2tleWRvd24ubW9kYWwnKS5vbigna2V5ZG93bi5tb2RhbCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gZ2V0Q3VycmVudCgpO1xuICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IDI3ICYmIGN1cnJlbnQub3B0aW9ucy5lc2NhcGVDbG9zZSkgY3VycmVudC5jbG9zZSgpO1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNsaWNrQ2xvc2UpXG4gICAgICAgIHRoaXMuJGJsb2NrZXIuY2xpY2soZnVuY3Rpb24oZSkge1xuICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcylcbiAgICAgICAgICAgICQubW9kYWwuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIGNsb3NlOiBmdW5jdGlvbigpIHtcbiAgICAgIG1vZGFscy5wb3AoKTtcbiAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICBpZiAoISQubW9kYWwuaXNBY3RpdmUoKSlcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKCdrZXlkb3duLm1vZGFsJyk7XG4gICAgfSxcblxuICAgIGJsb2NrOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuJGVsbS50cmlnZ2VyKCQubW9kYWwuQkVGT1JFX0JMT0NLLCBbdGhpcy5fY3R4KCldKTtcbiAgICAgIHRoaXMuJGJvZHkuY3NzKCdvdmVyZmxvdycsJ2hpZGRlbicpO1xuICAgICAgdGhpcy4kYmxvY2tlciA9ICQoJzxkaXYgY2xhc3M9XCInICsgdGhpcy5vcHRpb25zLmJsb2NrZXJDbGFzcyArICcgYmxvY2tlciBjdXJyZW50XCI+PC9kaXY+JykuYXBwZW5kVG8odGhpcy4kYm9keSk7XG4gICAgICBzZWxlY3RDdXJyZW50KCk7XG4gICAgICBpZih0aGlzLm9wdGlvbnMuZG9GYWRlKSB7XG4gICAgICAgIHRoaXMuJGJsb2NrZXIuY3NzKCdvcGFjaXR5JywwKS5hbmltYXRlKHtvcGFjaXR5OiAxfSwgdGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLkJMT0NLLCBbdGhpcy5fY3R4KCldKTtcbiAgICB9LFxuXG4gICAgdW5ibG9jazogZnVuY3Rpb24obm93KSB7XG4gICAgICBpZiAoIW5vdyAmJiB0aGlzLm9wdGlvbnMuZG9GYWRlKVxuICAgICAgICB0aGlzLiRibG9ja2VyLmZhZGVPdXQodGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiwgdGhpcy51bmJsb2NrLmJpbmQodGhpcyx0cnVlKSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy4kYmxvY2tlci5jaGlsZHJlbigpLmFwcGVuZFRvKHRoaXMuJGJvZHkpO1xuICAgICAgICB0aGlzLiRibG9ja2VyLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLiRibG9ja2VyID0gbnVsbDtcbiAgICAgICAgc2VsZWN0Q3VycmVudCgpO1xuICAgICAgICBpZiAoISQubW9kYWwuaXNBY3RpdmUoKSlcbiAgICAgICAgICB0aGlzLiRib2R5LmNzcygnb3ZlcmZsb3cnLCcnKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdzogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLkJFRk9SRV9PUEVOLCBbdGhpcy5fY3R4KCldKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0Nsb3NlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24gPSAkKCc8YSBocmVmPVwiI2Nsb3NlLW1vZGFsXCIgcmVsPVwibW9kYWw6Y2xvc2VcIiBjbGFzcz1cImNsb3NlLW1vZGFsICcgKyB0aGlzLm9wdGlvbnMuY2xvc2VDbGFzcyArICdcIj4nICsgdGhpcy5vcHRpb25zLmNsb3NlVGV4dCArICc8L2E+Jyk7XG4gICAgICAgIHRoaXMuJGVsbS5hcHBlbmQodGhpcy5jbG9zZUJ1dHRvbik7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbG0uYWRkQ2xhc3ModGhpcy5vcHRpb25zLm1vZGFsQ2xhc3MpLmFwcGVuZFRvKHRoaXMuJGJsb2NrZXIpO1xuICAgICAgaWYodGhpcy5vcHRpb25zLmRvRmFkZSkge1xuICAgICAgICB0aGlzLiRlbG0uY3NzKHtvcGFjaXR5OiAwLCBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ30pLmFuaW1hdGUoe29wYWNpdHk6IDF9LCB0aGlzLm9wdGlvbnMuZmFkZUR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuJGVsbS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLk9QRU4sIFt0aGlzLl9jdHgoKV0pO1xuICAgIH0sXG5cbiAgICBoaWRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuJGVsbS50cmlnZ2VyKCQubW9kYWwuQkVGT1JFX0NMT1NFLCBbdGhpcy5fY3R4KCldKTtcbiAgICAgIGlmICh0aGlzLmNsb3NlQnV0dG9uKSB0aGlzLmNsb3NlQnV0dG9uLnJlbW92ZSgpO1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIGlmKHRoaXMub3B0aW9ucy5kb0ZhZGUpIHtcbiAgICAgICAgdGhpcy4kZWxtLmZhZGVPdXQodGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLkFGVEVSX0NMT1NFLCBbX3RoaXMuX2N0eCgpXSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4kZWxtLmhpZGUoMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLkFGVEVSX0NMT1NFLCBbX3RoaXMuX2N0eCgpXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy4kZWxtLnRyaWdnZXIoJC5tb2RhbC5DTE9TRSwgW3RoaXMuX2N0eCgpXSk7XG4gICAgfSxcblxuICAgIHNob3dTcGlubmVyOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dTcGlubmVyKSByZXR1cm47XG4gICAgICB0aGlzLnNwaW5uZXIgPSB0aGlzLnNwaW5uZXIgfHwgJCgnPGRpdiBjbGFzcz1cIicgKyB0aGlzLm9wdGlvbnMubW9kYWxDbGFzcyArICctc3Bpbm5lclwiPjwvZGl2PicpXG4gICAgICAgIC5hcHBlbmQodGhpcy5vcHRpb25zLnNwaW5uZXJIdG1sKTtcbiAgICAgIHRoaXMuJGJvZHkuYXBwZW5kKHRoaXMuc3Bpbm5lcik7XG4gICAgICB0aGlzLnNwaW5uZXIuc2hvdygpO1xuICAgIH0sXG5cbiAgICBoaWRlU3Bpbm5lcjogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zcGlubmVyKSB0aGlzLnNwaW5uZXIucmVtb3ZlKCk7XG4gICAgfSxcblxuICAgIC8vUmV0dXJuIGNvbnRleHQgZm9yIGN1c3RvbSBldmVudHNcbiAgICBfY3R4OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7IGVsbTogdGhpcy4kZWxtLCAkZWxtOiB0aGlzLiRlbG0sICRibG9ja2VyOiB0aGlzLiRibG9ja2VyLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsICRhbmNob3I6IHRoaXMuYW5jaG9yIH07XG4gICAgfVxuICB9O1xuXG4gICQubW9kYWwuY2xvc2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICghJC5tb2RhbC5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgaWYgKGV2ZW50KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBjdXJyZW50ID0gZ2V0Q3VycmVudCgpO1xuICAgIGN1cnJlbnQuY2xvc2UoKTtcbiAgICByZXR1cm4gY3VycmVudC4kZWxtO1xuICB9O1xuXG4gIC8vIFJldHVybnMgaWYgdGhlcmUgY3VycmVudGx5IGlzIGFuIGFjdGl2ZSBtb2RhbFxuICAkLm1vZGFsLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtb2RhbHMubGVuZ3RoID4gMDtcbiAgfTtcblxuICAkLm1vZGFsLmdldEN1cnJlbnQgPSBnZXRDdXJyZW50O1xuXG4gICQubW9kYWwuZGVmYXVsdHMgPSB7XG4gICAgY2xvc2VFeGlzdGluZzogdHJ1ZSxcbiAgICBlc2NhcGVDbG9zZTogdHJ1ZSxcbiAgICBjbGlja0Nsb3NlOiB0cnVlLFxuICAgIGNsb3NlVGV4dDogJ0Nsb3NlJyxcbiAgICBjbG9zZUNsYXNzOiAnJyxcbiAgICBtb2RhbENsYXNzOiBcIm1vZGFsXCIsXG4gICAgYmxvY2tlckNsYXNzOiBcImpxdWVyeS1tb2RhbFwiLFxuICAgIHNwaW5uZXJIdG1sOiAnPGRpdiBjbGFzcz1cInJlY3QxXCI+PC9kaXY+PGRpdiBjbGFzcz1cInJlY3QyXCI+PC9kaXY+PGRpdiBjbGFzcz1cInJlY3QzXCI+PC9kaXY+PGRpdiBjbGFzcz1cInJlY3Q0XCI+PC9kaXY+JyxcbiAgICBzaG93U3Bpbm5lcjogdHJ1ZSxcbiAgICBzaG93Q2xvc2U6IHRydWUsXG4gICAgZmFkZUR1cmF0aW9uOiBudWxsLCAgIC8vIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhlIGZhZGUgYW5pbWF0aW9uIHRha2VzLlxuICAgIGZhZGVEZWxheTogMS4wICAgICAgICAvLyBQb2ludCBkdXJpbmcgdGhlIG92ZXJsYXkncyBmYWRlLWluIHRoYXQgdGhlIG1vZGFsIGJlZ2lucyB0byBmYWRlIGluICguNSA9IDUwJSwgMS41ID0gMTUwJSwgZXRjLilcbiAgfTtcblxuICAvLyBFdmVudCBjb25zdGFudHNcbiAgJC5tb2RhbC5CRUZPUkVfQkxPQ0sgPSAnbW9kYWw6YmVmb3JlLWJsb2NrJztcbiAgJC5tb2RhbC5CTE9DSyA9ICdtb2RhbDpibG9jayc7XG4gICQubW9kYWwuQkVGT1JFX09QRU4gPSAnbW9kYWw6YmVmb3JlLW9wZW4nO1xuICAkLm1vZGFsLk9QRU4gPSAnbW9kYWw6b3Blbic7XG4gICQubW9kYWwuQkVGT1JFX0NMT1NFID0gJ21vZGFsOmJlZm9yZS1jbG9zZSc7XG4gICQubW9kYWwuQ0xPU0UgPSAnbW9kYWw6Y2xvc2UnO1xuICAkLm1vZGFsLkFGVEVSX0NMT1NFID0gJ21vZGFsOmFmdGVyLWNsb3NlJztcbiAgJC5tb2RhbC5BSkFYX1NFTkQgPSAnbW9kYWw6YWpheDpzZW5kJztcbiAgJC5tb2RhbC5BSkFYX1NVQ0NFU1MgPSAnbW9kYWw6YWpheDpzdWNjZXNzJztcbiAgJC5tb2RhbC5BSkFYX0ZBSUwgPSAnbW9kYWw6YWpheDpmYWlsJztcbiAgJC5tb2RhbC5BSkFYX0NPTVBMRVRFID0gJ21vZGFsOmFqYXg6Y29tcGxldGUnO1xuXG4gICQuZm4ubW9kYWwgPSBmdW5jdGlvbihvcHRpb25zKXtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIG5ldyAkLm1vZGFsKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBBdXRvbWF0aWNhbGx5IGJpbmQgbGlua3Mgd2l0aCByZWw9XCJtb2RhbDpjbG9zZVwiIHRvLCB3ZWxsLCBjbG9zZSB0aGUgbW9kYWwuXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljay5tb2RhbCcsICdhW3JlbH49XCJtb2RhbDpjbG9zZVwiXScsICQubW9kYWwuY2xvc2UpO1xuICAkKGRvY3VtZW50KS5vbignY2xpY2subW9kYWwnLCAnYVtyZWx+PVwibW9kYWw6b3BlblwiXScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAkKHRoaXMpLm1vZGFsKCk7XG4gIH0pO1xufSkpO1xuIiwiLyohIHRvb2x0aXBzdGVyIHY0LjIuOCAqLyFmdW5jdGlvbihhLGIpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGZ1bmN0aW9uKGEpe3JldHVybiBiKGEpfSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YihyZXF1aXJlKFwianF1ZXJ5XCIpKTpiKGpRdWVyeSl9KHRoaXMsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt0aGlzLiRjb250YWluZXIsdGhpcy5jb25zdHJhaW50cz1udWxsLHRoaXMuX18kdG9vbHRpcCx0aGlzLl9faW5pdChhKX1mdW5jdGlvbiBjKGIsYyl7dmFyIGQ9ITA7cmV0dXJuIGEuZWFjaChiLGZ1bmN0aW9uKGEsZSl7cmV0dXJuIHZvaWQgMD09PWNbYV18fGJbYV0hPT1jW2FdPyhkPSExLCExKTp2b2lkIDB9KSxkfWZ1bmN0aW9uIGQoYil7dmFyIGM9Yi5hdHRyKFwiaWRcIiksZD1jP2gud2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGMpOm51bGw7cmV0dXJuIGQ/ZD09PWJbMF06YS5jb250YWlucyhoLndpbmRvdy5kb2N1bWVudC5ib2R5LGJbMF0pfWZ1bmN0aW9uIGUoKXtpZighZylyZXR1cm4hMTt2YXIgYT1nLmRvY3VtZW50LmJvZHl8fGcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGI9YS5zdHlsZSxjPVwidHJhbnNpdGlvblwiLGQ9W1wiTW96XCIsXCJXZWJraXRcIixcIktodG1sXCIsXCJPXCIsXCJtc1wiXTtpZihcInN0cmluZ1wiPT10eXBlb2YgYltjXSlyZXR1cm4hMDtjPWMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYy5zdWJzdHIoMSk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoXCJzdHJpbmdcIj09dHlwZW9mIGJbZFtlXStjXSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgZj17YW5pbWF0aW9uOlwiZmFkZVwiLGFuaW1hdGlvbkR1cmF0aW9uOjM1MCxjb250ZW50Om51bGwsY29udGVudEFzSFRNTDohMSxjb250ZW50Q2xvbmluZzohMSxkZWJ1ZzohMCxkZWxheTozMDAsZGVsYXlUb3VjaDpbMzAwLDUwMF0sZnVuY3Rpb25Jbml0Om51bGwsZnVuY3Rpb25CZWZvcmU6bnVsbCxmdW5jdGlvblJlYWR5Om51bGwsZnVuY3Rpb25BZnRlcjpudWxsLGZ1bmN0aW9uRm9ybWF0Om51bGwsSUVtaW46NixpbnRlcmFjdGl2ZTohMSxtdWx0aXBsZTohMSxwYXJlbnQ6bnVsbCxwbHVnaW5zOltcInNpZGVUaXBcIl0scmVwb3NpdGlvbk9uU2Nyb2xsOiExLHJlc3RvcmF0aW9uOlwibm9uZVwiLHNlbGZEZXN0cnVjdGlvbjohMCx0aGVtZTpbXSx0aW1lcjowLHRyYWNrZXJJbnRlcnZhbDo1MDAsdHJhY2tPcmlnaW46ITEsdHJhY2tUb29sdGlwOiExLHRyaWdnZXI6XCJob3ZlclwiLHRyaWdnZXJDbG9zZTp7Y2xpY2s6ITEsbW91c2VsZWF2ZTohMSxvcmlnaW5DbGljazohMSxzY3JvbGw6ITEsdGFwOiExLHRvdWNobGVhdmU6ITF9LHRyaWdnZXJPcGVuOntjbGljazohMSxtb3VzZWVudGVyOiExLHRhcDohMSx0b3VjaHN0YXJ0OiExfSx1cGRhdGVBbmltYXRpb246XCJyb3RhdGVcIix6SW5kZXg6OTk5OTk5OX0sZz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzpudWxsLGg9e2hhc1RvdWNoQ2FwYWJpbGl0eTohKCFnfHwhKFwib250b3VjaHN0YXJ0XCJpbiBnfHxnLkRvY3VtZW50VG91Y2gmJmcuZG9jdW1lbnQgaW5zdGFuY2VvZiBnLkRvY3VtZW50VG91Y2h8fGcubmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzKSksaGFzVHJhbnNpdGlvbnM6ZSgpLElFOiExLHNlbVZlcjpcIjQuMi44XCIsd2luZG93Omd9LGk9ZnVuY3Rpb24oKXt0aGlzLl9fJGVtaXR0ZXJQcml2YXRlPWEoe30pLHRoaXMuX18kZW1pdHRlclB1YmxpYz1hKHt9KSx0aGlzLl9faW5zdGFuY2VzTGF0ZXN0QXJyPVtdLHRoaXMuX19wbHVnaW5zPXt9LHRoaXMuX2Vudj1ofTtpLnByb3RvdHlwZT17X19icmlkZ2U6ZnVuY3Rpb24oYixjLGQpe2lmKCFjW2RdKXt2YXIgZT1mdW5jdGlvbigpe307ZS5wcm90b3R5cGU9Yjt2YXIgZz1uZXcgZTtnLl9faW5pdCYmZy5fX2luaXQoYyksYS5lYWNoKGIsZnVuY3Rpb24oYSxiKXswIT1hLmluZGV4T2YoXCJfX1wiKSYmKGNbYV0/Zi5kZWJ1ZyYmY29uc29sZS5sb2coXCJUaGUgXCIrYStcIiBtZXRob2Qgb2YgdGhlIFwiK2QrXCIgcGx1Z2luIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgcGx1Z2luIG9yIG5hdGl2ZSBtZXRob2RzXCIpOihjW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIGdbYV0uYXBwbHkoZyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSl9LGNbYV0uYnJpZGdlZD1nKSl9KSxjW2RdPWd9cmV0dXJuIHRoaXN9LF9fc2V0V2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBoLndpbmRvdz1hLHRoaXN9LF9nZXRSdWxlcjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGIoYSl9LF9vZmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fXyRlbWl0dGVyUHJpdmF0ZS5vZmYuYXBwbHkodGhpcy5fXyRlbWl0dGVyUHJpdmF0ZSxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sX29uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX18kZW1pdHRlclByaXZhdGUub24uYXBwbHkodGhpcy5fXyRlbWl0dGVyUHJpdmF0ZSxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sX29uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLm9uZS5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpKSx0aGlzfSxfcGx1Z2luOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGIpe3ZhciBkPWIsZT1udWxsO3JldHVybiBkLmluZGV4T2YoXCIuXCIpPjA/ZT1jLl9fcGx1Z2luc1tkXTphLmVhY2goYy5fX3BsdWdpbnMsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5uYW1lLnN1YnN0cmluZyhiLm5hbWUubGVuZ3RoLWQubGVuZ3RoLTEpPT1cIi5cIitkPyhlPWIsITEpOnZvaWQgMH0pLGV9aWYoYi5uYW1lLmluZGV4T2YoXCIuXCIpPDApdGhyb3cgbmV3IEVycm9yKFwiUGx1Z2lucyBtdXN0IGJlIG5hbWVzcGFjZWRcIik7cmV0dXJuIGMuX19wbHVnaW5zW2IubmFtZV09YixiLmNvcmUmJmMuX19icmlkZ2UoYi5jb3JlLGMsYi5uYW1lKSx0aGlzfSxfdHJpZ2dlcjpmdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpO3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBhWzBdJiYoYVswXT17dHlwZTphWzBdfSksdGhpcy5fXyRlbWl0dGVyUHJpdmF0ZS50cmlnZ2VyLmFwcGx5KHRoaXMuX18kZW1pdHRlclByaXZhdGUsYSksdGhpcy5fXyRlbWl0dGVyUHVibGljLnRyaWdnZXIuYXBwbHkodGhpcy5fXyRlbWl0dGVyUHVibGljLGEpLHRoaXN9LGluc3RhbmNlczpmdW5jdGlvbihiKXt2YXIgYz1bXSxkPWJ8fFwiLnRvb2x0aXBzdGVyZWRcIjtyZXR1cm4gYShkKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxkPWIuZGF0YShcInRvb2x0aXBzdGVyLW5zXCIpO2QmJmEuZWFjaChkLGZ1bmN0aW9uKGEsZCl7Yy5wdXNoKGIuZGF0YShkKSl9KX0pLGN9LGluc3RhbmNlc0xhdGVzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faW5zdGFuY2VzTGF0ZXN0QXJyfSxvZmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fXyRlbWl0dGVyUHVibGljLm9mZi5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9LG9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX18kZW1pdHRlclB1YmxpYy5vbi5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9LG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fJGVtaXR0ZXJQdWJsaWMub25lLmFwcGx5KHRoaXMuX18kZW1pdHRlclB1YmxpYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sb3JpZ2luczpmdW5jdGlvbihiKXt2YXIgYz1iP2IrXCIgXCI6XCJcIjtyZXR1cm4gYShjK1wiLnRvb2x0aXBzdGVyZWRcIikudG9BcnJheSgpfSxzZXREZWZhdWx0czpmdW5jdGlvbihiKXtyZXR1cm4gYS5leHRlbmQoZixiKSx0aGlzfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fJGVtaXR0ZXJQdWJsaWMudHJpZ2dlckhhbmRsZXIuYXBwbHkodGhpcy5fXyRlbWl0dGVyUHVibGljLEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpKSx0aGlzfX0sYS50b29sdGlwc3Rlcj1uZXcgaSxhLlRvb2x0aXBzdGVyPWZ1bmN0aW9uKGIsYyl7dGhpcy5fX2NhbGxiYWNrcz17Y2xvc2U6W10sb3BlbjpbXX0sdGhpcy5fX2Nsb3NpbmdUaW1lLHRoaXMuX19Db250ZW50LHRoaXMuX19jb250ZW50QmNyLHRoaXMuX19kZXN0cm95ZWQ9ITEsdGhpcy5fXyRlbWl0dGVyUHJpdmF0ZT1hKHt9KSx0aGlzLl9fJGVtaXR0ZXJQdWJsaWM9YSh7fSksdGhpcy5fX2VuYWJsZWQ9ITAsdGhpcy5fX2dhcmJhZ2VDb2xsZWN0b3IsdGhpcy5fX0dlb21ldHJ5LHRoaXMuX19sYXN0UG9zaXRpb24sdGhpcy5fX25hbWVzcGFjZT1cInRvb2x0aXBzdGVyLVwiK01hdGgucm91bmQoMWU2Kk1hdGgucmFuZG9tKCkpLHRoaXMuX19vcHRpb25zLHRoaXMuX18kb3JpZ2luUGFyZW50cyx0aGlzLl9fcG9pbnRlcklzT3Zlck9yaWdpbj0hMSx0aGlzLl9fcHJldmlvdXNUaGVtZXM9W10sdGhpcy5fX3N0YXRlPVwiY2xvc2VkXCIsdGhpcy5fX3RpbWVvdXRzPXtjbG9zZTpbXSxvcGVuOm51bGx9LHRoaXMuX190b3VjaEV2ZW50cz1bXSx0aGlzLl9fdHJhY2tlcj1udWxsLHRoaXMuXyRvcmlnaW4sdGhpcy5fJHRvb2x0aXAsdGhpcy5fX2luaXQoYixjKX0sYS5Ub29sdGlwc3Rlci5wcm90b3R5cGU9e19faW5pdDpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXM7aWYoZC5fJG9yaWdpbj1hKGIpLGQuX19vcHRpb25zPWEuZXh0ZW5kKCEwLHt9LGYsYyksZC5fX29wdGlvbnNGb3JtYXQoKSwhaC5JRXx8aC5JRT49ZC5fX29wdGlvbnMuSUVtaW4pe3ZhciBlPW51bGw7aWYodm9pZCAwPT09ZC5fJG9yaWdpbi5kYXRhKFwidG9vbHRpcHN0ZXItaW5pdGlhbFRpdGxlXCIpJiYoZT1kLl8kb3JpZ2luLmF0dHIoXCJ0aXRsZVwiKSx2b2lkIDA9PT1lJiYoZT1udWxsKSxkLl8kb3JpZ2luLmRhdGEoXCJ0b29sdGlwc3Rlci1pbml0aWFsVGl0bGVcIixlKSksbnVsbCE9PWQuX19vcHRpb25zLmNvbnRlbnQpZC5fX2NvbnRlbnRTZXQoZC5fX29wdGlvbnMuY29udGVudCk7ZWxzZXt2YXIgZyxpPWQuXyRvcmlnaW4uYXR0cihcImRhdGEtdG9vbHRpcC1jb250ZW50XCIpO2kmJihnPWEoaSkpLGcmJmdbMF0/ZC5fX2NvbnRlbnRTZXQoZy5maXJzdCgpKTpkLl9fY29udGVudFNldChlKX1kLl8kb3JpZ2luLnJlbW92ZUF0dHIoXCJ0aXRsZVwiKS5hZGRDbGFzcyhcInRvb2x0aXBzdGVyZWRcIiksZC5fX3ByZXBhcmVPcmlnaW4oKSxkLl9fcHJlcGFyZUdDKCksYS5lYWNoKGQuX19vcHRpb25zLnBsdWdpbnMsZnVuY3Rpb24oYSxiKXtkLl9wbHVnKGIpfSksaC5oYXNUb3VjaENhcGFiaWxpdHkmJmEoaC53aW5kb3cuZG9jdW1lbnQuYm9keSkub24oXCJ0b3VjaG1vdmUuXCIrZC5fX25hbWVzcGFjZStcIi10cmlnZ2VyT3BlblwiLGZ1bmN0aW9uKGEpe2QuX3RvdWNoUmVjb3JkRXZlbnQoYSl9KSxkLl9vbihcImNyZWF0ZWRcIixmdW5jdGlvbigpe2QuX19wcmVwYXJlVG9vbHRpcCgpfSkuX29uKFwicmVwb3NpdGlvbmVkXCIsZnVuY3Rpb24oYSl7ZC5fX2xhc3RQb3NpdGlvbj1hLnBvc2l0aW9ufSl9ZWxzZSBkLl9fb3B0aW9ucy5kaXNhYmxlZD0hMH0sX19jb250ZW50SW5zZXJ0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEuXyR0b29sdGlwLmZpbmQoXCIudG9vbHRpcHN0ZXItY29udGVudFwiKSxjPWEuX19Db250ZW50LGQ9ZnVuY3Rpb24oYSl7Yz1hfTtyZXR1cm4gYS5fdHJpZ2dlcih7dHlwZTpcImZvcm1hdFwiLGNvbnRlbnQ6YS5fX0NvbnRlbnQsZm9ybWF0OmR9KSxhLl9fb3B0aW9ucy5mdW5jdGlvbkZvcm1hdCYmKGM9YS5fX29wdGlvbnMuZnVuY3Rpb25Gb3JtYXQuY2FsbChhLGEse29yaWdpbjphLl8kb3JpZ2luWzBdfSxhLl9fQ29udGVudCkpLFwic3RyaW5nXCIhPXR5cGVvZiBjfHxhLl9fb3B0aW9ucy5jb250ZW50QXNIVE1MP2IuZW1wdHkoKS5hcHBlbmQoYyk6Yi50ZXh0KGMpLGF9LF9fY29udGVudFNldDpmdW5jdGlvbihiKXtyZXR1cm4gYiBpbnN0YW5jZW9mIGEmJnRoaXMuX19vcHRpb25zLmNvbnRlbnRDbG9uaW5nJiYoYj1iLmNsb25lKCEwKSksdGhpcy5fX0NvbnRlbnQ9Yix0aGlzLl90cmlnZ2VyKHt0eXBlOlwidXBkYXRlZFwiLGNvbnRlbnQ6Yn0pLHRoaXN9LF9fZGVzdHJveUVycm9yOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiVGhpcyB0b29sdGlwIGhhcyBiZWVuIGRlc3Ryb3llZCBhbmQgY2Fubm90IGV4ZWN1dGUgeW91ciBtZXRob2QgY2FsbC5cIil9LF9fZ2VvbWV0cnk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9Yi5fJG9yaWdpbixkPWIuXyRvcmlnaW4uaXMoXCJhcmVhXCIpO2lmKGQpe3ZhciBlPWIuXyRvcmlnaW4ucGFyZW50KCkuYXR0cihcIm5hbWVcIik7Yz1hKCdpbWdbdXNlbWFwPVwiIycrZSsnXCJdJyl9dmFyIGY9Y1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxnPWEoaC53aW5kb3cuZG9jdW1lbnQpLGk9YShoLndpbmRvdyksaj1jLGs9e2F2YWlsYWJsZTp7ZG9jdW1lbnQ6bnVsbCx3aW5kb3c6bnVsbH0sZG9jdW1lbnQ6e3NpemU6e2hlaWdodDpnLmhlaWdodCgpLHdpZHRoOmcud2lkdGgoKX19LHdpbmRvdzp7c2Nyb2xsOntsZWZ0Omgud2luZG93LnNjcm9sbFh8fGgud2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LHRvcDpoLndpbmRvdy5zY3JvbGxZfHxoLndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfSxzaXplOntoZWlnaHQ6aS5oZWlnaHQoKSx3aWR0aDppLndpZHRoKCl9fSxvcmlnaW46e2ZpeGVkTGluZWFnZTohMSxvZmZzZXQ6e30sc2l6ZTp7aGVpZ2h0OmYuYm90dG9tLWYudG9wLHdpZHRoOmYucmlnaHQtZi5sZWZ0fSx1c2VtYXBJbWFnZTpkP2NbMF06bnVsbCx3aW5kb3dPZmZzZXQ6e2JvdHRvbTpmLmJvdHRvbSxsZWZ0OmYubGVmdCxyaWdodDpmLnJpZ2h0LHRvcDpmLnRvcH19fTtpZihkKXt2YXIgbD1iLl8kb3JpZ2luLmF0dHIoXCJzaGFwZVwiKSxtPWIuXyRvcmlnaW4uYXR0cihcImNvb3Jkc1wiKTtpZihtJiYobT1tLnNwbGl0KFwiLFwiKSxhLm1hcChtLGZ1bmN0aW9uKGEsYil7bVtiXT1wYXJzZUludChhKX0pKSxcImRlZmF1bHRcIiE9bClzd2l0Y2gobCl7Y2FzZVwiY2lyY2xlXCI6dmFyIG49bVswXSxvPW1bMV0scD1tWzJdLHE9by1wLHI9bi1wO2sub3JpZ2luLnNpemUuaGVpZ2h0PTIqcCxrLm9yaWdpbi5zaXplLndpZHRoPWsub3JpZ2luLnNpemUuaGVpZ2h0LGsub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0Kz1yLGsub3JpZ2luLndpbmRvd09mZnNldC50b3ArPXE7YnJlYWs7Y2FzZVwicmVjdFwiOnZhciBzPW1bMF0sdD1tWzFdLHU9bVsyXSx2PW1bM107ay5vcmlnaW4uc2l6ZS5oZWlnaHQ9di10LGsub3JpZ2luLnNpemUud2lkdGg9dS1zLGsub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0Kz1zLGsub3JpZ2luLndpbmRvd09mZnNldC50b3ArPXQ7YnJlYWs7Y2FzZVwicG9seVwiOmZvcih2YXIgdz0wLHg9MCx5PTAsej0wLEE9XCJldmVuXCIsQj0wO0I8bS5sZW5ndGg7QisrKXt2YXIgQz1tW0JdO1wiZXZlblwiPT1BPyhDPnkmJih5PUMsMD09PUImJih3PXkpKSx3PkMmJih3PUMpLEE9XCJvZGRcIik6KEM+eiYmKHo9QywxPT1CJiYoeD16KSkseD5DJiYoeD1DKSxBPVwiZXZlblwiKX1rLm9yaWdpbi5zaXplLmhlaWdodD16LXgsay5vcmlnaW4uc2l6ZS53aWR0aD15LXcsay5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQrPXcsay5vcmlnaW4ud2luZG93T2Zmc2V0LnRvcCs9eH19dmFyIEQ9ZnVuY3Rpb24oYSl7ay5vcmlnaW4uc2l6ZS5oZWlnaHQ9YS5oZWlnaHQsay5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQ9YS5sZWZ0LGsub3JpZ2luLndpbmRvd09mZnNldC50b3A9YS50b3Asay5vcmlnaW4uc2l6ZS53aWR0aD1hLndpZHRofTtmb3IoYi5fdHJpZ2dlcih7dHlwZTpcImdlb21ldHJ5XCIsZWRpdDpELGdlb21ldHJ5OntoZWlnaHQ6ay5vcmlnaW4uc2l6ZS5oZWlnaHQsbGVmdDprLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCx0b3A6ay5vcmlnaW4ud2luZG93T2Zmc2V0LnRvcCx3aWR0aDprLm9yaWdpbi5zaXplLndpZHRofX0pLGsub3JpZ2luLndpbmRvd09mZnNldC5yaWdodD1rLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCtrLm9yaWdpbi5zaXplLndpZHRoLGsub3JpZ2luLndpbmRvd09mZnNldC5ib3R0b209ay5vcmlnaW4ud2luZG93T2Zmc2V0LnRvcCtrLm9yaWdpbi5zaXplLmhlaWdodCxrLm9yaWdpbi5vZmZzZXQubGVmdD1rLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCtrLndpbmRvdy5zY3JvbGwubGVmdCxrLm9yaWdpbi5vZmZzZXQudG9wPWsub3JpZ2luLndpbmRvd09mZnNldC50b3Aray53aW5kb3cuc2Nyb2xsLnRvcCxrLm9yaWdpbi5vZmZzZXQuYm90dG9tPWsub3JpZ2luLm9mZnNldC50b3Aray5vcmlnaW4uc2l6ZS5oZWlnaHQsay5vcmlnaW4ub2Zmc2V0LnJpZ2h0PWsub3JpZ2luLm9mZnNldC5sZWZ0K2sub3JpZ2luLnNpemUud2lkdGgsay5hdmFpbGFibGUuZG9jdW1lbnQ9e2JvdHRvbTp7aGVpZ2h0OmsuZG9jdW1lbnQuc2l6ZS5oZWlnaHQtay5vcmlnaW4ub2Zmc2V0LmJvdHRvbSx3aWR0aDprLmRvY3VtZW50LnNpemUud2lkdGh9LGxlZnQ6e2hlaWdodDprLmRvY3VtZW50LnNpemUuaGVpZ2h0LHdpZHRoOmsub3JpZ2luLm9mZnNldC5sZWZ0fSxyaWdodDp7aGVpZ2h0OmsuZG9jdW1lbnQuc2l6ZS5oZWlnaHQsd2lkdGg6ay5kb2N1bWVudC5zaXplLndpZHRoLWsub3JpZ2luLm9mZnNldC5yaWdodH0sdG9wOntoZWlnaHQ6ay5vcmlnaW4ub2Zmc2V0LnRvcCx3aWR0aDprLmRvY3VtZW50LnNpemUud2lkdGh9fSxrLmF2YWlsYWJsZS53aW5kb3c9e2JvdHRvbTp7aGVpZ2h0Ok1hdGgubWF4KGsud2luZG93LnNpemUuaGVpZ2h0LU1hdGgubWF4KGsub3JpZ2luLndpbmRvd09mZnNldC5ib3R0b20sMCksMCksd2lkdGg6ay53aW5kb3cuc2l6ZS53aWR0aH0sbGVmdDp7aGVpZ2h0Omsud2luZG93LnNpemUuaGVpZ2h0LHdpZHRoOk1hdGgubWF4KGsub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0LDApfSxyaWdodDp7aGVpZ2h0Omsud2luZG93LnNpemUuaGVpZ2h0LHdpZHRoOk1hdGgubWF4KGsud2luZG93LnNpemUud2lkdGgtTWF0aC5tYXgoay5vcmlnaW4ud2luZG93T2Zmc2V0LnJpZ2h0LDApLDApfSx0b3A6e2hlaWdodDpNYXRoLm1heChrLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wLDApLHdpZHRoOmsud2luZG93LnNpemUud2lkdGh9fTtcImh0bWxcIiE9alswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7KXtpZihcImZpeGVkXCI9PWouY3NzKFwicG9zaXRpb25cIikpe2sub3JpZ2luLmZpeGVkTGluZWFnZT0hMDticmVha31qPWoucGFyZW50KCl9cmV0dXJuIGt9LF9fb3B0aW9uc0Zvcm1hdDpmdW5jdGlvbigpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbiYmKHRoaXMuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uPVt0aGlzLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbix0aGlzLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbl0pLFwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLl9fb3B0aW9ucy5kZWxheSYmKHRoaXMuX19vcHRpb25zLmRlbGF5PVt0aGlzLl9fb3B0aW9ucy5kZWxheSx0aGlzLl9fb3B0aW9ucy5kZWxheV0pLFwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLl9fb3B0aW9ucy5kZWxheVRvdWNoJiYodGhpcy5fX29wdGlvbnMuZGVsYXlUb3VjaD1bdGhpcy5fX29wdGlvbnMuZGVsYXlUb3VjaCx0aGlzLl9fb3B0aW9ucy5kZWxheVRvdWNoXSksXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMuX19vcHRpb25zLnRoZW1lJiYodGhpcy5fX29wdGlvbnMudGhlbWU9W3RoaXMuX19vcHRpb25zLnRoZW1lXSksbnVsbD09PXRoaXMuX19vcHRpb25zLnBhcmVudD90aGlzLl9fb3B0aW9ucy5wYXJlbnQ9YShoLndpbmRvdy5kb2N1bWVudC5ib2R5KTpcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5fX29wdGlvbnMucGFyZW50JiYodGhpcy5fX29wdGlvbnMucGFyZW50PWEodGhpcy5fX29wdGlvbnMucGFyZW50KSksXCJob3ZlclwiPT10aGlzLl9fb3B0aW9ucy50cmlnZ2VyPyh0aGlzLl9fb3B0aW9ucy50cmlnZ2VyT3Blbj17bW91c2VlbnRlcjohMCx0b3VjaHN0YXJ0OiEwfSx0aGlzLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2U9e21vdXNlbGVhdmU6ITAsb3JpZ2luQ2xpY2s6ITAsdG91Y2hsZWF2ZTohMH0pOlwiY2xpY2tcIj09dGhpcy5fX29wdGlvbnMudHJpZ2dlciYmKHRoaXMuX19vcHRpb25zLnRyaWdnZXJPcGVuPXtjbGljazohMCx0YXA6ITB9LHRoaXMuX19vcHRpb25zLnRyaWdnZXJDbG9zZT17Y2xpY2s6ITAsdGFwOiEwfSksdGhpcy5fdHJpZ2dlcihcIm9wdGlvbnNcIiksdGhpc30sX19wcmVwYXJlR0M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3JldHVybiBiLl9fb3B0aW9ucy5zZWxmRGVzdHJ1Y3Rpb24/Yi5fX2dhcmJhZ2VDb2xsZWN0b3I9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTtiLl9fdG91Y2hFdmVudHM9YS5ncmVwKGIuX190b3VjaEV2ZW50cyxmdW5jdGlvbihhLGIpe3JldHVybiBjLWEudGltZT42ZTR9KSxkKGIuXyRvcmlnaW4pfHxiLmNsb3NlKGZ1bmN0aW9uKCl7Yi5kZXN0cm95KCl9KX0sMmU0KTpjbGVhckludGVydmFsKGIuX19nYXJiYWdlQ29sbGVjdG9yKSxifSxfX3ByZXBhcmVPcmlnaW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2lmKGEuXyRvcmlnaW4ub2ZmKFwiLlwiK2EuX19uYW1lc3BhY2UrXCItdHJpZ2dlck9wZW5cIiksaC5oYXNUb3VjaENhcGFiaWxpdHkmJmEuXyRvcmlnaW4ub24oXCJ0b3VjaHN0YXJ0LlwiK2EuX19uYW1lc3BhY2UrXCItdHJpZ2dlck9wZW4gdG91Y2hlbmQuXCIrYS5fX25hbWVzcGFjZStcIi10cmlnZ2VyT3BlbiB0b3VjaGNhbmNlbC5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuXCIsZnVuY3Rpb24oYil7YS5fdG91Y2hSZWNvcmRFdmVudChiKX0pLGEuX19vcHRpb25zLnRyaWdnZXJPcGVuLmNsaWNrfHxhLl9fb3B0aW9ucy50cmlnZ2VyT3Blbi50YXAmJmguaGFzVG91Y2hDYXBhYmlsaXR5KXt2YXIgYj1cIlwiO2EuX19vcHRpb25zLnRyaWdnZXJPcGVuLmNsaWNrJiYoYis9XCJjbGljay5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuIFwiKSxhLl9fb3B0aW9ucy50cmlnZ2VyT3Blbi50YXAmJmguaGFzVG91Y2hDYXBhYmlsaXR5JiYoYis9XCJ0b3VjaGVuZC5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuXCIpLGEuXyRvcmlnaW4ub24oYixmdW5jdGlvbihiKXthLl90b3VjaElzTWVhbmluZ2Z1bEV2ZW50KGIpJiZhLl9vcGVuKGIpfSl9aWYoYS5fX29wdGlvbnMudHJpZ2dlck9wZW4ubW91c2VlbnRlcnx8YS5fX29wdGlvbnMudHJpZ2dlck9wZW4udG91Y2hzdGFydCYmaC5oYXNUb3VjaENhcGFiaWxpdHkpe3ZhciBiPVwiXCI7YS5fX29wdGlvbnMudHJpZ2dlck9wZW4ubW91c2VlbnRlciYmKGIrPVwibW91c2VlbnRlci5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuIFwiKSxhLl9fb3B0aW9ucy50cmlnZ2VyT3Blbi50b3VjaHN0YXJ0JiZoLmhhc1RvdWNoQ2FwYWJpbGl0eSYmKGIrPVwidG91Y2hzdGFydC5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuXCIpLGEuXyRvcmlnaW4ub24oYixmdW5jdGlvbihiKXshYS5fdG91Y2hJc1RvdWNoRXZlbnQoYikmJmEuX3RvdWNoSXNFbXVsYXRlZEV2ZW50KGIpfHwoYS5fX3BvaW50ZXJJc092ZXJPcmlnaW49ITAsYS5fb3BlblNob3J0bHkoYikpfSl9aWYoYS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLm1vdXNlbGVhdmV8fGEuX19vcHRpb25zLnRyaWdnZXJDbG9zZS50b3VjaGxlYXZlJiZoLmhhc1RvdWNoQ2FwYWJpbGl0eSl7dmFyIGI9XCJcIjthLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UubW91c2VsZWF2ZSYmKGIrPVwibW91c2VsZWF2ZS5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuIFwiKSxhLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UudG91Y2hsZWF2ZSYmaC5oYXNUb3VjaENhcGFiaWxpdHkmJihiKz1cInRvdWNoZW5kLlwiK2EuX19uYW1lc3BhY2UrXCItdHJpZ2dlck9wZW4gdG91Y2hjYW5jZWwuXCIrYS5fX25hbWVzcGFjZStcIi10cmlnZ2VyT3BlblwiKSxhLl8kb3JpZ2luLm9uKGIsZnVuY3Rpb24oYil7YS5fdG91Y2hJc01lYW5pbmdmdWxFdmVudChiKSYmKGEuX19wb2ludGVySXNPdmVyT3JpZ2luPSExKX0pfXJldHVybiBhfSxfX3ByZXBhcmVUb29sdGlwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIuX19vcHRpb25zLmludGVyYWN0aXZlP1wiYXV0b1wiOlwiXCI7cmV0dXJuIGIuXyR0b29sdGlwLmF0dHIoXCJpZFwiLGIuX19uYW1lc3BhY2UpLmNzcyh7XCJwb2ludGVyLWV2ZW50c1wiOmMsekluZGV4OmIuX19vcHRpb25zLnpJbmRleH0pLGEuZWFjaChiLl9fcHJldmlvdXNUaGVtZXMsZnVuY3Rpb24oYSxjKXtiLl8kdG9vbHRpcC5yZW1vdmVDbGFzcyhjKX0pLGEuZWFjaChiLl9fb3B0aW9ucy50aGVtZSxmdW5jdGlvbihhLGMpe2IuXyR0b29sdGlwLmFkZENsYXNzKGMpfSksYi5fX3ByZXZpb3VzVGhlbWVzPWEubWVyZ2UoW10sYi5fX29wdGlvbnMudGhlbWUpLGJ9LF9fc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzO2lmKGMuX19vcHRpb25zLnRyaWdnZXJDbG9zZS5zY3JvbGwpYy5fY2xvc2UoYik7ZWxzZSBpZihkKGMuXyRvcmlnaW4pJiZkKGMuXyR0b29sdGlwKSl7dmFyIGU9bnVsbDtpZihiLnRhcmdldD09PWgud2luZG93LmRvY3VtZW50KWMuX19HZW9tZXRyeS5vcmlnaW4uZml4ZWRMaW5lYWdlfHxjLl9fb3B0aW9ucy5yZXBvc2l0aW9uT25TY3JvbGwmJmMucmVwb3NpdGlvbihiKTtlbHNle2U9Yy5fX2dlb21ldHJ5KCk7dmFyIGY9ITE7aWYoXCJmaXhlZFwiIT1jLl8kb3JpZ2luLmNzcyhcInBvc2l0aW9uXCIpJiZjLl9fJG9yaWdpblBhcmVudHMuZWFjaChmdW5jdGlvbihiLGMpe3ZhciBkPWEoYyksZz1kLmNzcyhcIm92ZXJmbG93LXhcIiksaD1kLmNzcyhcIm92ZXJmbG93LXlcIik7aWYoXCJ2aXNpYmxlXCIhPWd8fFwidmlzaWJsZVwiIT1oKXt2YXIgaT1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKFwidmlzaWJsZVwiIT1nJiYoZS5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQ8aS5sZWZ0fHxlLm9yaWdpbi53aW5kb3dPZmZzZXQucmlnaHQ+aS5yaWdodCkpcmV0dXJuIGY9ITAsITE7aWYoXCJ2aXNpYmxlXCIhPWgmJihlLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wPGkudG9wfHxlLm9yaWdpbi53aW5kb3dPZmZzZXQuYm90dG9tPmkuYm90dG9tKSlyZXR1cm4gZj0hMCwhMX1yZXR1cm5cImZpeGVkXCI9PWQuY3NzKFwicG9zaXRpb25cIik/ITE6dm9pZCAwfSksZiljLl8kdG9vbHRpcC5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJoaWRkZW5cIik7ZWxzZSBpZihjLl8kdG9vbHRpcC5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJ2aXNpYmxlXCIpLGMuX19vcHRpb25zLnJlcG9zaXRpb25PblNjcm9sbCljLnJlcG9zaXRpb24oYik7ZWxzZXt2YXIgZz1lLm9yaWdpbi5vZmZzZXQubGVmdC1jLl9fR2VvbWV0cnkub3JpZ2luLm9mZnNldC5sZWZ0LGk9ZS5vcmlnaW4ub2Zmc2V0LnRvcC1jLl9fR2VvbWV0cnkub3JpZ2luLm9mZnNldC50b3A7Yy5fJHRvb2x0aXAuY3NzKHtsZWZ0OmMuX19sYXN0UG9zaXRpb24uY29vcmQubGVmdCtnLHRvcDpjLl9fbGFzdFBvc2l0aW9uLmNvb3JkLnRvcCtpfSl9fWMuX3RyaWdnZXIoe3R5cGU6XCJzY3JvbGxcIixldmVudDpiLGdlbzplfSl9cmV0dXJuIGN9LF9fc3RhdGVTZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zdGF0ZT1hLHRoaXMuX3RyaWdnZXIoe3R5cGU6XCJzdGF0ZVwiLHN0YXRlOmF9KSx0aGlzfSxfX3RpbWVvdXRzQ2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gY2xlYXJUaW1lb3V0KHRoaXMuX190aW1lb3V0cy5vcGVuKSx0aGlzLl9fdGltZW91dHMub3Blbj1udWxsLGEuZWFjaCh0aGlzLl9fdGltZW91dHMuY2xvc2UsZnVuY3Rpb24oYSxiKXtjbGVhclRpbWVvdXQoYil9KSx0aGlzLl9fdGltZW91dHMuY2xvc2U9W10sdGhpc30sX190cmFja2VyU3RhcnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5fJHRvb2x0aXAuZmluZChcIi50b29sdGlwc3Rlci1jb250ZW50XCIpO3JldHVybiBhLl9fb3B0aW9ucy50cmFja1Rvb2x0aXAmJihhLl9fY29udGVudEJjcj1iWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxhLl9fdHJhY2tlcj1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2lmKGQoYS5fJG9yaWdpbikmJmQoYS5fJHRvb2x0aXApKXtpZihhLl9fb3B0aW9ucy50cmFja09yaWdpbil7dmFyIGU9YS5fX2dlb21ldHJ5KCksZj0hMTtjKGUub3JpZ2luLnNpemUsYS5fX0dlb21ldHJ5Lm9yaWdpbi5zaXplKSYmKGEuX19HZW9tZXRyeS5vcmlnaW4uZml4ZWRMaW5lYWdlP2MoZS5vcmlnaW4ud2luZG93T2Zmc2V0LGEuX19HZW9tZXRyeS5vcmlnaW4ud2luZG93T2Zmc2V0KSYmKGY9ITApOmMoZS5vcmlnaW4ub2Zmc2V0LGEuX19HZW9tZXRyeS5vcmlnaW4ub2Zmc2V0KSYmKGY9ITApKSxmfHwoYS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLm1vdXNlbGVhdmU/YS5fY2xvc2UoKTphLnJlcG9zaXRpb24oKSl9aWYoYS5fX29wdGlvbnMudHJhY2tUb29sdGlwKXt2YXIgZz1iWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2cuaGVpZ2h0PT09YS5fX2NvbnRlbnRCY3IuaGVpZ2h0JiZnLndpZHRoPT09YS5fX2NvbnRlbnRCY3Iud2lkdGh8fChhLnJlcG9zaXRpb24oKSxhLl9fY29udGVudEJjcj1nKX19ZWxzZSBhLl9jbG9zZSgpfSxhLl9fb3B0aW9ucy50cmFja2VySW50ZXJ2YWwpLGF9LF9jbG9zZTpmdW5jdGlvbihiLGMsZCl7dmFyIGU9dGhpcyxmPSEwO2lmKGUuX3RyaWdnZXIoe3R5cGU6XCJjbG9zZVwiLGV2ZW50OmIsc3RvcDpmdW5jdGlvbigpe2Y9ITF9fSksZnx8ZCl7YyYmZS5fX2NhbGxiYWNrcy5jbG9zZS5wdXNoKGMpLGUuX19jYWxsYmFja3Mub3Blbj1bXSxlLl9fdGltZW91dHNDbGVhcigpO3ZhciBnPWZ1bmN0aW9uKCl7YS5lYWNoKGUuX19jYWxsYmFja3MuY2xvc2UsZnVuY3Rpb24oYSxjKXtjLmNhbGwoZSxlLHtldmVudDpiLG9yaWdpbjplLl8kb3JpZ2luWzBdfSl9KSxlLl9fY2FsbGJhY2tzLmNsb3NlPVtdfTtpZihcImNsb3NlZFwiIT1lLl9fc3RhdGUpe3ZhciBpPSEwLGo9bmV3IERhdGUsaz1qLmdldFRpbWUoKSxsPWsrZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMV07aWYoXCJkaXNhcHBlYXJpbmdcIj09ZS5fX3N0YXRlJiZsPmUuX19jbG9zaW5nVGltZSYmZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMV0+MCYmKGk9ITEpLGkpe2UuX19jbG9zaW5nVGltZT1sLFwiZGlzYXBwZWFyaW5nXCIhPWUuX19zdGF0ZSYmZS5fX3N0YXRlU2V0KFwiZGlzYXBwZWFyaW5nXCIpO3ZhciBtPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChlLl9fdHJhY2tlciksZS5fdHJpZ2dlcih7dHlwZTpcImNsb3NpbmdcIixldmVudDpifSksZS5fJHRvb2x0aXAub2ZmKFwiLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlXCIpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItZHlpbmdcIiksYShoLndpbmRvdykub2ZmKFwiLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlXCIpLGUuX18kb3JpZ2luUGFyZW50cy5lYWNoKGZ1bmN0aW9uKGIsYyl7YShjKS5vZmYoXCJzY3JvbGwuXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2VcIil9KSxlLl9fJG9yaWdpblBhcmVudHM9bnVsbCxhKGgud2luZG93LmRvY3VtZW50LmJvZHkpLm9mZihcIi5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiKSxlLl8kb3JpZ2luLm9mZihcIi5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiKSxlLl9vZmYoXCJkaXNtaXNzYWJsZVwiKSxlLl9fc3RhdGVTZXQoXCJjbG9zZWRcIiksZS5fdHJpZ2dlcih7dHlwZTpcImFmdGVyXCIsZXZlbnQ6Yn0pLGUuX19vcHRpb25zLmZ1bmN0aW9uQWZ0ZXImJmUuX19vcHRpb25zLmZ1bmN0aW9uQWZ0ZXIuY2FsbChlLGUse2V2ZW50OmIsb3JpZ2luOmUuXyRvcmlnaW5bMF19KSxnKCl9O2guaGFzVHJhbnNpdGlvbnM/KGUuXyR0b29sdGlwLmNzcyh7XCItbW96LWFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzFdK1wibXNcIixcIi1tcy1hbmltYXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblsxXStcIm1zXCIsXCItby1hbmltYXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblsxXStcIm1zXCIsXCItd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzFdK1wibXNcIixcImFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzFdK1wibXNcIixcInRyYW5zaXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblsxXStcIm1zXCJ9KSxlLl8kdG9vbHRpcC5jbGVhclF1ZXVlKCkucmVtb3ZlQ2xhc3MoXCJ0b29sdGlwc3Rlci1zaG93XCIpLmFkZENsYXNzKFwidG9vbHRpcHN0ZXItZHlpbmdcIiksZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMV0+MCYmZS5fJHRvb2x0aXAuZGVsYXkoZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMV0pLGUuXyR0b29sdGlwLnF1ZXVlKG0pKTplLl8kdG9vbHRpcC5zdG9wKCkuZmFkZU91dChlLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblsxXSxtKX19ZWxzZSBnKCl9cmV0dXJuIGV9LF9vZmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fXyRlbWl0dGVyUHJpdmF0ZS5vZmYuYXBwbHkodGhpcy5fXyRlbWl0dGVyUHJpdmF0ZSxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sX29uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX18kZW1pdHRlclByaXZhdGUub24uYXBwbHkodGhpcy5fXyRlbWl0dGVyUHJpdmF0ZSxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sX29uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLm9uZS5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpKSx0aGlzfSxfb3BlbjpmdW5jdGlvbihiLGMpe3ZhciBlPXRoaXM7aWYoIWUuX19kZXN0cm95aW5nJiZkKGUuXyRvcmlnaW4pJiZlLl9fZW5hYmxlZCl7dmFyIGY9ITA7aWYoXCJjbG9zZWRcIj09ZS5fX3N0YXRlJiYoZS5fdHJpZ2dlcih7dHlwZTpcImJlZm9yZVwiLGV2ZW50OmIsc3RvcDpmdW5jdGlvbigpe2Y9ITF9fSksZiYmZS5fX29wdGlvbnMuZnVuY3Rpb25CZWZvcmUmJihmPWUuX19vcHRpb25zLmZ1bmN0aW9uQmVmb3JlLmNhbGwoZSxlLHtldmVudDpiLG9yaWdpbjplLl8kb3JpZ2luWzBdfSkpKSxmIT09ITEmJm51bGwhPT1lLl9fQ29udGVudCl7YyYmZS5fX2NhbGxiYWNrcy5vcGVuLnB1c2goYyksZS5fX2NhbGxiYWNrcy5jbG9zZT1bXSxlLl9fdGltZW91dHNDbGVhcigpO3ZhciBnLGk9ZnVuY3Rpb24oKXtcInN0YWJsZVwiIT1lLl9fc3RhdGUmJmUuX19zdGF0ZVNldChcInN0YWJsZVwiKSxhLmVhY2goZS5fX2NhbGxiYWNrcy5vcGVuLGZ1bmN0aW9uKGEsYil7Yi5jYWxsKGUsZSx7b3JpZ2luOmUuXyRvcmlnaW5bMF0sdG9vbHRpcDplLl8kdG9vbHRpcFswXX0pfSksZS5fX2NhbGxiYWNrcy5vcGVuPVtdfTtpZihcImNsb3NlZFwiIT09ZS5fX3N0YXRlKWc9MCxcImRpc2FwcGVhcmluZ1wiPT09ZS5fX3N0YXRlPyhlLl9fc3RhdGVTZXQoXCJhcHBlYXJpbmdcIiksaC5oYXNUcmFuc2l0aW9ucz8oZS5fJHRvb2x0aXAuY2xlYXJRdWV1ZSgpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItZHlpbmdcIikuYWRkQ2xhc3MoXCJ0b29sdGlwc3Rlci1zaG93XCIpLGUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdPjAmJmUuXyR0b29sdGlwLmRlbGF5KGUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdKSxlLl8kdG9vbHRpcC5xdWV1ZShpKSk6ZS5fJHRvb2x0aXAuc3RvcCgpLmZhZGVJbihpKSk6XCJzdGFibGVcIj09ZS5fX3N0YXRlJiZpKCk7ZWxzZXtpZihlLl9fc3RhdGVTZXQoXCJhcHBlYXJpbmdcIiksZz1lLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXSxlLl9fY29udGVudEluc2VydCgpLGUucmVwb3NpdGlvbihiLCEwKSxoLmhhc1RyYW5zaXRpb25zPyhlLl8kdG9vbHRpcC5hZGRDbGFzcyhcInRvb2x0aXBzdGVyLVwiK2UuX19vcHRpb25zLmFuaW1hdGlvbikuYWRkQ2xhc3MoXCJ0b29sdGlwc3Rlci1pbml0aWFsXCIpLmNzcyh7XCItbW96LWFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdK1wibXNcIixcIi1tcy1hbmltYXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXStcIm1zXCIsXCItby1hbmltYXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXStcIm1zXCIsXCItd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdK1wibXNcIixcImFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdK1wibXNcIixcInRyYW5zaXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXStcIm1zXCJ9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XCJjbG9zZWRcIiE9ZS5fX3N0YXRlJiYoZS5fJHRvb2x0aXAuYWRkQ2xhc3MoXCJ0b29sdGlwc3Rlci1zaG93XCIpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItaW5pdGlhbFwiKSxlLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXT4wJiZlLl8kdG9vbHRpcC5kZWxheShlLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXSksZS5fJHRvb2x0aXAucXVldWUoaSkpfSwwKSk6ZS5fJHRvb2x0aXAuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKS5mYWRlSW4oZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMF0saSksZS5fX3RyYWNrZXJTdGFydCgpLGEoaC53aW5kb3cpLm9uKFwicmVzaXplLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlXCIsZnVuY3Rpb24oYil7dmFyIGM9YShkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsoYy5pcyhcImlucHV0XCIpfHxjLmlzKFwidGV4dGFyZWFcIikpJiZhLmNvbnRhaW5zKGUuXyR0b29sdGlwWzBdLGNbMF0pfHxlLnJlcG9zaXRpb24oYil9KS5vbihcInNjcm9sbC5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiLGZ1bmN0aW9uKGEpe2UuX19zY3JvbGxIYW5kbGVyKGEpfSksZS5fXyRvcmlnaW5QYXJlbnRzPWUuXyRvcmlnaW4ucGFyZW50cygpLGUuX18kb3JpZ2luUGFyZW50cy5lYWNoKGZ1bmN0aW9uKGIsYyl7YShjKS5vbihcInNjcm9sbC5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiLGZ1bmN0aW9uKGEpe2UuX19zY3JvbGxIYW5kbGVyKGEpfSl9KSxlLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UubW91c2VsZWF2ZXx8ZS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLnRvdWNobGVhdmUmJmguaGFzVG91Y2hDYXBhYmlsaXR5KXtlLl9vbihcImRpc21pc3NhYmxlXCIsZnVuY3Rpb24oYSl7YS5kaXNtaXNzYWJsZT9hLmRlbGF5PyhtPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9jbG9zZShhLmV2ZW50KX0sYS5kZWxheSksZS5fX3RpbWVvdXRzLmNsb3NlLnB1c2gobSkpOmUuX2Nsb3NlKGEpOmNsZWFyVGltZW91dChtKX0pO3ZhciBqPWUuXyRvcmlnaW4saz1cIlwiLGw9XCJcIixtPW51bGw7ZS5fX29wdGlvbnMuaW50ZXJhY3RpdmUmJihqPWouYWRkKGUuXyR0b29sdGlwKSksZS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLm1vdXNlbGVhdmUmJihrKz1cIm1vdXNlZW50ZXIuXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2UgXCIsbCs9XCJtb3VzZWxlYXZlLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlIFwiKSxlLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UudG91Y2hsZWF2ZSYmaC5oYXNUb3VjaENhcGFiaWxpdHkmJihrKz1cInRvdWNoc3RhcnQuXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2VcIixsKz1cInRvdWNoZW5kLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlIHRvdWNoY2FuY2VsLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlXCIpLGoub24obCxmdW5jdGlvbihhKXtpZihlLl90b3VjaElzVG91Y2hFdmVudChhKXx8IWUuX3RvdWNoSXNFbXVsYXRlZEV2ZW50KGEpKXt2YXIgYj1cIm1vdXNlbGVhdmVcIj09YS50eXBlP2UuX19vcHRpb25zLmRlbGF5OmUuX19vcHRpb25zLmRlbGF5VG91Y2g7ZS5fdHJpZ2dlcih7ZGVsYXk6YlsxXSxkaXNtaXNzYWJsZTohMCxldmVudDphLHR5cGU6XCJkaXNtaXNzYWJsZVwifSl9fSkub24oayxmdW5jdGlvbihhKXshZS5fdG91Y2hJc1RvdWNoRXZlbnQoYSkmJmUuX3RvdWNoSXNFbXVsYXRlZEV2ZW50KGEpfHxlLl90cmlnZ2VyKHtkaXNtaXNzYWJsZTohMSxldmVudDphLHR5cGU6XCJkaXNtaXNzYWJsZVwifSl9KX1lLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2Uub3JpZ2luQ2xpY2smJmUuXyRvcmlnaW4ub24oXCJjbGljay5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiLGZ1bmN0aW9uKGEpe2UuX3RvdWNoSXNUb3VjaEV2ZW50KGEpfHxlLl90b3VjaElzRW11bGF0ZWRFdmVudChhKXx8ZS5fY2xvc2UoYSl9KSwoZS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLmNsaWNrfHxlLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UudGFwJiZoLmhhc1RvdWNoQ2FwYWJpbGl0eSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihcImNsb3NlZFwiIT1lLl9fc3RhdGUpe3ZhciBiPVwiXCIsYz1hKGgud2luZG93LmRvY3VtZW50LmJvZHkpO2UuX19vcHRpb25zLnRyaWdnZXJDbG9zZS5jbGljayYmKGIrPVwiY2xpY2suXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2UgXCIpLGUuX19vcHRpb25zLnRyaWdnZXJDbG9zZS50YXAmJmguaGFzVG91Y2hDYXBhYmlsaXR5JiYoYis9XCJ0b3VjaGVuZC5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiKSxjLm9uKGIsZnVuY3Rpb24oYil7ZS5fdG91Y2hJc01lYW5pbmdmdWxFdmVudChiKSYmKGUuX3RvdWNoUmVjb3JkRXZlbnQoYiksZS5fX29wdGlvbnMuaW50ZXJhY3RpdmUmJmEuY29udGFpbnMoZS5fJHRvb2x0aXBbMF0sYi50YXJnZXQpfHxlLl9jbG9zZShiKSl9KSxlLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UudGFwJiZoLmhhc1RvdWNoQ2FwYWJpbGl0eSYmYy5vbihcInRvdWNoc3RhcnQuXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2VcIixmdW5jdGlvbihhKXtlLl90b3VjaFJlY29yZEV2ZW50KGEpfSl9fSwwKSxlLl90cmlnZ2VyKFwicmVhZHlcIiksZS5fX29wdGlvbnMuZnVuY3Rpb25SZWFkeSYmZS5fX29wdGlvbnMuZnVuY3Rpb25SZWFkeS5jYWxsKGUsZSx7b3JpZ2luOmUuXyRvcmlnaW5bMF0sdG9vbHRpcDplLl8kdG9vbHRpcFswXX0pfWlmKGUuX19vcHRpb25zLnRpbWVyPjApe3ZhciBtPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9jbG9zZSgpfSxlLl9fb3B0aW9ucy50aW1lcitnKTtlLl9fdGltZW91dHMuY2xvc2UucHVzaChtKX19fXJldHVybiBlfSxfb3BlblNob3J0bHk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPSEwO2lmKFwic3RhYmxlXCIhPWIuX19zdGF0ZSYmXCJhcHBlYXJpbmdcIiE9Yi5fX3N0YXRlJiYhYi5fX3RpbWVvdXRzLm9wZW4mJihiLl90cmlnZ2VyKHt0eXBlOlwic3RhcnRcIixldmVudDphLHN0b3A6ZnVuY3Rpb24oKXtjPSExfX0pLGMpKXt2YXIgZD0wPT1hLnR5cGUuaW5kZXhPZihcInRvdWNoXCIpP2IuX19vcHRpb25zLmRlbGF5VG91Y2g6Yi5fX29wdGlvbnMuZGVsYXk7ZFswXT9iLl9fdGltZW91dHMub3Blbj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5fX3RpbWVvdXRzLm9wZW49bnVsbCxiLl9fcG9pbnRlcklzT3Zlck9yaWdpbiYmYi5fdG91Y2hJc01lYW5pbmdmdWxFdmVudChhKT8oYi5fdHJpZ2dlcihcInN0YXJ0ZW5kXCIpLGIuX29wZW4oYSkpOmIuX3RyaWdnZXIoXCJzdGFydGNhbmNlbFwiKX0sZFswXSk6KGIuX3RyaWdnZXIoXCJzdGFydGVuZFwiKSxiLl9vcGVuKGEpKX1yZXR1cm4gYn0sX29wdGlvbnNFeHRyYWN0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcyxlPWEuZXh0ZW5kKCEwLHt9LGMpLGY9ZC5fX29wdGlvbnNbYl07cmV0dXJuIGZ8fChmPXt9LGEuZWFjaChjLGZ1bmN0aW9uKGEsYil7dmFyIGM9ZC5fX29wdGlvbnNbYV07dm9pZCAwIT09YyYmKGZbYV09Yyl9KSksYS5lYWNoKGUsZnVuY3Rpb24oYixjKXt2b2lkIDAhPT1mW2JdJiYoXCJvYmplY3RcIiE9dHlwZW9mIGN8fGMgaW5zdGFuY2VvZiBBcnJheXx8bnVsbD09Y3x8XCJvYmplY3RcIiE9dHlwZW9mIGZbYl18fGZbYl1pbnN0YW5jZW9mIEFycmF5fHxudWxsPT1mW2JdP2VbYl09ZltiXTphLmV4dGVuZChlW2JdLGZbYl0pKX0pLGV9LF9wbHVnOmZ1bmN0aW9uKGIpe3ZhciBjPWEudG9vbHRpcHN0ZXIuX3BsdWdpbihiKTtpZighYyl0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcIicrYisnXCIgcGx1Z2luIGlzIG5vdCBkZWZpbmVkJyk7cmV0dXJuIGMuaW5zdGFuY2UmJmEudG9vbHRpcHN0ZXIuX19icmlkZ2UoYy5pbnN0YW5jZSx0aGlzLGMubmFtZSksdGhpc30sX3RvdWNoSXNFbXVsYXRlZEV2ZW50OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMSxjPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGQ9dGhpcy5fX3RvdWNoRXZlbnRzLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgZT10aGlzLl9fdG91Y2hFdmVudHNbZF07aWYoIShjLWUudGltZTw1MDApKWJyZWFrO2UudGFyZ2V0PT09YS50YXJnZXQmJihiPSEwKX1yZXR1cm4gYn0sX3RvdWNoSXNNZWFuaW5nZnVsRXZlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3RvdWNoSXNUb3VjaEV2ZW50KGEpJiYhdGhpcy5fdG91Y2hTd2lwZWQoYS50YXJnZXQpfHwhdGhpcy5fdG91Y2hJc1RvdWNoRXZlbnQoYSkmJiF0aGlzLl90b3VjaElzRW11bGF0ZWRFdmVudChhKX0sX3RvdWNoSXNUb3VjaEV2ZW50OmZ1bmN0aW9uKGEpe3JldHVybiAwPT1hLnR5cGUuaW5kZXhPZihcInRvdWNoXCIpfSxfdG91Y2hSZWNvcmRFdmVudDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fdG91Y2hJc1RvdWNoRXZlbnQoYSkmJihhLnRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCksdGhpcy5fX3RvdWNoRXZlbnRzLnB1c2goYSkpLHRoaXN9LF90b3VjaFN3aXBlZDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITEsYz10aGlzLl9fdG91Y2hFdmVudHMubGVuZ3RoLTE7Yz49MDtjLS0pe3ZhciBkPXRoaXMuX190b3VjaEV2ZW50c1tjXTtpZihcInRvdWNobW92ZVwiPT1kLnR5cGUpe2I9ITA7YnJlYWt9aWYoXCJ0b3VjaHN0YXJ0XCI9PWQudHlwZSYmYT09PWQudGFyZ2V0KWJyZWFrfXJldHVybiBifSxfdHJpZ2dlcjpmdW5jdGlvbigpe3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpO3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBiWzBdJiYoYlswXT17dHlwZTpiWzBdfSksYlswXS5pbnN0YW5jZT10aGlzLGJbMF0ub3JpZ2luPXRoaXMuXyRvcmlnaW4/dGhpcy5fJG9yaWdpblswXTpudWxsLGJbMF0udG9vbHRpcD10aGlzLl8kdG9vbHRpcD90aGlzLl8kdG9vbHRpcFswXTpudWxsLHRoaXMuX18kZW1pdHRlclByaXZhdGUudHJpZ2dlci5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLGIpLGEudG9vbHRpcHN0ZXIuX3RyaWdnZXIuYXBwbHkoYS50b29sdGlwc3RlcixiKSx0aGlzLl9fJGVtaXR0ZXJQdWJsaWMudHJpZ2dlci5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsYiksdGhpc30sX3VucGx1ZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzO2lmKGNbYl0pe3ZhciBkPWEudG9vbHRpcHN0ZXIuX3BsdWdpbihiKTtkLmluc3RhbmNlJiZhLmVhY2goZC5pbnN0YW5jZSxmdW5jdGlvbihhLGQpe2NbYV0mJmNbYV0uYnJpZGdlZD09PWNbYl0mJmRlbGV0ZSBjW2FdfSksY1tiXS5fX2Rlc3Ryb3kmJmNbYl0uX19kZXN0cm95KCksZGVsZXRlIGNbYl19cmV0dXJuIGN9LGNsb3NlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9fZGVzdHJveWVkP3RoaXMuX19kZXN0cm95RXJyb3IoKTp0aGlzLl9jbG9zZShudWxsLGEpLHRoaXN9LGNvbnRlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztpZih2b2lkIDA9PT1hKXJldHVybiBiLl9fQ29udGVudDtpZihiLl9fZGVzdHJveWVkKWIuX19kZXN0cm95RXJyb3IoKTtlbHNlIGlmKGIuX19jb250ZW50U2V0KGEpLG51bGwhPT1iLl9fQ29udGVudCl7aWYoXCJjbG9zZWRcIiE9PWIuX19zdGF0ZSYmKGIuX19jb250ZW50SW5zZXJ0KCksYi5yZXBvc2l0aW9uKCksYi5fX29wdGlvbnMudXBkYXRlQW5pbWF0aW9uKSlpZihoLmhhc1RyYW5zaXRpb25zKXt2YXIgYz1iLl9fb3B0aW9ucy51cGRhdGVBbmltYXRpb247Yi5fJHRvb2x0aXAuYWRkQ2xhc3MoXCJ0b29sdGlwc3Rlci11cGRhdGUtXCIrYyksc2V0VGltZW91dChmdW5jdGlvbigpe1wiY2xvc2VkXCIhPWIuX19zdGF0ZSYmYi5fJHRvb2x0aXAucmVtb3ZlQ2xhc3MoXCJ0b29sdGlwc3Rlci11cGRhdGUtXCIrYyl9LDFlMyl9ZWxzZSBiLl8kdG9vbHRpcC5mYWRlVG8oMjAwLC41LGZ1bmN0aW9uKCl7XCJjbG9zZWRcIiE9Yi5fX3N0YXRlJiZiLl8kdG9vbHRpcC5mYWRlVG8oMjAwLDEpfSl9ZWxzZSBiLl9jbG9zZSgpO3JldHVybiBifSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcztpZihiLl9fZGVzdHJveWVkKWIuX19kZXN0cm95RXJyb3IoKTtlbHNle1wiY2xvc2VkXCIhPWIuX19zdGF0ZT9iLm9wdGlvbihcImFuaW1hdGlvbkR1cmF0aW9uXCIsMCkuX2Nsb3NlKG51bGwsbnVsbCwhMCk6Yi5fX3RpbWVvdXRzQ2xlYXIoKSxiLl90cmlnZ2VyKFwiZGVzdHJveVwiKSxiLl9fZGVzdHJveWVkPSEwLGIuXyRvcmlnaW4ucmVtb3ZlRGF0YShiLl9fbmFtZXNwYWNlKS5vZmYoXCIuXCIrYi5fX25hbWVzcGFjZStcIi10cmlnZ2VyT3BlblwiKSxhKGgud2luZG93LmRvY3VtZW50LmJvZHkpLm9mZihcIi5cIitiLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuXCIpO3ZhciBjPWIuXyRvcmlnaW4uZGF0YShcInRvb2x0aXBzdGVyLW5zXCIpO2lmKGMpaWYoMT09PWMubGVuZ3RoKXt2YXIgZD1udWxsO1wicHJldmlvdXNcIj09Yi5fX29wdGlvbnMucmVzdG9yYXRpb24/ZD1iLl8kb3JpZ2luLmRhdGEoXCJ0b29sdGlwc3Rlci1pbml0aWFsVGl0bGVcIik6XCJjdXJyZW50XCI9PWIuX19vcHRpb25zLnJlc3RvcmF0aW9uJiYoZD1cInN0cmluZ1wiPT10eXBlb2YgYi5fX0NvbnRlbnQ/Yi5fX0NvbnRlbnQ6YShcIjxkaXY+PC9kaXY+XCIpLmFwcGVuZChiLl9fQ29udGVudCkuaHRtbCgpKSxkJiZiLl8kb3JpZ2luLmF0dHIoXCJ0aXRsZVwiLGQpLGIuXyRvcmlnaW4ucmVtb3ZlQ2xhc3MoXCJ0b29sdGlwc3RlcmVkXCIpLGIuXyRvcmlnaW4ucmVtb3ZlRGF0YShcInRvb2x0aXBzdGVyLW5zXCIpLnJlbW92ZURhdGEoXCJ0b29sdGlwc3Rlci1pbml0aWFsVGl0bGVcIil9ZWxzZSBjPWEuZ3JlcChjLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEhPT1iLl9fbmFtZXNwYWNlfSksYi5fJG9yaWdpbi5kYXRhKFwidG9vbHRpcHN0ZXItbnNcIixjKTtiLl90cmlnZ2VyKFwiZGVzdHJveWVkXCIpLGIuX29mZigpLGIub2ZmKCksYi5fX0NvbnRlbnQ9bnVsbCxiLl9fJGVtaXR0ZXJQcml2YXRlPW51bGwsYi5fXyRlbWl0dGVyUHVibGljPW51bGwsYi5fX29wdGlvbnMucGFyZW50PW51bGwsYi5fJG9yaWdpbj1udWxsLGIuXyR0b29sdGlwPW51bGwsYS50b29sdGlwc3Rlci5fX2luc3RhbmNlc0xhdGVzdEFycj1hLmdyZXAoYS50b29sdGlwc3Rlci5fX2luc3RhbmNlc0xhdGVzdEFycixmdW5jdGlvbihhLGMpe3JldHVybiBiIT09YX0pLGNsZWFySW50ZXJ2YWwoYi5fX2dhcmJhZ2VDb2xsZWN0b3IpfXJldHVybiBifSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19kZXN0cm95ZWQ/KHRoaXMuX19kZXN0cm95RXJyb3IoKSx0aGlzKToodGhpcy5fY2xvc2UoKSx0aGlzLl9fZW5hYmxlZD0hMSx0aGlzKX0sZWxlbWVudE9yaWdpbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZGVzdHJveWVkP3ZvaWQgdGhpcy5fX2Rlc3Ryb3lFcnJvcigpOnRoaXMuXyRvcmlnaW5bMF19LGVsZW1lbnRUb29sdGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXyR0b29sdGlwP3RoaXMuXyR0b29sdGlwWzBdOm51bGx9LGVuYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZW5hYmxlZD0hMCx0aGlzfSxoaWRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNsb3NlKGEpfSxpbnN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2Rlc3Ryb3llZHx8dGhpcy5fXyRlbWl0dGVyUHVibGljLm9mZi5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9LG9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19kZXN0cm95ZWQ/dGhpcy5fX2Rlc3Ryb3lFcnJvcigpOnRoaXMuX18kZW1pdHRlclB1YmxpYy5vbi5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9LG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZGVzdHJveWVkP3RoaXMuX19kZXN0cm95RXJyb3IoKTp0aGlzLl9fJGVtaXR0ZXJQdWJsaWMub25lLmFwcGx5KHRoaXMuX18kZW1pdHRlclB1YmxpYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sb3BlbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX2Rlc3Ryb3llZD90aGlzLl9fZGVzdHJveUVycm9yKCk6dGhpcy5fb3BlbihudWxsLGEpLHRoaXN9LG9wdGlvbjpmdW5jdGlvbihiLGMpe3JldHVybiB2b2lkIDA9PT1jP3RoaXMuX19vcHRpb25zW2JdOih0aGlzLl9fZGVzdHJveWVkP3RoaXMuX19kZXN0cm95RXJyb3IoKToodGhpcy5fX29wdGlvbnNbYl09Yyx0aGlzLl9fb3B0aW9uc0Zvcm1hdCgpLGEuaW5BcnJheShiLFtcInRyaWdnZXJcIixcInRyaWdnZXJDbG9zZVwiLFwidHJpZ2dlck9wZW5cIl0pPj0wJiZ0aGlzLl9fcHJlcGFyZU9yaWdpbigpLFwic2VsZkRlc3RydWN0aW9uXCI9PT1iJiZ0aGlzLl9fcHJlcGFyZUdDKCkpLHRoaXMpfSxyZXBvc2l0aW9uOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztyZXR1cm4gYy5fX2Rlc3Ryb3llZD9jLl9fZGVzdHJveUVycm9yKCk6XCJjbG9zZWRcIiE9Yy5fX3N0YXRlJiZkKGMuXyRvcmlnaW4pJiYoYnx8ZChjLl8kdG9vbHRpcCkpJiYoYnx8Yy5fJHRvb2x0aXAuZGV0YWNoKCksYy5fX0dlb21ldHJ5PWMuX19nZW9tZXRyeSgpLGMuX3RyaWdnZXIoe3R5cGU6XCJyZXBvc2l0aW9uXCIsZXZlbnQ6YSxoZWxwZXI6e2dlbzpjLl9fR2VvbWV0cnl9fSkpLGN9LHNob3c6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub3BlbihhKX0sc3RhdHVzOmZ1bmN0aW9uKCl7cmV0dXJue2Rlc3Ryb3llZDp0aGlzLl9fZGVzdHJveWVkLGVuYWJsZWQ6dGhpcy5fX2VuYWJsZWQsb3BlbjpcImNsb3NlZFwiIT09dGhpcy5fX3N0YXRlLHN0YXRlOnRoaXMuX19zdGF0ZX19LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19kZXN0cm95ZWQ/dGhpcy5fX2Rlc3Ryb3lFcnJvcigpOnRoaXMuX18kZW1pdHRlclB1YmxpYy50cmlnZ2VySGFuZGxlci5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9fSxhLmZuLnRvb2x0aXBzdGVyPWZ1bmN0aW9uKCl7dmFyIGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cyksYz1cIllvdSBhcmUgdXNpbmcgYSBzaW5nbGUgSFRNTCBlbGVtZW50IGFzIGNvbnRlbnQgZm9yIHNldmVyYWwgdG9vbHRpcHMuIFlvdSBwcm9iYWJseSB3YW50IHRvIHNldCB0aGUgY29udGVudENsb25pbmcgb3B0aW9uIHRvIFRSVUUuXCI7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBiWzBdKXt2YXIgZD1cIiMqJH4mXCI7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWEodGhpcykuZGF0YShcInRvb2x0aXBzdGVyLW5zXCIpLGY9ZT9hKHRoaXMpLmRhdGEoZVswXSk6bnVsbDtpZighZil0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2FsbGVkIFRvb2x0aXBzdGVyJ3MgXFxcIlwiK2JbMF0rJ1wiIG1ldGhvZCBvbiBhbiB1bmluaXRpYWxpemVkIGVsZW1lbnQnKTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBmW2JbMF1dKXRocm93IG5ldyBFcnJvcignVW5rbm93biBtZXRob2QgXCInK2JbMF0rJ1wiJyk7dGhpcy5sZW5ndGg+MSYmXCJjb250ZW50XCI9PWJbMF0mJihiWzFdaW5zdGFuY2VvZiBhfHxcIm9iamVjdFwiPT10eXBlb2YgYlsxXSYmbnVsbCE9YlsxXSYmYlsxXS50YWdOYW1lKSYmIWYuX19vcHRpb25zLmNvbnRlbnRDbG9uaW5nJiZmLl9fb3B0aW9ucy5kZWJ1ZyYmY29uc29sZS5sb2coYyk7dmFyIGc9ZltiWzBdXShiWzFdLGJbMl0pO3JldHVybiBnIT09Znx8XCJpbnN0YW5jZVwiPT09YlswXT8oZD1nLCExKTp2b2lkIDB9KSxcIiMqJH4mXCIhPT1kP2Q6dGhpc31hLnRvb2x0aXBzdGVyLl9faW5zdGFuY2VzTGF0ZXN0QXJyPVtdO3ZhciBlPWJbMF0mJnZvaWQgMCE9PWJbMF0ubXVsdGlwbGUsZz1lJiZiWzBdLm11bHRpcGxlfHwhZSYmZi5tdWx0aXBsZSxoPWJbMF0mJnZvaWQgMCE9PWJbMF0uY29udGVudCxpPWgmJmJbMF0uY29udGVudHx8IWgmJmYuY29udGVudCxqPWJbMF0mJnZvaWQgMCE9PWJbMF0uY29udGVudENsb25pbmcsaz1qJiZiWzBdLmNvbnRlbnRDbG9uaW5nfHwhaiYmZi5jb250ZW50Q2xvbmluZyxsPWJbMF0mJnZvaWQgMCE9PWJbMF0uZGVidWcsbT1sJiZiWzBdLmRlYnVnfHwhbCYmZi5kZWJ1ZztyZXR1cm4gdGhpcy5sZW5ndGg+MSYmKGkgaW5zdGFuY2VvZiBhfHxcIm9iamVjdFwiPT10eXBlb2YgaSYmbnVsbCE9aSYmaS50YWdOYW1lKSYmIWsmJm0mJmNvbnNvbGUubG9nKGMpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPSExLGQ9YSh0aGlzKSxlPWQuZGF0YShcInRvb2x0aXBzdGVyLW5zXCIpLGY9bnVsbDtlP2c/Yz0hMDptJiYoY29uc29sZS5sb2coXCJUb29sdGlwc3Rlcjogb25lIG9yIG1vcmUgdG9vbHRpcHMgYXJlIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQgYmVsb3cuIElnbm9yaW5nLlwiKSxjb25zb2xlLmxvZyh0aGlzKSk6Yz0hMCxjJiYoZj1uZXcgYS5Ub29sdGlwc3Rlcih0aGlzLGJbMF0pLGV8fChlPVtdKSxlLnB1c2goZi5fX25hbWVzcGFjZSksZC5kYXRhKFwidG9vbHRpcHN0ZXItbnNcIixlKSxkLmRhdGEoZi5fX25hbWVzcGFjZSxmKSxmLl9fb3B0aW9ucy5mdW5jdGlvbkluaXQmJmYuX19vcHRpb25zLmZ1bmN0aW9uSW5pdC5jYWxsKGYsZix7b3JpZ2luOnRoaXN9KSxmLl90cmlnZ2VyKFwiaW5pdFwiKSksYS50b29sdGlwc3Rlci5fX2luc3RhbmNlc0xhdGVzdEFyci5wdXNoKGYpfSksdGhpc30sYi5wcm90b3R5cGU9e19faW5pdDpmdW5jdGlvbihiKXt0aGlzLl9fJHRvb2x0aXA9Yix0aGlzLl9fJHRvb2x0aXAuY3NzKHtsZWZ0OjAsb3ZlcmZsb3c6XCJoaWRkZW5cIixwb3NpdGlvbjpcImFic29sdXRlXCIsdG9wOjB9KS5maW5kKFwiLnRvb2x0aXBzdGVyLWNvbnRlbnRcIikuY3NzKFwib3ZlcmZsb3dcIixcImF1dG9cIiksdGhpcy4kY29udGFpbmVyPWEoJzxkaXYgY2xhc3M9XCJ0b29sdGlwc3Rlci1ydWxlclwiPjwvZGl2PicpLmFwcGVuZCh0aGlzLl9fJHRvb2x0aXApLmFwcGVuZFRvKGgud2luZG93LmRvY3VtZW50LmJvZHkpfSxfX2ZvcmNlUmVkcmF3OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fXyR0b29sdGlwLnBhcmVudCgpO3RoaXMuX18kdG9vbHRpcC5kZXRhY2goKSx0aGlzLl9fJHRvb2x0aXAuYXBwZW5kVG8oYSl9LGNvbnN0cmFpbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNvbnN0cmFpbnRzPXt3aWR0aDphLGhlaWdodDpifSx0aGlzLl9fJHRvb2x0aXAuY3NzKHtkaXNwbGF5OlwiYmxvY2tcIixoZWlnaHQ6XCJcIixvdmVyZmxvdzpcImF1dG9cIix3aWR0aDphfSksdGhpc30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX18kdG9vbHRpcC5kZXRhY2goKS5maW5kKFwiLnRvb2x0aXBzdGVyLWNvbnRlbnRcIikuY3NzKHtkaXNwbGF5OlwiXCIsb3ZlcmZsb3c6XCJcIn0pLHRoaXMuJGNvbnRhaW5lci5yZW1vdmUoKX0sZnJlZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cmFpbnRzPW51bGwsdGhpcy5fXyR0b29sdGlwLmNzcyh7ZGlzcGxheTpcIlwiLGhlaWdodDpcIlwiLG92ZXJmbG93OlwidmlzaWJsZVwiLHdpZHRoOlwiXCJ9KSx0aGlzfSxtZWFzdXJlOmZ1bmN0aW9uKCl7dGhpcy5fX2ZvcmNlUmVkcmF3KCk7dmFyIGE9dGhpcy5fXyR0b29sdGlwWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGI9e3NpemU6e2hlaWdodDphLmhlaWdodHx8YS5ib3R0b20tYS50b3Asd2lkdGg6YS53aWR0aHx8YS5yaWdodC1hLmxlZnR9fTtpZih0aGlzLmNvbnN0cmFpbnRzKXt2YXIgYz10aGlzLl9fJHRvb2x0aXAuZmluZChcIi50b29sdGlwc3Rlci1jb250ZW50XCIpLGQ9dGhpcy5fXyR0b29sdGlwLm91dGVySGVpZ2h0KCksZT1jWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9e2hlaWdodDpkPD10aGlzLmNvbnN0cmFpbnRzLmhlaWdodCx3aWR0aDphLndpZHRoPD10aGlzLmNvbnN0cmFpbnRzLndpZHRoJiZlLndpZHRoPj1jWzBdLnNjcm9sbFdpZHRoLTF9O2IuZml0cz1mLmhlaWdodCYmZi53aWR0aH1yZXR1cm4gaC5JRSYmaC5JRTw9MTEmJmIuc2l6ZS53aWR0aCE9PWgud2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCYmKGIuc2l6ZS53aWR0aD1NYXRoLmNlaWwoYi5zaXplLndpZHRoKSsxKSxifX07dmFyIGo9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOy0xIT1qLmluZGV4T2YoXCJtc2llXCIpP2guSUU9cGFyc2VJbnQoai5zcGxpdChcIm1zaWVcIilbMV0pOi0xIT09ai50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ0cmlkZW50XCIpJiYtMSE9PWouaW5kZXhPZihcIiBydjoxMVwiKT9oLklFPTExOi0xIT1qLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImVkZ2UvXCIpJiYoaC5JRT1wYXJzZUludChqLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCJlZGdlL1wiKVsxXSkpO3ZhciBrPVwidG9vbHRpcHN0ZXIuc2lkZVRpcFwiO3JldHVybiBhLnRvb2x0aXBzdGVyLl9wbHVnaW4oe25hbWU6ayxpbnN0YW5jZTp7X19kZWZhdWx0czpmdW5jdGlvbigpe3JldHVybnthcnJvdzohMCxkaXN0YW5jZTo2LGZ1bmN0aW9uUG9zaXRpb246bnVsbCxtYXhXaWR0aDpudWxsLG1pbkludGVyc2VjdGlvbjoxNixtaW5XaWR0aDowLHBvc2l0aW9uOm51bGwsc2lkZTpcInRvcFwiLHZpZXdwb3J0QXdhcmU6ITB9fSxfX2luaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLl9faW5zdGFuY2U9YSxiLl9fbmFtZXNwYWNlPVwidG9vbHRpcHN0ZXItc2lkZVRpcC1cIitNYXRoLnJvdW5kKDFlNipNYXRoLnJhbmRvbSgpKSxiLl9fcHJldmlvdXNTdGF0ZT1cImNsb3NlZFwiLGIuX19vcHRpb25zLGIuX19vcHRpb25zRm9ybWF0KCksYi5fX2luc3RhbmNlLl9vbihcInN0YXRlLlwiK2IuX19uYW1lc3BhY2UsZnVuY3Rpb24oYSl7XCJjbG9zZWRcIj09YS5zdGF0ZT9iLl9fY2xvc2UoKTpcImFwcGVhcmluZ1wiPT1hLnN0YXRlJiZcImNsb3NlZFwiPT1iLl9fcHJldmlvdXNTdGF0ZSYmYi5fX2NyZWF0ZSgpLGIuX19wcmV2aW91c1N0YXRlPWEuc3RhdGV9KSxiLl9faW5zdGFuY2UuX29uKFwib3B0aW9ucy5cIitiLl9fbmFtZXNwYWNlLGZ1bmN0aW9uKCl7Yi5fX29wdGlvbnNGb3JtYXQoKX0pLGIuX19pbnN0YW5jZS5fb24oXCJyZXBvc2l0aW9uLlwiK2IuX19uYW1lc3BhY2UsZnVuY3Rpb24oYSl7Yi5fX3JlcG9zaXRpb24oYS5ldmVudCxhLmhlbHBlcil9KX0sX19jbG9zZTpmdW5jdGlvbigpe3RoaXMuX19pbnN0YW5jZS5jb250ZW50KClpbnN0YW5jZW9mIGEmJnRoaXMuX19pbnN0YW5jZS5jb250ZW50KCkuZGV0YWNoKCksdGhpcy5fX2luc3RhbmNlLl8kdG9vbHRpcC5yZW1vdmUoKSx0aGlzLl9faW5zdGFuY2UuXyR0b29sdGlwPW51bGx9LF9fY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9YSgnPGRpdiBjbGFzcz1cInRvb2x0aXBzdGVyLWJhc2UgdG9vbHRpcHN0ZXItc2lkZXRpcFwiPjxkaXYgY2xhc3M9XCJ0b29sdGlwc3Rlci1ib3hcIj48ZGl2IGNsYXNzPVwidG9vbHRpcHN0ZXItY29udGVudFwiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9XCJ0b29sdGlwc3Rlci1hcnJvd1wiPjxkaXYgY2xhc3M9XCJ0b29sdGlwc3Rlci1hcnJvdy11bmNyb3BwZWRcIj48ZGl2IGNsYXNzPVwidG9vbHRpcHN0ZXItYXJyb3ctYm9yZGVyXCI+PC9kaXY+PGRpdiBjbGFzcz1cInRvb2x0aXBzdGVyLWFycm93LWJhY2tncm91bmRcIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTt0aGlzLl9fb3B0aW9ucy5hcnJvd3x8Yi5maW5kKFwiLnRvb2x0aXBzdGVyLWJveFwiKS5jc3MoXCJtYXJnaW5cIiwwKS5lbmQoKS5maW5kKFwiLnRvb2x0aXBzdGVyLWFycm93XCIpLmhpZGUoKSx0aGlzLl9fb3B0aW9ucy5taW5XaWR0aCYmYi5jc3MoXCJtaW4td2lkdGhcIix0aGlzLl9fb3B0aW9ucy5taW5XaWR0aCtcInB4XCIpLHRoaXMuX19vcHRpb25zLm1heFdpZHRoJiZiLmNzcyhcIm1heC13aWR0aFwiLHRoaXMuX19vcHRpb25zLm1heFdpZHRoK1wicHhcIiksXG50aGlzLl9faW5zdGFuY2UuXyR0b29sdGlwPWIsdGhpcy5fX2luc3RhbmNlLl90cmlnZ2VyKFwiY3JlYXRlZFwiKX0sX19kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fX2luc3RhbmNlLl9vZmYoXCIuXCIrc2VsZi5fX25hbWVzcGFjZSl9LF9fb3B0aW9uc0Zvcm1hdDpmdW5jdGlvbigpe3ZhciBiPXRoaXM7aWYoYi5fX29wdGlvbnM9Yi5fX2luc3RhbmNlLl9vcHRpb25zRXh0cmFjdChrLGIuX19kZWZhdWx0cygpKSxiLl9fb3B0aW9ucy5wb3NpdGlvbiYmKGIuX19vcHRpb25zLnNpZGU9Yi5fX29wdGlvbnMucG9zaXRpb24pLFwib2JqZWN0XCIhPXR5cGVvZiBiLl9fb3B0aW9ucy5kaXN0YW5jZSYmKGIuX19vcHRpb25zLmRpc3RhbmNlPVtiLl9fb3B0aW9ucy5kaXN0YW5jZV0pLGIuX19vcHRpb25zLmRpc3RhbmNlLmxlbmd0aDw0JiYodm9pZCAwPT09Yi5fX29wdGlvbnMuZGlzdGFuY2VbMV0mJihiLl9fb3B0aW9ucy5kaXN0YW5jZVsxXT1iLl9fb3B0aW9ucy5kaXN0YW5jZVswXSksdm9pZCAwPT09Yi5fX29wdGlvbnMuZGlzdGFuY2VbMl0mJihiLl9fb3B0aW9ucy5kaXN0YW5jZVsyXT1iLl9fb3B0aW9ucy5kaXN0YW5jZVswXSksdm9pZCAwPT09Yi5fX29wdGlvbnMuZGlzdGFuY2VbM10mJihiLl9fb3B0aW9ucy5kaXN0YW5jZVszXT1iLl9fb3B0aW9ucy5kaXN0YW5jZVsxXSkpLGIuX19vcHRpb25zLmRpc3RhbmNlPXt0b3A6Yi5fX29wdGlvbnMuZGlzdGFuY2VbMF0scmlnaHQ6Yi5fX29wdGlvbnMuZGlzdGFuY2VbMV0sYm90dG9tOmIuX19vcHRpb25zLmRpc3RhbmNlWzJdLGxlZnQ6Yi5fX29wdGlvbnMuZGlzdGFuY2VbM119LFwic3RyaW5nXCI9PXR5cGVvZiBiLl9fb3B0aW9ucy5zaWRlKXt2YXIgYz17dG9wOlwiYm90dG9tXCIscmlnaHQ6XCJsZWZ0XCIsYm90dG9tOlwidG9wXCIsbGVmdDpcInJpZ2h0XCJ9O2IuX19vcHRpb25zLnNpZGU9W2IuX19vcHRpb25zLnNpZGUsY1tiLl9fb3B0aW9ucy5zaWRlXV0sXCJsZWZ0XCI9PWIuX19vcHRpb25zLnNpZGVbMF18fFwicmlnaHRcIj09Yi5fX29wdGlvbnMuc2lkZVswXT9iLl9fb3B0aW9ucy5zaWRlLnB1c2goXCJ0b3BcIixcImJvdHRvbVwiKTpiLl9fb3B0aW9ucy5zaWRlLnB1c2goXCJyaWdodFwiLFwibGVmdFwiKX02PT09YS50b29sdGlwc3Rlci5fZW52LklFJiZiLl9fb3B0aW9ucy5hcnJvdyE9PSEwJiYoYi5fX29wdGlvbnMuYXJyb3c9ITEpfSxfX3JlcG9zaXRpb246ZnVuY3Rpb24oYixjKXt2YXIgZCxlPXRoaXMsZj1lLl9fdGFyZ2V0RmluZChjKSxnPVtdO2UuX19pbnN0YW5jZS5fJHRvb2x0aXAuZGV0YWNoKCk7dmFyIGg9ZS5fX2luc3RhbmNlLl8kdG9vbHRpcC5jbG9uZSgpLGk9YS50b29sdGlwc3Rlci5fZ2V0UnVsZXIoaCksaj0hMSxrPWUuX19pbnN0YW5jZS5vcHRpb24oXCJhbmltYXRpb25cIik7c3dpdGNoKGsmJmgucmVtb3ZlQ2xhc3MoXCJ0b29sdGlwc3Rlci1cIitrKSxhLmVhY2goW1wid2luZG93XCIsXCJkb2N1bWVudFwiXSxmdW5jdGlvbihkLGspe3ZhciBsPW51bGw7aWYoZS5fX2luc3RhbmNlLl90cmlnZ2VyKHtjb250YWluZXI6ayxoZWxwZXI6YyxzYXRpc2ZpZWQ6aix0YWtlVGVzdDpmdW5jdGlvbihhKXtsPWF9LHJlc3VsdHM6Zyx0eXBlOlwicG9zaXRpb25UZXN0XCJ9KSwxPT1sfHwwIT1sJiYwPT1qJiYoXCJ3aW5kb3dcIiE9a3x8ZS5fX29wdGlvbnMudmlld3BvcnRBd2FyZSkpZm9yKHZhciBkPTA7ZDxlLl9fb3B0aW9ucy5zaWRlLmxlbmd0aDtkKyspe3ZhciBtPXtob3Jpem9udGFsOjAsdmVydGljYWw6MH0sbj1lLl9fb3B0aW9ucy5zaWRlW2RdO1widG9wXCI9PW58fFwiYm90dG9tXCI9PW4/bS52ZXJ0aWNhbD1lLl9fb3B0aW9ucy5kaXN0YW5jZVtuXTptLmhvcml6b250YWw9ZS5fX29wdGlvbnMuZGlzdGFuY2Vbbl0sZS5fX3NpZGVDaGFuZ2UoaCxuKSxhLmVhY2goW1wibmF0dXJhbFwiLFwiY29uc3RyYWluZWRcIl0sZnVuY3Rpb24oYSxkKXtpZihsPW51bGwsZS5fX2luc3RhbmNlLl90cmlnZ2VyKHtjb250YWluZXI6ayxldmVudDpiLGhlbHBlcjpjLG1vZGU6ZCxyZXN1bHRzOmcsc2F0aXNmaWVkOmosc2lkZTpuLHRha2VUZXN0OmZ1bmN0aW9uKGEpe2w9YX0sdHlwZTpcInBvc2l0aW9uVGVzdFwifSksMT09bHx8MCE9bCYmMD09ail7dmFyIGg9e2NvbnRhaW5lcjprLGRpc3RhbmNlOm0sZml0czpudWxsLG1vZGU6ZCxvdXRlclNpemU6bnVsbCxzaWRlOm4sc2l6ZTpudWxsLHRhcmdldDpmW25dLHdob2xlOm51bGx9LG89XCJuYXR1cmFsXCI9PWQ/aS5mcmVlKCk6aS5jb25zdHJhaW4oYy5nZW8uYXZhaWxhYmxlW2tdW25dLndpZHRoLW0uaG9yaXpvbnRhbCxjLmdlby5hdmFpbGFibGVba11bbl0uaGVpZ2h0LW0udmVydGljYWwpLHA9by5tZWFzdXJlKCk7aWYoaC5zaXplPXAuc2l6ZSxoLm91dGVyU2l6ZT17aGVpZ2h0OnAuc2l6ZS5oZWlnaHQrbS52ZXJ0aWNhbCx3aWR0aDpwLnNpemUud2lkdGgrbS5ob3Jpem9udGFsfSxcIm5hdHVyYWxcIj09ZD9jLmdlby5hdmFpbGFibGVba11bbl0ud2lkdGg+PWgub3V0ZXJTaXplLndpZHRoJiZjLmdlby5hdmFpbGFibGVba11bbl0uaGVpZ2h0Pj1oLm91dGVyU2l6ZS5oZWlnaHQ/aC5maXRzPSEwOmguZml0cz0hMTpoLmZpdHM9cC5maXRzLFwid2luZG93XCI9PWsmJihoLmZpdHM/XCJ0b3BcIj09bnx8XCJib3R0b21cIj09bj9oLndob2xlPWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQucmlnaHQ+PWUuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbiYmYy5nZW8ud2luZG93LnNpemUud2lkdGgtYy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0Pj1lLl9fb3B0aW9ucy5taW5JbnRlcnNlY3Rpb246aC53aG9sZT1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LmJvdHRvbT49ZS5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uJiZjLmdlby53aW5kb3cuc2l6ZS5oZWlnaHQtYy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC50b3A+PWUuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbjpoLndob2xlPSExKSxnLnB1c2goaCksaC53aG9sZSlqPSEwO2Vsc2UgaWYoXCJuYXR1cmFsXCI9PWgubW9kZSYmKGguZml0c3x8aC5zaXplLndpZHRoPD1jLmdlby5hdmFpbGFibGVba11bbl0ud2lkdGgpKXJldHVybiExfX0pfX0pLGUuX19pbnN0YW5jZS5fdHJpZ2dlcih7ZWRpdDpmdW5jdGlvbihhKXtnPWF9LGV2ZW50OmIsaGVscGVyOmMscmVzdWx0czpnLHR5cGU6XCJwb3NpdGlvblRlc3RlZFwifSksZy5zb3J0KGZ1bmN0aW9uKGEsYil7aWYoYS53aG9sZSYmIWIud2hvbGUpcmV0dXJuLTE7aWYoIWEud2hvbGUmJmIud2hvbGUpcmV0dXJuIDE7aWYoYS53aG9sZSYmYi53aG9sZSl7dmFyIGM9ZS5fX29wdGlvbnMuc2lkZS5pbmRleE9mKGEuc2lkZSksZD1lLl9fb3B0aW9ucy5zaWRlLmluZGV4T2YoYi5zaWRlKTtyZXR1cm4gZD5jPy0xOmM+ZD8xOlwibmF0dXJhbFwiPT1hLm1vZGU/LTE6MX1pZihhLmZpdHMmJiFiLmZpdHMpcmV0dXJuLTE7aWYoIWEuZml0cyYmYi5maXRzKXJldHVybiAxO2lmKGEuZml0cyYmYi5maXRzKXt2YXIgYz1lLl9fb3B0aW9ucy5zaWRlLmluZGV4T2YoYS5zaWRlKSxkPWUuX19vcHRpb25zLnNpZGUuaW5kZXhPZihiLnNpZGUpO3JldHVybiBkPmM/LTE6Yz5kPzE6XCJuYXR1cmFsXCI9PWEubW9kZT8tMToxfXJldHVyblwiZG9jdW1lbnRcIj09YS5jb250YWluZXImJlwiYm90dG9tXCI9PWEuc2lkZSYmXCJuYXR1cmFsXCI9PWEubW9kZT8tMToxfSksZD1nWzBdLGQuY29vcmQ9e30sZC5zaWRlKXtjYXNlXCJsZWZ0XCI6Y2FzZVwicmlnaHRcIjpkLmNvb3JkLnRvcD1NYXRoLmZsb29yKGQudGFyZ2V0LWQuc2l6ZS5oZWlnaHQvMik7YnJlYWs7Y2FzZVwiYm90dG9tXCI6Y2FzZVwidG9wXCI6ZC5jb29yZC5sZWZ0PU1hdGguZmxvb3IoZC50YXJnZXQtZC5zaXplLndpZHRoLzIpfXN3aXRjaChkLnNpZGUpe2Nhc2VcImxlZnRcIjpkLmNvb3JkLmxlZnQ9Yy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0LWQub3V0ZXJTaXplLndpZHRoO2JyZWFrO2Nhc2VcInJpZ2h0XCI6ZC5jb29yZC5sZWZ0PWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQucmlnaHQrZC5kaXN0YW5jZS5ob3Jpem9udGFsO2JyZWFrO2Nhc2VcInRvcFwiOmQuY29vcmQudG9wPWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wLWQub3V0ZXJTaXplLmhlaWdodDticmVhaztjYXNlXCJib3R0b21cIjpkLmNvb3JkLnRvcD1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LmJvdHRvbStkLmRpc3RhbmNlLnZlcnRpY2FsfVwid2luZG93XCI9PWQuY29udGFpbmVyP1widG9wXCI9PWQuc2lkZXx8XCJib3R0b21cIj09ZC5zaWRlP2QuY29vcmQubGVmdDwwP2MuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQucmlnaHQtdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uPj0wP2QuY29vcmQubGVmdD0wOmQuY29vcmQubGVmdD1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LnJpZ2h0LXRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbi0xOmQuY29vcmQubGVmdD5jLmdlby53aW5kb3cuc2l6ZS53aWR0aC1kLnNpemUud2lkdGgmJihjLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQrdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uPD1jLmdlby53aW5kb3cuc2l6ZS53aWR0aD9kLmNvb3JkLmxlZnQ9Yy5nZW8ud2luZG93LnNpemUud2lkdGgtZC5zaXplLndpZHRoOmQuY29vcmQubGVmdD1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQrdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uKzEtZC5zaXplLndpZHRoKTpkLmNvb3JkLnRvcDwwP2MuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQuYm90dG9tLXRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbj49MD9kLmNvb3JkLnRvcD0wOmQuY29vcmQudG9wPWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQuYm90dG9tLXRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbi0xOmQuY29vcmQudG9wPmMuZ2VvLndpbmRvdy5zaXplLmhlaWdodC1kLnNpemUuaGVpZ2h0JiYoYy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC50b3ArdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uPD1jLmdlby53aW5kb3cuc2l6ZS5oZWlnaHQ/ZC5jb29yZC50b3A9Yy5nZW8ud2luZG93LnNpemUuaGVpZ2h0LWQuc2l6ZS5oZWlnaHQ6ZC5jb29yZC50b3A9Yy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC50b3ArdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uKzEtZC5zaXplLmhlaWdodCk6KGQuY29vcmQubGVmdD5jLmdlby53aW5kb3cuc2l6ZS53aWR0aC1kLnNpemUud2lkdGgmJihkLmNvb3JkLmxlZnQ9Yy5nZW8ud2luZG93LnNpemUud2lkdGgtZC5zaXplLndpZHRoKSxkLmNvb3JkLmxlZnQ8MCYmKGQuY29vcmQubGVmdD0wKSksZS5fX3NpZGVDaGFuZ2UoaCxkLnNpZGUpLGMudG9vbHRpcENsb25lPWhbMF0sYy50b29sdGlwUGFyZW50PWUuX19pbnN0YW5jZS5vcHRpb24oXCJwYXJlbnRcIikucGFyZW50WzBdLGMubW9kZT1kLm1vZGUsYy53aG9sZT1kLndob2xlLGMub3JpZ2luPWUuX19pbnN0YW5jZS5fJG9yaWdpblswXSxjLnRvb2x0aXA9ZS5fX2luc3RhbmNlLl8kdG9vbHRpcFswXSxkZWxldGUgZC5jb250YWluZXIsZGVsZXRlIGQuZml0cyxkZWxldGUgZC5tb2RlLGRlbGV0ZSBkLm91dGVyU2l6ZSxkZWxldGUgZC53aG9sZSxkLmRpc3RhbmNlPWQuZGlzdGFuY2UuaG9yaXpvbnRhbHx8ZC5kaXN0YW5jZS52ZXJ0aWNhbDt2YXIgbD1hLmV4dGVuZCghMCx7fSxkKTtpZihlLl9faW5zdGFuY2UuX3RyaWdnZXIoe2VkaXQ6ZnVuY3Rpb24oYSl7ZD1hfSxldmVudDpiLGhlbHBlcjpjLHBvc2l0aW9uOmwsdHlwZTpcInBvc2l0aW9uXCJ9KSxlLl9fb3B0aW9ucy5mdW5jdGlvblBvc2l0aW9uKXt2YXIgbT1lLl9fb3B0aW9ucy5mdW5jdGlvblBvc2l0aW9uLmNhbGwoZSxlLl9faW5zdGFuY2UsYyxsKTttJiYoZD1tKX1pLmRlc3Ryb3koKTt2YXIgbixvO1widG9wXCI9PWQuc2lkZXx8XCJib3R0b21cIj09ZC5zaWRlPyhuPXtwcm9wOlwibGVmdFwiLHZhbDpkLnRhcmdldC1kLmNvb3JkLmxlZnR9LG89ZC5zaXplLndpZHRoLXRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbik6KG49e3Byb3A6XCJ0b3BcIix2YWw6ZC50YXJnZXQtZC5jb29yZC50b3B9LG89ZC5zaXplLmhlaWdodC10aGlzLl9fb3B0aW9ucy5taW5JbnRlcnNlY3Rpb24pLG4udmFsPHRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbj9uLnZhbD10aGlzLl9fb3B0aW9ucy5taW5JbnRlcnNlY3Rpb246bi52YWw+byYmKG4udmFsPW8pO3ZhciBwO3A9Yy5nZW8ub3JpZ2luLmZpeGVkTGluZWFnZT9jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0OntsZWZ0OmMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCtjLmdlby53aW5kb3cuc2Nyb2xsLmxlZnQsdG9wOmMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wK2MuZ2VvLndpbmRvdy5zY3JvbGwudG9wfSxkLmNvb3JkPXtsZWZ0OnAubGVmdCsoZC5jb29yZC5sZWZ0LWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCksdG9wOnAudG9wKyhkLmNvb3JkLnRvcC1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LnRvcCl9LGUuX19zaWRlQ2hhbmdlKGUuX19pbnN0YW5jZS5fJHRvb2x0aXAsZC5zaWRlKSxjLmdlby5vcmlnaW4uZml4ZWRMaW5lYWdlP2UuX19pbnN0YW5jZS5fJHRvb2x0aXAuY3NzKFwicG9zaXRpb25cIixcImZpeGVkXCIpOmUuX19pbnN0YW5jZS5fJHRvb2x0aXAuY3NzKFwicG9zaXRpb25cIixcIlwiKSxlLl9faW5zdGFuY2UuXyR0b29sdGlwLmNzcyh7bGVmdDpkLmNvb3JkLmxlZnQsdG9wOmQuY29vcmQudG9wLGhlaWdodDpkLnNpemUuaGVpZ2h0LHdpZHRoOmQuc2l6ZS53aWR0aH0pLmZpbmQoXCIudG9vbHRpcHN0ZXItYXJyb3dcIikuY3NzKHtsZWZ0OlwiXCIsdG9wOlwiXCJ9KS5jc3Mobi5wcm9wLG4udmFsKSxlLl9faW5zdGFuY2UuXyR0b29sdGlwLmFwcGVuZFRvKGUuX19pbnN0YW5jZS5vcHRpb24oXCJwYXJlbnRcIikpLGUuX19pbnN0YW5jZS5fdHJpZ2dlcih7dHlwZTpcInJlcG9zaXRpb25lZFwiLGV2ZW50OmIscG9zaXRpb246ZH0pfSxfX3NpZGVDaGFuZ2U6ZnVuY3Rpb24oYSxiKXthLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItYm90dG9tXCIpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItbGVmdFwiKS5yZW1vdmVDbGFzcyhcInRvb2x0aXBzdGVyLXJpZ2h0XCIpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItdG9wXCIpLmFkZENsYXNzKFwidG9vbHRpcHN0ZXItXCIrYil9LF9fdGFyZ2V0RmluZDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPXRoaXMuX19pbnN0YW5jZS5fJG9yaWdpblswXS5nZXRDbGllbnRSZWN0cygpO2lmKGMubGVuZ3RoPjEpe3ZhciBkPXRoaXMuX19pbnN0YW5jZS5fJG9yaWdpbi5jc3MoXCJvcGFjaXR5XCIpOzE9PWQmJih0aGlzLl9faW5zdGFuY2UuXyRvcmlnaW4uY3NzKFwib3BhY2l0eVwiLC45OSksYz10aGlzLl9faW5zdGFuY2UuXyRvcmlnaW5bMF0uZ2V0Q2xpZW50UmVjdHMoKSx0aGlzLl9faW5zdGFuY2UuXyRvcmlnaW4uY3NzKFwib3BhY2l0eVwiLDEpKX1pZihjLmxlbmd0aDwyKWIudG9wPU1hdGguZmxvb3IoYS5nZW8ub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0K2EuZ2VvLm9yaWdpbi5zaXplLndpZHRoLzIpLGIuYm90dG9tPWIudG9wLGIubGVmdD1NYXRoLmZsb29yKGEuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wK2EuZ2VvLm9yaWdpbi5zaXplLmhlaWdodC8yKSxiLnJpZ2h0PWIubGVmdDtlbHNle3ZhciBlPWNbMF07Yi50b3A9TWF0aC5mbG9vcihlLmxlZnQrKGUucmlnaHQtZS5sZWZ0KS8yKSxlPWMubGVuZ3RoPjI/Y1tNYXRoLmNlaWwoYy5sZW5ndGgvMiktMV06Y1swXSxiLnJpZ2h0PU1hdGguZmxvb3IoZS50b3ArKGUuYm90dG9tLWUudG9wKS8yKSxlPWNbYy5sZW5ndGgtMV0sYi5ib3R0b209TWF0aC5mbG9vcihlLmxlZnQrKGUucmlnaHQtZS5sZWZ0KS8yKSxlPWMubGVuZ3RoPjI/Y1tNYXRoLmNlaWwoKGMubGVuZ3RoKzEpLzIpLTFdOmNbYy5sZW5ndGgtMV0sYi5sZWZ0PU1hdGguZmxvb3IoZS50b3ArKGUuYm90dG9tLWUudG9wKS8yKX1yZXR1cm4gYn19fSksYX0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG4vKlxyXG4gKiAgQm9vdHN0cmFwIFRvdWNoc3BpbiAtIHY0LjcuM1xyXG4gKiAgQSBtb2JpbGUgYW5kIHRvdWNoIGZyaWVuZGx5IGlucHV0IHNwaW5uZXIgY29tcG9uZW50IGZvciBCb290c3RyYXAgMyAmIDQuXHJcbiAqICBodHRwczovL3d3dy52aXJ0dW9zb2Z0LmV1L2NvZGUvYm9vdHN0cmFwLXRvdWNoc3Bpbi9cclxuICpcclxuICogIE1hZGUgYnkgSXN0dsOhbiBVamotTcOpc3rDoXJvc1xyXG4gKiAgVW5kZXIgTUlUIExpY2Vuc2VcclxuICovXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTtcbiAgfSBlbHNlIGlmICgodHlwZW9mIG1vZHVsZSA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG1vZHVsZSkpID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJvb3QsIGpRdWVyeSkge1xuICAgICAgaWYgKGpRdWVyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpKHJvb3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmYWN0b3J5KGpRdWVyeSk7XG4gICAgICByZXR1cm4galF1ZXJ5O1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZmFjdG9yeShqUXVlcnkpO1xuICB9XG59KShmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIF9jdXJyZW50U3Bpbm5lcklkID0gMDtcbiAgJC5mbi5Ub3VjaFNwaW4gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIG1pbjogMCxcbiAgICAgIC8vIElmIG51bGwsIHRoZXJlIGlzIG5vIG1pbmltdW0gZW5mb3JjZWRcbiAgICAgIG1heDogMTAwLFxuICAgICAgLy8gSWYgbnVsbCwgdGhlcmUgaXMgbm8gbWF4aW11bSBlbmZvcmNlZFxuICAgICAgaW5pdHZhbDogJycsXG4gICAgICByZXBsYWNlbWVudHZhbDogJycsXG4gICAgICBmaXJzdGNsaWNrdmFsdWVpZmVtcHR5OiBudWxsLFxuICAgICAgc3RlcDogMSxcbiAgICAgIGRlY2ltYWxzOiAwLFxuICAgICAgc3RlcGludGVydmFsOiAxMDAsXG4gICAgICBmb3JjZXN0ZXBkaXZpc2liaWxpdHk6ICdyb3VuZCcsXG4gICAgICAvLyBub25lIHwgZmxvb3IgfCByb3VuZCB8IGNlaWxcbiAgICAgIHN0ZXBpbnRlcnZhbGRlbGF5OiA1MDAsXG4gICAgICB2ZXJ0aWNhbGJ1dHRvbnM6IGZhbHNlLFxuICAgICAgdmVydGljYWx1cDogJyZwbHVzOycsXG4gICAgICB2ZXJ0aWNhbGRvd246ICcmbWludXM7JyxcbiAgICAgIHZlcnRpY2FsdXBjbGFzczogJycsXG4gICAgICB2ZXJ0aWNhbGRvd25jbGFzczogJycsXG4gICAgICBwcmVmaXg6ICcnLFxuICAgICAgcG9zdGZpeDogJycsXG4gICAgICBwcmVmaXhfZXh0cmFjbGFzczogJycsXG4gICAgICBwb3N0Zml4X2V4dHJhY2xhc3M6ICcnLFxuICAgICAgYm9vc3RlcjogdHJ1ZSxcbiAgICAgIGJvb3N0YXQ6IDEwLFxuICAgICAgbWF4Ym9vc3RlZHN0ZXA6IGZhbHNlLFxuICAgICAgbW91c2V3aGVlbDogdHJ1ZSxcbiAgICAgIGJ1dHRvbmRvd25fY2xhc3M6ICdidG4gYnRuLXByaW1hcnknLFxuICAgICAgYnV0dG9udXBfY2xhc3M6ICdidG4gYnRuLXByaW1hcnknLFxuICAgICAgYnV0dG9uZG93bl90eHQ6ICcmbWludXM7JyxcbiAgICAgIGJ1dHRvbnVwX3R4dDogJyZwbHVzOycsXG4gICAgICBjYWxsYmFja19iZWZvcmVfY2FsY3VsYXRpb246IGZ1bmN0aW9uIGNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgY2FsbGJhY2tfYWZ0ZXJfY2FsY3VsYXRpb246IGZ1bmN0aW9uIGNhbGxiYWNrX2FmdGVyX2NhbGN1bGF0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBhdHRyaWJ1dGVNYXAgPSB7XG4gICAgICBtaW46ICdtaW4nLFxuICAgICAgbWF4OiAnbWF4JyxcbiAgICAgIGluaXR2YWw6ICdpbml0LXZhbCcsXG4gICAgICByZXBsYWNlbWVudHZhbDogJ3JlcGxhY2VtZW50LXZhbCcsXG4gICAgICBmaXJzdGNsaWNrdmFsdWVpZmVtcHR5OiAnZmlyc3QtY2xpY2stdmFsdWUtaWYtZW1wdHknLFxuICAgICAgc3RlcDogJ3N0ZXAnLFxuICAgICAgZGVjaW1hbHM6ICdkZWNpbWFscycsXG4gICAgICBzdGVwaW50ZXJ2YWw6ICdzdGVwLWludGVydmFsJyxcbiAgICAgIHZlcnRpY2FsYnV0dG9uczogJ3ZlcnRpY2FsLWJ1dHRvbnMnLFxuICAgICAgdmVydGljYWx1cGNsYXNzOiAndmVydGljYWwtdXAtY2xhc3MnLFxuICAgICAgdmVydGljYWxkb3duY2xhc3M6ICd2ZXJ0aWNhbC1kb3duLWNsYXNzJyxcbiAgICAgIGZvcmNlc3RlcGRpdmlzaWJpbGl0eTogJ2ZvcmNlLXN0ZXAtZGl2aXNpYmlsaXR5JyxcbiAgICAgIHN0ZXBpbnRlcnZhbGRlbGF5OiAnc3RlcC1pbnRlcnZhbC1kZWxheScsXG4gICAgICBwcmVmaXg6ICdwcmVmaXgnLFxuICAgICAgcG9zdGZpeDogJ3Bvc3RmaXgnLFxuICAgICAgcHJlZml4X2V4dHJhY2xhc3M6ICdwcmVmaXgtZXh0cmEtY2xhc3MnLFxuICAgICAgcG9zdGZpeF9leHRyYWNsYXNzOiAncG9zdGZpeC1leHRyYS1jbGFzcycsXG4gICAgICBib29zdGVyOiAnYm9vc3RlcicsXG4gICAgICBib29zdGF0OiAnYm9vc3RhdCcsXG4gICAgICBtYXhib29zdGVkc3RlcDogJ21heC1ib29zdGVkLXN0ZXAnLFxuICAgICAgbW91c2V3aGVlbDogJ21vdXNlLXdoZWVsJyxcbiAgICAgIGJ1dHRvbmRvd25fY2xhc3M6ICdidXR0b24tZG93bi1jbGFzcycsXG4gICAgICBidXR0b251cF9jbGFzczogJ2J1dHRvbi11cC1jbGFzcycsXG4gICAgICBidXR0b25kb3duX3R4dDogJ2J1dHRvbi1kb3duLXR4dCcsXG4gICAgICBidXR0b251cF90eHQ6ICdidXR0b24tdXAtdHh0J1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2V0dGluZ3MsXG4gICAgICAgIG9yaWdpbmFsaW5wdXQgPSAkKHRoaXMpLFxuICAgICAgICBvcmlnaW5hbGlucHV0X2RhdGEgPSBvcmlnaW5hbGlucHV0LmRhdGEoKSxcbiAgICAgICAgX2RldGFjaGVkX3ByZWZpeCxcbiAgICAgICAgX2RldGFjaGVkX3Bvc3RmaXgsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIHZlcnRpY2FsYnV0dG9uc19odG1sLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZG93blNwaW5UaW1lcixcbiAgICAgICAgdXBTcGluVGltZXIsXG4gICAgICAgIGRvd25EZWxheVRpbWVvdXQsXG4gICAgICAgIHVwRGVsYXlUaW1lb3V0LFxuICAgICAgICBzcGluY291bnQgPSAwLFxuICAgICAgICBzcGlubmluZyA9IGZhbHNlO1xuICAgICAgaW5pdCgpO1xuICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuZGF0YSgnYWxyZWFkeWluaXRpYWxpemVkJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb3JpZ2luYWxpbnB1dC5kYXRhKCdhbHJlYWR5aW5pdGlhbGl6ZWQnLCB0cnVlKTtcbiAgICAgICAgX2N1cnJlbnRTcGlubmVySWQgKz0gMTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5kYXRhKCdzcGlubmVyaWQnLCBfY3VycmVudFNwaW5uZXJJZCk7XG4gICAgICAgIGlmICghb3JpZ2luYWxpbnB1dC5pcygnaW5wdXQnKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdNdXN0IGJlIGFuIGlucHV0LicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBfaW5pdFNldHRpbmdzKCk7XG4gICAgICAgIF9zZXRJbml0dmFsKCk7XG4gICAgICAgIF9jaGVja1ZhbHVlKCk7XG4gICAgICAgIF9idWlsZEh0bWwoKTtcbiAgICAgICAgX2luaXRFbGVtZW50cygpO1xuICAgICAgICBfdXBkYXRlQnV0dG9uRGlzYWJsZWRTdGF0ZSgpO1xuICAgICAgICBfaGlkZUVtcHR5UHJlZml4UG9zdGZpeCgpO1xuICAgICAgICBfc2V0dXBNdXRhdGlvbk9ic2VydmVycygpO1xuICAgICAgICBfYmluZEV2ZW50cygpO1xuICAgICAgICBfYmluZEV2ZW50c0ludGVyZmFjZSgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3NldEluaXR2YWwoKSB7XG4gICAgICAgIGlmIChzZXR0aW5ncy5pbml0dmFsICE9PSAnJyAmJiBvcmlnaW5hbGlucHV0LnZhbCgpID09PSAnJykge1xuICAgICAgICAgIG9yaWdpbmFsaW5wdXQudmFsKHNldHRpbmdzLmluaXR2YWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjaGFuZ2VTZXR0aW5ncyhuZXdzZXR0aW5ncykge1xuICAgICAgICBfdXBkYXRlU2V0dGluZ3MobmV3c2V0dGluZ3MpO1xuICAgICAgICBfY2hlY2tWYWx1ZSgpO1xuICAgICAgICB2YXIgdmFsdWUgPSBlbGVtZW50cy5pbnB1dC52YWwoKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSAnJykge1xuICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdChzZXR0aW5ncy5jYWxsYmFja19iZWZvcmVfY2FsY3VsYXRpb24oZWxlbWVudHMuaW5wdXQudmFsKCkpKTtcbiAgICAgICAgICBlbGVtZW50cy5pbnB1dC52YWwoc2V0dGluZ3MuY2FsbGJhY2tfYWZ0ZXJfY2FsY3VsYXRpb24ocGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscykpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2luaXRTZXR0aW5ncygpIHtcbiAgICAgICAgc2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9yaWdpbmFsaW5wdXRfZGF0YSwgX3BhcnNlQXR0cmlidXRlcygpLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2V0dGluZ3Muc3RlcCkgIT09IDEpIHtcbiAgICAgICAgICB2YXIgcmVtYWluZGVyO1xuXG4gICAgICAgICAgLy8gTW9kaWZ5IHNldHRpbmdzLm1heCB0byBiZSBkaXZpc2libGUgYnkgc3RlcFxuICAgICAgICAgIHJlbWFpbmRlciA9IHNldHRpbmdzLm1heCAlIHNldHRpbmdzLnN0ZXA7XG4gICAgICAgICAgaWYgKHJlbWFpbmRlciAhPT0gMCkge1xuICAgICAgICAgICAgc2V0dGluZ3MubWF4ID0gcGFyc2VGbG9hdChzZXR0aW5ncy5tYXgpIC0gcmVtYWluZGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERvIHRoZSBzYW1lIHdpdGggbWluLCBzaG91bGQgd29yayB3aXRoIG5lZ2F0aXZlIG51bWJlcnMgdG9vXG4gICAgICAgICAgcmVtYWluZGVyID0gc2V0dGluZ3MubWluICUgc2V0dGluZ3Muc3RlcDtcbiAgICAgICAgICBpZiAocmVtYWluZGVyICE9PSAwKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy5taW4gPSBwYXJzZUZsb2F0KHNldHRpbmdzLm1pbikgKyAocGFyc2VGbG9hdChzZXR0aW5ncy5zdGVwKSAtIHJlbWFpbmRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfcGFyc2VBdHRyaWJ1dGVzKCkge1xuICAgICAgICB2YXIgZGF0YSA9IHt9O1xuXG4gICAgICAgIC8vIFNldHRpbmcgdXAgYmFzZWQgb24gZGF0YSBhdHRyaWJ1dGVzXG4gICAgICAgICQuZWFjaChhdHRyaWJ1dGVNYXAsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgdmFyIGF0dHJOYW1lID0gJ2J0cy0nICsgdmFsdWUgKyAnJztcbiAgICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5pcygnW2RhdGEtJyArIGF0dHJOYW1lICsgJ10nKSkge1xuICAgICAgICAgICAgZGF0YVtrZXldID0gb3JpZ2luYWxpbnB1dC5kYXRhKGF0dHJOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNldHRpbmcgdXAgYmFzZWQgb24gaW5wdXQgYXR0cmlidXRlcyBpZiBzcGVjaWZpZWQgKGlucHV0IGF0dHJpYnV0ZXMgaGF2ZSBwcmVjZWRlbmNlKVxuICAgICAgICAkLmVhY2goWydtaW4nLCAnbWF4JywgJ3N0ZXAnXSwgZnVuY3Rpb24gKGksIGtleSkge1xuICAgICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCdbJyArIGtleSArICddJykpIHtcbiAgICAgICAgICAgIGlmIChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0JvdGggdGhlIFwiZGF0YS1idHMtJyArIGtleSArICdcIiBkYXRhIGF0dHJpYnV0ZSBhbmQgdGhlIFwiJyArIGtleSArICdcIiBpbmRpdmlkdWFsIGF0dHJpYnV0ZSB3ZXJlIHNwZWNpZmllZCwgdGhlIGluZGl2aWR1YWwgYXR0cmlidXRlIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG9uOiAnLCBvcmlnaW5hbGlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFba2V5XSA9IG9yaWdpbmFsaW5wdXQuYXR0cihrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2Rlc3Ryb3koKSB7XG4gICAgICAgIHZhciAkcGFyZW50ID0gb3JpZ2luYWxpbnB1dC5wYXJlbnQoKTtcbiAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5vZmYoJy50b3VjaHNwaW4nKTtcbiAgICAgICAgaWYgKCRwYXJlbnQuaGFzQ2xhc3MoJ2Jvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWQnKSkge1xuICAgICAgICAgIG9yaWdpbmFsaW5wdXQuc2libGluZ3MoKS5yZW1vdmUoKTtcbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnVud3JhcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoJy5ib290c3RyYXAtdG91Y2hzcGluLWluamVjdGVkJywgJHBhcmVudCkucmVtb3ZlKCk7XG4gICAgICAgICAgJHBhcmVudC5yZW1vdmVDbGFzcygnYm9vdHN0cmFwLXRvdWNoc3BpbicpO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbmFsaW5wdXQuZGF0YSgnYWxyZWFkeWluaXRpYWxpemVkJywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3VwZGF0ZVNldHRpbmdzKG5ld3NldHRpbmdzKSB7XG4gICAgICAgIHNldHRpbmdzID0gJC5leHRlbmQoe30sIHNldHRpbmdzLCBuZXdzZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHBvc3RmaXggYW5kIHByZWZpeCB0ZXh0cyBpZiB0aG9zZSBzZXR0aW5ncyB3ZXJlIGNoYW5nZWQuXG4gICAgICAgIGlmIChuZXdzZXR0aW5ncy5wb3N0Zml4KSB7XG4gICAgICAgICAgdmFyICRwb3N0Zml4ID0gb3JpZ2luYWxpbnB1dC5wYXJlbnQoKS5maW5kKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wb3N0Zml4Jyk7XG4gICAgICAgICAgaWYgKCRwb3N0Zml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgX2RldGFjaGVkX3Bvc3RmaXguaW5zZXJ0QWZ0ZXIob3JpZ2luYWxpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9yaWdpbmFsaW5wdXQucGFyZW50KCkuZmluZCgnLmJvb3RzdHJhcC10b3VjaHNwaW4tcG9zdGZpeCAuaW5wdXQtZ3JvdXAtdGV4dCcpLnRleHQobmV3c2V0dGluZ3MucG9zdGZpeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld3NldHRpbmdzLnByZWZpeCkge1xuICAgICAgICAgIHZhciAkcHJlZml4ID0gb3JpZ2luYWxpbnB1dC5wYXJlbnQoKS5maW5kKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXgnKTtcbiAgICAgICAgICBpZiAoJHByZWZpeC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIF9kZXRhY2hlZF9wcmVmaXguaW5zZXJ0QmVmb3JlKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnBhcmVudCgpLmZpbmQoJy5ib290c3RyYXAtdG91Y2hzcGluLXByZWZpeCAuaW5wdXQtZ3JvdXAtdGV4dCcpLnRleHQobmV3c2V0dGluZ3MucHJlZml4KTtcbiAgICAgICAgfVxuICAgICAgICBfaGlkZUVtcHR5UHJlZml4UG9zdGZpeCgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2J1aWxkSHRtbCgpIHtcbiAgICAgICAgdmFyIGluaXR2YWwgPSBvcmlnaW5hbGlucHV0LnZhbCgpLFxuICAgICAgICAgIHBhcmVudGVsZW1lbnQgPSBvcmlnaW5hbGlucHV0LnBhcmVudCgpO1xuICAgICAgICBpZiAoaW5pdHZhbCAhPT0gJycpIHtcbiAgICAgICAgICAvLyBpbml0dmFsIG1heSBub3QgYmUgcGFyc2FibGUgYXMgYSBudW1iZXIgKGNhbGxiYWNrX2FmdGVyX2NhbGN1bGF0aW9uKCkgbWF5IGRlY29yYXRlIGl0IHNvIGl0IGNhbnQgYmUgcGFyc2VkKS4gIFVzZSB0aGUgY2FsbGJhY2tzIGlmIHByb3ZpZGVkLlxuICAgICAgICAgIGluaXR2YWwgPSBzZXR0aW5ncy5jYWxsYmFja19iZWZvcmVfY2FsY3VsYXRpb24oaW5pdHZhbCk7XG4gICAgICAgICAgaW5pdHZhbCA9IHNldHRpbmdzLmNhbGxiYWNrX2FmdGVyX2NhbGN1bGF0aW9uKHBhcnNlRmxvYXQoaW5pdHZhbCkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscykpO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbmFsaW5wdXQuZGF0YSgnaW5pdHZhbHVlJywgaW5pdHZhbCkudmFsKGluaXR2YWwpO1xuICAgICAgICBvcmlnaW5hbGlucHV0LmFkZENsYXNzKCdmb3JtLWNvbnRyb2wnKTtcbiAgICAgICAgdmVydGljYWxidXR0b25zX2h0bWwgPSBcIlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gYm9vdHN0cmFwLXRvdWNoc3Bpbi12ZXJ0aWNhbC1idXR0b24td3JhcHBlclxcXCI+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWJ0bi12ZXJ0aWNhbFxcXCI+XFxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVxcXCItMVxcXCIgY2xhc3M9XFxcIlwiLmNvbmNhdChzZXR0aW5ncy5idXR0b25kb3duX2NsYXNzLCBcIiBib290c3RyYXAtdG91Y2hzcGluLXVwIFwiKS5jb25jYXQoc2V0dGluZ3MudmVydGljYWx1cGNsYXNzLCBcIlxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnZlcnRpY2FsdXAsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVxcXCItMVxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc2V0dGluZ3MuYnV0dG9udXBfY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tZG93biBcIikuY29uY2F0KHNldHRpbmdzLnZlcnRpY2FsZG93bmNsYXNzLCBcIlxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnZlcnRpY2FsZG93biwgXCI8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgXCIpO1xuICAgICAgICBpZiAocGFyZW50ZWxlbWVudC5oYXNDbGFzcygnaW5wdXQtZ3JvdXAnKSkge1xuICAgICAgICAgIF9hZHZhbmNlSW5wdXRHcm91cChwYXJlbnRlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfYnVpbGRJbnB1dEdyb3VwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9hZHZhbmNlSW5wdXRHcm91cChwYXJlbnRlbGVtZW50KSB7XG4gICAgICAgIHBhcmVudGVsZW1lbnQuYWRkQ2xhc3MoJ2Jvb3RzdHJhcC10b3VjaHNwaW4nKTtcbiAgICAgICAgdmFyIHByZXYgPSBvcmlnaW5hbGlucHV0LnByZXYoKSxcbiAgICAgICAgICBuZXh0ID0gb3JpZ2luYWxpbnB1dC5uZXh0KCk7XG4gICAgICAgIHZhciBkb3duaHRtbCxcbiAgICAgICAgICB1cGh0bWwsXG4gICAgICAgICAgcHJlZml4aHRtbCA9IFwiXFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGlucHV0LWdyb3VwLXByZXBlbmQgYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXggaW5wdXQtZ3JvdXAtcHJlcGVuZCBib290c3RyYXAtdG91Y2hzcGluLWluamVjdGVkXFxcIj5cXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC10ZXh0XFxcIj5cIi5jb25jYXQoc2V0dGluZ3MucHJlZml4LCBcIjwvc3Bhbj5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgIFwiKSxcbiAgICAgICAgICBwb3N0Zml4aHRtbCA9IFwiXFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGlucHV0LWdyb3VwLWFwcGVuZCBib290c3RyYXAtdG91Y2hzcGluLXBvc3RmaXggaW5wdXQtZ3JvdXAtYXBwZW5kIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLXRleHRcXFwiPlwiLmNvbmNhdChzZXR0aW5ncy5wb3N0Zml4LCBcIjwvc3Bhbj5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgIFwiKTtcbiAgICAgICAgaWYgKHNldHRpbmdzLnZlcnRpY2FsYnV0dG9ucykge1xuICAgICAgICAgICQodmVydGljYWxidXR0b25zX2h0bWwpLmluc2VydEFmdGVyKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChwcmV2Lmhhc0NsYXNzKCdpbnB1dC1ncm91cC1idG4nKSB8fCBwcmV2Lmhhc0NsYXNzKCdpbnB1dC1ncm91cC1wcmVwZW5kJykpIHtcbiAgICAgICAgICAgIGRvd25odG1sID0gXCJcXG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XFxcIi0xXFxcIiBjbGFzcz1cXFwiXCIuY29uY2F0KHNldHRpbmdzLmJ1dHRvbmRvd25fY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tZG93biBib290c3RyYXAtdG91Y2hzcGluLWluamVjdGVkXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiPlwiKS5jb25jYXQoc2V0dGluZ3MuYnV0dG9uZG93bl90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgXCIpO1xuICAgICAgICAgICAgcHJldi5hcHBlbmQoZG93bmh0bWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb3duaHRtbCA9IFwiXFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYnRuIGlucHV0LWdyb3VwLXByZXBlbmQgYm9vdHN0cmFwLXRvdWNoc3Bpbi1pbmplY3RlZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XFxcIi0xXFxcIiBjbGFzcz1cXFwiXCIuY29uY2F0KHNldHRpbmdzLmJ1dHRvbmRvd25fY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tZG93blxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIikuY29uY2F0KHNldHRpbmdzLmJ1dHRvbmRvd25fdHh0LCBcIjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIFwiKTtcbiAgICAgICAgICAgICQoZG93bmh0bWwpLmluc2VydEJlZm9yZShvcmlnaW5hbGlucHV0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5leHQuaGFzQ2xhc3MoJ2lucHV0LWdyb3VwLWJ0bicpIHx8IG5leHQuaGFzQ2xhc3MoJ2lucHV0LWdyb3VwLWFwcGVuZCcpKSB7XG4gICAgICAgICAgICB1cGh0bWwgPSBcIlxcbiAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XFxcIi0xXFxcIiBjbGFzcz1cXFwiXCIuY29uY2F0KHNldHRpbmdzLmJ1dHRvbnVwX2NsYXNzLCBcIiBib290c3RyYXAtdG91Y2hzcGluLXVwIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b251cF90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgIFwiKTtcbiAgICAgICAgICAgIG5leHQucHJlcGVuZCh1cGh0bWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cGh0bWwgPSBcIlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC1idG4gaW5wdXQtZ3JvdXAtYXBwZW5kIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiPlxcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cXFwiLTFcXFwiIGNsYXNzPVxcXCJcIi5jb25jYXQoc2V0dGluZ3MuYnV0dG9udXBfY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tdXBcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b251cF90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICBcIik7XG4gICAgICAgICAgICAkKHVwaHRtbCkuaW5zZXJ0QWZ0ZXIob3JpZ2luYWxpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICQocHJlZml4aHRtbCkuaW5zZXJ0QmVmb3JlKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICAkKHBvc3RmaXhodG1sKS5pbnNlcnRBZnRlcihvcmlnaW5hbGlucHV0KTtcbiAgICAgICAgY29udGFpbmVyID0gcGFyZW50ZWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9idWlsZElucHV0R3JvdXAoKSB7XG4gICAgICAgIHZhciBodG1sO1xuICAgICAgICB2YXIgaW5wdXRHcm91cFNpemUgPSAnJztcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaGFzQ2xhc3MoJ2lucHV0LXNtJykgfHwgb3JpZ2luYWxpbnB1dC5oYXNDbGFzcygnZm9ybS1jb250cm9sLXNtJykpIHtcbiAgICAgICAgICBpbnB1dEdyb3VwU2l6ZSA9ICdpbnB1dC1ncm91cC1zbSc7XG4gICAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxpbnB1dC5oYXNDbGFzcygnaW5wdXQtbGcnKSB8fCBvcmlnaW5hbGlucHV0Lmhhc0NsYXNzKCdmb3JtLWNvbnRyb2wtbGcnKSkge1xuICAgICAgICAgIGlucHV0R3JvdXBTaXplID0gJ2lucHV0LWdyb3VwLWxnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MudmVydGljYWxidXR0b25zKSB7XG4gICAgICAgICAgaHRtbCA9IFwiXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAgXCIuY29uY2F0KGlucHV0R3JvdXBTaXplLCBcIiBib290c3RyYXAtdG91Y2hzcGluIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGlucHV0LWdyb3VwLXByZXBlbmQgYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXhcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtdGV4dFxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5wcmVmaXgsIFwiPC9zcGFuPlxcbiAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGJvb3RzdHJhcC10b3VjaHNwaW4tcG9zdGZpeCBpbnB1dC1ncm91cC1hcHBlbmRcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtdGV4dFxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5wb3N0Zml4LCBcIjwvc3Bhbj5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgIFwiKS5jb25jYXQodmVydGljYWxidXR0b25zX2h0bWwsIFwiXFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodG1sID0gXCJcXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJpbnB1dC1ncm91cCBib290c3RyYXAtdG91Y2hzcGluIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWJ0biBpbnB1dC1ncm91cC1wcmVwZW5kXFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cXFwiLTFcXFwiIGNsYXNzPVxcXCJcIi5jb25jYXQoc2V0dGluZ3MuYnV0dG9uZG93bl9jbGFzcywgXCIgYm9vdHN0cmFwLXRvdWNoc3Bpbi1kb3duXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiPlwiKS5jb25jYXQoc2V0dGluZ3MuYnV0dG9uZG93bl90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXggaW5wdXQtZ3JvdXAtcHJlcGVuZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC10ZXh0XFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnByZWZpeCwgXCI8L3NwYW4+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gYm9vdHN0cmFwLXRvdWNoc3Bpbi1wb3N0Zml4IGlucHV0LWdyb3VwLWFwcGVuZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC10ZXh0XFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnBvc3RmaXgsIFwiPC9zcGFuPlxcbiAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWJ0biBpbnB1dC1ncm91cC1hcHBlbmRcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVxcXCItMVxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc2V0dGluZ3MuYnV0dG9udXBfY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tdXBcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b251cF90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5lciA9ICQoaHRtbCkuaW5zZXJ0QmVmb3JlKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICAkKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXgnLCBjb250YWluZXIpLmFmdGVyKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5oYXNDbGFzcygnaW5wdXQtc20nKSB8fCBvcmlnaW5hbGlucHV0Lmhhc0NsYXNzKCdmb3JtLWNvbnRyb2wtc20nKSkge1xuICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcygnaW5wdXQtZ3JvdXAtc20nKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbGlucHV0Lmhhc0NsYXNzKCdpbnB1dC1sZycpIHx8IG9yaWdpbmFsaW5wdXQuaGFzQ2xhc3MoJ2Zvcm0tY29udHJvbC1sZycpKSB7XG4gICAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKCdpbnB1dC1ncm91cC1sZycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfaW5pdEVsZW1lbnRzKCkge1xuICAgICAgICBlbGVtZW50cyA9IHtcbiAgICAgICAgICBkb3duOiAkKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1kb3duJywgY29udGFpbmVyKSxcbiAgICAgICAgICB1cDogJCgnLmJvb3RzdHJhcC10b3VjaHNwaW4tdXAnLCBjb250YWluZXIpLFxuICAgICAgICAgIGlucHV0OiAkKCdpbnB1dCcsIGNvbnRhaW5lciksXG4gICAgICAgICAgcHJlZml4OiAkKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXgnLCBjb250YWluZXIpLmFkZENsYXNzKHNldHRpbmdzLnByZWZpeF9leHRyYWNsYXNzKSxcbiAgICAgICAgICBwb3N0Zml4OiAkKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wb3N0Zml4JywgY29udGFpbmVyKS5hZGRDbGFzcyhzZXR0aW5ncy5wb3N0Zml4X2V4dHJhY2xhc3MpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfaGlkZUVtcHR5UHJlZml4UG9zdGZpeCgpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzLnByZWZpeCA9PT0gJycpIHtcbiAgICAgICAgICBfZGV0YWNoZWRfcHJlZml4ID0gZWxlbWVudHMucHJlZml4LmRldGFjaCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5wb3N0Zml4ID09PSAnJykge1xuICAgICAgICAgIF9kZXRhY2hlZF9wb3N0Zml4ID0gZWxlbWVudHMucG9zdGZpeC5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2JpbmRFdmVudHMoKSB7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ2tleWRvd24udG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgdmFyIGNvZGUgPSBldi5rZXlDb2RlIHx8IGV2LndoaWNoO1xuICAgICAgICAgIGlmIChjb2RlID09PSAzOCkge1xuICAgICAgICAgICAgaWYgKHNwaW5uaW5nICE9PSAndXAnKSB7XG4gICAgICAgICAgICAgIHVwT25jZSgpO1xuICAgICAgICAgICAgICBzdGFydFVwU3BpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDQwKSB7XG4gICAgICAgICAgICBpZiAoc3Bpbm5pbmcgIT09ICdkb3duJykge1xuICAgICAgICAgICAgICBkb3duT25jZSgpO1xuICAgICAgICAgICAgICBzdGFydERvd25TcGluKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gOSB8fCBjb2RlID09PSAxMykge1xuICAgICAgICAgICAgX2NoZWNrVmFsdWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCdrZXl1cC50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGV2LmtleUNvZGUgfHwgZXYud2hpY2g7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gNDApIHtcbiAgICAgICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjaGFuZ2UgaXMgZmlyZWQgYmVmb3JlIGJsdXIsIHNvIHdlIG5lZWQgdG8gd29yayBhcm91bmQgdGhhdFxuICAgICAgICAkKGRvY3VtZW50KS5vbignbW91c2Vkb3duIHRvdWNoc3RhcnQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmlzKG9yaWdpbmFsaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jaGVja1ZhbHVlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCdibHVyLnRvdWNoc3BpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfY2hlY2tWYWx1ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMuZG93bi5vbigna2V5ZG93bicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIHZhciBjb2RlID0gZXYua2V5Q29kZSB8fCBldi53aGljaDtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gMzIgfHwgY29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgIGlmIChzcGlubmluZyAhPT0gJ2Rvd24nKSB7XG4gICAgICAgICAgICAgIGRvd25PbmNlKCk7XG4gICAgICAgICAgICAgIHN0YXJ0RG93blNwaW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMuZG93bi5vbigna2V5dXAudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgdmFyIGNvZGUgPSBldi5rZXlDb2RlIHx8IGV2LndoaWNoO1xuICAgICAgICAgIGlmIChjb2RlID09PSAzMiB8fCBjb2RlID09PSAxMykge1xuICAgICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy51cC5vbigna2V5ZG93bi50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGV2LmtleUNvZGUgfHwgZXYud2hpY2g7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDMyIHx8IGNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBpZiAoc3Bpbm5pbmcgIT09ICd1cCcpIHtcbiAgICAgICAgICAgICAgdXBPbmNlKCk7XG4gICAgICAgICAgICAgIHN0YXJ0VXBTcGluKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLnVwLm9uKCdrZXl1cC50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGV2LmtleUNvZGUgfHwgZXYud2hpY2g7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDMyIHx8IGNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLmRvd24ub24oJ21vdXNlZG93bi50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICBlbGVtZW50cy5kb3duLm9mZigndG91Y2hzdGFydC50b3VjaHNwaW4nKTsgLy8gYW5kcm9pZCA0IHdvcmthcm91bmRcblxuICAgICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRvd25PbmNlKCk7XG4gICAgICAgICAgc3RhcnREb3duU3BpbigpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy5kb3duLm9uKCd0b3VjaHN0YXJ0LnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGVsZW1lbnRzLmRvd24ub2ZmKCdtb3VzZWRvd24udG91Y2hzcGluJyk7IC8vIGFuZHJvaWQgNCB3b3JrYXJvdW5kXG5cbiAgICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5pcygnOmRpc2FibGVkLFtyZWFkb25seV0nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb3duT25jZSgpO1xuICAgICAgICAgIHN0YXJ0RG93blNwaW4oKTtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMudXAub24oJ21vdXNlZG93bi50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICBlbGVtZW50cy51cC5vZmYoJ3RvdWNoc3RhcnQudG91Y2hzcGluJyk7IC8vIGFuZHJvaWQgNCB3b3JrYXJvdW5kXG5cbiAgICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5pcygnOmRpc2FibGVkLFtyZWFkb25seV0nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cE9uY2UoKTtcbiAgICAgICAgICBzdGFydFVwU3BpbigpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy51cC5vbigndG91Y2hzdGFydC50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICBlbGVtZW50cy51cC5vZmYoJ21vdXNlZG93bi50b3VjaHNwaW4nKTsgLy8gYW5kcm9pZCA0IHdvcmthcm91bmRcblxuICAgICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwT25jZSgpO1xuICAgICAgICAgIHN0YXJ0VXBTcGluKCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLnVwLm9uKCdtb3VzZXVwLnRvdWNoc3BpbiBtb3VzZW91dC50b3VjaHNwaW4gdG91Y2hsZWF2ZS50b3VjaHNwaW4gdG91Y2hlbmQudG91Y2hzcGluIHRvdWNoY2FuY2VsLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGlmICghc3Bpbm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLmRvd24ub24oJ21vdXNldXAudG91Y2hzcGluIG1vdXNlb3V0LnRvdWNoc3BpbiB0b3VjaGxlYXZlLnRvdWNoc3BpbiB0b3VjaGVuZC50b3VjaHNwaW4gdG91Y2hjYW5jZWwudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgaWYgKCFzcGlubmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMuZG93bi5vbignbW91c2Vtb3ZlLnRvdWNoc3BpbiB0b3VjaG1vdmUudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgaWYgKCFzcGlubmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMudXAub24oJ21vdXNlbW92ZS50b3VjaHNwaW4gdG91Y2htb3ZlLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGlmICghc3Bpbm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ21vdXNld2hlZWwudG91Y2hzcGluIERPTU1vdXNlU2Nyb2xsLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGlmICghc2V0dGluZ3MubW91c2V3aGVlbCB8fCAhb3JpZ2luYWxpbnB1dC5pcygnOmZvY3VzJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGRlbHRhID0gZXYub3JpZ2luYWxFdmVudC53aGVlbERlbHRhIHx8IC1ldi5vcmlnaW5hbEV2ZW50LmRlbHRhWSB8fCAtZXYub3JpZ2luYWxFdmVudC5kZXRhaWw7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBpZiAoZGVsdGEgPCAwKSB7XG4gICAgICAgICAgICBkb3duT25jZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cE9uY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2JpbmRFdmVudHNJbnRlcmZhY2UoKSB7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ3RvdWNoc3Bpbi5kZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF9kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCd0b3VjaHNwaW4udXBvbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgICAgdXBPbmNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCd0b3VjaHNwaW4uZG93bm9uY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgICBkb3duT25jZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5vbigndG91Y2hzcGluLnN0YXJ0dXBzcGluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN0YXJ0VXBTcGluKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCd0b3VjaHNwaW4uc3RhcnRkb3duc3BpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzdGFydERvd25TcGluKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCd0b3VjaHNwaW4uc3RvcHNwaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ3RvdWNoc3Bpbi51cGRhdGVzZXR0aW5ncycsIGZ1bmN0aW9uIChlLCBuZXdzZXR0aW5ncykge1xuICAgICAgICAgIGNoYW5nZVNldHRpbmdzKG5ld3NldHRpbmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfc2V0dXBNdXRhdGlvbk9ic2VydmVycygpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9ucykge1xuICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG11dGF0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycgJiYgKG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdkaXNhYmxlZCcgfHwgbXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ3JlYWRvbmx5JykpIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlQnV0dG9uRGlzYWJsZWRTdGF0ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKG9yaWdpbmFsaW5wdXRbMF0sIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2ZvcmNlc3RlcGRpdmlzaWJpbGl0eSh2YWx1ZSkge1xuICAgICAgICBzd2l0Y2ggKHNldHRpbmdzLmZvcmNlc3RlcGRpdmlzaWJpbGl0eSkge1xuICAgICAgICAgIGNhc2UgJ3JvdW5kJzpcbiAgICAgICAgICAgIHJldHVybiAoTWF0aC5yb3VuZCh2YWx1ZSAvIHNldHRpbmdzLnN0ZXApICogc2V0dGluZ3Muc3RlcCkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscyk7XG4gICAgICAgICAgY2FzZSAnZmxvb3InOlxuICAgICAgICAgICAgcmV0dXJuIChNYXRoLmZsb29yKHZhbHVlIC8gc2V0dGluZ3Muc3RlcCkgKiBzZXR0aW5ncy5zdGVwKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKTtcbiAgICAgICAgICBjYXNlICdjZWlsJzpcbiAgICAgICAgICAgIHJldHVybiAoTWF0aC5jZWlsKHZhbHVlIC8gc2V0dGluZ3Muc3RlcCkgKiBzZXR0aW5ncy5zdGVwKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoc2V0dGluZ3MuZGVjaW1hbHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfY2hlY2tWYWx1ZSgpIHtcbiAgICAgICAgdmFyIHZhbCwgcGFyc2VkdmFsLCByZXR1cm52YWw7XG4gICAgICAgIHZhbCA9IHNldHRpbmdzLmNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbihvcmlnaW5hbGlucHV0LnZhbCgpKTtcbiAgICAgICAgaWYgKHZhbCA9PT0gJycpIHtcbiAgICAgICAgICBpZiAoc2V0dGluZ3MucmVwbGFjZW1lbnR2YWwgIT09ICcnKSB7XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnZhbChzZXR0aW5ncy5yZXBsYWNlbWVudHZhbCk7XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLmRlY2ltYWxzID4gMCAmJiB2YWwgPT09ICcuJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXJzZWR2YWwgPSBwYXJzZUZsb2F0KHZhbCk7XG4gICAgICAgIGlmIChpc05hTihwYXJzZWR2YWwpKSB7XG4gICAgICAgICAgaWYgKHNldHRpbmdzLnJlcGxhY2VtZW50dmFsICE9PSAnJykge1xuICAgICAgICAgICAgcGFyc2VkdmFsID0gc2V0dGluZ3MucmVwbGFjZW1lbnR2YWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlZHZhbCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybnZhbCA9IHBhcnNlZHZhbDtcbiAgICAgICAgaWYgKHBhcnNlZHZhbC50b1N0cmluZygpICE9PSB2YWwpIHtcbiAgICAgICAgICByZXR1cm52YWwgPSBwYXJzZWR2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJudmFsID0gX2ZvcmNlc3RlcGRpdmlzaWJpbGl0eShwYXJzZWR2YWwpO1xuICAgICAgICBpZiAoc2V0dGluZ3MubWluICE9PSBudWxsICYmIHBhcnNlZHZhbCA8IHNldHRpbmdzLm1pbikge1xuICAgICAgICAgIHJldHVybnZhbCA9IHNldHRpbmdzLm1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MubWF4ICE9PSBudWxsICYmIHBhcnNlZHZhbCA+IHNldHRpbmdzLm1heCkge1xuICAgICAgICAgIHJldHVybnZhbCA9IHNldHRpbmdzLm1heDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VGbG9hdChwYXJzZWR2YWwpLnRvU3RyaW5nKCkgIT09IHBhcnNlRmxvYXQocmV0dXJudmFsKS50b1N0cmluZygpKSB7XG4gICAgICAgICAgb3JpZ2luYWxpbnB1dC52YWwocmV0dXJudmFsKTtcbiAgICAgICAgfVxuICAgICAgICBvcmlnaW5hbGlucHV0LnZhbChzZXR0aW5ncy5jYWxsYmFja19hZnRlcl9jYWxjdWxhdGlvbihwYXJzZUZsb2F0KHJldHVybnZhbCkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscykpKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9nZXRCb29zdGVkU3RlcCgpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncy5ib29zdGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHNldHRpbmdzLnN0ZXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGJvb3N0ZWQgPSBNYXRoLnBvdygyLCBNYXRoLmZsb29yKHNwaW5jb3VudCAvIHNldHRpbmdzLmJvb3N0YXQpKSAqIHNldHRpbmdzLnN0ZXA7XG4gICAgICAgICAgaWYgKHNldHRpbmdzLm1heGJvb3N0ZWRzdGVwKSB7XG4gICAgICAgICAgICBpZiAoYm9vc3RlZCA+IHNldHRpbmdzLm1heGJvb3N0ZWRzdGVwKSB7XG4gICAgICAgICAgICAgIGJvb3N0ZWQgPSBzZXR0aW5ncy5tYXhib29zdGVkc3RlcDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gYm9vc3RlZCkgKiBib29zdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoc2V0dGluZ3Muc3RlcCwgYm9vc3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHZhbHVlSWZJc05hTigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5maXJzdGNsaWNrdmFsdWVpZmVtcHR5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5maXJzdGNsaWNrdmFsdWVpZmVtcHR5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAoc2V0dGluZ3MubWluICsgc2V0dGluZ3MubWF4KSAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF91cGRhdGVCdXR0b25EaXNhYmxlZFN0YXRlKCkge1xuICAgICAgICB2YXIgaXNEaXNhYmxlZCA9IG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJyk7XG4gICAgICAgIGVsZW1lbnRzLnVwLnByb3AoJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7XG4gICAgICAgIGVsZW1lbnRzLmRvd24ucHJvcCgnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgICAgICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1cE9uY2UoKSB7XG4gICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIF9jaGVja1ZhbHVlKCk7XG4gICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdChzZXR0aW5ncy5jYWxsYmFja19iZWZvcmVfY2FsY3VsYXRpb24oZWxlbWVudHMuaW5wdXQudmFsKCkpKTtcbiAgICAgICAgdmFyIGluaXR2YWx1ZSA9IHZhbHVlO1xuICAgICAgICB2YXIgYm9vc3RlZHN0ZXA7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlSWZJc05hTigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvb3N0ZWRzdGVwID0gX2dldEJvb3N0ZWRTdGVwKCk7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZSArIGJvb3N0ZWRzdGVwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5tYXggIT09IG51bGwgJiYgdmFsdWUgPj0gc2V0dGluZ3MubWF4KSB7XG4gICAgICAgICAgdmFsdWUgPSBzZXR0aW5ncy5tYXg7XG4gICAgICAgICAgb3JpZ2luYWxpbnB1dC50cmlnZ2VyKCd0b3VjaHNwaW4ub24ubWF4Jyk7XG4gICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cy5pbnB1dC52YWwoc2V0dGluZ3MuY2FsbGJhY2tfYWZ0ZXJfY2FsY3VsYXRpb24ocGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscykpKTtcbiAgICAgICAgaWYgKGluaXR2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkb3duT25jZSgpIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX2NoZWNrVmFsdWUoKTtcbiAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHNldHRpbmdzLmNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbihlbGVtZW50cy5pbnB1dC52YWwoKSkpO1xuICAgICAgICB2YXIgaW5pdHZhbHVlID0gdmFsdWU7XG4gICAgICAgIHZhciBib29zdGVkc3RlcDtcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVJZklzTmFOKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYm9vc3RlZHN0ZXAgPSBfZ2V0Qm9vc3RlZFN0ZXAoKTtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlIC0gYm9vc3RlZHN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLm1pbiAhPT0gbnVsbCAmJiB2YWx1ZSA8PSBzZXR0aW5ncy5taW4pIHtcbiAgICAgICAgICB2YWx1ZSA9IHNldHRpbmdzLm1pbjtcbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5taW4nKTtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLmlucHV0LnZhbChzZXR0aW5ncy5jYWxsYmFja19hZnRlcl9jYWxjdWxhdGlvbihwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKSkpO1xuICAgICAgICBpZiAoaW5pdHZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHN0YXJ0RG93blNwaW4oKSB7XG4gICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgIHNwaW5jb3VudCA9IDA7XG4gICAgICAgIHNwaW5uaW5nID0gJ2Rvd24nO1xuICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdGFydHNwaW4nKTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC50cmlnZ2VyKCd0b3VjaHNwaW4ub24uc3RhcnRkb3duc3BpbicpO1xuICAgICAgICBkb3duRGVsYXlUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZG93blNwaW5UaW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNwaW5jb3VudCsrO1xuICAgICAgICAgICAgZG93bk9uY2UoKTtcbiAgICAgICAgICB9LCBzZXR0aW5ncy5zdGVwaW50ZXJ2YWwpO1xuICAgICAgICB9LCBzZXR0aW5ncy5zdGVwaW50ZXJ2YWxkZWxheSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBzdGFydFVwU3BpbigpIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgc3BpbmNvdW50ID0gMDtcbiAgICAgICAgc3Bpbm5pbmcgPSAndXAnO1xuICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdGFydHNwaW4nKTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC50cmlnZ2VyKCd0b3VjaHNwaW4ub24uc3RhcnR1cHNwaW4nKTtcbiAgICAgICAgdXBEZWxheVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1cFNwaW5UaW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNwaW5jb3VudCsrO1xuICAgICAgICAgICAgdXBPbmNlKCk7XG4gICAgICAgICAgfSwgc2V0dGluZ3Muc3RlcGludGVydmFsKTtcbiAgICAgICAgfSwgc2V0dGluZ3Muc3RlcGludGVydmFsZGVsYXkpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gc3RvcFNwaW4oKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChkb3duRGVsYXlUaW1lb3V0KTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHVwRGVsYXlUaW1lb3V0KTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChkb3duU3BpblRpbWVyKTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh1cFNwaW5UaW1lcik7XG4gICAgICAgIHN3aXRjaCAoc3Bpbm5pbmcpIHtcbiAgICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdG9wdXBzcGluJyk7XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdG9wc3BpbicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdG9wZG93bnNwaW4nKTtcbiAgICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcigndG91Y2hzcGluLm9uLnN0b3BzcGluJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzcGluY291bnQgPSAwO1xuICAgICAgICBzcGlubmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1qcXVlcnkuYm9vdHN0cmFwLXRvdWNoc3Bpbi5qcy5tYXBcbiIsIi8qIVxuICogQGZpbGVPdmVydmlldyBUb3VjaFN3aXBlIC0galF1ZXJ5IFBsdWdpblxuICogQHZlcnNpb24gMS42LjE4XG4gKlxuICogQGF1dGhvciBNYXR0IEJyeXNvbiBodHRwOi8vd3d3LmdpdGh1Yi5jb20vbWF0dGJyeXNvblxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWF0dGJyeXNvbi9Ub3VjaFN3aXBlLUpxdWVyeS1QbHVnaW5cbiAqIEBzZWUgaHR0cDovL2xhYnMucmFtcGludGVyYWN0aXZlLmNvLnVrL3RvdWNoU3dpcGUvXG4gKiBAc2VlIGh0dHA6Ly9wbHVnaW5zLmpxdWVyeS5jb20vcHJvamVjdC90b3VjaFN3aXBlXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgTWF0dCBCcnlzb25cbiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLlxuICpcbiAqL1xuIWZ1bmN0aW9uKGZhY3Rvcnkpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnk/ZGVmaW5lKFtcImpxdWVyeVwiXSxmYWN0b3J5KTpmYWN0b3J5KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP3JlcXVpcmUoXCJqcXVlcnlcIik6alF1ZXJ5KX0oZnVuY3Rpb24oJCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaW5pdChvcHRpb25zKXtyZXR1cm4hb3B0aW9uc3x8dm9pZCAwIT09b3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGx8fHZvaWQgMD09PW9wdGlvbnMuc3dpcGUmJnZvaWQgMD09PW9wdGlvbnMuc3dpcGVTdGF0dXN8fChvcHRpb25zLmFsbG93UGFnZVNjcm9sbD1OT05FKSx2b2lkIDAhPT1vcHRpb25zLmNsaWNrJiZ2b2lkIDA9PT1vcHRpb25zLnRhcCYmKG9wdGlvbnMudGFwPW9wdGlvbnMuY2xpY2spLG9wdGlvbnN8fChvcHRpb25zPXt9KSxvcHRpb25zPSQuZXh0ZW5kKHt9LCQuZm4uc3dpcGUuZGVmYXVsdHMsb3B0aW9ucyksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICR0aGlzPSQodGhpcykscGx1Z2luPSR0aGlzLmRhdGEoUExVR0lOX05TKTtwbHVnaW58fChwbHVnaW49bmV3IFRvdWNoU3dpcGUodGhpcyxvcHRpb25zKSwkdGhpcy5kYXRhKFBMVUdJTl9OUyxwbHVnaW4pKX0pfWZ1bmN0aW9uIFRvdWNoU3dpcGUoZWxlbWVudCxvcHRpb25zKXtmdW5jdGlvbiB0b3VjaFN0YXJ0KGpxRXZlbnQpe2lmKCEoZ2V0VG91Y2hJblByb2dyZXNzKCl8fCQoanFFdmVudC50YXJnZXQpLmNsb3Nlc3Qob3B0aW9ucy5leGNsdWRlZEVsZW1lbnRzLCRlbGVtZW50KS5sZW5ndGg+MCkpe3ZhciBldmVudD1qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ/anFFdmVudC5vcmlnaW5hbEV2ZW50OmpxRXZlbnQ7aWYoIWV2ZW50LnBvaW50ZXJUeXBlfHxcIm1vdXNlXCIhPWV2ZW50LnBvaW50ZXJUeXBlfHwwIT1vcHRpb25zLmZhbGxiYWNrVG9Nb3VzZUV2ZW50cyl7dmFyIHJldCx0b3VjaGVzPWV2ZW50LnRvdWNoZXMsZXZ0PXRvdWNoZXM/dG91Y2hlc1swXTpldmVudDtyZXR1cm4gcGhhc2U9UEhBU0VfU1RBUlQsdG91Y2hlcz9maW5nZXJDb3VudD10b3VjaGVzLmxlbmd0aDpvcHRpb25zLnByZXZlbnREZWZhdWx0RXZlbnRzIT09ITEmJmpxRXZlbnQucHJldmVudERlZmF1bHQoKSxkaXN0YW5jZT0wLGRpcmVjdGlvbj1udWxsLGN1cnJlbnREaXJlY3Rpb249bnVsbCxwaW5jaERpcmVjdGlvbj1udWxsLGR1cmF0aW9uPTAsc3RhcnRUb3VjaGVzRGlzdGFuY2U9MCxlbmRUb3VjaGVzRGlzdGFuY2U9MCxwaW5jaFpvb209MSxwaW5jaERpc3RhbmNlPTAsbWF4aW11bXNNYXA9Y3JlYXRlTWF4aW11bXNEYXRhKCksY2FuY2VsTXVsdGlGaW5nZXJSZWxlYXNlKCksY3JlYXRlRmluZ2VyRGF0YSgwLGV2dCksIXRvdWNoZXN8fGZpbmdlckNvdW50PT09b3B0aW9ucy5maW5nZXJzfHxvcHRpb25zLmZpbmdlcnM9PT1BTExfRklOR0VSU3x8aGFzUGluY2hlcygpPyhzdGFydFRpbWU9Z2V0VGltZVN0YW1wKCksMj09ZmluZ2VyQ291bnQmJihjcmVhdGVGaW5nZXJEYXRhKDEsdG91Y2hlc1sxXSksc3RhcnRUb3VjaGVzRGlzdGFuY2U9ZW5kVG91Y2hlc0Rpc3RhbmNlPWNhbGN1bGF0ZVRvdWNoZXNEaXN0YW5jZShmaW5nZXJEYXRhWzBdLnN0YXJ0LGZpbmdlckRhdGFbMV0uc3RhcnQpKSwob3B0aW9ucy5zd2lwZVN0YXR1c3x8b3B0aW9ucy5waW5jaFN0YXR1cykmJihyZXQ9dHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpKSk6cmV0PSExLHJldD09PSExPyhwaGFzZT1QSEFTRV9DQU5DRUwsdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpLHJldCk6KG9wdGlvbnMuaG9sZCYmKGhvbGRUaW1lb3V0PXNldFRpbWVvdXQoJC5wcm94eShmdW5jdGlvbigpeyRlbGVtZW50LnRyaWdnZXIoXCJob2xkXCIsW2V2ZW50LnRhcmdldF0pLG9wdGlvbnMuaG9sZCYmKHJldD1vcHRpb25zLmhvbGQuY2FsbCgkZWxlbWVudCxldmVudCxldmVudC50YXJnZXQpKX0sdGhpcyksb3B0aW9ucy5sb25nVGFwVGhyZXNob2xkKSksc2V0VG91Y2hJblByb2dyZXNzKCEwKSxudWxsKX19fWZ1bmN0aW9uIHRvdWNoTW92ZShqcUV2ZW50KXt2YXIgZXZlbnQ9anFFdmVudC5vcmlnaW5hbEV2ZW50P2pxRXZlbnQub3JpZ2luYWxFdmVudDpqcUV2ZW50O2lmKHBoYXNlIT09UEhBU0VfRU5EJiZwaGFzZSE9PVBIQVNFX0NBTkNFTCYmIWluTXVsdGlGaW5nZXJSZWxlYXNlKCkpe3ZhciByZXQsdG91Y2hlcz1ldmVudC50b3VjaGVzLGV2dD10b3VjaGVzP3RvdWNoZXNbMF06ZXZlbnQsY3VycmVudEZpbmdlcj11cGRhdGVGaW5nZXJEYXRhKGV2dCk7aWYoZW5kVGltZT1nZXRUaW1lU3RhbXAoKSx0b3VjaGVzJiYoZmluZ2VyQ291bnQ9dG91Y2hlcy5sZW5ndGgpLG9wdGlvbnMuaG9sZCYmY2xlYXJUaW1lb3V0KGhvbGRUaW1lb3V0KSxwaGFzZT1QSEFTRV9NT1ZFLDI9PWZpbmdlckNvdW50JiYoMD09c3RhcnRUb3VjaGVzRGlzdGFuY2U/KGNyZWF0ZUZpbmdlckRhdGEoMSx0b3VjaGVzWzFdKSxzdGFydFRvdWNoZXNEaXN0YW5jZT1lbmRUb3VjaGVzRGlzdGFuY2U9Y2FsY3VsYXRlVG91Y2hlc0Rpc3RhbmNlKGZpbmdlckRhdGFbMF0uc3RhcnQsZmluZ2VyRGF0YVsxXS5zdGFydCkpOih1cGRhdGVGaW5nZXJEYXRhKHRvdWNoZXNbMV0pLGVuZFRvdWNoZXNEaXN0YW5jZT1jYWxjdWxhdGVUb3VjaGVzRGlzdGFuY2UoZmluZ2VyRGF0YVswXS5lbmQsZmluZ2VyRGF0YVsxXS5lbmQpLHBpbmNoRGlyZWN0aW9uPWNhbGN1bGF0ZVBpbmNoRGlyZWN0aW9uKGZpbmdlckRhdGFbMF0uZW5kLGZpbmdlckRhdGFbMV0uZW5kKSkscGluY2hab29tPWNhbGN1bGF0ZVBpbmNoWm9vbShzdGFydFRvdWNoZXNEaXN0YW5jZSxlbmRUb3VjaGVzRGlzdGFuY2UpLHBpbmNoRGlzdGFuY2U9TWF0aC5hYnMoc3RhcnRUb3VjaGVzRGlzdGFuY2UtZW5kVG91Y2hlc0Rpc3RhbmNlKSksZmluZ2VyQ291bnQ9PT1vcHRpb25zLmZpbmdlcnN8fG9wdGlvbnMuZmluZ2Vycz09PUFMTF9GSU5HRVJTfHwhdG91Y2hlc3x8aGFzUGluY2hlcygpKXtpZihkaXJlY3Rpb249Y2FsY3VsYXRlRGlyZWN0aW9uKGN1cnJlbnRGaW5nZXIuc3RhcnQsY3VycmVudEZpbmdlci5lbmQpLGN1cnJlbnREaXJlY3Rpb249Y2FsY3VsYXRlRGlyZWN0aW9uKGN1cnJlbnRGaW5nZXIubGFzdCxjdXJyZW50RmluZ2VyLmVuZCksdmFsaWRhdGVEZWZhdWx0RXZlbnQoanFFdmVudCxjdXJyZW50RGlyZWN0aW9uKSxkaXN0YW5jZT1jYWxjdWxhdGVEaXN0YW5jZShjdXJyZW50RmluZ2VyLnN0YXJ0LGN1cnJlbnRGaW5nZXIuZW5kKSxkdXJhdGlvbj1jYWxjdWxhdGVEdXJhdGlvbigpLHNldE1heERpc3RhbmNlKGRpcmVjdGlvbixkaXN0YW5jZSkscmV0PXRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKSwhb3B0aW9ucy50cmlnZ2VyT25Ub3VjaEVuZHx8b3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlKXt2YXIgaW5Cb3VuZHM9ITA7aWYob3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlKXt2YXIgYm91bmRzPWdldGJvdW5kcyh0aGlzKTtpbkJvdW5kcz1pc0luQm91bmRzKGN1cnJlbnRGaW5nZXIuZW5kLGJvdW5kcyl9IW9wdGlvbnMudHJpZ2dlck9uVG91Y2hFbmQmJmluQm91bmRzP3BoYXNlPWdldE5leHRQaGFzZShQSEFTRV9NT1ZFKTpvcHRpb25zLnRyaWdnZXJPblRvdWNoTGVhdmUmJiFpbkJvdW5kcyYmKHBoYXNlPWdldE5leHRQaGFzZShQSEFTRV9FTkQpKSxwaGFzZSE9UEhBU0VfQ0FOQ0VMJiZwaGFzZSE9UEhBU0VfRU5EfHx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSl9fWVsc2UgcGhhc2U9UEhBU0VfQ0FOQ0VMLHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKTtyZXQ9PT0hMSYmKHBoYXNlPVBIQVNFX0NBTkNFTCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpfX1mdW5jdGlvbiB0b3VjaEVuZChqcUV2ZW50KXt2YXIgZXZlbnQ9anFFdmVudC5vcmlnaW5hbEV2ZW50P2pxRXZlbnQub3JpZ2luYWxFdmVudDpqcUV2ZW50LHRvdWNoZXM9ZXZlbnQudG91Y2hlcztpZih0b3VjaGVzKXtpZih0b3VjaGVzLmxlbmd0aCYmIWluTXVsdGlGaW5nZXJSZWxlYXNlKCkpcmV0dXJuIHN0YXJ0TXVsdGlGaW5nZXJSZWxlYXNlKGV2ZW50KSwhMDtpZih0b3VjaGVzLmxlbmd0aCYmaW5NdWx0aUZpbmdlclJlbGVhc2UoKSlyZXR1cm4hMH1yZXR1cm4gaW5NdWx0aUZpbmdlclJlbGVhc2UoKSYmKGZpbmdlckNvdW50PWZpbmdlckNvdW50QXRSZWxlYXNlKSxlbmRUaW1lPWdldFRpbWVTdGFtcCgpLGR1cmF0aW9uPWNhbGN1bGF0ZUR1cmF0aW9uKCksZGlkU3dpcGVCYWNrVG9DYW5jZWwoKXx8IXZhbGlkYXRlU3dpcGVEaXN0YW5jZSgpPyhwaGFzZT1QSEFTRV9DQU5DRUwsdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpKTpvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kfHxvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kPT09ITEmJnBoYXNlPT09UEhBU0VfTU9WRT8ob3B0aW9ucy5wcmV2ZW50RGVmYXVsdEV2ZW50cyE9PSExJiZqcUV2ZW50LmNhbmNlbGFibGUhPT0hMSYmanFFdmVudC5wcmV2ZW50RGVmYXVsdCgpLHBoYXNlPVBIQVNFX0VORCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpOiFvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kJiZoYXNUYXAoKT8ocGhhc2U9UEhBU0VfRU5ELHRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxUQVApKTpwaGFzZT09PVBIQVNFX01PVkUmJihwaGFzZT1QSEFTRV9DQU5DRUwsdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpKSxzZXRUb3VjaEluUHJvZ3Jlc3MoITEpLG51bGx9ZnVuY3Rpb24gdG91Y2hDYW5jZWwoKXtmaW5nZXJDb3VudD0wLGVuZFRpbWU9MCxzdGFydFRpbWU9MCxzdGFydFRvdWNoZXNEaXN0YW5jZT0wLGVuZFRvdWNoZXNEaXN0YW5jZT0wLHBpbmNoWm9vbT0xLGNhbmNlbE11bHRpRmluZ2VyUmVsZWFzZSgpLHNldFRvdWNoSW5Qcm9ncmVzcyghMSl9ZnVuY3Rpb24gdG91Y2hMZWF2ZShqcUV2ZW50KXt2YXIgZXZlbnQ9anFFdmVudC5vcmlnaW5hbEV2ZW50P2pxRXZlbnQub3JpZ2luYWxFdmVudDpqcUV2ZW50O29wdGlvbnMudHJpZ2dlck9uVG91Y2hMZWF2ZSYmKHBoYXNlPWdldE5leHRQaGFzZShQSEFTRV9FTkQpLHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKSl9ZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKCl7JGVsZW1lbnQub2ZmKFNUQVJUX0VWLHRvdWNoU3RhcnQpLCRlbGVtZW50Lm9mZihDQU5DRUxfRVYsdG91Y2hDYW5jZWwpLCRlbGVtZW50Lm9mZihNT1ZFX0VWLHRvdWNoTW92ZSksJGVsZW1lbnQub2ZmKEVORF9FVix0b3VjaEVuZCksTEVBVkVfRVYmJiRlbGVtZW50Lm9mZihMRUFWRV9FVix0b3VjaExlYXZlKSxzZXRUb3VjaEluUHJvZ3Jlc3MoITEpfWZ1bmN0aW9uIGdldE5leHRQaGFzZShjdXJyZW50UGhhc2Upe3ZhciBuZXh0UGhhc2U9Y3VycmVudFBoYXNlLHZhbGlkVGltZT12YWxpZGF0ZVN3aXBlVGltZSgpLHZhbGlkRGlzdGFuY2U9dmFsaWRhdGVTd2lwZURpc3RhbmNlKCksZGlkQ2FuY2VsPWRpZFN3aXBlQmFja1RvQ2FuY2VsKCk7cmV0dXJuIXZhbGlkVGltZXx8ZGlkQ2FuY2VsP25leHRQaGFzZT1QSEFTRV9DQU5DRUw6IXZhbGlkRGlzdGFuY2V8fGN1cnJlbnRQaGFzZSE9UEhBU0VfTU9WRXx8b3B0aW9ucy50cmlnZ2VyT25Ub3VjaEVuZCYmIW9wdGlvbnMudHJpZ2dlck9uVG91Y2hMZWF2ZT8hdmFsaWREaXN0YW5jZSYmY3VycmVudFBoYXNlPT1QSEFTRV9FTkQmJm9wdGlvbnMudHJpZ2dlck9uVG91Y2hMZWF2ZSYmKG5leHRQaGFzZT1QSEFTRV9DQU5DRUwpOm5leHRQaGFzZT1QSEFTRV9FTkQsbmV4dFBoYXNlfWZ1bmN0aW9uIHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKXt2YXIgcmV0LHRvdWNoZXM9ZXZlbnQudG91Y2hlcztyZXR1cm4oZGlkU3dpcGUoKXx8aGFzU3dpcGVzKCkpJiYocmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxTV0lQRSkpLChkaWRQaW5jaCgpfHxoYXNQaW5jaGVzKCkpJiZyZXQhPT0hMSYmKHJldD10cmlnZ2VySGFuZGxlckZvckdlc3R1cmUoZXZlbnQscGhhc2UsUElOQ0gpKSxkaWREb3VibGVUYXAoKSYmcmV0IT09ITE/cmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxET1VCTEVfVEFQKTpkaWRMb25nVGFwKCkmJnJldCE9PSExP3JldD10cmlnZ2VySGFuZGxlckZvckdlc3R1cmUoZXZlbnQscGhhc2UsTE9OR19UQVApOmRpZFRhcCgpJiZyZXQhPT0hMSYmKHJldD10cmlnZ2VySGFuZGxlckZvckdlc3R1cmUoZXZlbnQscGhhc2UsVEFQKSkscGhhc2U9PT1QSEFTRV9DQU5DRUwmJnRvdWNoQ2FuY2VsKGV2ZW50KSxwaGFzZT09PVBIQVNFX0VORCYmKHRvdWNoZXM/dG91Y2hlcy5sZW5ndGh8fHRvdWNoQ2FuY2VsKGV2ZW50KTp0b3VjaENhbmNlbChldmVudCkpLHJldH1mdW5jdGlvbiB0cmlnZ2VySGFuZGxlckZvckdlc3R1cmUoZXZlbnQscGhhc2UsZ2VzdHVyZSl7dmFyIHJldDtpZihnZXN0dXJlPT1TV0lQRSl7aWYoJGVsZW1lbnQudHJpZ2dlcihcInN3aXBlU3RhdHVzXCIsW3BoYXNlLGRpcmVjdGlvbnx8bnVsbCxkaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlU3RhdHVzJiYocmV0PW9wdGlvbnMuc3dpcGVTdGF0dXMuY2FsbCgkZWxlbWVudCxldmVudCxwaGFzZSxkaXJlY3Rpb258fG51bGwsZGlzdGFuY2V8fDAsZHVyYXRpb258fDAsZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uKSxyZXQ9PT0hMSkpcmV0dXJuITE7aWYocGhhc2U9PVBIQVNFX0VORCYmdmFsaWRhdGVTd2lwZSgpKXtpZihjbGVhclRpbWVvdXQoc2luZ2xlVGFwVGltZW91dCksY2xlYXJUaW1lb3V0KGhvbGRUaW1lb3V0KSwkZWxlbWVudC50cmlnZ2VyKFwic3dpcGVcIixbZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbl0pLG9wdGlvbnMuc3dpcGUmJihyZXQ9b3B0aW9ucy5zd2lwZS5jYWxsKCRlbGVtZW50LGV2ZW50LGRpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pLHJldD09PSExKSlyZXR1cm4hMTtzd2l0Y2goZGlyZWN0aW9uKXtjYXNlIExFRlQ6JGVsZW1lbnQudHJpZ2dlcihcInN3aXBlTGVmdFwiLFtkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uXSksb3B0aW9ucy5zd2lwZUxlZnQmJihyZXQ9b3B0aW9ucy5zd2lwZUxlZnQuY2FsbCgkZWxlbWVudCxldmVudCxkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uKSk7YnJlYWs7Y2FzZSBSSUdIVDokZWxlbWVudC50cmlnZ2VyKFwic3dpcGVSaWdodFwiLFtkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uXSksb3B0aW9ucy5zd2lwZVJpZ2h0JiYocmV0PW9wdGlvbnMuc3dpcGVSaWdodC5jYWxsKCRlbGVtZW50LGV2ZW50LGRpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pKTticmVhaztjYXNlIFVQOiRlbGVtZW50LnRyaWdnZXIoXCJzd2lwZVVwXCIsW2RpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlVXAmJihyZXQ9b3B0aW9ucy5zd2lwZVVwLmNhbGwoJGVsZW1lbnQsZXZlbnQsZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbikpO2JyZWFrO2Nhc2UgRE9XTjokZWxlbWVudC50cmlnZ2VyKFwic3dpcGVEb3duXCIsW2RpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlRG93biYmKHJldD1vcHRpb25zLnN3aXBlRG93bi5jYWxsKCRlbGVtZW50LGV2ZW50LGRpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pKX19fWlmKGdlc3R1cmU9PVBJTkNIKXtpZigkZWxlbWVudC50cmlnZ2VyKFwicGluY2hTdGF0dXNcIixbcGhhc2UscGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YV0pLG9wdGlvbnMucGluY2hTdGF0dXMmJihyZXQ9b3B0aW9ucy5waW5jaFN0YXR1cy5jYWxsKCRlbGVtZW50LGV2ZW50LHBoYXNlLHBpbmNoRGlyZWN0aW9ufHxudWxsLHBpbmNoRGlzdGFuY2V8fDAsZHVyYXRpb258fDAsZmluZ2VyQ291bnQscGluY2hab29tLGZpbmdlckRhdGEpLHJldD09PSExKSlyZXR1cm4hMTtpZihwaGFzZT09UEhBU0VfRU5EJiZ2YWxpZGF0ZVBpbmNoKCkpc3dpdGNoKHBpbmNoRGlyZWN0aW9uKXtjYXNlIElOOiRlbGVtZW50LnRyaWdnZXIoXCJwaW5jaEluXCIsW3BpbmNoRGlyZWN0aW9ufHxudWxsLHBpbmNoRGlzdGFuY2V8fDAsZHVyYXRpb258fDAsZmluZ2VyQ291bnQscGluY2hab29tLGZpbmdlckRhdGFdKSxvcHRpb25zLnBpbmNoSW4mJihyZXQ9b3B0aW9ucy5waW5jaEluLmNhbGwoJGVsZW1lbnQsZXZlbnQscGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YSkpO2JyZWFrO2Nhc2UgT1VUOiRlbGVtZW50LnRyaWdnZXIoXCJwaW5jaE91dFwiLFtwaW5jaERpcmVjdGlvbnx8bnVsbCxwaW5jaERpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LHBpbmNoWm9vbSxmaW5nZXJEYXRhXSksb3B0aW9ucy5waW5jaE91dCYmKHJldD1vcHRpb25zLnBpbmNoT3V0LmNhbGwoJGVsZW1lbnQsZXZlbnQscGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YSkpfX1yZXR1cm4gZ2VzdHVyZT09VEFQP3BoYXNlIT09UEhBU0VfQ0FOQ0VMJiZwaGFzZSE9PVBIQVNFX0VORHx8KGNsZWFyVGltZW91dChzaW5nbGVUYXBUaW1lb3V0KSxjbGVhclRpbWVvdXQoaG9sZFRpbWVvdXQpLGhhc0RvdWJsZVRhcCgpJiYhaW5Eb3VibGVUYXAoKT8oZG91YmxlVGFwU3RhcnRUaW1lPWdldFRpbWVTdGFtcCgpLHNpbmdsZVRhcFRpbWVvdXQ9c2V0VGltZW91dCgkLnByb3h5KGZ1bmN0aW9uKCl7ZG91YmxlVGFwU3RhcnRUaW1lPW51bGwsJGVsZW1lbnQudHJpZ2dlcihcInRhcFwiLFtldmVudC50YXJnZXRdKSxvcHRpb25zLnRhcCYmKHJldD1vcHRpb25zLnRhcC5jYWxsKCRlbGVtZW50LGV2ZW50LGV2ZW50LnRhcmdldCkpfSx0aGlzKSxvcHRpb25zLmRvdWJsZVRhcFRocmVzaG9sZCkpOihkb3VibGVUYXBTdGFydFRpbWU9bnVsbCwkZWxlbWVudC50cmlnZ2VyKFwidGFwXCIsW2V2ZW50LnRhcmdldF0pLG9wdGlvbnMudGFwJiYocmV0PW9wdGlvbnMudGFwLmNhbGwoJGVsZW1lbnQsZXZlbnQsZXZlbnQudGFyZ2V0KSkpKTpnZXN0dXJlPT1ET1VCTEVfVEFQP3BoYXNlIT09UEhBU0VfQ0FOQ0VMJiZwaGFzZSE9PVBIQVNFX0VORHx8KGNsZWFyVGltZW91dChzaW5nbGVUYXBUaW1lb3V0KSxjbGVhclRpbWVvdXQoaG9sZFRpbWVvdXQpLGRvdWJsZVRhcFN0YXJ0VGltZT1udWxsLCRlbGVtZW50LnRyaWdnZXIoXCJkb3VibGV0YXBcIixbZXZlbnQudGFyZ2V0XSksb3B0aW9ucy5kb3VibGVUYXAmJihyZXQ9b3B0aW9ucy5kb3VibGVUYXAuY2FsbCgkZWxlbWVudCxldmVudCxldmVudC50YXJnZXQpKSk6Z2VzdHVyZT09TE9OR19UQVAmJihwaGFzZSE9PVBIQVNFX0NBTkNFTCYmcGhhc2UhPT1QSEFTRV9FTkR8fChjbGVhclRpbWVvdXQoc2luZ2xlVGFwVGltZW91dCksZG91YmxlVGFwU3RhcnRUaW1lPW51bGwsJGVsZW1lbnQudHJpZ2dlcihcImxvbmd0YXBcIixbZXZlbnQudGFyZ2V0XSksb3B0aW9ucy5sb25nVGFwJiYocmV0PW9wdGlvbnMubG9uZ1RhcC5jYWxsKCRlbGVtZW50LGV2ZW50LGV2ZW50LnRhcmdldCkpKSkscmV0fWZ1bmN0aW9uIHZhbGlkYXRlU3dpcGVEaXN0YW5jZSgpe3ZhciB2YWxpZD0hMDtyZXR1cm4gbnVsbCE9PW9wdGlvbnMudGhyZXNob2xkJiYodmFsaWQ9ZGlzdGFuY2U+PW9wdGlvbnMudGhyZXNob2xkKSx2YWxpZH1mdW5jdGlvbiBkaWRTd2lwZUJhY2tUb0NhbmNlbCgpe3ZhciBjYW5jZWxsZWQ9ITE7cmV0dXJuIG51bGwhPT1vcHRpb25zLmNhbmNlbFRocmVzaG9sZCYmbnVsbCE9PWRpcmVjdGlvbiYmKGNhbmNlbGxlZD1nZXRNYXhEaXN0YW5jZShkaXJlY3Rpb24pLWRpc3RhbmNlPj1vcHRpb25zLmNhbmNlbFRocmVzaG9sZCksY2FuY2VsbGVkfWZ1bmN0aW9uIHZhbGlkYXRlUGluY2hEaXN0YW5jZSgpe3JldHVybiBudWxsIT09b3B0aW9ucy5waW5jaFRocmVzaG9sZD9waW5jaERpc3RhbmNlPj1vcHRpb25zLnBpbmNoVGhyZXNob2xkOiEwfWZ1bmN0aW9uIHZhbGlkYXRlU3dpcGVUaW1lKCl7dmFyIHJlc3VsdDtyZXR1cm4gcmVzdWx0PW9wdGlvbnMubWF4VGltZVRocmVzaG9sZD8hKGR1cmF0aW9uPj1vcHRpb25zLm1heFRpbWVUaHJlc2hvbGQpOiEwfWZ1bmN0aW9uIHZhbGlkYXRlRGVmYXVsdEV2ZW50KGpxRXZlbnQsZGlyZWN0aW9uKXtpZihvcHRpb25zLnByZXZlbnREZWZhdWx0RXZlbnRzIT09ITEpaWYob3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGw9PT1OT05FKWpxRXZlbnQucHJldmVudERlZmF1bHQoKTtlbHNle3ZhciBhdXRvPW9wdGlvbnMuYWxsb3dQYWdlU2Nyb2xsPT09QVVUTztzd2l0Y2goZGlyZWN0aW9uKXtjYXNlIExFRlQ6KG9wdGlvbnMuc3dpcGVMZWZ0JiZhdXRvfHwhYXV0byYmb3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGwhPUhPUklaT05UQUwpJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBSSUdIVDoob3B0aW9ucy5zd2lwZVJpZ2h0JiZhdXRvfHwhYXV0byYmb3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGwhPUhPUklaT05UQUwpJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBVUDoob3B0aW9ucy5zd2lwZVVwJiZhdXRvfHwhYXV0byYmb3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGwhPVZFUlRJQ0FMKSYmanFFdmVudC5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgRE9XTjoob3B0aW9ucy5zd2lwZURvd24mJmF1dG98fCFhdXRvJiZvcHRpb25zLmFsbG93UGFnZVNjcm9sbCE9VkVSVElDQUwpJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBOT05FOn19fWZ1bmN0aW9uIHZhbGlkYXRlUGluY2goKXt2YXIgaGFzQ29ycmVjdEZpbmdlckNvdW50PXZhbGlkYXRlRmluZ2VycygpLGhhc0VuZFBvaW50PXZhbGlkYXRlRW5kUG9pbnQoKSxoYXNDb3JyZWN0RGlzdGFuY2U9dmFsaWRhdGVQaW5jaERpc3RhbmNlKCk7cmV0dXJuIGhhc0NvcnJlY3RGaW5nZXJDb3VudCYmaGFzRW5kUG9pbnQmJmhhc0NvcnJlY3REaXN0YW5jZX1mdW5jdGlvbiBoYXNQaW5jaGVzKCl7cmV0dXJuISEob3B0aW9ucy5waW5jaFN0YXR1c3x8b3B0aW9ucy5waW5jaElufHxvcHRpb25zLnBpbmNoT3V0KX1mdW5jdGlvbiBkaWRQaW5jaCgpe3JldHVybiEoIXZhbGlkYXRlUGluY2goKXx8IWhhc1BpbmNoZXMoKSl9ZnVuY3Rpb24gdmFsaWRhdGVTd2lwZSgpe3ZhciBoYXNWYWxpZFRpbWU9dmFsaWRhdGVTd2lwZVRpbWUoKSxoYXNWYWxpZERpc3RhbmNlPXZhbGlkYXRlU3dpcGVEaXN0YW5jZSgpLGhhc0NvcnJlY3RGaW5nZXJDb3VudD12YWxpZGF0ZUZpbmdlcnMoKSxoYXNFbmRQb2ludD12YWxpZGF0ZUVuZFBvaW50KCksZGlkQ2FuY2VsPWRpZFN3aXBlQmFja1RvQ2FuY2VsKCksdmFsaWQ9IWRpZENhbmNlbCYmaGFzRW5kUG9pbnQmJmhhc0NvcnJlY3RGaW5nZXJDb3VudCYmaGFzVmFsaWREaXN0YW5jZSYmaGFzVmFsaWRUaW1lO3JldHVybiB2YWxpZH1mdW5jdGlvbiBoYXNTd2lwZXMoKXtyZXR1cm4hIShvcHRpb25zLnN3aXBlfHxvcHRpb25zLnN3aXBlU3RhdHVzfHxvcHRpb25zLnN3aXBlTGVmdHx8b3B0aW9ucy5zd2lwZVJpZ2h0fHxvcHRpb25zLnN3aXBlVXB8fG9wdGlvbnMuc3dpcGVEb3duKX1mdW5jdGlvbiBkaWRTd2lwZSgpe3JldHVybiEoIXZhbGlkYXRlU3dpcGUoKXx8IWhhc1N3aXBlcygpKX1mdW5jdGlvbiB2YWxpZGF0ZUZpbmdlcnMoKXtyZXR1cm4gZmluZ2VyQ291bnQ9PT1vcHRpb25zLmZpbmdlcnN8fG9wdGlvbnMuZmluZ2Vycz09PUFMTF9GSU5HRVJTfHwhU1VQUE9SVFNfVE9VQ0h9ZnVuY3Rpb24gdmFsaWRhdGVFbmRQb2ludCgpe3JldHVybiAwIT09ZmluZ2VyRGF0YVswXS5lbmQueH1mdW5jdGlvbiBoYXNUYXAoKXtyZXR1cm4hIW9wdGlvbnMudGFwfWZ1bmN0aW9uIGhhc0RvdWJsZVRhcCgpe3JldHVybiEhb3B0aW9ucy5kb3VibGVUYXB9ZnVuY3Rpb24gaGFzTG9uZ1RhcCgpe3JldHVybiEhb3B0aW9ucy5sb25nVGFwfWZ1bmN0aW9uIHZhbGlkYXRlRG91YmxlVGFwKCl7aWYobnVsbD09ZG91YmxlVGFwU3RhcnRUaW1lKXJldHVybiExO3ZhciBub3c9Z2V0VGltZVN0YW1wKCk7cmV0dXJuIGhhc0RvdWJsZVRhcCgpJiZub3ctZG91YmxlVGFwU3RhcnRUaW1lPD1vcHRpb25zLmRvdWJsZVRhcFRocmVzaG9sZH1mdW5jdGlvbiBpbkRvdWJsZVRhcCgpe3JldHVybiB2YWxpZGF0ZURvdWJsZVRhcCgpfWZ1bmN0aW9uIHZhbGlkYXRlVGFwKCl7cmV0dXJuKDE9PT1maW5nZXJDb3VudHx8IVNVUFBPUlRTX1RPVUNIKSYmKGlzTmFOKGRpc3RhbmNlKXx8ZGlzdGFuY2U8b3B0aW9ucy50aHJlc2hvbGQpfWZ1bmN0aW9uIHZhbGlkYXRlTG9uZ1RhcCgpe3JldHVybiBkdXJhdGlvbj5vcHRpb25zLmxvbmdUYXBUaHJlc2hvbGQmJkRPVUJMRV9UQVBfVEhSRVNIT0xEPmRpc3RhbmNlfWZ1bmN0aW9uIGRpZFRhcCgpe3JldHVybiEoIXZhbGlkYXRlVGFwKCl8fCFoYXNUYXAoKSl9ZnVuY3Rpb24gZGlkRG91YmxlVGFwKCl7cmV0dXJuISghdmFsaWRhdGVEb3VibGVUYXAoKXx8IWhhc0RvdWJsZVRhcCgpKX1mdW5jdGlvbiBkaWRMb25nVGFwKCl7cmV0dXJuISghdmFsaWRhdGVMb25nVGFwKCl8fCFoYXNMb25nVGFwKCkpfWZ1bmN0aW9uIHN0YXJ0TXVsdGlGaW5nZXJSZWxlYXNlKGV2ZW50KXtwcmV2aW91c1RvdWNoRW5kVGltZT1nZXRUaW1lU3RhbXAoKSxmaW5nZXJDb3VudEF0UmVsZWFzZT1ldmVudC50b3VjaGVzLmxlbmd0aCsxfWZ1bmN0aW9uIGNhbmNlbE11bHRpRmluZ2VyUmVsZWFzZSgpe3ByZXZpb3VzVG91Y2hFbmRUaW1lPTAsZmluZ2VyQ291bnRBdFJlbGVhc2U9MH1mdW5jdGlvbiBpbk11bHRpRmluZ2VyUmVsZWFzZSgpe3ZhciB3aXRoaW5UaHJlc2hvbGQ9ITE7aWYocHJldmlvdXNUb3VjaEVuZFRpbWUpe3ZhciBkaWZmPWdldFRpbWVTdGFtcCgpLXByZXZpb3VzVG91Y2hFbmRUaW1lO2RpZmY8PW9wdGlvbnMuZmluZ2VyUmVsZWFzZVRocmVzaG9sZCYmKHdpdGhpblRocmVzaG9sZD0hMCl9cmV0dXJuIHdpdGhpblRocmVzaG9sZH1mdW5jdGlvbiBnZXRUb3VjaEluUHJvZ3Jlc3MoKXtyZXR1cm4hKCRlbGVtZW50LmRhdGEoUExVR0lOX05TK1wiX2ludG91Y2hcIikhPT0hMCl9ZnVuY3Rpb24gc2V0VG91Y2hJblByb2dyZXNzKHZhbCl7JGVsZW1lbnQmJih2YWw9PT0hMD8oJGVsZW1lbnQub24oTU9WRV9FVix0b3VjaE1vdmUpLCRlbGVtZW50Lm9uKEVORF9FVix0b3VjaEVuZCksTEVBVkVfRVYmJiRlbGVtZW50Lm9uKExFQVZFX0VWLHRvdWNoTGVhdmUpKTooJGVsZW1lbnQub2ZmKE1PVkVfRVYsdG91Y2hNb3ZlLCExKSwkZWxlbWVudC5vZmYoRU5EX0VWLHRvdWNoRW5kLCExKSxMRUFWRV9FViYmJGVsZW1lbnQub2ZmKExFQVZFX0VWLHRvdWNoTGVhdmUsITEpKSwkZWxlbWVudC5kYXRhKFBMVUdJTl9OUytcIl9pbnRvdWNoXCIsdmFsPT09ITApKX1mdW5jdGlvbiBjcmVhdGVGaW5nZXJEYXRhKGlkLGV2dCl7dmFyIGY9e3N0YXJ0Ont4OjAseTowfSxsYXN0Ont4OjAseTowfSxlbmQ6e3g6MCx5OjB9fTtyZXR1cm4gZi5zdGFydC54PWYubGFzdC54PWYuZW5kLng9ZXZ0LnBhZ2VYfHxldnQuY2xpZW50WCxmLnN0YXJ0Lnk9Zi5sYXN0Lnk9Zi5lbmQueT1ldnQucGFnZVl8fGV2dC5jbGllbnRZLGZpbmdlckRhdGFbaWRdPWYsZn1mdW5jdGlvbiB1cGRhdGVGaW5nZXJEYXRhKGV2dCl7dmFyIGlkPXZvaWQgMCE9PWV2dC5pZGVudGlmaWVyP2V2dC5pZGVudGlmaWVyOjAsZj1nZXRGaW5nZXJEYXRhKGlkKTtyZXR1cm4gbnVsbD09PWYmJihmPWNyZWF0ZUZpbmdlckRhdGEoaWQsZXZ0KSksZi5sYXN0Lng9Zi5lbmQueCxmLmxhc3QueT1mLmVuZC55LGYuZW5kLng9ZXZ0LnBhZ2VYfHxldnQuY2xpZW50WCxmLmVuZC55PWV2dC5wYWdlWXx8ZXZ0LmNsaWVudFksZn1mdW5jdGlvbiBnZXRGaW5nZXJEYXRhKGlkKXtyZXR1cm4gZmluZ2VyRGF0YVtpZF18fG51bGx9ZnVuY3Rpb24gc2V0TWF4RGlzdGFuY2UoZGlyZWN0aW9uLGRpc3RhbmNlKXtkaXJlY3Rpb24hPU5PTkUmJihkaXN0YW5jZT1NYXRoLm1heChkaXN0YW5jZSxnZXRNYXhEaXN0YW5jZShkaXJlY3Rpb24pKSxtYXhpbXVtc01hcFtkaXJlY3Rpb25dLmRpc3RhbmNlPWRpc3RhbmNlKX1mdW5jdGlvbiBnZXRNYXhEaXN0YW5jZShkaXJlY3Rpb24pe3JldHVybiBtYXhpbXVtc01hcFtkaXJlY3Rpb25dP21heGltdW1zTWFwW2RpcmVjdGlvbl0uZGlzdGFuY2U6dm9pZCAwfWZ1bmN0aW9uIGNyZWF0ZU1heGltdW1zRGF0YSgpe3ZhciBtYXhEYXRhPXt9O3JldHVybiBtYXhEYXRhW0xFRlRdPWNyZWF0ZU1heGltdW1WTyhMRUZUKSxtYXhEYXRhW1JJR0hUXT1jcmVhdGVNYXhpbXVtVk8oUklHSFQpLG1heERhdGFbVVBdPWNyZWF0ZU1heGltdW1WTyhVUCksbWF4RGF0YVtET1dOXT1jcmVhdGVNYXhpbXVtVk8oRE9XTiksbWF4RGF0YX1mdW5jdGlvbiBjcmVhdGVNYXhpbXVtVk8oZGlyKXtyZXR1cm57ZGlyZWN0aW9uOmRpcixkaXN0YW5jZTowfX1mdW5jdGlvbiBjYWxjdWxhdGVEdXJhdGlvbigpe3JldHVybiBlbmRUaW1lLXN0YXJ0VGltZX1mdW5jdGlvbiBjYWxjdWxhdGVUb3VjaGVzRGlzdGFuY2Uoc3RhcnRQb2ludCxlbmRQb2ludCl7dmFyIGRpZmZYPU1hdGguYWJzKHN0YXJ0UG9pbnQueC1lbmRQb2ludC54KSxkaWZmWT1NYXRoLmFicyhzdGFydFBvaW50LnktZW5kUG9pbnQueSk7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5zcXJ0KGRpZmZYKmRpZmZYK2RpZmZZKmRpZmZZKSl9ZnVuY3Rpb24gY2FsY3VsYXRlUGluY2hab29tKHN0YXJ0RGlzdGFuY2UsZW5kRGlzdGFuY2Upe3ZhciBwZXJjZW50PWVuZERpc3RhbmNlL3N0YXJ0RGlzdGFuY2UqMTtyZXR1cm4gcGVyY2VudC50b0ZpeGVkKDIpfWZ1bmN0aW9uIGNhbGN1bGF0ZVBpbmNoRGlyZWN0aW9uKCl7cmV0dXJuIDE+cGluY2hab29tP09VVDpJTn1mdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShzdGFydFBvaW50LGVuZFBvaW50KXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnNxcnQoTWF0aC5wb3coZW5kUG9pbnQueC1zdGFydFBvaW50LngsMikrTWF0aC5wb3coZW5kUG9pbnQueS1zdGFydFBvaW50LnksMikpKX1mdW5jdGlvbiBjYWxjdWxhdGVBbmdsZShzdGFydFBvaW50LGVuZFBvaW50KXt2YXIgeD1zdGFydFBvaW50LngtZW5kUG9pbnQueCx5PWVuZFBvaW50Lnktc3RhcnRQb2ludC55LHI9TWF0aC5hdGFuMih5LHgpLGFuZ2xlPU1hdGgucm91bmQoMTgwKnIvTWF0aC5QSSk7cmV0dXJuIDA+YW5nbGUmJihhbmdsZT0zNjAtTWF0aC5hYnMoYW5nbGUpKSxhbmdsZX1mdW5jdGlvbiBjYWxjdWxhdGVEaXJlY3Rpb24oc3RhcnRQb2ludCxlbmRQb2ludCl7aWYoY29tcGFyZVBvaW50cyhzdGFydFBvaW50LGVuZFBvaW50KSlyZXR1cm4gTk9ORTt2YXIgYW5nbGU9Y2FsY3VsYXRlQW5nbGUoc3RhcnRQb2ludCxlbmRQb2ludCk7cmV0dXJuIDQ1Pj1hbmdsZSYmYW5nbGU+PTA/TEVGVDozNjA+PWFuZ2xlJiZhbmdsZT49MzE1P0xFRlQ6YW5nbGU+PTEzNSYmMjI1Pj1hbmdsZT9SSUdIVDphbmdsZT40NSYmMTM1PmFuZ2xlP0RPV046VVB9ZnVuY3Rpb24gZ2V0VGltZVN0YW1wKCl7dmFyIG5vdz1uZXcgRGF0ZTtyZXR1cm4gbm93LmdldFRpbWUoKX1mdW5jdGlvbiBnZXRib3VuZHMoZWwpe2VsPSQoZWwpO3ZhciBvZmZzZXQ9ZWwub2Zmc2V0KCksYm91bmRzPXtsZWZ0Om9mZnNldC5sZWZ0LHJpZ2h0Om9mZnNldC5sZWZ0K2VsLm91dGVyV2lkdGgoKSx0b3A6b2Zmc2V0LnRvcCxib3R0b206b2Zmc2V0LnRvcCtlbC5vdXRlckhlaWdodCgpfTtyZXR1cm4gYm91bmRzfWZ1bmN0aW9uIGlzSW5Cb3VuZHMocG9pbnQsYm91bmRzKXtyZXR1cm4gcG9pbnQueD5ib3VuZHMubGVmdCYmcG9pbnQueDxib3VuZHMucmlnaHQmJnBvaW50Lnk+Ym91bmRzLnRvcCYmcG9pbnQueTxib3VuZHMuYm90dG9tfWZ1bmN0aW9uIGNvbXBhcmVQb2ludHMocG9pbnRBLHBvaW50Qil7cmV0dXJuIHBvaW50QS54PT1wb2ludEIueCYmcG9pbnRBLnk9PXBvaW50Qi55fXZhciBvcHRpb25zPSQuZXh0ZW5kKHt9LG9wdGlvbnMpLHVzZVRvdWNoRXZlbnRzPVNVUFBPUlRTX1RPVUNIfHxTVVBQT1JUU19QT0lOVEVSfHwhb3B0aW9ucy5mYWxsYmFja1RvTW91c2VFdmVudHMsU1RBUlRfRVY9dXNlVG91Y2hFdmVudHM/U1VQUE9SVFNfUE9JTlRFUj9TVVBQT1JUU19QT0lOVEVSX0lFMTA/XCJNU1BvaW50ZXJEb3duXCI6XCJwb2ludGVyZG93blwiOlwidG91Y2hzdGFydFwiOlwibW91c2Vkb3duXCIsTU9WRV9FVj11c2VUb3VjaEV2ZW50cz9TVVBQT1JUU19QT0lOVEVSP1NVUFBPUlRTX1BPSU5URVJfSUUxMD9cIk1TUG9pbnRlck1vdmVcIjpcInBvaW50ZXJtb3ZlXCI6XCJ0b3VjaG1vdmVcIjpcIm1vdXNlbW92ZVwiLEVORF9FVj11c2VUb3VjaEV2ZW50cz9TVVBQT1JUU19QT0lOVEVSP1NVUFBPUlRTX1BPSU5URVJfSUUxMD9cIk1TUG9pbnRlclVwXCI6XCJwb2ludGVydXBcIjpcInRvdWNoZW5kXCI6XCJtb3VzZXVwXCIsTEVBVkVfRVY9dXNlVG91Y2hFdmVudHM/U1VQUE9SVFNfUE9JTlRFUj9cIm1vdXNlbGVhdmVcIjpudWxsOlwibW91c2VsZWF2ZVwiLENBTkNFTF9FVj1TVVBQT1JUU19QT0lOVEVSP1NVUFBPUlRTX1BPSU5URVJfSUUxMD9cIk1TUG9pbnRlckNhbmNlbFwiOlwicG9pbnRlcmNhbmNlbFwiOlwidG91Y2hjYW5jZWxcIixkaXN0YW5jZT0wLGRpcmVjdGlvbj1udWxsLGN1cnJlbnREaXJlY3Rpb249bnVsbCxkdXJhdGlvbj0wLHN0YXJ0VG91Y2hlc0Rpc3RhbmNlPTAsZW5kVG91Y2hlc0Rpc3RhbmNlPTAscGluY2hab29tPTEscGluY2hEaXN0YW5jZT0wLHBpbmNoRGlyZWN0aW9uPTAsbWF4aW11bXNNYXA9bnVsbCwkZWxlbWVudD0kKGVsZW1lbnQpLHBoYXNlPVwic3RhcnRcIixmaW5nZXJDb3VudD0wLGZpbmdlckRhdGE9e30sc3RhcnRUaW1lPTAsZW5kVGltZT0wLHByZXZpb3VzVG91Y2hFbmRUaW1lPTAsZmluZ2VyQ291bnRBdFJlbGVhc2U9MCxkb3VibGVUYXBTdGFydFRpbWU9MCxzaW5nbGVUYXBUaW1lb3V0PW51bGwsaG9sZFRpbWVvdXQ9bnVsbDt0cnl7JGVsZW1lbnQub24oU1RBUlRfRVYsdG91Y2hTdGFydCksJGVsZW1lbnQub24oQ0FOQ0VMX0VWLHRvdWNoQ2FuY2VsKX1jYXRjaChlKXskLmVycm9yKFwiZXZlbnRzIG5vdCBzdXBwb3J0ZWQgXCIrU1RBUlRfRVYrXCIsXCIrQ0FOQ0VMX0VWK1wiIG9uIGpRdWVyeS5zd2lwZVwiKX10aGlzLmVuYWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGUoKSwkZWxlbWVudC5vbihTVEFSVF9FVix0b3VjaFN0YXJ0KSwkZWxlbWVudC5vbihDQU5DRUxfRVYsdG91Y2hDYW5jZWwpLCRlbGVtZW50fSx0aGlzLmRpc2FibGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmVtb3ZlTGlzdGVuZXJzKCksJGVsZW1lbnR9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3JlbW92ZUxpc3RlbmVycygpLCRlbGVtZW50LmRhdGEoUExVR0lOX05TLG51bGwpLCRlbGVtZW50PW51bGx9LHRoaXMub3B0aW9uPWZ1bmN0aW9uKHByb3BlcnR5LHZhbHVlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgcHJvcGVydHkpb3B0aW9ucz0kLmV4dGVuZChvcHRpb25zLHByb3BlcnR5KTtlbHNlIGlmKHZvaWQgMCE9PW9wdGlvbnNbcHJvcGVydHldKXtpZih2b2lkIDA9PT12YWx1ZSlyZXR1cm4gb3B0aW9uc1twcm9wZXJ0eV07b3B0aW9uc1twcm9wZXJ0eV09dmFsdWV9ZWxzZXtpZighcHJvcGVydHkpcmV0dXJuIG9wdGlvbnM7JC5lcnJvcihcIk9wdGlvbiBcIitwcm9wZXJ0eStcIiBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuc3dpcGUub3B0aW9uc1wiKX1yZXR1cm4gbnVsbH19dmFyIFZFUlNJT049XCIxLjYuMThcIixMRUZUPVwibGVmdFwiLFJJR0hUPVwicmlnaHRcIixVUD1cInVwXCIsRE9XTj1cImRvd25cIixJTj1cImluXCIsT1VUPVwib3V0XCIsTk9ORT1cIm5vbmVcIixBVVRPPVwiYXV0b1wiLFNXSVBFPVwic3dpcGVcIixQSU5DSD1cInBpbmNoXCIsVEFQPVwidGFwXCIsRE9VQkxFX1RBUD1cImRvdWJsZXRhcFwiLExPTkdfVEFQPVwibG9uZ3RhcFwiLEhPUklaT05UQUw9XCJob3Jpem9udGFsXCIsVkVSVElDQUw9XCJ2ZXJ0aWNhbFwiLEFMTF9GSU5HRVJTPVwiYWxsXCIsRE9VQkxFX1RBUF9USFJFU0hPTEQ9MTAsUEhBU0VfU1RBUlQ9XCJzdGFydFwiLFBIQVNFX01PVkU9XCJtb3ZlXCIsUEhBU0VfRU5EPVwiZW5kXCIsUEhBU0VfQ0FOQ0VMPVwiY2FuY2VsXCIsU1VQUE9SVFNfVE9VQ0g9XCJvbnRvdWNoc3RhcnRcImluIHdpbmRvdyxTVVBQT1JUU19QT0lOVEVSX0lFMTA9d2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkJiYhd2luZG93LlBvaW50ZXJFdmVudCYmIVNVUFBPUlRTX1RPVUNILFNVUFBPUlRTX1BPSU5URVI9KHdpbmRvdy5Qb2ludGVyRXZlbnR8fHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZCkmJiFTVVBQT1JUU19UT1VDSCxQTFVHSU5fTlM9XCJUb3VjaFN3aXBlXCIsZGVmYXVsdHM9e2ZpbmdlcnM6MSx0aHJlc2hvbGQ6NzUsY2FuY2VsVGhyZXNob2xkOm51bGwscGluY2hUaHJlc2hvbGQ6MjAsbWF4VGltZVRocmVzaG9sZDpudWxsLGZpbmdlclJlbGVhc2VUaHJlc2hvbGQ6MjUwLGxvbmdUYXBUaHJlc2hvbGQ6NTAwLGRvdWJsZVRhcFRocmVzaG9sZDoyMDAsc3dpcGU6bnVsbCxzd2lwZUxlZnQ6bnVsbCxzd2lwZVJpZ2h0Om51bGwsc3dpcGVVcDpudWxsLHN3aXBlRG93bjpudWxsLHN3aXBlU3RhdHVzOm51bGwscGluY2hJbjpudWxsLHBpbmNoT3V0Om51bGwscGluY2hTdGF0dXM6bnVsbCxjbGljazpudWxsLHRhcDpudWxsLGRvdWJsZVRhcDpudWxsLGxvbmdUYXA6bnVsbCxob2xkOm51bGwsdHJpZ2dlck9uVG91Y2hFbmQ6ITAsdHJpZ2dlck9uVG91Y2hMZWF2ZTohMSxhbGxvd1BhZ2VTY3JvbGw6XCJhdXRvXCIsZmFsbGJhY2tUb01vdXNlRXZlbnRzOiEwLGV4Y2x1ZGVkRWxlbWVudHM6XCIubm9Td2lwZVwiLHByZXZlbnREZWZhdWx0RXZlbnRzOiEwfTskLmZuLnN3aXBlPWZ1bmN0aW9uKG1ldGhvZCl7dmFyICR0aGlzPSQodGhpcykscGx1Z2luPSR0aGlzLmRhdGEoUExVR0lOX05TKTtpZihwbHVnaW4mJlwic3RyaW5nXCI9PXR5cGVvZiBtZXRob2Qpe2lmKHBsdWdpblttZXRob2RdKXJldHVybiBwbHVnaW5bbWV0aG9kXS5hcHBseShwbHVnaW4sQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTskLmVycm9yKFwiTWV0aG9kIFwiK21ldGhvZCtcIiBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuc3dpcGVcIil9ZWxzZSBpZihwbHVnaW4mJlwib2JqZWN0XCI9PXR5cGVvZiBtZXRob2QpcGx1Z2luLm9wdGlvbi5hcHBseShwbHVnaW4sYXJndW1lbnRzKTtlbHNlIGlmKCEocGx1Z2lufHxcIm9iamVjdFwiIT10eXBlb2YgbWV0aG9kJiZtZXRob2QpKXJldHVybiBpbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gJHRoaXN9LCQuZm4uc3dpcGUudmVyc2lvbj1WRVJTSU9OLCQuZm4uc3dpcGUuZGVmYXVsdHM9ZGVmYXVsdHMsJC5mbi5zd2lwZS5waGFzZXM9e1BIQVNFX1NUQVJUOlBIQVNFX1NUQVJULFBIQVNFX01PVkU6UEhBU0VfTU9WRSxQSEFTRV9FTkQ6UEhBU0VfRU5ELFBIQVNFX0NBTkNFTDpQSEFTRV9DQU5DRUx9LCQuZm4uc3dpcGUuZGlyZWN0aW9ucz17TEVGVDpMRUZULFJJR0hUOlJJR0hULFVQOlVQLERPV046RE9XTixJTjpJTixPVVQ6T1VUfSwkLmZuLnN3aXBlLnBhZ2VTY3JvbGw9e05PTkU6Tk9ORSxIT1JJWk9OVEFMOkhPUklaT05UQUwsVkVSVElDQUw6VkVSVElDQUwsQVVUTzpBVVRPfSwkLmZuLnN3aXBlLmZpbmdlcnM9e09ORToxLFRXTzoyLFRIUkVFOjMsRk9VUjo0LEZJVkU6NSxBTEw6QUxMX0ZJTkdFUlN9fSk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tIFwicHJlc3Rhc2hvcFwiO1xuaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiO1xuXG5jb25zdCBwYXNzd29yZFBvbGljeSA9IHtcbiAgdGVtcGxhdGU6IFwiI3Bhc3N3b3JkLWZlZWRiYWNrXCIsXG4gIGhpbnQ6IFwiLmpzLWhpbnQtcGFzc3dvcmRcIixcbiAgY29udGFpbmVyOiBcIi5wYXNzd29yZC1zdHJlbmd0aC1mZWVkYmFja1wiLFxuICBzdHJlbmd0aFRleHQ6IFwiLnBhc3N3b3JkLXN0cmVuZ3RoLXRleHRcIixcbiAgcmVxdWlyZW1lbnRTY29yZTogXCIucGFzc3dvcmQtcmVxdWlyZW1lbnRzLXNjb3JlXCIsXG4gIHJlcXVpcmVtZW50TGVuZ3RoOiBcIi5wYXNzd29yZC1yZXF1aXJlbWVudHMtbGVuZ3RoXCIsXG4gIHJlcXVpcmVtZW50U2NvcmVJY29uOiBcIi5wYXNzd29yZC1yZXF1aXJlbWVudHMtc2NvcmUgaVwiLFxuICByZXF1aXJlbWVudExlbmd0aEljb246IFwiLnBhc3N3b3JkLXJlcXVpcmVtZW50cy1sZW5ndGggaVwiLFxuICBwcm9ncmVzc0JhcjogXCIucHJvZ3Jlc3MtYmFyXCIsXG4gIGlucHV0Q29sdW1uOiBcIi5qcy1pbnB1dC1jb2x1bW5cIixcbn07XG5cbnByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMgPSB7XG4gIHByb2R1Y3Q6IHtcbiAgICB0YWJzOiBcIi50YWJzIC5uYXYtbGlua1wiLFxuICAgIGFjdGl2ZU5hdkNsYXNzOiBcImpzLXByb2R1Y3QtbmF2LWFjdGl2ZVwiLFxuICAgIGFjdGl2ZVRhYkNsYXNzOiBcImpzLXByb2R1Y3QtdGFiLWFjdGl2ZVwiLFxuICAgIGFjdGl2ZVRhYnM6IFwiLnRhYnMgLm5hdi1saW5rLmFjdGl2ZSwgLmpzLXByb2R1Y3QtbmF2LWFjdGl2ZVwiLFxuICAgIGltYWdlc01vZGFsOiBcIi5qcy1wcm9kdWN0LWltYWdlcy1tb2RhbFwiLFxuICAgIHRodW1iOiBcIi5qcy10aHVtYlwiLFxuICAgIHRodW1iQ29udGFpbmVyOiBcIi50aHVtYi1jb250YWluZXIsIC5qcy10aHVtYi1jb250YWluZXJcIixcbiAgICBhcnJvd3M6IFwiLmpzLWFycm93c1wiLFxuICAgIHNlbGVjdGVkOiBcIi5zZWxlY3RlZCwgLmpzLXRodW1iLXNlbGVjdGVkXCIsXG4gICAgbW9kYWxQcm9kdWN0Q292ZXI6IFwiLmpzLW1vZGFsLXByb2R1Y3QtY292ZXJcIixcbiAgICBjb3ZlcjogXCIuanMtcXYtcHJvZHVjdC1jb3ZlclwiLFxuICAgIGN1c3RvbWl6YXRpb25Nb2RhbDogXCIuanMtY3VzdG9taXphdGlvbi1tb2RhbFwiLFxuICB9LFxuICBsaXN0aW5nOiB7XG4gICAgc2VhcmNoRmlsdGVyVG9nZ2xlcjogXCIjc2VhcmNoX2ZpbHRlcl90b2dnbGVyLCAuanMtc2VhcmNoLXRvZ2dsZXJcIixcbiAgICBzZWFyY2hGaWx0ZXJzV3JhcHBlcjogXCIjc2VhcmNoX2ZpbHRlcnNfd3JhcHBlclwiLFxuICAgIHNlYXJjaEZpbHRlckNvbnRyb2xzOiBcIiNzZWFyY2hfZmlsdGVyX2NvbnRyb2xzXCIsXG4gICAgc2VhcmNoRmlsdGVyczogXCIjc2VhcmNoX2ZpbHRlcnNcIixcbiAgICBhY3RpdmVTZWFyY2hGaWx0ZXJzOiBcIiNqcy1hY3RpdmUtc2VhcmNoLWZpbHRlcnNcIixcbiAgICBsaXN0VG9wOiBcIiNqcy1wcm9kdWN0LWxpc3QtdG9wXCIsXG4gICAgcHJvZHVjdDogXCIuanMtcHJvZHVjdFwiLFxuICAgIGxpc3Q6IFwiI2pzLXByb2R1Y3QtbGlzdFwiLFxuICAgIGxpc3RCb3R0b206IFwiI2pzLXByb2R1Y3QtbGlzdC1ib3R0b21cIixcbiAgICBsaXN0SGVhZGVyOiBcIiNqcy1wcm9kdWN0LWxpc3QtaGVhZGVyXCIsXG4gICAgc2VhcmNoRmlsdGVyc0NsZWFyQWxsOiBcIi5qcy1zZWFyY2gtZmlsdGVycy1jbGVhci1hbGxcIixcbiAgICBzZWFyY2hMaW5rOiBcIi5qcy1zZWFyY2gtbGlua1wiLFxuICB9LFxuICBvcmRlcjoge1xuICAgIHJldHVybkZvcm06IFwiI29yZGVyLXJldHVybi1mb3JtLCAuanMtb3JkZXItcmV0dXJuLWZvcm1cIixcbiAgfSxcbiAgYXJyb3dEb3duOiBcIi5hcnJvdy1kb3duLCAuanMtYXJyb3ctZG93blwiLFxuICBhcnJvd1VwOiBcIi5hcnJvdy11cCwgLmpzLWFycm93LXVwXCIsXG4gIGNsZWFyOiBcIi5jbGVhclwiLFxuICBmaWxlSW5wdXQ6IFwiLmpzLWZpbGUtaW5wdXRcIixcbiAgY29udGVudFdyYXBwZXI6IFwiI2NvbnRlbnQtd3JhcHBlciwgLmpzLWNvbnRlbnQtd3JhcHBlclwiLFxuICBmb290ZXI6IFwiI2Zvb3RlciwgLmpzLWZvb3RlclwiLFxuICBtb2RhbENvbnRlbnQ6IFwiLmpzLW1vZGFsLWNvbnRlbnRcIixcbiAgbW9kYWw6IFwiI21vZGFsLCAuanMtY2hlY2tvdXQtbW9kYWxcIixcbiAgdG91Y2hzcGluOiBcIi5qcy10b3VjaHNwaW5cIixcbiAgY2hlY2tvdXQ6IHtcbiAgICB0ZXJtc0xpbms6IFwiLmpzLXRlcm1zIGFcIixcbiAgICBnaWZ0Q2hlY2tib3g6IFwiLmpzLWdpZnQtY2hlY2tib3hcIixcbiAgICBpbWFnZXNMaW5rOiBcIi5jYXJkLWJsb2NrIC5jYXJ0LXN1bW1hcnktcHJvZHVjdHMgcCBhLCAuanMtc2hvdy1kZXRhaWxzXCIsXG4gICAgY2FycmllckV4dHJhQ29udGVudDogXCIuY2Fycmllci1leHRyYS1jb250ZW50LCAuanMtY2Fycmllci1leHRyYS1jb250ZW50XCIsXG4gICAgYnRuOiBcIi5jaGVja291dCBhXCIsXG4gIH0sXG4gIGNhcnQ6IHtcbiAgICBwcm9kdWN0TGluZVF0eTogXCIuanMtY2FydC1saW5lLXByb2R1Y3QtcXVhbnRpdHlcIixcbiAgICBxdWlja3ZpZXc6IFwiLnF1aWNrdmlld1wiLFxuICAgIHRvdWNoc3BpbjogXCIuYm9vdHN0cmFwLXRvdWNoc3BpblwiLFxuICAgIHByb21vQ29kZTogXCIjcHJvbW8tY29kZVwiLFxuICAgIGRpc3BsYXlQcm9tbzogXCIuZGlzcGxheS1wcm9tb1wiLFxuICAgIHByb21vQ29kZUJ1dHRvbjogXCIucHJvbW8tY29kZS1idXR0b25cIixcbiAgICBkaXNjb3VudENvZGU6IFwiLmpzLWRpc2NvdW50IC5jb2RlXCIsXG4gICAgZGlzY291bnROYW1lOiBcIltuYW1lPWRpc2NvdW50X25hbWVdXCIsXG4gICAgYWN0aW9uczpcbiAgICAgICdbZGF0YS1saW5rLWFjdGlvbj1cImRlbGV0ZS1mcm9tLWNhcnRcIl0sIFtkYXRhLWxpbmstYWN0aW9uPVwicmVtb3ZlLXZvdWNoZXJcIl0nLFxuICB9LFxuICBub3RpZmljYXRpb25zOiB7XG4gICAgZGFuZ2VyQWxlcnQ6IFwiI25vdGlmaWNhdGlvbnMgYXJ0aWNsZS5hbGVydC1kYW5nZXJcIixcbiAgICBjb250YWluZXI6IFwiI25vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbnMtY29udGFpbmVyXCIsXG4gIH0sXG4gIHBhc3N3b3JkUG9saWN5LFxufTtcblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBwcmVzdGFzaG9wLmVtaXQoXCJ0aGVtZVNlbGVjdG9yc0luaXRcIik7XG59KTtcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSdcblxudmFyIHNpbXBsZXRhYnNwbHVnaW5uYW1lID0gJ3NpbXBsZXRhYnMnXG5mdW5jdGlvbiBTaW1wbGVUYWJzUGx1Z2luKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgdGhpcy4kZWwgPSAkKGVsZW1lbnQpXG4gIHRoaXMuJHRhYnMgPSBbXVxuICB0aGlzLmluaXQoKVxufVxuXG4kLmV4dGVuZChTaW1wbGVUYWJzUGx1Z2luLnByb3RvdHlwZSwge1xuICBpbml0KCkge1xuICAgIHZhciBzZWxmID0gdGhpc1xuICAgIHRoaXMuJHRhYnMgPSBbXVxuICAgIHRoaXMuJGVsLmZpbmQoJ3VsID4gbGkgPiBhJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciAkYSA9ICQodGhpcylcbiAgICAgIHZhciBpZCA9ICRhLmF0dHIoJ2hyZWYnKVxuICAgICAgaWYgKCBpZC5zdGFydHNXaXRoKCcjJykgKSB7XG4gICAgICAgIGlkID0gaWQucmVwbGFjZSgnIycsICcnKVxuICAgICAgICB2YXIgZXhpc3RzID0gc2VsZi4kdGFicy5maW5kKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudCA9PT0gaWRcbiAgICAgICAgfSlcbiAgICAgICAgdmFyIGNvbnRlbnRzZWxlY3RvciA9ICcjJyArIGlkICsgJy50YWJzLWNvbnRlbnQnXG4gICAgICAgIHZhciBjb250ZW50ID0gc2VsZi4kZWwuZmluZChjb250ZW50c2VsZWN0b3IpXG4gICAgICAgIGlmICggZXhpc3RzICkge1xuICAgICAgICAgIGV4aXN0cy50YWIgPSAkYVxuICAgICAgICAgIGV4aXN0cy5jb250ZW50ID0gY29udGVudFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuJHRhYnMucHVzaCh7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICB0YWI6ICRhLFxuICAgICAgICAgICAgY29udGVudDogY29udGVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHNlbGYuJHRhYnMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICBpZiAoIWVsZW1lbnQudGFiLmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuICAgICAgICBzZWxmLmhpZGUoZWxlbWVudC5pZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuc2hvdyhlbGVtZW50LmlkKVxuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnRhYi5jbGljayhmdW5jdGlvbihldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHNlbGYuc2hvdyhlbGVtZW50LmlkKVxuICAgICAgfSlcbiAgICB9KVxuICB9LFxuICBzaG93KGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgdGhpcy4kdGFicy5mb3JFYWNoKGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuICAgICAgc2VsZi5oaWRlKGVsZW1lbnQuaWQpXG4gICAgICBpZiAoIGVsZW1lbnQuaWQgPT09IGlkICkge1xuICAgICAgICBlbGVtZW50LnRhYi5hZGRDbGFzcygnYWN0aXZlJykuYWRkQ2xhc3MoJ2ZvbnQtYm9sZCcpXG4gICAgICAgIGVsZW1lbnQuY29udGVudC5yZW1vdmVDbGFzcygnaGlkZGVuJylcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICBoaWRlKGlkKSB7XG4gICAgdGhpcy4kdGFicy5mb3JFYWNoKGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuICAgICAgaWYgKCBlbGVtZW50LmlkID09PSBpZCApIHtcbiAgICAgICAgZWxlbWVudC50YWIucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLnJlbW92ZUNsYXNzKCdmb250LWJvbGQnKVxuICAgICAgICBlbGVtZW50LmNvbnRlbnQuYWRkQ2xhc3MoJ2hpZGRlbicpXG4gICAgICB9XG4gICAgfSlcbiAgfSxcbn0pXG5cbiQuZm4uc2ltcGxldGFicyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGlmICggISQuZGF0YSh0aGlzLCAncGx1Z2luXycgKyBzaW1wbGV0YWJzcGx1Z2lubmFtZSkpIHtcbiAgICAgICQuZGF0YSh0aGlzLCAncGx1Z2luXycgKyBzaW1wbGV0YWJzcGx1Z2lubmFtZSwgbmV3IFNpbXBsZVRhYnNQbHVnaW4odGhpcywgb3B0aW9ucykpXG4gICAgfVxuICB9KVxufVxuXG5cbiIsIihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZ1bmN0aW9uKCQpe1xuICAgICAgICAgICAgZmFjdG9yeSgkKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gKHJvb3QuRWFzeVpvb20gPSBmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdC5FYXN5Wm9vbSA9IGZhY3Rvcnkocm9vdC5qUXVlcnkpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCQpIHtcblxuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciB6b29tSW1nT3ZlcmxhcFg7XG4gICAgdmFyIHpvb21JbWdPdmVybGFwWTtcbiAgICB2YXIgcmF0aW9YO1xuICAgIHZhciByYXRpb1k7XG4gICAgdmFyIHBvaW50ZXJQb3NpdGlvblg7XG4gICAgdmFyIHBvaW50ZXJQb3NpdGlvblk7XG5cbiAgICB2YXIgZGVmYXVsdHMgPSB7XG5cbiAgICAgICAgLy8gVGhlIHRleHQgdG8gZGlzcGxheSB3aXRoaW4gdGhlIG5vdGljZSBib3ggd2hpbGUgbG9hZGluZyB0aGUgem9vbSBpbWFnZS5cbiAgICAgICAgbG9hZGluZ05vdGljZTogJ0xvYWRpbmcgaW1hZ2UnLFxuXG4gICAgICAgIC8vIFRoZSB0ZXh0IHRvIGRpc3BsYXkgd2l0aGluIHRoZSBub3RpY2UgYm94IGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGxvYWRpbmcgdGhlIHpvb20gaW1hZ2UuXG4gICAgICAgIGVycm9yTm90aWNlOiAnVGhlIGltYWdlIGNvdWxkIG5vdCBiZSBsb2FkZWQnLFxuXG4gICAgICAgIC8vIFRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRvIGRpc3BsYXkgdGhlIGVycm9yIG5vdGljZS5cbiAgICAgICAgZXJyb3JEdXJhdGlvbjogMjUwMCxcblxuICAgICAgICAvLyBBdHRyaWJ1dGUgdG8gcmV0cmlldmUgdGhlIHpvb20gaW1hZ2UgVVJMIGZyb20uXG4gICAgICAgIGxpbmtBdHRyaWJ1dGU6ICdocmVmJyxcblxuICAgICAgICAvLyBQcmV2ZW50IGNsaWNrcyBvbiB0aGUgem9vbSBpbWFnZSBsaW5rLlxuICAgICAgICBwcmV2ZW50Q2xpY2tzOiB0cnVlLFxuXG4gICAgICAgIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYmVmb3JlIHRoZSBmbHlvdXQgaXMgZGlzcGxheWVkLlxuICAgICAgICBiZWZvcmVTaG93OiAkLm5vb3AsXG5cbiAgICAgICAgLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSBiZWZvcmUgdGhlIGZseW91dCBpcyByZW1vdmVkLlxuICAgICAgICBiZWZvcmVIaWRlOiAkLm5vb3AsXG5cbiAgICAgICAgLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBmbHlvdXQgaXMgZGlzcGxheWVkLlxuICAgICAgICBvblNob3c6ICQubm9vcCxcblxuICAgICAgICAvLyBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGZseW91dCBpcyByZW1vdmVkLlxuICAgICAgICBvbkhpZGU6ICQubm9vcCxcblxuICAgICAgICAvLyBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGN1cnNvciBpcyBtb3ZlZCB3aGlsZSBvdmVyIHRoZSBpbWFnZS5cbiAgICAgICAgb25Nb3ZlOiAkLm5vb3BcblxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFYXN5Wm9vbVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAoT3B0aW9uYWwpXG4gICAgICovXG4gICAgZnVuY3Rpb24gRWFzeVpvb20odGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuJHRhcmdldCA9ICQodGFyZ2V0KTtcbiAgICAgICAgdGhpcy5vcHRzID0gJC5leHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zLCB0aGlzLiR0YXJnZXQuZGF0YSgpKTtcblxuICAgICAgICB0aGlzLmlzT3BlbiA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX2luaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy4kbGluayAgID0gdGhpcy4kdGFyZ2V0LmZpbmQoJ2EnKTtcbiAgICAgICAgdGhpcy4kaW1hZ2UgID0gdGhpcy4kdGFyZ2V0LmZpbmQoJ2ltZycpO1xuXG4gICAgICAgIHRoaXMuJGZseW91dCA9ICQoJzxkaXYgY2xhc3M9XCJlYXN5em9vbS1mbHlvdXRcIiAvPicpO1xuICAgICAgICB0aGlzLiRub3RpY2UgPSAkKCc8ZGl2IGNsYXNzPVwiZWFzeXpvb20tbm90aWNlXCIgLz4nKTtcblxuICAgICAgICB0aGlzLiR0YXJnZXQub24oe1xuICAgICAgICAgICAgJ21vdXNlbW92ZS5lYXN5em9vbSB0b3VjaG1vdmUuZWFzeXpvb20nOiAkLnByb3h5KHRoaXMuX29uTW92ZSwgdGhpcyksXG4gICAgICAgICAgICAnbW91c2VsZWF2ZS5lYXN5em9vbSB0b3VjaGVuZC5lYXN5em9vbSc6ICQucHJveHkodGhpcy5fb25MZWF2ZSwgdGhpcyksXG4gICAgICAgICAgICAnbW91c2VlbnRlci5lYXN5em9vbSB0b3VjaHN0YXJ0LmVhc3l6b29tJzogJC5wcm94eSh0aGlzLl9vbkVudGVyLCB0aGlzKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9wdHMucHJldmVudENsaWNrcyAmJiB0aGlzLiR0YXJnZXQub24oJ2NsaWNrLmVhc3l6b29tJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hvd1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudHxUb3VjaEV2ZW50fSBlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB0ZXN0TW91c2VPdmVyIChPcHRpb25hbClcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGUsIHRlc3RNb3VzZU92ZXIpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMuYmVmb3JlU2hvdy5jYWxsKHRoaXMpID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1JlYWR5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZEltYWdlKHRoaXMuJGxpbmsuYXR0cih0aGlzLm9wdHMubGlua0F0dHJpYnV0ZSksIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmlzTW91c2VPdmVyIHx8ICF0ZXN0TW91c2VPdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuJHRhcmdldC5hcHBlbmQodGhpcy4kZmx5b3V0KTtcblxuICAgICAgICB2YXIgdGFyZ2V0V2lkdGggPSB0aGlzLiR0YXJnZXQub3V0ZXJXaWR0aCgpO1xuICAgICAgICB2YXIgdGFyZ2V0SGVpZ2h0ID0gdGhpcy4kdGFyZ2V0Lm91dGVySGVpZ2h0KCk7XG5cbiAgICAgICAgdmFyIGZseW91dElubmVyV2lkdGggPSB0aGlzLiRmbHlvdXQud2lkdGgoKTtcbiAgICAgICAgdmFyIGZseW91dElubmVySGVpZ2h0ID0gdGhpcy4kZmx5b3V0LmhlaWdodCgpO1xuXG4gICAgICAgIHZhciB6b29tSW1nV2lkdGggPSB0aGlzLiR6b29tLndpZHRoKCk7XG4gICAgICAgIHZhciB6b29tSW1nSGVpZ2h0ID0gdGhpcy4kem9vbS5oZWlnaHQoKTtcblxuICAgICAgICB6b29tSW1nT3ZlcmxhcFggPSBNYXRoLmNlaWwoem9vbUltZ1dpZHRoIC0gZmx5b3V0SW5uZXJXaWR0aCk7XG4gICAgICAgIHpvb21JbWdPdmVybGFwWSA9IE1hdGguY2VpbCh6b29tSW1nSGVpZ2h0IC0gZmx5b3V0SW5uZXJIZWlnaHQpO1xuXG5cbiAgICAgICAgLy8gRm9yIHdoZW4gdGhlIHpvb20gaW1hZ2UgaXMgc21hbGxlciB0aGFuIHRoZSBmbHlvdXQgZWxlbWVudC5cbiAgICAgICAgaWYgKHpvb21JbWdPdmVybGFwWCA8IDApIHpvb21JbWdPdmVybGFwWCA9IDA7XG4gICAgICAgIGlmICh6b29tSW1nT3ZlcmxhcFkgPCAwKSB6b29tSW1nT3ZlcmxhcFkgPSAwO1xuXG4gICAgICAgIHJhdGlvWCA9IHpvb21JbWdPdmVybGFwWCAvIHRhcmdldFdpZHRoO1xuICAgICAgICByYXRpb1kgPSB6b29tSW1nT3ZlcmxhcFkgLyB0YXJnZXRIZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuXG4gICAgICAgIHRoaXMub3B0cy5vblNob3cuY2FsbCh0aGlzKTtcblxuICAgICAgICBlICYmIHRoaXMuX21vdmUoZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE9uIGVudGVyXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICovXG4gICAgRWFzeVpvb20ucHJvdG90eXBlLl9vbkVudGVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzO1xuXG4gICAgICAgIHRoaXMuaXNNb3VzZU92ZXIgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdG91Y2hlcyB8fCB0b3VjaGVzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNob3coZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogT24gbW92ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFdmVudH0gZVxuICAgICAqL1xuICAgIEVhc3lab29tLnByb3RvdHlwZS5fb25Nb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKSByZXR1cm47XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9tb3ZlKGUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBPbiBsZWF2ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgRWFzeVpvb20ucHJvdG90eXBlLl9vbkxlYXZlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuaXNNb3VzZU92ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc09wZW4gJiYgdGhpcy5oaWRlKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE9uIGxvYWRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGVcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuX29uTG9hZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgLy8gSUUgbWF5IGZpcmUgYSBsb2FkIGV2ZW50IGV2ZW4gb24gZXJyb3Igc28gdGVzdCB0aGUgaW1hZ2UgZGltZW5zaW9uc1xuICAgICAgICBpZiAoIWUuY3VycmVudFRhcmdldC53aWR0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaXNSZWFkeSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy4kbm90aWNlLmRldGFjaCgpO1xuICAgICAgICB0aGlzLiRmbHlvdXQuaHRtbCh0aGlzLiR6b29tKTtcbiAgICAgICAgdGhpcy4kdGFyZ2V0LnJlbW92ZUNsYXNzKCdpcy1sb2FkaW5nJykuYWRkQ2xhc3MoJ2lzLXJlYWR5Jyk7XG5cbiAgICAgICAgZS5kYXRhLmNhbGwgJiYgZS5kYXRhKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE9uIGVycm9yXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuX29uRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuJG5vdGljZS50ZXh0KHRoaXMub3B0cy5lcnJvck5vdGljZSk7XG4gICAgICAgIHRoaXMuJHRhcmdldC5yZW1vdmVDbGFzcygnaXMtbG9hZGluZycpLmFkZENsYXNzKCdpcy1lcnJvcicpO1xuXG4gICAgICAgIHRoaXMuZGV0YWNoTm90aWNlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuJG5vdGljZS5kZXRhY2goKTtcbiAgICAgICAgICAgIHNlbGYuZGV0YWNoTm90aWNlID0gbnVsbDtcbiAgICAgICAgfSwgdGhpcy5vcHRzLmVycm9yRHVyYXRpb24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGltYWdlXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHJlZlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgRWFzeVpvb20ucHJvdG90eXBlLl9sb2FkSW1hZ2UgPSBmdW5jdGlvbihocmVmLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgem9vbSA9IG5ldyBJbWFnZSgpO1xuXG4gICAgICAgIHRoaXMuJHRhcmdldFxuICAgICAgICAgICAgLmFkZENsYXNzKCdpcy1sb2FkaW5nJylcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy4kbm90aWNlLnRleHQodGhpcy5vcHRzLmxvYWRpbmdOb3RpY2UpKTtcblxuICAgICAgICB0aGlzLiR6b29tID0gJCh6b29tKVxuICAgICAgICAgICAgLm9uKCdlcnJvcicsICQucHJveHkodGhpcy5fb25FcnJvciwgdGhpcykpXG4gICAgICAgICAgICAub24oJ2xvYWQnLCBjYWxsYmFjaywgJC5wcm94eSh0aGlzLl9vbkxvYWQsIHRoaXMpKTtcblxuICAgICAgICB6b29tLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgem9vbS5zcmMgPSBocmVmO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICovXG4gICAgRWFzeVpvb20ucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24oZSkge1xuXG4gICAgICAgIGlmIChlLnR5cGUuaW5kZXhPZigndG91Y2gnKSA9PT0gMCkge1xuICAgICAgICAgICAgdmFyIHRvdWNobGlzdCA9IGUudG91Y2hlcyB8fCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICAgICAgICAgIHBvaW50ZXJQb3NpdGlvblggPSB0b3VjaGxpc3RbMF0ucGFnZVg7XG4gICAgICAgICAgICBwb2ludGVyUG9zaXRpb25ZID0gdG91Y2hsaXN0WzBdLnBhZ2VZO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9pbnRlclBvc2l0aW9uWCA9IGUucGFnZVggfHwgcG9pbnRlclBvc2l0aW9uWDtcbiAgICAgICAgICAgIHBvaW50ZXJQb3NpdGlvblkgPSBlLnBhZ2VZIHx8IHBvaW50ZXJQb3NpdGlvblk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGFyZ2V0T2Zmc2V0ICA9IHRoaXMuJHRhcmdldC5vZmZzZXQoKTtcbiAgICAgICAgdmFyIHJlbGF0aXZlUG9zaXRpb25YID0gcG9pbnRlclBvc2l0aW9uWCAtIHRhcmdldE9mZnNldC5sZWZ0O1xuICAgICAgICB2YXIgcmVsYXRpdmVQb3NpdGlvblkgPSBwb2ludGVyUG9zaXRpb25ZIC0gdGFyZ2V0T2Zmc2V0LnRvcDtcbiAgICAgICAgdmFyIG1vdmVYID0gTWF0aC5jZWlsKHJlbGF0aXZlUG9zaXRpb25YICogcmF0aW9YKTtcbiAgICAgICAgdmFyIG1vdmVZID0gTWF0aC5jZWlsKHJlbGF0aXZlUG9zaXRpb25ZICogcmF0aW9ZKTtcblxuICAgICAgICAvLyBDbG9zZSBpZiBvdXRzaWRlXG4gICAgICAgIGlmIChtb3ZlWCA8IDAgfHwgbW92ZVkgPCAwIHx8IG1vdmVYID4gem9vbUltZ092ZXJsYXBYIHx8IG1vdmVZID4gem9vbUltZ092ZXJsYXBZKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0b3AgPSBtb3ZlWSAqIC0xO1xuICAgICAgICAgICAgdmFyIGxlZnQgPSBtb3ZlWCAqIC0xO1xuXG4gICAgICAgICAgICBpZiAoJ3RyYW5zZm9ybScgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHpvb20uY3NzKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlKCcgKyBsZWZ0ICsgJ3B4LCAnICsgdG9wICsgJ3B4KScgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuJHpvb20uY3NzKHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5vbk1vdmUuY2FsbCh0aGlzLCB0b3AsIGxlZnQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhpZGVcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYmVmb3JlSGlkZS5jYWxsKHRoaXMpID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuJGZseW91dC5kZXRhY2goKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgICAgICB0aGlzLm9wdHMub25IaWRlLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN3YXBcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhbmRhcmRTcmNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gem9vbUhyZWZcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gc3Jjc2V0IChPcHRpb25hbClcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuc3dhcCA9IGZ1bmN0aW9uKHN0YW5kYXJkU3JjLCB6b29tSHJlZiwgc3Jjc2V0KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB0aGlzLmlzUmVhZHkgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmRldGFjaE5vdGljZSAmJiBjbGVhclRpbWVvdXQodGhpcy5kZXRhY2hOb3RpY2UpO1xuXG4gICAgICAgIHRoaXMuJG5vdGljZS5wYXJlbnQoKS5sZW5ndGggJiYgdGhpcy4kbm90aWNlLmRldGFjaCgpO1xuXG4gICAgICAgIHRoaXMuJHRhcmdldC5yZW1vdmVDbGFzcygnaXMtbG9hZGluZyBpcy1yZWFkeSBpcy1lcnJvcicpO1xuXG4gICAgICAgIHRoaXMuJGltYWdlLmF0dHIoe1xuICAgICAgICAgICAgc3JjOiBzdGFuZGFyZFNyYyxcbiAgICAgICAgICAgIHNyY3NldDogJC5pc0FycmF5KHNyY3NldCkgPyBzcmNzZXQuam9pbigpIDogc3Jjc2V0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuJGxpbmsuYXR0cih0aGlzLm9wdHMubGlua0F0dHJpYnV0ZSwgem9vbUhyZWYpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZWFyZG93blxuICAgICAqL1xuICAgIEVhc3lab29tLnByb3RvdHlwZS50ZWFyZG93biA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcblxuICAgICAgICB0aGlzLiR0YXJnZXRcbiAgICAgICAgICAgIC5vZmYoJy5lYXN5em9vbScpXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2lzLWxvYWRpbmcgaXMtcmVhZHkgaXMtZXJyb3InKTtcblxuICAgICAgICB0aGlzLmRldGFjaE5vdGljZSAmJiBjbGVhclRpbWVvdXQodGhpcy5kZXRhY2hOb3RpY2UpO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLiRsaW5rO1xuICAgICAgICBkZWxldGUgdGhpcy4kem9vbTtcbiAgICAgICAgZGVsZXRlIHRoaXMuJGltYWdlO1xuICAgICAgICBkZWxldGUgdGhpcy4kbm90aWNlO1xuICAgICAgICBkZWxldGUgdGhpcy4kZmx5b3V0O1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLmlzT3BlbjtcbiAgICAgICAgZGVsZXRlIHRoaXMuaXNSZWFkeTtcbiAgICB9O1xuXG4gICAgLy8galF1ZXJ5IHBsdWdpbiB3cmFwcGVyXG4gICAgJC5mbi5lYXN5Wm9vbSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBhcGkgPSAkLmRhdGEodGhpcywgJ2Vhc3lab29tJyk7XG5cbiAgICAgICAgICAgIGlmICghYXBpKSB7XG4gICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsICdlYXN5Wm9vbScsIG5ldyBFYXN5Wm9vbSh0aGlzLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS5pc09wZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFwaS5faW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEVhc3lab29tO1xufSkpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5cbnByZXN0YXNob3AucmVzcG9uc2l2ZSA9IHByZXN0YXNob3AucmVzcG9uc2l2ZSB8fCB7fTtcblxucHJlc3Rhc2hvcC5yZXNwb25zaXZlLmN1cnJlbnRfd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbnByZXN0YXNob3AucmVzcG9uc2l2ZS5taW5fd2lkdGggPSA3Njg7XG5wcmVzdGFzaG9wLnJlc3BvbnNpdmUubW9iaWxlID0gcHJlc3Rhc2hvcC5yZXNwb25zaXZlLmN1cnJlbnRfd2lkdGggPCBwcmVzdGFzaG9wLnJlc3BvbnNpdmUubWluX3dpZHRoO1xuXG5mdW5jdGlvbiBzd2FwQ2hpbGRyZW4ob2JqMSwgb2JqMikge1xuICBjb25zdCB0ZW1wID0gb2JqMi5jaGlsZHJlbigpLmRldGFjaCgpO1xuICBvYmoyLmVtcHR5KCkuYXBwZW5kKG9iajEuY2hpbGRyZW4oKS5kZXRhY2goKSk7XG4gIG9iajEuYXBwZW5kKHRlbXApO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVNb2JpbGVTdHlsZXMoKSB7XG4gIGlmIChwcmVzdGFzaG9wLnJlc3BvbnNpdmUubW9iaWxlKSB7XG4gICAgJChcIipbaWRePSdfZGVza3RvcF8nXVwiKS5lYWNoKChpZHgsIGVsKSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSAkKGAjJHtlbC5pZC5yZXBsYWNlKCdfZGVza3RvcF8nLCAnX21vYmlsZV8nKX1gKTtcblxuICAgICAgaWYgKHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgc3dhcENoaWxkcmVuKCQoZWwpLCB0YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgICQoXCIqW2lkXj0nX21vYmlsZV8nXVwiKS5lYWNoKChpZHgsIGVsKSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSAkKGAjJHtlbC5pZC5yZXBsYWNlKCdfbW9iaWxlXycsICdfZGVza3RvcF8nKX1gKTtcblxuICAgICAgaWYgKHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgc3dhcENoaWxkcmVuKCQoZWwpLCB0YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHByZXN0YXNob3AuZW1pdCgncmVzcG9uc2l2ZSB1cGRhdGUnLCB7XG4gICAgbW9iaWxlOiBwcmVzdGFzaG9wLnJlc3BvbnNpdmUubW9iaWxlLFxuICB9KTtcbn1cblxuJCh3aW5kb3cpLm9uKCdyZXNpemUnLCAoKSA9PiB7XG4gIGNvbnN0IGN3ID0gcHJlc3Rhc2hvcC5yZXNwb25zaXZlLmN1cnJlbnRfd2lkdGg7XG4gIGNvbnN0IG13ID0gcHJlc3Rhc2hvcC5yZXNwb25zaXZlLm1pbl93aWR0aDtcbiAgY29uc3QgdyA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICBjb25zdCB0b2dnbGUgPSAoY3cgPj0gbXcgJiYgdyA8IG13KSB8fCAoY3cgPCBtdyAmJiB3ID49IG13KTtcblxuICBwcmVzdGFzaG9wLnJlc3BvbnNpdmUuY3VycmVudF93aWR0aCA9IHc7XG4gIHByZXN0YXNob3AucmVzcG9uc2l2ZS5tb2JpbGUgPSBwcmVzdGFzaG9wLnJlc3BvbnNpdmUuY3VycmVudF93aWR0aCA8IHByZXN0YXNob3AucmVzcG9uc2l2ZS5taW5fd2lkdGg7XG4gIGlmICh0b2dnbGUpIHtcbiAgICB0b2dnbGVNb2JpbGVTdHlsZXMoKTtcbiAgfVxufSk7XG5cbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcbiAgaWYgKHByZXN0YXNob3AucmVzcG9uc2l2ZS5tb2JpbGUpIHtcbiAgICB0b2dnbGVNb2JpbGVTdHlsZXMoKTtcbiAgfVxufSk7XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tICdwcmVzdGFzaG9wJztcblxuZnVuY3Rpb24gc2V0VXBDaGVja291dCgpIHtcbiAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNoZWNrb3V0LnRlcm1zTGluaykub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBsZXQgdXJsID0gJChldmVudC50YXJnZXQpLmF0dHIoJ2hyZWYnKTtcblxuICAgIGlmICh1cmwpIHtcbiAgICAgIC8vIFRPRE86IEhhbmRsZSByZXF1ZXN0IGlmIG5vIHByZXR0eSBVUkxcbiAgICAgIHVybCArPSAnP2NvbnRlbnRfb25seT0xJztcbiAgICAgICQuZ2V0KHVybCwgKGNvbnRlbnQpID0+IHtcbiAgICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm1vZGFsKVxuICAgICAgICAgIC5maW5kKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubW9kYWxDb250ZW50KVxuICAgICAgICAgIC5odG1sKCQoY29udGVudCkuZmluZCgnLnBhZ2UtY21zJykuY29udGVudHMoKSk7XG4gICAgICB9KS5mYWlsKChyZXNwKSA9PiB7XG4gICAgICAgIHByZXN0YXNob3AuZW1pdCgnaGFuZGxlRXJyb3InLCB7ZXZlbnRUeXBlOiAnY2xpY2tUZXJtcycsIHJlc3B9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5tb2RhbCkubW9kYWwoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNoZWNrb3V0LmdpZnRDaGVja2JveCkub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICQoJyNnaWZ0Jykuc2xpZGVUb2dnbGUoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUltYWdlKCkge1xuICAvLyBBcnJvdyBzaG93L2hpZGUgZGV0YWlscyBDaGVja291dCBwYWdlXG4gICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jaGVja291dC5pbWFnZXNMaW5rKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaWNvbiA9ICQodGhpcykuZmluZCgnaS5tYXRlcmlhbC1pY29ucycpO1xuXG4gICAgaWYgKGljb24udGV4dCgpID09PSAnZXhwYW5kX21vcmUnKSB7XG4gICAgICBpY29uLnRleHQoJ2V4cGFuZF9sZXNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGljb24udGV4dCgnZXhwYW5kX21vcmUnKTtcbiAgICB9XG4gIH0pO1xufVxuXG4kKGZ1bmN0aW9uKCkge1xuICBpZiAoJCgnYm9keSNjaGVja291dCcpLmxlbmd0aCA9PT0gMSkge1xuICAgIHNldFVwQ2hlY2tvdXQoKTtcbiAgICB0b2dnbGVJbWFnZSgpO1xuICB9XG5cbiAgJCgnLnRhYnMnKS5zaW1wbGV0YWJzKClcblxuICBwcmVzdGFzaG9wLm9uKCd1cGRhdGVkRGVsaXZlcnlGb3JtJywgKHBhcmFtcykgPT4ge1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmRlbGl2ZXJ5T3B0aW9uID09PSAndW5kZWZpbmVkJyB8fCBwYXJhbXMuZGVsaXZlcnlPcHRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEhpZGUgYWxsIGNhcnJpZXIgZXh0cmEgY29udGVudCAuLi5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2hlY2tvdXQuY2FycmllckV4dHJhQ29udGVudCkuaGlkZSgpO1xuICAgIC8vIGFuZCBzaG93IHRoZSBvbmUgcmVsYXRlZCB0byB0aGUgc2VsZWN0ZWQgY2FycmllclxuICAgIHBhcmFtcy5kZWxpdmVyeU9wdGlvbi5uZXh0KHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2hlY2tvdXQuY2FycmllckV4dHJhQ29udGVudCkuc2xpZGVEb3duKCk7XG4gIH0pO1xufSk7XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tICdwcmVzdGFzaG9wJztcblxuZnVuY3Rpb24gaW5pdFJtYUl0ZW1TZWxlY3RvcigpIHtcbiAgJChgJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm9yZGVyLnJldHVybkZvcm19IHRhYmxlIHRoZWFkIGlucHV0W3R5cGU9Y2hlY2tib3hdYCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNoZWNrZWQgPSAkKHRoaXMpLnByb3AoJ2NoZWNrZWQnKTtcbiAgICAkKGAke3ByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMub3JkZXIucmV0dXJuRm9ybX0gdGFibGUgdGJvZHkgaW5wdXRbdHlwZT1jaGVja2JveF1gKS5lYWNoKChfLCBjaGVja2JveCkgPT4ge1xuICAgICAgJChjaGVja2JveCkucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0dXBDdXN0b21lclNjcmlwdHMoKSB7XG4gIGlmICgkKCdib2R5I29yZGVyLWRldGFpbCcpKSB7XG4gICAgaW5pdFJtYUl0ZW1TZWxlY3RvcigpO1xuICB9XG59XG5cbiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwQ3VzdG9tZXJTY3JpcHRzKTtcbiIsIi8qISBWZWxvY2l0eUpTLm9yZyAoMS41LjIpLiAoQykgMjAxNCBKdWxpYW4gU2hhcGlyby4gTUlUIEBsaWNlbnNlOiBlbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cclxuXHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiBWZWxvY2l0eSBqUXVlcnkgU2hpbVxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbi8qISBWZWxvY2l0eUpTLm9yZyBqUXVlcnkgU2hpbSAoMS4wLjEpLiAoQykgMjAxNCBUaGUgalF1ZXJ5IEZvdW5kYXRpb24uIE1JVCBAbGljZW5zZTogZW4ud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlLiAqL1xyXG5cclxuLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBqUXVlcnkgZnVuY3Rpb25zIHRoYXQgVmVsb2NpdHkgcmVsaWVzIG9uLCB0aGVyZWJ5IHJlbW92aW5nIFZlbG9jaXR5J3MgZGVwZW5kZW5jeSBvbiBhIGZ1bGwgY29weSBvZiBqUXVlcnksIGFuZCBhbGxvd2luZyBpdCB0byB3b3JrIGluIGFueSBlbnZpcm9ubWVudC4gKi9cclxuLyogVGhlc2Ugc2hpbW1lZCBmdW5jdGlvbnMgYXJlIG9ubHkgdXNlZCBpZiBqUXVlcnkgaXNuJ3QgcHJlc2VudC4gSWYgYm90aCB0aGlzIHNoaW0gYW5kIGpRdWVyeSBhcmUgbG9hZGVkLCBWZWxvY2l0eSBkZWZhdWx0cyB0byBqUXVlcnkgcHJvcGVyLiAqL1xyXG4vKiBCcm93c2VyIHN1cHBvcnQ6IFVzaW5nIHRoaXMgc2hpbSBpbnN0ZWFkIG9mIGpRdWVyeSBwcm9wZXIgcmVtb3ZlcyBzdXBwb3J0IGZvciBJRTguICovXHJcblxyXG4oZnVuY3Rpb24od2luZG93KSB7XHJcblx0XCJ1c2Ugc3RyaWN0XCI7XHJcblx0LyoqKioqKioqKioqKioqKlxyXG5cdCBTZXR1cFxyXG5cdCAqKioqKioqKioqKioqKiovXHJcblxyXG5cdC8qIElmIGpRdWVyeSBpcyBhbHJlYWR5IGxvYWRlZCwgdGhlcmUncyBubyBwb2ludCBpbiBsb2FkaW5nIHRoaXMgc2hpbS4gKi9cclxuXHRpZiAod2luZG93LmpRdWVyeSkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0LyogalF1ZXJ5IGJhc2UuICovXHJcblx0dmFyICQgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCkge1xyXG5cdFx0cmV0dXJuIG5ldyAkLmZuLmluaXQoc2VsZWN0b3IsIGNvbnRleHQpO1xyXG5cdH07XHJcblxyXG5cdC8qKioqKioqKioqKioqKioqKioqKlxyXG5cdCBQcml2YXRlIE1ldGhvZHNcclxuXHQgKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdC8qIGpRdWVyeSAqL1xyXG5cdCQuaXNXaW5kb3cgPSBmdW5jdGlvbihvYmopIHtcclxuXHRcdC8qIGpzaGludCBlcWVxZXE6IGZhbHNlICovXHJcblx0XHRyZXR1cm4gb2JqICYmIG9iaiA9PT0gb2JqLndpbmRvdztcclxuXHR9O1xyXG5cclxuXHQvKiBqUXVlcnkgKi9cclxuXHQkLnR5cGUgPSBmdW5jdGlvbihvYmopIHtcclxuXHRcdGlmICghb2JqKSB7XHJcblx0XHRcdHJldHVybiBvYmogKyBcIlwiO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XHJcblx0XHRcdFx0Y2xhc3MydHlwZVt0b1N0cmluZy5jYWxsKG9iaildIHx8IFwib2JqZWN0XCIgOlxyXG5cdFx0XHRcdHR5cGVvZiBvYmo7XHJcblx0fTtcclxuXHJcblx0LyogalF1ZXJ5ICovXHJcblx0JC5pc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcclxuXHRcdHJldHVybiAkLnR5cGUob2JqKSA9PT0gXCJhcnJheVwiO1xyXG5cdH07XHJcblxyXG5cdC8qIGpRdWVyeSAqL1xyXG5cdGZ1bmN0aW9uIGlzQXJyYXlsaWtlKG9iaikge1xyXG5cdFx0dmFyIGxlbmd0aCA9IG9iai5sZW5ndGgsXHJcblx0XHRcdFx0dHlwZSA9ICQudHlwZShvYmopO1xyXG5cclxuXHRcdGlmICh0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgJC5pc1dpbmRvdyhvYmopKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAob2JqLm5vZGVUeXBlID09PSAxICYmIGxlbmd0aCkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgKGxlbmd0aCAtIDEpIGluIG9iajtcclxuXHR9XHJcblxyXG5cdC8qKioqKioqKioqKioqKipcclxuXHQgJCBNZXRob2RzXHJcblx0ICoqKioqKioqKioqKioqKi9cclxuXHJcblx0LyogalF1ZXJ5OiBTdXBwb3J0IHJlbW92ZWQgZm9yIElFPDkuICovXHJcblx0JC5pc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7XHJcblx0XHR2YXIga2V5O1xyXG5cclxuXHRcdGlmICghb2JqIHx8ICQudHlwZShvYmopICE9PSBcIm9iamVjdFwiIHx8IG9iai5ub2RlVHlwZSB8fCAkLmlzV2luZG93KG9iaikpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdGlmIChvYmouY29uc3RydWN0b3IgJiZcclxuXHRcdFx0XHRcdCFoYXNPd24uY2FsbChvYmosIFwiY29uc3RydWN0b3JcIikgJiZcclxuXHRcdFx0XHRcdCFoYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCBcImlzUHJvdG90eXBlT2ZcIikpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoa2V5IGluIG9iaikge1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBoYXNPd24uY2FsbChvYmosIGtleSk7XHJcblx0fTtcclxuXHJcblx0LyogalF1ZXJ5ICovXHJcblx0JC5lYWNoID0gZnVuY3Rpb24ob2JqLCBjYWxsYmFjaywgYXJncykge1xyXG5cdFx0dmFyIHZhbHVlLFxyXG5cdFx0XHRcdGkgPSAwLFxyXG5cdFx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGgsXHJcblx0XHRcdFx0aXNBcnJheSA9IGlzQXJyYXlsaWtlKG9iaik7XHJcblxyXG5cdFx0aWYgKGFyZ3MpIHtcclxuXHRcdFx0aWYgKGlzQXJyYXkpIHtcclxuXHRcdFx0XHRmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KG9ialtpXSwgYXJncyk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Zm9yIChpIGluIG9iaikge1xyXG5cdFx0XHRcdFx0aWYgKCFvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KG9ialtpXSwgYXJncyk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAoaXNBcnJheSkge1xyXG5cdFx0XHRcdGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2suY2FsbChvYmpbaV0sIGksIG9ialtpXSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Zm9yIChpIGluIG9iaikge1xyXG5cdFx0XHRcdFx0aWYgKCFvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmNhbGwob2JqW2ldLCBpLCBvYmpbaV0pO1xyXG5cclxuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG9iajtcclxuXHR9O1xyXG5cclxuXHQvKiBDdXN0b20gKi9cclxuXHQkLmRhdGEgPSBmdW5jdGlvbihub2RlLCBrZXksIHZhbHVlKSB7XHJcblx0XHQvKiAkLmdldERhdGEoKSAqL1xyXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dmFyIGdldElkID0gbm9kZVskLmV4cGFuZG9dLFxyXG5cdFx0XHRcdFx0c3RvcmUgPSBnZXRJZCAmJiBjYWNoZVtnZXRJZF07XHJcblxyXG5cdFx0XHRpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRyZXR1cm4gc3RvcmU7XHJcblx0XHRcdH0gZWxzZSBpZiAoc3RvcmUpIHtcclxuXHRcdFx0XHRpZiAoa2V5IGluIHN0b3JlKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gc3RvcmVba2V5XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0LyogJC5zZXREYXRhKCkgKi9cclxuXHRcdH0gZWxzZSBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dmFyIHNldElkID0gbm9kZVskLmV4cGFuZG9dIHx8IChub2RlWyQuZXhwYW5kb10gPSArKyQudXVpZCk7XHJcblxyXG5cdFx0XHRjYWNoZVtzZXRJZF0gPSBjYWNoZVtzZXRJZF0gfHwge307XHJcblx0XHRcdGNhY2hlW3NldElkXVtrZXldID0gdmFsdWU7XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyogQ3VzdG9tICovXHJcblx0JC5yZW1vdmVEYXRhID0gZnVuY3Rpb24obm9kZSwga2V5cykge1xyXG5cdFx0dmFyIGlkID0gbm9kZVskLmV4cGFuZG9dLFxyXG5cdFx0XHRcdHN0b3JlID0gaWQgJiYgY2FjaGVbaWRdO1xyXG5cclxuXHRcdGlmIChzdG9yZSkge1xyXG5cdFx0XHQvLyBDbGVhbnVwIHRoZSBlbnRpcmUgc3RvcmUgaWYgbm8ga2V5cyBhcmUgcHJvdmlkZWQuXHJcblx0XHRcdGlmICgha2V5cykge1xyXG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVtpZF07XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0JC5lYWNoKGtleXMsIGZ1bmN0aW9uKF8sIGtleSkge1xyXG5cdFx0XHRcdFx0ZGVsZXRlIHN0b3JlW2tleV07XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQvKiBqUXVlcnkgKi9cclxuXHQkLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIHNyYywgY29weUlzQXJyYXksIGNvcHksIG5hbWUsIG9wdGlvbnMsIGNsb25lLFxyXG5cdFx0XHRcdHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSxcclxuXHRcdFx0XHRpID0gMSxcclxuXHRcdFx0XHRsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxyXG5cdFx0XHRcdGRlZXAgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJib29sZWFuXCIpIHtcclxuXHRcdFx0ZGVlcCA9IHRhcmdldDtcclxuXHJcblx0XHRcdHRhcmdldCA9IGFyZ3VtZW50c1tpXSB8fCB7fTtcclxuXHRcdFx0aSsrO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICQudHlwZSh0YXJnZXQpICE9PSBcImZ1bmN0aW9uXCIpIHtcclxuXHRcdFx0dGFyZ2V0ID0ge307XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGkgPT09IGxlbmd0aCkge1xyXG5cdFx0XHR0YXJnZXQgPSB0aGlzO1xyXG5cdFx0XHRpLS07XHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xyXG5cdFx0XHRpZiAoKG9wdGlvbnMgPSBhcmd1bWVudHNbaV0pKSB7XHJcblx0XHRcdFx0Zm9yIChuYW1lIGluIG9wdGlvbnMpIHtcclxuXHRcdFx0XHRcdGlmICghb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHNyYyA9IHRhcmdldFtuYW1lXTtcclxuXHRcdFx0XHRcdGNvcHkgPSBvcHRpb25zW25hbWVdO1xyXG5cclxuXHRcdFx0XHRcdGlmICh0YXJnZXQgPT09IGNvcHkpIHtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKGRlZXAgJiYgY29weSAmJiAoJC5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9ICQuaXNBcnJheShjb3B5KSkpKSB7XHJcblx0XHRcdFx0XHRcdGlmIChjb3B5SXNBcnJheSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgJC5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgJC5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gJC5leHRlbmQoZGVlcCwgY2xvbmUsIGNvcHkpO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoY29weSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdHRhcmdldFtuYW1lXSA9IGNvcHk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHR9O1xyXG5cclxuXHQvKiBqUXVlcnkgMS40LjMgKi9cclxuXHQkLnF1ZXVlID0gZnVuY3Rpb24oZWxlbSwgdHlwZSwgZGF0YSkge1xyXG5cdFx0ZnVuY3Rpb24gJG1ha2VBcnJheShhcnIsIHJlc3VsdHMpIHtcclxuXHRcdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XHJcblxyXG5cdFx0XHRpZiAoYXJyKSB7XHJcblx0XHRcdFx0aWYgKGlzQXJyYXlsaWtlKE9iamVjdChhcnIpKSkge1xyXG5cdFx0XHRcdFx0LyogJC5tZXJnZSAqL1xyXG5cdFx0XHRcdFx0KGZ1bmN0aW9uKGZpcnN0LCBzZWNvbmQpIHtcclxuXHRcdFx0XHRcdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxyXG5cdFx0XHRcdFx0XHRcdFx0aiA9IDAsXHJcblx0XHRcdFx0XHRcdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRcdFx0d2hpbGUgKGogPCBsZW4pIHtcclxuXHRcdFx0XHRcdFx0XHRmaXJzdFtpKytdID0gc2Vjb25kW2orK107XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChsZW4gIT09IGxlbikge1xyXG5cdFx0XHRcdFx0XHRcdHdoaWxlIChzZWNvbmRbal0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zmlyc3RbaSsrXSA9IHNlY29uZFtqKytdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Zmlyc3QubGVuZ3RoID0gaTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBmaXJzdDtcclxuXHRcdFx0XHRcdH0pKHJldCwgdHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/IFthcnJdIDogYXJyKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0W10ucHVzaC5jYWxsKHJldCwgYXJyKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiByZXQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFlbGVtKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0eXBlID0gKHR5cGUgfHwgXCJmeFwiKSArIFwicXVldWVcIjtcclxuXHJcblx0XHR2YXIgcSA9ICQuZGF0YShlbGVtLCB0eXBlKTtcclxuXHJcblx0XHRpZiAoIWRhdGEpIHtcclxuXHRcdFx0cmV0dXJuIHEgfHwgW107XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFxIHx8ICQuaXNBcnJheShkYXRhKSkge1xyXG5cdFx0XHRxID0gJC5kYXRhKGVsZW0sIHR5cGUsICRtYWtlQXJyYXkoZGF0YSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cS5wdXNoKGRhdGEpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBxO1xyXG5cdH07XHJcblxyXG5cdC8qIGpRdWVyeSAxLjQuMyAqL1xyXG5cdCQuZGVxdWV1ZSA9IGZ1bmN0aW9uKGVsZW1zLCB0eXBlKSB7XHJcblx0XHQvKiBDdXN0b206IEVtYmVkIGVsZW1lbnQgaXRlcmF0aW9uLiAqL1xyXG5cdFx0JC5lYWNoKGVsZW1zLm5vZGVUeXBlID8gW2VsZW1zXSA6IGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKSB7XHJcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcclxuXHJcblx0XHRcdHZhciBxdWV1ZSA9ICQucXVldWUoZWxlbSwgdHlwZSksXHJcblx0XHRcdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XHJcblxyXG5cdFx0XHRpZiAoZm4gPT09IFwiaW5wcm9ncmVzc1wiKSB7XHJcblx0XHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoZm4pIHtcclxuXHRcdFx0XHRpZiAodHlwZSA9PT0gXCJmeFwiKSB7XHJcblx0XHRcdFx0XHRxdWV1ZS51bnNoaWZ0KFwiaW5wcm9ncmVzc1wiKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZuLmNhbGwoZWxlbSwgZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHQkLmRlcXVldWUoZWxlbSwgdHlwZSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH07XHJcblxyXG5cdC8qKioqKioqKioqKioqKioqKipcclxuXHQgJC5mbiBNZXRob2RzXHJcblx0ICoqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0LyogalF1ZXJ5ICovXHJcblx0JC5mbiA9ICQucHJvdG90eXBlID0ge1xyXG5cdFx0aW5pdDogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuXHRcdFx0LyogSnVzdCByZXR1cm4gdGhlIGVsZW1lbnQgd3JhcHBlZCBpbnNpZGUgYW4gYXJyYXk7IGRvbid0IHByb2NlZWQgd2l0aCB0aGUgYWN0dWFsIGpRdWVyeSBub2RlIHdyYXBwaW5nIHByb2Nlc3MuICovXHJcblx0XHRcdGlmIChzZWxlY3Rvci5ub2RlVHlwZSkge1xyXG5cdFx0XHRcdHRoaXNbMF0gPSBzZWxlY3RvcjtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGEgRE9NIG5vZGUuXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0b2Zmc2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0LyogalF1ZXJ5IGFsdGVyZWQgY29kZTogRHJvcHBlZCBkaXNjb25uZWN0ZWQgRE9NIG5vZGUgY2hlY2tpbmcuICovXHJcblx0XHRcdHZhciBib3ggPSB0aGlzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/IHRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiB7dG9wOiAwLCBsZWZ0OiAwfTtcclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0dG9wOiBib3gudG9wICsgKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5zY3JvbGxUb3AgfHwgMCkgLSAoZG9jdW1lbnQuY2xpZW50VG9wIHx8IDApLFxyXG5cdFx0XHRcdGxlZnQ6IGJveC5sZWZ0ICsgKHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvY3VtZW50LmNsaWVudExlZnQgfHwgMClcclxuXHRcdFx0fTtcclxuXHRcdH0sXHJcblx0XHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8qIGpRdWVyeSAqL1xyXG5cdFx0XHRmdW5jdGlvbiBvZmZzZXRQYXJlbnRGbihlbGVtKSB7XHJcblx0XHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50O1xyXG5cclxuXHRcdFx0XHR3aGlsZSAob2Zmc2V0UGFyZW50ICYmIChvZmZzZXRQYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJodG1sXCIgJiYgb2Zmc2V0UGFyZW50LnN0eWxlICYmIG9mZnNldFBhcmVudC5zdHlsZS5wb3NpdGlvbi50b0xvd2VyQ2FzZSgpID09PSBcInN0YXRpY1wiKSkge1xyXG5cdFx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFplcHRvICovXHJcblx0XHRcdHZhciBlbGVtID0gdGhpc1swXSxcclxuXHRcdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudEZuKGVsZW0pLFxyXG5cdFx0XHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKSxcclxuXHRcdFx0XHRcdHBhcmVudE9mZnNldCA9IC9eKD86Ym9keXxodG1sKSQvaS50ZXN0KG9mZnNldFBhcmVudC5ub2RlTmFtZSkgPyB7dG9wOiAwLCBsZWZ0OiAwfSA6ICQob2Zmc2V0UGFyZW50KS5vZmZzZXQoKTtcclxuXHJcblx0XHRcdG9mZnNldC50b3AgLT0gcGFyc2VGbG9hdChlbGVtLnN0eWxlLm1hcmdpblRvcCkgfHwgMDtcclxuXHRcdFx0b2Zmc2V0LmxlZnQgLT0gcGFyc2VGbG9hdChlbGVtLnN0eWxlLm1hcmdpbkxlZnQpIHx8IDA7XHJcblxyXG5cdFx0XHRpZiAob2Zmc2V0UGFyZW50LnN0eWxlKSB7XHJcblx0XHRcdFx0cGFyZW50T2Zmc2V0LnRvcCArPSBwYXJzZUZsb2F0KG9mZnNldFBhcmVudC5zdHlsZS5ib3JkZXJUb3BXaWR0aCkgfHwgMDtcclxuXHRcdFx0XHRwYXJlbnRPZmZzZXQubGVmdCArPSBwYXJzZUZsb2F0KG9mZnNldFBhcmVudC5zdHlsZS5ib3JkZXJMZWZ0V2lkdGgpIHx8IDA7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCxcclxuXHRcdFx0XHRsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0XHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqKioqKioqKioqKioqKioqKioqKipcclxuXHQgUHJpdmF0ZSBWYXJpYWJsZXNcclxuXHQgKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0LyogRm9yICQuZGF0YSgpICovXHJcblx0dmFyIGNhY2hlID0ge307XHJcblx0JC5leHBhbmRvID0gXCJ2ZWxvY2l0eVwiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcclxuXHQkLnV1aWQgPSAwO1xyXG5cclxuXHQvKiBGb3IgJC5xdWV1ZSgpICovXHJcblx0dmFyIGNsYXNzMnR5cGUgPSB7fSxcclxuXHRcdFx0aGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eSxcclxuXHRcdFx0dG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xyXG5cclxuXHR2YXIgdHlwZXMgPSBcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3JcIi5zcGxpdChcIiBcIik7XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0Y2xhc3MydHlwZVtcIltvYmplY3QgXCIgKyB0eXBlc1tpXSArIFwiXVwiXSA9IHR5cGVzW2ldLnRvTG93ZXJDYXNlKCk7XHJcblx0fVxyXG5cclxuXHQvKiBNYWtlcyAkKG5vZGUpIHBvc3NpYmxlLCB3aXRob3V0IGhhdmluZyB0byBjYWxsIGluaXQuICovXHJcblx0JC5mbi5pbml0LnByb3RvdHlwZSA9ICQuZm47XHJcblxyXG5cdC8qIEdsb2JhbGl6ZSBWZWxvY2l0eSBvbnRvIHRoZSB3aW5kb3csIGFuZCBhc3NpZ24gaXRzIFV0aWxpdGllcyBwcm9wZXJ0eS4gKi9cclxuXHR3aW5kb3cuVmVsb2NpdHkgPSB7VXRpbGl0aWVzOiAkfTtcclxufSkod2luZG93KTtcclxuXHJcbi8qKioqKioqKioqKioqKioqKipcclxuIFZlbG9jaXR5LmpzXHJcbiAqKioqKioqKioqKioqKioqKiovXHJcblxyXG4oZnVuY3Rpb24oZmFjdG9yeSkge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG5cdC8qIENvbW1vbkpTIG1vZHVsZS4gKi9cclxuXHRpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xyXG5cdFx0LyogQU1EIG1vZHVsZS4gKi9cclxuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XHJcblx0XHRkZWZpbmUoZmFjdG9yeSk7XHJcblx0XHQvKiBCcm93c2VyIGdsb2JhbHMuICovXHJcblx0fSBlbHNlIHtcclxuXHRcdGZhY3RvcnkoKTtcclxuXHR9XHJcbn0oZnVuY3Rpb24oKSB7XHJcblx0XCJ1c2Ugc3RyaWN0XCI7XHJcblx0cmV0dXJuIGZ1bmN0aW9uKGdsb2JhbCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqKlxyXG5cdFx0IFN1bW1hcnlcclxuXHRcdCAqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0LypcclxuXHRcdCAtIENTUzogQ1NTIHN0YWNrIHRoYXQgd29ya3MgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSByZXN0IG9mIFZlbG9jaXR5LlxyXG5cdFx0IC0gYW5pbWF0ZSgpOiBDb3JlIGFuaW1hdGlvbiBtZXRob2QgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSB0YXJnZXRlZCBlbGVtZW50cyBhbmQgcXVldWVzIHRoZSBpbmNvbWluZyBjYWxsIG9udG8gZWFjaCBlbGVtZW50IGluZGl2aWR1YWxseS5cclxuXHRcdCAtIFByZS1RdWV1ZWluZzogUHJlcGFyZSB0aGUgZWxlbWVudCBmb3IgYW5pbWF0aW9uIGJ5IGluc3RhbnRpYXRpbmcgaXRzIGRhdGEgY2FjaGUgYW5kIHByb2Nlc3NpbmcgdGhlIGNhbGwncyBvcHRpb25zLlxyXG5cdFx0IC0gUXVldWVpbmc6IFRoZSBsb2dpYyB0aGF0IHJ1bnMgb25jZSB0aGUgY2FsbCBoYXMgcmVhY2hlZCBpdHMgcG9pbnQgb2YgZXhlY3V0aW9uIGluIHRoZSBlbGVtZW50J3MgJC5xdWV1ZSgpIHN0YWNrLlxyXG5cdFx0IE1vc3QgbG9naWMgaXMgcGxhY2VkIGhlcmUgdG8gYXZvaWQgcmlza2luZyBpdCBiZWNvbWluZyBzdGFsZSAoaWYgdGhlIGVsZW1lbnQncyBwcm9wZXJ0aWVzIGhhdmUgY2hhbmdlZCkuXHJcblx0XHQgLSBQdXNoaW5nOiBDb25zb2xpZGF0aW9uIG9mIHRoZSB0d2VlbiBkYXRhIGZvbGxvd2VkIGJ5IGl0cyBwdXNoIG9udG8gdGhlIGdsb2JhbCBpbi1wcm9ncmVzcyBjYWxscyBjb250YWluZXIuXHJcblx0XHQgLSB0aWNrKCk6IFRoZSBzaW5nbGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGxvb3AgcmVzcG9uc2libGUgZm9yIHR3ZWVuaW5nIGFsbCBpbi1wcm9ncmVzcyBjYWxscy5cclxuXHRcdCAtIGNvbXBsZXRlQ2FsbCgpOiBIYW5kbGVzIHRoZSBjbGVhbnVwIHByb2Nlc3MgZm9yIGVhY2ggVmVsb2NpdHkgY2FsbC5cclxuXHRcdCAqL1xyXG5cclxuXHRcdC8qKioqKioqKioqKioqKioqKioqKipcclxuXHRcdCBIZWxwZXIgRnVuY3Rpb25zXHJcblx0XHQgKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdC8qIElFIGRldGVjdGlvbi4gR2lzdDogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vanVsaWFuc2hhcGlyby85MDk4NjA5ICovXHJcblx0XHR2YXIgSUUgPSAoZnVuY3Rpb24oKSB7XHJcblx0XHRcdGlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAodmFyIGkgPSA3OyBpID4gNDsgaS0tKSB7XHJcblx0XHRcdFx0XHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcblx0XHRcdFx0XHRkaXYuaW5uZXJIVE1MID0gXCI8IS0tW2lmIElFIFwiICsgaSArIFwiXT48c3Bhbj48L3NwYW4+PCFbZW5kaWZdLS0+XCI7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNwYW5cIikubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdGRpdiA9IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gaTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9KSgpO1xyXG5cclxuXHRcdC8qIHJBRiBzaGltLiBHaXN0OiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qdWxpYW5zaGFwaXJvLzk0OTc1MTMgKi9cclxuXHRcdHZhciByQUZTaGltID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgdGltZUxhc3QgPSAwO1xyXG5cclxuXHRcdFx0cmV0dXJuIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBmdW5jdGlvbihjYWxsYmFjaykge1xyXG5cdFx0XHRcdHZhciB0aW1lQ3VycmVudCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksXHJcblx0XHRcdFx0XHRcdHRpbWVEZWx0YTtcclxuXHJcblx0XHRcdFx0LyogRHluYW1pY2FsbHkgc2V0IGRlbGF5IG9uIGEgcGVyLXRpY2sgYmFzaXMgdG8gbWF0Y2ggNjBmcHMuICovXHJcblx0XHRcdFx0LyogVGVjaG5pcXVlIGJ5IEVyaWsgTW9sbGVyLiBNSVQgbGljZW5zZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzE1Nzk2NzEgKi9cclxuXHRcdFx0XHR0aW1lRGVsdGEgPSBNYXRoLm1heCgwLCAxNiAtICh0aW1lQ3VycmVudCAtIHRpbWVMYXN0KSk7XHJcblx0XHRcdFx0dGltZUxhc3QgPSB0aW1lQ3VycmVudCArIHRpbWVEZWx0YTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRjYWxsYmFjayh0aW1lQ3VycmVudCArIHRpbWVEZWx0YSk7XHJcblx0XHRcdFx0fSwgdGltZURlbHRhKTtcclxuXHRcdFx0fTtcclxuXHRcdH0pKCk7XHJcblxyXG5cdFx0dmFyIHBlcmZvcm1hbmNlID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgcGVyZiA9IHdpbmRvdy5wZXJmb3JtYW5jZSB8fCB7fTtcclxuXHJcblx0XHRcdGlmICh0eXBlb2YgcGVyZi5ub3cgIT09IFwiZnVuY3Rpb25cIikge1xyXG5cdFx0XHRcdHZhciBub3dPZmZzZXQgPSBwZXJmLnRpbWluZyAmJiBwZXJmLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQgPyBwZXJmLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xyXG5cclxuXHRcdFx0XHRwZXJmLm5vdyA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBub3dPZmZzZXQ7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcGVyZjtcclxuXHRcdH0pKCk7XHJcblxyXG5cdFx0LyogQXJyYXkgY29tcGFjdGluZy4gQ29weXJpZ2h0IExvLURhc2guIE1JVCBMaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dCAqL1xyXG5cdFx0ZnVuY3Rpb24gY29tcGFjdFNwYXJzZUFycmF5KGFycmF5KSB7XHJcblx0XHRcdHZhciBpbmRleCA9IC0xLFxyXG5cdFx0XHRcdFx0bGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxyXG5cdFx0XHRcdFx0cmVzdWx0ID0gW107XHJcblxyXG5cdFx0XHR3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG5cdFx0XHRcdHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcclxuXHJcblx0XHRcdFx0aWYgKHZhbHVlKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaCh2YWx1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2hpbSBmb3IgXCJmaXhpbmdcIiBJRSdzIGxhY2sgb2Ygc3VwcG9ydCAoSUUgPCA5KSBmb3IgYXBwbHlpbmcgc2xpY2VcclxuXHRcdCAqIG9uIGhvc3Qgb2JqZWN0cyBsaWtlIE5hbWVkTm9kZU1hcCwgTm9kZUxpc3QsIGFuZCBIVE1MQ29sbGVjdGlvblxyXG5cdFx0ICogKHRlY2huaWNhbGx5LCBzaW5jZSBob3N0IG9iamVjdHMgaGF2ZSBiZWVuIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCxcclxuXHRcdCAqIGF0IGxlYXN0IGJlZm9yZSBFUzIwMTUsIElFIGhhc24ndCBuZWVkZWQgdG8gd29yayB0aGlzIHdheSkuXHJcblx0XHQgKiBBbHNvIHdvcmtzIG9uIHN0cmluZ3MsIGZpeGVzIElFIDwgOSB0byBhbGxvdyBhbiBleHBsaWNpdCB1bmRlZmluZWRcclxuXHRcdCAqIGZvciB0aGUgMm5kIGFyZ3VtZW50IChhcyBpbiBGaXJlZm94KSwgYW5kIHByZXZlbnRzIGVycm9ycyB3aGVuXHJcblx0XHQgKiBjYWxsZWQgb24gb3RoZXIgRE9NIG9iamVjdHMuXHJcblx0XHQgKi9cclxuXHRcdHZhciBfc2xpY2UgPSAoZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Ly8gQ2FuJ3QgYmUgdXNlZCB3aXRoIERPTSBlbGVtZW50cyBpbiBJRSA8IDlcclxuXHRcdFx0XHRzbGljZS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XHJcblx0XHRcdFx0cmV0dXJuIHNsaWNlO1xyXG5cdFx0XHR9IGNhdGNoIChlKSB7IC8vIEZhaWxzIGluIElFIDwgOVxyXG5cclxuXHRcdFx0XHQvLyBUaGlzIHdpbGwgd29yayBmb3IgZ2VudWluZSBhcnJheXMsIGFycmF5LWxpa2Ugb2JqZWN0cywgXHJcblx0XHRcdFx0Ly8gTmFtZWROb2RlTWFwIChhdHRyaWJ1dGVzLCBlbnRpdGllcywgbm90YXRpb25zKSxcclxuXHRcdFx0XHQvLyBOb2RlTGlzdCAoZS5nLiwgZ2V0RWxlbWVudHNCeVRhZ05hbWUpLCBIVE1MQ29sbGVjdGlvbiAoZS5nLiwgY2hpbGROb2RlcyksXHJcblx0XHRcdFx0Ly8gYW5kIHdpbGwgbm90IGZhaWwgb24gb3RoZXIgRE9NIG9iamVjdHMgKGFzIGRvIERPTSBlbGVtZW50cyBpbiBJRSA8IDkpXHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcclxuXHRcdFx0XHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0XHRpZiAodHlwZW9mIGJlZ2luICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRcdFx0XHRcdGJlZ2luID0gMDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIElFIDwgOSBnZXRzIHVuaGFwcHkgd2l0aCBhbiB1bmRlZmluZWQgZW5kIGFyZ3VtZW50XHJcblx0XHRcdFx0XHRpZiAodHlwZW9mIGVuZCAhPT0gXCJudW1iZXJcIikge1xyXG5cdFx0XHRcdFx0XHRlbmQgPSBsZW47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBGb3IgbmF0aXZlIEFycmF5IG9iamVjdHMsIHdlIHVzZSB0aGUgbmF0aXZlIHNsaWNlIGZ1bmN0aW9uXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zbGljZSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCh0aGlzLCBiZWdpbiwgZW5kKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIEZvciBhcnJheSBsaWtlIG9iamVjdCB3ZSBoYW5kbGUgaXQgb3Vyc2VsdmVzLlxyXG5cdFx0XHRcdFx0dmFyIGksXHJcblx0XHRcdFx0XHRcdFx0Y2xvbmVkID0gW10sXHJcblx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIG5lZ2F0aXZlIHZhbHVlIGZvciBcImJlZ2luXCJcclxuXHRcdFx0XHRcdFx0XHRzdGFydCA9IChiZWdpbiA+PSAwKSA/IGJlZ2luIDogTWF0aC5tYXgoMCwgbGVuICsgYmVnaW4pLFxyXG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBuZWdhdGl2ZSB2YWx1ZSBmb3IgXCJlbmRcIlxyXG5cdFx0XHRcdFx0XHRcdHVwVG8gPSBlbmQgPCAwID8gbGVuICsgZW5kIDogTWF0aC5taW4oZW5kLCBsZW4pLFxyXG5cdFx0XHRcdFx0XHRcdC8vIEFjdHVhbCBleHBlY3RlZCBzaXplIG9mIHRoZSBzbGljZVxyXG5cdFx0XHRcdFx0XHRcdHNpemUgPSB1cFRvIC0gc3RhcnQ7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHNpemUgPiAwKSB7XHJcblx0XHRcdFx0XHRcdGNsb25lZCA9IG5ldyBBcnJheShzaXplKTtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuY2hhckF0KSB7XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2xvbmVkW2ldID0gdGhpcy5jaGFyQXQoc3RhcnQgKyBpKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2xvbmVkW2ldID0gdGhpc1tzdGFydCArIGldO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIGNsb25lZDtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblx0XHR9KSgpO1xyXG5cclxuXHRcdC8qIC5pbmRleE9mIGRvZXNuJ3QgZXhpc3QgaW4gSUU8OSAqL1xyXG5cdFx0dmFyIF9pbkFycmF5ID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRpZiAoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGFyciwgdmFsKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gYXJyLmluY2x1ZGVzKHZhbCk7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcclxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oYXJyLCB2YWwpIHtcclxuXHRcdFx0XHRcdHJldHVybiBhcnIuaW5kZXhPZih2YWwpID49IDA7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oYXJyLCB2YWwpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0aWYgKGFycltpXSA9PT0gdmFsKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH07XHJcblx0XHR9KTtcclxuXHJcblx0XHRmdW5jdGlvbiBzYW5pdGl6ZUVsZW1lbnRzKGVsZW1lbnRzKSB7XHJcblx0XHRcdC8qIFVud3JhcCBqUXVlcnkvWmVwdG8gb2JqZWN0cy4gKi9cclxuXHRcdFx0aWYgKFR5cGUuaXNXcmFwcGVkKGVsZW1lbnRzKSkge1xyXG5cdFx0XHRcdGVsZW1lbnRzID0gX3NsaWNlLmNhbGwoZWxlbWVudHMpO1xyXG5cdFx0XHRcdC8qIFdyYXAgYSBzaW5nbGUgZWxlbWVudCBpbiBhbiBhcnJheSBzbyB0aGF0ICQuZWFjaCgpIGNhbiBpdGVyYXRlIHdpdGggdGhlIGVsZW1lbnQgaW5zdGVhZCBvZiBpdHMgbm9kZSdzIGNoaWxkcmVuLiAqL1xyXG5cdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNOb2RlKGVsZW1lbnRzKSkge1xyXG5cdFx0XHRcdGVsZW1lbnRzID0gW2VsZW1lbnRzXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGVsZW1lbnRzO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBUeXBlID0ge1xyXG5cdFx0XHRpc051bWJlcjogZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gKHR5cGVvZiB2YXJpYWJsZSA9PT0gXCJudW1iZXJcIik7XHJcblx0XHRcdH0sXHJcblx0XHRcdGlzU3RyaW5nOiBmdW5jdGlvbih2YXJpYWJsZSkge1xyXG5cdFx0XHRcdHJldHVybiAodHlwZW9mIHZhcmlhYmxlID09PSBcInN0cmluZ1wiKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0aXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YXJpYWJsZSkge1xyXG5cdFx0XHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFyaWFibGUpID09PSBcIltvYmplY3QgQXJyYXldXCI7XHJcblx0XHRcdH0sXHJcblx0XHRcdGlzRnVuY3Rpb246IGZ1bmN0aW9uKHZhcmlhYmxlKSB7XHJcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YXJpYWJsZSkgPT09IFwiW29iamVjdCBGdW5jdGlvbl1cIjtcclxuXHRcdFx0fSxcclxuXHRcdFx0aXNOb2RlOiBmdW5jdGlvbih2YXJpYWJsZSkge1xyXG5cdFx0XHRcdHJldHVybiB2YXJpYWJsZSAmJiB2YXJpYWJsZS5ub2RlVHlwZTtcclxuXHRcdFx0fSxcclxuXHRcdFx0LyogRGV0ZXJtaW5lIGlmIHZhcmlhYmxlIGlzIGFuIGFycmF5LWxpa2Ugd3JhcHBlZCBqUXVlcnksIFplcHRvIG9yIHNpbWlsYXIgZWxlbWVudCwgb3IgZXZlbiBhIE5vZGVMaXN0IGV0Yy4gKi9cclxuXHRcdFx0LyogTk9URTogSFRNTEZvcm1FbGVtZW50cyBhbHNvIGhhdmUgYSBsZW5ndGguICovXHJcblx0XHRcdGlzV3JhcHBlZDogZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gdmFyaWFibGVcclxuXHRcdFx0XHRcdFx0JiYgdmFyaWFibGUgIT09IHdpbmRvd1xyXG5cdFx0XHRcdFx0XHQmJiBUeXBlLmlzTnVtYmVyKHZhcmlhYmxlLmxlbmd0aClcclxuXHRcdFx0XHRcdFx0JiYgIVR5cGUuaXNTdHJpbmcodmFyaWFibGUpXHJcblx0XHRcdFx0XHRcdCYmICFUeXBlLmlzRnVuY3Rpb24odmFyaWFibGUpXHJcblx0XHRcdFx0XHRcdCYmICFUeXBlLmlzTm9kZSh2YXJpYWJsZSlcclxuXHRcdFx0XHRcdFx0JiYgKHZhcmlhYmxlLmxlbmd0aCA9PT0gMCB8fCBUeXBlLmlzTm9kZSh2YXJpYWJsZVswXSkpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRpc1NWRzogZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gd2luZG93LlNWR0VsZW1lbnQgJiYgKHZhcmlhYmxlIGluc3RhbmNlb2Ygd2luZG93LlNWR0VsZW1lbnQpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbih2YXJpYWJsZSkge1xyXG5cdFx0XHRcdGZvciAodmFyIG5hbWUgaW4gdmFyaWFibGUpIHtcclxuXHRcdFx0XHRcdGlmICh2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0XHQvKioqKioqKioqKioqKioqKipcclxuXHRcdCBEZXBlbmRlbmNpZXNcclxuXHRcdCAqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHR2YXIgJCxcclxuXHRcdFx0XHRpc0pRdWVyeSA9IGZhbHNlO1xyXG5cclxuXHRcdGlmIChnbG9iYWwuZm4gJiYgZ2xvYmFsLmZuLmpxdWVyeSkge1xyXG5cdFx0XHQkID0gZ2xvYmFsO1xyXG5cdFx0XHRpc0pRdWVyeSA9IHRydWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQkID0gd2luZG93LlZlbG9jaXR5LlV0aWxpdGllcztcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoSUUgPD0gOCAmJiAhaXNKUXVlcnkpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVmVsb2NpdHk6IElFOCBhbmQgYmVsb3cgcmVxdWlyZSBqUXVlcnkgdG8gYmUgbG9hZGVkIGJlZm9yZSBWZWxvY2l0eS5cIik7XHJcblx0XHR9IGVsc2UgaWYgKElFIDw9IDcpIHtcclxuXHRcdFx0LyogUmV2ZXJ0IHRvIGpRdWVyeSdzICQuYW5pbWF0ZSgpLCBhbmQgbG9zZSBWZWxvY2l0eSdzIGV4dHJhIGZlYXR1cmVzLiAqL1xyXG5cdFx0XHRqUXVlcnkuZm4udmVsb2NpdHkgPSBqUXVlcnkuZm4uYW5pbWF0ZTtcclxuXHJcblx0XHRcdC8qIE5vdyB0aGF0ICQuZm4udmVsb2NpdHkgaXMgYWxpYXNlZCwgYWJvcnQgdGhpcyBWZWxvY2l0eSBkZWNsYXJhdGlvbi4gKi9cclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKioqKioqKioqKioqKioqKlxyXG5cdFx0IENvbnN0YW50c1xyXG5cdFx0ICoqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdHZhciBEVVJBVElPTl9ERUZBVUxUID0gNDAwLFxyXG5cdFx0XHRcdEVBU0lOR19ERUZBVUxUID0gXCJzd2luZ1wiO1xyXG5cclxuXHRcdC8qKioqKioqKioqKioqXHJcblx0XHQgU3RhdGVcclxuXHRcdCAqKioqKioqKioqKioqL1xyXG5cclxuXHRcdHZhciBWZWxvY2l0eSA9IHtcclxuXHRcdFx0LyogQ29udGFpbmVyIGZvciBwYWdlLXdpZGUgVmVsb2NpdHkgc3RhdGUgZGF0YS4gKi9cclxuXHRcdFx0U3RhdGU6IHtcclxuXHRcdFx0XHQvKiBEZXRlY3QgbW9iaWxlIGRldmljZXMgdG8gZGV0ZXJtaW5lIGlmIG1vYmlsZUhBIHNob3VsZCBiZSB0dXJuZWQgb24uICovXHJcblx0XHRcdFx0aXNNb2JpbGU6IC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksXHJcblx0XHRcdFx0LyogVGhlIG1vYmlsZUhBIG9wdGlvbidzIGJlaGF2aW9yIGNoYW5nZXMgb24gb2xkZXIgQW5kcm9pZCBkZXZpY2VzIChHaW5nZXJicmVhZCwgdmVyc2lvbnMgMi4zLjMtMi4zLjcpLiAqL1xyXG5cdFx0XHRcdGlzQW5kcm9pZDogL0FuZHJvaWQvaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSxcclxuXHRcdFx0XHRpc0dpbmdlcmJyZWFkOiAvQW5kcm9pZCAyXFwuM1xcLlszLTddL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksXHJcblx0XHRcdFx0aXNDaHJvbWU6IHdpbmRvdy5jaHJvbWUsXHJcblx0XHRcdFx0aXNGaXJlZm94OiAvRmlyZWZveC9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpLFxyXG5cdFx0XHRcdC8qIENyZWF0ZSBhIGNhY2hlZCBlbGVtZW50IGZvciByZS11c2Ugd2hlbiBjaGVja2luZyBmb3IgQ1NTIHByb3BlcnR5IHByZWZpeGVzLiAqL1xyXG5cdFx0XHRcdHByZWZpeEVsZW1lbnQ6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXHJcblx0XHRcdFx0LyogQ2FjaGUgZXZlcnkgcHJlZml4IG1hdGNoIHRvIGF2b2lkIHJlcGVhdGluZyBsb29rdXBzLiAqL1xyXG5cdFx0XHRcdHByZWZpeE1hdGNoZXM6IHt9LFxyXG5cdFx0XHRcdC8qIENhY2hlIHRoZSBhbmNob3IgdXNlZCBmb3IgYW5pbWF0aW5nIHdpbmRvdyBzY3JvbGxpbmcuICovXHJcblx0XHRcdFx0c2Nyb2xsQW5jaG9yOiBudWxsLFxyXG5cdFx0XHRcdC8qIENhY2hlIHRoZSBicm93c2VyLXNwZWNpZmljIHByb3BlcnR5IG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Nyb2xsIGFuY2hvci4gKi9cclxuXHRcdFx0XHRzY3JvbGxQcm9wZXJ0eUxlZnQ6IG51bGwsXHJcblx0XHRcdFx0c2Nyb2xsUHJvcGVydHlUb3A6IG51bGwsXHJcblx0XHRcdFx0LyogS2VlcCB0cmFjayBvZiB3aGV0aGVyIG91ciBSQUYgdGljayBpcyBydW5uaW5nLiAqL1xyXG5cdFx0XHRcdGlzVGlja2luZzogZmFsc2UsXHJcblx0XHRcdFx0LyogQ29udGFpbmVyIGZvciBldmVyeSBpbi1wcm9ncmVzcyBjYWxsIHRvIFZlbG9jaXR5LiAqL1xyXG5cdFx0XHRcdGNhbGxzOiBbXSxcclxuXHRcdFx0XHRkZWxheWVkRWxlbWVudHM6IHtcclxuXHRcdFx0XHRcdGNvdW50OiAwXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKiBWZWxvY2l0eSdzIGN1c3RvbSBDU1Mgc3RhY2suIE1hZGUgZ2xvYmFsIGZvciB1bml0IHRlc3RpbmcuICovXHJcblx0XHRcdENTUzogey8qIERlZmluZWQgYmVsb3cuICovfSxcclxuXHRcdFx0LyogQSBzaGltIG9mIHRoZSBqUXVlcnkgdXRpbGl0eSBmdW5jdGlvbnMgdXNlZCBieSBWZWxvY2l0eSAtLSBwcm92aWRlZCBieSBWZWxvY2l0eSdzIG9wdGlvbmFsIGpRdWVyeSBzaGltLiAqL1xyXG5cdFx0XHRVdGlsaXRpZXM6ICQsXHJcblx0XHRcdC8qIENvbnRhaW5lciBmb3IgdGhlIHVzZXIncyBjdXN0b20gYW5pbWF0aW9uIHJlZGlyZWN0cyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IG5hbWUgaW4gcGxhY2Ugb2YgdGhlIHByb3BlcnRpZXMgbWFwIGFyZ3VtZW50LiAqL1xyXG5cdFx0XHRSZWRpcmVjdHM6IHsvKiBNYW51YWxseSByZWdpc3RlcmVkIGJ5IHRoZSB1c2VyLiAqL30sXHJcblx0XHRcdEVhc2luZ3M6IHsvKiBEZWZpbmVkIGJlbG93LiAqL30sXHJcblx0XHRcdC8qIEF0dGVtcHQgdG8gdXNlIEVTNiBQcm9taXNlcyBieSBkZWZhdWx0LiBVc2VycyBjYW4gb3ZlcnJpZGUgdGhpcyB3aXRoIGEgdGhpcmQtcGFydHkgcHJvbWlzZXMgbGlicmFyeS4gKi9cclxuXHRcdFx0UHJvbWlzZTogd2luZG93LlByb21pc2UsXHJcblx0XHRcdC8qIFZlbG9jaXR5IG9wdGlvbiBkZWZhdWx0cywgd2hpY2ggY2FuIGJlIG92ZXJyaWRlbiBieSB0aGUgdXNlci4gKi9cclxuXHRcdFx0ZGVmYXVsdHM6IHtcclxuXHRcdFx0XHRxdWV1ZTogXCJcIixcclxuXHRcdFx0XHRkdXJhdGlvbjogRFVSQVRJT05fREVGQVVMVCxcclxuXHRcdFx0XHRlYXNpbmc6IEVBU0lOR19ERUZBVUxULFxyXG5cdFx0XHRcdGJlZ2luOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0Y29tcGxldGU6IHVuZGVmaW5lZCxcclxuXHRcdFx0XHRwcm9ncmVzczogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdGRpc3BsYXk6IHVuZGVmaW5lZCxcclxuXHRcdFx0XHR2aXNpYmlsaXR5OiB1bmRlZmluZWQsXHJcblx0XHRcdFx0bG9vcDogZmFsc2UsXHJcblx0XHRcdFx0ZGVsYXk6IGZhbHNlLFxyXG5cdFx0XHRcdG1vYmlsZUhBOiB0cnVlLFxyXG5cdFx0XHRcdC8qIEFkdmFuY2VkOiBTZXQgdG8gZmFsc2UgdG8gcHJldmVudCBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBiZWluZyBjYWNoZWQgYmV0d2VlbiBjb25zZWN1dGl2ZSBWZWxvY2l0eS1pbml0aWF0ZWQgY2hhaW4gY2FsbHMuICovXHJcblx0XHRcdFx0X2NhY2hlVmFsdWVzOiB0cnVlLFxyXG5cdFx0XHRcdC8qIEFkdmFuY2VkOiBTZXQgdG8gZmFsc2UgaWYgdGhlIHByb21pc2Ugc2hvdWxkIGFsd2F5cyByZXNvbHZlIG9uIGVtcHR5IGVsZW1lbnQgbGlzdHMuICovXHJcblx0XHRcdFx0cHJvbWlzZVJlamVjdEVtcHR5OiB0cnVlXHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIEEgZGVzaWduIGdvYWwgb2YgVmVsb2NpdHkgaXMgdG8gY2FjaGUgZGF0YSB3aGVyZXZlciBwb3NzaWJsZSBpbiBvcmRlciB0byBhdm9pZCBET00gcmVxdWVyeWluZy4gQWNjb3JkaW5nbHksIGVhY2ggZWxlbWVudCBoYXMgYSBkYXRhIGNhY2hlLiAqL1xyXG5cdFx0XHRpbml0OiBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRcdFx0JC5kYXRhKGVsZW1lbnQsIFwidmVsb2NpdHlcIiwge1xyXG5cdFx0XHRcdFx0LyogU3RvcmUgd2hldGhlciB0aGlzIGlzIGFuIFNWRyBlbGVtZW50LCBzaW5jZSBpdHMgcHJvcGVydGllcyBhcmUgcmV0cmlldmVkIGFuZCB1cGRhdGVkIGRpZmZlcmVudGx5IHRoYW4gc3RhbmRhcmQgSFRNTCBlbGVtZW50cy4gKi9cclxuXHRcdFx0XHRcdGlzU1ZHOiBUeXBlLmlzU1ZHKGVsZW1lbnQpLFxyXG5cdFx0XHRcdFx0LyogS2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGN1cnJlbnRseSBiZWluZyBhbmltYXRlZCBieSBWZWxvY2l0eS5cclxuXHRcdFx0XHRcdCBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgcHJvcGVydHkgdmFsdWVzIGFyZSBub3QgdHJhbnNmZXJyZWQgYmV0d2VlbiBub24tY29uc2VjdXRpdmUgKHN0YWxlKSBjYWxscy4gKi9cclxuXHRcdFx0XHRcdGlzQW5pbWF0aW5nOiBmYWxzZSxcclxuXHRcdFx0XHRcdC8qIEEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50J3MgbGl2ZSBjb21wdXRlZFN0eWxlIG9iamVjdC4gTGVhcm4gbW9yZSBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9BUEkvd2luZG93LmdldENvbXB1dGVkU3R5bGUgKi9cclxuXHRcdFx0XHRcdGNvbXB1dGVkU3R5bGU6IG51bGwsXHJcblx0XHRcdFx0XHQvKiBUd2VlbiBkYXRhIGlzIGNhY2hlZCBmb3IgZWFjaCBhbmltYXRpb24gb24gdGhlIGVsZW1lbnQgc28gdGhhdCBkYXRhIGNhbiBiZSBwYXNzZWQgYWNyb3NzIGNhbGxzIC0tXHJcblx0XHRcdFx0XHQgaW4gcGFydGljdWxhciwgZW5kIHZhbHVlcyBhcmUgdXNlZCBhcyBzdWJzZXF1ZW50IHN0YXJ0IHZhbHVlcyBpbiBjb25zZWN1dGl2ZSBWZWxvY2l0eSBjYWxscy4gKi9cclxuXHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lcjogbnVsbCxcclxuXHRcdFx0XHRcdC8qIFRoZSBmdWxsIHJvb3QgcHJvcGVydHkgdmFsdWVzIG9mIGVhY2ggQ1NTIGhvb2sgYmVpbmcgYW5pbWF0ZWQgb24gdGhpcyBlbGVtZW50IGFyZSBjYWNoZWQgc28gdGhhdDpcclxuXHRcdFx0XHRcdCAxKSBDb25jdXJyZW50bHktYW5pbWF0aW5nIGhvb2tzIHNoYXJpbmcgdGhlIHNhbWUgcm9vdCBjYW4gaGF2ZSB0aGVpciByb290IHZhbHVlcycgbWVyZ2VkIGludG8gb25lIHdoaWxlIHR3ZWVuaW5nLlxyXG5cdFx0XHRcdFx0IDIpIFBvc3QtaG9vay1pbmplY3Rpb24gcm9vdCB2YWx1ZXMgY2FuIGJlIHRyYW5zZmVycmVkIG92ZXIgdG8gY29uc2VjdXRpdmVseSBjaGFpbmVkIFZlbG9jaXR5IGNhbGxzIGFzIHN0YXJ0aW5nIHJvb3QgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWVDYWNoZToge30sXHJcblx0XHRcdFx0XHQvKiBBIGNhY2hlIGZvciB0cmFuc2Zvcm0gdXBkYXRlcywgd2hpY2ggbXVzdCBiZSBtYW51YWxseSBmbHVzaGVkIHZpYSBDU1MuZmx1c2hUcmFuc2Zvcm1DYWNoZSgpLiAqL1xyXG5cdFx0XHRcdFx0dHJhbnNmb3JtQ2FjaGU6IHt9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIEEgcGFyYWxsZWwgdG8galF1ZXJ5J3MgJC5jc3MoKSwgdXNlZCBmb3IgZ2V0dGluZy9zZXR0aW5nIFZlbG9jaXR5J3MgaG9va2VkIENTUyBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRob29rOiBudWxsLCAvKiBEZWZpbmVkIGJlbG93LiAqL1xyXG5cdFx0XHQvKiBWZWxvY2l0eS13aWRlIGFuaW1hdGlvbiB0aW1lIHJlbWFwcGluZyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi9cclxuXHRcdFx0bW9jazogZmFsc2UsXHJcblx0XHRcdHZlcnNpb246IHttYWpvcjogMSwgbWlub3I6IDUsIHBhdGNoOiAyfSxcclxuXHRcdFx0LyogU2V0IHRvIDEgb3IgMiAobW9zdCB2ZXJib3NlKSB0byBvdXRwdXQgZGVidWcgaW5mbyB0byBjb25zb2xlLiAqL1xyXG5cdFx0XHRkZWJ1ZzogZmFsc2UsXHJcblx0XHRcdC8qIFVzZSByQUYgaGlnaCByZXNvbHV0aW9uIHRpbWVzdGFtcCB3aGVuIGF2YWlsYWJsZSAqL1xyXG5cdFx0XHR0aW1lc3RhbXA6IHRydWUsXHJcblx0XHRcdC8qIFBhdXNlIGFsbCBhbmltYXRpb25zICovXHJcblx0XHRcdHBhdXNlQWxsOiBmdW5jdGlvbihxdWV1ZU5hbWUpIHtcclxuXHRcdFx0XHR2YXIgY3VycmVudFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xyXG5cclxuXHRcdFx0XHQkLmVhY2goVmVsb2NpdHkuU3RhdGUuY2FsbHMsIGZ1bmN0aW9uKGksIGFjdGl2ZUNhbGwpIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoYWN0aXZlQ2FsbCkge1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgd2UgaGF2ZSBhIHF1ZXVlTmFtZSBhbmQgdGhpcyBjYWxsIGlzIG5vdCBvbiB0aGF0IHF1ZXVlLCBza2lwICovXHJcblx0XHRcdFx0XHRcdGlmIChxdWV1ZU5hbWUgIT09IHVuZGVmaW5lZCAmJiAoKGFjdGl2ZUNhbGxbMl0ucXVldWUgIT09IHF1ZXVlTmFtZSkgfHwgKGFjdGl2ZUNhbGxbMl0ucXVldWUgPT09IGZhbHNlKSkpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogU2V0IGNhbGwgdG8gcGF1c2VkICovXHJcblx0XHRcdFx0XHRcdGFjdGl2ZUNhbGxbNV0gPSB7XHJcblx0XHRcdFx0XHRcdFx0cmVzdW1lOiBmYWxzZVxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHQvKiBQYXVzZSB0aW1lcnMgb24gYW55IGN1cnJlbnRseSBkZWxheWVkIGNhbGxzICovXHJcblx0XHRcdFx0JC5lYWNoKFZlbG9jaXR5LlN0YXRlLmRlbGF5ZWRFbGVtZW50cywgZnVuY3Rpb24oaywgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0aWYgKCFlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHBhdXNlRGVsYXlPbkVsZW1lbnQoZWxlbWVudCwgY3VycmVudFRpbWUpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKiBSZXN1bWUgYWxsIGFuaW1hdGlvbnMgKi9cclxuXHRcdFx0cmVzdW1lQWxsOiBmdW5jdGlvbihxdWV1ZU5hbWUpIHtcclxuXHRcdFx0XHR2YXIgY3VycmVudFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xyXG5cclxuXHRcdFx0XHQkLmVhY2goVmVsb2NpdHkuU3RhdGUuY2FsbHMsIGZ1bmN0aW9uKGksIGFjdGl2ZUNhbGwpIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoYWN0aXZlQ2FsbCkge1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgd2UgaGF2ZSBhIHF1ZXVlTmFtZSBhbmQgdGhpcyBjYWxsIGlzIG5vdCBvbiB0aGF0IHF1ZXVlLCBza2lwICovXHJcblx0XHRcdFx0XHRcdGlmIChxdWV1ZU5hbWUgIT09IHVuZGVmaW5lZCAmJiAoKGFjdGl2ZUNhbGxbMl0ucXVldWUgIT09IHF1ZXVlTmFtZSkgfHwgKGFjdGl2ZUNhbGxbMl0ucXVldWUgPT09IGZhbHNlKSkpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogU2V0IGNhbGwgdG8gcmVzdW1lZCBpZiBpdCB3YXMgcGF1c2VkICovXHJcblx0XHRcdFx0XHRcdGlmIChhY3RpdmVDYWxsWzVdKSB7XHJcblx0XHRcdFx0XHRcdFx0YWN0aXZlQ2FsbFs1XS5yZXN1bWUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0LyogUmVzdW1lIHRpbWVycyBvbiBhbnkgY3VycmVudGx5IGRlbGF5ZWQgY2FsbHMgKi9cclxuXHRcdFx0XHQkLmVhY2goVmVsb2NpdHkuU3RhdGUuZGVsYXllZEVsZW1lbnRzLCBmdW5jdGlvbihrLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRpZiAoIWVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzdW1lRGVsYXlPbkVsZW1lbnQoZWxlbWVudCwgY3VycmVudFRpbWUpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8qIFJldHJpZXZlIHRoZSBhcHByb3ByaWF0ZSBzY3JvbGwgYW5jaG9yIGFuZCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgYnJvd3NlcjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy5zY3JvbGxZICovXHJcblx0XHRpZiAod2luZG93LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0VmVsb2NpdHkuU3RhdGUuc2Nyb2xsQW5jaG9yID0gd2luZG93O1xyXG5cdFx0XHRWZWxvY2l0eS5TdGF0ZS5zY3JvbGxQcm9wZXJ0eUxlZnQgPSBcInBhZ2VYT2Zmc2V0XCI7XHJcblx0XHRcdFZlbG9jaXR5LlN0YXRlLnNjcm9sbFByb3BlcnR5VG9wID0gXCJwYWdlWU9mZnNldFwiO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0VmVsb2NpdHkuU3RhdGUuc2Nyb2xsQW5jaG9yID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5O1xyXG5cdFx0XHRWZWxvY2l0eS5TdGF0ZS5zY3JvbGxQcm9wZXJ0eUxlZnQgPSBcInNjcm9sbExlZnRcIjtcclxuXHRcdFx0VmVsb2NpdHkuU3RhdGUuc2Nyb2xsUHJvcGVydHlUb3AgPSBcInNjcm9sbFRvcFwiO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNob3J0aGFuZCBhbGlhcyBmb3IgalF1ZXJ5J3MgJC5kYXRhKCkgdXRpbGl0eS4gKi9cclxuXHRcdGZ1bmN0aW9uIERhdGEoZWxlbWVudCkge1xyXG5cdFx0XHQvKiBIYXJkY29kZSBhIHJlZmVyZW5jZSB0byB0aGUgcGx1Z2luIG5hbWUuICovXHJcblx0XHRcdHZhciByZXNwb25zZSA9ICQuZGF0YShlbGVtZW50LCBcInZlbG9jaXR5XCIpO1xyXG5cclxuXHRcdFx0LyogalF1ZXJ5IDw9MS40LjIgcmV0dXJucyBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkIHdoZW4gbm8gbWF0Y2ggaXMgZm91bmQuIFdlIG5vcm1hbGl6ZSB0aGlzIGJlaGF2aW9yLiAqL1xyXG5cdFx0XHRyZXR1cm4gcmVzcG9uc2UgPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXNwb25zZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKioqKioqKioqKioqKipcclxuXHRcdCBEZWxheSBUaW1lclxyXG5cdFx0ICoqKioqKioqKioqKioqL1xyXG5cclxuXHRcdGZ1bmN0aW9uIHBhdXNlRGVsYXlPbkVsZW1lbnQoZWxlbWVudCwgY3VycmVudFRpbWUpIHtcclxuXHRcdFx0LyogQ2hlY2sgZm9yIGFueSBkZWxheSB0aW1lcnMsIGFuZCBwYXVzZSB0aGUgc2V0IHRpbWVvdXRzICh3aGlsZSBwcmVzZXJ2aW5nIHRpbWUgZGF0YSlcclxuXHRcdFx0IHRvIGJlIHJlc3VtZWQgd2hlbiB0aGUgXCJyZXN1bWVcIiBjb21tYW5kIGlzIGlzc3VlZCAqL1xyXG5cdFx0XHR2YXIgZGF0YSA9IERhdGEoZWxlbWVudCk7XHJcblx0XHRcdGlmIChkYXRhICYmIGRhdGEuZGVsYXlUaW1lciAmJiAhZGF0YS5kZWxheVBhdXNlZCkge1xyXG5cdFx0XHRcdGRhdGEuZGVsYXlSZW1haW5pbmcgPSBkYXRhLmRlbGF5IC0gY3VycmVudFRpbWUgKyBkYXRhLmRlbGF5QmVnaW47XHJcblx0XHRcdFx0ZGF0YS5kZWxheVBhdXNlZCA9IHRydWU7XHJcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KGRhdGEuZGVsYXlUaW1lci5zZXRUaW1lb3V0KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHJlc3VtZURlbGF5T25FbGVtZW50KGVsZW1lbnQsIGN1cnJlbnRUaW1lKSB7XHJcblx0XHRcdC8qIENoZWNrIGZvciBhbnkgcGF1c2VkIHRpbWVycyBhbmQgcmVzdW1lICovXHJcblx0XHRcdHZhciBkYXRhID0gRGF0YShlbGVtZW50KTtcclxuXHRcdFx0aWYgKGRhdGEgJiYgZGF0YS5kZWxheVRpbWVyICYmIGRhdGEuZGVsYXlQYXVzZWQpIHtcclxuXHRcdFx0XHQvKiBJZiB0aGUgZWxlbWVudCB3YXMgbWlkLWRlbGF5LCByZSBpbml0aWF0ZSB0aGUgdGltZW91dCB3aXRoIHRoZSByZW1haW5pbmcgZGVsYXkgKi9cclxuXHRcdFx0XHRkYXRhLmRlbGF5UGF1c2VkID0gZmFsc2U7XHJcblx0XHRcdFx0ZGF0YS5kZWxheVRpbWVyLnNldFRpbWVvdXQgPSBzZXRUaW1lb3V0KGRhdGEuZGVsYXlUaW1lci5uZXh0LCBkYXRhLmRlbGF5UmVtYWluaW5nKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqXHJcblx0XHQgRWFzaW5nXHJcblx0XHQgKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0LyogU3RlcCBlYXNpbmcgZ2VuZXJhdG9yLiAqL1xyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVTdGVwKHN0ZXBzKSB7XHJcblx0XHRcdHJldHVybiBmdW5jdGlvbihwKSB7XHJcblx0XHRcdFx0cmV0dXJuIE1hdGgucm91bmQocCAqIHN0ZXBzKSAqICgxIC8gc3RlcHMpO1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEJlemllciBjdXJ2ZSBmdW5jdGlvbiBnZW5lcmF0b3IuIENvcHlyaWdodCBHYWV0YW4gUmVuYXVkZWF1LiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVCZXppZXIobVgxLCBtWTEsIG1YMiwgbVkyKSB7XHJcblx0XHRcdHZhciBORVdUT05fSVRFUkFUSU9OUyA9IDQsXHJcblx0XHRcdFx0XHRORVdUT05fTUlOX1NMT1BFID0gMC4wMDEsXHJcblx0XHRcdFx0XHRTVUJESVZJU0lPTl9QUkVDSVNJT04gPSAwLjAwMDAwMDEsXHJcblx0XHRcdFx0XHRTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyA9IDEwLFxyXG5cdFx0XHRcdFx0a1NwbGluZVRhYmxlU2l6ZSA9IDExLFxyXG5cdFx0XHRcdFx0a1NhbXBsZVN0ZXBTaXplID0gMS4wIC8gKGtTcGxpbmVUYWJsZVNpemUgLSAxLjApLFxyXG5cdFx0XHRcdFx0ZmxvYXQzMkFycmF5U3VwcG9ydGVkID0gXCJGbG9hdDMyQXJyYXlcIiBpbiB3aW5kb3c7XHJcblxyXG5cdFx0XHQvKiBNdXN0IGNvbnRhaW4gZm91ciBhcmd1bWVudHMuICovXHJcblx0XHRcdGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSA0KSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBBcmd1bWVudHMgbXVzdCBiZSBudW1iZXJzLiAqL1xyXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkge1xyXG5cdFx0XHRcdGlmICh0eXBlb2YgYXJndW1lbnRzW2ldICE9PSBcIm51bWJlclwiIHx8IGlzTmFOKGFyZ3VtZW50c1tpXSkgfHwgIWlzRmluaXRlKGFyZ3VtZW50c1tpXSkpIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFggdmFsdWVzIG11c3QgYmUgaW4gdGhlIFswLCAxXSByYW5nZS4gKi9cclxuXHRcdFx0bVgxID0gTWF0aC5taW4obVgxLCAxKTtcclxuXHRcdFx0bVgyID0gTWF0aC5taW4obVgyLCAxKTtcclxuXHRcdFx0bVgxID0gTWF0aC5tYXgobVgxLCAwKTtcclxuXHRcdFx0bVgyID0gTWF0aC5tYXgobVgyLCAwKTtcclxuXHJcblx0XHRcdHZhciBtU2FtcGxlVmFsdWVzID0gZmxvYXQzMkFycmF5U3VwcG9ydGVkID8gbmV3IEZsb2F0MzJBcnJheShrU3BsaW5lVGFibGVTaXplKSA6IG5ldyBBcnJheShrU3BsaW5lVGFibGVTaXplKTtcclxuXHJcblx0XHRcdGZ1bmN0aW9uIEEoYUExLCBhQTIpIHtcclxuXHRcdFx0XHRyZXR1cm4gMS4wIC0gMy4wICogYUEyICsgMy4wICogYUExO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZ1bmN0aW9uIEIoYUExLCBhQTIpIHtcclxuXHRcdFx0XHRyZXR1cm4gMy4wICogYUEyIC0gNi4wICogYUExO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZ1bmN0aW9uIEMoYUExKSB7XHJcblx0XHRcdFx0cmV0dXJuIDMuMCAqIGFBMTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gY2FsY0JlemllcihhVCwgYUExLCBhQTIpIHtcclxuXHRcdFx0XHRyZXR1cm4gKChBKGFBMSwgYUEyKSAqIGFUICsgQihhQTEsIGFBMikpICogYVQgKyBDKGFBMSkpICogYVQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGdldFNsb3BlKGFULCBhQTEsIGFBMikge1xyXG5cdFx0XHRcdHJldHVybiAzLjAgKiBBKGFBMSwgYUEyKSAqIGFUICogYVQgKyAyLjAgKiBCKGFBMSwgYUEyKSAqIGFUICsgQyhhQTEpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBuZXd0b25SYXBoc29uSXRlcmF0ZShhWCwgYUd1ZXNzVCkge1xyXG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgTkVXVE9OX0lURVJBVElPTlM7ICsraSkge1xyXG5cdFx0XHRcdFx0dmFyIGN1cnJlbnRTbG9wZSA9IGdldFNsb3BlKGFHdWVzc1QsIG1YMSwgbVgyKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoY3VycmVudFNsb3BlID09PSAwLjApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGFHdWVzc1Q7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dmFyIGN1cnJlbnRYID0gY2FsY0JlemllcihhR3Vlc3NULCBtWDEsIG1YMikgLSBhWDtcclxuXHRcdFx0XHRcdGFHdWVzc1QgLT0gY3VycmVudFggLyBjdXJyZW50U2xvcGU7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gYUd1ZXNzVDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gY2FsY1NhbXBsZVZhbHVlcygpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGtTcGxpbmVUYWJsZVNpemU7ICsraSkge1xyXG5cdFx0XHRcdFx0bVNhbXBsZVZhbHVlc1tpXSA9IGNhbGNCZXppZXIoaSAqIGtTYW1wbGVTdGVwU2l6ZSwgbVgxLCBtWDIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYmluYXJ5U3ViZGl2aWRlKGFYLCBhQSwgYUIpIHtcclxuXHRcdFx0XHR2YXIgY3VycmVudFgsIGN1cnJlbnRULCBpID0gMDtcclxuXHJcblx0XHRcdFx0ZG8ge1xyXG5cdFx0XHRcdFx0Y3VycmVudFQgPSBhQSArIChhQiAtIGFBKSAvIDIuMDtcclxuXHRcdFx0XHRcdGN1cnJlbnRYID0gY2FsY0JlemllcihjdXJyZW50VCwgbVgxLCBtWDIpIC0gYVg7XHJcblx0XHRcdFx0XHRpZiAoY3VycmVudFggPiAwLjApIHtcclxuXHRcdFx0XHRcdFx0YUIgPSBjdXJyZW50VDtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGFBID0gY3VycmVudFQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSB3aGlsZSAoTWF0aC5hYnMoY3VycmVudFgpID4gU1VCRElWSVNJT05fUFJFQ0lTSU9OICYmICsraSA8IFNVQkRJVklTSU9OX01BWF9JVEVSQVRJT05TKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRUO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBnZXRURm9yWChhWCkge1xyXG5cdFx0XHRcdHZhciBpbnRlcnZhbFN0YXJ0ID0gMC4wLFxyXG5cdFx0XHRcdFx0XHRjdXJyZW50U2FtcGxlID0gMSxcclxuXHRcdFx0XHRcdFx0bGFzdFNhbXBsZSA9IGtTcGxpbmVUYWJsZVNpemUgLSAxO1xyXG5cclxuXHRcdFx0XHRmb3IgKDsgY3VycmVudFNhbXBsZSAhPT0gbGFzdFNhbXBsZSAmJiBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdIDw9IGFYOyArK2N1cnJlbnRTYW1wbGUpIHtcclxuXHRcdFx0XHRcdGludGVydmFsU3RhcnQgKz0ga1NhbXBsZVN0ZXBTaXplO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LS1jdXJyZW50U2FtcGxlO1xyXG5cclxuXHRcdFx0XHR2YXIgZGlzdCA9IChhWCAtIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pIC8gKG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZSArIDFdIC0gbVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSksXHJcblx0XHRcdFx0XHRcdGd1ZXNzRm9yVCA9IGludGVydmFsU3RhcnQgKyBkaXN0ICoga1NhbXBsZVN0ZXBTaXplLFxyXG5cdFx0XHRcdFx0XHRpbml0aWFsU2xvcGUgPSBnZXRTbG9wZShndWVzc0ZvclQsIG1YMSwgbVgyKTtcclxuXHJcblx0XHRcdFx0aWYgKGluaXRpYWxTbG9wZSA+PSBORVdUT05fTUlOX1NMT1BFKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGd1ZXNzRm9yVCk7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChpbml0aWFsU2xvcGUgPT09IDAuMCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGd1ZXNzRm9yVDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGJpbmFyeVN1YmRpdmlkZShhWCwgaW50ZXJ2YWxTdGFydCwgaW50ZXJ2YWxTdGFydCArIGtTYW1wbGVTdGVwU2l6ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgX3ByZWNvbXB1dGVkID0gZmFsc2U7XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xyXG5cdFx0XHRcdF9wcmVjb21wdXRlZCA9IHRydWU7XHJcblx0XHRcdFx0aWYgKG1YMSAhPT0gbVkxIHx8IG1YMiAhPT0gbVkyKSB7XHJcblx0XHRcdFx0XHRjYWxjU2FtcGxlVmFsdWVzKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgZiA9IGZ1bmN0aW9uKGFYKSB7XHJcblx0XHRcdFx0aWYgKCFfcHJlY29tcHV0ZWQpIHtcclxuXHRcdFx0XHRcdHByZWNvbXB1dGUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKG1YMSA9PT0gbVkxICYmIG1YMiA9PT0gbVkyKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gYVg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhWCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIDA7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhWCA9PT0gMSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIDE7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gY2FsY0JlemllcihnZXRURm9yWChhWCksIG1ZMSwgbVkyKTtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGYuZ2V0Q29udHJvbFBvaW50cyA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHJldHVybiBbe3g6IG1YMSwgeTogbVkxfSwge3g6IG1YMiwgeTogbVkyfV07XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHR2YXIgc3RyID0gXCJnZW5lcmF0ZUJlemllcihcIiArIFttWDEsIG1ZMSwgbVgyLCBtWTJdICsgXCIpXCI7XHJcblx0XHRcdGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gc3RyO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0cmV0dXJuIGY7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogUnVuZ2UtS3V0dGEgc3ByaW5nIHBoeXNpY3MgZnVuY3Rpb24gZ2VuZXJhdG9yLiBBZGFwdGVkIGZyb20gRnJhbWVyLmpzLCBjb3B5cmlnaHQgS29lbiBCb2suIE1JVCBMaWNlbnNlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlICovXHJcblx0XHQvKiBHaXZlbiBhIHRlbnNpb24sIGZyaWN0aW9uLCBhbmQgZHVyYXRpb24sIGEgc2ltdWxhdGlvbiBhdCA2MEZQUyB3aWxsIGZpcnN0IHJ1biB3aXRob3V0IGEgZGVmaW5lZCBkdXJhdGlvbiBpbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgcGF0aC4gQSBzZWNvbmQgcGFzc1xyXG5cdFx0IHRoZW4gYWRqdXN0cyB0aGUgdGltZSBkZWx0YSAtLSB1c2luZyB0aGUgcmVsYXRpb24gYmV0d2VlbiBhY3R1YWwgdGltZSBhbmQgZHVyYXRpb24gLS0gdG8gY2FsY3VsYXRlIHRoZSBwYXRoIGZvciB0aGUgZHVyYXRpb24tY29uc3RyYWluZWQgYW5pbWF0aW9uLiAqL1xyXG5cdFx0dmFyIGdlbmVyYXRlU3ByaW5nUks0ID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRmdW5jdGlvbiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSkge1xyXG5cdFx0XHRcdHJldHVybiAoLXN0YXRlLnRlbnNpb24gKiBzdGF0ZS54KSAtIChzdGF0ZS5mcmljdGlvbiAqIHN0YXRlLnYpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoaW5pdGlhbFN0YXRlLCBkdCwgZGVyaXZhdGl2ZSkge1xyXG5cdFx0XHRcdHZhciBzdGF0ZSA9IHtcclxuXHRcdFx0XHRcdHg6IGluaXRpYWxTdGF0ZS54ICsgZGVyaXZhdGl2ZS5keCAqIGR0LFxyXG5cdFx0XHRcdFx0djogaW5pdGlhbFN0YXRlLnYgKyBkZXJpdmF0aXZlLmR2ICogZHQsXHJcblx0XHRcdFx0XHR0ZW5zaW9uOiBpbml0aWFsU3RhdGUudGVuc2lvbixcclxuXHRcdFx0XHRcdGZyaWN0aW9uOiBpbml0aWFsU3RhdGUuZnJpY3Rpb25cclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRyZXR1cm4ge2R4OiBzdGF0ZS52LCBkdjogc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpfTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gc3ByaW5nSW50ZWdyYXRlU3RhdGUoc3RhdGUsIGR0KSB7XHJcblx0XHRcdFx0dmFyIGEgPSB7XHJcblx0XHRcdFx0XHRkeDogc3RhdGUudixcclxuXHRcdFx0XHRcdGR2OiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSlcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRiID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYSksXHJcblx0XHRcdFx0XHRcdGMgPSBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoc3RhdGUsIGR0ICogMC41LCBiKSxcclxuXHRcdFx0XHRcdFx0ZCA9IHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShzdGF0ZSwgZHQsIGMpLFxyXG5cdFx0XHRcdFx0XHRkeGR0ID0gMS4wIC8gNi4wICogKGEuZHggKyAyLjAgKiAoYi5keCArIGMuZHgpICsgZC5keCksXHJcblx0XHRcdFx0XHRcdGR2ZHQgPSAxLjAgLyA2LjAgKiAoYS5kdiArIDIuMCAqIChiLmR2ICsgYy5kdikgKyBkLmR2KTtcclxuXHJcblx0XHRcdFx0c3RhdGUueCA9IHN0YXRlLnggKyBkeGR0ICogZHQ7XHJcblx0XHRcdFx0c3RhdGUudiA9IHN0YXRlLnYgKyBkdmR0ICogZHQ7XHJcblxyXG5cdFx0XHRcdHJldHVybiBzdGF0ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHNwcmluZ1JLNEZhY3RvcnkodGVuc2lvbiwgZnJpY3Rpb24sIGR1cmF0aW9uKSB7XHJcblxyXG5cdFx0XHRcdHZhciBpbml0U3RhdGUgPSB7XHJcblx0XHRcdFx0XHR4OiAtMSxcclxuXHRcdFx0XHRcdHY6IDAsXHJcblx0XHRcdFx0XHR0ZW5zaW9uOiBudWxsLFxyXG5cdFx0XHRcdFx0ZnJpY3Rpb246IG51bGxcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRwYXRoID0gWzBdLFxyXG5cdFx0XHRcdFx0XHR0aW1lX2xhcHNlZCA9IDAsXHJcblx0XHRcdFx0XHRcdHRvbGVyYW5jZSA9IDEgLyAxMDAwMCxcclxuXHRcdFx0XHRcdFx0RFQgPSAxNiAvIDEwMDAsXHJcblx0XHRcdFx0XHRcdGhhdmVfZHVyYXRpb24sIGR0LCBsYXN0X3N0YXRlO1xyXG5cclxuXHRcdFx0XHR0ZW5zaW9uID0gcGFyc2VGbG9hdCh0ZW5zaW9uKSB8fCA1MDA7XHJcblx0XHRcdFx0ZnJpY3Rpb24gPSBwYXJzZUZsb2F0KGZyaWN0aW9uKSB8fCAyMDtcclxuXHRcdFx0XHRkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IG51bGw7XHJcblxyXG5cdFx0XHRcdGluaXRTdGF0ZS50ZW5zaW9uID0gdGVuc2lvbjtcclxuXHRcdFx0XHRpbml0U3RhdGUuZnJpY3Rpb24gPSBmcmljdGlvbjtcclxuXHJcblx0XHRcdFx0aGF2ZV9kdXJhdGlvbiA9IGR1cmF0aW9uICE9PSBudWxsO1xyXG5cclxuXHRcdFx0XHQvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCB0aW1lIGl0IHRha2VzIGZvciB0aGlzIGFuaW1hdGlvbiB0byBjb21wbGV0ZSB3aXRoIHRoZSBwcm92aWRlZCBjb25kaXRpb25zLiAqL1xyXG5cdFx0XHRcdGlmIChoYXZlX2R1cmF0aW9uKSB7XHJcblx0XHRcdFx0XHQvKiBSdW4gdGhlIHNpbXVsYXRpb24gd2l0aG91dCBhIGR1cmF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0dGltZV9sYXBzZWQgPSBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uKTtcclxuXHRcdFx0XHRcdC8qIENvbXB1dGUgdGhlIGFkanVzdGVkIHRpbWUgZGVsdGEuICovXHJcblx0XHRcdFx0XHRkdCA9IHRpbWVfbGFwc2VkIC8gZHVyYXRpb24gKiBEVDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZHQgPSBEVDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHdoaWxlICh0cnVlKSB7XHJcblx0XHRcdFx0XHQvKiBOZXh0L3N0ZXAgZnVuY3Rpb24gLiovXHJcblx0XHRcdFx0XHRsYXN0X3N0YXRlID0gc3ByaW5nSW50ZWdyYXRlU3RhdGUobGFzdF9zdGF0ZSB8fCBpbml0U3RhdGUsIGR0KTtcclxuXHRcdFx0XHRcdC8qIFN0b3JlIHRoZSBwb3NpdGlvbi4gKi9cclxuXHRcdFx0XHRcdHBhdGgucHVzaCgxICsgbGFzdF9zdGF0ZS54KTtcclxuXHRcdFx0XHRcdHRpbWVfbGFwc2VkICs9IDE2O1xyXG5cdFx0XHRcdFx0LyogSWYgdGhlIGNoYW5nZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCwgYnJlYWsuICovXHJcblx0XHRcdFx0XHRpZiAoIShNYXRoLmFicyhsYXN0X3N0YXRlLngpID4gdG9sZXJhbmNlICYmIE1hdGguYWJzKGxhc3Rfc3RhdGUudikgPiB0b2xlcmFuY2UpKSB7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogSWYgZHVyYXRpb24gaXMgbm90IGRlZmluZWQsIHJldHVybiB0aGUgYWN0dWFsIHRpbWUgcmVxdWlyZWQgZm9yIGNvbXBsZXRpbmcgdGhpcyBhbmltYXRpb24uIE90aGVyd2lzZSwgcmV0dXJuIGEgY2xvc3VyZSB0aGF0IGhvbGRzIHRoZVxyXG5cdFx0XHRcdCBjb21wdXRlZCBwYXRoIGFuZCByZXR1cm5zIGEgc25hcHNob3Qgb2YgdGhlIHBvc2l0aW9uIGFjY29yZGluZyB0byBhIGdpdmVuIHBlcmNlbnRDb21wbGV0ZS4gKi9cclxuXHRcdFx0XHRyZXR1cm4gIWhhdmVfZHVyYXRpb24gPyB0aW1lX2xhcHNlZCA6IGZ1bmN0aW9uKHBlcmNlbnRDb21wbGV0ZSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHBhdGhbIChwZXJjZW50Q29tcGxldGUgKiAocGF0aC5sZW5ndGggLSAxKSkgfCAwIF07XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fTtcclxuXHRcdH0oKSk7XHJcblxyXG5cdFx0LyogalF1ZXJ5IGVhc2luZ3MuICovXHJcblx0XHRWZWxvY2l0eS5FYXNpbmdzID0ge1xyXG5cdFx0XHRsaW5lYXI6IGZ1bmN0aW9uKHApIHtcclxuXHRcdFx0XHRyZXR1cm4gcDtcclxuXHRcdFx0fSxcclxuXHRcdFx0c3dpbmc6IGZ1bmN0aW9uKHApIHtcclxuXHRcdFx0XHRyZXR1cm4gMC41IC0gTWF0aC5jb3MocCAqIE1hdGguUEkpIC8gMjtcclxuXHRcdFx0fSxcclxuXHRcdFx0LyogQm9udXMgXCJzcHJpbmdcIiBlYXNpbmcsIHdoaWNoIGlzIGEgbGVzcyBleGFnZ2VyYXRlZCB2ZXJzaW9uIG9mIGVhc2VJbk91dEVsYXN0aWMuICovXHJcblx0XHRcdHNwcmluZzogZnVuY3Rpb24ocCkge1xyXG5cdFx0XHRcdHJldHVybiAxIC0gKE1hdGguY29zKHAgKiA0LjUgKiBNYXRoLlBJKSAqIE1hdGguZXhwKC1wICogNikpO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8qIENTUzMgYW5kIFJvYmVydCBQZW5uZXIgZWFzaW5ncy4gKi9cclxuXHRcdCQuZWFjaChcclxuXHRcdFx0XHRbXHJcblx0XHRcdFx0XHRbXCJlYXNlXCIsIFswLjI1LCAwLjEsIDAuMjUsIDEuMF1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZS1pblwiLCBbMC40MiwgMC4wLCAxLjAwLCAxLjBdXSxcclxuXHRcdFx0XHRcdFtcImVhc2Utb3V0XCIsIFswLjAwLCAwLjAsIDAuNTgsIDEuMF1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZS1pbi1vdXRcIiwgWzAuNDIsIDAuMCwgMC41OCwgMS4wXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5TaW5lXCIsIFswLjQ3LCAwLCAwLjc0NSwgMC43MTVdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VPdXRTaW5lXCIsIFswLjM5LCAwLjU3NSwgMC41NjUsIDFdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJbk91dFNpbmVcIiwgWzAuNDQ1LCAwLjA1LCAwLjU1LCAwLjk1XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5RdWFkXCIsIFswLjU1LCAwLjA4NSwgMC42OCwgMC41M11dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZU91dFF1YWRcIiwgWzAuMjUsIDAuNDYsIDAuNDUsIDAuOTRdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJbk91dFF1YWRcIiwgWzAuNDU1LCAwLjAzLCAwLjUxNSwgMC45NTVdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJbkN1YmljXCIsIFswLjU1LCAwLjA1NSwgMC42NzUsIDAuMTldXSxcclxuXHRcdFx0XHRcdFtcImVhc2VPdXRDdWJpY1wiLCBbMC4yMTUsIDAuNjEsIDAuMzU1LCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5PdXRDdWJpY1wiLCBbMC42NDUsIDAuMDQ1LCAwLjM1NSwgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluUXVhcnRcIiwgWzAuODk1LCAwLjAzLCAwLjY4NSwgMC4yMl1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZU91dFF1YXJ0XCIsIFswLjE2NSwgMC44NCwgMC40NCwgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluT3V0UXVhcnRcIiwgWzAuNzcsIDAsIDAuMTc1LCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5RdWludFwiLCBbMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlT3V0UXVpbnRcIiwgWzAuMjMsIDEsIDAuMzIsIDFdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJbk91dFF1aW50XCIsIFswLjg2LCAwLCAwLjA3LCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5FeHBvXCIsIFswLjk1LCAwLjA1LCAwLjc5NSwgMC4wMzVdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VPdXRFeHBvXCIsIFswLjE5LCAxLCAwLjIyLCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5PdXRFeHBvXCIsIFsxLCAwLCAwLCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5DaXJjXCIsIFswLjYsIDAuMDQsIDAuOTgsIDAuMzM1XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlT3V0Q2lyY1wiLCBbMC4wNzUsIDAuODIsIDAuMTY1LCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5PdXRDaXJjXCIsIFswLjc4NSwgMC4xMzUsIDAuMTUsIDAuODZdXVxyXG5cdFx0XHRcdF0sIGZ1bmN0aW9uKGksIGVhc2luZ0FycmF5KSB7XHJcblx0XHRcdFZlbG9jaXR5LkVhc2luZ3NbZWFzaW5nQXJyYXlbMF1dID0gZ2VuZXJhdGVCZXppZXIuYXBwbHkobnVsbCwgZWFzaW5nQXJyYXlbMV0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBlYXNpbmcgdHlwZSBnaXZlbiBhbiBlYXNpbmcgaW5wdXQuICovXHJcblx0XHRmdW5jdGlvbiBnZXRFYXNpbmcodmFsdWUsIGR1cmF0aW9uKSB7XHJcblx0XHRcdHZhciBlYXNpbmcgPSB2YWx1ZTtcclxuXHJcblx0XHRcdC8qIFRoZSBlYXNpbmcgb3B0aW9uIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcgdGhhdCByZWZlcmVuY2VzIGEgcHJlLXJlZ2lzdGVyZWQgZWFzaW5nLFxyXG5cdFx0XHQgb3IgaXQgY2FuIGJlIGEgdHdvLS9mb3VyLWl0ZW0gYXJyYXkgb2YgaW50ZWdlcnMgdG8gYmUgY29udmVydGVkIGludG8gYSBiZXppZXIvc3ByaW5nIGZ1bmN0aW9uLiAqL1xyXG5cdFx0XHRpZiAoVHlwZS5pc1N0cmluZyh2YWx1ZSkpIHtcclxuXHRcdFx0XHQvKiBFbnN1cmUgdGhhdCB0aGUgZWFzaW5nIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGpRdWVyeSdzIFZlbG9jaXR5LkVhc2luZ3Mgb2JqZWN0LiAqL1xyXG5cdFx0XHRcdGlmICghVmVsb2NpdHkuRWFzaW5nc1t2YWx1ZV0pIHtcclxuXHRcdFx0XHRcdGVhc2luZyA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIGlmIChUeXBlLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xyXG5cdFx0XHRcdGVhc2luZyA9IGdlbmVyYXRlU3RlcC5hcHBseShudWxsLCB2YWx1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDIpIHtcclxuXHRcdFx0XHQvKiBzcHJpbmdSSzQgbXVzdCBiZSBwYXNzZWQgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IElmIHRoZSBzcHJpbmdSSzQgYXJyYXkgY29udGFpbnMgbm9uLW51bWJlcnMsIGdlbmVyYXRlU3ByaW5nUks0KCkgcmV0dXJucyBhbiBlYXNpbmdcclxuXHRcdFx0XHQgZnVuY3Rpb24gZ2VuZXJhdGVkIHdpdGggZGVmYXVsdCB0ZW5zaW9uIGFuZCBmcmljdGlvbiB2YWx1ZXMuICovXHJcblx0XHRcdFx0ZWFzaW5nID0gZ2VuZXJhdGVTcHJpbmdSSzQuYXBwbHkobnVsbCwgdmFsdWUuY29uY2F0KFtkdXJhdGlvbl0pKTtcclxuXHRcdFx0fSBlbHNlIGlmIChUeXBlLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gNCkge1xyXG5cdFx0XHRcdC8qIE5vdGU6IElmIHRoZSBiZXppZXIgYXJyYXkgY29udGFpbnMgbm9uLW51bWJlcnMsIGdlbmVyYXRlQmV6aWVyKCkgcmV0dXJucyBmYWxzZS4gKi9cclxuXHRcdFx0XHRlYXNpbmcgPSBnZW5lcmF0ZUJlemllci5hcHBseShudWxsLCB2YWx1ZSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZWFzaW5nID0gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFJldmVydCB0byB0aGUgVmVsb2NpdHktd2lkZSBkZWZhdWx0IGVhc2luZyB0eXBlLCBvciBmYWxsIGJhY2sgdG8gXCJzd2luZ1wiICh3aGljaCBpcyBhbHNvIGpRdWVyeSdzIGRlZmF1bHQpXHJcblx0XHRcdCBpZiB0aGUgVmVsb2NpdHktd2lkZSBkZWZhdWx0IGhhcyBiZWVuIGluY29ycmVjdGx5IG1vZGlmaWVkLiAqL1xyXG5cdFx0XHRpZiAoZWFzaW5nID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdGlmIChWZWxvY2l0eS5FYXNpbmdzW1ZlbG9jaXR5LmRlZmF1bHRzLmVhc2luZ10pIHtcclxuXHRcdFx0XHRcdGVhc2luZyA9IFZlbG9jaXR5LmRlZmF1bHRzLmVhc2luZztcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZWFzaW5nID0gRUFTSU5HX0RFRkFVTFQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZWFzaW5nO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKioqKioqKioqKioqKioqKlxyXG5cdFx0IENTUyBTdGFja1xyXG5cdFx0ICoqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdC8qIFRoZSBDU1Mgb2JqZWN0IGlzIGEgaGlnaGx5IGNvbmRlbnNlZCBhbmQgcGVyZm9ybWFudCBDU1Mgc3RhY2sgdGhhdCBmdWxseSByZXBsYWNlcyBqUXVlcnkncy5cclxuXHRcdCBJdCBoYW5kbGVzIHRoZSB2YWxpZGF0aW9uLCBnZXR0aW5nLCBhbmQgc2V0dGluZyBvZiBib3RoIHN0YW5kYXJkIENTUyBwcm9wZXJ0aWVzIGFuZCBDU1MgcHJvcGVydHkgaG9va3MuICovXHJcblx0XHQvKiBOb3RlOiBBIFwiQ1NTXCIgc2hvcnRoYW5kIGlzIGFsaWFzZWQgc28gdGhhdCBvdXIgY29kZSBpcyBlYXNpZXIgdG8gcmVhZC4gKi9cclxuXHRcdHZhciBDU1MgPSBWZWxvY2l0eS5DU1MgPSB7XHJcblx0XHRcdC8qKioqKioqKioqKioqXHJcblx0XHRcdCBSZWdFeFxyXG5cdFx0XHQgKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFJlZ0V4OiB7XHJcblx0XHRcdFx0aXNIZXg6IC9eIyhbQS1mXFxkXXszfSl7MSwyfSQvaSxcclxuXHRcdFx0XHQvKiBVbndyYXAgYSBwcm9wZXJ0eSB2YWx1ZSdzIHN1cnJvdW5kaW5nIHRleHQsIGUuZy4gXCJyZ2JhKDQsIDMsIDIsIDEpXCIgPT0+IFwiNCwgMywgMiwgMVwiIGFuZCBcInJlY3QoNHB4IDNweCAycHggMXB4KVwiID09PiBcIjRweCAzcHggMnB4IDFweFwiLiAqL1xyXG5cdFx0XHRcdHZhbHVlVW53cmFwOiAvXltBLXpdK1xcKCguKilcXCkkL2ksXHJcblx0XHRcdFx0d3JhcHBlZFZhbHVlQWxyZWFkeUV4dHJhY3RlZDogL1swLTkuXSsgWzAtOS5dKyBbMC05Ll0rKCBbMC05Ll0rKT8vLFxyXG5cdFx0XHRcdC8qIFNwbGl0IGEgbXVsdGktdmFsdWUgcHJvcGVydHkgaW50byBhbiBhcnJheSBvZiBzdWJ2YWx1ZXMsIGUuZy4gXCJyZ2JhKDQsIDMsIDIsIDEpIDRweCAzcHggMnB4IDFweFwiID09PiBbIFwicmdiYSg0LCAzLCAyLCAxKVwiLCBcIjRweFwiLCBcIjNweFwiLCBcIjJweFwiLCBcIjFweFwiIF0uICovXHJcblx0XHRcdFx0dmFsdWVTcGxpdDogLyhbQS16XStcXCguK1xcKSl8KChbQS16MC05Iy0uXSs/KSg/PVxcc3wkKSkvaWdcclxuXHRcdFx0fSxcclxuXHRcdFx0LyoqKioqKioqKioqKlxyXG5cdFx0XHQgTGlzdHNcclxuXHRcdFx0ICoqKioqKioqKioqKi9cclxuXHJcblx0XHRcdExpc3RzOiB7XHJcblx0XHRcdFx0Y29sb3JzOiBbXCJmaWxsXCIsIFwic3Ryb2tlXCIsIFwic3RvcENvbG9yXCIsIFwiY29sb3JcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCBcImJvcmRlclRvcENvbG9yXCIsIFwiYm9yZGVyUmlnaHRDb2xvclwiLCBcImJvcmRlckJvdHRvbUNvbG9yXCIsIFwiYm9yZGVyTGVmdENvbG9yXCIsIFwib3V0bGluZUNvbG9yXCJdLFxyXG5cdFx0XHRcdHRyYW5zZm9ybXNCYXNlOiBbXCJ0cmFuc2xhdGVYXCIsIFwidHJhbnNsYXRlWVwiLCBcInNjYWxlXCIsIFwic2NhbGVYXCIsIFwic2NhbGVZXCIsIFwic2tld1hcIiwgXCJza2V3WVwiLCBcInJvdGF0ZVpcIl0sXHJcblx0XHRcdFx0dHJhbnNmb3JtczNEOiBbXCJ0cmFuc2Zvcm1QZXJzcGVjdGl2ZVwiLCBcInRyYW5zbGF0ZVpcIiwgXCJzY2FsZVpcIiwgXCJyb3RhdGVYXCIsIFwicm90YXRlWVwiXSxcclxuXHRcdFx0XHR1bml0czogW1xyXG5cdFx0XHRcdFx0XCIlXCIsIC8vIHJlbGF0aXZlXHJcblx0XHRcdFx0XHRcImVtXCIsIFwiZXhcIiwgXCJjaFwiLCBcInJlbVwiLCAvLyBmb250IHJlbGF0aXZlXHJcblx0XHRcdFx0XHRcInZ3XCIsIFwidmhcIiwgXCJ2bWluXCIsIFwidm1heFwiLCAvLyB2aWV3cG9ydCByZWxhdGl2ZVxyXG5cdFx0XHRcdFx0XCJjbVwiLCBcIm1tXCIsIFwiUVwiLCBcImluXCIsIFwicGNcIiwgXCJwdFwiLCBcInB4XCIsIC8vIGFic29sdXRlIGxlbmd0aHNcclxuXHRcdFx0XHRcdFwiZGVnXCIsIFwiZ3JhZFwiLCBcInJhZFwiLCBcInR1cm5cIiwgLy8gYW5nbGVzXHJcblx0XHRcdFx0XHRcInNcIiwgXCJtc1wiIC8vIHRpbWVcclxuXHRcdFx0XHRdLFxyXG5cdFx0XHRcdGNvbG9yTmFtZXM6IHtcclxuXHRcdFx0XHRcdFwiYWxpY2VibHVlXCI6IFwiMjQwLDI0OCwyNTVcIixcclxuXHRcdFx0XHRcdFwiYW50aXF1ZXdoaXRlXCI6IFwiMjUwLDIzNSwyMTVcIixcclxuXHRcdFx0XHRcdFwiYXF1YW1hcmluZVwiOiBcIjEyNywyNTUsMjEyXCIsXHJcblx0XHRcdFx0XHRcImFxdWFcIjogXCIwLDI1NSwyNTVcIixcclxuXHRcdFx0XHRcdFwiYXp1cmVcIjogXCIyNDAsMjU1LDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJiZWlnZVwiOiBcIjI0NSwyNDUsMjIwXCIsXHJcblx0XHRcdFx0XHRcImJpc3F1ZVwiOiBcIjI1NSwyMjgsMTk2XCIsXHJcblx0XHRcdFx0XHRcImJsYWNrXCI6IFwiMCwwLDBcIixcclxuXHRcdFx0XHRcdFwiYmxhbmNoZWRhbG1vbmRcIjogXCIyNTUsMjM1LDIwNVwiLFxyXG5cdFx0XHRcdFx0XCJibHVldmlvbGV0XCI6IFwiMTM4LDQzLDIyNlwiLFxyXG5cdFx0XHRcdFx0XCJibHVlXCI6IFwiMCwwLDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJicm93blwiOiBcIjE2NSw0Miw0MlwiLFxyXG5cdFx0XHRcdFx0XCJidXJseXdvb2RcIjogXCIyMjIsMTg0LDEzNVwiLFxyXG5cdFx0XHRcdFx0XCJjYWRldGJsdWVcIjogXCI5NSwxNTgsMTYwXCIsXHJcblx0XHRcdFx0XHRcImNoYXJ0cmV1c2VcIjogXCIxMjcsMjU1LDBcIixcclxuXHRcdFx0XHRcdFwiY2hvY29sYXRlXCI6IFwiMjEwLDEwNSwzMFwiLFxyXG5cdFx0XHRcdFx0XCJjb3JhbFwiOiBcIjI1NSwxMjcsODBcIixcclxuXHRcdFx0XHRcdFwiY29ybmZsb3dlcmJsdWVcIjogXCIxMDAsMTQ5LDIzN1wiLFxyXG5cdFx0XHRcdFx0XCJjb3Juc2lsa1wiOiBcIjI1NSwyNDgsMjIwXCIsXHJcblx0XHRcdFx0XHRcImNyaW1zb25cIjogXCIyMjAsMjAsNjBcIixcclxuXHRcdFx0XHRcdFwiY3lhblwiOiBcIjAsMjU1LDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrYmx1ZVwiOiBcIjAsMCwxMzlcIixcclxuXHRcdFx0XHRcdFwiZGFya2N5YW5cIjogXCIwLDEzOSwxMzlcIixcclxuXHRcdFx0XHRcdFwiZGFya2dvbGRlbnJvZFwiOiBcIjE4NCwxMzQsMTFcIixcclxuXHRcdFx0XHRcdFwiZGFya2dyYXlcIjogXCIxNjksMTY5LDE2OVwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrZ3JleVwiOiBcIjE2OSwxNjksMTY5XCIsXHJcblx0XHRcdFx0XHRcImRhcmtncmVlblwiOiBcIjAsMTAwLDBcIixcclxuXHRcdFx0XHRcdFwiZGFya2toYWtpXCI6IFwiMTg5LDE4MywxMDdcIixcclxuXHRcdFx0XHRcdFwiZGFya21hZ2VudGFcIjogXCIxMzksMCwxMzlcIixcclxuXHRcdFx0XHRcdFwiZGFya29saXZlZ3JlZW5cIjogXCI4NSwxMDcsNDdcIixcclxuXHRcdFx0XHRcdFwiZGFya29yYW5nZVwiOiBcIjI1NSwxNDAsMFwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrb3JjaGlkXCI6IFwiMTUzLDUwLDIwNFwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrcmVkXCI6IFwiMTM5LDAsMFwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrc2FsbW9uXCI6IFwiMjMzLDE1MCwxMjJcIixcclxuXHRcdFx0XHRcdFwiZGFya3NlYWdyZWVuXCI6IFwiMTQzLDE4OCwxNDNcIixcclxuXHRcdFx0XHRcdFwiZGFya3NsYXRlYmx1ZVwiOiBcIjcyLDYxLDEzOVwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrc2xhdGVncmF5XCI6IFwiNDcsNzksNzlcIixcclxuXHRcdFx0XHRcdFwiZGFya3R1cnF1b2lzZVwiOiBcIjAsMjA2LDIwOVwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrdmlvbGV0XCI6IFwiMTQ4LDAsMjExXCIsXHJcblx0XHRcdFx0XHRcImRlZXBwaW5rXCI6IFwiMjU1LDIwLDE0N1wiLFxyXG5cdFx0XHRcdFx0XCJkZWVwc2t5Ymx1ZVwiOiBcIjAsMTkxLDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJkaW1ncmF5XCI6IFwiMTA1LDEwNSwxMDVcIixcclxuXHRcdFx0XHRcdFwiZGltZ3JleVwiOiBcIjEwNSwxMDUsMTA1XCIsXHJcblx0XHRcdFx0XHRcImRvZGdlcmJsdWVcIjogXCIzMCwxNDQsMjU1XCIsXHJcblx0XHRcdFx0XHRcImZpcmVicmlja1wiOiBcIjE3OCwzNCwzNFwiLFxyXG5cdFx0XHRcdFx0XCJmbG9yYWx3aGl0ZVwiOiBcIjI1NSwyNTAsMjQwXCIsXHJcblx0XHRcdFx0XHRcImZvcmVzdGdyZWVuXCI6IFwiMzQsMTM5LDM0XCIsXHJcblx0XHRcdFx0XHRcImZ1Y2hzaWFcIjogXCIyNTUsMCwyNTVcIixcclxuXHRcdFx0XHRcdFwiZ2FpbnNib3JvXCI6IFwiMjIwLDIyMCwyMjBcIixcclxuXHRcdFx0XHRcdFwiZ2hvc3R3aGl0ZVwiOiBcIjI0OCwyNDgsMjU1XCIsXHJcblx0XHRcdFx0XHRcImdvbGRcIjogXCIyNTUsMjE1LDBcIixcclxuXHRcdFx0XHRcdFwiZ29sZGVucm9kXCI6IFwiMjE4LDE2NSwzMlwiLFxyXG5cdFx0XHRcdFx0XCJncmF5XCI6IFwiMTI4LDEyOCwxMjhcIixcclxuXHRcdFx0XHRcdFwiZ3JleVwiOiBcIjEyOCwxMjgsMTI4XCIsXHJcblx0XHRcdFx0XHRcImdyZWVueWVsbG93XCI6IFwiMTczLDI1NSw0N1wiLFxyXG5cdFx0XHRcdFx0XCJncmVlblwiOiBcIjAsMTI4LDBcIixcclxuXHRcdFx0XHRcdFwiaG9uZXlkZXdcIjogXCIyNDAsMjU1LDI0MFwiLFxyXG5cdFx0XHRcdFx0XCJob3RwaW5rXCI6IFwiMjU1LDEwNSwxODBcIixcclxuXHRcdFx0XHRcdFwiaW5kaWFucmVkXCI6IFwiMjA1LDkyLDkyXCIsXHJcblx0XHRcdFx0XHRcImluZGlnb1wiOiBcIjc1LDAsMTMwXCIsXHJcblx0XHRcdFx0XHRcIml2b3J5XCI6IFwiMjU1LDI1NSwyNDBcIixcclxuXHRcdFx0XHRcdFwia2hha2lcIjogXCIyNDAsMjMwLDE0MFwiLFxyXG5cdFx0XHRcdFx0XCJsYXZlbmRlcmJsdXNoXCI6IFwiMjU1LDI0MCwyNDVcIixcclxuXHRcdFx0XHRcdFwibGF2ZW5kZXJcIjogXCIyMzAsMjMwLDI1MFwiLFxyXG5cdFx0XHRcdFx0XCJsYXduZ3JlZW5cIjogXCIxMjQsMjUyLDBcIixcclxuXHRcdFx0XHRcdFwibGVtb25jaGlmZm9uXCI6IFwiMjU1LDI1MCwyMDVcIixcclxuXHRcdFx0XHRcdFwibGlnaHRibHVlXCI6IFwiMTczLDIxNiwyMzBcIixcclxuXHRcdFx0XHRcdFwibGlnaHRjb3JhbFwiOiBcIjI0MCwxMjgsMTI4XCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0Y3lhblwiOiBcIjIyNCwyNTUsMjU1XCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFwiMjUwLDI1MCwyMTBcIixcclxuXHRcdFx0XHRcdFwibGlnaHRncmF5XCI6IFwiMjExLDIxMSwyMTFcIixcclxuXHRcdFx0XHRcdFwibGlnaHRncmV5XCI6IFwiMjExLDIxMSwyMTFcIixcclxuXHRcdFx0XHRcdFwibGlnaHRncmVlblwiOiBcIjE0NCwyMzgsMTQ0XCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0cGlua1wiOiBcIjI1NSwxODIsMTkzXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0c2FsbW9uXCI6IFwiMjU1LDE2MCwxMjJcIixcclxuXHRcdFx0XHRcdFwibGlnaHRzZWFncmVlblwiOiBcIjMyLDE3OCwxNzBcIixcclxuXHRcdFx0XHRcdFwibGlnaHRza3libHVlXCI6IFwiMTM1LDIwNiwyNTBcIixcclxuXHRcdFx0XHRcdFwibGlnaHRzbGF0ZWdyYXlcIjogXCIxMTksMTM2LDE1M1wiLFxyXG5cdFx0XHRcdFx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBcIjE3NiwxOTYsMjIyXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0eWVsbG93XCI6IFwiMjU1LDI1NSwyMjRcIixcclxuXHRcdFx0XHRcdFwibGltZWdyZWVuXCI6IFwiNTAsMjA1LDUwXCIsXHJcblx0XHRcdFx0XHRcImxpbWVcIjogXCIwLDI1NSwwXCIsXHJcblx0XHRcdFx0XHRcImxpbmVuXCI6IFwiMjUwLDI0MCwyMzBcIixcclxuXHRcdFx0XHRcdFwibWFnZW50YVwiOiBcIjI1NSwwLDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJtYXJvb25cIjogXCIxMjgsMCwwXCIsXHJcblx0XHRcdFx0XHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogXCIxMDIsMjA1LDE3MFwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1ibHVlXCI6IFwiMCwwLDIwNVwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1vcmNoaWRcIjogXCIxODYsODUsMjExXCIsXHJcblx0XHRcdFx0XHRcIm1lZGl1bXB1cnBsZVwiOiBcIjE0NywxMTIsMjE5XCIsXHJcblx0XHRcdFx0XHRcIm1lZGl1bXNlYWdyZWVuXCI6IFwiNjAsMTc5LDExM1wiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogXCIxMjMsMTA0LDIzOFwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBcIjAsMjUwLDE1NFwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW10dXJxdW9pc2VcIjogXCI3MiwyMDksMjA0XCIsXHJcblx0XHRcdFx0XHRcIm1lZGl1bXZpb2xldHJlZFwiOiBcIjE5OSwyMSwxMzNcIixcclxuXHRcdFx0XHRcdFwibWlkbmlnaHRibHVlXCI6IFwiMjUsMjUsMTEyXCIsXHJcblx0XHRcdFx0XHRcIm1pbnRjcmVhbVwiOiBcIjI0NSwyNTUsMjUwXCIsXHJcblx0XHRcdFx0XHRcIm1pc3R5cm9zZVwiOiBcIjI1NSwyMjgsMjI1XCIsXHJcblx0XHRcdFx0XHRcIm1vY2Nhc2luXCI6IFwiMjU1LDIyOCwxODFcIixcclxuXHRcdFx0XHRcdFwibmF2YWpvd2hpdGVcIjogXCIyNTUsMjIyLDE3M1wiLFxyXG5cdFx0XHRcdFx0XCJuYXZ5XCI6IFwiMCwwLDEyOFwiLFxyXG5cdFx0XHRcdFx0XCJvbGRsYWNlXCI6IFwiMjUzLDI0NSwyMzBcIixcclxuXHRcdFx0XHRcdFwib2xpdmVkcmFiXCI6IFwiMTA3LDE0MiwzNVwiLFxyXG5cdFx0XHRcdFx0XCJvbGl2ZVwiOiBcIjEyOCwxMjgsMFwiLFxyXG5cdFx0XHRcdFx0XCJvcmFuZ2VyZWRcIjogXCIyNTUsNjksMFwiLFxyXG5cdFx0XHRcdFx0XCJvcmFuZ2VcIjogXCIyNTUsMTY1LDBcIixcclxuXHRcdFx0XHRcdFwib3JjaGlkXCI6IFwiMjE4LDExMiwyMTRcIixcclxuXHRcdFx0XHRcdFwicGFsZWdvbGRlbnJvZFwiOiBcIjIzOCwyMzIsMTcwXCIsXHJcblx0XHRcdFx0XHRcInBhbGVncmVlblwiOiBcIjE1MiwyNTEsMTUyXCIsXHJcblx0XHRcdFx0XHRcInBhbGV0dXJxdW9pc2VcIjogXCIxNzUsMjM4LDIzOFwiLFxyXG5cdFx0XHRcdFx0XCJwYWxldmlvbGV0cmVkXCI6IFwiMjE5LDExMiwxNDdcIixcclxuXHRcdFx0XHRcdFwicGFwYXlhd2hpcFwiOiBcIjI1NSwyMzksMjEzXCIsXHJcblx0XHRcdFx0XHRcInBlYWNocHVmZlwiOiBcIjI1NSwyMTgsMTg1XCIsXHJcblx0XHRcdFx0XHRcInBlcnVcIjogXCIyMDUsMTMzLDYzXCIsXHJcblx0XHRcdFx0XHRcInBpbmtcIjogXCIyNTUsMTkyLDIwM1wiLFxyXG5cdFx0XHRcdFx0XCJwbHVtXCI6IFwiMjIxLDE2MCwyMjFcIixcclxuXHRcdFx0XHRcdFwicG93ZGVyYmx1ZVwiOiBcIjE3NiwyMjQsMjMwXCIsXHJcblx0XHRcdFx0XHRcInB1cnBsZVwiOiBcIjEyOCwwLDEyOFwiLFxyXG5cdFx0XHRcdFx0XCJyZWRcIjogXCIyNTUsMCwwXCIsXHJcblx0XHRcdFx0XHRcInJvc3licm93blwiOiBcIjE4OCwxNDMsMTQzXCIsXHJcblx0XHRcdFx0XHRcInJveWFsYmx1ZVwiOiBcIjY1LDEwNSwyMjVcIixcclxuXHRcdFx0XHRcdFwic2FkZGxlYnJvd25cIjogXCIxMzksNjksMTlcIixcclxuXHRcdFx0XHRcdFwic2FsbW9uXCI6IFwiMjUwLDEyOCwxMTRcIixcclxuXHRcdFx0XHRcdFwic2FuZHlicm93blwiOiBcIjI0NCwxNjQsOTZcIixcclxuXHRcdFx0XHRcdFwic2VhZ3JlZW5cIjogXCI0NiwxMzksODdcIixcclxuXHRcdFx0XHRcdFwic2Vhc2hlbGxcIjogXCIyNTUsMjQ1LDIzOFwiLFxyXG5cdFx0XHRcdFx0XCJzaWVubmFcIjogXCIxNjAsODIsNDVcIixcclxuXHRcdFx0XHRcdFwic2lsdmVyXCI6IFwiMTkyLDE5MiwxOTJcIixcclxuXHRcdFx0XHRcdFwic2t5Ymx1ZVwiOiBcIjEzNSwyMDYsMjM1XCIsXHJcblx0XHRcdFx0XHRcInNsYXRlYmx1ZVwiOiBcIjEwNiw5MCwyMDVcIixcclxuXHRcdFx0XHRcdFwic2xhdGVncmF5XCI6IFwiMTEyLDEyOCwxNDRcIixcclxuXHRcdFx0XHRcdFwic25vd1wiOiBcIjI1NSwyNTAsMjUwXCIsXHJcblx0XHRcdFx0XHRcInNwcmluZ2dyZWVuXCI6IFwiMCwyNTUsMTI3XCIsXHJcblx0XHRcdFx0XHRcInN0ZWVsYmx1ZVwiOiBcIjcwLDEzMCwxODBcIixcclxuXHRcdFx0XHRcdFwidGFuXCI6IFwiMjEwLDE4MCwxNDBcIixcclxuXHRcdFx0XHRcdFwidGVhbFwiOiBcIjAsMTI4LDEyOFwiLFxyXG5cdFx0XHRcdFx0XCJ0aGlzdGxlXCI6IFwiMjE2LDE5MSwyMTZcIixcclxuXHRcdFx0XHRcdFwidG9tYXRvXCI6IFwiMjU1LDk5LDcxXCIsXHJcblx0XHRcdFx0XHRcInR1cnF1b2lzZVwiOiBcIjY0LDIyNCwyMDhcIixcclxuXHRcdFx0XHRcdFwidmlvbGV0XCI6IFwiMjM4LDEzMCwyMzhcIixcclxuXHRcdFx0XHRcdFwid2hlYXRcIjogXCIyNDUsMjIyLDE3OVwiLFxyXG5cdFx0XHRcdFx0XCJ3aGl0ZXNtb2tlXCI6IFwiMjQ1LDI0NSwyNDVcIixcclxuXHRcdFx0XHRcdFwid2hpdGVcIjogXCIyNTUsMjU1LDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJ5ZWxsb3dncmVlblwiOiBcIjE1NCwyMDUsNTBcIixcclxuXHRcdFx0XHRcdFwieWVsbG93XCI6IFwiMjU1LDI1NSwwXCJcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKipcclxuXHRcdFx0IEhvb2tzXHJcblx0XHRcdCAqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBIb29rcyBhbGxvdyBhIHN1YnByb3BlcnR5IChlLmcuIFwiYm94U2hhZG93Qmx1clwiKSBvZiBhIGNvbXBvdW5kLXZhbHVlIENTUyBwcm9wZXJ0eVxyXG5cdFx0XHQgKGUuZy4gXCJib3hTaGFkb3c6IFggWSBCbHVyIFNwcmVhZCBDb2xvclwiKSB0byBiZSBhbmltYXRlZCBhcyBpZiBpdCB3ZXJlIGEgZGlzY3JldGUgcHJvcGVydHkuICovXHJcblx0XHRcdC8qIE5vdGU6IEJleW9uZCBlbmFibGluZyBmaW5lLWdyYWluZWQgcHJvcGVydHkgYW5pbWF0aW9uLCBob29raW5nIGlzIG5lY2Vzc2FyeSBzaW5jZSBWZWxvY2l0eSBvbmx5XHJcblx0XHRcdCB0d2VlbnMgcHJvcGVydGllcyB3aXRoIHNpbmdsZSBudW1lcmljIHZhbHVlczsgdW5saWtlIENTUyB0cmFuc2l0aW9ucywgVmVsb2NpdHkgZG9lcyBub3QgaW50ZXJwb2xhdGUgY29tcG91bmQtdmFsdWVzLiAqL1xyXG5cdFx0XHRIb29rczoge1xyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBSZWdpc3RyYXRpb25cclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIFRlbXBsYXRlcyBhcmUgYSBjb25jaXNlIHdheSBvZiBpbmRpY2F0aW5nIHdoaWNoIHN1YnByb3BlcnRpZXMgbXVzdCBiZSBpbmRpdmlkdWFsbHkgcmVnaXN0ZXJlZCBmb3IgZWFjaCBjb21wb3VuZC12YWx1ZSBDU1MgcHJvcGVydHkuICovXHJcblx0XHRcdFx0LyogRWFjaCB0ZW1wbGF0ZSBjb25zaXN0cyBvZiB0aGUgY29tcG91bmQtdmFsdWUncyBiYXNlIG5hbWUsIGl0cyBjb25zdGl0dWVudCBzdWJwcm9wZXJ0eSBuYW1lcywgYW5kIHRob3NlIHN1YnByb3BlcnRpZXMnIGRlZmF1bHQgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdHRlbXBsYXRlczoge1xyXG5cdFx0XHRcdFx0XCJ0ZXh0U2hhZG93XCI6IFtcIkNvbG9yIFggWSBCbHVyXCIsIFwiYmxhY2sgMHB4IDBweCAwcHhcIl0sXHJcblx0XHRcdFx0XHRcImJveFNoYWRvd1wiOiBbXCJDb2xvciBYIFkgQmx1ciBTcHJlYWRcIiwgXCJibGFjayAwcHggMHB4IDBweCAwcHhcIl0sXHJcblx0XHRcdFx0XHRcImNsaXBcIjogW1wiVG9wIFJpZ2h0IEJvdHRvbSBMZWZ0XCIsIFwiMHB4IDBweCAwcHggMHB4XCJdLFxyXG5cdFx0XHRcdFx0XCJiYWNrZ3JvdW5kUG9zaXRpb25cIjogW1wiWCBZXCIsIFwiMCUgMCVcIl0sXHJcblx0XHRcdFx0XHRcInRyYW5zZm9ybU9yaWdpblwiOiBbXCJYIFkgWlwiLCBcIjUwJSA1MCUgMHB4XCJdLFxyXG5cdFx0XHRcdFx0XCJwZXJzcGVjdGl2ZU9yaWdpblwiOiBbXCJYIFlcIiwgXCI1MCUgNTAlXCJdXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBBIFwicmVnaXN0ZXJlZFwiIGhvb2sgaXMgb25lIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIGZyb20gaXRzIHRlbXBsYXRlIGZvcm0gaW50byBhIGxpdmUsXHJcblx0XHRcdFx0IHR3ZWVuYWJsZSBwcm9wZXJ0eS4gSXQgY29udGFpbnMgZGF0YSB0byBhc3NvY2lhdGUgaXQgd2l0aCBpdHMgcm9vdCBwcm9wZXJ0eS4gKi9cclxuXHRcdFx0XHRyZWdpc3RlcmVkOiB7XHJcblx0XHRcdFx0XHQvKiBOb3RlOiBBIHJlZ2lzdGVyZWQgaG9vayBsb29rcyBsaWtlIHRoaXMgPT0+IHRleHRTaGFkb3dCbHVyOiBbIFwidGV4dFNoYWRvd1wiLCAzIF0sXHJcblx0XHRcdFx0XHQgd2hpY2ggY29uc2lzdHMgb2YgdGhlIHN1YnByb3BlcnR5J3MgbmFtZSwgdGhlIGFzc29jaWF0ZWQgcm9vdCBwcm9wZXJ0eSdzIG5hbWUsXHJcblx0XHRcdFx0XHQgYW5kIHRoZSBzdWJwcm9wZXJ0eSdzIHBvc2l0aW9uIGluIHRoZSByb290J3MgdmFsdWUuICovXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBDb252ZXJ0IHRoZSB0ZW1wbGF0ZXMgaW50byBpbmRpdmlkdWFsIGhvb2tzIHRoZW4gYXBwZW5kIHRoZW0gdG8gdGhlIHJlZ2lzdGVyZWQgb2JqZWN0IGFib3ZlLiAqL1xyXG5cdFx0XHRcdHJlZ2lzdGVyOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdC8qIENvbG9yIGhvb2tzIHJlZ2lzdHJhdGlvbjogQ29sb3JzIGFyZSBkZWZhdWx0ZWQgdG8gd2hpdGUgLS0gYXMgb3Bwb3NlZCB0byBibGFjayAtLSBzaW5jZSBjb2xvcnMgdGhhdCBhcmVcclxuXHRcdFx0XHRcdCBjdXJyZW50bHkgc2V0IHRvIFwidHJhbnNwYXJlbnRcIiBkZWZhdWx0IHRvIHRoZWlyIHJlc3BlY3RpdmUgdGVtcGxhdGUgYmVsb3cgd2hlbiBjb2xvci1hbmltYXRlZCxcclxuXHRcdFx0XHRcdCBhbmQgd2hpdGUgaXMgdHlwaWNhbGx5IGEgY2xvc2VyIG1hdGNoIHRvIHRyYW5zcGFyZW50IHRoYW4gYmxhY2sgaXMuIEFuIGV4Y2VwdGlvbiBpcyBtYWRlIGZvciB0ZXh0IChcImNvbG9yXCIpLFxyXG5cdFx0XHRcdFx0IHdoaWNoIGlzIGFsbW9zdCBhbHdheXMgc2V0IGNsb3NlciB0byBibGFjayB0aGFuIHdoaXRlLiAqL1xyXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBDU1MuTGlzdHMuY29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdHZhciByZ2JDb21wb25lbnRzID0gKENTUy5MaXN0cy5jb2xvcnNbaV0gPT09IFwiY29sb3JcIikgPyBcIjAgMCAwIDFcIiA6IFwiMjU1IDI1NSAyNTUgMVwiO1xyXG5cdFx0XHRcdFx0XHRDU1MuSG9va3MudGVtcGxhdGVzW0NTUy5MaXN0cy5jb2xvcnNbaV1dID0gW1wiUmVkIEdyZWVuIEJsdWUgQWxwaGFcIiwgcmdiQ29tcG9uZW50c107XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dmFyIHJvb3RQcm9wZXJ0eSxcclxuXHRcdFx0XHRcdFx0XHRob29rVGVtcGxhdGUsXHJcblx0XHRcdFx0XHRcdFx0aG9va05hbWVzO1xyXG5cclxuXHRcdFx0XHRcdC8qIEluIElFLCBjb2xvciB2YWx1ZXMgaW5zaWRlIGNvbXBvdW5kLXZhbHVlIHByb3BlcnRpZXMgYXJlIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCB0aGUgdmFsdWUgaW5zdGVhZCBvZiBhdCB0aGUgYmVnaW5uaW5nLlxyXG5cdFx0XHRcdFx0IFRodXMsIHdlIHJlLWFycmFuZ2UgdGhlIHRlbXBsYXRlcyBhY2NvcmRpbmdseS4gKi9cclxuXHRcdFx0XHRcdGlmIChJRSkge1xyXG5cdFx0XHRcdFx0XHRmb3IgKHJvb3RQcm9wZXJ0eSBpbiBDU1MuSG9va3MudGVtcGxhdGVzKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFDU1MuSG9va3MudGVtcGxhdGVzLmhhc093blByb3BlcnR5KHJvb3RQcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRob29rVGVtcGxhdGUgPSBDU1MuSG9va3MudGVtcGxhdGVzW3Jvb3RQcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdFx0aG9va05hbWVzID0gaG9va1RlbXBsYXRlWzBdLnNwbGl0KFwiIFwiKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0dmFyIGRlZmF1bHRWYWx1ZXMgPSBob29rVGVtcGxhdGVbMV0ubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlU3BsaXQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoaG9va05hbWVzWzBdID09PSBcIkNvbG9yXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIFJlcG9zaXRpb24gYm90aCB0aGUgaG9vaydzIG5hbWUgYW5kIGl0cyBkZWZhdWx0IHZhbHVlIHRvIHRoZSBlbmQgb2YgdGhlaXIgcmVzcGVjdGl2ZSBzdHJpbmdzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aG9va05hbWVzLnB1c2goaG9va05hbWVzLnNoaWZ0KCkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlcy5wdXNoKGRlZmF1bHRWYWx1ZXMuc2hpZnQoKSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogUmVwbGFjZSB0aGUgZXhpc3RpbmcgdGVtcGxhdGUgZm9yIHRoZSBob29rJ3Mgcm9vdCBwcm9wZXJ0eS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdENTUy5Ib29rcy50ZW1wbGF0ZXNbcm9vdFByb3BlcnR5XSA9IFtob29rTmFtZXMuam9pbihcIiBcIiksIGRlZmF1bHRWYWx1ZXMuam9pbihcIiBcIildO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIEhvb2sgcmVnaXN0cmF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0Zm9yIChyb290UHJvcGVydHkgaW4gQ1NTLkhvb2tzLnRlbXBsYXRlcykge1xyXG5cdFx0XHRcdFx0XHRpZiAoIUNTUy5Ib29rcy50ZW1wbGF0ZXMuaGFzT3duUHJvcGVydHkocm9vdFByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGhvb2tUZW1wbGF0ZSA9IENTUy5Ib29rcy50ZW1wbGF0ZXNbcm9vdFByb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0aG9va05hbWVzID0gaG9va1RlbXBsYXRlWzBdLnNwbGl0KFwiIFwiKTtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAodmFyIGogaW4gaG9va05hbWVzKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFob29rTmFtZXMuaGFzT3duUHJvcGVydHkoaikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR2YXIgZnVsbEhvb2tOYW1lID0gcm9vdFByb3BlcnR5ICsgaG9va05hbWVzW2pdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRob29rUG9zaXRpb24gPSBqO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBGb3IgZWFjaCBob29rLCByZWdpc3RlciBpdHMgZnVsbCBuYW1lIChlLmcuIHRleHRTaGFkb3dCbHVyKSB3aXRoIGl0cyByb290IHByb3BlcnR5IChlLmcuIHRleHRTaGFkb3cpXHJcblx0XHRcdFx0XHRcdFx0IGFuZCB0aGUgaG9vaydzIHBvc2l0aW9uIGluIGl0cyB0ZW1wbGF0ZSdzIGRlZmF1bHQgdmFsdWUgc3RyaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRcdENTUy5Ib29rcy5yZWdpc3RlcmVkW2Z1bGxIb29rTmFtZV0gPSBbcm9vdFByb3BlcnR5LCBob29rUG9zaXRpb25dO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgSW5qZWN0aW9uIGFuZCBFeHRyYWN0aW9uXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHQvKiBMb29rIHVwIHRoZSByb290IHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9vayAoZS5nLiByZXR1cm4gXCJ0ZXh0U2hhZG93XCIgZm9yIFwidGV4dFNoYWRvd0JsdXJcIikuICovXHJcblx0XHRcdFx0LyogU2luY2UgYSBob29rIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgKHRoZSBicm93c2VyIHdvbid0IHJlY29nbml6ZSBpdCksIHN0eWxlIHVwZGF0aW5nIGZvciBob29rcyBpcyByb3V0ZWQgdGhyb3VnaCB0aGUgaG9vaydzIHJvb3QgcHJvcGVydHkuICovXHJcblx0XHRcdFx0Z2V0Um9vdDogZnVuY3Rpb24ocHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdHZhciBob29rRGF0YSA9IENTUy5Ib29rcy5yZWdpc3RlcmVkW3Byb3BlcnR5XTtcclxuXHJcblx0XHRcdFx0XHRpZiAoaG9va0RhdGEpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGhvb2tEYXRhWzBdO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlcmUgd2FzIG5vIGhvb2sgbWF0Y2gsIHJldHVybiB0aGUgcHJvcGVydHkgbmFtZSB1bnRvdWNoZWQuICovXHJcblx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGdldFVuaXQ6IGZ1bmN0aW9uKHN0ciwgc3RhcnQpIHtcclxuXHRcdFx0XHRcdHZhciB1bml0ID0gKHN0ci5zdWJzdHIoc3RhcnQgfHwgMCwgNSkubWF0Y2goL15bYS16JV0rLykgfHwgW10pWzBdIHx8IFwiXCI7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHVuaXQgJiYgX2luQXJyYXkoQ1NTLkxpc3RzLnVuaXRzLCB1bml0KSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5pdDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiBcIlwiO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Zml4Q29sb3JzOiBmdW5jdGlvbihzdHIpIHtcclxuXHRcdFx0XHRcdHJldHVybiBzdHIucmVwbGFjZSgvKHJnYmE/XFwoXFxzKik/KFxcYlthLXpdK1xcYikvZywgZnVuY3Rpb24oJDAsICQxLCAkMikge1xyXG5cdFx0XHRcdFx0XHRpZiAoQ1NTLkxpc3RzLmNvbG9yTmFtZXMuaGFzT3duUHJvcGVydHkoJDIpKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuICgkMSA/ICQxIDogXCJyZ2JhKFwiKSArIENTUy5MaXN0cy5jb2xvck5hbWVzWyQyXSArICgkMSA/IFwiXCIgOiBcIiwxKVwiKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJDEgKyAkMjtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogQ29udmVydCBhbnkgcm9vdFByb3BlcnR5VmFsdWUsIG51bGwgb3Igb3RoZXJ3aXNlLCBpbnRvIGEgc3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgaG9vayB2YWx1ZXMgc28gdGhhdFxyXG5cdFx0XHRcdCB0aGUgdGFyZ2V0ZWQgaG9vayBjYW4gYmUgaW5qZWN0ZWQgb3IgZXh0cmFjdGVkIGF0IGl0cyBzdGFuZGFyZCBwb3NpdGlvbi4gKi9cclxuXHRcdFx0XHRjbGVhblJvb3RQcm9wZXJ0eVZhbHVlOiBmdW5jdGlvbihyb290UHJvcGVydHksIHJvb3RQcm9wZXJ0eVZhbHVlKSB7XHJcblx0XHRcdFx0XHQvKiBJZiB0aGUgcm9vdFByb3BlcnR5VmFsdWUgaXMgd3JhcHBlZCB3aXRoIFwicmdiKClcIiwgXCJjbGlwKClcIiwgZXRjLiwgcmVtb3ZlIHRoZSB3cmFwcGluZyB0byBub3JtYWxpemUgdGhlIHZhbHVlIGJlZm9yZSBtYW5pcHVsYXRpb24uICovXHJcblx0XHRcdFx0XHRpZiAoQ1NTLlJlZ0V4LnZhbHVlVW53cmFwLnRlc3Qocm9vdFByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlID0gcm9vdFByb3BlcnR5VmFsdWUubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlVW53cmFwKVsxXTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBJZiByb290UHJvcGVydHlWYWx1ZSBpcyBhIENTUyBudWxsLXZhbHVlIChmcm9tIHdoaWNoIHRoZXJlJ3MgaW5oZXJlbnRseSBubyBob29rIHZhbHVlIHRvIGV4dHJhY3QpLFxyXG5cdFx0XHRcdFx0IGRlZmF1bHQgdG8gdGhlIHJvb3QncyBkZWZhdWx0IHZhbHVlIGFzIGRlZmluZWQgaW4gQ1NTLkhvb2tzLnRlbXBsYXRlcy4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IENTUyBudWxsLXZhbHVlcyBpbmNsdWRlIFwibm9uZVwiLCBcImF1dG9cIiwgYW5kIFwidHJhbnNwYXJlbnRcIi4gVGhleSBtdXN0IGJlIGNvbnZlcnRlZCBpbnRvIHRoZWlyXHJcblx0XHRcdFx0XHQgemVyby12YWx1ZXMgKGUuZy4gdGV4dFNoYWRvdzogXCJub25lXCIgPT0+IHRleHRTaGFkb3c6IFwiMHB4IDBweCAwcHggYmxhY2tcIikgZm9yIGhvb2sgbWFuaXB1bGF0aW9uIHRvIHByb2NlZWQuICovXHJcblx0XHRcdFx0XHRpZiAoQ1NTLlZhbHVlcy5pc0NTU051bGxWYWx1ZShyb290UHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuSG9va3MudGVtcGxhdGVzW3Jvb3RQcm9wZXJ0eV1bMV07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJvb3RQcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogRXh0cmFjdGVkIHRoZSBob29rJ3MgdmFsdWUgZnJvbSBpdHMgcm9vdCBwcm9wZXJ0eSdzIHZhbHVlLiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBzdGFydGluZyB2YWx1ZSBvZiBhbiBhbmltYXRpbmcgaG9vay4gKi9cclxuXHRcdFx0XHRleHRyYWN0VmFsdWU6IGZ1bmN0aW9uKGZ1bGxIb29rTmFtZSwgcm9vdFByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdHZhciBob29rRGF0YSA9IENTUy5Ib29rcy5yZWdpc3RlcmVkW2Z1bGxIb29rTmFtZV07XHJcblxyXG5cdFx0XHRcdFx0aWYgKGhvb2tEYXRhKSB7XHJcblx0XHRcdFx0XHRcdHZhciBob29rUm9vdCA9IGhvb2tEYXRhWzBdLFxyXG5cdFx0XHRcdFx0XHRcdFx0aG9va1Bvc2l0aW9uID0gaG9va0RhdGFbMV07XHJcblxyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IENTUy5Ib29rcy5jbGVhblJvb3RQcm9wZXJ0eVZhbHVlKGhvb2tSb290LCByb290UHJvcGVydHlWYWx1ZSk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTcGxpdCByb290UHJvcGVydHlWYWx1ZSBpbnRvIGl0cyBjb25zdGl0dWVudCBob29rIHZhbHVlcyB0aGVuIGdyYWIgdGhlIGRlc2lyZWQgaG9vayBhdCBpdHMgc3RhbmRhcmQgcG9zaXRpb24uICovXHJcblx0XHRcdFx0XHRcdHJldHVybiByb290UHJvcGVydHlWYWx1ZS50b1N0cmluZygpLm1hdGNoKENTUy5SZWdFeC52YWx1ZVNwbGl0KVtob29rUG9zaXRpb25dO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHByb3ZpZGVkIGZ1bGxIb29rTmFtZSBpc24ndCBhIHJlZ2lzdGVyZWQgaG9vaywgcmV0dXJuIHRoZSByb290UHJvcGVydHlWYWx1ZSB0aGF0IHdhcyBwYXNzZWQgaW4uICovXHJcblx0XHRcdFx0XHRcdHJldHVybiByb290UHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIEluamVjdCB0aGUgaG9vaydzIHZhbHVlIGludG8gaXRzIHJvb3QgcHJvcGVydHkncyB2YWx1ZS4gVGhpcyBpcyB1c2VkIHRvIHBpZWNlIGJhY2sgdG9nZXRoZXIgdGhlIHJvb3QgcHJvcGVydHlcclxuXHRcdFx0XHQgb25jZSBWZWxvY2l0eSBoYXMgdXBkYXRlZCBvbmUgb2YgaXRzIGluZGl2aWR1YWxseSBob29rZWQgdmFsdWVzIHRocm91Z2ggdHdlZW5pbmcuICovXHJcblx0XHRcdFx0aW5qZWN0VmFsdWU6IGZ1bmN0aW9uKGZ1bGxIb29rTmFtZSwgaG9va1ZhbHVlLCByb290UHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0dmFyIGhvb2tEYXRhID0gQ1NTLkhvb2tzLnJlZ2lzdGVyZWRbZnVsbEhvb2tOYW1lXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoaG9va0RhdGEpIHtcclxuXHRcdFx0XHRcdFx0dmFyIGhvb2tSb290ID0gaG9va0RhdGFbMF0sXHJcblx0XHRcdFx0XHRcdFx0XHRob29rUG9zaXRpb24gPSBob29rRGF0YVsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlUGFydHMsXHJcblx0XHRcdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZVVwZGF0ZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IENTUy5Ib29rcy5jbGVhblJvb3RQcm9wZXJ0eVZhbHVlKGhvb2tSb290LCByb290UHJvcGVydHlWYWx1ZSk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTcGxpdCByb290UHJvcGVydHlWYWx1ZSBpbnRvIGl0cyBpbmRpdmlkdWFsIGhvb2sgdmFsdWVzLCByZXBsYWNlIHRoZSB0YXJnZXRlZCB2YWx1ZSB3aXRoIGhvb2tWYWx1ZSxcclxuXHRcdFx0XHRcdFx0IHRoZW4gcmVjb25zdHJ1Y3QgdGhlIHJvb3RQcm9wZXJ0eVZhbHVlIHN0cmluZy4gKi9cclxuXHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWVQYXJ0cyA9IHJvb3RQcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlU3BsaXQpO1xyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZVBhcnRzW2hvb2tQb3NpdGlvbl0gPSBob29rVmFsdWU7XHJcblx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlVXBkYXRlZCA9IHJvb3RQcm9wZXJ0eVZhbHVlUGFydHMuam9pbihcIiBcIik7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdFByb3BlcnR5VmFsdWVVcGRhdGVkO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHByb3ZpZGVkIGZ1bGxIb29rTmFtZSBpc24ndCBhIHJlZ2lzdGVyZWQgaG9vaywgcmV0dXJuIHRoZSByb290UHJvcGVydHlWYWx1ZSB0aGF0IHdhcyBwYXNzZWQgaW4uICovXHJcblx0XHRcdFx0XHRcdHJldHVybiByb290UHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBOb3JtYWxpemF0aW9uc1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdC8qIE5vcm1hbGl6YXRpb25zIHN0YW5kYXJkaXplIENTUyBwcm9wZXJ0eSBtYW5pcHVsYXRpb24gYnkgcG9sbHlmaWxsaW5nIGJyb3dzZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIChlLmcuIG9wYWNpdHkpXHJcblx0XHRcdCBhbmQgcmVmb3JtYXR0aW5nIHNwZWNpYWwgcHJvcGVydGllcyAoZS5nLiBjbGlwLCByZ2JhKSB0byBsb29rIGxpa2Ugc3RhbmRhcmQgb25lcy4gKi9cclxuXHRcdFx0Tm9ybWFsaXphdGlvbnM6IHtcclxuXHRcdFx0XHQvKiBOb3JtYWxpemF0aW9ucyBhcmUgcGFzc2VkIGEgbm9ybWFsaXphdGlvbiB0YXJnZXQgKGVpdGhlciB0aGUgcHJvcGVydHkncyBuYW1lLCBpdHMgZXh0cmFjdGVkIHZhbHVlLCBvciBpdHMgaW5qZWN0ZWQgdmFsdWUpLFxyXG5cdFx0XHRcdCB0aGUgdGFyZ2V0ZWQgZWxlbWVudCAod2hpY2ggbWF5IG5lZWQgdG8gYmUgcXVlcmllZCksIGFuZCB0aGUgdGFyZ2V0ZWQgcHJvcGVydHkgdmFsdWUuICovXHJcblx0XHRcdFx0cmVnaXN0ZXJlZDoge1xyXG5cdFx0XHRcdFx0Y2xpcDogZnVuY3Rpb24odHlwZSwgZWxlbWVudCwgcHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRjYXNlIFwibmFtZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiY2xpcFwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ2xpcCBuZWVkcyB0byBiZSB1bndyYXBwZWQgYW5kIHN0cmlwcGVkIG9mIGl0cyBjb21tYXMgZHVyaW5nIGV4dHJhY3Rpb24uICovXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBleHRyYWN0ZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgVmVsb2NpdHkgYWxzbyBleHRyYWN0ZWQgdGhpcyB2YWx1ZSwgc2tpcCBleHRyYWN0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKENTUy5SZWdFeC53cmFwcGVkVmFsdWVBbHJlYWR5RXh0cmFjdGVkLnRlc3QocHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFjdGVkID0gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFJlbW92ZSB0aGUgXCJyZWN0KClcIiB3cmFwcGVyLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRleHRyYWN0ZWQgPSBwcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlVW53cmFwKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFN0cmlwIG9mZiBjb21tYXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGV4dHJhY3RlZCA9IGV4dHJhY3RlZCA/IGV4dHJhY3RlZFsxXS5yZXBsYWNlKC8sKFxccyspPy9nLCBcIiBcIikgOiBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBleHRyYWN0ZWQ7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBDbGlwIG5lZWRzIHRvIGJlIHJlLXdyYXBwZWQgZHVyaW5nIGluamVjdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRjYXNlIFwiaW5qZWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJyZWN0KFwiICsgcHJvcGVydHlWYWx1ZSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0Ymx1cjogZnVuY3Rpb24odHlwZSwgZWxlbWVudCwgcHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRjYXNlIFwibmFtZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFZlbG9jaXR5LlN0YXRlLmlzRmlyZWZveCA/IFwiZmlsdGVyXCIgOiBcIi13ZWJraXQtZmlsdGVyXCI7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBleHRyYWN0ZWQgPSBwYXJzZUZsb2F0KHByb3BlcnR5VmFsdWUpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIElmIGV4dHJhY3RlZCBpcyBOYU4sIG1lYW5pbmcgdGhlIHZhbHVlIGlzbid0IGFscmVhZHkgZXh0cmFjdGVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCEoZXh0cmFjdGVkIHx8IGV4dHJhY3RlZCA9PT0gMCkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGJsdXJDb21wb25lbnQgPSBwcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkubWF0Y2goL2JsdXJcXCgoWzAtOV0rW0Etel0rKVxcKS9pKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBmaWx0ZXIgc3RyaW5nIGhhZCBhIGJsdXIgY29tcG9uZW50LCByZXR1cm4ganVzdCB0aGUgYmx1ciB2YWx1ZSBhbmQgdW5pdCB0eXBlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYmx1ckNvbXBvbmVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV4dHJhY3RlZCA9IGJsdXJDb21wb25lbnRbMV07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgdGhlIGNvbXBvbmVudCBkb2Vzbid0IGV4aXN0LCBkZWZhdWx0IGJsdXIgdG8gMC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRleHRyYWN0ZWQgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGV4dHJhY3RlZDtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEJsdXIgbmVlZHMgdG8gYmUgcmUtd3JhcHBlZCBkdXJpbmcgaW5qZWN0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJpbmplY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEZvciB0aGUgYmx1ciBlZmZlY3QgdG8gYmUgZnVsbHkgZGUtYXBwbGllZCwgaXQgbmVlZHMgdG8gYmUgc2V0IHRvIFwibm9uZVwiIGluc3RlYWQgb2YgMC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmICghcGFyc2VGbG9hdChwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJub25lXCI7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJibHVyKFwiICsgcHJvcGVydHlWYWx1ZSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0LyogPD1JRTggZG8gbm90IHN1cHBvcnQgdGhlIHN0YW5kYXJkIG9wYWNpdHkgcHJvcGVydHkuIFRoZXkgdXNlIGZpbHRlcjphbHBoYShvcGFjaXR5PUlOVCkgaW5zdGVhZC4gKi9cclxuXHRcdFx0XHRcdG9wYWNpdHk6IGZ1bmN0aW9uKHR5cGUsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKElFIDw9IDgpIHtcclxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJuYW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcImZpbHRlclwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogPD1JRTggcmV0dXJuIGEgXCJmaWx0ZXJcIiB2YWx1ZSBvZiBcImFscGhhKG9wYWNpdHk9XFxkezEsM30pXCIuXHJcblx0XHRcdFx0XHRcdFx0XHRcdCBFeHRyYWN0IHRoZSB2YWx1ZSBhbmQgY29udmVydCBpdCB0byBhIGRlY2ltYWwgdmFsdWUgdG8gbWF0Y2ggdGhlIHN0YW5kYXJkIENTUyBvcGFjaXR5IHByb3BlcnR5J3MgZm9ybWF0dGluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGV4dHJhY3RlZCA9IHByb3BlcnR5VmFsdWUudG9TdHJpbmcoKS5tYXRjaCgvYWxwaGFcXChvcGFjaXR5PSguKilcXCkvaSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZXh0cmFjdGVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQ29udmVydCB0byBkZWNpbWFsIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSBleHRyYWN0ZWRbMV0gLyAxMDA7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogV2hlbiBleHRyYWN0aW5nIG9wYWNpdHksIGRlZmF1bHQgdG8gMSBzaW5jZSBhIG51bGwgdmFsdWUgbWVhbnMgb3BhY2l0eSBoYXNuJ3QgYmVlbiBzZXQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IDE7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImluamVjdFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBPcGFjaWZpZWQgZWxlbWVudHMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgdGhlaXIgem9vbSBwcm9wZXJ0eSBzZXQgdG8gYSBub24temVybyB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS56b29tID0gMTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFNldHRpbmcgdGhlIGZpbHRlciBwcm9wZXJ0eSBvbiBlbGVtZW50cyB3aXRoIGNlcnRhaW4gZm9udCBwcm9wZXJ0eSBjb21iaW5hdGlvbnMgY2FuIHJlc3VsdCBpbiBhXHJcblx0XHRcdFx0XHRcdFx0XHRcdCBoaWdobHkgdW5hcHBlYWxpbmcgdWx0cmEtYm9sZGluZyBlZmZlY3QuIFRoZXJlJ3Mgbm8gd2F5IHRvIHJlbWVkeSB0aGlzIHRocm91Z2hvdXQgYSB0d2VlbiwgYnV0IGRyb3BwaW5nIHRoZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgdmFsdWUgYWx0b2dldGhlciAod2hlbiBvcGFjaXR5IGhpdHMgMSkgYXQgbGVhc3RzIGVuc3VyZXMgdGhhdCB0aGUgZ2xpdGNoIGlzIGdvbmUgcG9zdC10d2VlbmluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlRmxvYXQocHJvcGVydHlWYWx1ZSkgPj0gMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEFzIHBlciB0aGUgZmlsdGVyIHByb3BlcnR5J3Mgc3BlYywgY29udmVydCB0aGUgZGVjaW1hbCB2YWx1ZSB0byBhIHdob2xlIG51bWJlciBhbmQgd3JhcCB0aGUgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiYWxwaGEob3BhY2l0eT1cIiArIHBhcnNlSW50KHBhcnNlRmxvYXQocHJvcGVydHlWYWx1ZSkgKiAxMDAsIDEwKSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdC8qIFdpdGggYWxsIG90aGVyIGJyb3dzZXJzLCBub3JtYWxpemF0aW9uIGlzIG5vdCByZXF1aXJlZDsgcmV0dXJuIHRoZSBzYW1lIHZhbHVlcyB0aGF0IHdlcmUgcGFzc2VkIGluLiAqL1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAodHlwZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIm5hbWVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwib3BhY2l0eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiaW5qZWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IEJhdGNoZWQgUmVnaXN0cmF0aW9uc1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogTm90ZTogQmF0Y2hlZCBub3JtYWxpemF0aW9ucyBleHRlbmQgdGhlIENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkIG9iamVjdC4gKi9cclxuXHRcdFx0XHRyZWdpc3RlcjogZnVuY3Rpb24oKSB7XHJcblxyXG5cdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgVHJhbnNmb3Jtc1xyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIFRyYW5zZm9ybXMgYXJlIHRoZSBzdWJwcm9wZXJ0aWVzIGNvbnRhaW5lZCBieSB0aGUgQ1NTIFwidHJhbnNmb3JtXCIgcHJvcGVydHkuIFRyYW5zZm9ybXMgbXVzdCB1bmRlcmdvIG5vcm1hbGl6YXRpb25cclxuXHRcdFx0XHRcdCBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlZmVyZW5jZWQgaW4gYSBwcm9wZXJ0aWVzIG1hcCBieSB0aGVpciBpbmRpdmlkdWFsIG5hbWVzLiAqL1xyXG5cdFx0XHRcdFx0LyogTm90ZTogV2hlbiB0cmFuc2Zvcm1zIGFyZSBcInNldFwiLCB0aGV5IGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byBhIHBlci1lbGVtZW50IHRyYW5zZm9ybUNhY2hlLiBXaGVuIGFsbCB0cmFuc2Zvcm1cclxuXHRcdFx0XHRcdCBzZXR0aW5nIGlzIGNvbXBsZXRlIGNvbXBsZXRlLCBDU1MuZmx1c2hUcmFuc2Zvcm1DYWNoZSgpIG11c3QgYmUgbWFudWFsbHkgY2FsbGVkIHRvIGZsdXNoIHRoZSB2YWx1ZXMgdG8gdGhlIERPTS5cclxuXHRcdFx0XHRcdCBUcmFuc2Zvcm0gc2V0dGluZyBpcyBiYXRjaGVkIGluIHRoaXMgd2F5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2U6IHRoZSB0cmFuc2Zvcm0gc3R5bGUgb25seSBuZWVkcyB0byBiZSB1cGRhdGVkXHJcblx0XHRcdFx0XHQgb25jZSB3aGVuIG11bHRpcGxlIHRyYW5zZm9ybSBzdWJwcm9wZXJ0aWVzIGFyZSBiZWluZyBhbmltYXRlZCBzaW11bHRhbmVvdXNseS4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IElFOSBhbmQgQW5kcm9pZCBHaW5nZXJicmVhZCBoYXZlIHN1cHBvcnQgZm9yIDJEIC0tIGJ1dCBub3QgM0QgLS0gdHJhbnNmb3Jtcy4gU2luY2UgYW5pbWF0aW5nIHVuc3VwcG9ydGVkXHJcblx0XHRcdFx0XHQgdHJhbnNmb3JtIHByb3BlcnRpZXMgcmVzdWx0cyBpbiB0aGUgYnJvd3NlciBpZ25vcmluZyB0aGUgKmVudGlyZSogdHJhbnNmb3JtIHN0cmluZywgd2UgcHJldmVudCB0aGVzZSAzRCB2YWx1ZXNcclxuXHRcdFx0XHRcdCBmcm9tIGJlaW5nIG5vcm1hbGl6ZWQgZm9yIHRoZXNlIGJyb3dzZXJzIHNvIHRoYXQgdHdlZW5pbmcgc2tpcHMgdGhlc2UgcHJvcGVydGllcyBhbHRvZ2V0aGVyXHJcblx0XHRcdFx0XHQgKHNpbmNlIGl0IHdpbGwgaWdub3JlIHRoZW0gYXMgYmVpbmcgdW5zdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuKSAqL1xyXG5cdFx0XHRcdFx0aWYgKCghSUUgfHwgSUUgPiA5KSAmJiAhVmVsb2NpdHkuU3RhdGUuaXNHaW5nZXJicmVhZCkge1xyXG5cdFx0XHRcdFx0XHQvKiBOb3RlOiBTaW5jZSB0aGUgc3RhbmRhbG9uZSBDU1MgXCJwZXJzcGVjdGl2ZVwiIHByb3BlcnR5IGFuZCB0aGUgQ1NTIHRyYW5zZm9ybSBcInBlcnNwZWN0aXZlXCIgc3VicHJvcGVydHlcclxuXHRcdFx0XHRcdFx0IHNoYXJlIHRoZSBzYW1lIG5hbWUsIHRoZSBsYXR0ZXIgaXMgZ2l2ZW4gYSB1bmlxdWUgdG9rZW4gd2l0aGluIFZlbG9jaXR5OiBcInRyYW5zZm9ybVBlcnNwZWN0aXZlXCIuICovXHJcblx0XHRcdFx0XHRcdENTUy5MaXN0cy50cmFuc2Zvcm1zQmFzZSA9IENTUy5MaXN0cy50cmFuc2Zvcm1zQmFzZS5jb25jYXQoQ1NTLkxpc3RzLnRyYW5zZm9ybXMzRCk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBDU1MuTGlzdHMudHJhbnNmb3Jtc0Jhc2UubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0LyogV3JhcCB0aGUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIG5vcm1hbGl6YXRpb24gZnVuY3Rpb24gaW4gYSBuZXcgc2NvcGUgc28gdGhhdCB0cmFuc2Zvcm1OYW1lJ3MgdmFsdWUgaXNcclxuXHRcdFx0XHRcdFx0IHBhaXJlZCB3aXRoIGl0cyByZXNwZWN0aXZlIGZ1bmN0aW9uLiAoT3RoZXJ3aXNlLCBhbGwgZnVuY3Rpb25zIHdvdWxkIHRha2UgdGhlIGZpbmFsIGZvciBsb29wJ3MgdHJhbnNmb3JtTmFtZS4pICovXHJcblx0XHRcdFx0XHRcdChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgdHJhbnNmb3JtTmFtZSA9IENTUy5MaXN0cy50cmFuc2Zvcm1zQmFzZVtpXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbdHJhbnNmb3JtTmFtZV0gPSBmdW5jdGlvbih0eXBlLCBlbGVtZW50LCBwcm9wZXJ0eVZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogVGhlIG5vcm1hbGl6ZWQgcHJvcGVydHkgbmFtZSBpcyB0aGUgcGFyZW50IFwidHJhbnNmb3JtXCIgcHJvcGVydHkgLS0gdGhlIHByb3BlcnR5IHRoYXQgaXMgYWN0dWFsbHkgc2V0IGluIENTUy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIm5hbWVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJ0cmFuc2Zvcm1cIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBUcmFuc2Zvcm0gdmFsdWVzIGFyZSBjYWNoZWQgb250byBhIHBlci1lbGVtZW50IHRyYW5zZm9ybUNhY2hlIG9iamVjdC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB0aGlzIHRyYW5zZm9ybSBoYXMgeWV0IHRvIGJlIGFzc2lnbmVkIGEgdmFsdWUsIHJldHVybiBpdHMgbnVsbCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KSA9PT0gdW5kZWZpbmVkIHx8IERhdGEoZWxlbWVudCkudHJhbnNmb3JtQ2FjaGVbdHJhbnNmb3JtTmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogU2NhbGUgQ1NTLkxpc3RzLnRyYW5zZm9ybXNCYXNlIGRlZmF1bHQgdG8gMSB3aGVyZWFzIGFsbCBvdGhlciB0cmFuc2Zvcm0gcHJvcGVydGllcyBkZWZhdWx0IHRvIDAuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gL15zY2FsZS9pLnRlc3QodHJhbnNmb3JtTmFtZSkgPyAxIDogMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFdoZW4gdHJhbnNmb3JtIHZhbHVlcyBhcmUgc2V0LCB0aGV5IGFyZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIGFzIHBlciB0aGUgQ1NTIHNwZWMuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgVGh1cywgd2hlbiBleHRyYWN0aW5nIHRoZWlyIHZhbHVlcyAoZm9yIHR3ZWVuIGNhbGN1bGF0aW9ucyksIHdlIHN0cmlwIG9mZiB0aGUgcGFyZW50aGVzZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdLnJlcGxhY2UoL1soKV0vZywgXCJcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJpbmplY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgaW52YWxpZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiBhbiBpbmRpdmlkdWFsIHRyYW5zZm9ybSBwcm9wZXJ0eSBjb250YWlucyBhbiB1bnN1cHBvcnRlZCB1bml0IHR5cGUsIHRoZSBicm93c2VyIGlnbm9yZXMgdGhlICplbnRpcmUqIHRyYW5zZm9ybSBwcm9wZXJ0eS5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgVGh1cywgcHJvdGVjdCB1c2VycyBmcm9tIHRoZW1zZWx2ZXMgYnkgc2tpcHBpbmcgc2V0dGluZyBmb3IgdHJhbnNmb3JtIHZhbHVlcyBzdXBwbGllZCB3aXRoIGludmFsaWQgdW5pdCB0eXBlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBTd2l0Y2ggb24gdGhlIGJhc2UgdHJhbnNmb3JtIHR5cGU7IGlnbm9yZSB0aGUgYXhpcyBieSByZW1vdmluZyB0aGUgbGFzdCBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNmb3JtJ3MgbmFtZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHRyYW5zZm9ybU5hbWUuc3Vic3RyKDAsIHRyYW5zZm9ybU5hbWUubGVuZ3RoIC0gMSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFdoaXRlbGlzdCB1bml0IHR5cGVzIGZvciBlYWNoIHRyYW5zZm9ybS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJ0cmFuc2xhdGVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW52YWxpZCA9ICEvKCV8cHh8ZW18cmVtfHZ3fHZofFxcZCkkL2kudGVzdChwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFNpbmNlIGFuIGF4aXMtZnJlZSBcInNjYWxlXCIgcHJvcGVydHkgaXMgc3VwcG9ydGVkIGFzIHdlbGwsIGEgbGl0dGxlIGhhY2sgaXMgdXNlZCBoZXJlIHRvIGRldGVjdCBpdCBieSBjaG9wcGluZyBvZmYgaXRzIGxhc3QgbGV0dGVyLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInNjYWxcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJzY2FsZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBDaHJvbWUgb24gQW5kcm9pZCBoYXMgYSBidWcgaW4gd2hpY2ggc2NhbGVkIGVsZW1lbnRzIGJsdXIgaWYgdGhlaXIgaW5pdGlhbCBzY2FsZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgdmFsdWUgaXMgYmVsb3cgMSAod2hpY2ggY2FuIGhhcHBlbiB3aXRoIGZvcmNlZmVlZGluZykuIFRodXMsIHdlIGRldGVjdCBhIHlldC11bnNldCBzY2FsZSBwcm9wZXJ0eVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgYW5kIGVuc3VyZSB0aGF0IGl0cyBmaXJzdCB2YWx1ZSBpcyBhbHdheXMgMS4gTW9yZSBpbmZvOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNDE3ODkwL2NzczMtYW5pbWF0aW9ucy13aXRoLXRyYW5zZm9ybS1jYXVzZXMtYmx1cnJlZC1lbGVtZW50cy1vbi13ZWJraXQvMTA0MTc5NjIjMTA0MTc5NjIgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LlN0YXRlLmlzQW5kcm9pZCAmJiBEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdID09PSB1bmRlZmluZWQgJiYgcHJvcGVydHlWYWx1ZSA8IDEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gMTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW52YWxpZCA9ICEvKFxcZCkkL2kudGVzdChwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwic2tld1wiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpbnZhbGlkID0gIS8oZGVnfFxcZCkkL2kudGVzdChwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwicm90YXRlXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGludmFsaWQgPSAhLyhkZWd8XFxkKSQvaS50ZXN0KHByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghaW52YWxpZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQXMgcGVyIHRoZSBDU1Mgc3BlYywgd3JhcCB0aGUgdmFsdWUgaW4gcGFyZW50aGVzZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHREYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdID0gXCIoXCIgKyBwcm9wZXJ0eVZhbHVlICsgXCIpXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBBbHRob3VnaCB0aGUgdmFsdWUgaXMgc2V0IG9uIHRoZSB0cmFuc2Zvcm1DYWNoZSBvYmplY3QsIHJldHVybiB0aGUgbmV3bHktdXBkYXRlZCB2YWx1ZSBmb3IgdGhlIGNhbGxpbmcgY29kZSB0byBwcm9jZXNzIGFzIG5vcm1hbC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9KSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgQ29sb3JzXHJcblx0XHRcdFx0XHQgKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHQvKiBTaW5jZSBWZWxvY2l0eSBvbmx5IGFuaW1hdGVzIGEgc2luZ2xlIG51bWVyaWMgdmFsdWUgcGVyIHByb3BlcnR5LCBjb2xvciBhbmltYXRpb24gaXMgYWNoaWV2ZWQgYnkgaG9va2luZyB0aGUgaW5kaXZpZHVhbCBSR0JBIGNvbXBvbmVudHMgb2YgQ1NTIGNvbG9yIHByb3BlcnRpZXMuXHJcblx0XHRcdFx0XHQgQWNjb3JkaW5nbHksIGNvbG9yIHZhbHVlcyBtdXN0IGJlIG5vcm1hbGl6ZWQgKGUuZy4gXCIjZmYwMDAwXCIsIFwicmVkXCIsIGFuZCBcInJnYigyNTUsIDAsIDApXCIgPT0+IFwiMjU1IDAgMCAxXCIpIHNvIHRoYXQgdGhlaXIgY29tcG9uZW50cyBjYW4gYmUgaW5qZWN0ZWQvZXh0cmFjdGVkIGJ5IENTUy5Ib29rcyBsb2dpYy4gKi9cclxuXHRcdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgQ1NTLkxpc3RzLmNvbG9ycy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdFx0XHQvKiBXcmFwIHRoZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgbm9ybWFsaXphdGlvbiBmdW5jdGlvbiBpbiBhIG5ldyBzY29wZSBzbyB0aGF0IGNvbG9yTmFtZSdzIHZhbHVlIGlzIHBhaXJlZCB3aXRoIGl0cyByZXNwZWN0aXZlIGZ1bmN0aW9uLlxyXG5cdFx0XHRcdFx0XHQgKE90aGVyd2lzZSwgYWxsIGZ1bmN0aW9ucyB3b3VsZCB0YWtlIHRoZSBmaW5hbCBmb3IgbG9vcCdzIGNvbG9yTmFtZS4pICovXHJcblx0XHRcdFx0XHRcdChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgY29sb3JOYW1lID0gQ1NTLkxpc3RzLmNvbG9yc1tqXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogTm90ZTogSW4gSUU8PTgsIHdoaWNoIHN1cHBvcnQgcmdiIGJ1dCBub3QgcmdiYSwgY29sb3IgcHJvcGVydGllcyBhcmUgcmV2ZXJ0ZWQgdG8gcmdiIGJ5IHN0cmlwcGluZyBvZmYgdGhlIGFscGhhIGNvbXBvbmVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtjb2xvck5hbWVdID0gZnVuY3Rpb24odHlwZSwgZWxlbWVudCwgcHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJuYW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvbG9yTmFtZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBDb252ZXJ0IGFsbCBjb2xvciB2YWx1ZXMgaW50byB0aGUgcmdiIGZvcm1hdC4gKE9sZCBJRSBjYW4gcmV0dXJuIGhleCB2YWx1ZXMgYW5kIGNvbG9yIG5hbWVzIGluc3RlYWQgb2YgcmdiL3JnYmEuKSAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiZXh0cmFjdFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBleHRyYWN0ZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBjb2xvciBpcyBhbHJlYWR5IGluIGl0cyBob29rYWJsZSBmb3JtIChlLmcuIFwiMjU1IDI1NSAyNTUgMVwiKSBkdWUgdG8gaGF2aW5nIGJlZW4gcHJldmlvdXNseSBleHRyYWN0ZWQsIHNraXAgZXh0cmFjdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoQ1NTLlJlZ0V4LndyYXBwZWRWYWx1ZUFscmVhZHlFeHRyYWN0ZWQudGVzdChwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFjdGVkID0gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGNvbnZlcnRlZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2xvck5hbWVzID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YmxhY2s6IFwicmdiKDAsIDAsIDApXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRibHVlOiBcInJnYigwLCAwLCAyNTUpXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncmF5OiBcInJnYigxMjgsIDEyOCwgMTI4KVwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Z3JlZW46IFwicmdiKDAsIDEyOCwgMClcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlZDogXCJyZ2IoMjU1LCAwLCAwKVwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpdGU6IFwicmdiKDI1NSwgMjU1LCAyNTUpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIENvbnZlcnQgY29sb3IgbmFtZXMgdG8gcmdiLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKC9eW0Etel0rJC9pLnRlc3QocHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbG9yTmFtZXNbcHJvcGVydHlWYWx1ZV0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlZCA9IGNvbG9yTmFtZXNbcHJvcGVydHlWYWx1ZV07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgYW4gdW5tYXRjaGVkIGNvbG9yIG5hbWUgaXMgcHJvdmlkZWQsIGRlZmF1bHQgdG8gYmxhY2suICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVkID0gY29sb3JOYW1lcy5ibGFjaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBDb252ZXJ0IGhleCB2YWx1ZXMgdG8gcmdiLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChDU1MuUmVnRXguaXNIZXgudGVzdChwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZWQgPSBcInJnYihcIiArIENTUy5WYWx1ZXMuaGV4VG9SZ2IocHJvcGVydHlWYWx1ZSkuam9pbihcIiBcIikgKyBcIilcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgdGhlIHByb3ZpZGVkIGNvbG9yIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSBhY2NlcHRlZCBjb2xvciBmb3JtYXRzLCBkZWZhdWx0IHRvIGJsYWNrLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICghKC9ecmdiYT9cXCgvaS50ZXN0KHByb3BlcnR5VmFsdWUpKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZWQgPSBjb2xvck5hbWVzLmJsYWNrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFJlbW92ZSB0aGUgc3Vycm91bmRpbmcgXCJyZ2IvcmdiYSgpXCIgc3RyaW5nIHRoZW4gcmVwbGFjZSBjb21tYXMgd2l0aCBzcGFjZXMgYW5kIHN0cmlwXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgcmVwZWF0ZWQgc3BhY2VzIChpbiBjYXNlIHRoZSB2YWx1ZSBpbmNsdWRlZCBzcGFjZXMgdG8gYmVnaW4gd2l0aCkuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRleHRyYWN0ZWQgPSAoY29udmVydGVkIHx8IHByb3BlcnR5VmFsdWUpLnRvU3RyaW5nKCkubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlVW53cmFwKVsxXS5yZXBsYWNlKC8sKFxccyspPy9nLCBcIiBcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBTbyBsb25nIGFzIHRoaXMgaXNuJ3QgPD1JRTgsIGFkZCBhIGZvdXJ0aCAoYWxwaGEpIGNvbXBvbmVudCBpZiBpdCdzIG1pc3NpbmcgYW5kIGRlZmF1bHQgaXQgdG8gMSAodmlzaWJsZSkuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCghSUUgfHwgSUUgPiA4KSAmJiBleHRyYWN0ZWQuc3BsaXQoXCIgXCIpLmxlbmd0aCA9PT0gMykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFjdGVkICs9IFwiIDFcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBleHRyYWN0ZWQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJpbmplY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB3ZSBoYXZlIGEgcGF0dGVybiB0aGVuIGl0IG1pZ2h0IGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgdmFsdWVzICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKC9ecmdiLy50ZXN0KHByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoaXMgaXMgSUU8PTggYW5kIGFuIGFscGhhIGNvbXBvbmVudCBleGlzdHMsIHN0cmlwIGl0IG9mZi4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSUUgPD0gOCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUuc3BsaXQoXCIgXCIpLmxlbmd0aCA9PT0gNCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZS5zcGxpdCgvXFxzKy8pLnNsaWNlKDAsIDMpLmpvaW4oXCIgXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogT3RoZXJ3aXNlLCBhZGQgYSBmb3VydGggKGFscGhhKSBjb21wb25lbnQgaWYgaXQncyBtaXNzaW5nIGFuZCBkZWZhdWx0IGl0IHRvIDEgKHZpc2libGUpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHlWYWx1ZS5zcGxpdChcIiBcIikubGVuZ3RoID09PSAzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlICs9IFwiIDFcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFJlLWluc2VydCB0aGUgYnJvd3Nlci1hcHByb3ByaWF0ZSB3cmFwcGVyKFwicmdiL3JnYmEoKVwiKSwgaW5zZXJ0IGNvbW1hcywgYW5kIHN0cmlwIG9mZiBkZWNpbWFsIHVuaXRzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IG9uIGFsbCB2YWx1ZXMgYnV0IHRoZSBmb3VydGggKFIsIEcsIGFuZCBCIG9ubHkgYWNjZXB0IHdob2xlIG51bWJlcnMpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAoSUUgPD0gOCA/IFwicmdiXCIgOiBcInJnYmFcIikgKyBcIihcIiArIHByb3BlcnR5VmFsdWUucmVwbGFjZSgvXFxzKy9nLCBcIixcIikucmVwbGFjZSgvXFwuKFxcZCkrKD89LCkvZywgXCJcIikgKyBcIilcIjtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9KSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IERpbWVuc2lvbnNcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKi9cclxuXHRcdFx0XHRcdGZ1bmN0aW9uIGF1Z21lbnREaW1lbnNpb24obmFtZSwgZWxlbWVudCwgd2FudElubmVyKSB7XHJcblx0XHRcdFx0XHRcdHZhciBpc0JvcmRlckJveCA9IENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiYm94U2l6aW5nXCIpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJib3JkZXItYm94XCI7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoaXNCb3JkZXJCb3ggPT09ICh3YW50SW5uZXIgfHwgZmFsc2UpKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogaW4gYm94LXNpemluZyBtb2RlLCB0aGUgQ1NTIHdpZHRoIC8gaGVpZ2h0IGFjY2Vzc29ycyBhbHJlYWR5IGdpdmUgdGhlIG91dGVyV2lkdGggLyBvdXRlckhlaWdodC4gKi9cclxuXHRcdFx0XHRcdFx0XHR2YXIgaSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGF1Z21lbnQgPSAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzaWRlcyA9IG5hbWUgPT09IFwid2lkdGhcIiA/IFtcIkxlZnRcIiwgXCJSaWdodFwiXSA6IFtcIlRvcFwiLCBcIkJvdHRvbVwiXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRzID0gW1wicGFkZGluZ1wiICsgc2lkZXNbMF0sIFwicGFkZGluZ1wiICsgc2lkZXNbMV0sIFwiYm9yZGVyXCIgKyBzaWRlc1swXSArIFwiV2lkdGhcIiwgXCJib3JkZXJcIiArIHNpZGVzWzFdICsgXCJXaWR0aFwiXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIGZpZWxkc1tpXSkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFpc05hTih2YWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXVnbWVudCArPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHdhbnRJbm5lciA/IC1hdWdtZW50IDogYXVnbWVudDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGZ1bmN0aW9uIGdldERpbWVuc2lvbihuYW1lLCB3YW50SW5uZXIpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKHR5cGUsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJuYW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBuYW1lO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlRmxvYXQocHJvcGVydHlWYWx1ZSkgKyBhdWdtZW50RGltZW5zaW9uKG5hbWUsIGVsZW1lbnQsIHdhbnRJbm5lcik7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiaW5qZWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAocGFyc2VGbG9hdChwcm9wZXJ0eVZhbHVlKSAtIGF1Z21lbnREaW1lbnNpb24obmFtZSwgZWxlbWVudCwgd2FudElubmVyKSkgKyBcInB4XCI7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWQuaW5uZXJXaWR0aCA9IGdldERpbWVuc2lvbihcIndpZHRoXCIsIHRydWUpO1xyXG5cdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWQuaW5uZXJIZWlnaHQgPSBnZXREaW1lbnNpb24oXCJoZWlnaHRcIiwgdHJ1ZSk7XHJcblx0XHRcdFx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZC5vdXRlcldpZHRoID0gZ2V0RGltZW5zaW9uKFwid2lkdGhcIik7XHJcblx0XHRcdFx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZC5vdXRlckhlaWdodCA9IGdldERpbWVuc2lvbihcImhlaWdodFwiKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IENTUyBQcm9wZXJ0eSBOYW1lc1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0TmFtZXM6IHtcclxuXHRcdFx0XHQvKiBDYW1lbGNhc2UgYSBwcm9wZXJ0eSBuYW1lIGludG8gaXRzIEphdmFTY3JpcHQgbm90YXRpb24gKGUuZy4gXCJiYWNrZ3JvdW5kLWNvbG9yXCIgPT0+IFwiYmFja2dyb3VuZENvbG9yXCIpLlxyXG5cdFx0XHRcdCBDYW1lbGNhc2luZyBpcyB1c2VkIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0eSBuYW1lcyBiZXR3ZWVuIGFuZCBhY3Jvc3MgY2FsbHMuICovXHJcblx0XHRcdFx0Y2FtZWxDYXNlOiBmdW5jdGlvbihwcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5LnJlcGxhY2UoLy0oXFx3KS9nLCBmdW5jdGlvbihtYXRjaCwgc3ViTWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHN1Yk1hdGNoLnRvVXBwZXJDYXNlKCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIEZvciBTVkcgZWxlbWVudHMsIHNvbWUgcHJvcGVydGllcyAobmFtZWx5LCBkaW1lbnNpb25hbCBvbmVzKSBhcmUgR0VUL1NFVCB2aWEgdGhlIGVsZW1lbnQncyBIVE1MIGF0dHJpYnV0ZXMgKGluc3RlYWQgb2YgdmlhIENTUyBzdHlsZXMpLiAqL1xyXG5cdFx0XHRcdFNWR0F0dHJpYnV0ZTogZnVuY3Rpb24ocHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdHZhciBTVkdBdHRyaWJ1dGVzID0gXCJ3aWR0aHxoZWlnaHR8eHx5fGN4fGN5fHJ8cnh8cnl8eDF8eDJ8eTF8eTJcIjtcclxuXHJcblx0XHRcdFx0XHQvKiBDZXJ0YWluIGJyb3dzZXJzIHJlcXVpcmUgYW4gU1ZHIHRyYW5zZm9ybSB0byBiZSBhcHBsaWVkIGFzIGFuIGF0dHJpYnV0ZS4gKE90aGVyd2lzZSwgYXBwbGljYXRpb24gdmlhIENTUyBpcyBwcmVmZXJhYmxlIGR1ZSB0byAzRCBzdXBwb3J0LikgKi9cclxuXHRcdFx0XHRcdGlmIChJRSB8fCAoVmVsb2NpdHkuU3RhdGUuaXNBbmRyb2lkICYmICFWZWxvY2l0eS5TdGF0ZS5pc0Nocm9tZSkpIHtcclxuXHRcdFx0XHRcdFx0U1ZHQXR0cmlidXRlcyArPSBcInx0cmFuc2Zvcm1cIjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFJlZ0V4cChcIl4oXCIgKyBTVkdBdHRyaWJ1dGVzICsgXCIpJFwiLCBcImlcIikudGVzdChwcm9wZXJ0eSk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBEZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgd2l0aCBhIHZlbmRvciBwcmVmaXguICovXHJcblx0XHRcdFx0LyogSWYgYSBwcmVmaXhlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBleGlzdHMsIHJldHVybiBpdC4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIG9yaWdpbmFsIHByb3BlcnR5IG5hbWUuXHJcblx0XHRcdFx0IElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgYXQgYWxsIHN1cHBvcnRlZCBieSB0aGUgYnJvd3NlciwgcmV0dXJuIGEgZmFsc2UgZmxhZy4gKi9cclxuXHRcdFx0XHRwcmVmaXhDaGVjazogZnVuY3Rpb24ocHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdC8qIElmIHRoaXMgcHJvcGVydHkgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLCByZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdGlmIChWZWxvY2l0eS5TdGF0ZS5wcmVmaXhNYXRjaGVzW3Byb3BlcnR5XSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gW1ZlbG9jaXR5LlN0YXRlLnByZWZpeE1hdGNoZXNbcHJvcGVydHldLCB0cnVlXTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHZhciB2ZW5kb3JzID0gW1wiXCIsIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiwgXCJPXCJdO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIHZlbmRvcnNMZW5ndGggPSB2ZW5kb3JzLmxlbmd0aDsgaSA8IHZlbmRvcnNMZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBwcm9wZXJ0eVByZWZpeGVkO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoaSA9PT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlQcmVmaXhlZCA9IHByb3BlcnR5O1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIHByb3BlcnR5IHRvIGNvbmZvcm0gdG8gSmF2YVNjcmlwdCB2ZW5kb3IgcHJlZml4IG5vdGF0aW9uIChlLmcuIHdlYmtpdEZpbHRlcikuICovXHJcblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVByZWZpeGVkID0gdmVuZG9yc1tpXSArIHByb3BlcnR5LnJlcGxhY2UoL15cXHcvLCBmdW5jdGlvbihtYXRjaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWF0Y2gudG9VcHBlckNhc2UoKTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogQ2hlY2sgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhpcyBwcm9wZXJ0eSBhcyBwcmVmaXhlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc1N0cmluZyhWZWxvY2l0eS5TdGF0ZS5wcmVmaXhFbGVtZW50LnN0eWxlW3Byb3BlcnR5UHJlZml4ZWRdKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ2FjaGUgdGhlIG1hdGNoLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuU3RhdGUucHJlZml4TWF0Y2hlc1twcm9wZXJ0eV0gPSBwcm9wZXJ0eVByZWZpeGVkO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBbcHJvcGVydHlQcmVmaXhlZCwgdHJ1ZV07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhpcyBwcm9wZXJ0eSBpbiBhbnkgZm9ybSwgaW5jbHVkZSBhIGZhbHNlIGZsYWcgc28gdGhhdCB0aGUgY2FsbGVyIGNhbiBkZWNpZGUgaG93IHRvIHByb2NlZWQuICovXHJcblx0XHRcdFx0XHRcdHJldHVybiBbcHJvcGVydHksIGZhbHNlXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IENTUyBQcm9wZXJ0eSBWYWx1ZXNcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFZhbHVlczoge1xyXG5cdFx0XHRcdC8qIEhleCB0byBSR0IgY29udmVyc2lvbi4gQ29weXJpZ2h0IFRpbSBEb3duOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU2MjM4MzgvcmdiLXRvLWhleC1hbmQtaGV4LXRvLXJnYiAqL1xyXG5cdFx0XHRcdGhleFRvUmdiOiBmdW5jdGlvbihoZXgpIHtcclxuXHRcdFx0XHRcdHZhciBzaG9ydGZvcm1SZWdleCA9IC9eIz8oW2EtZlxcZF0pKFthLWZcXGRdKShbYS1mXFxkXSkkL2ksXHJcblx0XHRcdFx0XHRcdFx0bG9uZ2Zvcm1SZWdleCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2ksXHJcblx0XHRcdFx0XHRcdFx0cmdiUGFydHM7XHJcblxyXG5cdFx0XHRcdFx0aGV4ID0gaGV4LnJlcGxhY2Uoc2hvcnRmb3JtUmVnZXgsIGZ1bmN0aW9uKG0sIHIsIGcsIGIpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYjtcclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdHJnYlBhcnRzID0gbG9uZ2Zvcm1SZWdleC5leGVjKGhleCk7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJnYlBhcnRzID8gW3BhcnNlSW50KHJnYlBhcnRzWzFdLCAxNiksIHBhcnNlSW50KHJnYlBhcnRzWzJdLCAxNiksIHBhcnNlSW50KHJnYlBhcnRzWzNdLCAxNildIDogWzAsIDAsIDBdO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0aXNDU1NOdWxsVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcblx0XHRcdFx0XHQvKiBUaGUgYnJvd3NlciBkZWZhdWx0cyBDU1MgdmFsdWVzIHRoYXQgaGF2ZSBub3QgYmVlbiBzZXQgdG8gZWl0aGVyIDAgb3Igb25lIG9mIHNldmVyYWwgcG9zc2libGUgbnVsbC12YWx1ZSBzdHJpbmdzLlxyXG5cdFx0XHRcdFx0IFRodXMsIHdlIGNoZWNrIGZvciBib3RoIGZhbHNpbmVzcyBhbmQgdGhlc2Ugc3BlY2lhbCBzdHJpbmdzLiAqL1xyXG5cdFx0XHRcdFx0LyogTnVsbC12YWx1ZSBjaGVja2luZyBpcyBwZXJmb3JtZWQgdG8gZGVmYXVsdCB0aGUgc3BlY2lhbCBzdHJpbmdzIHRvIDAgKGZvciB0aGUgc2FrZSBvZiB0d2VlbmluZykgb3IgdGhlaXIgaG9va1xyXG5cdFx0XHRcdFx0IHRlbXBsYXRlcyBhcyBkZWZpbmVkIGFzIENTUy5Ib29rcyAoZm9yIHRoZSBzYWtlIG9mIGhvb2sgaW5qZWN0aW9uL2V4dHJhY3Rpb24pLiAqL1xyXG5cdFx0XHRcdFx0LyogTm90ZTogQ2hyb21lIHJldHVybnMgXCJyZ2JhKDAsIDAsIDAsIDApXCIgZm9yIGFuIHVuZGVmaW5lZCBjb2xvciB3aGVyZWFzIElFIHJldHVybnMgXCJ0cmFuc3BhcmVudFwiLiAqL1xyXG5cdFx0XHRcdFx0cmV0dXJuICghdmFsdWUgfHwgL14obm9uZXxhdXRvfHRyYW5zcGFyZW50fChyZ2JhXFwoMCwgPzAsID8wLCA/MFxcKSkpJC9pLnRlc3QodmFsdWUpKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIFJldHJpZXZlIGEgcHJvcGVydHkncyBkZWZhdWx0IHVuaXQgdHlwZS4gVXNlZCBmb3IgYXNzaWduaW5nIGEgdW5pdCB0eXBlIHdoZW4gb25lIGlzIG5vdCBzdXBwbGllZCBieSB0aGUgdXNlci4gKi9cclxuXHRcdFx0XHRnZXRVbml0VHlwZTogZnVuY3Rpb24ocHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdGlmICgvXihyb3RhdGV8c2tldykvaS50ZXN0KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJkZWdcIjtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoLyheKHNjYWxlfHNjYWxlWHxzY2FsZVl8c2NhbGVafGFscGhhfGZsZXhHcm93fGZsZXhIZWlnaHR8ekluZGV4fGZvbnRXZWlnaHQpJCl8KChvcGFjaXR5fHJlZHxncmVlbnxibHVlfGFscGhhKSQpL2kudGVzdChwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0LyogVGhlIGFib3ZlIHByb3BlcnRpZXMgYXJlIHVuaXRsZXNzLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8qIERlZmF1bHQgdG8gcHggZm9yIGFsbCBvdGhlciBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJweFwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogSFRNTCBlbGVtZW50cyBkZWZhdWx0IHRvIGFuIGFzc29jaWF0ZWQgZGlzcGxheSB0eXBlIHdoZW4gdGhleSdyZSBub3Qgc2V0IHRvIGRpc3BsYXk6bm9uZS4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGNvcnJlY3RseSBzZXR0aW5nIHRoZSBub24tXCJub25lXCIgZGlzcGxheSB2YWx1ZSBpbiBjZXJ0YWluIFZlbG9jaXR5IHJlZGlyZWN0cywgc3VjaCBhcyBmYWRlSW4vT3V0LiAqL1xyXG5cdFx0XHRcdGdldERpc3BsYXlUeXBlOiBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRcdFx0XHR2YXIgdGFnTmFtZSA9IGVsZW1lbnQgJiYgZWxlbWVudC50YWdOYW1lLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoL14oYnxiaWd8aXxzbWFsbHx0dHxhYmJyfGFjcm9ueW18Y2l0ZXxjb2RlfGRmbnxlbXxrYmR8c3Ryb25nfHNhbXB8dmFyfGF8YmRvfGJyfGltZ3xtYXB8b2JqZWN0fHF8c2NyaXB0fHNwYW58c3VifHN1cHxidXR0b258aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhKSQvaS50ZXN0KHRhZ05hbWUpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBcImlubGluZVwiO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICgvXihsaSkkL2kudGVzdCh0YWdOYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJsaXN0LWl0ZW1cIjtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoL14odHIpJC9pLnRlc3QodGFnTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFwidGFibGUtcm93XCI7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKC9eKHRhYmxlKSQvaS50ZXN0KHRhZ05hbWUpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBcInRhYmxlXCI7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKC9eKHRib2R5KSQvaS50ZXN0KHRhZ05hbWUpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBcInRhYmxlLXJvdy1ncm91cFwiO1xyXG5cdFx0XHRcdFx0XHQvKiBEZWZhdWx0IHRvIFwiYmxvY2tcIiB3aGVuIG5vIG1hdGNoIGlzIGZvdW5kLiAqL1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiYmxvY2tcIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIFRoZSBjbGFzcyBhZGQvcmVtb3ZlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byB0ZW1wb3JhcmlseSBhcHBseSBhIFwidmVsb2NpdHktYW5pbWF0aW5nXCIgY2xhc3MgdG8gZWxlbWVudHMgd2hpbGUgdGhleSdyZSBhbmltYXRpbmcuICovXHJcblx0XHRcdFx0YWRkQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xyXG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc1N0cmluZyhlbGVtZW50LmNsYXNzTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBFbGVtZW50LmNsYXNzTmFtZSBpcyBhcm91bmQgMTUlIGZhc3RlciB0aGVuIHNldC9nZXRBdHRyaWJ1dGVcclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LmNsYXNzTmFtZSArPSAoZWxlbWVudC5jbGFzc05hbWUubGVuZ3RoID8gXCIgXCIgOiBcIlwiKSArIGNsYXNzTmFtZTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBXb3JrIGFyb3VuZCBmb3IgSUUgc3RyaWN0IG1vZGUgYW5pbWF0aW5nIFNWRyAtIGFuZCBhbnl0aGluZyBlbHNlIHRoYXQgZG9lc24ndCBiZWhhdmUgY29ycmVjdGx5IC0gdGhlIHNhbWUgd2F5IGpRdWVyeSBkb2VzIGl0XHJcblx0XHRcdFx0XHRcdFx0dmFyIGN1cnJlbnRDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKElFIDw9IDcgPyBcImNsYXNzTmFtZVwiIDogXCJjbGFzc1wiKSB8fCBcIlwiO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIGN1cnJlbnRDbGFzcyArIChjdXJyZW50Q2xhc3MgPyBcIiBcIiA6IFwiXCIpICsgY2xhc3NOYW1lKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xyXG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc1N0cmluZyhlbGVtZW50LmNsYXNzTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBFbGVtZW50LmNsYXNzTmFtZSBpcyBhcm91bmQgMTUlIGZhc3RlciB0aGVuIHNldC9nZXRBdHRyaWJ1dGVcclxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBOZWVkIHNvbWUganNwZXJmIHRlc3RzIG9uIHBlcmZvcm1hbmNlIC0gY2FuIHdlIGdldCByaWQgb2YgdGhlIHJlZ2V4IGFuZCBtYXliZSB1c2Ugc3BsaXQgLyBhcnJheSBtYW5pcHVsYXRpb24/XHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS50b1N0cmluZygpLnJlcGxhY2UobmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgY2xhc3NOYW1lLnNwbGl0KFwiIFwiKS5qb2luKFwifFwiKSArIFwiKFxcXFxzfCQpXCIsIFwiZ2lcIiksIFwiIFwiKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBXb3JrIGFyb3VuZCBmb3IgSUUgc3RyaWN0IG1vZGUgYW5pbWF0aW5nIFNWRyAtIGFuZCBhbnl0aGluZyBlbHNlIHRoYXQgZG9lc24ndCBiZWhhdmUgY29ycmVjdGx5IC0gdGhlIHNhbWUgd2F5IGpRdWVyeSBkb2VzIGl0XHJcblx0XHRcdFx0XHRcdFx0dmFyIGN1cnJlbnRDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKElFIDw9IDcgPyBcImNsYXNzTmFtZVwiIDogXCJjbGFzc1wiKSB8fCBcIlwiO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIGN1cnJlbnRDbGFzcy5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXnxcXHMpXCIgKyBjbGFzc05hbWUuc3BsaXQoXCIgXCIpLmpvaW4oXCJ8XCIpICsgXCIoXFxzfCQpXCIsIFwiZ2lcIiksIFwiIFwiKSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBTdHlsZSBHZXR0aW5nICYgU2V0dGluZ1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdC8qIFRoZSBzaW5ndWxhciBnZXRQcm9wZXJ0eVZhbHVlLCB3aGljaCByb3V0ZXMgdGhlIGxvZ2ljIGZvciBhbGwgbm9ybWFsaXphdGlvbnMsIGhvb2tzLCBhbmQgc3RhbmRhcmQgQ1NTIHByb3BlcnRpZXMuICovXHJcblx0XHRcdGdldFByb3BlcnR5VmFsdWU6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5LCByb290UHJvcGVydHlWYWx1ZSwgZm9yY2VTdHlsZUxvb2t1cCkge1xyXG5cdFx0XHRcdC8qIEdldCBhbiBlbGVtZW50J3MgY29tcHV0ZWQgcHJvcGVydHkgdmFsdWUuICovXHJcblx0XHRcdFx0LyogTm90ZTogUmV0cmlldmluZyB0aGUgdmFsdWUgb2YgYSBDU1MgcHJvcGVydHkgY2Fubm90IHNpbXBseSBiZSBwZXJmb3JtZWQgYnkgY2hlY2tpbmcgYW4gZWxlbWVudCdzXHJcblx0XHRcdFx0IHN0eWxlIGF0dHJpYnV0ZSAod2hpY2ggb25seSByZWZsZWN0cyB1c2VyLWRlZmluZWQgdmFsdWVzKS4gSW5zdGVhZCwgdGhlIGJyb3dzZXIgbXVzdCBiZSBxdWVyaWVkIGZvciBhIHByb3BlcnR5J3NcclxuXHRcdFx0XHQgKmNvbXB1dGVkKiB2YWx1ZS4gWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgZ2V0Q29tcHV0ZWRTdHlsZSBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9BUEkvd2luZG93LmdldENvbXB1dGVkU3R5bGUgKi9cclxuXHRcdFx0XHRmdW5jdGlvbiBjb21wdXRlUHJvcGVydHlWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0LyogV2hlbiBib3gtc2l6aW5nIGlzbid0IHNldCB0byBib3JkZXItYm94LCBoZWlnaHQgYW5kIHdpZHRoIHN0eWxlIHZhbHVlcyBhcmUgaW5jb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiBhblxyXG5cdFx0XHRcdFx0IGVsZW1lbnQncyBzY3JvbGxiYXJzIGFyZSB2aXNpYmxlICh3aGljaCBleHBhbmRzIHRoZSBlbGVtZW50J3MgZGltZW5zaW9ucykuIFRodXMsIHdlIGRlZmVyIHRvIHRoZSBtb3JlIGFjY3VyYXRlXHJcblx0XHRcdFx0XHQgb2Zmc2V0SGVpZ2h0L1dpZHRoIHByb3BlcnR5LCB3aGljaCBpbmNsdWRlcyB0aGUgdG90YWwgZGltZW5zaW9ucyBmb3IgaW50ZXJpb3IsIGJvcmRlciwgcGFkZGluZywgYW5kIHNjcm9sbGJhci5cclxuXHRcdFx0XHRcdCBXZSBzdWJ0cmFjdCBib3JkZXIgYW5kIHBhZGRpbmcgdG8gZ2V0IHRoZSBzdW0gb2YgaW50ZXJpb3IgKyBzY3JvbGxiYXIuICovXHJcblx0XHRcdFx0XHR2YXIgY29tcHV0ZWRWYWx1ZSA9IDA7XHJcblxyXG5cdFx0XHRcdFx0LyogSUU8PTggZG9lc24ndCBzdXBwb3J0IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLCB0aHVzIHdlIGRlZmVyIHRvIGpRdWVyeSwgd2hpY2ggaGFzIGFuIGV4dGVuc2l2ZSBhcnJheVxyXG5cdFx0XHRcdFx0IG9mIGhhY2tzIHRvIGFjY3VyYXRlbHkgcmV0cmlldmUgSUU4IHByb3BlcnR5IHZhbHVlcy4gUmUtaW1wbGVtZW50aW5nIHRoYXQgbG9naWMgaGVyZSBpcyBub3Qgd29ydGggYmxvYXRpbmcgdGhlXHJcblx0XHRcdFx0XHQgY29kZWJhc2UgZm9yIGEgZHlpbmcgYnJvd3Nlci4gVGhlIHBlcmZvcm1hbmNlIHJlcGVyY3Vzc2lvbnMgb2YgdXNpbmcgalF1ZXJ5IGhlcmUgYXJlIG1pbmltYWwgc2luY2VcclxuXHRcdFx0XHRcdCBWZWxvY2l0eSBpcyBvcHRpbWl6ZWQgdG8gcmFyZWx5IChhbmQgc29tZXRpbWVzIG5ldmVyKSBxdWVyeSB0aGUgRE9NLiBGdXJ0aGVyLCB0aGUgJC5jc3MoKSBjb2RlcGF0aCBpc24ndCB0aGF0IHNsb3cuICovXHJcblx0XHRcdFx0XHRpZiAoSUUgPD0gOCkge1xyXG5cdFx0XHRcdFx0XHRjb21wdXRlZFZhbHVlID0gJC5jc3MoZWxlbWVudCwgcHJvcGVydHkpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0LyogQWxsIG90aGVyIGJyb3dzZXJzIHN1cHBvcnQgZ2V0Q29tcHV0ZWRTdHlsZS4gVGhlIHJldHVybmVkIGxpdmUgb2JqZWN0IHJlZmVyZW5jZSBpcyBjYWNoZWQgb250byBpdHNcclxuXHRcdFx0XHRcdFx0IGFzc29jaWF0ZWQgZWxlbWVudCBzbyB0aGF0IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgcmVmZXRjaGVkIHVwb24gZXZlcnkgR0VULiAqL1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogQnJvd3NlcnMgZG8gbm90IHJldHVybiBoZWlnaHQgYW5kIHdpZHRoIHZhbHVlcyBmb3IgZWxlbWVudHMgdGhhdCBhcmUgc2V0IHRvIGRpc3BsYXk6XCJub25lXCIuIFRodXMsIHdlIHRlbXBvcmFyaWx5XHJcblx0XHRcdFx0XHRcdCB0b2dnbGUgZGlzcGxheSB0byB0aGUgZWxlbWVudCB0eXBlJ3MgZGVmYXVsdCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0dmFyIHRvZ2dsZURpc3BsYXkgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICgvXih3aWR0aHxoZWlnaHQpJC8udGVzdChwcm9wZXJ0eSkgJiYgQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJkaXNwbGF5XCIpID09PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0dG9nZ2xlRGlzcGxheSA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJkaXNwbGF5XCIsIENTUy5WYWx1ZXMuZ2V0RGlzcGxheVR5cGUoZWxlbWVudCkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgcmV2ZXJ0RGlzcGxheSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh0b2dnbGVEaXNwbGF5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRDU1Muc2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICghZm9yY2VTdHlsZUxvb2t1cCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gXCJoZWlnaHRcIiAmJiBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImJveFNpemluZ1wiKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgIT09IFwiYm9yZGVyLWJveFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgY29udGVudEJveEhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gKHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJib3JkZXJUb3BXaWR0aFwiKSkgfHwgMCkgLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImJvcmRlckJvdHRvbVdpZHRoXCIpKSB8fCAwKSAtIChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwicGFkZGluZ1RvcFwiKSkgfHwgMCkgLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInBhZGRpbmdCb3R0b21cIikpIHx8IDApO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV2ZXJ0RGlzcGxheSgpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBjb250ZW50Qm94SGVpZ2h0O1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkgPT09IFwid2lkdGhcIiAmJiBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImJveFNpemluZ1wiKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgIT09IFwiYm9yZGVyLWJveFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgY29udGVudEJveFdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aCAtIChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiYm9yZGVyTGVmdFdpZHRoXCIpKSB8fCAwKSAtIChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiYm9yZGVyUmlnaHRXaWR0aFwiKSkgfHwgMCkgLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInBhZGRpbmdMZWZ0XCIpKSB8fCAwKSAtIChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwicGFkZGluZ1JpZ2h0XCIpKSB8fCAwKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldmVydERpc3BsYXkoKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gY29udGVudEJveFdpZHRoO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGNvbXB1dGVkU3R5bGU7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBGb3IgZWxlbWVudHMgdGhhdCBWZWxvY2l0eSBoYXNuJ3QgYmVlbiBjYWxsZWQgb24gZGlyZWN0bHkgKGUuZy4gd2hlbiBWZWxvY2l0eSBxdWVyaWVzIHRoZSBET00gb24gYmVoYWxmXHJcblx0XHRcdFx0XHRcdCBvZiBhIHBhcmVudCBvZiBhbiBlbGVtZW50IGl0cyBhbmltYXRpbmcpLCBwZXJmb3JtIGEgZGlyZWN0IGdldENvbXB1dGVkU3R5bGUgbG9va3VwIHNpbmNlIHRoZSBvYmplY3QgaXNuJ3QgY2FjaGVkLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBJZiB0aGUgY29tcHV0ZWRTdHlsZSBvYmplY3QgaGFzIHlldCB0byBiZSBjYWNoZWQsIGRvIHNvIG5vdy4gKi9cclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICghRGF0YShlbGVtZW50KS5jb21wdXRlZFN0eWxlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZWRTdHlsZSA9IERhdGEoZWxlbWVudCkuY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBJZiBjb21wdXRlZFN0eWxlIGlzIGNhY2hlZCwgdXNlIGl0LiAqL1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXB1dGVkU3R5bGUgPSBEYXRhKGVsZW1lbnQpLmNvbXB1dGVkU3R5bGU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIElFIGFuZCBGaXJlZm94IGRvIG5vdCByZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGdlbmVyaWMgYm9yZGVyQ29sb3IgLS0gdGhleSBvbmx5IHJldHVybiBpbmRpdmlkdWFsIHZhbHVlcyBmb3IgZWFjaCBib3JkZXIgc2lkZSdzIGNvbG9yLlxyXG5cdFx0XHRcdFx0XHQgQWxzbywgaW4gYWxsIGJyb3dzZXJzLCB3aGVuIGJvcmRlciBjb2xvcnMgYXJlbid0IGFsbCB0aGUgc2FtZSwgYSBjb21wb3VuZCB2YWx1ZSBpcyByZXR1cm5lZCB0aGF0IFZlbG9jaXR5IGlzbid0IHNldHVwIHRvIHBhcnNlLlxyXG5cdFx0XHRcdFx0XHQgU28sIGFzIGEgcG9seWZpbGwgZm9yIHF1ZXJ5aW5nIGluZGl2aWR1YWwgYm9yZGVyIHNpZGUgY29sb3JzLCB3ZSBqdXN0IHJldHVybiB0aGUgdG9wIGJvcmRlcidzIGNvbG9yIGFuZCBhbmltYXRlIGFsbCBib3JkZXJzIGZyb20gdGhhdCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5ID09PSBcImJvcmRlckNvbG9yXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eSA9IFwiYm9yZGVyVG9wQ29sb3JcIjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogSUU5IGhhcyBhIGJ1ZyBpbiB3aGljaCB0aGUgXCJmaWx0ZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIGFjY2Vzc2VkIGZyb20gY29tcHV0ZWRTdHlsZSB1c2luZyB0aGUgZ2V0UHJvcGVydHlWYWx1ZSBtZXRob2RcclxuXHRcdFx0XHRcdFx0IGluc3RlYWQgb2YgYSBkaXJlY3QgcHJvcGVydHkgbG9va3VwLiBUaGUgZ2V0UHJvcGVydHlWYWx1ZSBtZXRob2QgaXMgc2xvd2VyIHRoYW4gYSBkaXJlY3QgbG9va3VwLCB3aGljaCBpcyB3aHkgd2UgYXZvaWQgaXQgYnkgZGVmYXVsdC4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKElFID09PSA5ICYmIHByb3BlcnR5ID09PSBcImZpbHRlclwiKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZWRWYWx1ZSA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSk7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXB1dGVkVmFsdWUgPSBjb21wdXRlZFN0eWxlW3Byb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogRmFsbCBiYWNrIHRvIHRoZSBwcm9wZXJ0eSdzIHN0eWxlIHZhbHVlIChpZiBkZWZpbmVkKSB3aGVuIGNvbXB1dGVkVmFsdWUgcmV0dXJucyBub3RoaW5nLFxyXG5cdFx0XHRcdFx0XHQgd2hpY2ggY2FuIGhhcHBlbiB3aGVuIHRoZSBlbGVtZW50IGhhc24ndCBiZWVuIHBhaW50ZWQuICovXHJcblx0XHRcdFx0XHRcdGlmIChjb21wdXRlZFZhbHVlID09PSBcIlwiIHx8IGNvbXB1dGVkVmFsdWUgPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHRjb21wdXRlZFZhbHVlID0gZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHJldmVydERpc3BsYXkoKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBGb3IgdG9wLCByaWdodCwgYm90dG9tLCBhbmQgbGVmdCAoVFJCTCkgdmFsdWVzIHRoYXQgYXJlIHNldCB0byBcImF1dG9cIiBvbiBlbGVtZW50cyBvZiBcImZpeGVkXCIgb3IgXCJhYnNvbHV0ZVwiIHBvc2l0aW9uLFxyXG5cdFx0XHRcdFx0IGRlZmVyIHRvIGpRdWVyeSBmb3IgY29udmVydGluZyBcImF1dG9cIiB0byBhIG51bWVyaWMgdmFsdWUuIChGb3IgZWxlbWVudHMgd2l0aCBhIFwic3RhdGljXCIgb3IgXCJyZWxhdGl2ZVwiIHBvc2l0aW9uLCBcImF1dG9cIiBoYXMgdGhlIHNhbWVcclxuXHRcdFx0XHRcdCBlZmZlY3QgYXMgYmVpbmcgc2V0IHRvIDAsIHNvIG5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5LikgKi9cclxuXHRcdFx0XHRcdC8qIEFuIGV4YW1wbGUgb2Ygd2h5IG51bWVyaWMgY29udmVyc2lvbiBpcyBuZWNlc3Nhcnk6IFdoZW4gYW4gZWxlbWVudCB3aXRoIFwicG9zaXRpb246YWJzb2x1dGVcIiBoYXMgYW4gdW50b3VjaGVkIFwibGVmdFwiXHJcblx0XHRcdFx0XHQgcHJvcGVydHksIHdoaWNoIHJldmVydHMgdG8gXCJhdXRvXCIsIGxlZnQncyB2YWx1ZSBpcyAwIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgZWxlbWVudCwgYnV0IGlzIG9mdGVuIG5vbi16ZXJvIHJlbGF0aXZlXHJcblx0XHRcdFx0XHQgdG8gaXRzICpjb250YWluaW5nKiAobm90IHBhcmVudCkgZWxlbWVudCwgd2hpY2ggaXMgdGhlIG5lYXJlc3QgXCJwb3NpdGlvbjpyZWxhdGl2ZVwiIGFuY2VzdG9yIG9yIHRoZSB2aWV3cG9ydCAoYW5kIGFsd2F5cyB0aGUgdmlld3BvcnQgaW4gdGhlIGNhc2Ugb2YgXCJwb3NpdGlvbjpmaXhlZFwiKS4gKi9cclxuXHRcdFx0XHRcdGlmIChjb21wdXRlZFZhbHVlID09PSBcImF1dG9cIiAmJiAvXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC9pLnRlc3QocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdHZhciBwb3NpdGlvbiA9IGNvbXB1dGVQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwicG9zaXRpb25cIik7IC8qIEdFVCAqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogRm9yIGFic29sdXRlIHBvc2l0aW9uaW5nLCBqUXVlcnkncyAkLnBvc2l0aW9uKCkgb25seSByZXR1cm5zIHZhbHVlcyBmb3IgdG9wIGFuZCBsZWZ0O1xyXG5cdFx0XHRcdFx0XHQgcmlnaHQgYW5kIGJvdHRvbSB3aWxsIGhhdmUgdGhlaXIgXCJhdXRvXCIgdmFsdWUgcmV2ZXJ0ZWQgdG8gMC4gKi9cclxuXHRcdFx0XHRcdFx0LyogTm90ZTogQSBqUXVlcnkgb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBoZXJlIHNpbmNlIGpRdWVyeSBkb2Vzbid0IGhhdmUgYSBsb3ctbGV2ZWwgYWxpYXMgZm9yICQucG9zaXRpb24oKS5cclxuXHRcdFx0XHRcdFx0IE5vdCBhIGJpZyBkZWFsIHNpbmNlIHdlJ3JlIGN1cnJlbnRseSBpbiBhIEdFVCBiYXRjaCBhbnl3YXkuICovXHJcblx0XHRcdFx0XHRcdGlmIChwb3NpdGlvbiA9PT0gXCJmaXhlZFwiIHx8IChwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiICYmIC90b3B8bGVmdC9pLnRlc3QocHJvcGVydHkpKSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIE5vdGU6IGpRdWVyeSBzdHJpcHMgdGhlIHBpeGVsIHVuaXQgZnJvbSBpdHMgcmV0dXJuZWQgdmFsdWVzOyB3ZSByZS1hZGQgaXQgaGVyZSB0byBjb25mb3JtIHdpdGggY29tcHV0ZVByb3BlcnR5VmFsdWUncyBiZWhhdmlvci4gKi9cclxuXHRcdFx0XHRcdFx0XHRjb21wdXRlZFZhbHVlID0gJChlbGVtZW50KS5wb3NpdGlvbigpW3Byb3BlcnR5XSArIFwicHhcIjsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gY29tcHV0ZWRWYWx1ZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHZhciBwcm9wZXJ0eVZhbHVlO1xyXG5cclxuXHRcdFx0XHQvKiBJZiB0aGlzIGlzIGEgaG9va2VkIHByb3BlcnR5IChlLmcuIFwiY2xpcExlZnRcIiBpbnN0ZWFkIG9mIHRoZSByb290IHByb3BlcnR5IG9mIFwiY2xpcFwiKSxcclxuXHRcdFx0XHQgZXh0cmFjdCB0aGUgaG9vaydzIHZhbHVlIGZyb20gYSBub3JtYWxpemVkIHJvb3RQcm9wZXJ0eVZhbHVlIHVzaW5nIENTUy5Ib29rcy5leHRyYWN0VmFsdWUoKS4gKi9cclxuXHRcdFx0XHRpZiAoQ1NTLkhvb2tzLnJlZ2lzdGVyZWRbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHR2YXIgaG9vayA9IHByb3BlcnR5LFxyXG5cdFx0XHRcdFx0XHRcdGhvb2tSb290ID0gQ1NTLkhvb2tzLmdldFJvb3QoaG9vayk7XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgYSBjYWNoZWQgcm9vdFByb3BlcnR5VmFsdWUgd2Fzbid0IHBhc3NlZCBpbiAod2hpY2ggVmVsb2NpdHkgYWx3YXlzIGF0dGVtcHRzIHRvIGRvIGluIG9yZGVyIHRvIGF2b2lkIHJlcXVlcnlpbmcgdGhlIERPTSksXHJcblx0XHRcdFx0XHQgcXVlcnkgdGhlIERPTSBmb3IgdGhlIHJvb3QgcHJvcGVydHkncyB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdGlmIChyb290UHJvcGVydHlWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdC8qIFNpbmNlIHRoZSBicm93c2VyIGlzIG5vdyBiZWluZyBkaXJlY3RseSBxdWVyaWVkLCB1c2UgdGhlIG9mZmljaWFsIHBvc3QtcHJlZml4aW5nIHByb3BlcnR5IG5hbWUgZm9yIHRoaXMgbG9va3VwLiAqL1xyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIENTUy5OYW1lcy5wcmVmaXhDaGVjayhob29rUm9vdClbMF0pOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBJZiB0aGlzIHJvb3QgaGFzIGEgbm9ybWFsaXphdGlvbiByZWdpc3RlcmVkLCBwZWZvcm0gdGhlIGFzc29jaWF0ZWQgbm9ybWFsaXphdGlvbiBleHRyYWN0aW9uLiAqL1xyXG5cdFx0XHRcdFx0aWYgKENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW2hvb2tSb290XSkge1xyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW2hvb2tSb290XShcImV4dHJhY3RcIiwgZWxlbWVudCwgcm9vdFByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIEV4dHJhY3QgdGhlIGhvb2sncyB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSBDU1MuSG9va3MuZXh0cmFjdFZhbHVlKGhvb2ssIHJvb3RQcm9wZXJ0eVZhbHVlKTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiB0aGlzIGlzIGEgbm9ybWFsaXplZCBwcm9wZXJ0eSAoZS5nLiBcIm9wYWNpdHlcIiBiZWNvbWVzIFwiZmlsdGVyXCIgaW4gPD1JRTgpIG9yIFwidHJhbnNsYXRlWFwiIGJlY29tZXMgXCJ0cmFuc2Zvcm1cIiksXHJcblx0XHRcdFx0XHQgbm9ybWFsaXplIHRoZSBwcm9wZXJ0eSdzIG5hbWUgYW5kIHZhbHVlLCBhbmQgaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgdHJhbnNmb3Jtcy4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IE5vcm1hbGl6aW5nIGEgcHJvcGVydHkgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIGZyb20gaG9va2luZyBhIHByb3BlcnR5IHNpbmNlIGhvb2stZXh0cmFjdGVkIHZhbHVlcyBhcmUgc3RyaWN0bHlcclxuXHRcdFx0XHRcdCBudW1lcmljYWwgYW5kIHRoZXJlZm9yZSBkbyBub3QgcmVxdWlyZSBub3JtYWxpemF0aW9uIGV4dHJhY3Rpb24uICovXHJcblx0XHRcdFx0fSBlbHNlIGlmIChDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdHZhciBub3JtYWxpemVkUHJvcGVydHlOYW1lLFxyXG5cdFx0XHRcdFx0XHRcdG5vcm1hbGl6ZWRQcm9wZXJ0eVZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbGl6ZWRQcm9wZXJ0eU5hbWUgPSBDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0oXCJuYW1lXCIsIGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdC8qIFRyYW5zZm9ybSB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgdmlhIG5vcm1hbGl6YXRpb24gZXh0cmFjdGlvbiAoc2VlIGJlbG93KSwgd2hpY2ggY2hlY2tzIGFnYWluc3QgdGhlIGVsZW1lbnQncyB0cmFuc2Zvcm1DYWNoZS5cclxuXHRcdFx0XHRcdCBBdCBubyBwb2ludCBkbyB0cmFuc2Zvcm0gR0VUcyBldmVyIGFjdHVhbGx5IHF1ZXJ5IHRoZSBET007IGluaXRpYWwgc3R5bGVzaGVldCB2YWx1ZXMgYXJlIG5ldmVyIHByb2Nlc3NlZC5cclxuXHRcdFx0XHRcdCBUaGlzIGlzIGJlY2F1c2UgcGFyc2luZyAzRCB0cmFuc2Zvcm0gbWF0cmljZXMgaXMgbm90IGFsd2F5cyBhY2N1cmF0ZSBhbmQgd291bGQgYmxvYXQgb3VyIGNvZGViYXNlO1xyXG5cdFx0XHRcdFx0IHRodXMsIG5vcm1hbGl6YXRpb24gZXh0cmFjdGlvbiBkZWZhdWx0cyBpbml0aWFsIHRyYW5zZm9ybSB2YWx1ZXMgdG8gdGhlaXIgemVyby12YWx1ZXMgKGUuZy4gMSBmb3Igc2NhbGVYIGFuZCAwIGZvciB0cmFuc2xhdGVYKS4gKi9cclxuXHRcdFx0XHRcdGlmIChub3JtYWxpemVkUHJvcGVydHlOYW1lICE9PSBcInRyYW5zZm9ybVwiKSB7XHJcblx0XHRcdFx0XHRcdG5vcm1hbGl6ZWRQcm9wZXJ0eVZhbHVlID0gY29tcHV0ZVByb3BlcnR5VmFsdWUoZWxlbWVudCwgQ1NTLk5hbWVzLnByZWZpeENoZWNrKG5vcm1hbGl6ZWRQcm9wZXJ0eU5hbWUpWzBdKTsgLyogR0VUICovXHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgdmFsdWUgaXMgYSBDU1MgbnVsbC12YWx1ZSBhbmQgdGhpcyBwcm9wZXJ0eSBoYXMgYSBob29rIHRlbXBsYXRlLCB1c2UgdGhhdCB6ZXJvLXZhbHVlIHRlbXBsYXRlIHNvIHRoYXQgaG9va3MgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0LiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoQ1NTLlZhbHVlcy5pc0NTU051bGxWYWx1ZShub3JtYWxpemVkUHJvcGVydHlWYWx1ZSkgJiYgQ1NTLkhvb2tzLnRlbXBsYXRlc1twcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHRub3JtYWxpemVkUHJvcGVydHlWYWx1ZSA9IENTUy5Ib29rcy50ZW1wbGF0ZXNbcHJvcGVydHldWzFdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW3Byb3BlcnR5XShcImV4dHJhY3RcIiwgZWxlbWVudCwgbm9ybWFsaXplZFByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogSWYgYSAobnVtZXJpYykgdmFsdWUgd2Fzbid0IHByb2R1Y2VkIHZpYSBob29rIGV4dHJhY3Rpb24gb3Igbm9ybWFsaXphdGlvbiwgcXVlcnkgdGhlIERPTS4gKi9cclxuXHRcdFx0XHRpZiAoIS9eW1xcZC1dLy50ZXN0KHByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHQvKiBGb3IgU1ZHIGVsZW1lbnRzLCBkaW1lbnNpb25hbCBwcm9wZXJ0aWVzICh3aGljaCBTVkdBdHRyaWJ1dGUoKSBkZXRlY3RzKSBhcmUgdHdlZW5lZCB2aWFcclxuXHRcdFx0XHRcdCB0aGVpciBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXMgaW5zdGVhZCBvZiB0aGVpciBDU1Mgc3R5bGUgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0dmFyIGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdGlmIChkYXRhICYmIGRhdGEuaXNTVkcgJiYgQ1NTLk5hbWVzLlNWR0F0dHJpYnV0ZShwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0LyogU2luY2UgdGhlIGhlaWdodC93aWR0aCBhdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgc2V0IG1hbnVhbGx5LCB0aGV5IGRvbid0IHJlZmxlY3QgY29tcHV0ZWQgdmFsdWVzLlxyXG5cdFx0XHRcdFx0XHQgVGh1cywgd2UgdXNlIHVzZSBnZXRCQm94KCkgdG8gZW5zdXJlIHdlIGFsd2F5cyBnZXQgdmFsdWVzIGZvciBlbGVtZW50cyB3aXRoIHVuZGVmaW5lZCBoZWlnaHQvd2lkdGggYXR0cmlidXRlcy4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKC9eKGhlaWdodHx3aWR0aCkkL2kudGVzdChwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBGaXJlZm94IHRocm93cyBhbiBlcnJvciBpZiAuZ2V0QkJveCgpIGlzIGNhbGxlZCBvbiBhbiBTVkcgdGhhdCBpc24ndCBhdHRhY2hlZCB0byB0aGUgRE9NLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gZWxlbWVudC5nZXRCQm94KClbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gMDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0LyogT3RoZXJ3aXNlLCBhY2Nlc3MgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBkaXJlY3RseS4gKi9cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUocHJvcGVydHkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gY29tcHV0ZVByb3BlcnR5VmFsdWUoZWxlbWVudCwgQ1NTLk5hbWVzLnByZWZpeENoZWNrKHByb3BlcnR5KVswXSk7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogU2luY2UgcHJvcGVydHkgbG9va3VwcyBhcmUgZm9yIGFuaW1hdGlvbiBwdXJwb3NlcyAod2hpY2ggZW50YWlscyBjb21wdXRpbmcgdGhlIG51bWVyaWMgZGVsdGEgYmV0d2VlbiBzdGFydCBhbmQgZW5kIHZhbHVlcyksXHJcblx0XHRcdFx0IGNvbnZlcnQgQ1NTIG51bGwtdmFsdWVzIHRvIGFuIGludGVnZXIgb2YgdmFsdWUgMC4gKi9cclxuXHRcdFx0XHRpZiAoQ1NTLlZhbHVlcy5pc0NTU051bGxWYWx1ZShwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IDA7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoVmVsb2NpdHkuZGVidWcgPj0gMikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coXCJHZXQgXCIgKyBwcm9wZXJ0eSArIFwiOiBcIiArIHByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIFRoZSBzaW5ndWxhciBzZXRQcm9wZXJ0eVZhbHVlLCB3aGljaCByb3V0ZXMgdGhlIGxvZ2ljIGZvciBhbGwgbm9ybWFsaXphdGlvbnMsIGhvb2tzLCBhbmQgc3RhbmRhcmQgQ1NTIHByb3BlcnRpZXMuICovXHJcblx0XHRcdHNldFByb3BlcnR5VmFsdWU6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5LCBwcm9wZXJ0eVZhbHVlLCByb290UHJvcGVydHlWYWx1ZSwgc2Nyb2xsRGF0YSkge1xyXG5cdFx0XHRcdHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eTtcclxuXHJcblx0XHRcdFx0LyogSW4gb3JkZXIgdG8gYmUgc3ViamVjdGVkIHRvIGNhbGwgb3B0aW9ucyBhbmQgZWxlbWVudCBxdWV1ZWluZywgc2Nyb2xsIGFuaW1hdGlvbiBpcyByb3V0ZWQgdGhyb3VnaCBWZWxvY2l0eSBhcyBpZiBpdCB3ZXJlIGEgc3RhbmRhcmQgQ1NTIHByb3BlcnR5LiAqL1xyXG5cdFx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gXCJzY3JvbGxcIikge1xyXG5cdFx0XHRcdFx0LyogSWYgYSBjb250YWluZXIgb3B0aW9uIGlzIHByZXNlbnQsIHNjcm9sbCB0aGUgY29udGFpbmVyIGluc3RlYWQgb2YgdGhlIGJyb3dzZXIgd2luZG93LiAqL1xyXG5cdFx0XHRcdFx0aWYgKHNjcm9sbERhdGEuY29udGFpbmVyKSB7XHJcblx0XHRcdFx0XHRcdHNjcm9sbERhdGEuY29udGFpbmVyW1wic2Nyb2xsXCIgKyBzY3JvbGxEYXRhLmRpcmVjdGlvbl0gPSBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHQvKiBPdGhlcndpc2UsIFZlbG9jaXR5IGRlZmF1bHRzIHRvIHNjcm9sbGluZyB0aGUgYnJvd3NlciB3aW5kb3cuICovXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRpZiAoc2Nyb2xsRGF0YS5kaXJlY3Rpb24gPT09IFwiTGVmdFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0d2luZG93LnNjcm9sbFRvKHByb3BlcnR5VmFsdWUsIHNjcm9sbERhdGEuYWx0ZXJuYXRlVmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zY3JvbGxUbyhzY3JvbGxEYXRhLmFsdGVybmF0ZVZhbHVlLCBwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvKiBUcmFuc2Zvcm1zICh0cmFuc2xhdGVYLCByb3RhdGVaLCBldGMuKSBhcmUgYXBwbGllZCB0byBhIHBlci1lbGVtZW50IHRyYW5zZm9ybUNhY2hlIG9iamVjdCwgd2hpY2ggaXMgbWFudWFsbHkgZmx1c2hlZCB2aWEgZmx1c2hUcmFuc2Zvcm1DYWNoZSgpLlxyXG5cdFx0XHRcdFx0IFRodXMsIGZvciBub3csIHdlIG1lcmVseSBjYWNoZSB0cmFuc2Zvcm1zIGJlaW5nIFNFVC4gKi9cclxuXHRcdFx0XHRcdGlmIChDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0gJiYgQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKFwibmFtZVwiLCBlbGVtZW50KSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xyXG5cdFx0XHRcdFx0XHQvKiBQZXJmb3JtIGEgbm9ybWFsaXphdGlvbiBpbmplY3Rpb24uICovXHJcblx0XHRcdFx0XHRcdC8qIE5vdGU6IFRoZSBub3JtYWxpemF0aW9uIGxvZ2ljIGhhbmRsZXMgdGhlIHRyYW5zZm9ybUNhY2hlIHVwZGF0aW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0oXCJpbmplY3RcIiwgZWxlbWVudCwgcHJvcGVydHlWYWx1ZSk7XHJcblxyXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eU5hbWUgPSBcInRyYW5zZm9ybVwiO1xyXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvKiBJbmplY3QgaG9va3MuICovXHJcblx0XHRcdFx0XHRcdGlmIChDU1MuSG9va3MucmVnaXN0ZXJlZFtwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgaG9va05hbWUgPSBwcm9wZXJ0eSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0aG9va1Jvb3QgPSBDU1MuSG9va3MuZ2V0Um9vdChwcm9wZXJ0eSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIGEgY2FjaGVkIHJvb3RQcm9wZXJ0eVZhbHVlIHdhcyBub3QgcHJvdmlkZWQsIHF1ZXJ5IHRoZSBET00gZm9yIHRoZSBob29rUm9vdCdzIGN1cnJlbnQgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSByb290UHJvcGVydHlWYWx1ZSB8fCBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBob29rUm9vdCk7IC8qIEdFVCAqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gQ1NTLkhvb2tzLmluamVjdFZhbHVlKGhvb2tOYW1lLCBwcm9wZXJ0eVZhbHVlLCByb290UHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHkgPSBob29rUm9vdDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogTm9ybWFsaXplIG5hbWVzIGFuZCB2YWx1ZXMuICovXHJcblx0XHRcdFx0XHRcdGlmIChDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKFwiaW5qZWN0XCIsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5ID0gQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKFwibmFtZVwiLCBlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogQXNzaWduIHRoZSBhcHByb3ByaWF0ZSB2ZW5kb3IgcHJlZml4IGJlZm9yZSBwZXJmb3JtaW5nIGFuIG9mZmljaWFsIHN0eWxlIHVwZGF0ZS4gKi9cclxuXHRcdFx0XHRcdFx0cHJvcGVydHlOYW1lID0gQ1NTLk5hbWVzLnByZWZpeENoZWNrKHByb3BlcnR5KVswXTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIEEgdHJ5L2NhdGNoIGlzIHVzZWQgZm9yIElFPD04LCB3aGljaCB0aHJvd3MgYW4gZXJyb3Igd2hlbiBcImludmFsaWRcIiBDU1MgdmFsdWVzIGFyZSBzZXQsIGUuZy4gYSBuZWdhdGl2ZSB3aWR0aC5cclxuXHRcdFx0XHRcdFx0IFRyeS9jYXRjaCBpcyBhdm9pZGVkIGZvciBvdGhlciBicm93c2VycyBzaW5jZSBpdCBpbmN1cnMgYSBwZXJmb3JtYW5jZSBvdmVyaGVhZC4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKElFIDw9IDgpIHtcclxuXHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZVtwcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFtcIiArIHByb3BlcnR5VmFsdWUgKyBcIl0gZm9yIFtcIiArIHByb3BlcnR5TmFtZSArIFwiXVwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0LyogU1ZHIGVsZW1lbnRzIGhhdmUgdGhlaXIgZGltZW5zaW9uYWwgcHJvcGVydGllcyAod2lkdGgsIGhlaWdodCwgeCwgeSwgY3gsIGV0Yy4pIGFwcGxpZWQgZGlyZWN0bHkgYXMgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGFzIHN0eWxlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBJRTggZG9lcyBub3Qgc3VwcG9ydCBTVkcgZWxlbWVudHMsIHNvIGl0J3Mgb2theSB0aGF0IHdlIHNraXAgaXQgZm9yIFNWRyBhbmltYXRpb24uICovXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YSAmJiBkYXRhLmlzU1ZHICYmIENTUy5OYW1lcy5TVkdBdHRyaWJ1dGUocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBGb3IgU1ZHIGF0dHJpYnV0ZXMsIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBuYW1lcyBhcmUgbmV2ZXIgdXNlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdC8qIE5vdGU6IE5vdCBhbGwgQ1NTIHByb3BlcnRpZXMgY2FuIGJlIGFuaW1hdGVkIHZpYSBhdHRyaWJ1dGVzLCBidXQgdGhlIGJyb3dzZXIgd29uJ3QgdGhyb3cgYW4gZXJyb3IgZm9yIHVuc3VwcG9ydGVkIHByb3BlcnRpZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShwcm9wZXJ0eSwgcHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGVbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoVmVsb2NpdHkuZGVidWcgPj0gMikge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiU2V0IFwiICsgcHJvcGVydHkgKyBcIiAoXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIik6IFwiICsgcHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIFJldHVybiB0aGUgbm9ybWFsaXplZCBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZSBpbiBjYXNlIHRoZSBjYWxsZXIgd2FudHMgdG8ga25vdyBob3cgdGhlc2UgdmFsdWVzIHdlcmUgbW9kaWZpZWQgYmVmb3JlIGJlaW5nIGFwcGxpZWQgdG8gdGhlIERPTS4gKi9cclxuXHRcdFx0XHRyZXR1cm4gW3Byb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZV07XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIFRvIGluY3JlYXNlIHBlcmZvcm1hbmNlIGJ5IGJhdGNoaW5nIHRyYW5zZm9ybSB1cGRhdGVzIGludG8gYSBzaW5nbGUgU0VULCB0cmFuc2Zvcm1zIGFyZSBub3QgZGlyZWN0bHkgYXBwbGllZCB0byBhbiBlbGVtZW50IHVudGlsIGZsdXNoVHJhbnNmb3JtQ2FjaGUoKSBpcyBjYWxsZWQuICovXHJcblx0XHRcdC8qIE5vdGU6IFZlbG9jaXR5IGFwcGxpZXMgdHJhbnNmb3JtIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IGFyZSBjaHJvbm9naWNhbGx5IGludHJvZHVjZWQgdG8gdGhlIGVsZW1lbnQncyBDU1Mgc3R5bGVzLiAqL1xyXG5cdFx0XHRmbHVzaFRyYW5zZm9ybUNhY2hlOiBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRcdFx0dmFyIHRyYW5zZm9ybVN0cmluZyA9IFwiXCIsXHJcblx0XHRcdFx0XHRcdGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHQvKiBDZXJ0YWluIGJyb3dzZXJzIHJlcXVpcmUgdGhhdCBTVkcgdHJhbnNmb3JtcyBiZSBhcHBsaWVkIGFzIGFuIGF0dHJpYnV0ZS4gSG93ZXZlciwgdGhlIFNWRyB0cmFuc2Zvcm0gYXR0cmlidXRlIHRha2VzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBDU1MncyB0cmFuc2Zvcm0gc3RyaW5nXHJcblx0XHRcdFx0ICh1bml0cyBhcmUgZHJvcHBlZCBhbmQsIGV4Y2VwdCBmb3Igc2tld1gvWSwgc3VicHJvcGVydGllcyBhcmUgbWVyZ2VkIGludG8gdGhlaXIgbWFzdGVyIHByb3BlcnR5IC0tIGUuZy4gc2NhbGVYIGFuZCBzY2FsZVkgYXJlIG1lcmdlZCBpbnRvIHNjYWxlKFggWSkuICovXHJcblx0XHRcdFx0aWYgKChJRSB8fCAoVmVsb2NpdHkuU3RhdGUuaXNBbmRyb2lkICYmICFWZWxvY2l0eS5TdGF0ZS5pc0Nocm9tZSkpICYmIGRhdGEgJiYgZGF0YS5pc1NWRykge1xyXG5cdFx0XHRcdFx0LyogU2luY2UgdHJhbnNmb3JtIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZWlyIHBhcmVudGhlc2VzLXdyYXBwZWQgZm9ybSwgd2UgdXNlIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHN0cmlwIG91dCB0aGVpciBudW1lcmljIHZhbHVlcy5cclxuXHRcdFx0XHRcdCBGdXJ0aGVyLCBTVkcgdHJhbnNmb3JtIHByb3BlcnRpZXMgb25seSB0YWtlIHVuaXRsZXNzIChyZXByZXNlbnRpbmcgcGl4ZWxzKSB2YWx1ZXMsIHNvIGl0J3Mgb2theSB0aGF0IHBhcnNlRmxvYXQoKSBzdHJpcHMgdGhlIHVuaXQgc3VmZml4ZWQgdG8gdGhlIGZsb2F0IHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0dmFyIGdldFRyYW5zZm9ybUZsb2F0ID0gZnVuY3Rpb24odHJhbnNmb3JtUHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgdHJhbnNmb3JtUHJvcGVydHkpKTtcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0LyogQ3JlYXRlIGFuIG9iamVjdCB0byBvcmdhbml6ZSBhbGwgdGhlIHRyYW5zZm9ybXMgdGhhdCB3ZSdsbCBhcHBseSB0byB0aGUgU1ZHIGVsZW1lbnQuIFRvIGtlZXAgdGhlIGxvZ2ljIHNpbXBsZSxcclxuXHRcdFx0XHRcdCB3ZSBwcm9jZXNzICphbGwqIHRyYW5zZm9ybSBwcm9wZXJ0aWVzIC0tIGV2ZW4gdGhvc2UgdGhhdCBtYXkgbm90IGJlIGV4cGxpY2l0bHkgYXBwbGllZCAoc2luY2UgdGhleSBkZWZhdWx0IHRvIHRoZWlyIHplcm8tdmFsdWVzIGFueXdheSkuICovXHJcblx0XHRcdFx0XHR2YXIgU1ZHVHJhbnNmb3JtcyA9IHtcclxuXHRcdFx0XHRcdFx0dHJhbnNsYXRlOiBbZ2V0VHJhbnNmb3JtRmxvYXQoXCJ0cmFuc2xhdGVYXCIpLCBnZXRUcmFuc2Zvcm1GbG9hdChcInRyYW5zbGF0ZVlcIildLFxyXG5cdFx0XHRcdFx0XHRza2V3WDogW2dldFRyYW5zZm9ybUZsb2F0KFwic2tld1hcIildLCBza2V3WTogW2dldFRyYW5zZm9ybUZsb2F0KFwic2tld1lcIildLFxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgc2NhbGUgcHJvcGVydHkgaXMgc2V0IChub24tMSksIHVzZSB0aGF0IHZhbHVlIGZvciB0aGUgc2NhbGVYIGFuZCBzY2FsZVkgdmFsdWVzXHJcblx0XHRcdFx0XHRcdCAodGhpcyBiZWhhdmlvciBtaW1pY3MgdGhlIHJlc3VsdCBvZiBhbmltYXRpbmcgYWxsIHRoZXNlIHByb3BlcnRpZXMgYXQgb25jZSBvbiBIVE1MIGVsZW1lbnRzKS4gKi9cclxuXHRcdFx0XHRcdFx0c2NhbGU6IGdldFRyYW5zZm9ybUZsb2F0KFwic2NhbGVcIikgIT09IDEgPyBbZ2V0VHJhbnNmb3JtRmxvYXQoXCJzY2FsZVwiKSwgZ2V0VHJhbnNmb3JtRmxvYXQoXCJzY2FsZVwiKV0gOiBbZ2V0VHJhbnNmb3JtRmxvYXQoXCJzY2FsZVhcIiksIGdldFRyYW5zZm9ybUZsb2F0KFwic2NhbGVZXCIpXSxcclxuXHRcdFx0XHRcdFx0LyogTm90ZTogU1ZHJ3Mgcm90YXRlIHRyYW5zZm9ybSB0YWtlcyB0aHJlZSB2YWx1ZXM6IHJvdGF0aW9uIGRlZ3JlZXMgZm9sbG93ZWQgYnkgdGhlIFggYW5kIFkgdmFsdWVzXHJcblx0XHRcdFx0XHRcdCBkZWZpbmluZyB0aGUgcm90YXRpb24ncyBvcmlnaW4gcG9pbnQuIFdlIGlnbm9yZSB0aGUgb3JpZ2luIHZhbHVlcyAoZGVmYXVsdCB0aGVtIHRvIDApLiAqL1xyXG5cdFx0XHRcdFx0XHRyb3RhdGU6IFtnZXRUcmFuc2Zvcm1GbG9hdChcInJvdGF0ZVpcIiksIDAsIDBdXHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdHJhbnNmb3JtIHByb3BlcnRpZXMgaW4gdGhlIHVzZXItZGVmaW5lZCBwcm9wZXJ0eSBtYXAgb3JkZXIuXHJcblx0XHRcdFx0XHQgKFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZiBub24tU1ZHIHRyYW5zZm9ybSBhbmltYXRpb24uKSAqL1xyXG5cdFx0XHRcdFx0JC5lYWNoKERhdGEoZWxlbWVudCkudHJhbnNmb3JtQ2FjaGUsIGZ1bmN0aW9uKHRyYW5zZm9ybU5hbWUpIHtcclxuXHRcdFx0XHRcdFx0LyogRXhjZXB0IGZvciB3aXRoIHNrZXdYL1ksIHJldmVydCB0aGUgYXhpcy1zcGVjaWZpYyB0cmFuc2Zvcm0gc3VicHJvcGVydGllcyB0byB0aGVpciBheGlzLWZyZWUgbWFzdGVyXHJcblx0XHRcdFx0XHRcdCBwcm9wZXJ0aWVzIHNvIHRoYXQgdGhleSBtYXRjaCB1cCB3aXRoIFNWRydzIGFjY2VwdGVkIHRyYW5zZm9ybSBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoL150cmFuc2xhdGUvaS50ZXN0KHRyYW5zZm9ybU5hbWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtTmFtZSA9IFwidHJhbnNsYXRlXCI7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoL15zY2FsZS9pLnRlc3QodHJhbnNmb3JtTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm1OYW1lID0gXCJzY2FsZVwiO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKC9ecm90YXRlL2kudGVzdCh0cmFuc2Zvcm1OYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRcdHRyYW5zZm9ybU5hbWUgPSBcInJvdGF0ZVwiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBDaGVjayB0aGF0IHdlIGhhdmVuJ3QgeWV0IGRlbGV0ZWQgdGhlIHByb3BlcnR5IGZyb20gdGhlIFNWR1RyYW5zZm9ybXMgY29udGFpbmVyLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoU1ZHVHJhbnNmb3Jtc1t0cmFuc2Zvcm1OYW1lXSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIEFwcGVuZCB0aGUgdHJhbnNmb3JtIHByb3BlcnR5IGluIHRoZSBTVkctc3VwcG9ydGVkIHRyYW5zZm9ybSBmb3JtYXQuIEFzIHBlciB0aGUgc3BlYywgc3Vycm91bmQgdGhlIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgaW4gcGFyZW50aGVzZXMuICovXHJcblx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtU3RyaW5nICs9IHRyYW5zZm9ybU5hbWUgKyBcIihcIiArIFNWR1RyYW5zZm9ybXNbdHJhbnNmb3JtTmFtZV0uam9pbihcIiBcIikgKyBcIilcIiArIFwiIFwiO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBBZnRlciBwcm9jZXNzaW5nIGFuIFNWRyB0cmFuc2Zvcm0gcHJvcGVydHksIGRlbGV0ZSBpdCBmcm9tIHRoZSBTVkdUcmFuc2Zvcm1zIGNvbnRhaW5lciBzbyB3ZSBkb24ndFxyXG5cdFx0XHRcdFx0XHRcdCByZS1pbnNlcnQgdGhlIHNhbWUgbWFzdGVyIHByb3BlcnR5IGlmIHdlIGVuY291bnRlciBhbm90aGVyIG9uZSBvZiBpdHMgYXhpcy1zcGVjaWZpYyBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBTVkdUcmFuc2Zvcm1zW3RyYW5zZm9ybU5hbWVdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dmFyIHRyYW5zZm9ybVZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdHBlcnNwZWN0aXZlO1xyXG5cclxuXHRcdFx0XHRcdC8qIFRyYW5zZm9ybSBwcm9wZXJ0aWVzIGFyZSBzdG9yZWQgYXMgbWVtYmVycyBvZiB0aGUgdHJhbnNmb3JtQ2FjaGUgb2JqZWN0LiBDb25jYXRlbmF0ZSBhbGwgdGhlIG1lbWJlcnMgaW50byBhIHN0cmluZy4gKi9cclxuXHRcdFx0XHRcdCQuZWFjaChEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlLCBmdW5jdGlvbih0cmFuc2Zvcm1OYW1lKSB7XHJcblx0XHRcdFx0XHRcdHRyYW5zZm9ybVZhbHVlID0gRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIFRyYW5zZm9ybSdzIHBlcnNwZWN0aXZlIHN1YnByb3BlcnR5IG11c3QgYmUgc2V0IGZpcnN0IGluIG9yZGVyIHRvIHRha2UgZWZmZWN0LiBTdG9yZSBpdCB0ZW1wb3JhcmlseS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKHRyYW5zZm9ybU5hbWUgPT09IFwidHJhbnNmb3JtUGVyc3BlY3RpdmVcIikge1xyXG5cdFx0XHRcdFx0XHRcdHBlcnNwZWN0aXZlID0gdHJhbnNmb3JtVmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIElFOSBvbmx5IHN1cHBvcnRzIG9uZSByb3RhdGlvbiB0eXBlLCByb3RhdGVaLCB3aGljaCBpdCByZWZlcnMgdG8gYXMgXCJyb3RhdGVcIi4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKElFID09PSA5ICYmIHRyYW5zZm9ybU5hbWUgPT09IFwicm90YXRlWlwiKSB7XHJcblx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtTmFtZSA9IFwicm90YXRlXCI7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHRyYW5zZm9ybVN0cmluZyArPSB0cmFuc2Zvcm1OYW1lICsgdHJhbnNmb3JtVmFsdWUgKyBcIiBcIjtcclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdC8qIElmIHByZXNlbnQsIHNldCB0aGUgcGVyc3BlY3RpdmUgc3VicHJvcGVydHkgZmlyc3QuICovXHJcblx0XHRcdFx0XHRpZiAocGVyc3BlY3RpdmUpIHtcclxuXHRcdFx0XHRcdFx0dHJhbnNmb3JtU3RyaW5nID0gXCJwZXJzcGVjdGl2ZVwiICsgcGVyc3BlY3RpdmUgKyBcIiBcIiArIHRyYW5zZm9ybVN0cmluZztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybVN0cmluZyk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0LyogUmVnaXN0ZXIgaG9va3MgYW5kIG5vcm1hbGl6YXRpb25zLiAqL1xyXG5cdFx0Q1NTLkhvb2tzLnJlZ2lzdGVyKCk7XHJcblx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXIoKTtcclxuXHJcblx0XHQvKiBBbGxvdyBob29rIHNldHRpbmcgaW4gdGhlIHNhbWUgZmFzaGlvbiBhcyBqUXVlcnkncyAkLmNzcygpLiAqL1xyXG5cdFx0VmVsb2NpdHkuaG9vayA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBhcmcyLCBhcmczKSB7XHJcblx0XHRcdHZhciB2YWx1ZTtcclxuXHJcblx0XHRcdGVsZW1lbnRzID0gc2FuaXRpemVFbGVtZW50cyhlbGVtZW50cyk7XHJcblxyXG5cdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGksIGVsZW1lbnQpIHtcclxuXHRcdFx0XHQvKiBJbml0aWFsaXplIFZlbG9jaXR5J3MgcGVyLWVsZW1lbnQgZGF0YSBjYWNoZSBpZiB0aGlzIGVsZW1lbnQgaGFzbid0IHByZXZpb3VzbHkgYmVlbiBhbmltYXRlZC4gKi9cclxuXHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRWZWxvY2l0eS5pbml0KGVsZW1lbnQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogR2V0IHByb3BlcnR5IHZhbHVlLiBJZiBhbiBlbGVtZW50IHNldCB3YXMgcGFzc2VkIGluLCBvbmx5IHJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBmaXJzdCBlbGVtZW50LiAqL1xyXG5cdFx0XHRcdGlmIChhcmczID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdHZhbHVlID0gQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgYXJnMik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvKiBTZXQgcHJvcGVydHkgdmFsdWUuICovXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8qIHNQViByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBub3JtYWxpemVkIHByb3BlcnR5TmFtZS9wcm9wZXJ0eVZhbHVlIHBhaXIgdXNlZCB0byB1cGRhdGUgdGhlIERPTS4gKi9cclxuXHRcdFx0XHRcdHZhciBhZGp1c3RlZFNldCA9IENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIGFyZzIsIGFyZzMpO1xyXG5cclxuXHRcdFx0XHRcdC8qIFRyYW5zZm9ybSBwcm9wZXJ0aWVzIGRvbid0IGF1dG9tYXRpY2FsbHkgc2V0LiBUaGV5IGhhdmUgdG8gYmUgZmx1c2hlZCB0byB0aGUgRE9NLiAqL1xyXG5cdFx0XHRcdFx0aWYgKGFkanVzdGVkU2V0WzBdID09PSBcInRyYW5zZm9ybVwiKSB7XHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5mbHVzaFRyYW5zZm9ybUNhY2hlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhbHVlID0gYWRqdXN0ZWRTZXQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdH07XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqKioqXHJcblx0XHQgQW5pbWF0aW9uXHJcblx0XHQgKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0dmFyIGFuaW1hdGUgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG9wdHM7XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBDYWxsIENoYWluXHJcblx0XHRcdCAqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBMb2dpYyBmb3IgZGV0ZXJtaW5pbmcgd2hhdCB0byByZXR1cm4gdG8gdGhlIGNhbGwgc3RhY2sgd2hlbiBleGl0aW5nIG91dCBvZiBWZWxvY2l0eS4gKi9cclxuXHRcdFx0ZnVuY3Rpb24gZ2V0Q2hhaW4oKSB7XHJcblx0XHRcdFx0LyogSWYgd2UgYXJlIHVzaW5nIHRoZSB1dGlsaXR5IGZ1bmN0aW9uLCBhdHRlbXB0IHRvIHJldHVybiB0aGlzIGNhbGwncyBwcm9taXNlLiBJZiBubyBwcm9taXNlIGxpYnJhcnkgd2FzIGRldGVjdGVkLFxyXG5cdFx0XHRcdCBkZWZhdWx0IHRvIG51bGwgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHRhcmdldGVkIGVsZW1lbnRzIHNvIHRoYXQgdXRpbGl0eSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBpcyBzdGFuZGFyZGl6ZWQuICovXHJcblx0XHRcdFx0aWYgKGlzVXRpbGl0eSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2VEYXRhLnByb21pc2UgfHwgbnVsbDtcclxuXHRcdFx0XHRcdC8qIE90aGVyd2lzZSwgaWYgd2UncmUgdXNpbmcgJC5mbiwgcmV0dXJuIHRoZSBqUXVlcnktL1plcHRvLXdyYXBwZWQgZWxlbWVudCBzZXQuICovXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50c1dyYXBwZWQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHQgQXJndW1lbnRzIEFzc2lnbm1lbnRcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBUbyBhbGxvdyBmb3IgZXhwcmVzc2l2ZSBDb2ZmZWVTY3JpcHQgY29kZSwgVmVsb2NpdHkgc3VwcG9ydHMgYW4gYWx0ZXJuYXRpdmUgc3ludGF4IGluIHdoaWNoIFwiZWxlbWVudHNcIiAob3IgXCJlXCIpLCBcInByb3BlcnRpZXNcIiAob3IgXCJwXCIpLCBhbmQgXCJvcHRpb25zXCIgKG9yIFwib1wiKVxyXG5cdFx0XHQgb2JqZWN0cyBhcmUgZGVmaW5lZCBvbiBhIGNvbnRhaW5lciBvYmplY3QgdGhhdCdzIHBhc3NlZCBpbiBhcyBWZWxvY2l0eSdzIHNvbGUgYXJndW1lbnQuICovXHJcblx0XHRcdC8qIE5vdGU6IFNvbWUgYnJvd3NlcnMgYXV0b21hdGljYWxseSBwb3B1bGF0ZSBhcmd1bWVudHMgd2l0aCBhIFwicHJvcGVydGllc1wiIG9iamVjdC4gV2UgZGV0ZWN0IGl0IGJ5IGNoZWNraW5nIGZvciBpdHMgZGVmYXVsdCBcIm5hbWVzXCIgcHJvcGVydHkuICovXHJcblx0XHRcdHZhciBzeW50YWN0aWNTdWdhciA9IChhcmd1bWVudHNbMF0gJiYgKGFyZ3VtZW50c1swXS5wIHx8ICgoJC5pc1BsYWluT2JqZWN0KGFyZ3VtZW50c1swXS5wcm9wZXJ0aWVzKSAmJiAhYXJndW1lbnRzWzBdLnByb3BlcnRpZXMubmFtZXMpIHx8IFR5cGUuaXNTdHJpbmcoYXJndW1lbnRzWzBdLnByb3BlcnRpZXMpKSkpLFxyXG5cdFx0XHRcdFx0LyogV2hldGhlciBWZWxvY2l0eSB3YXMgY2FsbGVkIHZpYSB0aGUgdXRpbGl0eSBmdW5jdGlvbiAoYXMgb3Bwb3NlZCB0byBvbiBhIGpRdWVyeS9aZXB0byBvYmplY3QpLiAqL1xyXG5cdFx0XHRcdFx0aXNVdGlsaXR5LFxyXG5cdFx0XHRcdFx0LyogV2hlbiBWZWxvY2l0eSBpcyBjYWxsZWQgdmlhIHRoZSB1dGlsaXR5IGZ1bmN0aW9uICgkLlZlbG9jaXR5KCkvVmVsb2NpdHkoKSksIGVsZW1lbnRzIGFyZSBleHBsaWNpdGx5XHJcblx0XHRcdFx0XHQgcGFzc2VkIGluIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIFRodXMsIGFyZ3VtZW50IHBvc2l0aW9uaW5nIHZhcmllcy4gV2Ugbm9ybWFsaXplIHRoZW0gaGVyZS4gKi9cclxuXHRcdFx0XHRcdGVsZW1lbnRzV3JhcHBlZCxcclxuXHRcdFx0XHRcdGFyZ3VtZW50SW5kZXg7XHJcblxyXG5cdFx0XHR2YXIgZWxlbWVudHMsXHJcblx0XHRcdFx0XHRwcm9wZXJ0aWVzTWFwLFxyXG5cdFx0XHRcdFx0b3B0aW9ucztcclxuXHJcblx0XHRcdC8qIERldGVjdCBqUXVlcnkvWmVwdG8gZWxlbWVudHMgYmVpbmcgYW5pbWF0ZWQgdmlhIHRoZSAkLmZuIG1ldGhvZC4gKi9cclxuXHRcdFx0aWYgKFR5cGUuaXNXcmFwcGVkKHRoaXMpKSB7XHJcblx0XHRcdFx0aXNVdGlsaXR5ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdGFyZ3VtZW50SW5kZXggPSAwO1xyXG5cdFx0XHRcdGVsZW1lbnRzID0gdGhpcztcclxuXHRcdFx0XHRlbGVtZW50c1dyYXBwZWQgPSB0aGlzO1xyXG5cdFx0XHRcdC8qIE90aGVyd2lzZSwgcmF3IGVsZW1lbnRzIGFyZSBiZWluZyBhbmltYXRlZCB2aWEgdGhlIHV0aWxpdHkgZnVuY3Rpb24uICovXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aXNVdGlsaXR5ID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0YXJndW1lbnRJbmRleCA9IDE7XHJcblx0XHRcdFx0ZWxlbWVudHMgPSBzeW50YWN0aWNTdWdhciA/IChhcmd1bWVudHNbMF0uZWxlbWVudHMgfHwgYXJndW1lbnRzWzBdLmUpIDogYXJndW1lbnRzWzBdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqXHJcblx0XHRcdCBQcm9taXNlc1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0dmFyIHByb21pc2VEYXRhID0ge1xyXG5cdFx0XHRcdHByb21pc2U6IG51bGwsXHJcblx0XHRcdFx0cmVzb2x2ZXI6IG51bGwsXHJcblx0XHRcdFx0cmVqZWN0ZXI6IG51bGxcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdC8qIElmIHRoaXMgY2FsbCB3YXMgbWFkZSB2aWEgdGhlIHV0aWxpdHkgZnVuY3Rpb24gKHdoaWNoIGlzIHRoZSBkZWZhdWx0IG1ldGhvZCBvZiBpbnZvY2F0aW9uIHdoZW4galF1ZXJ5L1plcHRvIGFyZSBub3QgYmVpbmcgdXNlZCksIGFuZCBpZlxyXG5cdFx0XHQgcHJvbWlzZSBzdXBwb3J0IHdhcyBkZXRlY3RlZCwgY3JlYXRlIGEgcHJvbWlzZSBvYmplY3QgZm9yIHRoaXMgY2FsbCBhbmQgc3RvcmUgcmVmZXJlbmNlcyB0byBpdHMgcmVzb2x2ZXIgYW5kIHJlamVjdGVyIG1ldGhvZHMuIFRoZSByZXNvbHZlXHJcblx0XHRcdCBtZXRob2QgaXMgdXNlZCB3aGVuIGEgY2FsbCBjb21wbGV0ZXMgbmF0dXJhbGx5IG9yIGlzIHByZW1hdHVyZWx5IHN0b3BwZWQgYnkgdGhlIHVzZXIuIEluIGJvdGggY2FzZXMsIGNvbXBsZXRlQ2FsbCgpIGhhbmRsZXMgdGhlIGFzc29jaWF0ZWRcclxuXHRcdFx0IGNhbGwgY2xlYW51cCBhbmQgcHJvbWlzZSByZXNvbHZpbmcgbG9naWMuIFRoZSByZWplY3QgbWV0aG9kIGlzIHVzZWQgd2hlbiBhbiBpbnZhbGlkIHNldCBvZiBhcmd1bWVudHMgaXMgcGFzc2VkIGludG8gYSBWZWxvY2l0eSBjYWxsLiAqL1xyXG5cdFx0XHQvKiBOb3RlOiBWZWxvY2l0eSBlbXBsb3lzIGEgY2FsbC1iYXNlZCBxdWV1ZWluZyBhcmNoaXRlY3R1cmUsIHdoaWNoIG1lYW5zIHRoYXQgc3RvcHBpbmcgYW4gYW5pbWF0aW5nIGVsZW1lbnQgYWN0dWFsbHkgc3RvcHMgdGhlIGZ1bGwgY2FsbCB0aGF0XHJcblx0XHRcdCB0cmlnZ2VyZWQgaXQgLS0gbm90IHRoYXQgb25lIGVsZW1lbnQgZXhjbHVzaXZlbHkuIFNpbWlsYXJseSwgdGhlcmUgaXMgb25lIHByb21pc2UgcGVyIGNhbGwsIGFuZCBhbGwgZWxlbWVudHMgdGFyZ2V0ZWQgYnkgYSBWZWxvY2l0eSBjYWxsIGFyZVxyXG5cdFx0XHQgZ3JvdXBlZCB0b2dldGhlciBmb3IgdGhlIHB1cnBvc2VzIG9mIHJlc29sdmluZyBhbmQgcmVqZWN0aW5nIGEgcHJvbWlzZS4gKi9cclxuXHRcdFx0aWYgKGlzVXRpbGl0eSAmJiBWZWxvY2l0eS5Qcm9taXNlKSB7XHJcblx0XHRcdFx0cHJvbWlzZURhdGEucHJvbWlzZSA9IG5ldyBWZWxvY2l0eS5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cdFx0XHRcdFx0cHJvbWlzZURhdGEucmVzb2x2ZXIgPSByZXNvbHZlO1xyXG5cdFx0XHRcdFx0cHJvbWlzZURhdGEucmVqZWN0ZXIgPSByZWplY3Q7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChzeW50YWN0aWNTdWdhcikge1xyXG5cdFx0XHRcdHByb3BlcnRpZXNNYXAgPSBhcmd1bWVudHNbMF0ucHJvcGVydGllcyB8fCBhcmd1bWVudHNbMF0ucDtcclxuXHRcdFx0XHRvcHRpb25zID0gYXJndW1lbnRzWzBdLm9wdGlvbnMgfHwgYXJndW1lbnRzWzBdLm87XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cHJvcGVydGllc01hcCA9IGFyZ3VtZW50c1thcmd1bWVudEluZGV4XTtcclxuXHRcdFx0XHRvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50SW5kZXggKyAxXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZWxlbWVudHMgPSBzYW5pdGl6ZUVsZW1lbnRzKGVsZW1lbnRzKTtcclxuXHJcblx0XHRcdGlmICghZWxlbWVudHMpIHtcclxuXHRcdFx0XHRpZiAocHJvbWlzZURhdGEucHJvbWlzZSkge1xyXG5cdFx0XHRcdFx0aWYgKCFwcm9wZXJ0aWVzTWFwIHx8ICFvcHRpb25zIHx8IG9wdGlvbnMucHJvbWlzZVJlamVjdEVtcHR5ICE9PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0XHRwcm9taXNlRGF0YS5yZWplY3RlcigpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cHJvbWlzZURhdGEucmVzb2x2ZXIoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBUaGUgbGVuZ3RoIG9mIHRoZSBlbGVtZW50IHNldCAoaW4gdGhlIGZvcm0gb2YgYSBub2RlTGlzdCBvciBhbiBhcnJheSBvZiBlbGVtZW50cykgaXMgZGVmYXVsdGVkIHRvIDEgaW4gY2FzZSBhXHJcblx0XHRcdCBzaW5nbGUgcmF3IERPTSBlbGVtZW50IGlzIHBhc3NlZCBpbiAod2hpY2ggZG9lc24ndCBjb250YWluIGEgbGVuZ3RoIHByb3BlcnR5KS4gKi9cclxuXHRcdFx0dmFyIGVsZW1lbnRzTGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoLFxyXG5cdFx0XHRcdFx0ZWxlbWVudHNJbmRleCA9IDA7XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBBcmd1bWVudCBPdmVybG9hZGluZ1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogU3VwcG9ydCBpcyBpbmNsdWRlZCBmb3IgalF1ZXJ5J3MgYXJndW1lbnQgb3ZlcmxvYWRpbmc6ICQuYW5pbWF0ZShwcm9wZXJ0eU1hcCBbLCBkdXJhdGlvbl0gWywgZWFzaW5nXSBbLCBjb21wbGV0ZV0pLlxyXG5cdFx0XHQgT3ZlcmxvYWRpbmcgaXMgZGV0ZWN0ZWQgYnkgY2hlY2tpbmcgZm9yIHRoZSBhYnNlbmNlIG9mIGFuIG9iamVjdCBiZWluZyBwYXNzZWQgaW50byBvcHRpb25zLiAqL1xyXG5cdFx0XHQvKiBOb3RlOiBUaGUgc3RvcC9maW5pc2gvcGF1c2UvcmVzdW1lIGFjdGlvbnMgZG8gbm90IGFjY2VwdCBhbmltYXRpb24gb3B0aW9ucywgYW5kIGFyZSB0aGVyZWZvcmUgZXhjbHVkZWQgZnJvbSB0aGlzIGNoZWNrLiAqL1xyXG5cdFx0XHRpZiAoIS9eKHN0b3B8ZmluaXNofGZpbmlzaEFsbHxwYXVzZXxyZXN1bWUpJC9pLnRlc3QocHJvcGVydGllc01hcCkgJiYgISQuaXNQbGFpbk9iamVjdChvcHRpb25zKSkge1xyXG5cdFx0XHRcdC8qIFRoZSB1dGlsaXR5IGZ1bmN0aW9uIHNoaWZ0cyBhbGwgYXJndW1lbnRzIG9uZSBwb3NpdGlvbiB0byB0aGUgcmlnaHQsIHNvIHdlIGFkanVzdCBmb3IgdGhhdCBvZmZzZXQuICovXHJcblx0XHRcdFx0dmFyIHN0YXJ0aW5nQXJndW1lbnRQb3NpdGlvbiA9IGFyZ3VtZW50SW5kZXggKyAxO1xyXG5cclxuXHRcdFx0XHRvcHRpb25zID0ge307XHJcblxyXG5cdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb3B0aW9ucyBhcmd1bWVudHMgKi9cclxuXHRcdFx0XHRmb3IgKHZhciBpID0gc3RhcnRpbmdBcmd1bWVudFBvc2l0aW9uOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHQvKiBUcmVhdCBhIG51bWJlciBhcyBhIGR1cmF0aW9uLiBQYXJzZSBpdCBvdXQuICovXHJcblx0XHRcdFx0XHQvKiBOb3RlOiBUaGUgZm9sbG93aW5nIFJlZ0V4IHdpbGwgcmV0dXJuIHRydWUgaWYgcGFzc2VkIGFuIGFycmF5IHdpdGggYSBudW1iZXIgYXMgaXRzIGZpcnN0IGl0ZW0uXHJcblx0XHRcdFx0XHQgVGh1cywgYXJyYXlzIGFyZSBza2lwcGVkIGZyb20gdGhpcyBjaGVjay4gKi9cclxuXHRcdFx0XHRcdGlmICghVHlwZS5pc0FycmF5KGFyZ3VtZW50c1tpXSkgJiYgKC9eKGZhc3R8bm9ybWFsfHNsb3cpJC9pLnRlc3QoYXJndW1lbnRzW2ldKSB8fCAvXlxcZC8udGVzdChhcmd1bWVudHNbaV0pKSkge1xyXG5cdFx0XHRcdFx0XHRvcHRpb25zLmR1cmF0aW9uID0gYXJndW1lbnRzW2ldO1xyXG5cdFx0XHRcdFx0XHQvKiBUcmVhdCBzdHJpbmdzIGFuZCBhcnJheXMgYXMgZWFzaW5ncy4gKi9cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc1N0cmluZyhhcmd1bWVudHNbaV0pIHx8IFR5cGUuaXNBcnJheShhcmd1bWVudHNbaV0pKSB7XHJcblx0XHRcdFx0XHRcdG9wdGlvbnMuZWFzaW5nID0gYXJndW1lbnRzW2ldO1xyXG5cdFx0XHRcdFx0XHQvKiBUcmVhdCBhIGZ1bmN0aW9uIGFzIGEgY29tcGxldGUgY2FsbGJhY2suICovXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNGdW5jdGlvbihhcmd1bWVudHNbaV0pKSB7XHJcblx0XHRcdFx0XHRcdG9wdGlvbnMuY29tcGxldGUgPSBhcmd1bWVudHNbaV07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBBY3Rpb24gRGV0ZWN0aW9uXHJcblx0XHRcdCAqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBWZWxvY2l0eSdzIGJlaGF2aW9yIGlzIGNhdGVnb3JpemVkIGludG8gXCJhY3Rpb25zXCI6IEVsZW1lbnRzIGNhbiBlaXRoZXIgYmUgc3BlY2lhbGx5IHNjcm9sbGVkIGludG8gdmlldyxcclxuXHRcdFx0IG9yIHRoZXkgY2FuIGJlIHN0YXJ0ZWQsIHN0b3BwZWQsIHBhdXNlZCwgcmVzdW1lZCwgb3IgcmV2ZXJzZWQgLiBJZiBhIGxpdGVyYWwgb3IgcmVmZXJlbmNlZCBwcm9wZXJ0aWVzIG1hcCBpcyBwYXNzZWQgaW4gYXMgVmVsb2NpdHknc1xyXG5cdFx0XHQgZmlyc3QgYXJndW1lbnQsIHRoZSBhc3NvY2lhdGVkIGFjdGlvbiBpcyBcInN0YXJ0XCIuIEFsdGVybmF0aXZlbHksIFwic2Nyb2xsXCIsIFwicmV2ZXJzZVwiLCBcInBhdXNlXCIsIFwicmVzdW1lXCIgb3IgXCJzdG9wXCIgY2FuIGJlIHBhc3NlZCBpbiBcclxuXHRcdFx0IGluc3RlYWQgb2YgYSBwcm9wZXJ0aWVzIG1hcC4gKi9cclxuXHRcdFx0dmFyIGFjdGlvbjtcclxuXHJcblx0XHRcdHN3aXRjaCAocHJvcGVydGllc01hcCkge1xyXG5cdFx0XHRcdGNhc2UgXCJzY3JvbGxcIjpcclxuXHRcdFx0XHRcdGFjdGlvbiA9IFwic2Nyb2xsXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBcInJldmVyc2VcIjpcclxuXHRcdFx0XHRcdGFjdGlvbiA9IFwicmV2ZXJzZVwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgXCJwYXVzZVwiOlxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgQWN0aW9uOiBQYXVzZVxyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcclxuXHJcblx0XHRcdFx0XHQvKiBIYW5kbGUgZGVsYXkgdGltZXJzICovXHJcblx0XHRcdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGksIGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0cGF1c2VEZWxheU9uRWxlbWVudChlbGVtZW50LCBjdXJyZW50VGltZSk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHQvKiBQYXVzZSBhbmQgUmVzdW1lIGFyZSBjYWxsLXdpZGUgKG5vdCBvbiBhIHBlciBlbGVtZW50IGJhc2lzKS4gVGh1cywgY2FsbGluZyBwYXVzZSBvciByZXN1bWUgb24gYSBcclxuXHRcdFx0XHRcdCBzaW5nbGUgZWxlbWVudCB3aWxsIGNhdXNlIGFueSBjYWxscyB0aGF0IGNvbnRhaW50IHR3ZWVucyBmb3IgdGhhdCBlbGVtZW50IHRvIGJlIHBhdXNlZC9yZXN1bWVkXHJcblx0XHRcdFx0XHQgYXMgd2VsbC4gKi9cclxuXHJcblx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggYWxsIGNhbGxzIGFuZCBwYXVzZSBhbnkgdGhhdCBjb250YWluIGFueSBvZiBvdXIgZWxlbWVudHMgKi9cclxuXHRcdFx0XHRcdCQuZWFjaChWZWxvY2l0eS5TdGF0ZS5jYWxscywgZnVuY3Rpb24oaSwgYWN0aXZlQ2FsbCkge1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGZvdW5kID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdC8qIEluYWN0aXZlIGNhbGxzIGFyZSBzZXQgdG8gZmFsc2UgYnkgdGhlIGxvZ2ljIGluc2lkZSBjb21wbGV0ZUNhbGwoKS4gU2tpcCB0aGVtLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoYWN0aXZlQ2FsbCkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYWN0aXZlIGNhbGwncyB0YXJnZXRlZCBlbGVtZW50cy4gKi9cclxuXHRcdFx0XHRcdFx0XHQkLmVhY2goYWN0aXZlQ2FsbFsxXSwgZnVuY3Rpb24oaywgYWN0aXZlRWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIHF1ZXVlTmFtZSA9IChvcHRpb25zID09PSB1bmRlZmluZWQpID8gXCJcIiA6IG9wdGlvbnM7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHF1ZXVlTmFtZSAhPT0gdHJ1ZSAmJiAoYWN0aXZlQ2FsbFsyXS5xdWV1ZSAhPT0gcXVldWVOYW1lKSAmJiAhKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiBhY3RpdmVDYWxsWzJdLnF1ZXVlID09PSBmYWxzZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBjYWxscyB0YXJnZXRlZCBieSB0aGUgc3RvcCBjb21tYW5kLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihsLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIENoZWNrIHRoYXQgdGhpcyBjYWxsIHdhcyBhcHBsaWVkIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQpIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogU2V0IGNhbGwgdG8gcGF1c2VkICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aXZlQ2FsbFs1XSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VtZTogZmFsc2VcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBPbmNlIHdlIG1hdGNoIGFuIGVsZW1lbnQsIHdlIGNhbiBib3VuY2Ugb3V0IHRvIHRoZSBuZXh0IGNhbGwgZW50aXJlbHkgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBQcm9jZWVkIHRvIGNoZWNrIG5leHQgY2FsbCBpZiB3ZSBoYXZlIGFscmVhZHkgbWF0Y2hlZCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGZvdW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdC8qIFNpbmNlIHBhdXNlIGNyZWF0ZXMgbm8gbmV3IHR3ZWVucywgZXhpdCBvdXQgb2YgVmVsb2NpdHkuICovXHJcblx0XHRcdFx0XHRyZXR1cm4gZ2V0Q2hhaW4oKTtcclxuXHJcblx0XHRcdFx0Y2FzZSBcInJlc3VtZVwiOlxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgQWN0aW9uOiBSZXN1bWVcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIEhhbmRsZSBkZWxheSB0aW1lcnMgKi9cclxuXHRcdFx0XHRcdCQuZWFjaChlbGVtZW50cywgZnVuY3Rpb24oaSwgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bWVEZWxheU9uRWxlbWVudChlbGVtZW50LCBjdXJyZW50VGltZSk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHQvKiBQYXVzZSBhbmQgUmVzdW1lIGFyZSBjYWxsLXdpZGUgKG5vdCBvbiBhIHBlciBlbGVtbnQgYmFzaXMpLiBUaHVzLCBjYWxsaW5nIHBhdXNlIG9yIHJlc3VtZSBvbiBhIFxyXG5cdFx0XHRcdFx0IHNpbmdsZSBlbGVtZW50IHdpbGwgY2F1c2UgYW55IGNhbGxzIHRoYXQgY29udGFpbnQgdHdlZW5zIGZvciB0aGF0IGVsZW1lbnQgdG8gYmUgcGF1c2VkL3Jlc3VtZWRcclxuXHRcdFx0XHRcdCBhcyB3ZWxsLiAqL1xyXG5cclxuXHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgY2FsbHMgYW5kIHBhdXNlIGFueSB0aGF0IGNvbnRhaW4gYW55IG9mIG91ciBlbGVtZW50cyAqL1xyXG5cdFx0XHRcdFx0JC5lYWNoKFZlbG9jaXR5LlN0YXRlLmNhbGxzLCBmdW5jdGlvbihpLCBhY3RpdmVDYWxsKSB7XHJcblx0XHRcdFx0XHRcdHZhciBmb3VuZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHQvKiBJbmFjdGl2ZSBjYWxscyBhcmUgc2V0IHRvIGZhbHNlIGJ5IHRoZSBsb2dpYyBpbnNpZGUgY29tcGxldGVDYWxsKCkuIFNraXAgdGhlbS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKGFjdGl2ZUNhbGwpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGFjdGl2ZSBjYWxsJ3MgdGFyZ2V0ZWQgZWxlbWVudHMuICovXHJcblx0XHRcdFx0XHRcdFx0JC5lYWNoKGFjdGl2ZUNhbGxbMV0sIGZ1bmN0aW9uKGssIGFjdGl2ZUVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBxdWV1ZU5hbWUgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSA/IFwiXCIgOiBvcHRpb25zO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChxdWV1ZU5hbWUgIT09IHRydWUgJiYgKGFjdGl2ZUNhbGxbMl0ucXVldWUgIT09IHF1ZXVlTmFtZSkgJiYgIShvcHRpb25zID09PSB1bmRlZmluZWQgJiYgYWN0aXZlQ2FsbFsyXS5xdWV1ZSA9PT0gZmFsc2UpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFNraXAgYW55IGNhbGxzIHRoYXQgaGF2ZSBuZXZlciBiZWVuIHBhdXNlZCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFhY3RpdmVDYWxsWzVdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2FsbHMgdGFyZ2V0ZWQgYnkgdGhlIHN0b3AgY29tbWFuZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdCQuZWFjaChlbGVtZW50cywgZnVuY3Rpb24obCwgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBDaGVjayB0aGF0IHRoaXMgY2FsbCB3YXMgYXBwbGllZCB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEZsYWcgYSBwYXVzZSBvYmplY3QgdG8gYmUgcmVzdW1lZCwgd2hpY2ggd2lsbCBvY2N1ciBkdXJpbmcgdGhlIG5leHQgdGljay4gSW5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgYWRkaXRpb24sIHRoZSBwYXVzZSBvYmplY3Qgd2lsbCBhdCB0aGF0IHRpbWUgYmUgZGVsZXRlZCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGl2ZUNhbGxbNV0ucmVzdW1lID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogT25jZSB3ZSBtYXRjaCBhbiBlbGVtZW50LCB3ZSBjYW4gYm91bmNlIG91dCB0byB0aGUgbmV4dCBjYWxsIGVudGlyZWx5ICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogUHJvY2VlZCB0byBjaGVjayBuZXh0IGNhbGwgaWYgd2UgaGF2ZSBhbHJlYWR5IG1hdGNoZWQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChmb3VuZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHQvKiBTaW5jZSByZXN1bWUgY3JlYXRlcyBubyBuZXcgdHdlZW5zLCBleGl0IG91dCBvZiBWZWxvY2l0eS4gKi9cclxuXHRcdFx0XHRcdHJldHVybiBnZXRDaGFpbigpO1xyXG5cclxuXHRcdFx0XHRjYXNlIFwiZmluaXNoXCI6XHJcblx0XHRcdFx0Y2FzZSBcImZpbmlzaEFsbFwiOlxyXG5cdFx0XHRcdGNhc2UgXCJzdG9wXCI6XHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IEFjdGlvbjogU3RvcFxyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0LyogQ2xlYXIgdGhlIGN1cnJlbnRseS1hY3RpdmUgZGVsYXkgb24gZWFjaCB0YXJnZXRlZCBlbGVtZW50LiAqL1xyXG5cdFx0XHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihpLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdGlmIChEYXRhKGVsZW1lbnQpICYmIERhdGEoZWxlbWVudCkuZGVsYXlUaW1lcikge1xyXG5cdFx0XHRcdFx0XHRcdC8qIFN0b3AgdGhlIHRpbWVyIGZyb20gdHJpZ2dlcmluZyBpdHMgY2FjaGVkIG5leHQoKSBmdW5jdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRjbGVhclRpbWVvdXQoRGF0YShlbGVtZW50KS5kZWxheVRpbWVyLnNldFRpbWVvdXQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBNYW51YWxseSBjYWxsIHRoZSBuZXh0KCkgZnVuY3Rpb24gc28gdGhhdCB0aGUgc3Vic2VxdWVudCBxdWV1ZSBpdGVtcyBjYW4gcHJvZ3Jlc3MuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKERhdGEoZWxlbWVudCkuZGVsYXlUaW1lci5uZXh0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHREYXRhKGVsZW1lbnQpLmRlbGF5VGltZXIubmV4dCgpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIERhdGEoZWxlbWVudCkuZGVsYXlUaW1lcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgd2Ugd2FudCB0byBmaW5pc2ggZXZlcnl0aGluZyBpbiB0aGUgcXVldWUsIHdlIGhhdmUgdG8gaXRlcmF0ZSB0aHJvdWdoIGl0XHJcblx0XHRcdFx0XHRcdCBhbmQgY2FsbCBlYWNoIGZ1bmN0aW9uLiBUaGlzIHdpbGwgbWFrZSB0aGVtIGFjdGl2ZSBjYWxscyBiZWxvdywgd2hpY2ggd2lsbFxyXG5cdFx0XHRcdFx0XHQgY2F1c2UgdGhlbSB0byBiZSBhcHBsaWVkIHZpYSB0aGUgZHVyYXRpb24gc2V0dGluZy4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKHByb3BlcnRpZXNNYXAgPT09IFwiZmluaXNoQWxsXCIgJiYgKG9wdGlvbnMgPT09IHRydWUgfHwgVHlwZS5pc1N0cmluZyhvcHRpb25zKSkpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGl0ZW1zIGluIHRoZSBlbGVtZW50J3MgcXVldWUuICovXHJcblx0XHRcdFx0XHRcdFx0JC5lYWNoKCQucXVldWUoZWxlbWVudCwgVHlwZS5pc1N0cmluZyhvcHRpb25zKSA/IG9wdGlvbnMgOiBcIlwiKSwgZnVuY3Rpb24oXywgaXRlbSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogVGhlIHF1ZXVlIGFycmF5IGNhbiBjb250YWluIGFuIFwiaW5wcm9ncmVzc1wiIHN0cmluZywgd2hpY2ggd2Ugc2tpcC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChUeXBlLmlzRnVuY3Rpb24oaXRlbSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBDbGVhcmluZyB0aGUgJC5xdWV1ZSgpIGFycmF5IGlzIGFjaGlldmVkIGJ5IHJlc2V0dGluZyBpdCB0byBbXS4gKi9cclxuXHRcdFx0XHRcdFx0XHQkLnF1ZXVlKGVsZW1lbnQsIFR5cGUuaXNTdHJpbmcob3B0aW9ucykgPyBvcHRpb25zIDogXCJcIiwgW10pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHR2YXIgY2FsbHNUb1N0b3AgPSBbXTtcclxuXHJcblx0XHRcdFx0XHQvKiBXaGVuIHRoZSBzdG9wIGFjdGlvbiBpcyB0cmlnZ2VyZWQsIHRoZSBlbGVtZW50cycgY3VycmVudGx5IGFjdGl2ZSBjYWxsIGlzIGltbWVkaWF0ZWx5IHN0b3BwZWQuIFRoZSBhY3RpdmUgY2FsbCBtaWdodCBoYXZlXHJcblx0XHRcdFx0XHQgYmVlbiBhcHBsaWVkIHRvIG11bHRpcGxlIGVsZW1lbnRzLCBpbiB3aGljaCBjYXNlIGFsbCBvZiB0aGUgY2FsbCdzIGVsZW1lbnRzIHdpbGwgYmUgc3RvcHBlZC4gV2hlbiBhbiBlbGVtZW50XHJcblx0XHRcdFx0XHQgaXMgc3RvcHBlZCwgdGhlIG5leHQgaXRlbSBpbiBpdHMgYW5pbWF0aW9uIHF1ZXVlIGlzIGltbWVkaWF0ZWx5IHRyaWdnZXJlZC4gKi9cclxuXHRcdFx0XHRcdC8qIEFuIGFkZGl0aW9uYWwgYXJndW1lbnQgbWF5IGJlIHBhc3NlZCBpbiB0byBjbGVhciBhbiBlbGVtZW50J3MgcmVtYWluaW5nIHF1ZXVlZCBjYWxscy4gRWl0aGVyIHRydWUgKHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBcImZ4XCIgcXVldWUpXHJcblx0XHRcdFx0XHQgb3IgYSBjdXN0b20gcXVldWUgc3RyaW5nIGNhbiBiZSBwYXNzZWQgaW4uICovXHJcblx0XHRcdFx0XHQvKiBOb3RlOiBUaGUgc3RvcCBjb21tYW5kIHJ1bnMgcHJpb3IgdG8gVmVsb2NpdHkncyBRdWV1ZWluZyBwaGFzZSBzaW5jZSBpdHMgYmVoYXZpb3IgaXMgaW50ZW5kZWQgdG8gdGFrZSBlZmZlY3QgKmltbWVkaWF0ZWx5KixcclxuXHRcdFx0XHRcdCByZWdhcmRsZXNzIG9mIHRoZSBlbGVtZW50J3MgY3VycmVudCBxdWV1ZSBzdGF0ZS4gKi9cclxuXHJcblx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggZXZlcnkgYWN0aXZlIGNhbGwuICovXHJcblx0XHRcdFx0XHQkLmVhY2goVmVsb2NpdHkuU3RhdGUuY2FsbHMsIGZ1bmN0aW9uKGksIGFjdGl2ZUNhbGwpIHtcclxuXHRcdFx0XHRcdFx0LyogSW5hY3RpdmUgY2FsbHMgYXJlIHNldCB0byBmYWxzZSBieSB0aGUgbG9naWMgaW5zaWRlIGNvbXBsZXRlQ2FsbCgpLiBTa2lwIHRoZW0uICovXHJcblx0XHRcdFx0XHRcdGlmIChhY3RpdmVDYWxsKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBhY3RpdmUgY2FsbCdzIHRhcmdldGVkIGVsZW1lbnRzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdCQuZWFjaChhY3RpdmVDYWxsWzFdLCBmdW5jdGlvbihrLCBhY3RpdmVFbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBJZiB0cnVlIHdhcyBwYXNzZWQgaW4gYXMgYSBzZWNvbmRhcnkgYXJndW1lbnQsIGNsZWFyIGFic29sdXRlbHkgYWxsIGNhbGxzIG9uIHRoaXMgZWxlbWVudC4gT3RoZXJ3aXNlLCBvbmx5XHJcblx0XHRcdFx0XHRcdFx0XHQgY2xlYXIgY2FsbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxldmFudCBxdWV1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdC8qIENhbGwgc3RvcHBpbmcgbG9naWMgd29ya3MgYXMgZm9sbG93czpcclxuXHRcdFx0XHRcdFx0XHRcdCAtIG9wdGlvbnMgPT09IHRydWUgLS0+IHN0b3AgY3VycmVudCBkZWZhdWx0IHF1ZXVlIGNhbGxzIChhbmQgcXVldWU6ZmFsc2UgY2FsbHMpLCBpbmNsdWRpbmcgcmVtYWluaW5nIHF1ZXVlZCBvbmVzLlxyXG5cdFx0XHRcdFx0XHRcdFx0IC0gb3B0aW9ucyA9PT0gdW5kZWZpbmVkIC0tPiBzdG9wIGN1cnJlbnQgcXVldWU6XCJcIiBjYWxsIGFuZCBhbGwgcXVldWU6ZmFsc2UgY2FsbHMuXHJcblx0XHRcdFx0XHRcdFx0XHQgLSBvcHRpb25zID09PSBmYWxzZSAtLT4gc3RvcCBvbmx5IHF1ZXVlOmZhbHNlIGNhbGxzLlxyXG5cdFx0XHRcdFx0XHRcdFx0IC0gb3B0aW9ucyA9PT0gXCJjdXN0b21cIiAtLT4gc3RvcCBjdXJyZW50IHF1ZXVlOlwiY3VzdG9tXCIgY2FsbCwgaW5jbHVkaW5nIHJlbWFpbmluZyBxdWV1ZWQgb25lcyAodGhlcmUgaXMgbm8gZnVuY3Rpb25hbGl0eSB0byBvbmx5IGNsZWFyIHRoZSBjdXJyZW50bHktcnVubmluZyBxdWV1ZTpcImN1c3RvbVwiIGNhbGwpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIHF1ZXVlTmFtZSA9IChvcHRpb25zID09PSB1bmRlZmluZWQpID8gXCJcIiA6IG9wdGlvbnM7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHF1ZXVlTmFtZSAhPT0gdHJ1ZSAmJiAoYWN0aXZlQ2FsbFsyXS5xdWV1ZSAhPT0gcXVldWVOYW1lKSAmJiAhKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiBhY3RpdmVDYWxsWzJdLnF1ZXVlID09PSBmYWxzZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBjYWxscyB0YXJnZXRlZCBieSB0aGUgc3RvcCBjb21tYW5kLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihsLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIENoZWNrIHRoYXQgdGhpcyBjYWxsIHdhcyBhcHBsaWVkIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBPcHRpb25hbGx5IGNsZWFyIHRoZSByZW1haW5pbmcgcXVldWVkIGNhbGxzLiBJZiB3ZSdyZSBkb2luZyBcImZpbmlzaEFsbFwiIHRoaXMgd29uJ3QgZmluZCBhbnl0aGluZyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgZHVlIHRvIHRoZSBxdWV1ZS1jbGVhcmluZyBhYm92ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob3B0aW9ucyA9PT0gdHJ1ZSB8fCBUeXBlLmlzU3RyaW5nKG9wdGlvbnMpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGl0ZW1zIGluIHRoZSBlbGVtZW50J3MgcXVldWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkLmVhY2goJC5xdWV1ZShlbGVtZW50LCBUeXBlLmlzU3RyaW5nKG9wdGlvbnMpID8gb3B0aW9ucyA6IFwiXCIpLCBmdW5jdGlvbihfLCBpdGVtKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFRoZSBxdWV1ZSBhcnJheSBjYW4gY29udGFpbiBhbiBcImlucHJvZ3Jlc3NcIiBzdHJpbmcsIHdoaWNoIHdlIHNraXAuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChUeXBlLmlzRnVuY3Rpb24oaXRlbSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBQYXNzIHRoZSBpdGVtJ3MgY2FsbGJhY2sgYSBmbGFnIGluZGljYXRpbmcgdGhhdCB3ZSB3YW50IHRvIGFib3J0IGZyb20gdGhlIHF1ZXVlIGNhbGwuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IChTcGVjaWZpY2FsbHksIHRoZSBxdWV1ZSB3aWxsIHJlc29sdmUgdGhlIGNhbGwncyBhc3NvY2lhdGVkIHByb21pc2UgdGhlbiBhYm9ydC4pICAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW0obnVsbCwgdHJ1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIENsZWFyaW5nIHRoZSAkLnF1ZXVlKCkgYXJyYXkgaXMgYWNoaWV2ZWQgYnkgcmVzZXR0aW5nIGl0IHRvIFtdLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JC5xdWV1ZShlbGVtZW50LCBUeXBlLmlzU3RyaW5nKG9wdGlvbnMpID8gb3B0aW9ucyA6IFwiXCIsIFtdKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzTWFwID09PSBcInN0b3BcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogU2luY2UgXCJyZXZlcnNlXCIgdXNlcyBjYWNoZWQgc3RhcnQgdmFsdWVzICh0aGUgcHJldmlvdXMgY2FsbCdzIGVuZFZhbHVlcyksIHRoZXNlIHZhbHVlcyBtdXN0IGJlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgY2hhbmdlZCB0byByZWZsZWN0IHRoZSBmaW5hbCB2YWx1ZSB0aGF0IHRoZSBlbGVtZW50cyB3ZXJlIGFjdHVhbGx5IHR3ZWVuZWQgdG8uICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBJZiBvbmx5IHF1ZXVlOmZhbHNlL3F1ZXVlOlwiY3VzdG9tXCIgYW5pbWF0aW9ucyBhcmUgY3VycmVudGx5IHJ1bm5pbmcgb24gYW4gZWxlbWVudCwgaXQgd29uJ3QgaGF2ZSBhIHR3ZWVuc0NvbnRhaW5lclxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IG9iamVjdC4gQWxzbywgcXVldWU6ZmFsc2UvcXVldWU6XCJjdXN0b21cIiBhbmltYXRpb25zIGNhbid0IGJlIHJldmVyc2VkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGRhdGEgJiYgZGF0YS50d2VlbnNDb250YWluZXIgJiYgKHF1ZXVlTmFtZSA9PT0gdHJ1ZSB8fCBxdWV1ZU5hbWUgPT09IFwiXCIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCQuZWFjaChkYXRhLnR3ZWVuc0NvbnRhaW5lciwgZnVuY3Rpb24obSwgYWN0aXZlVHdlZW4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3RpdmVUd2Vlbi5lbmRWYWx1ZSA9IGFjdGl2ZVR3ZWVuLmN1cnJlbnRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsbHNUb1N0b3AucHVzaChpKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnRpZXNNYXAgPT09IFwiZmluaXNoXCIgfHwgcHJvcGVydGllc01hcCA9PT0gXCJmaW5pc2hBbGxcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogVG8gZ2V0IGFjdGl2ZSB0d2VlbnMgdG8gZmluaXNoIGltbWVkaWF0ZWx5LCB3ZSBmb3JjZWZ1bGx5IHNob3J0ZW4gdGhlaXIgZHVyYXRpb25zIHRvIDFtcyBzbyB0aGF0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgdGhleSBmaW5pc2ggdXBvbiB0aGUgbmV4dCByQWYgdGljayB0aGVuIHByb2NlZWQgd2l0aCBub3JtYWwgY2FsbCBjb21wbGV0aW9uIGxvZ2ljLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aXZlQ2FsbFsyXS5kdXJhdGlvbiA9IDE7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0LyogUHJlbWF0dXJlbHkgY2FsbCBjb21wbGV0ZUNhbGwoKSBvbiBlYWNoIG1hdGNoZWQgYWN0aXZlIGNhbGwuIFBhc3MgYW4gYWRkaXRpb25hbCBmbGFnIGZvciBcInN0b3BcIiB0byBpbmRpY2F0ZVxyXG5cdFx0XHRcdFx0IHRoYXQgdGhlIGNvbXBsZXRlIGNhbGxiYWNrIGFuZCBkaXNwbGF5Om5vbmUgc2V0dGluZyBzaG91bGQgYmUgc2tpcHBlZCBzaW5jZSB3ZSdyZSBjb21wbGV0aW5nIHByZW1hdHVyZWx5LiAqL1xyXG5cdFx0XHRcdFx0aWYgKHByb3BlcnRpZXNNYXAgPT09IFwic3RvcFwiKSB7XHJcblx0XHRcdFx0XHRcdCQuZWFjaChjYWxsc1RvU3RvcCwgZnVuY3Rpb24oaSwgaikge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlQ2FsbChqLCB0cnVlKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAocHJvbWlzZURhdGEucHJvbWlzZSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIEltbWVkaWF0ZWx5IHJlc29sdmUgdGhlIHByb21pc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RvcCBjYWxsIHNpbmNlIHN0b3AgcnVucyBzeW5jaHJvbm91c2x5LiAqL1xyXG5cdFx0XHRcdFx0XHRcdHByb21pc2VEYXRhLnJlc29sdmVyKGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIFNpbmNlIHdlJ3JlIHN0b3BwaW5nLCBhbmQgbm90IHByb2NlZWRpbmcgd2l0aCBxdWV1ZWluZywgZXhpdCBvdXQgb2YgVmVsb2NpdHkuICovXHJcblx0XHRcdFx0XHRyZXR1cm4gZ2V0Q2hhaW4oKTtcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdC8qIFRyZWF0IGEgbm9uLWVtcHR5IHBsYWluIG9iamVjdCBhcyBhIGxpdGVyYWwgcHJvcGVydGllcyBtYXAuICovXHJcblx0XHRcdFx0XHRpZiAoJC5pc1BsYWluT2JqZWN0KHByb3BlcnRpZXNNYXApICYmICFUeXBlLmlzRW1wdHlPYmplY3QocHJvcGVydGllc01hcCkpIHtcclxuXHRcdFx0XHRcdFx0YWN0aW9uID0gXCJzdGFydFwiO1xyXG5cclxuXHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IFJlZGlyZWN0c1xyXG5cdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIENoZWNrIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSByZWdpc3RlcmVkIHJlZGlyZWN0IChzZWUgUmVkaXJlY3RzIGFib3ZlKS4gKi9cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc1N0cmluZyhwcm9wZXJ0aWVzTWFwKSAmJiBWZWxvY2l0eS5SZWRpcmVjdHNbcHJvcGVydGllc01hcF0pIHtcclxuXHRcdFx0XHRcdFx0b3B0cyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKTtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBkdXJhdGlvbk9yaWdpbmFsID0gb3B0cy5kdXJhdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdGRlbGF5T3JpZ2luYWwgPSBvcHRzLmRlbGF5IHx8IDA7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgYmFja3dhcmRzIG9wdGlvbiB3YXMgcGFzc2VkIGluLCByZXZlcnNlIHRoZSBlbGVtZW50IHNldCBzbyB0aGF0IGVsZW1lbnRzIGFuaW1hdGUgZnJvbSB0aGUgbGFzdCB0byB0aGUgZmlyc3QuICovXHJcblx0XHRcdFx0XHRcdGlmIChvcHRzLmJhY2t3YXJkcyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnRzID0gJC5leHRlbmQodHJ1ZSwgW10sIGVsZW1lbnRzKS5yZXZlcnNlKCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIEluZGl2aWR1YWxseSB0cmlnZ2VyIHRoZSByZWRpcmVjdCBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgdG8gcHJldmVudCB1c2VycyBmcm9tIGhhdmluZyB0byBoYW5kbGUgaXRlcmF0aW9uIGxvZ2ljIGluIHRoZWlyIHJlZGlyZWN0LiAqL1xyXG5cdFx0XHRcdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGVsZW1lbnRJbmRleCwgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBzdGFnZ2VyIG9wdGlvbiB3YXMgcGFzc2VkIGluLCBzdWNjZXNzaXZlbHkgZGVsYXkgZWFjaCBlbGVtZW50IGJ5IHRoZSBzdGFnZ2VyIHZhbHVlIChpbiBtcykuIFJldGFpbiB0aGUgb3JpZ2luYWwgZGVsYXkgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlRmxvYXQob3B0cy5zdGFnZ2VyKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0b3B0cy5kZWxheSA9IGRlbGF5T3JpZ2luYWwgKyAocGFyc2VGbG9hdChvcHRzLnN0YWdnZXIpICogZWxlbWVudEluZGV4KTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNGdW5jdGlvbihvcHRzLnN0YWdnZXIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRvcHRzLmRlbGF5ID0gZGVsYXlPcmlnaW5hbCArIG9wdHMuc3RhZ2dlci5jYWxsKGVsZW1lbnQsIGVsZW1lbnRJbmRleCwgZWxlbWVudHNMZW5ndGgpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgdGhlIGRyYWcgb3B0aW9uIHdhcyBwYXNzZWQgaW4sIHN1Y2Nlc3NpdmVseSBpbmNyZWFzZS9kZWNyZWFzZSAoZGVwZW5kaW5nIG9uIHRoZSBwcmVzZW5zZSBvZiBvcHRzLmJhY2t3YXJkcylcclxuXHRcdFx0XHRcdFx0XHQgdGhlIGR1cmF0aW9uIG9mIGVhY2ggZWxlbWVudCdzIGFuaW1hdGlvbiwgdXNpbmcgZmxvb3JzIHRvIHByZXZlbnQgcHJvZHVjaW5nIHZlcnkgc2hvcnQgZHVyYXRpb25zLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChvcHRzLmRyYWcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIERlZmF1bHQgdGhlIGR1cmF0aW9uIG9mIFVJIHBhY2sgZWZmZWN0cyAoY2FsbG91dHMgYW5kIHRyYW5zaXRpb25zKSB0byAxMDAwbXMgaW5zdGVhZCBvZiB0aGUgdXN1YWwgZGVmYXVsdCBkdXJhdGlvbiBvZiA0MDBtcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSBwYXJzZUZsb2F0KGR1cmF0aW9uT3JpZ2luYWwpIHx8ICgvXihjYWxsb3V0fHRyYW5zaXRpb24pLy50ZXN0KHByb3BlcnRpZXNNYXApID8gMTAwMCA6IERVUkFUSU9OX0RFRkFVTFQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIEZvciBlYWNoIGVsZW1lbnQsIHRha2UgdGhlIGdyZWF0ZXIgZHVyYXRpb24gb2Y6IEEpIGFuaW1hdGlvbiBjb21wbGV0aW9uIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIGR1cmF0aW9uLFxyXG5cdFx0XHRcdFx0XHRcdFx0IEIpIDc1JSBvZiB0aGUgb3JpZ2luYWwgZHVyYXRpb24sIG9yIEMpIGEgMjAwbXMgZmFsbGJhY2sgKGluIGNhc2UgZHVyYXRpb24gaXMgYWxyZWFkeSBzZXQgdG8gYSBsb3cgdmFsdWUpLlxyXG5cdFx0XHRcdFx0XHRcdFx0IFRoZSBlbmQgcmVzdWx0IGlzIGEgYmFzZWxpbmUgb2YgNzUlIG9mIHRoZSByZWRpcmVjdCdzIGR1cmF0aW9uIHRoYXQgaW5jcmVhc2VzL2RlY3JlYXNlcyBhcyB0aGUgZW5kIG9mIHRoZSBlbGVtZW50IHNldCBpcyBhcHByb2FjaGVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0b3B0cy5kdXJhdGlvbiA9IE1hdGgubWF4KG9wdHMuZHVyYXRpb24gKiAob3B0cy5iYWNrd2FyZHMgPyAxIC0gZWxlbWVudEluZGV4IC8gZWxlbWVudHNMZW5ndGggOiAoZWxlbWVudEluZGV4ICsgMSkgLyBlbGVtZW50c0xlbmd0aCksIG9wdHMuZHVyYXRpb24gKiAwLjc1LCAyMDApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogUGFzcyBpbiB0aGUgY2FsbCdzIG9wdHMgb2JqZWN0IHNvIHRoYXQgdGhlIHJlZGlyZWN0IGNhbiBvcHRpb25hbGx5IGV4dGVuZCBpdC4gSXQgZGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0IGluc3RlYWQgb2YgbnVsbCB0b1xyXG5cdFx0XHRcdFx0XHRcdCByZWR1Y2UgdGhlIG9wdHMgY2hlY2tpbmcgbG9naWMgcmVxdWlyZWQgaW5zaWRlIHRoZSByZWRpcmVjdC4gKi9cclxuXHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5SZWRpcmVjdHNbcHJvcGVydGllc01hcF0uY2FsbChlbGVtZW50LCBlbGVtZW50LCBvcHRzIHx8IHt9LCBlbGVtZW50SW5kZXgsIGVsZW1lbnRzTGVuZ3RoLCBlbGVtZW50cywgcHJvbWlzZURhdGEucHJvbWlzZSA/IHByb21pc2VEYXRhIDogdW5kZWZpbmVkKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTaW5jZSB0aGUgYW5pbWF0aW9uIGxvZ2ljIHJlc2lkZXMgd2l0aGluIHRoZSByZWRpcmVjdCdzIG93biBjb2RlLCBhYm9ydCB0aGUgcmVtYWluZGVyIG9mIHRoaXMgY2FsbC5cclxuXHRcdFx0XHRcdFx0IChUaGUgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgdXAgdG8gdGhpcyBwb2ludCBpcyB2aXJ0dWFsbHkgbm9uLWV4aXN0YW50LikgKi9cclxuXHRcdFx0XHRcdFx0LyogTm90ZTogVGhlIGpRdWVyeSBjYWxsIGNoYWluIGlzIGtlcHQgaW50YWN0IGJ5IHJldHVybmluZyB0aGUgY29tcGxldGUgZWxlbWVudCBzZXQuICovXHJcblx0XHRcdFx0XHRcdHJldHVybiBnZXRDaGFpbigpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dmFyIGFib3J0RXJyb3IgPSBcIlZlbG9jaXR5OiBGaXJzdCBhcmd1bWVudCAoXCIgKyBwcm9wZXJ0aWVzTWFwICsgXCIpIHdhcyBub3QgYSBwcm9wZXJ0eSBtYXAsIGEga25vd24gYWN0aW9uLCBvciBhIHJlZ2lzdGVyZWQgcmVkaXJlY3QuIEFib3J0aW5nLlwiO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKHByb21pc2VEYXRhLnByb21pc2UpIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9taXNlRGF0YS5yZWplY3RlcihuZXcgRXJyb3IoYWJvcnRFcnJvcikpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHdpbmRvdy5jb25zb2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coYWJvcnRFcnJvcik7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBnZXRDaGFpbigpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IENhbGwtV2lkZSBWYXJpYWJsZXNcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogQSBjb250YWluZXIgZm9yIENTUyB1bml0IGNvbnZlcnNpb24gcmF0aW9zIChlLmcuICUsIHJlbSwgYW5kIGVtID09PiBweCkgdGhhdCBpcyB1c2VkIHRvIGNhY2hlIHJhdGlvcyBhY3Jvc3MgYWxsIGVsZW1lbnRzXHJcblx0XHRcdCBiZWluZyBhbmltYXRlZCBpbiBhIHNpbmdsZSBWZWxvY2l0eSBjYWxsLiBDYWxjdWxhdGluZyB1bml0IHJhdGlvcyBuZWNlc3NpdGF0ZXMgRE9NIHF1ZXJ5aW5nIGFuZCB1cGRhdGluZywgYW5kIGlzIHRoZXJlZm9yZVxyXG5cdFx0XHQgYXZvaWRlZCAodmlhIGNhY2hpbmcpIHdoZXJldmVyIHBvc3NpYmxlLiBUaGlzIGNvbnRhaW5lciBpcyBjYWxsLXdpZGUgaW5zdGVhZCBvZiBwYWdlLXdpZGUgdG8gYXZvaWQgdGhlIHJpc2sgb2YgdXNpbmcgc3RhbGVcclxuXHRcdFx0IGNvbnZlcnNpb24gbWV0cmljcyBhY3Jvc3MgVmVsb2NpdHkgYW5pbWF0aW9ucyB0aGF0IGFyZSBub3QgaW1tZWRpYXRlbHkgY29uc2VjdXRpdmVseSBjaGFpbmVkLiAqL1xyXG5cdFx0XHR2YXIgY2FsbFVuaXRDb252ZXJzaW9uRGF0YSA9IHtcclxuXHRcdFx0XHRsYXN0UGFyZW50OiBudWxsLFxyXG5cdFx0XHRcdGxhc3RQb3NpdGlvbjogbnVsbCxcclxuXHRcdFx0XHRsYXN0Rm9udFNpemU6IG51bGwsXHJcblx0XHRcdFx0bGFzdFBlcmNlbnRUb1B4V2lkdGg6IG51bGwsXHJcblx0XHRcdFx0bGFzdFBlcmNlbnRUb1B4SGVpZ2h0OiBudWxsLFxyXG5cdFx0XHRcdGxhc3RFbVRvUHg6IG51bGwsXHJcblx0XHRcdFx0cmVtVG9QeDogbnVsbCxcclxuXHRcdFx0XHR2d1RvUHg6IG51bGwsXHJcblx0XHRcdFx0dmhUb1B4OiBudWxsXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvKiBBIGNvbnRhaW5lciBmb3IgYWxsIHRoZSBlbnN1aW5nIHR3ZWVuIGRhdGEgYW5kIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhbGwuIFRoaXMgY29udGFpbmVyIGdldHMgcHVzaGVkIHRvIHRoZSBwYWdlLXdpZGVcclxuXHRcdFx0IFZlbG9jaXR5LlN0YXRlLmNhbGxzIGFycmF5IHRoYXQgaXMgcHJvY2Vzc2VkIGR1cmluZyBhbmltYXRpb24gdGlja2luZy4gKi9cclxuXHRcdFx0dmFyIGNhbGwgPSBbXTtcclxuXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IEVsZW1lbnQgUHJvY2Vzc2luZ1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogRWxlbWVudCBwcm9jZXNzaW5nIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIC0tIGRhdGEgcHJvY2Vzc2luZyB0aGF0IGNhbm5vdCBnbyBzdGFsZSBhbmQgZGF0YSBwcm9jZXNzaW5nIHRoYXQgKmNhbiogZ28gc3RhbGUgKGkuZS4gdGhpcmQtcGFydHkgc3R5bGUgbW9kaWZpY2F0aW9ucyk6XHJcblx0XHRcdCAxKSBQcmUtUXVldWVpbmc6IEVsZW1lbnQtd2lkZSB2YXJpYWJsZXMsIGluY2x1ZGluZyB0aGUgZWxlbWVudCdzIGRhdGEgc3RvcmFnZSwgYXJlIGluc3RhbnRpYXRlZC4gQ2FsbCBvcHRpb25zIGFyZSBwcmVwYXJlZC4gSWYgdHJpZ2dlcmVkLCB0aGUgU3RvcCBhY3Rpb24gaXMgZXhlY3V0ZWQuXHJcblx0XHRcdCAyKSBRdWV1ZWluZzogVGhlIGxvZ2ljIHRoYXQgcnVucyBvbmNlIHRoaXMgY2FsbCBoYXMgcmVhY2hlZCBpdHMgcG9pbnQgb2YgZXhlY3V0aW9uIGluIHRoZSBlbGVtZW50J3MgJC5xdWV1ZSgpIHN0YWNrLiBNb3N0IGxvZ2ljIGlzIHBsYWNlZCBoZXJlIHRvIGF2b2lkIHJpc2tpbmcgaXQgYmVjb21pbmcgc3RhbGUuXHJcblx0XHRcdCAzKSBQdXNoaW5nOiBDb25zb2xpZGF0aW9uIG9mIHRoZSB0d2VlbiBkYXRhIGZvbGxvd2VkIGJ5IGl0cyBwdXNoIG9udG8gdGhlIGdsb2JhbCBpbi1wcm9ncmVzcyBjYWxscyBjb250YWluZXIuXHJcblx0XHRcdCBgZWxlbWVudEFycmF5SW5kZXhgIGFsbG93cyBwYXNzaW5nIGluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCBhcnJheSB0byB2YWx1ZSBmdW5jdGlvbnMuXHJcblx0XHRcdCBJZiBgZWxlbWVudHNJbmRleGAgd2VyZSB1c2VkIGluc3RlYWQgdGhlIGluZGV4IHdvdWxkIGJlIGRldGVybWluZWQgYnkgdGhlIGVsZW1lbnRzJyBwZXItZWxlbWVudCBxdWV1ZS5cclxuXHRcdFx0ICovXHJcblx0XHRcdGZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnRBcnJheUluZGV4KSB7XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IFBhcnQgSTogUHJlLVF1ZXVlaW5nXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgRWxlbWVudC1XaWRlIFZhcmlhYmxlc1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdHZhciAvKiBUaGUgcnVudGltZSBvcHRzIG9iamVjdCBpcyB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBjdXJyZW50IGNhbGwncyBvcHRpb25zIGFuZCBWZWxvY2l0eSdzIHBhZ2Utd2lkZSBvcHRpb24gZGVmYXVsdHMuICovXHJcblx0XHRcdFx0XHRcdG9wdHMgPSAkLmV4dGVuZCh7fSwgVmVsb2NpdHkuZGVmYXVsdHMsIG9wdGlvbnMpLFxyXG5cdFx0XHRcdFx0XHQvKiBBIGNvbnRhaW5lciBmb3IgdGhlIHByb2Nlc3NlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHByb3BlcnR5IGluIHRoZSBwcm9wZXJ0eU1hcC5cclxuXHRcdFx0XHRcdFx0IChFYWNoIHByb3BlcnR5IGluIHRoZSBtYXAgcHJvZHVjZXMgaXRzIG93biBcInR3ZWVuXCIuKSAqL1xyXG5cdFx0XHRcdFx0XHR0d2VlbnNDb250YWluZXIgPSB7fSxcclxuXHRcdFx0XHRcdFx0ZWxlbWVudFVuaXRDb252ZXJzaW9uRGF0YTtcclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBFbGVtZW50IEluaXRcclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRWZWxvY2l0eS5pbml0KGVsZW1lbnQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IERlbGF5XHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogU2luY2UgcXVldWU6ZmFsc2UgZG9lc24ndCByZXNwZWN0IHRoZSBpdGVtJ3MgZXhpc3RpbmcgcXVldWUsIHdlIGF2b2lkIGluamVjdGluZyBpdHMgZGVsYXkgaGVyZSAoaXQncyBzZXQgbGF0ZXIgb24pLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IFZlbG9jaXR5IHJvbGxzIGl0cyBvd24gZGVsYXkgZnVuY3Rpb24gc2luY2UgalF1ZXJ5IGRvZXNuJ3QgaGF2ZSBhIHV0aWxpdHkgYWxpYXMgZm9yICQuZm4uZGVsYXkoKVxyXG5cdFx0XHRcdCAoYW5kIHRodXMgcmVxdWlyZXMgalF1ZXJ5IGVsZW1lbnQgY3JlYXRpb24sIHdoaWNoIHdlIGF2b2lkIHNpbmNlIGl0cyBvdmVyaGVhZCBpbmNsdWRlcyBET00gcXVlcnlpbmcpLiAqL1xyXG5cdFx0XHRcdGlmIChwYXJzZUZsb2F0KG9wdHMuZGVsYXkpICYmIG9wdHMucXVldWUgIT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHQkLnF1ZXVlKGVsZW1lbnQsIG9wdHMucXVldWUsIGZ1bmN0aW9uKG5leHQsIGNsZWFyUXVldWUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGNsZWFyUXVldWUgPT09IHRydWUpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBEbyBub3QgY29udGludWUgd2l0aCBhbmltYXRpb24gcXVldWVpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIFRoaXMgaXMgYSBmbGFnIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlIHVwY29taW5nIGNvbXBsZXRlQ2FsbCgpIGZ1bmN0aW9uIHRoYXQgdGhpcyBxdWV1ZSBlbnRyeSB3YXMgaW5pdGlhdGVkIGJ5IFZlbG9jaXR5LiBTZWUgY29tcGxldGVDYWxsKCkgZm9yIGZ1cnRoZXIgZGV0YWlscy4gKi9cclxuXHRcdFx0XHRcdFx0VmVsb2NpdHkudmVsb2NpdHlRdWV1ZUVudHJ5RmxhZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUaGUgZW5zdWluZyBxdWV1ZSBpdGVtICh3aGljaCBpcyBhc3NpZ25lZCB0byB0aGUgXCJuZXh0XCIgYXJndW1lbnQgdGhhdCAkLnF1ZXVlKCkgYXV0b21hdGljYWxseSBwYXNzZXMgaW4pIHdpbGwgYmUgdHJpZ2dlcmVkIGFmdGVyIGEgc2V0VGltZW91dCBkZWxheS5cclxuXHRcdFx0XHRcdFx0IFRoZSBzZXRUaW1lb3V0IGlzIHN0b3JlZCBzbyB0aGF0IGl0IGNhbiBiZSBzdWJqZWN0ZWQgdG8gY2xlYXJUaW1lb3V0KCkgaWYgdGhpcyBhbmltYXRpb24gaXMgcHJlbWF0dXJlbHkgc3RvcHBlZCB2aWEgVmVsb2NpdHkncyBcInN0b3BcIiBjb21tYW5kLCBhbmRcclxuXHRcdFx0XHRcdFx0IGRlbGF5QmVnaW4vZGVsYXlUaW1lIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGNhbiBcInBhdXNlXCIgYW5kIFwicmVzdW1lXCIgYSB0d2VlbiB0aGF0IGlzIHN0aWxsIG1pZC1kZWxheS4gKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIFRlbXBvcmFyaWx5IHN0b3JlIGRlbGF5ZWQgZWxlbWVudHMgdG8gZmFjaWxpdGUgYWNjZXNzIGZvciBnbG9iYWwgcGF1c2UvcmVzdW1lICovXHJcblx0XHRcdFx0XHRcdHZhciBjYWxsSW5kZXggPSBWZWxvY2l0eS5TdGF0ZS5kZWxheWVkRWxlbWVudHMuY291bnQrKztcclxuXHRcdFx0XHRcdFx0VmVsb2NpdHkuU3RhdGUuZGVsYXllZEVsZW1lbnRzW2NhbGxJbmRleF0gPSBlbGVtZW50O1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGRlbGF5Q29tcGxldGUgPSAoZnVuY3Rpb24oaW5kZXgpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBDbGVhciB0aGUgdGVtcG9yYXJ5IGVsZW1lbnQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmRlbGF5ZWRFbGVtZW50c1tpbmRleF0gPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBGaW5hbGx5LCBpc3N1ZSB0aGUgY2FsbCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0bmV4dCgpO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH0pKGNhbGxJbmRleCk7XHJcblxyXG5cclxuXHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS5kZWxheUJlZ2luID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcclxuXHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS5kZWxheSA9IHBhcnNlRmxvYXQob3B0cy5kZWxheSk7XHJcblx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkuZGVsYXlUaW1lciA9IHtcclxuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0OiBzZXRUaW1lb3V0KG5leHQsIHBhcnNlRmxvYXQob3B0cy5kZWxheSkpLFxyXG5cdFx0XHRcdFx0XHRcdG5leHQ6IGRlbGF5Q29tcGxldGVcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IER1cmF0aW9uXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogU3VwcG9ydCBmb3IgalF1ZXJ5J3MgbmFtZWQgZHVyYXRpb25zLiAqL1xyXG5cdFx0XHRcdHN3aXRjaCAob3B0cy5kdXJhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuXHRcdFx0XHRcdGNhc2UgXCJmYXN0XCI6XHJcblx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSAyMDA7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgXCJub3JtYWxcIjpcclxuXHRcdFx0XHRcdFx0b3B0cy5kdXJhdGlvbiA9IERVUkFUSU9OX0RFRkFVTFQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgXCJzbG93XCI6XHJcblx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSA2MDA7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdC8qIFJlbW92ZSB0aGUgcG90ZW50aWFsIFwibXNcIiBzdWZmaXggYW5kIGRlZmF1bHQgdG8gMSBpZiB0aGUgdXNlciBpcyBhdHRlbXB0aW5nIHRvIHNldCBhIGR1cmF0aW9uIG9mIDAgKGluIG9yZGVyIHRvIHByb2R1Y2UgYW4gaW1tZWRpYXRlIHN0eWxlIGNoYW5nZSkuICovXHJcblx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSBwYXJzZUZsb2F0KG9wdHMuZHVyYXRpb24pIHx8IDE7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IEdsb2JhbCBPcHRpb246IE1vY2tcclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRpZiAoVmVsb2NpdHkubW9jayAhPT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdC8qIEluIG1vY2sgbW9kZSwgYWxsIGFuaW1hdGlvbnMgYXJlIGZvcmNlZCB0byAxbXMgc28gdGhhdCB0aGV5IG9jY3VyIGltbWVkaWF0ZWx5IHVwb24gdGhlIG5leHQgckFGIHRpY2suXHJcblx0XHRcdFx0XHQgQWx0ZXJuYXRpdmVseSwgYSBtdWx0aXBsaWVyIGNhbiBiZSBwYXNzZWQgaW4gdG8gdGltZSByZW1hcCBhbGwgZGVsYXlzIGFuZCBkdXJhdGlvbnMuICovXHJcblx0XHRcdFx0XHRpZiAoVmVsb2NpdHkubW9jayA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0XHRvcHRzLmR1cmF0aW9uID0gb3B0cy5kZWxheSA9IDE7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRvcHRzLmR1cmF0aW9uICo9IHBhcnNlRmxvYXQoVmVsb2NpdHkubW9jaykgfHwgMTtcclxuXHRcdFx0XHRcdFx0b3B0cy5kZWxheSAqPSBwYXJzZUZsb2F0KFZlbG9jaXR5Lm1vY2spIHx8IDE7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IEVhc2luZ1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRvcHRzLmVhc2luZyA9IGdldEVhc2luZyhvcHRzLmVhc2luZywgb3B0cy5kdXJhdGlvbik7XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IE9wdGlvbjogQ2FsbGJhY2tzXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIENhbGxiYWNrcyBtdXN0IGZ1bmN0aW9ucy4gT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIG51bGwuICovXHJcblx0XHRcdFx0aWYgKG9wdHMuYmVnaW4gJiYgIVR5cGUuaXNGdW5jdGlvbihvcHRzLmJlZ2luKSkge1xyXG5cdFx0XHRcdFx0b3B0cy5iZWdpbiA9IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAob3B0cy5wcm9ncmVzcyAmJiAhVHlwZS5pc0Z1bmN0aW9uKG9wdHMucHJvZ3Jlc3MpKSB7XHJcblx0XHRcdFx0XHRvcHRzLnByb2dyZXNzID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChvcHRzLmNvbXBsZXRlICYmICFUeXBlLmlzRnVuY3Rpb24ob3B0cy5jb21wbGV0ZSkpIHtcclxuXHRcdFx0XHRcdG9wdHMuY29tcGxldGUgPSBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IERpc3BsYXkgJiBWaXNpYmlsaXR5XHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogUmVmZXIgdG8gVmVsb2NpdHkncyBkb2N1bWVudGF0aW9uIChWZWxvY2l0eUpTLm9yZy8jZGlzcGxheUFuZFZpc2liaWxpdHkpIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkaXNwbGF5IGFuZCB2aXNpYmlsaXR5IG9wdGlvbnMnIGJlaGF2aW9yLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IFdlIHN0cmljdGx5IGNoZWNrIGZvciB1bmRlZmluZWQgaW5zdGVhZCBvZiBmYWxzaW5lc3MgYmVjYXVzZSBkaXNwbGF5IGFjY2VwdHMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLiAqL1xyXG5cdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLmRpc3BsYXkgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdG9wdHMuZGlzcGxheSA9IG9wdHMuZGlzcGxheS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG5cdFx0XHRcdFx0LyogVXNlcnMgY2FuIHBhc3MgaW4gYSBzcGVjaWFsIFwiYXV0b1wiIHZhbHVlIHRvIGluc3RydWN0IFZlbG9jaXR5IHRvIHNldCB0aGUgZWxlbWVudCB0byBpdHMgZGVmYXVsdCBkaXNwbGF5IHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSA9PT0gXCJhdXRvXCIpIHtcclxuXHRcdFx0XHRcdFx0b3B0cy5kaXNwbGF5ID0gVmVsb2NpdHkuQ1NTLlZhbHVlcy5nZXREaXNwbGF5VHlwZShlbGVtZW50KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChvcHRzLnZpc2liaWxpdHkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLnZpc2liaWxpdHkgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdG9wdHMudmlzaWJpbGl0eSA9IG9wdHMudmlzaWJpbGl0eS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IG1vYmlsZUhBXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIFdoZW4gc2V0IHRvIHRydWUsIGFuZCBpZiB0aGlzIGlzIGEgbW9iaWxlIGRldmljZSwgbW9iaWxlSEEgYXV0b21hdGljYWxseSBlbmFibGVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiAodmlhIGEgbnVsbCB0cmFuc2Zvcm0gaGFjaylcclxuXHRcdFx0XHQgb24gYW5pbWF0aW5nIGVsZW1lbnRzLiBIQSBpcyByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQgYXQgdGhlIGNvbXBsZXRpb24gb2YgaXRzIGFuaW1hdGlvbi4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBBbmRyb2lkIEdpbmdlcmJyZWFkIGRvZXNuJ3Qgc3VwcG9ydCBIQS4gSWYgYSBudWxsIHRyYW5zZm9ybSBoYWNrIChtb2JpbGVIQSkgaXMgaW4gZmFjdCBzZXQsIGl0IHdpbGwgcHJldmVudCBvdGhlciB0cmFuZm9ybSBzdWJwcm9wZXJ0aWVzIGZyb20gdGFraW5nIGVmZmVjdC4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCB0aGUgdXNlIG9mIG1vYmlsZUhBIGluIFZlbG9jaXR5J3MgZG9jdW1lbnRhdGlvbjogVmVsb2NpdHlKUy5vcmcvI21vYmlsZUhBLiAqL1xyXG5cdFx0XHRcdG9wdHMubW9iaWxlSEEgPSAob3B0cy5tb2JpbGVIQSAmJiBWZWxvY2l0eS5TdGF0ZS5pc01vYmlsZSAmJiAhVmVsb2NpdHkuU3RhdGUuaXNHaW5nZXJicmVhZCk7XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBQYXJ0IElJOiBRdWV1ZWluZ1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogV2hlbiBhIHNldCBvZiBlbGVtZW50cyBpcyB0YXJnZXRlZCBieSBhIFZlbG9jaXR5IGNhbGwsIHRoZSBzZXQgaXMgYnJva2VuIHVwIGFuZCBlYWNoIGVsZW1lbnQgaGFzIHRoZSBjdXJyZW50IFZlbG9jaXR5IGNhbGwgaW5kaXZpZHVhbGx5IHF1ZXVlZCBvbnRvIGl0LlxyXG5cdFx0XHRcdCBJbiB0aGlzIHdheSwgZWFjaCBlbGVtZW50J3MgZXhpc3RpbmcgcXVldWUgaXMgcmVzcGVjdGVkOyBzb21lIGVsZW1lbnRzIG1heSBhbHJlYWR5IGJlIGFuaW1hdGluZyBhbmQgYWNjb3JkaW5nbHkgc2hvdWxkIG5vdCBoYXZlIHRoaXMgY3VycmVudCBWZWxvY2l0eSBjYWxsIHRyaWdnZXJlZCBpbW1lZGlhdGVseS4gKi9cclxuXHRcdFx0XHQvKiBJbiBlYWNoIHF1ZXVlLCB0d2VlbiBkYXRhIGlzIHByb2Nlc3NlZCBmb3IgZWFjaCBhbmltYXRpbmcgcHJvcGVydHkgdGhlbiBwdXNoZWQgb250byB0aGUgY2FsbC13aWRlIGNhbGxzIGFycmF5LiBXaGVuIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHNldCBoYXMgaGFkIGl0cyB0d2VlbnMgcHJvY2Vzc2VkLFxyXG5cdFx0XHRcdCB0aGUgY2FsbCBhcnJheSBpcyBwdXNoZWQgdG8gVmVsb2NpdHkuU3RhdGUuY2FsbHMgZm9yIGxpdmUgcHJvY2Vzc2luZyBieSB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRpY2suICovXHJcblx0XHRcdFx0ZnVuY3Rpb24gYnVpbGRRdWV1ZShuZXh0KSB7XHJcblx0XHRcdFx0XHR2YXIgZGF0YSwgbGFzdFR3ZWVuc0NvbnRhaW5lcjtcclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IE9wdGlvbjogQmVnaW5cclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIFRoZSBiZWdpbiBjYWxsYmFjayBpcyBmaXJlZCBvbmNlIHBlciBjYWxsIC0tIG5vdCBvbmNlIHBlciBlbGVtZW5ldCAtLSBhbmQgaXMgcGFzc2VkIHRoZSBmdWxsIHJhdyBET00gZWxlbWVudCBzZXQgYXMgYm90aCBpdHMgY29udGV4dCBhbmQgaXRzIGZpcnN0IGFyZ3VtZW50LiAqL1xyXG5cdFx0XHRcdFx0aWYgKG9wdHMuYmVnaW4gJiYgZWxlbWVudHNJbmRleCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0XHQvKiBXZSB0aHJvdyBjYWxsYmFja3MgaW4gYSBzZXRUaW1lb3V0IHNvIHRoYXQgdGhyb3duIGVycm9ycyBkb24ndCBoYWx0IHRoZSBleGVjdXRpb24gb2YgVmVsb2NpdHkgaXRzZWxmLiAqL1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdG9wdHMuYmVnaW4uY2FsbChlbGVtZW50cywgZWxlbWVudHMpO1xyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcclxuXHRcdFx0XHRcdFx0XHR9LCAxKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IFR3ZWVuIERhdGEgQ29uc3RydWN0aW9uIChmb3IgU2Nyb2xsKVxyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIE5vdGU6IEluIG9yZGVyIHRvIGJlIHN1YmplY3RlZCB0byBjaGFpbmluZyBhbmQgYW5pbWF0aW9uIG9wdGlvbnMsIHNjcm9sbCdzIHR3ZWVuaW5nIGlzIHJvdXRlZCB0aHJvdWdoIFZlbG9jaXR5IGFzIGlmIGl0IHdlcmUgYSBzdGFuZGFyZCBDU1MgcHJvcGVydHkgYW5pbWF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJzY3JvbGxcIikge1xyXG5cdFx0XHRcdFx0XHQvKiBUaGUgc2Nyb2xsIGFjdGlvbiB1bmlxdWVseSB0YWtlcyBhbiBvcHRpb25hbCBcIm9mZnNldFwiIG9wdGlvbiAtLSBzcGVjaWZpZWQgaW4gcGl4ZWxzIC0tIHRoYXQgb2Zmc2V0cyB0aGUgdGFyZ2V0ZWQgc2Nyb2xsIHBvc2l0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgc2Nyb2xsRGlyZWN0aW9uID0gKC9eeCQvaS50ZXN0KG9wdHMuYXhpcykgPyBcIkxlZnRcIiA6IFwiVG9wXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2Nyb2xsT2Zmc2V0ID0gcGFyc2VGbG9hdChvcHRzLm9mZnNldCkgfHwgMCxcclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uQ3VycmVudCxcclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uQ3VycmVudEFsdGVybmF0ZSxcclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uRW5kO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogU2Nyb2xsIGFsc28gdW5pcXVlbHkgdGFrZXMgYW4gb3B0aW9uYWwgXCJjb250YWluZXJcIiBvcHRpb24sIHdoaWNoIGluZGljYXRlcyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgc2Nyb2xsZWQgLS1cclxuXHRcdFx0XHRcdFx0IGFzIG9wcG9zZWQgdG8gdGhlIGJyb3dzZXIgd2luZG93IGl0c2VsZi4gVGhpcyBpcyB1c2VmdWwgZm9yIHNjcm9sbGluZyB0b3dhcmQgYW4gZWxlbWVudCB0aGF0J3MgaW5zaWRlIGFuIG92ZXJmbG93aW5nIHBhcmVudCBlbGVtZW50LiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAob3B0cy5jb250YWluZXIpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBFbnN1cmUgdGhhdCBlaXRoZXIgYSBqUXVlcnkgb2JqZWN0IG9yIGEgcmF3IERPTSBlbGVtZW50IHdhcyBwYXNzZWQgaW4uICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFR5cGUuaXNXcmFwcGVkKG9wdHMuY29udGFpbmVyKSB8fCBUeXBlLmlzTm9kZShvcHRzLmNvbnRhaW5lcikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEV4dHJhY3QgdGhlIHJhdyBET00gZWxlbWVudCBmcm9tIHRoZSBqUXVlcnkgd3JhcHBlci4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdG9wdHMuY29udGFpbmVyID0gb3B0cy5jb250YWluZXJbMF0gfHwgb3B0cy5jb250YWluZXI7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBVbmxpa2Ugb3RoZXIgcHJvcGVydGllcyBpbiBWZWxvY2l0eSwgdGhlIGJyb3dzZXIncyBzY3JvbGwgcG9zaXRpb24gaXMgbmV2ZXIgY2FjaGVkIHNpbmNlIGl0IHNvIGZyZXF1ZW50bHkgY2hhbmdlc1xyXG5cdFx0XHRcdFx0XHRcdFx0IChkdWUgdG8gdGhlIHVzZXIncyBuYXR1cmFsIGludGVyYWN0aW9uIHdpdGggdGhlIHBhZ2UpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0c2Nyb2xsUG9zaXRpb25DdXJyZW50ID0gb3B0cy5jb250YWluZXJbXCJzY3JvbGxcIiArIHNjcm9sbERpcmVjdGlvbl07IC8qIEdFVCAqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qICQucG9zaXRpb24oKSB2YWx1ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIncyBjdXJyZW50bHkgdmlld2FibGUgYXJlYSAod2l0aG91dCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBjb250YWluZXIncyB0cnVlIGRpbWVuc2lvbnNcclxuXHRcdFx0XHRcdFx0XHRcdCAtLSBzYXksIGZvciBleGFtcGxlLCBpZiB0aGUgY29udGFpbmVyIHdhcyBub3Qgb3ZlcmZsb3dpbmcpLiBUaHVzLCB0aGUgc2Nyb2xsIGVuZCB2YWx1ZSBpcyB0aGUgc3VtIG9mIHRoZSBjaGlsZCBlbGVtZW50J3MgcG9zaXRpb24gKmFuZCpcclxuXHRcdFx0XHRcdFx0XHRcdCB0aGUgc2Nyb2xsIGNvbnRhaW5lcidzIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0c2Nyb2xsUG9zaXRpb25FbmQgPSAoc2Nyb2xsUG9zaXRpb25DdXJyZW50ICsgJChlbGVtZW50KS5wb3NpdGlvbigpW3Njcm9sbERpcmVjdGlvbi50b0xvd2VyQ2FzZSgpXSkgKyBzY3JvbGxPZmZzZXQ7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgYSB2YWx1ZSBvdGhlciB0aGFuIGEgalF1ZXJ5IG9iamVjdCBvciBhIHJhdyBET00gZWxlbWVudCB3YXMgcGFzc2VkIGluLCBkZWZhdWx0IHRvIG51bGwgc28gdGhhdCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRvcHRzLmNvbnRhaW5lciA9IG51bGw7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSB3aW5kb3cgaXRzZWxmIGlzIGJlaW5nIHNjcm9sbGVkIC0tIG5vdCBhIGNvbnRhaW5pbmcgZWxlbWVudCAtLSBwZXJmb3JtIGEgbGl2ZSBzY3JvbGwgcG9zaXRpb24gbG9va3VwIHVzaW5nXHJcblx0XHRcdFx0XHRcdFx0IHRoZSBhcHByb3ByaWF0ZSBjYWNoZWQgcHJvcGVydHkgbmFtZXMgKHdoaWNoIGRpZmZlciBiYXNlZCBvbiBicm93c2VyIHR5cGUpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uQ3VycmVudCA9IFZlbG9jaXR5LlN0YXRlLnNjcm9sbEFuY2hvcltWZWxvY2l0eS5TdGF0ZVtcInNjcm9sbFByb3BlcnR5XCIgKyBzY3JvbGxEaXJlY3Rpb25dXTsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0LyogV2hlbiBzY3JvbGxpbmcgdGhlIGJyb3dzZXIgd2luZG93LCBjYWNoZSB0aGUgYWx0ZXJuYXRlIGF4aXMncyBjdXJyZW50IHZhbHVlIHNpbmNlIHdpbmRvdy5zY3JvbGxUbygpIGRvZXNuJ3QgbGV0IHVzIGNoYW5nZSBvbmx5IG9uZSB2YWx1ZSBhdCBhIHRpbWUuICovXHJcblx0XHRcdFx0XHRcdFx0c2Nyb2xsUG9zaXRpb25DdXJyZW50QWx0ZXJuYXRlID0gVmVsb2NpdHkuU3RhdGUuc2Nyb2xsQW5jaG9yW1ZlbG9jaXR5LlN0YXRlW1wic2Nyb2xsUHJvcGVydHlcIiArIChzY3JvbGxEaXJlY3Rpb24gPT09IFwiTGVmdFwiID8gXCJUb3BcIiA6IFwiTGVmdFwiKV1dOyAvKiBHRVQgKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogVW5saWtlICQucG9zaXRpb24oKSwgJC5vZmZzZXQoKSB2YWx1ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBicm93c2VyIHdpbmRvdydzIHRydWUgZGltZW5zaW9ucyAtLSBub3QgbWVyZWx5IGl0cyBjdXJyZW50bHkgdmlld2FibGUgYXJlYSAtLVxyXG5cdFx0XHRcdFx0XHRcdCBhbmQgdGhlcmVmb3JlIGVuZCB2YWx1ZXMgZG8gbm90IG5lZWQgdG8gYmUgY29tcG91bmRlZCBvbnRvIGN1cnJlbnQgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uRW5kID0gJChlbGVtZW50KS5vZmZzZXQoKVtzY3JvbGxEaXJlY3Rpb24udG9Mb3dlckNhc2UoKV0gKyBzY3JvbGxPZmZzZXQ7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTaW5jZSB0aGVyZSdzIG9ubHkgb25lIGZvcm1hdCB0aGF0IHNjcm9sbCdzIGFzc29jaWF0ZWQgdHdlZW5zQ29udGFpbmVyIGNhbiB0YWtlLCB3ZSBjcmVhdGUgaXQgbWFudWFsbHkuICovXHJcblx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lciA9IHtcclxuXHRcdFx0XHRcdFx0XHRzY3JvbGw6IHtcclxuXHRcdFx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWU6IHNjcm9sbFBvc2l0aW9uQ3VycmVudCxcclxuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRWYWx1ZTogc2Nyb2xsUG9zaXRpb25DdXJyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWU6IHNjcm9sbFBvc2l0aW9uRW5kLFxyXG5cdFx0XHRcdFx0XHRcdFx0dW5pdFR5cGU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRlYXNpbmc6IG9wdHMuZWFzaW5nLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2Nyb2xsRGF0YToge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250YWluZXI6IG9wdHMuY29udGFpbmVyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRkaXJlY3Rpb246IHNjcm9sbERpcmVjdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdFx0YWx0ZXJuYXRlVmFsdWU6IHNjcm9sbFBvc2l0aW9uQ3VycmVudEFsdGVybmF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudDogZWxlbWVudFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coXCJ0d2VlbnNDb250YWluZXIgKHNjcm9sbCk6IFwiLCB0d2VlbnNDb250YWluZXIuc2Nyb2xsLCBlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHQgVHdlZW4gRGF0YSBDb25zdHJ1Y3Rpb24gKGZvciBSZXZlcnNlKVxyXG5cdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogUmV2ZXJzZSBhY3RzIGxpa2UgYSBcInN0YXJ0XCIgYWN0aW9uIGluIHRoYXQgYSBwcm9wZXJ0eSBtYXAgaXMgYW5pbWF0ZWQgdG93YXJkLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzXHJcblx0XHRcdFx0XHRcdCB0aGF0IHRoZSBwcm9wZXJ0eSBtYXAgdXNlZCBmb3IgcmV2ZXJzZSBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgbWFwIHVzZWQgaW4gdGhlIHByZXZpb3VzIGNhbGwuIFRodXMsIHdlIG1hbmlwdWxhdGVcclxuXHRcdFx0XHRcdFx0IHRoZSBwcmV2aW91cyBjYWxsIHRvIGNvbnN0cnVjdCBvdXIgbmV3IG1hcDogdXNlIHRoZSBwcmV2aW91cyBtYXAncyBlbmQgdmFsdWVzIGFzIG91ciBuZXcgbWFwJ3Mgc3RhcnQgdmFsdWVzLiBDb3B5IG92ZXIgYWxsIG90aGVyIGRhdGEuICovXHJcblx0XHRcdFx0XHRcdC8qIE5vdGU6IFJldmVyc2UgY2FuIGJlIGRpcmVjdGx5IGNhbGxlZCB2aWEgdGhlIFwicmV2ZXJzZVwiIHBhcmFtZXRlciwgb3IgaXQgY2FuIGJlIGluZGlyZWN0bHkgdHJpZ2dlcmVkIHZpYSB0aGUgbG9vcCBvcHRpb24uIChMb29wcyBhcmUgY29tcG9zZWQgb2YgbXVsdGlwbGUgcmV2ZXJzZXMuKSAqL1xyXG5cdFx0XHRcdFx0XHQvKiBOb3RlOiBSZXZlcnNlIGNhbGxzIGRvIG5vdCBuZWVkIHRvIGJlIGNvbnNlY3V0aXZlbHkgY2hhaW5lZCBvbnRvIGEgY3VycmVudGx5LWFuaW1hdGluZyBlbGVtZW50IGluIG9yZGVyIHRvIG9wZXJhdGUgb24gY2FjaGVkIHZhbHVlcztcclxuXHRcdFx0XHRcdFx0IHRoZXJlIGlzIG5vIGhhcm0gdG8gcmV2ZXJzZSBiZWluZyBjYWxsZWQgb24gYSBwb3RlbnRpYWxseSBzdGFsZSBkYXRhIGNhY2hlIHNpbmNlIHJldmVyc2UncyBiZWhhdmlvciBpcyBzaW1wbHkgZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHQgYXMgcmV2ZXJ0aW5nIHRvIHRoZSBlbGVtZW50J3MgdmFsdWVzIGFzIHRoZXkgd2VyZSBwcmlvciB0byB0aGUgcHJldmlvdXMgKlZlbG9jaXR5KiBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24gPT09IFwicmV2ZXJzZVwiKSB7XHJcblx0XHRcdFx0XHRcdGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogQWJvcnQgaWYgdGhlcmUgaXMgbm8gcHJpb3IgYW5pbWF0aW9uIGRhdGEgdG8gcmV2ZXJzZSB0by4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKCFkYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIWRhdGEudHdlZW5zQ29udGFpbmVyKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogRGVxdWV1ZSB0aGUgZWxlbWVudCBzbyB0aGF0IHRoaXMgcXVldWUgZW50cnkgcmVsZWFzZXMgaXRzZWxmIGltbWVkaWF0ZWx5LCBhbGxvd2luZyBzdWJzZXF1ZW50IHF1ZXVlIGVudHJpZXMgdG8gcnVuLiAqL1xyXG5cdFx0XHRcdFx0XHRcdCQuZGVxdWV1ZShlbGVtZW50LCBvcHRzLnF1ZXVlKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHQgT3B0aW9ucyBQYXJzaW5nXHJcblx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgdGhlIGVsZW1lbnQgd2FzIGhpZGRlbiB2aWEgdGhlIGRpc3BsYXkgb3B0aW9uIGluIHRoZSBwcmV2aW91cyBjYWxsLFxyXG5cdFx0XHRcdFx0XHRcdCByZXZlcnQgZGlzcGxheSB0byBcImF1dG9cIiBwcmlvciB0byByZXZlcnNhbCBzbyB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgYWdhaW4uICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKGRhdGEub3B0cy5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRzLmRpc3BsYXkgPSBcImF1dG9cIjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhLm9wdHMudmlzaWJpbGl0eSA9PT0gXCJoaWRkZW5cIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRzLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBsb29wIG9wdGlvbiB3YXMgc2V0IGluIHRoZSBwcmV2aW91cyBjYWxsLCBkaXNhYmxlIGl0IHNvIHRoYXQgXCJyZXZlcnNlXCIgY2FsbHMgYXJlbid0IHJlY3Vyc2l2ZWx5IGdlbmVyYXRlZC5cclxuXHRcdFx0XHRcdFx0XHQgRnVydGhlciwgcmVtb3ZlIHRoZSBwcmV2aW91cyBjYWxsJ3MgY2FsbGJhY2sgb3B0aW9uczsgdHlwaWNhbGx5LCB1c2VycyBkbyBub3Qgd2FudCB0aGVzZSB0byBiZSByZWZpcmVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGRhdGEub3B0cy5sb29wID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRzLmJlZ2luID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wdHMuY29tcGxldGUgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBTaW5jZSB3ZSdyZSBleHRlbmRpbmcgYW4gb3B0cyBvYmplY3QgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGV4dGVuZGVkIHdpdGggdGhlIGRlZmF1bHRzIG9wdGlvbnMgb2JqZWN0LFxyXG5cdFx0XHRcdFx0XHRcdCB3ZSByZW1vdmUgbm9uLWV4cGxpY2l0bHktZGVmaW5lZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGF1dG8tYXNzaWduZWQgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5lYXNpbmcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBvcHRzLmVhc2luZztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5kdXJhdGlvbikge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIG9wdHMuZHVyYXRpb247XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBUaGUgb3B0cyBvYmplY3QgdXNlZCBmb3IgcmV2ZXJzYWwgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBvcHRpb25zIG9iamVjdCBvcHRpb25hbGx5IHBhc3NlZCBpbnRvIHRoaXNcclxuXHRcdFx0XHRcdFx0XHQgcmV2ZXJzZSBjYWxsIHBsdXMgdGhlIG9wdGlvbnMgdXNlZCBpbiB0aGUgcHJldmlvdXMgVmVsb2NpdHkgY2FsbC4gKi9cclxuXHRcdFx0XHRcdFx0XHRvcHRzID0gJC5leHRlbmQoe30sIGRhdGEub3B0cywgb3B0cyk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFR3ZWVucyBDb250YWluZXIgUmVjb25zdHJ1Y3Rpb25cclxuXHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogQ3JlYXRlIGEgZGVlcHkgY29weSAoaW5kaWNhdGVkIHZpYSB0aGUgdHJ1ZSBmbGFnKSBvZiB0aGUgcHJldmlvdXMgY2FsbCdzIHR3ZWVuc0NvbnRhaW5lci4gKi9cclxuXHRcdFx0XHRcdFx0XHRsYXN0VHdlZW5zQ29udGFpbmVyID0gJC5leHRlbmQodHJ1ZSwge30sIGRhdGEgPyBkYXRhLnR3ZWVuc0NvbnRhaW5lciA6IG51bGwpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBNYW5pcHVsYXRlIHRoZSBwcmV2aW91cyB0d2VlbnNDb250YWluZXIgYnkgcmVwbGFjaW5nIGl0cyBlbmQgdmFsdWVzIGFuZCBjdXJyZW50VmFsdWVzIHdpdGggaXRzIHN0YXJ0IHZhbHVlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRmb3IgKHZhciBsYXN0VHdlZW4gaW4gbGFzdFR3ZWVuc0NvbnRhaW5lcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSW4gYWRkaXRpb24gdG8gdHdlZW4gZGF0YSwgdHdlZW5zQ29udGFpbmVycyBjb250YWluIGFuIGVsZW1lbnQgcHJvcGVydHkgdGhhdCB3ZSBpZ25vcmUgaGVyZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChsYXN0VHdlZW5zQ29udGFpbmVyLmhhc093blByb3BlcnR5KGxhc3RUd2VlbikgJiYgbGFzdFR3ZWVuICE9PSBcImVsZW1lbnRcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgbGFzdFN0YXJ0VmFsdWUgPSBsYXN0VHdlZW5zQ29udGFpbmVyW2xhc3RUd2Vlbl0uc3RhcnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxhc3RUd2VlbnNDb250YWluZXJbbGFzdFR3ZWVuXS5zdGFydFZhbHVlID0gbGFzdFR3ZWVuc0NvbnRhaW5lcltsYXN0VHdlZW5dLmN1cnJlbnRWYWx1ZSA9IGxhc3RUd2VlbnNDb250YWluZXJbbGFzdFR3ZWVuXS5lbmRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGFzdFR3ZWVuc0NvbnRhaW5lcltsYXN0VHdlZW5dLmVuZFZhbHVlID0gbGFzdFN0YXJ0VmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBFYXNpbmcgaXMgdGhlIG9ubHkgb3B0aW9uIHRoYXQgZW1iZWRzIGludG8gdGhlIGluZGl2aWR1YWwgdHdlZW4gZGF0YSAoc2luY2UgaXQgY2FuIGJlIGRlZmluZWQgb24gYSBwZXItcHJvcGVydHkgYmFzaXMpLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgQWNjb3JkaW5nbHksIGV2ZXJ5IHByb3BlcnR5J3MgZWFzaW5nIHZhbHVlIG11c3QgYmUgdXBkYXRlZCB3aGVuIGFuIG9wdGlvbnMgb2JqZWN0IGlzIHBhc3NlZCBpbiB3aXRoIGEgcmV2ZXJzZSBjYWxsLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgVGhlIHNpZGUgZWZmZWN0IG9mIHRoaXMgZXh0ZW5zaWJpbGl0eSBpcyB0aGF0IGFsbCBwZXItcHJvcGVydHkgZWFzaW5nIHZhbHVlcyBhcmUgZm9yY2VmdWxseSByZXNldCB0byB0aGUgbmV3IHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIVR5cGUuaXNFbXB0eU9iamVjdChvcHRpb25zKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhc3RUd2VlbnNDb250YWluZXJbbGFzdFR3ZWVuXS5lYXNpbmcgPSBvcHRzLmVhc2luZztcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coXCJyZXZlcnNlIHR3ZWVuc0NvbnRhaW5lciAoXCIgKyBsYXN0VHdlZW4gKyBcIik6IFwiICsgSlNPTi5zdHJpbmdpZnkobGFzdFR3ZWVuc0NvbnRhaW5lcltsYXN0VHdlZW5dKSwgZWxlbWVudCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lciA9IGxhc3RUd2VlbnNDb250YWluZXI7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHQgVHdlZW4gRGF0YSBDb25zdHJ1Y3Rpb24gKGZvciBTdGFydClcclxuXHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uID09PSBcInN0YXJ0XCIpIHtcclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdCBWYWx1ZSBUcmFuc2ZlcnJpbmdcclxuXHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGlzIHF1ZXVlIGVudHJ5IGZvbGxvd3MgYSBwcmV2aW91cyBWZWxvY2l0eS1pbml0aWF0ZWQgcXVldWUgZW50cnkgKmFuZCogaWYgdGhpcyBlbnRyeSB3YXMgY3JlYXRlZFxyXG5cdFx0XHRcdFx0XHQgd2hpbGUgdGhlIGVsZW1lbnQgd2FzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGFuaW1hdGVkIGJ5IFZlbG9jaXR5LCB0aGVuIHRoaXMgY3VycmVudCBjYWxsIGlzIHNhZmUgdG8gdXNlXHJcblx0XHRcdFx0XHRcdCB0aGUgZW5kIHZhbHVlcyBmcm9tIHRoZSBwcmlvciBjYWxsIGFzIGl0cyBzdGFydCB2YWx1ZXMuIFZlbG9jaXR5IGF0dGVtcHRzIHRvIHBlcmZvcm0gdGhpcyB2YWx1ZSB0cmFuc2ZlclxyXG5cdFx0XHRcdFx0XHQgcHJvY2VzcyB3aGVuZXZlciBwb3NzaWJsZSBpbiBvcmRlciB0byBhdm9pZCByZXF1ZXJ5aW5nIHRoZSBET00uICovXHJcblx0XHRcdFx0XHRcdC8qIElmIHZhbHVlcyBhcmVuJ3QgdHJhbnNmZXJyZWQgZnJvbSBhIHByaW9yIGNhbGwgYW5kIHN0YXJ0IHZhbHVlcyB3ZXJlIG5vdCBmb3JjZWZlZCBieSB0aGUgdXNlciAobW9yZSBvbiB0aGlzIGJlbG93KSxcclxuXHRcdFx0XHRcdFx0IHRoZW4gdGhlIERPTSBpcyBxdWVyaWVkIGZvciB0aGUgZWxlbWVudCdzIGN1cnJlbnQgdmFsdWVzIGFzIGEgbGFzdCByZXNvcnQuICovXHJcblx0XHRcdFx0XHRcdC8qIE5vdGU6IENvbnZlcnNlbHksIGFuaW1hdGlvbiByZXZlcnNhbCAoYW5kIGxvb3BpbmcpICphbHdheXMqIHBlcmZvcm0gaW50ZXItY2FsbCB2YWx1ZSB0cmFuc2ZlcnM7IHRoZXkgbmV2ZXIgcmVxdWVyeSB0aGUgRE9NLiAqL1xyXG5cclxuXHRcdFx0XHRcdFx0ZGF0YSA9IERhdGEoZWxlbWVudCk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUaGUgcGVyLWVsZW1lbnQgaXNBbmltYXRpbmcgZmxhZyBpcyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgaXQncyBzYWZlIChpLmUuIHRoZSBkYXRhIGlzbid0IHN0YWxlKVxyXG5cdFx0XHRcdFx0XHQgdG8gdHJhbnNmZXIgb3ZlciBlbmQgdmFsdWVzIHRvIHVzZSBhcyBzdGFydCB2YWx1ZXMuIElmIGl0J3Mgc2V0IHRvIHRydWUgYW5kIHRoZXJlIGlzIGEgcHJldmlvdXNcclxuXHRcdFx0XHRcdFx0IFZlbG9jaXR5IGNhbGwgdG8gcHVsbCB2YWx1ZXMgZnJvbSwgZG8gc28uICovXHJcblx0XHRcdFx0XHRcdGlmIChkYXRhICYmIGRhdGEudHdlZW5zQ29udGFpbmVyICYmIGRhdGEuaXNBbmltYXRpbmcgPT09IHRydWUpIHtcclxuXHRcdFx0XHRcdFx0XHRsYXN0VHdlZW5zQ29udGFpbmVyID0gZGF0YS50d2VlbnNDb250YWluZXI7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IFR3ZWVuIERhdGEgQ2FsY3VsYXRpb25cclxuXHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHByb3BlcnR5IGRhdGEgYW5kIGRlZmF1bHRzIGVuZFZhbHVlLCBlYXNpbmcsIGFuZCBzdGFydFZhbHVlIGFzIGFwcHJvcHJpYXRlLiAqL1xyXG5cdFx0XHRcdFx0XHQvKiBQcm9wZXJ0eSBtYXAgdmFsdWVzIGNhbiBlaXRoZXIgdGFrZSB0aGUgZm9ybSBvZiAxKSBhIHNpbmdsZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGVuZCB2YWx1ZSxcclxuXHRcdFx0XHRcdFx0IG9yIDIpIGFuIGFycmF5IGluIHRoZSBmb3JtIG9mIFsgZW5kVmFsdWUsIFssIGVhc2luZ10gWywgc3RhcnRWYWx1ZV0gXS5cclxuXHRcdFx0XHRcdFx0IFRoZSBvcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIgaXMgYSBmb3JjZWZlZCBzdGFydFZhbHVlIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBxdWVyeWluZyB0aGUgRE9NIGZvclxyXG5cdFx0XHRcdFx0XHQgdGhlIGVsZW1lbnQncyBjdXJyZW50IHZhbHVlLiBSZWFkIFZlbG9jaXR5J3MgZG9jbWVudGF0aW9uIHRvIGxlYXJuIG1vcmUgYWJvdXQgZm9yY2VmZWVkaW5nOiBWZWxvY2l0eUpTLm9yZy8jZm9yY2VmZWVkaW5nICovXHJcblx0XHRcdFx0XHRcdHZhciBwYXJzZVByb3BlcnR5VmFsdWUgPSBmdW5jdGlvbih2YWx1ZURhdGEsIHNraXBSZXNvbHZpbmdFYXNpbmcpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgZW5kVmFsdWUsIGVhc2luZywgc3RhcnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgd2UgaGF2ZSBhIGZ1bmN0aW9uIGFzIHRoZSBtYWluIGFyZ3VtZW50IHRoZW4gcmVzb2x2ZSBpdCBmaXJzdCwgaW4gY2FzZSBpdCByZXR1cm5zIGFuIGFycmF5IHRoYXQgbmVlZHMgdG8gYmUgc3BsaXQgKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc0Z1bmN0aW9uKHZhbHVlRGF0YSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IHZhbHVlRGF0YS5jYWxsKGVsZW1lbnQsIGVsZW1lbnRBcnJheUluZGV4LCBlbGVtZW50c0xlbmd0aCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBIYW5kbGUgdGhlIGFycmF5IGZvcm1hdCwgd2hpY2ggY2FuIGJlIHN0cnVjdHVyZWQgYXMgb25lIG9mIHRocmVlIHBvdGVudGlhbCBvdmVybG9hZHM6XHJcblx0XHRcdFx0XHRcdFx0IEEpIFsgZW5kVmFsdWUsIGVhc2luZywgc3RhcnRWYWx1ZSBdLCBCKSBbIGVuZFZhbHVlLCBlYXNpbmcgXSwgb3IgQykgWyBlbmRWYWx1ZSwgc3RhcnRWYWx1ZSBdICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFR5cGUuaXNBcnJheSh2YWx1ZURhdGEpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBlbmRWYWx1ZSBpcyBhbHdheXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5LiBEb24ndCBib3RoZXIgdmFsaWRhdGluZyBlbmRWYWx1ZSdzIHZhbHVlIG5vd1xyXG5cdFx0XHRcdFx0XHRcdFx0IHNpbmNlIHRoZSBlbnN1aW5nIHByb3BlcnR5IGN5Y2xpbmcgbG9naWMgZG9lcyB0aGF0LiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSB2YWx1ZURhdGFbMF07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogVHdvLWl0ZW0gYXJyYXkgZm9ybWF0OiBJZiB0aGUgc2Vjb25kIGl0ZW0gaXMgYSBudW1iZXIsIGZ1bmN0aW9uLCBvciBoZXggc3RyaW5nLCB0cmVhdCBpdCBhcyBhXHJcblx0XHRcdFx0XHRcdFx0XHQgc3RhcnQgdmFsdWUgc2luY2UgZWFzaW5ncyBjYW4gb25seSBiZSBub24taGV4IHN0cmluZ3Mgb3IgYXJyYXlzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCghVHlwZS5pc0FycmF5KHZhbHVlRGF0YVsxXSkgJiYgL15bXFxkLV0vLnRlc3QodmFsdWVEYXRhWzFdKSkgfHwgVHlwZS5pc0Z1bmN0aW9uKHZhbHVlRGF0YVsxXSkgfHwgQ1NTLlJlZ0V4LmlzSGV4LnRlc3QodmFsdWVEYXRhWzFdKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gdmFsdWVEYXRhWzFdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBUd28gb3IgdGhyZWUtaXRlbSBhcnJheTogSWYgdGhlIHNlY29uZCBpdGVtIGlzIGEgbm9uLWhleCBzdHJpbmcgZWFzaW5nIG5hbWUgb3IgYW4gYXJyYXksIHRyZWF0IGl0IGFzIGFuIGVhc2luZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoKFR5cGUuaXNTdHJpbmcodmFsdWVEYXRhWzFdKSAmJiAhQ1NTLlJlZ0V4LmlzSGV4LnRlc3QodmFsdWVEYXRhWzFdKSAmJiBWZWxvY2l0eS5FYXNpbmdzW3ZhbHVlRGF0YVsxXV0pIHx8IFR5cGUuaXNBcnJheSh2YWx1ZURhdGFbMV0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVhc2luZyA9IHNraXBSZXNvbHZpbmdFYXNpbmcgPyB2YWx1ZURhdGFbMV0gOiBnZXRFYXNpbmcodmFsdWVEYXRhWzFdLCBvcHRzLmR1cmF0aW9uKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIERvbid0IGJvdGhlciB2YWxpZGF0aW5nIHN0YXJ0VmFsdWUncyB2YWx1ZSBub3cgc2luY2UgdGhlIGVuc3VpbmcgcHJvcGVydHkgY3ljbGluZyBsb2dpYyBpbmhlcmVudGx5IGRvZXMgdGhhdC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IHZhbHVlRGF0YVsyXTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSB2YWx1ZURhdGFbMV0gfHwgdmFsdWVEYXRhWzJdO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSGFuZGxlIHRoZSBzaW5nbGUtdmFsdWUgZm9ybWF0LiAqL1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IHZhbHVlRGF0YTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIERlZmF1bHQgdG8gdGhlIGNhbGwncyBlYXNpbmcgaWYgYSBwZXItcHJvcGVydHkgZWFzaW5nIHR5cGUgd2FzIG5vdCBkZWZpbmVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmICghc2tpcFJlc29sdmluZ0Vhc2luZykge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWFzaW5nID0gZWFzaW5nIHx8IG9wdHMuZWFzaW5nO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgZnVuY3Rpb25zIHdlcmUgcGFzc2VkIGluIGFzIHZhbHVlcywgcGFzcyB0aGUgZnVuY3Rpb24gdGhlIGN1cnJlbnQgZWxlbWVudCBhcyBpdHMgY29udGV4dCxcclxuXHRcdFx0XHRcdFx0XHQgcGx1cyB0aGUgZWxlbWVudCdzIGluZGV4IGFuZCB0aGUgZWxlbWVudCBzZXQncyBzaXplIGFzIGFyZ3VtZW50cy4gVGhlbiwgYXNzaWduIHRoZSByZXR1cm5lZCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc0Z1bmN0aW9uKGVuZFZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBlbmRWYWx1ZS5jYWxsKGVsZW1lbnQsIGVsZW1lbnRBcnJheUluZGV4LCBlbGVtZW50c0xlbmd0aCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc0Z1bmN0aW9uKHN0YXJ0VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gc3RhcnRWYWx1ZS5jYWxsKGVsZW1lbnQsIGVsZW1lbnRBcnJheUluZGV4LCBlbGVtZW50c0xlbmd0aCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBBbGxvdyBzdGFydFZhbHVlIHRvIGJlIGxlZnQgYXMgdW5kZWZpbmVkIHRvIGluZGljYXRlIHRvIHRoZSBlbnN1aW5nIGNvZGUgdGhhdCBpdHMgdmFsdWUgd2FzIG5vdCBmb3JjZWZlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gW2VuZFZhbHVlIHx8IDAsIGVhc2luZywgc3RhcnRWYWx1ZV07XHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgZml4UHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZURhdGEpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJbiBjYXNlIHRoaXMgcHJvcGVydHkgaXMgYSBob29rLCB0aGVyZSBhcmUgY2lyY3Vtc3RhbmNlcyB3aGVyZSB3ZSB3aWxsIGludGVuZCB0byB3b3JrIG9uIHRoZSBob29rJ3Mgcm9vdCBwcm9wZXJ0eSBhbmQgbm90IHRoZSBob29rZWQgc3VicHJvcGVydHkuICovXHJcblx0XHRcdFx0XHRcdFx0dmFyIHJvb3RQcm9wZXJ0eSA9IENTUy5Ib29rcy5nZXRSb290KHByb3BlcnR5KSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogUGFyc2Ugb3V0IGVuZFZhbHVlLCBlYXNpbmcsIGFuZCBzdGFydFZhbHVlIGZyb20gdGhlIHByb3BlcnR5J3MgZGF0YS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSB2YWx1ZURhdGFbMF0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVhc2luZyA9IHZhbHVlRGF0YVsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IHZhbHVlRGF0YVsyXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybjtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFN0YXJ0IFZhbHVlIFNvdXJjaW5nXHJcblx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBPdGhlciB0aGFuIGZvciB0aGUgZHVtbXkgdHdlZW4gcHJvcGVydHksIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgYnJvd3NlciAoYW5kIGRvIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbm9ybWFsaXphdGlvbikgd2lsbFxyXG5cdFx0XHRcdFx0XHRcdCBpbmhlcmVudGx5IHByb2R1Y2Ugbm8gc3R5bGUgY2hhbmdlcyB3aGVuIHNldCwgc28gdGhleSBhcmUgc2tpcHBlZCBpbiBvcmRlciB0byBkZWNyZWFzZSBhbmltYXRpb24gdGljayBvdmVyaGVhZC5cclxuXHRcdFx0XHRcdFx0XHQgUHJvcGVydHkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkIHZpYSBwcmVmaXhDaGVjaygpLCB3aGljaCByZXR1cm5zIGEgZmFsc2UgZmxhZyB3aGVuIG5vIHN1cHBvcnRlZCBpcyBkZXRlY3RlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBTaW5jZSBTVkcgZWxlbWVudHMgaGF2ZSBzb21lIG9mIHRoZWlyIHByb3BlcnRpZXMgZGlyZWN0bHkgYXBwbGllZCBhcyBIVE1MIGF0dHJpYnV0ZXMsXHJcblx0XHRcdFx0XHRcdFx0IHRoZXJlIGlzIG5vIHdheSB0byBjaGVjayBmb3IgdGhlaXIgZXhwbGljaXQgYnJvd3NlciBzdXBwb3J0LCBhbmQgc28gd2Ugc2tpcCBza2lwIHRoaXMgY2hlY2sgZm9yIHRoZW0uICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKCghZGF0YSB8fCAhZGF0YS5pc1NWRykgJiYgcm9vdFByb3BlcnR5ICE9PSBcInR3ZWVuXCIgJiYgQ1NTLk5hbWVzLnByZWZpeENoZWNrKHJvb3RQcm9wZXJ0eSlbMV0gPT09IGZhbHNlICYmIENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW3Jvb3RQcm9wZXJ0eV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiU2tpcHBpbmcgW1wiICsgcm9vdFByb3BlcnR5ICsgXCJdIGR1ZSB0byBhIGxhY2sgb2YgYnJvd3NlciBzdXBwb3J0LlwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBkaXNwbGF5IG9wdGlvbiBpcyBiZWluZyBzZXQgdG8gYSBub24tXCJub25lXCIgKGUuZy4gXCJibG9ja1wiKSBhbmQgb3BhY2l0eSAoZmlsdGVyIG9uIElFPD04KSBpcyBiZWluZ1xyXG5cdFx0XHRcdFx0XHRcdCBhbmltYXRlZCB0byBhbiBlbmRWYWx1ZSBvZiBub24temVybywgdGhlIHVzZXIncyBpbnRlbnRpb24gaXMgdG8gZmFkZSBpbiBmcm9tIGludmlzaWJsZSwgdGh1cyB3ZSBmb3JjZWZlZWQgb3BhY2l0eVxyXG5cdFx0XHRcdFx0XHRcdCBhIHN0YXJ0VmFsdWUgb2YgMCBpZiBpdHMgc3RhcnRWYWx1ZSBoYXNuJ3QgYWxyZWFkeSBiZWVuIHNvdXJjZWQgYnkgdmFsdWUgdHJhbnNmZXJyaW5nIG9yIHByaW9yIGZvcmNlZmVlZGluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoKChvcHRzLmRpc3BsYXkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLmRpc3BsYXkgIT09IG51bGwgJiYgb3B0cy5kaXNwbGF5ICE9PSBcIm5vbmVcIikgfHwgKG9wdHMudmlzaWJpbGl0eSAhPT0gdW5kZWZpbmVkICYmIG9wdHMudmlzaWJpbGl0eSAhPT0gXCJoaWRkZW5cIikpICYmIC9vcGFjaXR5fGZpbHRlci8udGVzdChwcm9wZXJ0eSkgJiYgIXN0YXJ0VmFsdWUgJiYgZW5kVmFsdWUgIT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgdmFsdWVzIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBwcmV2aW91cyBWZWxvY2l0eSBjYWxsLCBleHRyYWN0IHRoZSBlbmRWYWx1ZSBhbmQgcm9vdFByb3BlcnR5VmFsdWVcclxuXHRcdFx0XHRcdFx0XHQgZm9yIGFsbCBvZiB0aGUgY3VycmVudCBjYWxsJ3MgcHJvcGVydGllcyB0aGF0IHdlcmUgKmFsc28qIGFuaW1hdGVkIGluIHRoZSBwcmV2aW91cyBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIE5vdGU6IFZhbHVlIHRyYW5zZmVycmluZyBjYW4gb3B0aW9uYWxseSBiZSBkaXNhYmxlZCBieSB0aGUgdXNlciB2aWEgdGhlIF9jYWNoZVZhbHVlcyBvcHRpb24uICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKG9wdHMuX2NhY2hlVmFsdWVzICYmIGxhc3RUd2VlbnNDb250YWluZXIgJiYgbGFzdFR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChzdGFydFZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IGxhc3RUd2VlbnNDb250YWluZXJbcHJvcGVydHldLmVuZFZhbHVlICsgbGFzdFR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0udW5pdFR5cGU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogVGhlIHByZXZpb3VzIGNhbGwncyByb290UHJvcGVydHlWYWx1ZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgZWxlbWVudCdzIGRhdGEgY2FjaGUgc2luY2UgdGhhdCdzIHRoZVxyXG5cdFx0XHRcdFx0XHRcdFx0IGluc3RhbmNlIG9mIHJvb3RQcm9wZXJ0eVZhbHVlIHRoYXQgZ2V0cyBmcmVzaGx5IHVwZGF0ZWQgYnkgdGhlIHR3ZWVuaW5nIHByb2Nlc3MsIHdoZXJlYXMgdGhlIHJvb3RQcm9wZXJ0eVZhbHVlXHJcblx0XHRcdFx0XHRcdFx0XHQgYXR0YWNoZWQgdG8gdGhlIGluY29taW5nIGxhc3RUd2VlbnNDb250YWluZXIgaXMgZXF1YWwgdG8gdGhlIHJvb3QgcHJvcGVydHkncyB2YWx1ZSBwcmlvciB0byBhbnkgdHdlZW5pbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IGRhdGEucm9vdFByb3BlcnR5VmFsdWVDYWNoZVtyb290UHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgdmFsdWVzIHdlcmUgbm90IHRyYW5zZmVycmVkIGZyb20gYSBwcmV2aW91cyBWZWxvY2l0eSBjYWxsLCBxdWVyeSB0aGUgRE9NIGFzIG5lZWRlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSGFuZGxlIGhvb2tlZCBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKENTUy5Ib29rcy5yZWdpc3RlcmVkW3Byb3BlcnR5XSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoc3RhcnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCByb290UHJvcGVydHkpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBUaGUgZm9sbG93aW5nIGdldFByb3BlcnR5VmFsdWUoKSBjYWxsIGRvZXMgbm90IGFjdHVhbGx5IHRyaWdnZXIgYSBET00gcXVlcnk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IGdldFByb3BlcnR5VmFsdWUoKSB3aWxsIGV4dHJhY3QgdGhlIGhvb2sgZnJvbSByb290UHJvcGVydHlWYWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgcHJvcGVydHksIHJvb3RQcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiBzdGFydFZhbHVlIGlzIGFscmVhZHkgZGVmaW5lZCB2aWEgZm9yY2VmZWVkaW5nLCBkbyBub3QgcXVlcnkgdGhlIERPTSBmb3IgdGhlIHJvb3QgcHJvcGVydHkncyB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQganVzdCBncmFiIHJvb3RQcm9wZXJ0eSdzIHplcm8tdmFsdWUgdGVtcGxhdGUgZnJvbSBDU1MuSG9va3MuIFRoaXMgb3ZlcndyaXRlcyB0aGUgZWxlbWVudCdzIGFjdHVhbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCByb290IHByb3BlcnR5IHZhbHVlIChpZiBvbmUgaXMgc2V0KSwgYnV0IHRoaXMgaXMgYWNjZXB0YWJsZSBzaW5jZSB0aGUgcHJpbWFyeSByZWFzb24gdXNlcnMgZm9yY2VmZWVkIGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IHRvIGF2b2lkIERPTSBxdWVyaWVzLCBhbmQgdGh1cyB3ZSBsaWtld2lzZSBhdm9pZCBxdWVyeWluZyB0aGUgRE9NIGZvciB0aGUgcm9vdCBwcm9wZXJ0eSdzIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEdyYWIgdGhpcyBob29rJ3MgemVyby12YWx1ZSB0ZW1wbGF0ZSwgZS5nLiBcIjBweCAwcHggMHB4IGJsYWNrXCIuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuSG9va3MudGVtcGxhdGVzW3Jvb3RQcm9wZXJ0eV1bMV07XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogSGFuZGxlIG5vbi1ob29rZWQgcHJvcGVydGllcyB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIGRlZmluZWQgdmlhIGZvcmNlZmVlZGluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc3RhcnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSk7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFZhbHVlIERhdGEgRXh0cmFjdGlvblxyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0dmFyIHNlcGFyYXRlZFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZVVuaXRUeXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlVW5pdFR5cGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9wZXJhdG9yID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIFNlcGFyYXRlcyBhIHByb3BlcnR5IHZhbHVlIGludG8gaXRzIG51bWVyaWMgdmFsdWUgYW5kIGl0cyB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0dmFyIHNlcGFyYXRlVmFsdWUgPSBmdW5jdGlvbihwcm9wZXJ0eSwgdmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciB1bml0VHlwZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRudW1lcmljVmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0bnVtZXJpY1ZhbHVlID0gKHZhbHVlIHx8IFwiMFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50b1N0cmluZygpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRvTG93ZXJDYXNlKClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBNYXRjaCB0aGUgdW5pdCB0eXBlIGF0IHRoZSBlbmQgb2YgdGhlIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9bJUEtel0rJC8sIGZ1bmN0aW9uKG1hdGNoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBHcmFiIHRoZSB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bml0VHlwZSA9IG1hdGNoO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFN0cmlwIHRoZSB1bml0IHR5cGUgb2ZmIG9mIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgbm8gdW5pdCB0eXBlIHdhcyBzdXBwbGllZCwgYXNzaWduIG9uZSB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0aGlzIHByb3BlcnR5IChlLmcuIFwiZGVnXCIgZm9yIHJvdGF0ZVogb3IgXCJweFwiIGZvciB3aWR0aCkuICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIXVuaXRUeXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRUeXBlID0gQ1NTLlZhbHVlcy5nZXRVbml0VHlwZShwcm9wZXJ0eSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFtudW1lcmljVmFsdWUsIHVuaXRUeXBlXTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoc3RhcnRWYWx1ZSAhPT0gZW5kVmFsdWUgJiYgVHlwZS5pc1N0cmluZyhzdGFydFZhbHVlKSAmJiBUeXBlLmlzU3RyaW5nKGVuZFZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybiA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgaVN0YXJ0ID0gMCwgLy8gaW5kZXggaW4gc3RhcnRWYWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlFbmQgPSAwLCAvLyBpbmRleCBpbiBlbmRWYWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFTdGFydCA9IFtdLCAvLyBhcnJheSBvZiBzdGFydFZhbHVlIG51bWJlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhRW5kID0gW10sIC8vIGFycmF5IG9mIGVuZFZhbHVlIG51bWJlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbkNhbGMgPSAwLCAvLyBLZWVwIHRyYWNrIG9mIGJlaW5nIGluc2lkZSBhIFwiY2FsYygpXCIgc28gd2UgZG9uJ3QgZHVwbGljYXRlIGl0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SR0IgPSAwLCAvLyBLZWVwIHRyYWNrIG9mIGJlaW5nIGluc2lkZSBhbiBSR0IgYXMgd2UgY2FuJ3QgdXNlIGZyYWN0aW9uYWwgdmFsdWVzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SR0JBID0gMDsgLy8gS2VlcCB0cmFjayBvZiBiZWluZyBpbnNpZGUgYW4gUkdCQSBhcyB3ZSBtdXN0IHBhc3MgZnJhY3Rpb25hbCBmb3IgdGhlIGFscGhhIGNoYW5uZWxcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gQ1NTLkhvb2tzLmZpeENvbG9ycyhzdGFydFZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gQ1NTLkhvb2tzLmZpeENvbG9ycyhlbmRWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoaVN0YXJ0IDwgc3RhcnRWYWx1ZS5sZW5ndGggJiYgaUVuZCA8IGVuZFZhbHVlLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgY1N0YXJ0ID0gc3RhcnRWYWx1ZVtpU3RhcnRdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y0VuZCA9IGVuZFZhbHVlW2lFbmRdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKC9bXFxkXFwuLV0vLnRlc3QoY1N0YXJ0KSAmJiAvW1xcZFxcLi1dLy50ZXN0KGNFbmQpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHRTdGFydCA9IGNTdGFydCwgLy8gdGVtcG9yYXJ5IGNoYXJhY3RlciBidWZmZXJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dEVuZCA9IGNFbmQsIC8vIHRlbXBvcmFyeSBjaGFyYWN0ZXIgYnVmZmVyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvdFN0YXJ0ID0gXCIuXCIsIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gb25seSBldmVyIG1hdGNoIGEgc2luZ2xlIGRvdCBpbiBhIGRlY2ltYWxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG90RW5kID0gXCIuXCI7IC8vIE1ha2Ugc3VyZSB3ZSBjYW4gb25seSBldmVyIG1hdGNoIGEgc2luZ2xlIGRvdCBpbiBhIGRlY2ltYWxcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCsraVN0YXJ0IDwgc3RhcnRWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNTdGFydCA9IHN0YXJ0VmFsdWVbaVN0YXJ0XTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjU3RhcnQgPT09IGRvdFN0YXJ0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvdFN0YXJ0ID0gXCIuLlwiOyAvLyBDYW4gbmV2ZXIgbWF0Y2ggdHdvIGNoYXJhY3RlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIS9cXGQvLnRlc3QoY1N0YXJ0KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRTdGFydCArPSBjU3RhcnQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdoaWxlICgrK2lFbmQgPCBlbmRWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNFbmQgPSBlbmRWYWx1ZVtpRW5kXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjRW5kID09PSBkb3RFbmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG90RW5kID0gXCIuLlwiOyAvLyBDYW4gbmV2ZXIgbWF0Y2ggdHdvIGNoYXJhY3RlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIS9cXGQvLnRlc3QoY0VuZCkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0RW5kICs9IGNFbmQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciB1U3RhcnQgPSBDU1MuSG9va3MuZ2V0VW5pdChzdGFydFZhbHVlLCBpU3RhcnQpLCAvLyB0ZW1wb3JhcnkgdW5pdCB0eXBlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVFbmQgPSBDU1MuSG9va3MuZ2V0VW5pdChlbmRWYWx1ZSwgaUVuZCk7IC8vIHRlbXBvcmFyeSB1bml0IHR5cGVcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aVN0YXJ0ICs9IHVTdGFydC5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aUVuZCArPSB1RW5kLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodVN0YXJ0ID09PSB1RW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTYW1lIHVuaXRzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodFN0YXJ0ID09PSB0RW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNhbWUgbnVtYmVycywgc28ganVzdCBjb3B5IG92ZXJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybiArPSB0U3RhcnQgKyB1U3RhcnQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEaWZmZXJlbnQgbnVtYmVycywgc28gc3RvcmUgdGhlbVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuICs9IFwie1wiICsgYVN0YXJ0Lmxlbmd0aCArIChpblJHQiA/IFwiIVwiIDogXCJcIikgKyBcIn1cIiArIHVTdGFydDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YVN0YXJ0LnB1c2gocGFyc2VGbG9hdCh0U3RhcnQpKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUVuZC5wdXNoKHBhcnNlRmxvYXQodEVuZCkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEaWZmZXJlbnQgdW5pdHMsIHNvIHB1dCBpbnRvIGEgXCJjYWxjKGZyb20gKyB0bylcIiBhbmQgYW5pbWF0ZSBlYWNoIHNpZGUgdG8vZnJvbSB6ZXJvXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgblN0YXJ0ID0gcGFyc2VGbG9hdCh0U3RhcnQpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5FbmQgPSBwYXJzZUZsb2F0KHRFbmQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm4gKz0gKGluQ2FsYyA8IDUgPyBcImNhbGNcIiA6IFwiXCIpICsgXCIoXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIChuU3RhcnQgPyBcIntcIiArIGFTdGFydC5sZW5ndGggKyAoaW5SR0IgPyBcIiFcIiA6IFwiXCIpICsgXCJ9XCIgOiBcIjBcIikgKyB1U3RhcnRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIFwiICsgXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIChuRW5kID8gXCJ7XCIgKyAoYVN0YXJ0Lmxlbmd0aCArIChuU3RhcnQgPyAxIDogMCkpICsgKGluUkdCID8gXCIhXCIgOiBcIlwiKSArIFwifVwiIDogXCIwXCIpICsgdUVuZFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgXCIpXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoblN0YXJ0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTdGFydC5wdXNoKG5TdGFydCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFFbmQucHVzaCgwKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChuRW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTdGFydC5wdXNoKDApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRW5kLnB1c2gobkVuZCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGNTdGFydCA9PT0gY0VuZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm4gKz0gY1N0YXJ0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlTdGFydCsrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlFbmQrKztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBLZWVwIHRyYWNrIG9mIGJlaW5nIGluc2lkZSBhIGNhbGMoKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpbkNhbGMgPT09IDAgJiYgY1N0YXJ0ID09PSBcImNcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpbkNhbGMgPT09IDEgJiYgY1N0YXJ0ID09PSBcImFcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpbkNhbGMgPT09IDIgJiYgY1N0YXJ0ID09PSBcImxcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpbkNhbGMgPT09IDMgJiYgY1N0YXJ0ID09PSBcImNcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpbkNhbGMgPj0gNCAmJiBjU3RhcnQgPT09IFwiKFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5DYWxjKys7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICgoaW5DYWxjICYmIGluQ2FsYyA8IDUpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHx8IGluQ2FsYyA+PSA0ICYmIGNTdGFydCA9PT0gXCIpXCIgJiYgLS1pbkNhbGMgPCA1KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpbkNhbGMgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBLZWVwIHRyYWNrIG9mIGJlaW5nIGluc2lkZSBhbiByZ2IoKSAvIHJnYmEoKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpblJHQiA9PT0gMCAmJiBjU3RhcnQgPT09IFwiclwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHx8IGluUkdCID09PSAxICYmIGNTdGFydCA9PT0gXCJnXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fHwgaW5SR0IgPT09IDIgJiYgY1N0YXJ0ID09PSBcImJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpblJHQiA9PT0gMyAmJiBjU3RhcnQgPT09IFwiYVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHx8IGluUkdCID49IDMgJiYgY1N0YXJ0ID09PSBcIihcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpblJHQiA9PT0gMyAmJiBjU3RhcnQgPT09IFwiYVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluUkdCQSA9IDE7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpblJHQisrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5SR0JBICYmIGNTdGFydCA9PT0gXCIsXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICgrK2luUkdCQSA+IDMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SR0IgPSBpblJHQkEgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoKGluUkdCQSAmJiBpblJHQiA8IChpblJHQkEgPyA1IDogNCkpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHx8IGluUkdCID49IChpblJHQkEgPyA0IDogMykgJiYgY1N0YXJ0ID09PSBcIilcIiAmJiAtLWluUkdCIDwgKGluUkdCQSA/IDUgOiA0KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SR0IgPSBpblJHQkEgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbkNhbGMgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFRPRE86IGNoYW5naW5nIHVuaXRzLCBmaXhpbmcgY29sb3Vyc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoaVN0YXJ0ICE9PSBzdGFydFZhbHVlLmxlbmd0aCB8fCBpRW5kICE9PSBlbmRWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcIlRyeWluZyB0byBwYXR0ZXJuIG1hdGNoIG1pcy1tYXRjaGVkIHN0cmluZ3MgW1xcXCJcIiArIGVuZFZhbHVlICsgXCJcXFwiLCBcXFwiXCIgKyBzdGFydFZhbHVlICsgXCJcXFwiXVwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhdHRlcm4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFTdGFydC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoVmVsb2NpdHkuZGVidWcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiUGF0dGVybiBmb3VuZCBcXFwiXCIgKyBwYXR0ZXJuICsgXCJcXFwiIC0+IFwiLCBhU3RhcnQsIGFFbmQsIFwiW1wiICsgc3RhcnRWYWx1ZSArIFwiLFwiICsgZW5kVmFsdWUgKyBcIl1cIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSBhU3RhcnQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBhRW5kO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBzdGFydFZhbHVlVW5pdFR5cGUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm4gPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICghcGF0dGVybikge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogU2VwYXJhdGUgc3RhcnRWYWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHNlcGFyYXRlZFZhbHVlID0gc2VwYXJhdGVWYWx1ZShwcm9wZXJ0eSwgc3RhcnRWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gc2VwYXJhdGVkVmFsdWVbMF07XHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlVW5pdFR5cGUgPSBzZXBhcmF0ZWRWYWx1ZVsxXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBTZXBhcmF0ZSBlbmRWYWx1ZSwgYW5kIGV4dHJhY3QgYSB2YWx1ZSBvcGVyYXRvciAoZS5nLiBcIis9XCIsIFwiLT1cIikgaWYgb25lIGV4aXN0cy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHNlcGFyYXRlZFZhbHVlID0gc2VwYXJhdGVWYWx1ZShwcm9wZXJ0eSwgZW5kVmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBzZXBhcmF0ZWRWYWx1ZVswXS5yZXBsYWNlKC9eKFsrLVxcLypdKT0vLCBmdW5jdGlvbihtYXRjaCwgc3ViTWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0b3BlcmF0b3IgPSBzdWJNYXRjaDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFN0cmlwIHRoZSBvcGVyYXRvciBvZmYgb2YgdGhlIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWVVbml0VHlwZSA9IHNlcGFyYXRlZFZhbHVlWzFdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFBhcnNlIGZsb2F0IHZhbHVlcyBmcm9tIGVuZFZhbHVlIGFuZCBzdGFydFZhbHVlLiBEZWZhdWx0IHRvIDAgaWYgTmFOIGlzIHJldHVybmVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IHBhcnNlRmxvYXQoc3RhcnRWYWx1ZSkgfHwgMDtcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gcGFyc2VGbG9hdChlbmRWYWx1ZSkgfHwgMDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0XHQgUHJvcGVydHktU3BlY2lmaWMgVmFsdWUgQ29udmVyc2lvblxyXG5cdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBDdXN0b20gc3VwcG9ydCBmb3IgcHJvcGVydGllcyB0aGF0IGRvbid0IGFjdHVhbGx5IGFjY2VwdCB0aGUgJSB1bml0IHR5cGUsIGJ1dCB3aGVyZSBwb2xseWZpbGxpbmcgaXMgdHJpdmlhbCBhbmQgcmVsYXRpdmVseSBmb29scHJvb2YuICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZW5kVmFsdWVVbml0VHlwZSA9PT0gXCIlXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogQSAlLXZhbHVlIGZvbnRTaXplL2xpbmVIZWlnaHQgaXMgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCdzIGZvbnRTaXplIChhcyBvcHBvc2VkIHRvIHRoZSBwYXJlbnQncyBkaW1lbnNpb25zKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHdoaWNoIGlzIGlkZW50aWNhbCB0byB0aGUgZW0gdW5pdCdzIGJlaGF2aW9yLCBzbyB3ZSBwaWdneWJhY2sgb2ZmIG9mIHRoYXQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICgvXihmb250U2l6ZXxsaW5lSGVpZ2h0KSQvLnRlc3QocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQ29udmVydCAlIGludG8gYW4gZW0gZGVjaW1hbCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IGVuZFZhbHVlIC8gMTAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBcImVtXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogRm9yIHNjYWxlWCBhbmQgc2NhbGVZLCBjb252ZXJ0IHRoZSB2YWx1ZSBpbnRvIGl0cyBkZWNpbWFsIGZvcm1hdCBhbmQgc3RyaXAgb2ZmIHRoZSB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoL15zY2FsZS8udGVzdChwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IGVuZFZhbHVlIC8gMTAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEZvciBSR0IgY29tcG9uZW50cywgdGFrZSB0aGUgZGVmaW5lZCBwZXJjZW50YWdlIG9mIDI1NSBhbmQgc3RyaXAgb2ZmIHRoZSB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoLyhSZWR8R3JlZW58Qmx1ZSkkL2kudGVzdChwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IChlbmRWYWx1ZSAvIDEwMCkgKiAyNTU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWVVbml0VHlwZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHQgVW5pdCBSYXRpbyBDYWxjdWxhdGlvblxyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIFdoZW4gcXVlcmllZCwgdGhlIGJyb3dzZXIgcmV0dXJucyAobW9zdCkgQ1NTIHByb3BlcnR5IHZhbHVlcyBpbiBwaXhlbHMuIFRoZXJlZm9yZSwgaWYgYW4gZW5kVmFsdWUgd2l0aCBhIHVuaXQgdHlwZSBvZlxyXG5cdFx0XHRcdFx0XHRcdCAlLCBlbSwgb3IgcmVtIGlzIGFuaW1hdGVkIHRvd2FyZCwgc3RhcnRWYWx1ZSBtdXN0IGJlIGNvbnZlcnRlZCBmcm9tIHBpeGVscyBpbnRvIHRoZSBzYW1lIHVuaXQgdHlwZSBhcyBlbmRWYWx1ZSBpbiBvcmRlclxyXG5cdFx0XHRcdFx0XHRcdCBmb3IgdmFsdWUgbWFuaXB1bGF0aW9uIGxvZ2ljIChpbmNyZW1lbnQvZGVjcmVtZW50KSB0byBwcm9jZWVkLiBGdXJ0aGVyLCBpZiB0aGUgc3RhcnRWYWx1ZSB3YXMgZm9yY2VmZWQgb3IgdHJhbnNmZXJyZWRcclxuXHRcdFx0XHRcdFx0XHQgZnJvbSBhIHByZXZpb3VzIGNhbGwsIHN0YXJ0VmFsdWUgbWF5IGFsc28gbm90IGJlIGluIHBpeGVscy4gVW5pdCBjb252ZXJzaW9uIGxvZ2ljIHRoZXJlZm9yZSBjb25zaXN0cyBvZiB0d28gc3RlcHM6XHJcblx0XHRcdFx0XHRcdFx0IDEpIENhbGN1bGF0aW5nIHRoZSByYXRpbyBvZiAlL2VtL3JlbS92aC92dyByZWxhdGl2ZSB0byBwaXhlbHNcclxuXHRcdFx0XHRcdFx0XHQgMikgQ29udmVydGluZyBzdGFydFZhbHVlIGludG8gdGhlIHNhbWUgdW5pdCBvZiBtZWFzdXJlbWVudCBhcyBlbmRWYWx1ZSBiYXNlZCBvbiB0aGVzZSByYXRpb3MuICovXHJcblx0XHRcdFx0XHRcdFx0LyogVW5pdCBjb252ZXJzaW9uIHJhdGlvcyBhcmUgY2FsY3VsYXRlZCBieSBpbnNlcnRpbmcgYSBzaWJsaW5nIG5vZGUgbmV4dCB0byB0aGUgdGFyZ2V0IG5vZGUsIGNvcHlpbmcgb3ZlciBpdHMgcG9zaXRpb24gcHJvcGVydHksXHJcblx0XHRcdFx0XHRcdFx0IHNldHRpbmcgdmFsdWVzIHdpdGggdGhlIHRhcmdldCB1bml0IHR5cGUgdGhlbiBjb21wYXJpbmcgdGhlIHJldHVybmVkIHBpeGVsIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIE5vdGU6IEV2ZW4gaWYgb25seSBvbmUgb2YgdGhlc2UgdW5pdCB0eXBlcyBpcyBiZWluZyBhbmltYXRlZCwgYWxsIHVuaXQgcmF0aW9zIGFyZSBjYWxjdWxhdGVkIGF0IG9uY2Ugc2luY2UgdGhlIG92ZXJoZWFkXHJcblx0XHRcdFx0XHRcdFx0IG9mIGJhdGNoaW5nIHRoZSBTRVRzIGFuZCBHRVRzIHRvZ2V0aGVyIHVwZnJvbnQgb3V0d2VpZ2h0cyB0aGUgcG90ZW50aWFsIG92ZXJoZWFkXHJcblx0XHRcdFx0XHRcdFx0IG9mIGxheW91dCB0aHJhc2hpbmcgY2F1c2VkIGJ5IHJlLXF1ZXJ5aW5nIGZvciB1bmNhbGN1bGF0ZWQgcmF0aW9zIGZvciBzdWJzZXF1ZW50bHktcHJvY2Vzc2VkIHByb3BlcnRpZXMuICovXHJcblx0XHRcdFx0XHRcdFx0LyogVG9kbzogU2hpZnQgdGhpcyBsb2dpYyBpbnRvIHRoZSBjYWxscycgZmlyc3QgdGljayBpbnN0YW5jZSBzbyB0aGF0IGl0J3Mgc3luY2VkIHdpdGggUkFGLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHZhciBjYWxjdWxhdGVVbml0UmF0aW9zID0gZnVuY3Rpb24oKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0IFNhbWUgUmF0aW8gQ2hlY2tzXHJcblx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFRoZSBwcm9wZXJ0aWVzIGJlbG93IGFyZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBlbGVtZW50IGRpZmZlcnMgc3VmZmljaWVudGx5IGZyb20gdGhpcyBjYWxsJ3NcclxuXHRcdFx0XHRcdFx0XHRcdCBwcmV2aW91c2x5IGl0ZXJhdGVkIGVsZW1lbnQgdG8gYWxzbyBkaWZmZXIgaW4gaXRzIHVuaXQgY29udmVyc2lvbiByYXRpb3MuIElmIHRoZSBwcm9wZXJ0aWVzIG1hdGNoIHVwIHdpdGggdGhvc2VcclxuXHRcdFx0XHRcdFx0XHRcdCBvZiB0aGUgcHJpb3IgZWxlbWVudCwgdGhlIHByaW9yIGVsZW1lbnQncyBjb252ZXJzaW9uIHJhdGlvcyBhcmUgdXNlZC4gTGlrZSBtb3N0IG9wdGltaXphdGlvbnMgaW4gVmVsb2NpdHksXHJcblx0XHRcdFx0XHRcdFx0XHQgdGhpcyBpcyBkb25lIHRvIG1pbmltaXplIERPTSBxdWVyeWluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHZhciBzYW1lUmF0aW9JbmRpY2F0b3JzID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRteVBhcmVudDogZWxlbWVudC5wYXJlbnROb2RlIHx8IGRvY3VtZW50LmJvZHksIC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRwb3NpdGlvbjogQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJwb3NpdGlvblwiKSwgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvbnRTaXplOiBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImZvbnRTaXplXCIpIC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBEZXRlcm1pbmUgaWYgdGhlIHNhbWUgJSByYXRpbyBjYW4gYmUgdXNlZC4gJSBpcyBiYXNlZCBvbiB0aGUgZWxlbWVudCdzIHBvc2l0aW9uIHZhbHVlIGFuZCBpdHMgcGFyZW50J3Mgd2lkdGggYW5kIGhlaWdodCBkaW1lbnNpb25zLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNhbWVQZXJjZW50UmF0aW8gPSAoKHNhbWVSYXRpb0luZGljYXRvcnMucG9zaXRpb24gPT09IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdFBvc2l0aW9uKSAmJiAoc2FtZVJhdGlvSW5kaWNhdG9ycy5teVBhcmVudCA9PT0gY2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0UGFyZW50KSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogRGV0ZXJtaW5lIGlmIHRoZSBzYW1lIGVtIHJhdGlvIGNhbiBiZSB1c2VkLiBlbSBpcyByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCdzIGZvbnRTaXplLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNhbWVFbVJhdGlvID0gKHNhbWVSYXRpb0luZGljYXRvcnMuZm9udFNpemUgPT09IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdEZvbnRTaXplKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBTdG9yZSB0aGVzZSByYXRpbyBpbmRpY2F0b3JzIGNhbGwtd2lkZSBmb3IgdGhlIG5leHQgZWxlbWVudCB0byBjb21wYXJlIGFnYWluc3QuICovXHJcblx0XHRcdFx0XHRcdFx0XHRjYWxsVW5pdENvbnZlcnNpb25EYXRhLmxhc3RQYXJlbnQgPSBzYW1lUmF0aW9JbmRpY2F0b3JzLm15UGFyZW50O1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0UG9zaXRpb24gPSBzYW1lUmF0aW9JbmRpY2F0b3JzLnBvc2l0aW9uO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0Rm9udFNpemUgPSBzYW1lUmF0aW9JbmRpY2F0b3JzLmZvbnRTaXplO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdCBFbGVtZW50LVNwZWNpZmljIFVuaXRzXHJcblx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIE5vdGU6IElFOCByb3VuZHMgdG8gdGhlIG5lYXJlc3QgcGl4ZWwgd2hlbiByZXR1cm5pbmcgQ1NTIHZhbHVlcywgdGh1cyB3ZSBwZXJmb3JtIGNvbnZlcnNpb25zIHVzaW5nIGEgbWVhc3VyZW1lbnRcclxuXHRcdFx0XHRcdFx0XHRcdCBvZiAxMDAgKGluc3RlYWQgb2YgMSkgdG8gZ2l2ZSBvdXIgcmF0aW9zIGEgcHJlY2lzaW9uIG9mIGF0IGxlYXN0IDIgZGVjaW1hbCB2YWx1ZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgbWVhc3VyZW1lbnQgPSAxMDAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pdFJhdGlvcyA9IHt9O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICghc2FtZUVtUmF0aW8gfHwgIXNhbWVQZXJjZW50UmF0aW8pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGR1bW15ID0gZGF0YSAmJiBkYXRhLmlzU1ZHID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJyZWN0XCIpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LmluaXQoZHVtbXkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzYW1lUmF0aW9JbmRpY2F0b3JzLm15UGFyZW50LmFwcGVuZENoaWxkKGR1bW15KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFRvIGFjY3VyYXRlbHkgYW5kIGNvbnNpc3RlbnRseSBjYWxjdWxhdGUgY29udmVyc2lvbiByYXRpb3MsIHRoZSBlbGVtZW50J3MgY2FzY2FkZWQgb3ZlcmZsb3cgYW5kIGJveC1zaXppbmcgYXJlIHN0cmlwcGVkLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgU2ltaWxhcmx5LCBzaW5jZSB3aWR0aC9oZWlnaHQgY2FuIGJlIGFydGlmaWNpYWxseSBjb25zdHJhaW5lZCBieSB0aGVpciBtaW4tL21heC0gZXF1aXZhbGVudHMsIHRoZXNlIGFyZSBjb250cm9sbGVkIGZvciBhcyB3ZWxsLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBPdmVyZmxvdyBtdXN0IGJlIGFsc28gYmUgY29udHJvbGxlZCBmb3IgcGVyLWF4aXMgc2luY2UgdGhlIG92ZXJmbG93IHByb3BlcnR5IG92ZXJ3cml0ZXMgaXRzIHBlci1heGlzIHZhbHVlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0JC5lYWNoKFtcIm92ZXJmbG93XCIsIFwib3ZlcmZsb3dYXCIsIFwib3ZlcmZsb3dZXCJdLCBmdW5jdGlvbihpLCBwcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5zZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBwcm9wZXJ0eSwgXCJoaWRkZW5cIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5DU1Muc2V0UHJvcGVydHlWYWx1ZShkdW1teSwgXCJwb3NpdGlvblwiLCBzYW1lUmF0aW9JbmRpY2F0b3JzLnBvc2l0aW9uKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuQ1NTLnNldFByb3BlcnR5VmFsdWUoZHVtbXksIFwiZm9udFNpemVcIiwgc2FtZVJhdGlvSW5kaWNhdG9ycy5mb250U2l6ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5zZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBcImJveFNpemluZ1wiLCBcImNvbnRlbnQtYm94XCIpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Lyogd2lkdGggYW5kIGhlaWdodCBhY3QgYXMgb3VyIHByb3h5IHByb3BlcnRpZXMgZm9yIG1lYXN1cmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgJSByYXRpb3MuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdCQuZWFjaChbXCJtaW5XaWR0aFwiLCBcIm1heFdpZHRoXCIsIFwid2lkdGhcIiwgXCJtaW5IZWlnaHRcIiwgXCJtYXhIZWlnaHRcIiwgXCJoZWlnaHRcIl0sIGZ1bmN0aW9uKGksIHByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuQ1NTLnNldFByb3BlcnR5VmFsdWUoZHVtbXksIHByb3BlcnR5LCBtZWFzdXJlbWVudCArIFwiJVwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIHBhZGRpbmdMZWZ0IGFyYml0cmFyaWx5IGFjdHMgYXMgb3VyIHByb3h5IHByb3BlcnR5IGZvciB0aGUgZW0gcmF0aW8uICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5zZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBcInBhZGRpbmdMZWZ0XCIsIG1lYXN1cmVtZW50ICsgXCJlbVwiKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIERpdmlkZSB0aGUgcmV0dXJuZWQgdmFsdWUgYnkgdGhlIG1lYXN1cmVtZW50IHRvIGdldCB0aGUgcmF0aW8gYmV0d2VlbiAxJSBhbmQgMXB4LiBEZWZhdWx0IHRvIDEgc2luY2Ugd29ya2luZyB3aXRoIDAgY2FuIHByb2R1Y2UgSW5maW5pdGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MucGVyY2VudFRvUHhXaWR0aCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdFBlcmNlbnRUb1B4V2lkdGggPSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShkdW1teSwgXCJ3aWR0aFwiLCBudWxsLCB0cnVlKSkgfHwgMSkgLyBtZWFzdXJlbWVudDsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MucGVyY2VudFRvUHhIZWlnaHQgPSBjYWxsVW5pdENvbnZlcnNpb25EYXRhLmxhc3RQZXJjZW50VG9QeEhlaWdodCA9IChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBcImhlaWdodFwiLCBudWxsLCB0cnVlKSkgfHwgMSkgLyBtZWFzdXJlbWVudDsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MuZW1Ub1B4ID0gY2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0RW1Ub1B4ID0gKHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZHVtbXksIFwicGFkZGluZ0xlZnRcIikpIHx8IDEpIC8gbWVhc3VyZW1lbnQ7IC8qIEdFVCAqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0c2FtZVJhdGlvSW5kaWNhdG9ycy5teVBhcmVudC5yZW1vdmVDaGlsZChkdW1teSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bml0UmF0aW9zLmVtVG9QeCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdEVtVG9QeDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dW5pdFJhdGlvcy5wZXJjZW50VG9QeFdpZHRoID0gY2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0UGVyY2VudFRvUHhXaWR0aDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dW5pdFJhdGlvcy5wZXJjZW50VG9QeEhlaWdodCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdFBlcmNlbnRUb1B4SGVpZ2h0O1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdCBFbGVtZW50LUFnbm9zdGljIFVuaXRzXHJcblx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFdoZXJlYXMgJSBhbmQgZW0gcmF0aW9zIGFyZSBkZXRlcm1pbmVkIG9uIGEgcGVyLWVsZW1lbnQgYmFzaXMsIHRoZSByZW0gdW5pdCBvbmx5IG5lZWRzIHRvIGJlIGNoZWNrZWRcclxuXHRcdFx0XHRcdFx0XHRcdCBvbmNlIHBlciBjYWxsIHNpbmNlIGl0J3MgZXhjbHVzaXZlbHkgZGVwZW5kYW50IHVwb24gZG9jdW1lbnQuYm9keSdzIGZvbnRTaXplLiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lXHJcblx0XHRcdFx0XHRcdFx0XHQgdGhhdCBjYWxjdWxhdGVVbml0UmF0aW9zKCkgaXMgYmVpbmcgcnVuIGR1cmluZyB0aGlzIGNhbGwsIHJlbVRvUHggd2lsbCBzdGlsbCBiZSBzZXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUgb2YgbnVsbCxcclxuXHRcdFx0XHRcdFx0XHRcdCBzbyB3ZSBjYWxjdWxhdGUgaXQgbm93LiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNhbGxVbml0Q29udmVyc2lvbkRhdGEucmVtVG9QeCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBEZWZhdWx0IHRvIGJyb3dzZXJzJyBkZWZhdWx0IGZvbnRTaXplIG9mIDE2cHggaW4gdGhlIGNhc2Ugb2YgMC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS5yZW1Ub1B4ID0gcGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShkb2N1bWVudC5ib2R5LCBcImZvbnRTaXplXCIpKSB8fCAxNjsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogU2ltaWxhcmx5LCB2aWV3cG9ydCB1bml0cyBhcmUgJS1yZWxhdGl2ZSB0byB0aGUgd2luZG93J3MgaW5uZXIgZGltZW5zaW9ucy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChjYWxsVW5pdENvbnZlcnNpb25EYXRhLnZ3VG9QeCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYWxsVW5pdENvbnZlcnNpb25EYXRhLnZ3VG9QeCA9IHBhcnNlRmxvYXQod2luZG93LmlubmVyV2lkdGgpIC8gMTAwOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS52aFRvUHggPSBwYXJzZUZsb2F0KHdpbmRvdy5pbm5lckhlaWdodCkgLyAxMDA7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MucmVtVG9QeCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEucmVtVG9QeDtcclxuXHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MudndUb1B4ID0gY2FsbFVuaXRDb252ZXJzaW9uRGF0YS52d1RvUHg7XHJcblx0XHRcdFx0XHRcdFx0XHR1bml0UmF0aW9zLnZoVG9QeCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEudmhUb1B4O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChWZWxvY2l0eS5kZWJ1ZyA+PSAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiVW5pdCByYXRpb3M6IFwiICsgSlNPTi5zdHJpbmdpZnkodW5pdFJhdGlvcyksIGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuaXRSYXRpb3M7XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFVuaXQgQ29udmVyc2lvblxyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogVGhlICogYW5kIC8gb3BlcmF0b3JzLCB3aGljaCBhcmUgbm90IHBhc3NlZCBpbiB3aXRoIGFuIGFzc29jaWF0ZWQgdW5pdCwgaW5oZXJlbnRseSB1c2Ugc3RhcnRWYWx1ZSdzIHVuaXQuIFNraXAgdmFsdWUgYW5kIHVuaXQgY29udmVyc2lvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoL1tcXC8qXS8udGVzdChvcGVyYXRvcikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBzdGFydFZhbHVlVW5pdFR5cGU7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBJZiBzdGFydFZhbHVlIGFuZCBlbmRWYWx1ZSBkaWZmZXIgaW4gdW5pdCB0eXBlLCBjb252ZXJ0IHN0YXJ0VmFsdWUgaW50byB0aGUgc2FtZSB1bml0IHR5cGUgYXMgZW5kVmFsdWUgc28gdGhhdCBpZiBlbmRWYWx1ZVVuaXRUeXBlXHJcblx0XHRcdFx0XHRcdFx0XHQgaXMgYSByZWxhdGl2ZSB1bml0ICglLCBlbSwgcmVtKSwgdGhlIHZhbHVlcyBzZXQgZHVyaW5nIHR3ZWVuaW5nIHdpbGwgY29udGludWUgdG8gYmUgYWNjdXJhdGVseSByZWxhdGl2ZSBldmVuIGlmIHRoZSBtZXRyaWNzIHRoZXkgZGVwZW5kXHJcblx0XHRcdFx0XHRcdFx0XHQgb24gYXJlIGR5bmFtaWNhbGx5IGNoYW5naW5nIGR1cmluZyB0aGUgY291cnNlIG9mIHRoZSBhbmltYXRpb24uIENvbnZlcnNlbHksIGlmIHdlIGFsd2F5cyBub3JtYWxpemVkIGludG8gcHggYW5kIHVzZWQgcHggZm9yIHNldHRpbmcgdmFsdWVzLCB0aGUgcHggcmF0aW9cclxuXHRcdFx0XHRcdFx0XHRcdCB3b3VsZCBiZWNvbWUgc3RhbGUgaWYgdGhlIG9yaWdpbmFsIHVuaXQgYmVpbmcgYW5pbWF0ZWQgdG93YXJkIHdhcyByZWxhdGl2ZSBhbmQgdGhlIHVuZGVybHlpbmcgbWV0cmljcyBjaGFuZ2UgZHVyaW5nIHRoZSBhbmltYXRpb24uICovXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBTaW5jZSAwIGlzIDAgaW4gYW55IHVuaXQgdHlwZSwgbm8gY29udmVyc2lvbiBpcyBuZWNlc3Nhcnkgd2hlbiBzdGFydFZhbHVlIGlzIDAgLS0gd2UganVzdCBzdGFydCBhdCAwIHdpdGggZW5kVmFsdWVVbml0VHlwZS4gKi9cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKChzdGFydFZhbHVlVW5pdFR5cGUgIT09IGVuZFZhbHVlVW5pdFR5cGUpICYmIHN0YXJ0VmFsdWUgIT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIFVuaXQgY29udmVyc2lvbiBpcyBhbHNvIHNraXBwZWQgd2hlbiBlbmRWYWx1ZSBpcyAwLCBidXQgKnN0YXJ0VmFsdWVVbml0VHlwZSogbXVzdCBiZSB1c2VkIGZvciB0d2VlbiB2YWx1ZXMgdG8gcmVtYWluIGFjY3VyYXRlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogTm90ZTogU2tpcHBpbmcgdW5pdCBjb252ZXJzaW9uIGhlcmUgbWVhbnMgdGhhdCBpZiBlbmRWYWx1ZVVuaXRUeXBlIHdhcyBvcmlnaW5hbGx5IGEgcmVsYXRpdmUgdW5pdCwgdGhlIGFuaW1hdGlvbiB3b24ndCByZWxhdGl2ZWx5XHJcblx0XHRcdFx0XHRcdFx0XHQgbWF0Y2ggdGhlIHVuZGVybHlpbmcgbWV0cmljcyBpZiB0aGV5IGNoYW5nZSwgYnV0IHRoaXMgaXMgYWNjZXB0YWJsZSBzaW5jZSB3ZSdyZSBhbmltYXRpbmcgdG93YXJkIGludmlzaWJpbGl0eSBpbnN0ZWFkIG9mIHRvd2FyZCB2aXNpYmlsaXR5LFxyXG5cdFx0XHRcdFx0XHRcdFx0IHdoaWNoIHJlbWFpbnMgcGFzdCB0aGUgcG9pbnQgb2YgdGhlIGFuaW1hdGlvbidzIGNvbXBsZXRpb24uICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZW5kVmFsdWUgPT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWVVbml0VHlwZSA9IHN0YXJ0VmFsdWVVbml0VHlwZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIEJ5IHRoaXMgcG9pbnQsIHdlIGNhbm5vdCBhdm9pZCB1bml0IGNvbnZlcnNpb24gKGl0J3MgdW5kZXNpcmFibGUgc2luY2UgaXQgY2F1c2VzIGxheW91dCB0aHJhc2hpbmcpLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgSWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCB3ZSB0cmlnZ2VyIGNhbGN1bGF0ZVVuaXRSYXRpb3MoKSwgd2hpY2ggcnVucyBvbmNlIHBlciBlbGVtZW50IHBlciBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhID0gZWxlbWVudFVuaXRDb252ZXJzaW9uRGF0YSB8fCBjYWxjdWxhdGVVbml0UmF0aW9zKCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBUaGUgZm9sbG93aW5nIFJlZ0V4IG1hdGNoZXMgQ1NTIHByb3BlcnRpZXMgdGhhdCBoYXZlIHRoZWlyICUgdmFsdWVzIG1lYXN1cmVkIHJlbGF0aXZlIHRvIHRoZSB4LWF4aXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIE5vdGU6IFczQyBzcGVjIG1hbmRhdGVzIHRoYXQgYWxsIG9mIG1hcmdpbiBhbmQgcGFkZGluZydzIHByb3BlcnRpZXMgKGV2ZW4gdG9wIGFuZCBib3R0b20pIGFyZSAlLXJlbGF0aXZlIHRvIHRoZSAqd2lkdGgqIG9mIHRoZSBwYXJlbnQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGF4aXMgPSAoL21hcmdpbnxwYWRkaW5nfGxlZnR8cmlnaHR8d2lkdGh8dGV4dHx3b3JkfGxldHRlci9pLnRlc3QocHJvcGVydHkpIHx8IC9YJC8udGVzdChwcm9wZXJ0eSkgfHwgcHJvcGVydHkgPT09IFwieFwiKSA/IFwieFwiIDogXCJ5XCI7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBJbiBvcmRlciB0byBhdm9pZCBnZW5lcmF0aW5nIG5eMiBiZXNwb2tlIGNvbnZlcnNpb24gZnVuY3Rpb25zLCB1bml0IGNvbnZlcnNpb24gaXMgYSB0d28tc3RlcCBwcm9jZXNzOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgMSkgQ29udmVydCBzdGFydFZhbHVlIGludG8gcGl4ZWxzLiAyKSBDb252ZXJ0IHRoaXMgbmV3IHBpeGVsIHZhbHVlIGludG8gZW5kVmFsdWUncyB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN3aXRjaCAoc3RhcnRWYWx1ZVVuaXRUeXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIiVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIE5vdGU6IHRyYW5zbGF0ZVggYW5kIHRyYW5zbGF0ZVkgYXJlIHRoZSBvbmx5IHByb3BlcnRpZXMgdGhhdCBhcmUgJS1yZWxhdGl2ZSB0byBhbiBlbGVtZW50J3Mgb3duIGRpbWVuc2lvbnMgLS0gbm90IGl0cyBwYXJlbnQncyBkaW1lbnNpb25zLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IFZlbG9jaXR5IGRvZXMgbm90IGluY2x1ZGUgYSBzcGVjaWFsIGNvbnZlcnNpb24gcHJvY2VzcyB0byBhY2NvdW50IGZvciB0aGlzIGJlaGF2aW9yLiBUaGVyZWZvcmUsIGFuaW1hdGluZyB0cmFuc2xhdGVYL1kgZnJvbSBhICUgdmFsdWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCB0byBhIG5vbi0lIHZhbHVlIHdpbGwgcHJvZHVjZSBhbiBpbmNvcnJlY3Qgc3RhcnQgdmFsdWUuIEZvcnR1bmF0ZWx5LCB0aGlzIHNvcnQgb2YgY3Jvc3MtdW5pdCBjb252ZXJzaW9uIGlzIHJhcmVseSBkb25lIGJ5IHVzZXJzIGluIHByYWN0aWNlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSAqPSAoYXhpcyA9PT0gXCJ4XCIgPyBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhLnBlcmNlbnRUb1B4V2lkdGggOiBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhLnBlcmNlbnRUb1B4SGVpZ2h0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwicHhcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIHB4IGFjdHMgYXMgb3VyIG1pZHBvaW50IGluIHRoZSB1bml0IGNvbnZlcnNpb24gcHJvY2VzczsgZG8gbm90aGluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSAqPSBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhW3N0YXJ0VmFsdWVVbml0VHlwZSArIFwiVG9QeFwiXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogSW52ZXJ0IHRoZSBweCByYXRpb3MgdG8gY29udmVydCBpbnRvIHRvIHRoZSB0YXJnZXQgdW5pdC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0c3dpdGNoIChlbmRWYWx1ZVVuaXRUeXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIiVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgKj0gMSAvIChheGlzID09PSBcInhcIiA/IGVsZW1lbnRVbml0Q29udmVyc2lvbkRhdGEucGVyY2VudFRvUHhXaWR0aCA6IGVsZW1lbnRVbml0Q29udmVyc2lvbkRhdGEucGVyY2VudFRvUHhIZWlnaHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJweFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Lyogc3RhcnRWYWx1ZSBpcyBhbHJlYWR5IGluIHB4LCBkbyBub3RoaW5nOyB3ZSdyZSBkb25lLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlICo9IDEgLyBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhW2VuZFZhbHVlVW5pdFR5cGUgKyBcIlRvUHhcIl07XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHQgUmVsYXRpdmUgVmFsdWVzXHJcblx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogT3BlcmF0b3IgbG9naWMgbXVzdCBiZSBwZXJmb3JtZWQgbGFzdCBzaW5jZSBpdCByZXF1aXJlcyB1bml0LW5vcm1hbGl6ZWQgc3RhcnQgYW5kIGVuZCB2YWx1ZXMuICovXHJcblx0XHRcdFx0XHRcdFx0LyogTm90ZTogUmVsYXRpdmUgKnBlcmNlbnQgdmFsdWVzKiBkbyBub3QgYmVoYXZlIGhvdyBtb3N0IHBlb3BsZSB0aGluazsgd2hpbGUgb25lIHdvdWxkIGV4cGVjdCBcIis9NTAlXCJcclxuXHRcdFx0XHRcdFx0XHQgdG8gaW5jcmVhc2UgdGhlIHByb3BlcnR5IDEuNXggaXRzIGN1cnJlbnQgdmFsdWUsIGl0IGluIGZhY3QgaW5jcmVhc2VzIHRoZSBwZXJjZW50IHVuaXRzIGluIGFic29sdXRlIHRlcm1zOlxyXG5cdFx0XHRcdFx0XHRcdCA1MCBwb2ludHMgaXMgYWRkZWQgb24gdG9wIG9mIHRoZSBjdXJyZW50ICUgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChvcGVyYXRvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIitcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBzdGFydFZhbHVlICsgZW5kVmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCItXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gc3RhcnRWYWx1ZSAtIGVuZFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiKlwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IHN0YXJ0VmFsdWUgKiBlbmRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9cIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBzdGFydFZhbHVlIC8gZW5kVmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IHR3ZWVuc0NvbnRhaW5lciBQdXNoXHJcblx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBDb25zdHJ1Y3QgdGhlIHBlci1wcm9wZXJ0eSB0d2VlbiBvYmplY3QsIGFuZCBwdXNoIGl0IHRvIHRoZSBlbGVtZW50J3MgdHdlZW5zQ29udGFpbmVyLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0gPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZTogcm9vdFByb3BlcnR5VmFsdWUsXHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlOiBzdGFydFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFZhbHVlOiBzdGFydFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWU6IGVuZFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0dW5pdFR5cGU6IGVuZFZhbHVlVW5pdFR5cGUsXHJcblx0XHRcdFx0XHRcdFx0XHRlYXNpbmc6IGVhc2luZ1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0aWYgKHBhdHRlcm4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0ucGF0dGVybiA9IHBhdHRlcm47XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoVmVsb2NpdHkuZGVidWcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwidHdlZW5zQ29udGFpbmVyIChcIiArIHByb3BlcnR5ICsgXCIpOiBcIiArIEpTT04uc3RyaW5naWZ5KHR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0pLCBlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBDcmVhdGUgYSB0d2VlbiBvdXQgb2YgZWFjaCBwcm9wZXJ0eSwgYW5kIGFwcGVuZCBpdHMgYXNzb2NpYXRlZCBkYXRhIHRvIHR3ZWVuc0NvbnRhaW5lci4gKi9cclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllc01hcCkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIXByb3BlcnRpZXNNYXAuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0LyogVGhlIG9yaWdpbmFsIHByb3BlcnR5IG5hbWUncyBmb3JtYXQgbXVzdCBiZSB1c2VkIGZvciB0aGUgcGFyc2VQcm9wZXJ0eVZhbHVlKCkgbG9va3VwLFxyXG5cdFx0XHRcdFx0XHRcdCBidXQgd2UgdGhlbiB1c2UgaXRzIGNhbWVsQ2FzZSBzdHlsaW5nIHRvIG5vcm1hbGl6ZSBpdCBmb3IgbWFuaXB1bGF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHZhciBwcm9wZXJ0eU5hbWUgPSBDU1MuTmFtZXMuY2FtZWxDYXNlKHByb3BlcnR5KSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWVEYXRhID0gcGFyc2VQcm9wZXJ0eVZhbHVlKHByb3BlcnRpZXNNYXBbcHJvcGVydHldKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogRmluZCBzaG9ydGhhbmQgY29sb3IgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgYSBoZXggc3RyaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIFdvdWxkIGJlIHF1aWNrZXIgdG8gdXNlIENTUy5MaXN0cy5jb2xvcnMuaW5jbHVkZXMoKSBpZiBwb3NzaWJsZSAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChfaW5BcnJheShDU1MuTGlzdHMuY29sb3JzLCBwcm9wZXJ0eU5hbWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBQYXJzZSB0aGUgdmFsdWUgZGF0YSBmb3IgZWFjaCBzaG9ydGhhbmQuICovXHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgZW5kVmFsdWUgPSB2YWx1ZURhdGFbMF0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWFzaW5nID0gdmFsdWVEYXRhWzFdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSB2YWx1ZURhdGFbMl07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKENTUy5SZWdFeC5pc0hleC50ZXN0KGVuZFZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBDb252ZXJ0IHRoZSBoZXggc3RyaW5ncyBpbnRvIHRoZWlyIFJHQiBjb21wb25lbnQgYXJyYXlzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgY29sb3JDb21wb25lbnRzID0gW1wiUmVkXCIsIFwiR3JlZW5cIiwgXCJCbHVlXCJdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWVSR0IgPSBDU1MuVmFsdWVzLmhleFRvUmdiKGVuZFZhbHVlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWVSR0IgPSBzdGFydFZhbHVlID8gQ1NTLlZhbHVlcy5oZXhUb1JnYihzdGFydFZhbHVlKSA6IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIEluamVjdCB0aGUgUkdCIGNvbXBvbmVudCB0d2VlbnMgaW50byBwcm9wZXJ0aWVzTWFwLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNvbG9yQ29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBkYXRhQXJyYXkgPSBbZW5kVmFsdWVSR0JbaV1dO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZWFzaW5nKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhQXJyYXkucHVzaChlYXNpbmcpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHN0YXJ0VmFsdWVSR0IgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YUFycmF5LnB1c2goc3RhcnRWYWx1ZVJHQltpXSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaXhQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSArIGNvbG9yQ29tcG9uZW50c1tpXSwgZGF0YUFycmF5KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB3ZSBoYXZlIHJlcGxhY2VkIGEgc2hvcnRjdXQgY29sb3IgdmFsdWUgdGhlbiBkb24ndCB1cGRhdGUgdGhlIHN0YW5kYXJkIHByb3BlcnR5IG5hbWUgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGZpeFByb3BlcnR5VmFsdWUocHJvcGVydHlOYW1lLCB2YWx1ZURhdGEpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBBbG9uZyB3aXRoIGl0cyBwcm9wZXJ0eSBkYXRhLCBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBpdHNlbGYgb250byB0d2VlbnNDb250YWluZXIuICovXHJcblx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lci5lbGVtZW50ID0gZWxlbWVudDtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdCBDYWxsIFB1c2hcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHQvKiBOb3RlOiB0d2VlbnNDb250YWluZXIgY2FuIGJlIGVtcHR5IGlmIGFsbCBvZiB0aGUgcHJvcGVydGllcyBpbiB0aGlzIGNhbGwncyBwcm9wZXJ0eSBtYXAgd2VyZSBza2lwcGVkIGR1ZSB0byBub3RcclxuXHRcdFx0XHRcdCBiZWluZyBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuIFRoZSBlbGVtZW50IHByb3BlcnR5IGlzIHVzZWQgZm9yIGNoZWNraW5nIHRoYXQgdGhlIHR3ZWVuc0NvbnRhaW5lciBoYXMgYmVlbiBhcHBlbmRlZCB0by4gKi9cclxuXHRcdFx0XHRcdGlmICh0d2VlbnNDb250YWluZXIuZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHQvKiBBcHBseSB0aGUgXCJ2ZWxvY2l0eS1hbmltYXRpbmdcIiBpbmRpY2F0b3IgY2xhc3MuICovXHJcblx0XHRcdFx0XHRcdENTUy5WYWx1ZXMuYWRkQ2xhc3MoZWxlbWVudCwgXCJ2ZWxvY2l0eS1hbmltYXRpbmdcIik7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUaGUgY2FsbCBhcnJheSBob3VzZXMgdGhlIHR3ZWVuc0NvbnRhaW5lcnMgZm9yIGVhY2ggZWxlbWVudCBiZWluZyBhbmltYXRlZCBpbiB0aGUgY3VycmVudCBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0XHRjYWxsLnB1c2godHdlZW5zQ29udGFpbmVyKTtcclxuXHJcblx0XHRcdFx0XHRcdGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKGRhdGEpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBTdG9yZSB0aGUgdHdlZW5zQ29udGFpbmVyIGFuZCBvcHRpb25zIGlmIHdlJ3JlIHdvcmtpbmcgb24gdGhlIGRlZmF1bHQgZWZmZWN0cyBxdWV1ZSwgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGJ5IHRoZSByZXZlcnNlIGNvbW1hbmQuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKG9wdHMucXVldWUgPT09IFwiXCIpIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhLnR3ZWVuc0NvbnRhaW5lciA9IHR3ZWVuc0NvbnRhaW5lcjtcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGEub3B0cyA9IG9wdHM7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBTd2l0Y2ggb24gdGhlIGVsZW1lbnQncyBhbmltYXRpbmcgZmxhZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRkYXRhLmlzQW5pbWF0aW5nID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogT25jZSB0aGUgZmluYWwgZWxlbWVudCBpbiB0aGlzIGNhbGwncyBlbGVtZW50IHNldCBoYXMgYmVlbiBwcm9jZXNzZWQsIHB1c2ggdGhlIGNhbGwgYXJyYXkgb250b1xyXG5cdFx0XHRcdFx0XHQgVmVsb2NpdHkuU3RhdGUuY2FsbHMgZm9yIHRoZSBhbmltYXRpb24gdGljayB0byBpbW1lZGlhdGVseSBiZWdpbiBwcm9jZXNzaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudHNJbmRleCA9PT0gZWxlbWVudHNMZW5ndGggLSAxKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogQWRkIHRoZSBjdXJyZW50IGNhbGwgcGx1cyBpdHMgYXNzb2NpYXRlZCBtZXRhZGF0YSAodGhlIGVsZW1lbnQgc2V0IGFuZCB0aGUgY2FsbCdzIG9wdGlvbnMpIG9udG8gdGhlIGdsb2JhbCBjYWxsIGNvbnRhaW5lci5cclxuXHRcdFx0XHRcdFx0XHQgQW55dGhpbmcgb24gdGhpcyBjYWxsIGNvbnRhaW5lciBpcyBzdWJqZWN0ZWQgdG8gdGljaygpIHByb2Nlc3NpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuU3RhdGUuY2FsbHMucHVzaChbY2FsbCwgZWxlbWVudHMsIG9wdHMsIG51bGwsIHByb21pc2VEYXRhLnJlc29sdmVyLCBudWxsLCAwXSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBhbmltYXRpb24gdGljayBpc24ndCBydW5uaW5nLCBzdGFydCBpdC4gKFZlbG9jaXR5IHNodXRzIGl0IG9mZiB3aGVuIHRoZXJlIGFyZSBubyBhY3RpdmUgY2FsbHMgdG8gcHJvY2Vzcy4pICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LlN0YXRlLmlzVGlja2luZyA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmlzVGlja2luZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogU3RhcnQgdGhlIHRpY2sgbG9vcC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHRpY2soKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudHNJbmRleCsrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKiBXaGVuIHRoZSBxdWV1ZSBvcHRpb24gaXMgc2V0IHRvIGZhbHNlLCB0aGUgY2FsbCBza2lwcyB0aGUgZWxlbWVudCdzIHF1ZXVlIGFuZCBmaXJlcyBpbW1lZGlhdGVseS4gKi9cclxuXHRcdFx0XHRpZiAob3B0cy5xdWV1ZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdC8qIFNpbmNlIHRoaXMgYnVpbGRRdWV1ZSBjYWxsIGRvZXNuJ3QgcmVzcGVjdCB0aGUgZWxlbWVudCdzIGV4aXN0aW5nIHF1ZXVlICh3aGljaCBpcyB3aGVyZSBhIGRlbGF5IG9wdGlvbiB3b3VsZCBoYXZlIGJlZW4gYXBwZW5kZWQpLFxyXG5cdFx0XHRcdFx0IHdlIG1hbnVhbGx5IGluamVjdCB0aGUgZGVsYXkgcHJvcGVydHkgaGVyZSB3aXRoIGFuIGV4cGxpY2l0IHNldFRpbWVvdXQuICovXHJcblx0XHRcdFx0XHRpZiAob3B0cy5kZWxheSkge1xyXG5cclxuXHRcdFx0XHRcdFx0LyogVGVtcG9yYXJpbHkgc3RvcmUgZGVsYXllZCBlbGVtZW50cyB0byBmYWNpbGl0YXRlIGFjY2VzcyBmb3IgZ2xvYmFsIHBhdXNlL3Jlc3VtZSAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgY2FsbEluZGV4ID0gVmVsb2NpdHkuU3RhdGUuZGVsYXllZEVsZW1lbnRzLmNvdW50Kys7XHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmRlbGF5ZWRFbGVtZW50c1tjYWxsSW5kZXhdID0gZWxlbWVudDtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBkZWxheUNvbXBsZXRlID0gKGZ1bmN0aW9uKGluZGV4KSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ2xlYXIgdGhlIHRlbXBvcmFyeSBlbGVtZW50ICovXHJcblx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5kZWxheWVkRWxlbWVudHNbaW5kZXhdID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogRmluYWxseSwgaXNzdWUgdGhlIGNhbGwgKi9cclxuXHRcdFx0XHRcdFx0XHRcdGJ1aWxkUXVldWUoKTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9KShjYWxsSW5kZXgpO1xyXG5cclxuXHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS5kZWxheUJlZ2luID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcclxuXHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS5kZWxheSA9IHBhcnNlRmxvYXQob3B0cy5kZWxheSk7XHJcblx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkuZGVsYXlUaW1lciA9IHtcclxuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0OiBzZXRUaW1lb3V0KGJ1aWxkUXVldWUsIHBhcnNlRmxvYXQob3B0cy5kZWxheSkpLFxyXG5cdFx0XHRcdFx0XHRcdG5leHQ6IGRlbGF5Q29tcGxldGVcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGJ1aWxkUXVldWUoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8qIE90aGVyd2lzZSwgdGhlIGNhbGwgdW5kZXJnb2VzIGVsZW1lbnQgcXVldWVpbmcgYXMgbm9ybWFsLiAqL1xyXG5cdFx0XHRcdFx0LyogTm90ZTogVG8gaW50ZXJvcGVyYXRlIHdpdGggalF1ZXJ5LCBWZWxvY2l0eSB1c2VzIGpRdWVyeSdzIG93biAkLnF1ZXVlKCkgc3RhY2sgZm9yIHF1ZXVpbmcgbG9naWMuICovXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdCQucXVldWUoZWxlbWVudCwgb3B0cy5xdWV1ZSwgZnVuY3Rpb24obmV4dCwgY2xlYXJRdWV1ZSkge1xyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgY2xlYXJRdWV1ZSBmbGFnIHdhcyBwYXNzZWQgaW4gYnkgdGhlIHN0b3AgY29tbWFuZCwgcmVzb2x2ZSB0aGlzIGNhbGwncyBwcm9taXNlLiAoUHJvbWlzZXMgY2FuIG9ubHkgYmUgcmVzb2x2ZWQgb25jZSxcclxuXHRcdFx0XHRcdFx0IHNvIGl0J3MgZmluZSBpZiB0aGlzIGlzIHJlcGVhdGVkbHkgdHJpZ2dlcmVkIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGFzc29jaWF0ZWQgY2FsbC4pICovXHJcblx0XHRcdFx0XHRcdGlmIChjbGVhclF1ZXVlID09PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHByb21pc2VEYXRhLnByb21pc2UpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHByb21pc2VEYXRhLnJlc29sdmVyKGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIERvIG5vdCBjb250aW51ZSB3aXRoIGFuaW1hdGlvbiBxdWV1ZWluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogVGhpcyBmbGFnIGluZGljYXRlcyB0byB0aGUgdXBjb21pbmcgY29tcGxldGVDYWxsKCkgZnVuY3Rpb24gdGhhdCB0aGlzIHF1ZXVlIGVudHJ5IHdhcyBpbml0aWF0ZWQgYnkgVmVsb2NpdHkuXHJcblx0XHRcdFx0XHRcdCBTZWUgY29tcGxldGVDYWxsKCkgZm9yIGZ1cnRoZXIgZGV0YWlscy4gKi9cclxuXHRcdFx0XHRcdFx0VmVsb2NpdHkudmVsb2NpdHlRdWV1ZUVudHJ5RmxhZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRidWlsZFF1ZXVlKG5leHQpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IEF1dG8tRGVxdWV1aW5nXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogQXMgcGVyIGpRdWVyeSdzICQucXVldWUoKSBiZWhhdmlvciwgdG8gZmlyZSB0aGUgZmlyc3Qgbm9uLWN1c3RvbS1xdWV1ZSBlbnRyeSBvbiBhbiBlbGVtZW50LCB0aGUgZWxlbWVudFxyXG5cdFx0XHRcdCBtdXN0IGJlIGRlcXVldWVkIGlmIGl0cyBxdWV1ZSBzdGFjayBjb25zaXN0cyAqc29sZWx5KiBvZiB0aGUgY3VycmVudCBjYWxsLiAoVGhpcyBjYW4gYmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZ1xyXG5cdFx0XHRcdCBmb3IgdGhlIFwiaW5wcm9ncmVzc1wiIGl0ZW0gdGhhdCBqUXVlcnkgcHJlcGVuZHMgdG8gYWN0aXZlIHF1ZXVlIHN0YWNrIGFycmF5cy4pIFJlZ2FyZGxlc3MsIHdoZW5ldmVyIHRoZSBlbGVtZW50J3NcclxuXHRcdFx0XHQgcXVldWUgaXMgZnVydGhlciBhcHBlbmRlZCB3aXRoIGFkZGl0aW9uYWwgaXRlbXMgLS0gaW5jbHVkaW5nICQuZGVsYXkoKSdzIG9yIGV2ZW4gJC5hbmltYXRlKCkgY2FsbHMsIHRoZSBxdWV1ZSdzXHJcblx0XHRcdFx0IGZpcnN0IGVudHJ5IGlzIGF1dG9tYXRpY2FsbHkgZmlyZWQuIFRoaXMgYmVoYXZpb3IgY29udHJhc3RzIHRoYXQgb2YgY3VzdG9tIHF1ZXVlcywgd2hpY2ggbmV2ZXIgYXV0by1maXJlLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IFdoZW4gYW4gZWxlbWVudCBzZXQgaXMgYmVpbmcgc3ViamVjdGVkIHRvIGEgbm9uLXBhcmFsbGVsIFZlbG9jaXR5IGNhbGwsIHRoZSBhbmltYXRpb24gd2lsbCBub3QgYmVnaW4gdW50aWxcclxuXHRcdFx0XHQgZWFjaCBvbmUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzZXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgaW5kaXZpZHVhbGx5IHByZS1leGlzdGluZyBxdWV1ZSBjaGFpbi4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBVbmZvcnR1bmF0ZWx5LCBtb3N0IHBlb3BsZSBkb24ndCBmdWxseSBncmFzcCBqUXVlcnkncyBwb3dlcmZ1bCwgeWV0IHF1aXJreSwgJC5xdWV1ZSgpIGZ1bmN0aW9uLlxyXG5cdFx0XHRcdCBMZWFuIG1vcmUgaGVyZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDU4MTU4L2Nhbi1zb21lYm9keS1leHBsYWluLWpxdWVyeS1xdWV1ZS10by1tZSAqL1xyXG5cdFx0XHRcdGlmICgob3B0cy5xdWV1ZSA9PT0gXCJcIiB8fCBvcHRzLnF1ZXVlID09PSBcImZ4XCIpICYmICQucXVldWUoZWxlbWVudClbMF0gIT09IFwiaW5wcm9ncmVzc1wiKSB7XHJcblx0XHRcdFx0XHQkLmRlcXVldWUoZWxlbWVudCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IEVsZW1lbnQgU2V0IEl0ZXJhdGlvblxyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBJZiB0aGUgXCJub2RlVHlwZVwiIHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgZWxlbWVudHMgdmFyaWFibGUsIHdlJ3JlIGFuaW1hdGluZyBhIHNpbmdsZSBlbGVtZW50LlxyXG5cdFx0XHQgUGxhY2UgaXQgaW4gYW4gYXJyYXkgc28gdGhhdCAkLmVhY2goKSBjYW4gaXRlcmF0ZSBvdmVyIGl0LiAqL1xyXG5cdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGksIGVsZW1lbnQpIHtcclxuXHRcdFx0XHQvKiBFbnN1cmUgZWFjaCBlbGVtZW50IGluIGEgc2V0IGhhcyBhIG5vZGVUeXBlIChpcyBhIHJlYWwgZWxlbWVudCkgdG8gYXZvaWQgdGhyb3dpbmcgZXJyb3JzLiAqL1xyXG5cdFx0XHRcdGlmIChUeXBlLmlzTm9kZShlbGVtZW50KSkge1xyXG5cdFx0XHRcdFx0cHJvY2Vzc0VsZW1lbnQoZWxlbWVudCwgaSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IE9wdGlvbjogTG9vcFxyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogVGhlIGxvb3Agb3B0aW9uIGFjY2VwdHMgYW4gaW50ZWdlciBpbmRpY2F0aW5nIGhvdyBtYW55IHRpbWVzIHRoZSBlbGVtZW50IHNob3VsZCBsb29wIGJldHdlZW4gdGhlIHZhbHVlcyBpbiB0aGVcclxuXHRcdFx0IGN1cnJlbnQgY2FsbCdzIHByb3BlcnRpZXMgbWFwIGFuZCB0aGUgZWxlbWVudCdzIHByb3BlcnR5IHZhbHVlcyBwcmlvciB0byB0aGlzIGNhbGwuICovXHJcblx0XHRcdC8qIE5vdGU6IFRoZSBsb29wIG9wdGlvbidzIGxvZ2ljIGlzIHBlcmZvcm1lZCBoZXJlIC0tIGFmdGVyIGVsZW1lbnQgcHJvY2Vzc2luZyAtLSBiZWNhdXNlIHRoZSBjdXJyZW50IGNhbGwgbmVlZHNcclxuXHRcdFx0IHRvIHVuZGVyZ28gaXRzIHF1ZXVlIGluc2VydGlvbiBwcmlvciB0byB0aGUgbG9vcCBvcHRpb24gZ2VuZXJhdGluZyBpdHMgc2VyaWVzIG9mIGNvbnN0aXR1ZW50IFwicmV2ZXJzZVwiIGNhbGxzLFxyXG5cdFx0XHQgd2hpY2ggY2hhaW4gYWZ0ZXIgdGhlIGN1cnJlbnQgY2FsbC4gVHdvIHJldmVyc2UgY2FsbHMgKHR3byBcImFsdGVybmF0aW9uc1wiKSBjb25zdGl0dXRlIG9uZSBsb29wLiAqL1xyXG5cdFx0XHRvcHRzID0gJC5leHRlbmQoe30sIFZlbG9jaXR5LmRlZmF1bHRzLCBvcHRpb25zKTtcclxuXHRcdFx0b3B0cy5sb29wID0gcGFyc2VJbnQob3B0cy5sb29wLCAxMCk7XHJcblx0XHRcdHZhciByZXZlcnNlQ2FsbHNDb3VudCA9IChvcHRzLmxvb3AgKiAyKSAtIDE7XHJcblxyXG5cdFx0XHRpZiAob3B0cy5sb29wKSB7XHJcblx0XHRcdFx0LyogRG91YmxlIHRoZSBsb29wIGNvdW50IHRvIGNvbnZlcnQgaXQgaW50byBpdHMgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIFwicmV2ZXJzZVwiIGNhbGxzLlxyXG5cdFx0XHRcdCBTdWJ0cmFjdCAxIGZyb20gdGhlIHJlc3VsdGluZyB2YWx1ZSBzaW5jZSB0aGUgY3VycmVudCBjYWxsIGlzIGluY2x1ZGVkIGluIHRoZSB0b3RhbCBhbHRlcm5hdGlvbiBjb3VudC4gKi9cclxuXHRcdFx0XHRmb3IgKHZhciB4ID0gMDsgeCA8IHJldmVyc2VDYWxsc0NvdW50OyB4KyspIHtcclxuXHRcdFx0XHRcdC8qIFNpbmNlIHRoZSBsb2dpYyBmb3IgdGhlIHJldmVyc2UgYWN0aW9uIG9jY3VycyBpbnNpZGUgUXVldWVpbmcgYW5kIHRoZXJlZm9yZSB0aGlzIGNhbGwncyBvcHRpb25zIG9iamVjdFxyXG5cdFx0XHRcdFx0IGlzbid0IHBhcnNlZCB1bnRpbCB0aGVuIGFzIHdlbGwsIHRoZSBjdXJyZW50IGNhbGwncyBkZWxheSBvcHRpb24gbXVzdCBiZSBleHBsaWNpdGx5IHBhc3NlZCBpbnRvIHRoZSByZXZlcnNlXHJcblx0XHRcdFx0XHQgY2FsbCBzbyB0aGF0IHRoZSBkZWxheSBsb2dpYyB0aGF0IG9jY3VycyBpbnNpZGUgKlByZS1RdWV1ZWluZyogY2FuIHByb2Nlc3MgaXQuICovXHJcblx0XHRcdFx0XHR2YXIgcmV2ZXJzZU9wdGlvbnMgPSB7XHJcblx0XHRcdFx0XHRcdGRlbGF5OiBvcHRzLmRlbGF5LFxyXG5cdFx0XHRcdFx0XHRwcm9ncmVzczogb3B0cy5wcm9ncmVzc1xyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiBhIGNvbXBsZXRlIGNhbGxiYWNrIHdhcyBwYXNzZWQgaW50byB0aGlzIGNhbGwsIHRyYW5zZmVyIGl0IHRvIHRoZSBsb29wIHJlZGlyZWN0J3MgZmluYWwgXCJyZXZlcnNlXCIgY2FsbFxyXG5cdFx0XHRcdFx0IHNvIHRoYXQgaXQncyB0cmlnZ2VyZWQgd2hlbiB0aGUgZW50aXJlIHJlZGlyZWN0IGlzIGNvbXBsZXRlIChhbmQgbm90IHdoZW4gdGhlIHZlcnkgZmlyc3QgYW5pbWF0aW9uIGlzIGNvbXBsZXRlKS4gKi9cclxuXHRcdFx0XHRcdGlmICh4ID09PSByZXZlcnNlQ2FsbHNDb3VudCAtIDEpIHtcclxuXHRcdFx0XHRcdFx0cmV2ZXJzZU9wdGlvbnMuZGlzcGxheSA9IG9wdHMuZGlzcGxheTtcclxuXHRcdFx0XHRcdFx0cmV2ZXJzZU9wdGlvbnMudmlzaWJpbGl0eSA9IG9wdHMudmlzaWJpbGl0eTtcclxuXHRcdFx0XHRcdFx0cmV2ZXJzZU9wdGlvbnMuY29tcGxldGUgPSBvcHRzLmNvbXBsZXRlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGFuaW1hdGUoZWxlbWVudHMsIFwicmV2ZXJzZVwiLCByZXZlcnNlT3B0aW9ucyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqXHJcblx0XHRcdCBDaGFpbmluZ1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogUmV0dXJuIHRoZSBlbGVtZW50cyBiYWNrIHRvIHRoZSBjYWxsIGNoYWluLCB3aXRoIHdyYXBwZWQgZWxlbWVudHMgdGFraW5nIHByZWNlZGVuY2UgaW4gY2FzZSBWZWxvY2l0eSB3YXMgY2FsbGVkIHZpYSB0aGUgJC5mbi4gZXh0ZW5zaW9uLiAqL1xyXG5cdFx0XHRyZXR1cm4gZ2V0Q2hhaW4oKTtcclxuXHRcdH07XHJcblxyXG5cdFx0LyogVHVybiBWZWxvY2l0eSBpbnRvIHRoZSBhbmltYXRpb24gZnVuY3Rpb24sIGV4dGVuZGVkIHdpdGggdGhlIHByZS1leGlzdGluZyBWZWxvY2l0eSBvYmplY3QuICovXHJcblx0XHRWZWxvY2l0eSA9ICQuZXh0ZW5kKGFuaW1hdGUsIFZlbG9jaXR5KTtcclxuXHRcdC8qIEZvciBsZWdhY3kgc3VwcG9ydCwgYWxzbyBleHBvc2UgdGhlIGxpdGVyYWwgYW5pbWF0ZSBtZXRob2QuICovXHJcblx0XHRWZWxvY2l0eS5hbmltYXRlID0gYW5pbWF0ZTtcclxuXHJcblx0XHQvKioqKioqKioqKioqKipcclxuXHRcdCBUaW1pbmdcclxuXHRcdCAqKioqKioqKioqKioqKi9cclxuXHJcblx0XHQvKiBUaWNrZXIgZnVuY3Rpb24uICovXHJcblx0XHR2YXIgdGlja2VyID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCByQUZTaGltO1xyXG5cclxuXHRcdC8qIEluYWN0aXZlIGJyb3dzZXIgdGFicyBwYXVzZSByQUYsIHdoaWNoIHJlc3VsdHMgaW4gYWxsIGFjdGl2ZSBhbmltYXRpb25zIGltbWVkaWF0ZWx5IHNwcmludGluZyB0byB0aGVpciBjb21wbGV0aW9uIHN0YXRlcyB3aGVuIHRoZSB0YWIgcmVmb2N1c2VzLlxyXG5cdFx0IFRvIGdldCBhcm91bmQgdGhpcywgd2UgZHluYW1pY2FsbHkgc3dpdGNoIHJBRiB0byBzZXRUaW1lb3V0ICh3aGljaCB0aGUgYnJvd3NlciAqZG9lc24ndCogcGF1c2UpIHdoZW4gdGhlIHRhYiBsb3NlcyBmb2N1cy4gV2Ugc2tpcCB0aGlzIGZvciBtb2JpbGVcclxuXHRcdCBkZXZpY2VzIHRvIGF2b2lkIHdhc3RpbmcgYmF0dGVyeSBwb3dlciBvbiBpbmFjdGl2ZSB0YWJzLiAqL1xyXG5cdFx0LyogTm90ZTogVGFiIGZvY3VzIGRldGVjdGlvbiBkb2Vzbid0IHdvcmsgb24gb2xkZXIgdmVyc2lvbnMgb2YgSUUsIGJ1dCB0aGF0J3Mgb2theSBzaW5jZSB0aGV5IGRvbid0IHN1cHBvcnQgckFGIHRvIGJlZ2luIHdpdGguICovXHJcblx0XHRpZiAoIVZlbG9jaXR5LlN0YXRlLmlzTW9iaWxlICYmIGRvY3VtZW50LmhpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHZhciB1cGRhdGVUaWNrZXIgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHQvKiBSZWFzc2lnbiB0aGUgckFGIGZ1bmN0aW9uICh3aGljaCB0aGUgZ2xvYmFsIHRpY2soKSBmdW5jdGlvbiB1c2VzKSBiYXNlZCBvbiB0aGUgdGFiJ3MgZm9jdXMgc3RhdGUuICovXHJcblx0XHRcdFx0aWYgKGRvY3VtZW50LmhpZGRlbikge1xyXG5cdFx0XHRcdFx0dGlja2VyID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdFx0LyogVGhlIHRpY2sgZnVuY3Rpb24gbmVlZHMgYSB0cnV0aHkgZmlyc3QgYXJndW1lbnQgaW4gb3JkZXIgdG8gcGFzcyBpdHMgaW50ZXJuYWwgdGltZXN0YW1wIGNoZWNrLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayh0cnVlKTtcclxuXHRcdFx0XHRcdFx0fSwgMTYpO1xyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvKiBUaGUgckFGIGxvb3AgaGFzIGJlZW4gcGF1c2VkIGJ5IHRoZSBicm93c2VyLCBzbyB3ZSBtYW51YWxseSByZXN0YXJ0IHRoZSB0aWNrLiAqL1xyXG5cdFx0XHRcdFx0dGljaygpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aWNrZXIgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHJBRlNoaW07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0LyogUGFnZSBjb3VsZCBiZSBzaXR0aW5nIGluIHRoZSBiYWNrZ3JvdW5kIGF0IHRoaXMgdGltZSAoaS5lLiBvcGVuZWQgYXMgbmV3IHRhYikgc28gbWFraW5nIHN1cmUgd2UgdXNlIGNvcnJlY3QgdGlja2VyIGZyb20gdGhlIHN0YXJ0ICovXHJcblx0XHRcdHVwZGF0ZVRpY2tlcigpO1xyXG5cclxuXHRcdFx0LyogQW5kIHRoZW4gcnVuIGNoZWNrIGFnYWluIGV2ZXJ5IHRpbWUgdmlzaWJpbGl0eSBjaGFuZ2VzICovXHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHVwZGF0ZVRpY2tlcik7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqKioqKioqKioqKlxyXG5cdFx0IFRpY2tcclxuXHRcdCAqKioqKioqKioqKiovXHJcblxyXG5cdFx0LyogTm90ZTogQWxsIGNhbGxzIHRvIFZlbG9jaXR5IGFyZSBwdXNoZWQgdG8gdGhlIFZlbG9jaXR5LlN0YXRlLmNhbGxzIGFycmF5LCB3aGljaCBpcyBmdWxseSBpdGVyYXRlZCB0aHJvdWdoIHVwb24gZWFjaCB0aWNrLiAqL1xyXG5cdFx0ZnVuY3Rpb24gdGljayh0aW1lc3RhbXApIHtcclxuXHRcdFx0LyogQW4gZW1wdHkgdGltZXN0YW1wIGFyZ3VtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgaXMgdGhlIGZpcnN0IHRpY2sgb2NjdXJlbmNlIHNpbmNlIHRpY2tpbmcgd2FzIHR1cm5lZCBvbi5cclxuXHRcdFx0IFdlIGxldmVyYWdlIHRoaXMgbWV0YWRhdGEgdG8gZnVsbHkgaWdub3JlIHRoZSBmaXJzdCB0aWNrIHBhc3Mgc2luY2UgUkFGJ3MgaW5pdGlhbCBwYXNzIGlzIGZpcmVkIHdoZW5ldmVyXHJcblx0XHRcdCB0aGUgYnJvd3NlcidzIG5leHQgdGljayBzeW5jIHRpbWUgb2NjdXJzLCB3aGljaCByZXN1bHRzIGluIHRoZSBmaXJzdCBlbGVtZW50cyBzdWJqZWN0ZWQgdG8gVmVsb2NpdHlcclxuXHRcdFx0IGNhbGxzIGJlaW5nIGFuaW1hdGVkIG91dCBvZiBzeW5jIHdpdGggYW55IGVsZW1lbnRzIGFuaW1hdGVkIGltbWVkaWF0ZWx5IHRoZXJlYWZ0ZXIuIEluIHNob3J0LCB3ZSBpZ25vcmVcclxuXHRcdFx0IHRoZSBmaXJzdCBSQUYgdGljayBwYXNzIHNvIHRoYXQgZWxlbWVudHMgYmVpbmcgaW1tZWRpYXRlbHkgY29uc2VjdXRpdmVseSBhbmltYXRlZCAtLSBpbnN0ZWFkIG9mIHNpbXVsdGFuZW91c2x5IGFuaW1hdGVkXHJcblx0XHRcdCBieSB0aGUgc2FtZSBWZWxvY2l0eSBjYWxsIC0tIGFyZSBwcm9wZXJseSBiYXRjaGVkIGludG8gdGhlIHNhbWUgaW5pdGlhbCBSQUYgdGljayBhbmQgY29uc2VxdWVudGx5IHJlbWFpbiBpbiBzeW5jIHRoZXJlYWZ0ZXIuICovXHJcblx0XHRcdGlmICh0aW1lc3RhbXApIHtcclxuXHRcdFx0XHQvKiBXZSBub3JtYWxseSB1c2UgUkFGJ3MgaGlnaCByZXNvbHV0aW9uIHRpbWVzdGFtcCBidXQgYXMgaXQgY2FuIGJlIHNpZ25pZmljYW50bHkgb2Zmc2V0IHdoZW4gdGhlIGJyb3dzZXIgaXNcclxuXHRcdFx0XHQgdW5kZXIgaGlnaCBzdHJlc3Mgd2UgZ2l2ZSB0aGUgb3B0aW9uIGZvciBjaG9wcGluZXNzIG92ZXIgYWxsb3dpbmcgdGhlIGJyb3dzZXIgdG8gZHJvcCBodWdlIGNodW5rcyBvZiBmcmFtZXMuXHJcblx0XHRcdFx0IFdlIHVzZSBwZXJmb3JtYW5jZS5ub3coKSBhbmQgc2hpbSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0IGZvciB3aGVuIHRoZSB0YWIgaXMgaGlkZGVuLiAqL1xyXG5cdFx0XHRcdHZhciB0aW1lQ3VycmVudCA9IFZlbG9jaXR5LnRpbWVzdGFtcCAmJiB0aW1lc3RhbXAgIT09IHRydWUgPyB0aW1lc3RhbXAgOiBwZXJmb3JtYW5jZS5ub3coKTtcclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IENhbGwgSXRlcmF0aW9uXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHR2YXIgY2FsbHNMZW5ndGggPSBWZWxvY2l0eS5TdGF0ZS5jYWxscy5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdC8qIFRvIHNwZWVkIHVwIGl0ZXJhdGluZyBvdmVyIHRoaXMgYXJyYXksIGl0IGlzIGNvbXBhY3RlZCAoZmFsc2V5IGl0ZW1zIC0tIGNhbGxzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgLS0gYXJlIHJlbW92ZWQpXHJcblx0XHRcdFx0IHdoZW4gaXRzIGxlbmd0aCBoYXMgYmFsbG9vbmVkIHRvIGEgcG9pbnQgdGhhdCBjYW4gaW1wYWN0IHRpY2sgcGVyZm9ybWFuY2UuIFRoaXMgb25seSBiZWNvbWVzIG5lY2Vzc2FyeSB3aGVuIGFuaW1hdGlvblxyXG5cdFx0XHRcdCBoYXMgYmVlbiBjb250aW51b3VzIHdpdGggbWFueSBlbGVtZW50cyBvdmVyIGEgbG9uZyBwZXJpb2Qgb2YgdGltZTsgd2hlbmV2ZXIgYWxsIGFjdGl2ZSBjYWxscyBhcmUgY29tcGxldGVkLCBjb21wbGV0ZUNhbGwoKSBjbGVhcnMgVmVsb2NpdHkuU3RhdGUuY2FsbHMuICovXHJcblx0XHRcdFx0aWYgKGNhbGxzTGVuZ3RoID4gMTAwMDApIHtcclxuXHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmNhbGxzID0gY29tcGFjdFNwYXJzZUFycmF5KFZlbG9jaXR5LlN0YXRlLmNhbGxzKTtcclxuXHRcdFx0XHRcdGNhbGxzTGVuZ3RoID0gVmVsb2NpdHkuU3RhdGUuY2FsbHMubGVuZ3RoO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggYWN0aXZlIGNhbGwuICovXHJcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsc0xlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHQvKiBXaGVuIGEgVmVsb2NpdHkgY2FsbCBpcyBjb21wbGV0ZWQsIGl0cyBWZWxvY2l0eS5TdGF0ZS5jYWxscyBlbnRyeSBpcyBzZXQgdG8gZmFsc2UuIENvbnRpbnVlIG9uIHRvIHRoZSBuZXh0IGNhbGwuICovXHJcblx0XHRcdFx0XHRpZiAoIVZlbG9jaXR5LlN0YXRlLmNhbGxzW2ldKSB7XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdCBDYWxsLVdpZGUgVmFyaWFibGVzXHJcblx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdHZhciBjYWxsQ29udGFpbmVyID0gVmVsb2NpdHkuU3RhdGUuY2FsbHNbaV0sXHJcblx0XHRcdFx0XHRcdFx0Y2FsbCA9IGNhbGxDb250YWluZXJbMF0sXHJcblx0XHRcdFx0XHRcdFx0b3B0cyA9IGNhbGxDb250YWluZXJbMl0sXHJcblx0XHRcdFx0XHRcdFx0dGltZVN0YXJ0ID0gY2FsbENvbnRhaW5lclszXSxcclxuXHRcdFx0XHRcdFx0XHRmaXJzdFRpY2sgPSAhdGltZVN0YXJ0LFxyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuRHVtbXlWYWx1ZSA9IG51bGwsXHJcblx0XHRcdFx0XHRcdFx0cGF1c2VPYmplY3QgPSBjYWxsQ29udGFpbmVyWzVdLFxyXG5cdFx0XHRcdFx0XHRcdG1pbGxpc2Vjb25kc0VsbGFwc2VkID0gY2FsbENvbnRhaW5lcls2XTtcclxuXHJcblxyXG5cclxuXHRcdFx0XHRcdC8qIElmIHRpbWVTdGFydCBpcyB1bmRlZmluZWQsIHRoZW4gdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGF0IHRoaXMgY2FsbCBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgdGljaygpLlxyXG5cdFx0XHRcdFx0IFdlIGFzc2lnbiB0aW1lU3RhcnQgbm93IHNvIHRoYXQgaXRzIHZhbHVlIGlzIGFzIGNsb3NlIHRvIHRoZSByZWFsIGFuaW1hdGlvbiBzdGFydCB0aW1lIGFzIHBvc3NpYmxlLlxyXG5cdFx0XHRcdFx0IChDb252ZXJzZWx5LCBoYWQgdGltZVN0YXJ0IGJlZW4gZGVmaW5lZCB3aGVuIHRoaXMgY2FsbCB3YXMgYWRkZWQgdG8gVmVsb2NpdHkuU3RhdGUuY2FsbHMsIHRoZSBkZWxheVxyXG5cdFx0XHRcdFx0IGJldHdlZW4gdGhhdCB0aW1lIGFuZCBub3cgd291bGQgY2F1c2UgdGhlIGZpcnN0IGZldyBmcmFtZXMgb2YgdGhlIHR3ZWVuIHRvIGJlIHNraXBwZWQgc2luY2VcclxuXHRcdFx0XHRcdCBwZXJjZW50Q29tcGxldGUgaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aW1lU3RhcnQuKSAqL1xyXG5cdFx0XHRcdFx0LyogRnVydGhlciwgc3VidHJhY3QgMTZtcyAodGhlIGFwcHJveGltYXRlIHJlc29sdXRpb24gb2YgUkFGKSBmcm9tIHRoZSBjdXJyZW50IHRpbWUgdmFsdWUgc28gdGhhdCB0aGVcclxuXHRcdFx0XHRcdCBmaXJzdCB0aWNrIGl0ZXJhdGlvbiBpc24ndCB3YXN0ZWQgYnkgYW5pbWF0aW5nIGF0IDAlIHR3ZWVuIGNvbXBsZXRpb24sIHdoaWNoIHdvdWxkIHByb2R1Y2UgdGhlXHJcblx0XHRcdFx0XHQgc2FtZSBzdHlsZSB2YWx1ZSBhcyB0aGUgZWxlbWVudCdzIGN1cnJlbnQgdmFsdWUuICovXHJcblx0XHRcdFx0XHRpZiAoIXRpbWVTdGFydCkge1xyXG5cdFx0XHRcdFx0XHR0aW1lU3RhcnQgPSBWZWxvY2l0eS5TdGF0ZS5jYWxsc1tpXVszXSA9IHRpbWVDdXJyZW50IC0gMTY7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgYSBwYXVzZSBvYmplY3QgaXMgcHJlc2VudCwgc2tpcCBwcm9jZXNzaW5nIHVubGVzcyBpdCBoYXMgYmVlbiBzZXQgdG8gcmVzdW1lICovXHJcblx0XHRcdFx0XHRpZiAocGF1c2VPYmplY3QpIHtcclxuXHRcdFx0XHRcdFx0aWYgKHBhdXNlT2JqZWN0LnJlc3VtZSA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIFVwZGF0ZSB0aGUgdGltZSBzdGFydCB0byBhY2NvbW9kYXRlIHRoZSBwYXVzZWQgY29tcGxldGlvbiBhbW91bnQgKi9cclxuXHRcdFx0XHRcdFx0XHR0aW1lU3RhcnQgPSBjYWxsQ29udGFpbmVyWzNdID0gTWF0aC5yb3VuZCh0aW1lQ3VycmVudCAtIG1pbGxpc2Vjb25kc0VsbGFwc2VkIC0gMTYpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBSZW1vdmUgcGF1c2Ugb2JqZWN0IGFmdGVyIHByb2Nlc3NpbmcgKi9cclxuXHRcdFx0XHRcdFx0XHRjYWxsQ29udGFpbmVyWzVdID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdG1pbGxpc2Vjb25kc0VsbGFwc2VkID0gY2FsbENvbnRhaW5lcls2XSA9IHRpbWVDdXJyZW50IC0gdGltZVN0YXJ0O1xyXG5cclxuXHRcdFx0XHRcdC8qIFRoZSB0d2VlbidzIGNvbXBsZXRpb24gcGVyY2VudGFnZSBpcyByZWxhdGl2ZSB0byB0aGUgdHdlZW4ncyBzdGFydCB0aW1lLCBub3QgdGhlIHR3ZWVuJ3Mgc3RhcnQgdmFsdWVcclxuXHRcdFx0XHRcdCAod2hpY2ggd291bGQgcmVzdWx0IGluIHVucHJlZGljdGFibGUgdHdlZW4gZHVyYXRpb25zIHNpbmNlIEphdmFTY3JpcHQncyB0aW1lcnMgYXJlIG5vdCBwYXJ0aWN1bGFybHkgYWNjdXJhdGUpLlxyXG5cdFx0XHRcdFx0IEFjY29yZGluZ2x5LCB3ZSBlbnN1cmUgdGhhdCBwZXJjZW50Q29tcGxldGUgZG9lcyBub3QgZXhjZWVkIDEuICovXHJcblx0XHRcdFx0XHR2YXIgcGVyY2VudENvbXBsZXRlID0gTWF0aC5taW4oKG1pbGxpc2Vjb25kc0VsbGFwc2VkKSAvIG9wdHMuZHVyYXRpb24sIDEpO1xyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgRWxlbWVudCBJdGVyYXRpb25cclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIEZvciBldmVyeSBjYWxsLCBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiB0aGUgZWxlbWVudHMgaW4gaXRzIHNldC4gKi9cclxuXHRcdFx0XHRcdGZvciAodmFyIGogPSAwLCBjYWxsTGVuZ3RoID0gY2FsbC5sZW5ndGg7IGogPCBjYWxsTGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdFx0dmFyIHR3ZWVuc0NvbnRhaW5lciA9IGNhbGxbal0sXHJcblx0XHRcdFx0XHRcdFx0XHRlbGVtZW50ID0gdHdlZW5zQ29udGFpbmVyLmVsZW1lbnQ7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBlbGVtZW50IGhhcyBiZWVuIGRlbGV0ZWQgbWlkd2F5IHRocm91Z2ggdGhlIGFuaW1hdGlvbiBieSBjaGVja2luZyBmb3IgdGhlXHJcblx0XHRcdFx0XHRcdCBjb250aW51ZWQgZXhpc3RlbmNlIG9mIGl0cyBkYXRhIGNhY2hlLiBJZiBpdCdzIGdvbmUsIG9yIHRoZSBlbGVtZW50IGlzIGN1cnJlbnRseSBwYXVzZWQsIHNraXAgYW5pbWF0aW5nIHRoaXMgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKCFEYXRhKGVsZW1lbnQpKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHZhciB0cmFuc2Zvcm1Qcm9wZXJ0eUV4aXN0cyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IERpc3BsYXkgJiBWaXNpYmlsaXR5IFRvZ2dsaW5nXHJcblx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIGRpc3BsYXkgb3B0aW9uIGlzIHNldCB0byBub24tXCJub25lXCIsIHNldCBpdCB1cGZyb250IHNvIHRoYXQgdGhlIGVsZW1lbnQgY2FuIGJlY29tZSB2aXNpYmxlIGJlZm9yZSB0d2VlbmluZyBiZWdpbnMuXHJcblx0XHRcdFx0XHRcdCAoT3RoZXJ3aXNlLCBkaXNwbGF5J3MgXCJub25lXCIgdmFsdWUgaXMgc2V0IGluIGNvbXBsZXRlQ2FsbCgpIG9uY2UgdGhlIGFuaW1hdGlvbiBoYXMgY29tcGxldGVkLikgKi9cclxuXHRcdFx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuZGlzcGxheSAhPT0gbnVsbCAmJiBvcHRzLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSA9PT0gXCJmbGV4XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBmbGV4VmFsdWVzID0gW1wiLXdlYmtpdC1ib3hcIiwgXCItbW96LWJveFwiLCBcIi1tcy1mbGV4Ym94XCIsIFwiLXdlYmtpdC1mbGV4XCJdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdCQuZWFjaChmbGV4VmFsdWVzLCBmdW5jdGlvbihpLCBmbGV4VmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJkaXNwbGF5XCIsIGZsZXhWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiZGlzcGxheVwiLCBvcHRzLmRpc3BsYXkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTYW1lIGdvZXMgd2l0aCB0aGUgdmlzaWJpbGl0eSBvcHRpb24sIGJ1dCBpdHMgXCJub25lXCIgZXF1aXZhbGVudCBpcyBcImhpZGRlblwiLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAob3B0cy52aXNpYmlsaXR5ICE9PSB1bmRlZmluZWQgJiYgb3B0cy52aXNpYmlsaXR5ICE9PSBcImhpZGRlblwiKSB7XHJcblx0XHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJ2aXNpYmlsaXR5XCIsIG9wdHMudmlzaWJpbGl0eSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IFByb3BlcnR5IEl0ZXJhdGlvblxyXG5cdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogRm9yIGV2ZXJ5IGVsZW1lbnQsIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIHByb3BlcnR5LiAqL1xyXG5cdFx0XHRcdFx0XHRmb3IgKHZhciBwcm9wZXJ0eSBpbiB0d2VlbnNDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBJbiBhZGRpdGlvbiB0byBwcm9wZXJ0eSB0d2VlbiBkYXRhLCB0d2VlbnNDb250YWluZXIgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gaXRzIGFzc29jaWF0ZWQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAodHdlZW5zQ29udGFpbmVyLmhhc093blByb3BlcnR5KHByb3BlcnR5KSAmJiBwcm9wZXJ0eSAhPT0gXCJlbGVtZW50XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciB0d2VlbiA9IHR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEVhc2luZyBjYW4gZWl0aGVyIGJlIGEgcHJlLWdlbmVyZWF0ZWQgZnVuY3Rpb24gb3IgYSBzdHJpbmcgdGhhdCByZWZlcmVuY2VzIGEgcHJlLXJlZ2lzdGVyZWQgZWFzaW5nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IG9uIHRoZSBWZWxvY2l0eS5FYXNpbmdzIG9iamVjdC4gSW4gZWl0aGVyIGNhc2UsIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgZWFzaW5nICpmdW5jdGlvbiouICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWFzaW5nID0gVHlwZS5pc1N0cmluZyh0d2Vlbi5lYXNpbmcpID8gVmVsb2NpdHkuRWFzaW5nc1t0d2Vlbi5lYXNpbmddIDogdHdlZW4uZWFzaW5nO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdCBDdXJyZW50IFZhbHVlIENhbGN1bGF0aW9uXHJcblx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChUeXBlLmlzU3RyaW5nKHR3ZWVuLnBhdHRlcm4pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBwYXR0ZXJuUmVwbGFjZSA9IHBlcmNlbnRDb21wbGV0ZSA9PT0gMSA/XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigkMCwgaW5kZXgsIHJvdW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSB0d2Vlbi5lbmRWYWx1ZVtpbmRleF07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcm91bmQgPyBNYXRoLnJvdW5kKHJlc3VsdCkgOiByZXN1bHQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IDpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCQwLCBpbmRleCwgcm91bmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHN0YXJ0VmFsdWUgPSB0d2Vlbi5zdGFydFZhbHVlW2luZGV4XSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuRGVsdGEgPSB0d2Vlbi5lbmRWYWx1ZVtpbmRleF0gLSBzdGFydFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0ID0gc3RhcnRWYWx1ZSArICh0d2VlbkRlbHRhICogZWFzaW5nKHBlcmNlbnRDb21wbGV0ZSwgb3B0cywgdHdlZW5EZWx0YSkpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJvdW5kID8gTWF0aC5yb3VuZChyZXN1bHQpIDogcmVzdWx0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuLnBhdHRlcm4ucmVwbGFjZSgveyhcXGQrKSghKT99L2csIHBhdHRlcm5SZXBsYWNlKTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocGVyY2VudENvbXBsZXRlID09PSAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoaXMgaXMgdGhlIGxhc3QgdGljayBwYXNzIChpZiB3ZSd2ZSByZWFjaGVkIDEwMCUgY29tcGxldGlvbiBmb3IgdGhpcyB0d2VlbiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdCBlbnN1cmUgdGhhdCBjdXJyZW50VmFsdWUgaXMgZXhwbGljaXRseSBzZXQgdG8gaXRzIHRhcmdldCBlbmRWYWx1ZSBzbyB0aGF0IGl0J3Mgbm90IHN1YmplY3RlZCB0byBhbnkgcm91bmRpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuLmVuZFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogT3RoZXJ3aXNlLCBjYWxjdWxhdGUgY3VycmVudFZhbHVlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRlbHRhIGZyb20gc3RhcnRWYWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHR3ZWVuRGVsdGEgPSB0d2Vlbi5lbmRWYWx1ZSAtIHR3ZWVuLnN0YXJ0VmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSB0d2Vlbi5zdGFydFZhbHVlICsgKHR3ZWVuRGVsdGEgKiBlYXNpbmcocGVyY2VudENvbXBsZXRlLCBvcHRzLCB0d2VlbkRlbHRhKSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIG5vIHZhbHVlIGNoYW5nZSBpcyBvY2N1cnJpbmcsIGRvbid0IHByb2NlZWQgd2l0aCBET00gdXBkYXRpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIWZpcnN0VGljayAmJiAoY3VycmVudFZhbHVlID09PSB0d2Vlbi5jdXJyZW50VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHR3ZWVuLmN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBJZiB3ZSdyZSB0d2VlbmluZyBhIGZha2UgJ3R3ZWVuJyBwcm9wZXJ0eSBpbiBvcmRlciB0byBsb2cgdHJhbnNpdGlvbiB2YWx1ZXMsIHVwZGF0ZSB0aGUgb25lLXBlci1jYWxsIHZhcmlhYmxlIHNvIHRoYXRcclxuXHRcdFx0XHRcdFx0XHRcdCBpdCBjYW4gYmUgcGFzc2VkIGludG8gdGhlIHByb2dyZXNzIGNhbGxiYWNrLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5ID09PSBcInR3ZWVuXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dHdlZW5EdW1teVZhbHVlID0gY3VycmVudFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgSG9va3M6IFBhcnQgSVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgaG9va1Jvb3Q7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBGb3IgaG9va2VkIHByb3BlcnRpZXMsIHRoZSBuZXdseS11cGRhdGVkIHJvb3RQcm9wZXJ0eVZhbHVlQ2FjaGUgaXMgY2FjaGVkIG9udG8gdGhlIGVsZW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgZm9yIHN1YnNlcXVlbnQgaG9va3MgaW4gdGhpcyBjYWxsIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSByb290IHByb3BlcnR5LiBJZiB3ZSBkaWRuJ3QgY2FjaGUgdGhlIHVwZGF0ZWRcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHJvb3RQcm9wZXJ0eVZhbHVlLCBlYWNoIHN1YnNlcXVlbnQgdXBkYXRlIHRvIHRoZSByb290IHByb3BlcnR5IGluIHRoaXMgdGljayBwYXNzIHdvdWxkIHJlc2V0IHRoZSBwcmV2aW91cyBob29rJ3NcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHVwZGF0ZXMgdG8gcm9vdFByb3BlcnR5VmFsdWUgcHJpb3IgdG8gaW5qZWN0aW9uLiBBIG5pY2UgcGVyZm9ybWFuY2UgYnlwcm9kdWN0IG9mIHJvb3RQcm9wZXJ0eVZhbHVlIGNhY2hpbmcgaXMgdGhhdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgc3Vic2VxdWVudGx5IGNoYWluZWQgYW5pbWF0aW9ucyB1c2luZyB0aGUgc2FtZSBob29rUm9vdCBidXQgYSBkaWZmZXJlbnQgaG9vayBjYW4gdXNlIHRoaXMgY2FjaGVkIHJvb3RQcm9wZXJ0eVZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoQ1NTLkhvb2tzLnJlZ2lzdGVyZWRbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aG9va1Jvb3QgPSBDU1MuSG9va3MuZ2V0Um9vdChwcm9wZXJ0eSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciByb290UHJvcGVydHlWYWx1ZUNhY2hlID0gRGF0YShlbGVtZW50KS5yb290UHJvcGVydHlWYWx1ZUNhY2hlW2hvb2tSb290XTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvb3RQcm9wZXJ0eVZhbHVlQ2FjaGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuLnJvb3RQcm9wZXJ0eVZhbHVlID0gcm9vdFByb3BlcnR5VmFsdWVDYWNoZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgRE9NIFVwZGF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBzZXRQcm9wZXJ0eVZhbHVlKCkgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgbmFtZSBhbmQgcHJvcGVydHkgdmFsdWUgcG9zdCBhbnkgbm9ybWFsaXphdGlvbiB0aGF0IG1heSBoYXZlIGJlZW4gcGVyZm9ybWVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBUbyBzb2x2ZSBhbiBJRTw9OCBwb3NpdGlvbmluZyBidWcsIHRoZSB1bml0IHR5cGUgaXMgZHJvcHBlZCB3aGVuIHNldHRpbmcgYSBwcm9wZXJ0eSB2YWx1ZSBvZiAwLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgYWRqdXN0ZWRTZXREYXRhID0gQ1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgLyogU0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuLmN1cnJlbnRWYWx1ZSArIChJRSA8IDkgJiYgcGFyc2VGbG9hdChjdXJyZW50VmFsdWUpID09PSAwID8gXCJcIiA6IHR3ZWVuLnVuaXRUeXBlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuLnJvb3RQcm9wZXJ0eVZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHdlZW4uc2Nyb2xsRGF0YSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgSG9va3M6IFBhcnQgSUlcclxuXHRcdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBob29rJ3MgdXBkYXRlZCByb290UHJvcGVydHlWYWx1ZSAodGhlIHBvc3QtcHJvY2Vzc2VkIHZhbHVlIHByb3ZpZGVkIGJ5IGFkanVzdGVkU2V0RGF0YSksIGNhY2hlIGl0IG9udG8gdGhlIGVsZW1lbnQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChDU1MuSG9va3MucmVnaXN0ZXJlZFtwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBTaW5jZSBhZGp1c3RlZFNldERhdGEgY29udGFpbnMgbm9ybWFsaXplZCBkYXRhIHJlYWR5IGZvciBET00gdXBkYXRpbmcsIHRoZSByb290UHJvcGVydHlWYWx1ZSBuZWVkcyB0byBiZSByZS1leHRyYWN0ZWQgZnJvbSBpdHMgbm9ybWFsaXplZCBmb3JtLiA/PyAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtob29rUm9vdF0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkucm9vdFByb3BlcnR5VmFsdWVDYWNoZVtob29rUm9vdF0gPSBDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtob29rUm9vdF0oXCJleHRyYWN0XCIsIG51bGwsIGFkanVzdGVkU2V0RGF0YVsxXSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkucm9vdFByb3BlcnR5VmFsdWVDYWNoZVtob29rUm9vdF0gPSBhZGp1c3RlZFNldERhdGFbMV07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0XHRcdCBUcmFuc2Zvcm1zXHJcblx0XHRcdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBGbGFnIHdoZXRoZXIgYSB0cmFuc2Zvcm0gcHJvcGVydHkgaXMgYmVpbmcgYW5pbWF0ZWQgc28gdGhhdCBmbHVzaFRyYW5zZm9ybUNhY2hlKCkgY2FuIGJlIHRyaWdnZXJlZCBvbmNlIHRoaXMgdGljayBwYXNzIGlzIGNvbXBsZXRlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWRqdXN0ZWRTZXREYXRhWzBdID09PSBcInRyYW5zZm9ybVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtUHJvcGVydHlFeGlzdHMgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IG1vYmlsZUhBXHJcblx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgbW9iaWxlSEEgaXMgZW5hYmxlZCwgc2V0IHRoZSB0cmFuc2xhdGUzZCB0cmFuc2Zvcm0gdG8gbnVsbCB0byBmb3JjZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24uXHJcblx0XHRcdFx0XHRcdCBJdCdzIHNhZmUgdG8gb3ZlcnJpZGUgdGhpcyBwcm9wZXJ0eSBzaW5jZSBWZWxvY2l0eSBkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgaXRzIGFuaW1hdGlvbiAoaG9va3MgYXJlIHVzZWQgaW4gaXRzIHBsYWNlKS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKG9wdHMubW9iaWxlSEEpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBEb24ndCBzZXQgdGhlIG51bGwgdHJhbnNmb3JtIGhhY2sgaWYgd2UndmUgYWxyZWFkeSBkb25lIHNvLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlLnRyYW5zbGF0ZTNkID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEFsbCBlbnRyaWVzIG9uIHRoZSB0cmFuc2Zvcm1DYWNoZSBvYmplY3QgYXJlIGxhdGVyIGNvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIHRyYW5zZm9ybSBzdHJpbmcgdmlhIGZsdXNoVHJhbnNmb3JtQ2FjaGUoKS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkudHJhbnNmb3JtQ2FjaGUudHJhbnNsYXRlM2QgPSBcIigwcHgsIDBweCwgMHB4KVwiO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHRyYW5zZm9ybVByb3BlcnR5RXhpc3RzID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1Qcm9wZXJ0eUV4aXN0cykge1xyXG5cdFx0XHRcdFx0XHRcdENTUy5mbHVzaFRyYW5zZm9ybUNhY2hlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogVGhlIG5vbi1cIm5vbmVcIiBkaXNwbGF5IHZhbHVlIGlzIG9ubHkgYXBwbGllZCB0byBhbiBlbGVtZW50IG9uY2UgLS0gd2hlbiBpdHMgYXNzb2NpYXRlZCBjYWxsIGlzIGZpcnN0IHRpY2tlZCB0aHJvdWdoLlxyXG5cdFx0XHRcdFx0IEFjY29yZGluZ2x5LCBpdCdzIHNldCB0byBmYWxzZSBzbyB0aGF0IGl0IGlzbid0IHJlLXByb2Nlc3NlZCBieSB0aGlzIGNhbGwgaW4gdGhlIG5leHQgdGljay4gKi9cclxuXHRcdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmNhbGxzW2ldWzJdLmRpc3BsYXkgPSBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChvcHRzLnZpc2liaWxpdHkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLnZpc2liaWxpdHkgIT09IFwiaGlkZGVuXCIpIHtcclxuXHRcdFx0XHRcdFx0VmVsb2NpdHkuU3RhdGUuY2FsbHNbaV1bMl0udmlzaWJpbGl0eSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIFBhc3MgdGhlIGVsZW1lbnRzIGFuZCB0aGUgdGltaW5nIGRhdGEgKHBlcmNlbnRDb21wbGV0ZSwgbXNSZW1haW5pbmcsIHRpbWVTdGFydCwgdHdlZW5EdW1teVZhbHVlKSBpbnRvIHRoZSBwcm9ncmVzcyBjYWxsYmFjay4gKi9cclxuXHRcdFx0XHRcdGlmIChvcHRzLnByb2dyZXNzKSB7XHJcblx0XHRcdFx0XHRcdG9wdHMucHJvZ3Jlc3MuY2FsbChjYWxsQ29udGFpbmVyWzFdLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y2FsbENvbnRhaW5lclsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdHBlcmNlbnRDb21wbGV0ZSxcclxuXHRcdFx0XHRcdFx0XHRcdE1hdGgubWF4KDAsICh0aW1lU3RhcnQgKyBvcHRzLmR1cmF0aW9uKSAtIHRpbWVDdXJyZW50KSxcclxuXHRcdFx0XHRcdFx0XHRcdHRpbWVTdGFydCxcclxuXHRcdFx0XHRcdFx0XHRcdHR3ZWVuRHVtbXlWYWx1ZSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZCB0d2VlbmluZywgcGFzcyBpdHMgaW5kZXggdG8gY29tcGxldGVDYWxsKCkgdG8gaGFuZGxlIGNhbGwgY2xlYW51cC4gKi9cclxuXHRcdFx0XHRcdGlmIChwZXJjZW50Q29tcGxldGUgPT09IDEpIHtcclxuXHRcdFx0XHRcdFx0Y29tcGxldGVDYWxsKGkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogTm90ZTogY29tcGxldGVDYWxsKCkgc2V0cyB0aGUgaXNUaWNraW5nIGZsYWcgdG8gZmFsc2Ugd2hlbiB0aGUgbGFzdCBjYWxsIG9uIFZlbG9jaXR5LlN0YXRlLmNhbGxzIGhhcyBjb21wbGV0ZWQuICovXHJcblx0XHRcdGlmIChWZWxvY2l0eS5TdGF0ZS5pc1RpY2tpbmcpIHtcclxuXHRcdFx0XHR0aWNrZXIodGljayk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0IENhbGwgQ29tcGxldGlvblxyXG5cdFx0ICoqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0LyogTm90ZTogVW5saWtlIHRpY2soKSwgd2hpY2ggcHJvY2Vzc2VzIGFsbCBhY3RpdmUgY2FsbHMgYXQgb25jZSwgY2FsbCBjb21wbGV0aW9uIGlzIGhhbmRsZWQgb24gYSBwZXItY2FsbCBiYXNpcy4gKi9cclxuXHRcdGZ1bmN0aW9uIGNvbXBsZXRlQ2FsbChjYWxsSW5kZXgsIGlzU3RvcHBlZCkge1xyXG5cdFx0XHQvKiBFbnN1cmUgdGhlIGNhbGwgZXhpc3RzLiAqL1xyXG5cdFx0XHRpZiAoIVZlbG9jaXR5LlN0YXRlLmNhbGxzW2NhbGxJbmRleF0pIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFB1bGwgdGhlIG1ldGFkYXRhIGZyb20gdGhlIGNhbGwuICovXHJcblx0XHRcdHZhciBjYWxsID0gVmVsb2NpdHkuU3RhdGUuY2FsbHNbY2FsbEluZGV4XVswXSxcclxuXHRcdFx0XHRcdGVsZW1lbnRzID0gVmVsb2NpdHkuU3RhdGUuY2FsbHNbY2FsbEluZGV4XVsxXSxcclxuXHRcdFx0XHRcdG9wdHMgPSBWZWxvY2l0eS5TdGF0ZS5jYWxsc1tjYWxsSW5kZXhdWzJdLFxyXG5cdFx0XHRcdFx0cmVzb2x2ZXIgPSBWZWxvY2l0eS5TdGF0ZS5jYWxsc1tjYWxsSW5kZXhdWzRdO1xyXG5cclxuXHRcdFx0dmFyIHJlbWFpbmluZ0NhbGxzRXhpc3QgPSBmYWxzZTtcclxuXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBFbGVtZW50IEZpbmFsaXphdGlvblxyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdGZvciAodmFyIGkgPSAwLCBjYWxsTGVuZ3RoID0gY2FsbC5sZW5ndGg7IGkgPCBjYWxsTGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgZWxlbWVudCA9IGNhbGxbaV0uZWxlbWVudDtcclxuXHJcblx0XHRcdFx0LyogSWYgdGhlIHVzZXIgc2V0IGRpc3BsYXkgdG8gXCJub25lXCIgKGludGVuZGluZyB0byBoaWRlIHRoZSBlbGVtZW50KSwgc2V0IGl0IG5vdyB0aGF0IHRoZSBhbmltYXRpb24gaGFzIGNvbXBsZXRlZC4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBkaXNwbGF5Om5vbmUgaXNuJ3Qgc2V0IHdoZW4gY2FsbHMgYXJlIG1hbnVhbGx5IHN0b3BwZWQgKHZpYSBWZWxvY2l0eShcInN0b3BcIikuICovXHJcblx0XHRcdFx0LyogTm90ZTogRGlzcGxheSBnZXRzIGlnbm9yZWQgd2l0aCBcInJldmVyc2VcIiBjYWxscyBhbmQgaW5maW5pdGUgbG9vcHMsIHNpbmNlIHRoaXMgYmVoYXZpb3Igd291bGQgYmUgdW5kZXNpcmFibGUuICovXHJcblx0XHRcdFx0aWYgKCFpc1N0b3BwZWQgJiYgIW9wdHMubG9vcCkge1xyXG5cdFx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSA9PT0gXCJub25lXCIpIHtcclxuXHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJkaXNwbGF5XCIsIG9wdHMuZGlzcGxheSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKG9wdHMudmlzaWJpbGl0eSA9PT0gXCJoaWRkZW5cIikge1xyXG5cdFx0XHRcdFx0XHRDU1Muc2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInZpc2liaWxpdHlcIiwgb3B0cy52aXNpYmlsaXR5KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIElmIHRoZSBlbGVtZW50J3MgcXVldWUgaXMgZW1wdHkgKGlmIG9ubHkgdGhlIFwiaW5wcm9ncmVzc1wiIGl0ZW0gaXMgbGVmdCBhdCBwb3NpdGlvbiAwKSBvciBpZiBpdHMgcXVldWUgaXMgYWJvdXQgdG8gcnVuXHJcblx0XHRcdFx0IGEgbm9uLVZlbG9jaXR5LWluaXRpYXRlZCBlbnRyeSwgdHVybiBvZmYgdGhlIGlzQW5pbWF0aW5nIGZsYWcuIEEgbm9uLVZlbG9jaXR5LWluaXRpYXRpZWQgcXVldWUgZW50cnkncyBsb2dpYyBtaWdodCBhbHRlclxyXG5cdFx0XHRcdCBhbiBlbGVtZW50J3MgQ1NTIHZhbHVlcyBhbmQgdGhlcmVieSBjYXVzZSBWZWxvY2l0eSdzIGNhY2hlZCB2YWx1ZSBkYXRhIHRvIGdvIHN0YWxlLiBUbyBkZXRlY3QgaWYgYSBxdWV1ZSBlbnRyeSB3YXMgaW5pdGlhdGVkIGJ5IFZlbG9jaXR5LFxyXG5cdFx0XHRcdCB3ZSBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBvdXIgc3BlY2lhbCBWZWxvY2l0eS5xdWV1ZUVudHJ5RmxhZyBkZWNsYXJhdGlvbiwgd2hpY2ggbWluaWZpZXJzIHdvbid0IHJlbmFtZSBzaW5jZSB0aGUgZmxhZ1xyXG5cdFx0XHRcdCBpcyBhc3NpZ25lZCB0byBqUXVlcnkncyBnbG9iYWwgJCBvYmplY3QgYW5kIHRodXMgZXhpc3RzIG91dCBvZiBWZWxvY2l0eSdzIG93biBzY29wZS4gKi9cclxuXHRcdFx0XHR2YXIgZGF0YSA9IERhdGEoZWxlbWVudCk7XHJcblxyXG5cdFx0XHRcdGlmIChvcHRzLmxvb3AgIT09IHRydWUgJiYgKCQucXVldWUoZWxlbWVudClbMV0gPT09IHVuZGVmaW5lZCB8fCAhL1xcLnZlbG9jaXR5UXVldWVFbnRyeUZsYWcvaS50ZXN0KCQucXVldWUoZWxlbWVudClbMV0pKSkge1xyXG5cdFx0XHRcdFx0LyogVGhlIGVsZW1lbnQgbWF5IGhhdmUgYmVlbiBkZWxldGVkLiBFbnN1cmUgdGhhdCBpdHMgZGF0YSBjYWNoZSBzdGlsbCBleGlzdHMgYmVmb3JlIGFjdGluZyBvbiBpdC4gKi9cclxuXHRcdFx0XHRcdGlmIChkYXRhKSB7XHJcblx0XHRcdFx0XHRcdGRhdGEuaXNBbmltYXRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0LyogQ2xlYXIgdGhlIGVsZW1lbnQncyByb290UHJvcGVydHlWYWx1ZUNhY2hlLCB3aGljaCB3aWxsIGJlY29tZSBzdGFsZS4gKi9cclxuXHRcdFx0XHRcdFx0ZGF0YS5yb290UHJvcGVydHlWYWx1ZUNhY2hlID0ge307XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgdHJhbnNmb3JtSEFQcm9wZXJ0eUV4aXN0cyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHQvKiBJZiBhbnkgM0QgdHJhbnNmb3JtIHN1YnByb3BlcnR5IGlzIGF0IGl0cyBkZWZhdWx0IHZhbHVlIChyZWdhcmRsZXNzIG9mIHVuaXQgdHlwZSksIHJlbW92ZSBpdC4gKi9cclxuXHRcdFx0XHRcdFx0JC5lYWNoKENTUy5MaXN0cy50cmFuc2Zvcm1zM0QsIGZ1bmN0aW9uKGksIHRyYW5zZm9ybU5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgZGVmYXVsdFZhbHVlID0gL15zY2FsZS8udGVzdCh0cmFuc2Zvcm1OYW1lKSA/IDEgOiAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSBkYXRhLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXSAhPT0gdW5kZWZpbmVkICYmIG5ldyBSZWdFeHAoXCJeXFxcXChcIiArIGRlZmF1bHRWYWx1ZSArIFwiW14uXVwiKS50ZXN0KGN1cnJlbnRWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRyYW5zZm9ybUhBUHJvcGVydHlFeGlzdHMgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBNb2JpbGUgZGV2aWNlcyBoYXZlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiByZW1vdmVkIGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbiBpbiBvcmRlciB0byBhdm9pZCBob2dnaW5nIHRoZSBHUFUncyBtZW1vcnkuICovXHJcblx0XHRcdFx0XHRcdGlmIChvcHRzLm1vYmlsZUhBKSB7XHJcblx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtSEFQcm9wZXJ0eUV4aXN0cyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGRhdGEudHJhbnNmb3JtQ2FjaGUudHJhbnNsYXRlM2Q7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIEZsdXNoIHRoZSBzdWJwcm9wZXJ0eSByZW1vdmFscyB0byB0aGUgRE9NLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAodHJhbnNmb3JtSEFQcm9wZXJ0eUV4aXN0cykge1xyXG5cdFx0XHRcdFx0XHRcdENTUy5mbHVzaFRyYW5zZm9ybUNhY2hlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBSZW1vdmUgdGhlIFwidmVsb2NpdHktYW5pbWF0aW5nXCIgaW5kaWNhdG9yIGNsYXNzLiAqL1xyXG5cdFx0XHRcdFx0XHRDU1MuVmFsdWVzLnJlbW92ZUNsYXNzKGVsZW1lbnQsIFwidmVsb2NpdHktYW5pbWF0aW5nXCIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IENvbXBsZXRlXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogQ29tcGxldGUgaXMgZmlyZWQgb25jZSBwZXIgY2FsbCAobm90IG9uY2UgcGVyIGVsZW1lbnQpIGFuZCBpcyBwYXNzZWQgdGhlIGZ1bGwgcmF3IERPTSBlbGVtZW50IHNldCBhcyBib3RoIGl0cyBjb250ZXh0IGFuZCBpdHMgZmlyc3QgYXJndW1lbnQuICovXHJcblx0XHRcdFx0LyogTm90ZTogQ2FsbGJhY2tzIGFyZW4ndCBmaXJlZCB3aGVuIGNhbGxzIGFyZSBtYW51YWxseSBzdG9wcGVkICh2aWEgVmVsb2NpdHkoXCJzdG9wXCIpLiAqL1xyXG5cdFx0XHRcdGlmICghaXNTdG9wcGVkICYmIG9wdHMuY29tcGxldGUgJiYgIW9wdHMubG9vcCAmJiAoaSA9PT0gY2FsbExlbmd0aCAtIDEpKSB7XHJcblx0XHRcdFx0XHQvKiBXZSB0aHJvdyBjYWxsYmFja3MgaW4gYSBzZXRUaW1lb3V0IHNvIHRoYXQgdGhyb3duIGVycm9ycyBkb24ndCBoYWx0IHRoZSBleGVjdXRpb24gb2YgVmVsb2NpdHkgaXRzZWxmLiAqL1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0b3B0cy5jb21wbGV0ZS5jYWxsKGVsZW1lbnRzLCBlbGVtZW50cyk7XHJcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRcdHRocm93IGVycm9yO1xyXG5cdFx0XHRcdFx0XHR9LCAxKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IFByb21pc2UgUmVzb2x2aW5nXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIE5vdGU6IEluZmluaXRlIGxvb3BzIGRvbid0IHJldHVybiBwcm9taXNlcy4gKi9cclxuXHRcdFx0XHRpZiAocmVzb2x2ZXIgJiYgb3B0cy5sb29wICE9PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRyZXNvbHZlcihlbGVtZW50cyk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IExvb3AgKEluZmluaXRlKVxyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRpZiAoZGF0YSAmJiBvcHRzLmxvb3AgPT09IHRydWUgJiYgIWlzU3RvcHBlZCkge1xyXG5cdFx0XHRcdFx0LyogSWYgYSByb3RhdGVYL1kvWiBwcm9wZXJ0eSBpcyBiZWluZyBhbmltYXRlZCBieSAzNjAgZGVnIHdpdGggbG9vcDp0cnVlLCBzd2FwIHR3ZWVuIHN0YXJ0L2VuZCB2YWx1ZXMgdG8gZW5hYmxlXHJcblx0XHRcdFx0XHQgY29udGludW91cyBpdGVyYXRpdmUgcm90YXRpb24gbG9vcGluZy4gKE90aGVyaXNlLCB0aGUgZWxlbWVudCB3b3VsZCBqdXN0IHJvdGF0ZSBiYWNrIGFuZCBmb3J0aC4pICovXHJcblx0XHRcdFx0XHQkLmVhY2goZGF0YS50d2VlbnNDb250YWluZXIsIGZ1bmN0aW9uKHByb3BlcnR5TmFtZSwgdHdlZW5Db250YWluZXIpIHtcclxuXHRcdFx0XHRcdFx0aWYgKC9ecm90YXRlLy50ZXN0KHByb3BlcnR5TmFtZSkgJiYgKChwYXJzZUZsb2F0KHR3ZWVuQ29udGFpbmVyLnN0YXJ0VmFsdWUpIC0gcGFyc2VGbG9hdCh0d2VlbkNvbnRhaW5lci5lbmRWYWx1ZSkpICUgMzYwID09PSAwKSkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBvbGRTdGFydFZhbHVlID0gdHdlZW5Db250YWluZXIuc3RhcnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0dHdlZW5Db250YWluZXIuc3RhcnRWYWx1ZSA9IHR3ZWVuQ29udGFpbmVyLmVuZFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuQ29udGFpbmVyLmVuZFZhbHVlID0gb2xkU3RhcnRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKC9eYmFja2dyb3VuZFBvc2l0aW9uLy50ZXN0KHByb3BlcnR5TmFtZSkgJiYgcGFyc2VGbG9hdCh0d2VlbkNvbnRhaW5lci5lbmRWYWx1ZSkgPT09IDEwMCAmJiB0d2VlbkNvbnRhaW5lci51bml0VHlwZSA9PT0gXCIlXCIpIHtcclxuXHRcdFx0XHRcdFx0XHR0d2VlbkNvbnRhaW5lci5lbmRWYWx1ZSA9IDA7XHJcblx0XHRcdFx0XHRcdFx0dHdlZW5Db250YWluZXIuc3RhcnRWYWx1ZSA9IDEwMDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0VmVsb2NpdHkoZWxlbWVudCwgXCJyZXZlcnNlXCIsIHtsb29wOiB0cnVlLCBkZWxheTogb3B0cy5kZWxheX0pO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBEZXF1ZXVlaW5nXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogRmlyZSB0aGUgbmV4dCBjYWxsIGluIHRoZSBxdWV1ZSBzbyBsb25nIGFzIHRoaXMgY2FsbCdzIHF1ZXVlIHdhc24ndCBzZXQgdG8gZmFsc2UgKHRvIHRyaWdnZXIgYSBwYXJhbGxlbCBhbmltYXRpb24pLFxyXG5cdFx0XHRcdCB3aGljaCB3b3VsZCBoYXZlIGFscmVhZHkgY2F1c2VkIHRoZSBuZXh0IGNhbGwgdG8gZmlyZS4gTm90ZTogRXZlbiBpZiB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24gcXVldWUgaGFzIGJlZW4gcmVhY2hlZCxcclxuXHRcdFx0XHQgJC5kZXF1ZXVlKCkgbXVzdCBzdGlsbCBiZSBjYWxsZWQgaW4gb3JkZXIgdG8gY29tcGxldGVseSBjbGVhciBqUXVlcnkncyBhbmltYXRpb24gcXVldWUuICovXHJcblx0XHRcdFx0aWYgKG9wdHMucXVldWUgIT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHQkLmRlcXVldWUoZWxlbWVudCwgb3B0cy5xdWV1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBDYWxscyBBcnJheSBDbGVhbnVwXHJcblx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBTaW5jZSB0aGlzIGNhbGwgaXMgY29tcGxldGUsIHNldCBpdCB0byBmYWxzZSBzbyB0aGF0IHRoZSByQUYgdGljayBza2lwcyBpdC4gVGhpcyBhcnJheSBpcyBsYXRlciBjb21wYWN0ZWQgdmlhIGNvbXBhY3RTcGFyc2VBcnJheSgpLlxyXG5cdFx0XHQgKEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgY2FsbCBpcyBzZXQgdG8gZmFsc2UgaW5zdGVhZCBvZiBiZWluZyBkZWxldGVkIGZyb20gdGhlIGFycmF5OiBodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9zcGVlZC92OC8pICovXHJcblx0XHRcdFZlbG9jaXR5LlN0YXRlLmNhbGxzW2NhbGxJbmRleF0gPSBmYWxzZTtcclxuXHJcblx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2FsbHMgYXJyYXkgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgd2FzIHRoZSBmaW5hbCBpbi1wcm9ncmVzcyBhbmltYXRpb24uXHJcblx0XHRcdCBJZiBzbywgc2V0IGEgZmxhZyB0byBlbmQgdGlja2luZyBhbmQgY2xlYXIgdGhlIGNhbGxzIGFycmF5LiAqL1xyXG5cdFx0XHRmb3IgKHZhciBqID0gMCwgY2FsbHNMZW5ndGggPSBWZWxvY2l0eS5TdGF0ZS5jYWxscy5sZW5ndGg7IGogPCBjYWxsc0xlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0aWYgKFZlbG9jaXR5LlN0YXRlLmNhbGxzW2pdICE9PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0cmVtYWluaW5nQ2FsbHNFeGlzdCA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAocmVtYWluaW5nQ2FsbHNFeGlzdCA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHQvKiB0aWNrKCkgd2lsbCBkZXRlY3QgdGhpcyBmbGFnIHVwb24gaXRzIG5leHQgaXRlcmF0aW9uIGFuZCBzdWJzZXF1ZW50bHkgdHVybiBpdHNlbGYgb2ZmLiAqL1xyXG5cdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmlzVGlja2luZyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHQvKiBDbGVhciB0aGUgY2FsbHMgYXJyYXkgc28gdGhhdCBpdHMgbGVuZ3RoIGlzIHJlc2V0LiAqL1xyXG5cdFx0XHRcdGRlbGV0ZSBWZWxvY2l0eS5TdGF0ZS5jYWxscztcclxuXHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5jYWxscyA9IFtdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqKioqKlxyXG5cdFx0IEZyYW1ld29ya3NcclxuXHRcdCAqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0LyogQm90aCBqUXVlcnkgYW5kIFplcHRvIGFsbG93IHRoZWlyICQuZm4gb2JqZWN0IHRvIGJlIGV4dGVuZGVkIHRvIGFsbG93IHdyYXBwZWQgZWxlbWVudHMgdG8gYmUgc3ViamVjdGVkIHRvIHBsdWdpbiBjYWxscy5cclxuXHRcdCBJZiBlaXRoZXIgZnJhbWV3b3JrIGlzIGxvYWRlZCwgcmVnaXN0ZXIgYSBcInZlbG9jaXR5XCIgZXh0ZW5zaW9uIHBvaW50aW5nIHRvIFZlbG9jaXR5J3MgY29yZSBhbmltYXRlKCkgbWV0aG9kLiAgVmVsb2NpdHlcclxuXHRcdCBhbHNvIHJlZ2lzdGVycyBpdHNlbGYgb250byBhIGdsb2JhbCBjb250YWluZXIgKHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvIHx8IHdpbmRvdykgc28gdGhhdCBjZXJ0YWluIGZlYXR1cmVzIGFyZVxyXG5cdFx0IGFjY2Vzc2libGUgYmV5b25kIGp1c3QgYSBwZXItZWxlbWVudCBzY29wZS4gVGhpcyBtYXN0ZXIgb2JqZWN0IGNvbnRhaW5zIGFuIC5hbmltYXRlKCkgbWV0aG9kLCB3aGljaCBpcyBsYXRlciBhc3NpZ25lZCB0byAkLmZuXHJcblx0XHQgKGlmIGpRdWVyeSBvciBaZXB0byBhcmUgcHJlc2VudCkuIEFjY29yZGluZ2x5LCBWZWxvY2l0eSBjYW4gYm90aCBhY3Qgb24gd3JhcHBlZCBET00gZWxlbWVudHMgYW5kIHN0YW5kIGFsb25lIGZvciB0YXJnZXRpbmcgcmF3IERPTSBlbGVtZW50cy4gKi9cclxuXHRcdGdsb2JhbC5WZWxvY2l0eSA9IFZlbG9jaXR5O1xyXG5cclxuXHRcdGlmIChnbG9iYWwgIT09IHdpbmRvdykge1xyXG5cdFx0XHQvKiBBc3NpZ24gdGhlIGVsZW1lbnQgZnVuY3Rpb24gdG8gVmVsb2NpdHkncyBjb3JlIGFuaW1hdGUoKSBtZXRob2QuICovXHJcblx0XHRcdGdsb2JhbC5mbi52ZWxvY2l0eSA9IGFuaW1hdGU7XHJcblx0XHRcdC8qIEFzc2lnbiB0aGUgb2JqZWN0IGZ1bmN0aW9uJ3MgZGVmYXVsdHMgdG8gVmVsb2NpdHkncyBnbG9iYWwgZGVmYXVsdHMgb2JqZWN0LiAqL1xyXG5cdFx0XHRnbG9iYWwuZm4udmVsb2NpdHkuZGVmYXVsdHMgPSBWZWxvY2l0eS5kZWZhdWx0cztcclxuXHRcdH1cclxuXHJcblx0XHQvKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdCBQYWNrYWdlZCBSZWRpcmVjdHNcclxuXHRcdCAqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHQvKiBzbGlkZVVwLCBzbGlkZURvd24gKi9cclxuXHRcdCQuZWFjaChbXCJEb3duXCIsIFwiVXBcIl0sIGZ1bmN0aW9uKGksIGRpcmVjdGlvbikge1xyXG5cdFx0XHRWZWxvY2l0eS5SZWRpcmVjdHNbXCJzbGlkZVwiICsgZGlyZWN0aW9uXSA9IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMsIGVsZW1lbnRzSW5kZXgsIGVsZW1lbnRzU2l6ZSwgZWxlbWVudHMsIHByb21pc2VEYXRhKSB7XHJcblx0XHRcdFx0dmFyIG9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyksXHJcblx0XHRcdFx0XHRcdGJlZ2luID0gb3B0cy5iZWdpbixcclxuXHRcdFx0XHRcdFx0Y29tcGxldGUgPSBvcHRzLmNvbXBsZXRlLFxyXG5cdFx0XHRcdFx0XHRpbmxpbmVWYWx1ZXMgPSB7fSxcclxuXHRcdFx0XHRcdFx0Y29tcHV0ZWRWYWx1ZXMgPSB7aGVpZ2h0OiBcIlwiLCBtYXJnaW5Ub3A6IFwiXCIsIG1hcmdpbkJvdHRvbTogXCJcIiwgcGFkZGluZ1RvcDogXCJcIiwgcGFkZGluZ0JvdHRvbTogXCJcIn07XHJcblxyXG5cdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0LyogU2hvdyB0aGUgZWxlbWVudCBiZWZvcmUgc2xpZGVEb3duIGJlZ2lucyBhbmQgaGlkZSB0aGUgZWxlbWVudCBhZnRlciBzbGlkZVVwIGNvbXBsZXRlcy4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IElubGluZSBlbGVtZW50cyBjYW5ub3QgaGF2ZSBkaW1lbnNpb25zIGFuaW1hdGVkLCBzbyB0aGV5J3JlIHJldmVydGVkIHRvIGlubGluZS1ibG9jay4gKi9cclxuXHRcdFx0XHRcdG9wdHMuZGlzcGxheSA9IChkaXJlY3Rpb24gPT09IFwiRG93blwiID8gKFZlbG9jaXR5LkNTUy5WYWx1ZXMuZ2V0RGlzcGxheVR5cGUoZWxlbWVudCkgPT09IFwiaW5saW5lXCIgPyBcImlubGluZS1ibG9ja1wiIDogXCJibG9ja1wiKSA6IFwibm9uZVwiKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdG9wdHMuYmVnaW4gPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdC8qIElmIHRoZSB1c2VyIHBhc3NlZCBpbiBhIGJlZ2luIGNhbGxiYWNrLCBmaXJlIGl0IG5vdy4gKi9cclxuXHRcdFx0XHRcdGlmIChlbGVtZW50c0luZGV4ID09PSAwICYmIGJlZ2luKSB7XHJcblx0XHRcdFx0XHRcdGJlZ2luLmNhbGwoZWxlbWVudHMsIGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBDYWNoZSB0aGUgZWxlbWVudHMnIG9yaWdpbmFsIHZlcnRpY2FsIGRpbWVuc2lvbmFsIHByb3BlcnR5IHZhbHVlcyBzbyB0aGF0IHdlIGNhbiBhbmltYXRlIGJhY2sgdG8gdGhlbS4gKi9cclxuXHRcdFx0XHRcdGZvciAodmFyIHByb3BlcnR5IGluIGNvbXB1dGVkVmFsdWVzKSB7XHJcblx0XHRcdFx0XHRcdGlmICghY29tcHV0ZWRWYWx1ZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aW5saW5lVmFsdWVzW3Byb3BlcnR5XSA9IGVsZW1lbnQuc3R5bGVbcHJvcGVydHldO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogRm9yIHNsaWRlRG93biwgdXNlIGZvcmNlZmVlZGluZyB0byBhbmltYXRlIGFsbCB2ZXJ0aWNhbCBwcm9wZXJ0aWVzIGZyb20gMC4gRm9yIHNsaWRlVXAsXHJcblx0XHRcdFx0XHRcdCB1c2UgZm9yY2VmZWVkaW5nIHRvIHN0YXJ0IGZyb20gY29tcHV0ZWQgdmFsdWVzIGFuZCBhbmltYXRlIGRvd24gdG8gMC4gKi9cclxuXHRcdFx0XHRcdFx0dmFyIHByb3BlcnR5VmFsdWUgPSBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSk7XHJcblx0XHRcdFx0XHRcdGNvbXB1dGVkVmFsdWVzW3Byb3BlcnR5XSA9IChkaXJlY3Rpb24gPT09IFwiRG93blwiKSA/IFtwcm9wZXJ0eVZhbHVlLCAwXSA6IFswLCBwcm9wZXJ0eVZhbHVlXTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBGb3JjZSB2ZXJ0aWNhbCBvdmVyZmxvdyBjb250ZW50IHRvIGNsaXAgc28gdGhhdCBzbGlkaW5nIHdvcmtzIGFzIGV4cGVjdGVkLiAqL1xyXG5cdFx0XHRcdFx0aW5saW5lVmFsdWVzLm92ZXJmbG93ID0gZWxlbWVudC5zdHlsZS5vdmVyZmxvdztcclxuXHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdG9wdHMuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdC8qIFJlc2V0IGVsZW1lbnQgdG8gaXRzIHByZS1zbGlkZSBpbmxpbmUgdmFsdWVzIG9uY2UgaXRzIHNsaWRlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4gKi9cclxuXHRcdFx0XHRcdGZvciAodmFyIHByb3BlcnR5IGluIGlubGluZVZhbHVlcykge1xyXG5cdFx0XHRcdFx0XHRpZiAoaW5saW5lVmFsdWVzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gaW5saW5lVmFsdWVzW3Byb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIElmIHRoZSB1c2VyIHBhc3NlZCBpbiBhIGNvbXBsZXRlIGNhbGxiYWNrLCBmaXJlIGl0IG5vdy4gKi9cclxuXHRcdFx0XHRcdGlmIChlbGVtZW50c0luZGV4ID09PSBlbGVtZW50c1NpemUgLSAxKSB7XHJcblx0XHRcdFx0XHRcdGlmIChjb21wbGV0ZSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlLmNhbGwoZWxlbWVudHMsIGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAocHJvbWlzZURhdGEpIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9taXNlRGF0YS5yZXNvbHZlcihlbGVtZW50cyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRWZWxvY2l0eShlbGVtZW50LCBjb21wdXRlZFZhbHVlcywgb3B0cyk7XHJcblx0XHRcdH07XHJcblx0XHR9KTtcclxuXHJcblx0XHQvKiBmYWRlSW4sIGZhZGVPdXQgKi9cclxuXHRcdCQuZWFjaChbXCJJblwiLCBcIk91dFwiXSwgZnVuY3Rpb24oaSwgZGlyZWN0aW9uKSB7XHJcblx0XHRcdFZlbG9jaXR5LlJlZGlyZWN0c1tcImZhZGVcIiArIGRpcmVjdGlvbl0gPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zLCBlbGVtZW50c0luZGV4LCBlbGVtZW50c1NpemUsIGVsZW1lbnRzLCBwcm9taXNlRGF0YSkge1xyXG5cdFx0XHRcdHZhciBvcHRzID0gJC5leHRlbmQoe30sIG9wdGlvbnMpLFxyXG5cdFx0XHRcdFx0XHRjb21wbGV0ZSA9IG9wdHMuY29tcGxldGUsXHJcblx0XHRcdFx0XHRcdHByb3BlcnRpZXNNYXAgPSB7b3BhY2l0eTogKGRpcmVjdGlvbiA9PT0gXCJJblwiKSA/IDEgOiAwfTtcclxuXHJcblx0XHRcdFx0LyogU2luY2UgcmVkaXJlY3RzIGFyZSB0cmlnZ2VyZWQgaW5kaXZpZHVhbGx5IGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGFuaW1hdGVkIHNldCwgYXZvaWQgcmVwZWF0ZWRseSB0cmlnZ2VyaW5nXHJcblx0XHRcdFx0IGNhbGxiYWNrcyBieSBmaXJpbmcgdGhlbSBvbmx5IHdoZW4gdGhlIGZpbmFsIGVsZW1lbnQgaGFzIGJlZW4gcmVhY2hlZC4gKi9cclxuXHRcdFx0XHRpZiAoZWxlbWVudHNJbmRleCAhPT0gMCkge1xyXG5cdFx0XHRcdFx0b3B0cy5iZWdpbiA9IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChlbGVtZW50c0luZGV4ICE9PSBlbGVtZW50c1NpemUgLSAxKSB7XHJcblx0XHRcdFx0XHRvcHRzLmNvbXBsZXRlID0gbnVsbDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0b3B0cy5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoY29tcGxldGUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZS5jYWxsKGVsZW1lbnRzLCBlbGVtZW50cyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKHByb21pc2VEYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0cHJvbWlzZURhdGEucmVzb2x2ZXIoZWxlbWVudHMpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogSWYgYSBkaXNwbGF5IHdhcyBwYXNzZWQgaW4sIHVzZSBpdC4gT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIFwibm9uZVwiIGZvciBmYWRlT3V0IG9yIHRoZSBlbGVtZW50LXNwZWNpZmljIGRlZmF1bHQgZm9yIGZhZGVJbi4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBXZSBhbGxvdyB1c2VycyB0byBwYXNzIGluIFwibnVsbFwiIHRvIHNraXAgZGlzcGxheSBzZXR0aW5nIGFsdG9nZXRoZXIuICovXHJcblx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRvcHRzLmRpc3BsYXkgPSAoZGlyZWN0aW9uID09PSBcIkluXCIgPyBcImF1dG9cIiA6IFwibm9uZVwiKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFZlbG9jaXR5KHRoaXMsIHByb3BlcnRpZXNNYXAsIG9wdHMpO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmV0dXJuIFZlbG9jaXR5O1xyXG5cdH0oKHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvIHx8IHdpbmRvdyksIHdpbmRvdywgKHdpbmRvdyA/IHdpbmRvdy5kb2N1bWVudCA6IHVuZGVmaW5lZCkpO1xyXG59KSk7XHJcblxyXG4vKioqKioqKioqKioqKioqKioqXHJcbiBLbm93biBJc3N1ZXNcclxuICoqKioqKioqKioqKioqKioqKi9cclxuXHJcbi8qIFRoZSBDU1Mgc3BlYyBtYW5kYXRlcyB0aGF0IHRoZSB0cmFuc2xhdGVYL1kvWiB0cmFuc2Zvcm1zIGFyZSAlLXJlbGF0aXZlIHRvIHRoZSBlbGVtZW50IGl0c2VsZiAtLSBub3QgaXRzIHBhcmVudC5cclxuIFZlbG9jaXR5LCBob3dldmVyLCBkb2Vzbid0IG1ha2UgdGhpcyBkaXN0aW5jdGlvbi4gVGh1cywgY29udmVydGluZyB0byBvciBmcm9tIHRoZSAlIHVuaXQgd2l0aCB0aGVzZSBzdWJwcm9wZXJ0aWVzXHJcbiB3aWxsIHByb2R1Y2UgYW4gaW5hY2N1cmF0ZSBjb252ZXJzaW9uIHZhbHVlLiBUaGUgc2FtZSBpc3N1ZSBleGlzdHMgd2l0aCB0aGUgY3gvY3kgYXR0cmlidXRlcyBvZiBTVkcgY2lyY2xlcyBhbmQgZWxsaXBzZXMuICovXHJcbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXBkYXRlU291cmNlcyhpbWcsIHNvdXJjZXMpIHtcbiAgaWYgKHNvdXJjZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCBzb3VyY2Ugc2libGluZ3Mgb2YgdGhlIGltZyB0YWdcbiAgY29uc3QgaW1nU2libGluZ1dlYnAgPSAkKGltZykuc2libGluZ3MoJ3NvdXJjZVt0eXBlPVwiaW1hZ2Uvd2VicFwiXScpO1xuICBjb25zdCBpbWdTaWJsaW5nQXZpZiA9ICQoaW1nKS5zaWJsaW5ncygnc291cmNlW3R5cGU9XCJpbWFnZS9hdmlmXCJdJyk7XG5cbiAgLy8gVXBkYXRlIHRoZW0gaWYgdGhleSBleGlzdCBhbmQgd2UgaGF2ZSBhIHNvdXJjZSBmb3IgdGhlbVxuICBpZiAoc291cmNlcy53ZWJwICE9PSB1bmRlZmluZWQgJiYgaW1nU2libGluZ1dlYnAubGVuZ3RoKSB7XG4gICAgaW1nU2libGluZ1dlYnAuYXR0cignc3Jjc2V0Jywgc291cmNlcy53ZWJwKTtcbiAgfVxuICBpZiAoc291cmNlcy5hdmlmICE9PSB1bmRlZmluZWQgJiYgaW1nU2libGluZ0F2aWYubGVuZ3RoKSB7XG4gICAgaW1nU2libGluZ0F2aWYuYXR0cignc3Jjc2V0Jywgc291cmNlcy5hdmlmKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0TWluaXRhdHVyZSB7XG4gIGluaXQoKSB7XG4gICAgJCgnLmpzLXByb2R1Y3QtbWluaWF0dXJlJykuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHtcbiAgICAgIC8vIExpbWl0IG51bWJlciBvZiBzaG93biBjb2xvcnNcbiAgICAgIGlmICgkKGVsZW1lbnQpLmZpbmQoJy5jb2xvcicpLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcblxuICAgICAgICAkKGVsZW1lbnQpXG4gICAgICAgICAgLmZpbmQoJy5jb2xvcicpXG4gICAgICAgICAgLmVhY2goKGNvbG9ySW5kZXgsIGNvbG9yRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbG9ySW5kZXggPiA0KSB7XG4gICAgICAgICAgICAgICQoY29sb3JFbGVtZW50KS5oaWRlKCk7XG4gICAgICAgICAgICAgIGNvdW50ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgJChlbGVtZW50KS5maW5kKCcuanMtY291bnQnKS5hcHBlbmQoYCske2NvdW50fWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gXCJqcXVlcnlcIjtcbmltcG9ydCBwcmVzdGFzaG9wIGZyb20gXCJwcmVzdGFzaG9wXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCBcInZlbG9jaXR5LWFuaW1hdGVcIjtcbmltcG9ydCB1cGRhdGVTb3VyY2VzIGZyb20gXCIuL2NvbXBvbmVudHMvdXBkYXRlLXNvdXJjZXNcIjtcbmltcG9ydCBQcm9kdWN0TWluaXRhdHVyZSBmcm9tIFwiLi9jb21wb25lbnRzL3Byb2R1Y3QtbWluaWF0dXJlXCI7XG5cblxuXG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XG4gIGNvbnN0IG1vdmUgPSAoZGlyZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgVEhVTUJfTUFSR0lOID0gMjA7XG4gICAgY29uc3QgJHRodW1ibmFpbHMgPSAkKFwiLmpzLXF2LXByb2R1Y3QtaW1hZ2VzXCIpO1xuICAgIGNvbnN0IHRodW1iSGVpZ2h0ID1cbiAgICAgICQoXCIuanMtcXYtcHJvZHVjdC1pbWFnZXMgbGkgaW1nXCIpLmhlaWdodCgpICsgVEhVTUJfTUFSR0lOO1xuICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9ICR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wO1xuICAgICR0aHVtYm5haWxzLnZlbG9jaXR5KFxuICAgICAge1xuICAgICAgICB0cmFuc2xhdGVZOlxuICAgICAgICAgIGRpcmVjdGlvbiA9PT0gXCJ1cFwiXG4gICAgICAgICAgICA/IGN1cnJlbnRQb3NpdGlvbiArIHRodW1iSGVpZ2h0XG4gICAgICAgICAgICA6IGN1cnJlbnRQb3NpdGlvbiAtIHRodW1iSGVpZ2h0LFxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wID49IDApIHtcbiAgICAgICAgICAkKFwiLmFycm93LXVwXCIpLmNzcyhcIm9wYWNpdHlcIiwgXCIuMlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAkdGh1bWJuYWlscy5wb3NpdGlvbigpLnRvcCArICR0aHVtYm5haWxzLmhlaWdodCgpIDw9XG4gICAgICAgICAgJChcIi5qcy1xdi1tYXNrXCIpLmhlaWdodCgpXG4gICAgICAgICkge1xuICAgICAgICAgICQoXCIuYXJyb3ctZG93blwiKS5jc3MoXCJvcGFjaXR5XCIsIFwiLjJcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBwcm9kdWN0Q29uZmlnID0gKHF2KSA9PiB7XG4gICAgY29uc3QgTUFYX1RIVU1CUyA9IDQ7XG4gICAgY29uc3QgJGFycm93cyA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFycm93cyk7XG4gICAgY29uc3QgJHRodW1ibmFpbHMgPSBxdi5maW5kKFwiLmpzLXF2LXByb2R1Y3QtaW1hZ2VzXCIpO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnRodW1iKS5vbihcImNsaWNrXCIsIChldmVudCkgPT4ge1xuICAgICAgLy8gU3dhcCBhY3RpdmUgY2xhc3NlcyBvbiB0aHVtYm5haWxcbiAgICAgIGlmICgkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC50aHVtYikuaGFzQ2xhc3MoXCJzZWxlY3RlZFwiKSkge1xuICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC50aHVtYikucmVtb3ZlQ2xhc3MoXCJzZWxlY3RlZFwiKTtcbiAgICAgIH1cbiAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoXCJzZWxlY3RlZFwiKTtcblxuICAgICAgLy8gR2V0IGRhdGEgZnJvbSB0aHVtYm5haWwgYW5kIHVwZGF0ZSBjb3ZlciBzcmMsIGFsdCBhbmQgdGl0bGVcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmNvdmVyKS5hdHRyKFxuICAgICAgICBcInNyY1wiLFxuICAgICAgICAkKGV2ZW50LnRhcmdldCkuZGF0YShcImltYWdlLWxhcmdlLXNyY1wiKSxcbiAgICAgICk7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5jb3ZlcikuYXR0cihcbiAgICAgICAgXCJhbHRcIixcbiAgICAgICAgJChldmVudC50YXJnZXQpLmF0dHIoXCJhbHRcIiksXG4gICAgICApO1xuICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuY292ZXIpLmF0dHIoXG4gICAgICAgIFwidGl0bGVcIixcbiAgICAgICAgJChldmVudC50YXJnZXQpLmF0dHIoXCJ0aXRsZVwiKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc291cmNlc1xuICAgICAgdXBkYXRlU291cmNlcyhcbiAgICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuY292ZXIpLFxuICAgICAgICAkKGV2ZW50LnRhcmdldCkuZGF0YShcImltYWdlLWxhcmdlLXNvdXJjZXNcIiksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmICgkdGh1bWJuYWlscy5maW5kKFwibGlcIikubGVuZ3RoIDw9IE1BWF9USFVNQlMpIHtcbiAgICAgICRhcnJvd3MuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkYXJyb3dzLm9uKFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAkKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoXCJhcnJvdy11cFwiKSAmJlxuICAgICAgICAgICQoXCIuanMtcXYtcHJvZHVjdC1pbWFnZXNcIikucG9zaXRpb24oKS50b3AgPCAwXG4gICAgICAgICkge1xuICAgICAgICAgIG1vdmUoXCJ1cFwiKTtcbiAgICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuYXJyb3dEb3duKS5jc3MoXCJvcGFjaXR5XCIsIFwiMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAkKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoXCJhcnJvdy1kb3duXCIpICYmXG4gICAgICAgICAgJHRodW1ibmFpbHMucG9zaXRpb24oKS50b3AgKyAkdGh1bWJuYWlscy5oZWlnaHQoKSA+XG4gICAgICAgICAgICAkKFwiLmpzLXF2LW1hc2tcIikuaGVpZ2h0KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbW92ZShcImRvd25cIik7XG4gICAgICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmFycm93VXApLmNzcyhcIm9wYWNpdHlcIiwgXCIxXCIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcXYuZmluZChwcmVzdGFzaG9wLnNlbGVjdG9ycy5xdWFudGl0eVdhbnRlZCkuVG91Y2hTcGluKHtcbiAgICAgIHZlcnRpY2FsYnV0dG9uczogdHJ1ZSxcbiAgICAgIG1pbjogMSxcbiAgICAgIG1heDogMTAwMDAwMCxcbiAgICB9KTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy50b3VjaHNwaW4pLm9mZihcInRvdWNoc3RhcnQudG91Y2hzcGluXCIpO1xuICB9O1xuXG4gIHByZXN0YXNob3Aub24oXCJjbGlja1F1aWNrVmlld1wiLCAoZWxtKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJxdWlja3ZpZXdcIixcbiAgICAgIGlkX3Byb2R1Y3Q6IGVsbS5kYXRhc2V0LmlkUHJvZHVjdCxcbiAgICAgIGlkX3Byb2R1Y3RfYXR0cmlidXRlOiBlbG0uZGF0YXNldC5pZFByb2R1Y3RBdHRyaWJ1dGUsXG4gICAgfTtcbiAgICAkLnBvc3QocHJlc3Rhc2hvcC51cmxzLnBhZ2VzLnByb2R1Y3QsIGRhdGEsIG51bGwsIFwianNvblwiKVxuICAgICAgLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgJChcImJvZHlcIikuYXBwZW5kKHJlc3AucXVpY2t2aWV3X2h0bWwpO1xuICAgICAgICBjb25zdCBwcm9kdWN0TW9kYWwgPSAkKFxuICAgICAgICAgIGAjcXVpY2t2aWV3LW1vZGFsLSR7cmVzcC5wcm9kdWN0LmlkfS0ke3Jlc3AucHJvZHVjdC5pZF9wcm9kdWN0X2F0dHJpYnV0ZX1gLFxuICAgICAgICApO1xuICAgICAgICBwcm9kdWN0TW9kYWwubW9kYWwoXCJzaG93XCIpO1xuICAgICAgICBwcm9kdWN0Q29uZmlnKHByb2R1Y3RNb2RhbCk7XG4gICAgICAgIHByb2R1Y3RNb2RhbC5vbihcImhpZGRlbi5icy5tb2RhbFwiLCAoKSA9PiB7XG4gICAgICAgICAgcHJvZHVjdE1vZGFsLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuZmFpbCgocmVzcCkgPT4ge1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoXCJoYW5kbGVFcnJvclwiLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiBcImNsaWNrUXVpY2tWaWV3XCIsXG4gICAgICAgICAgcmVzcCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgJChcImJvZHlcIikub24oXG4gICAgXCJjbGlja1wiLFxuICAgIHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJUb2dnbGVyLFxuICAgICgpID0+IHtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLnNlYXJjaEZpbHRlcnNXcmFwcGVyKS5yZW1vdmVDbGFzcyhcbiAgICAgICAgXCJoaWRkZW4tc20tZG93blwiLFxuICAgICAgKTtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jb250ZW50V3JhcHBlcikuYWRkQ2xhc3MoXCJoaWRkZW4tc20tZG93blwiKTtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5mb290ZXIpLmFkZENsYXNzKFwiaGlkZGVuLXNtLWRvd25cIik7XG4gICAgfSxcbiAgKTtcbiAgJChcbiAgICBgJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVyQ29udHJvbHN9ICR7cHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jbGVhcn1gLFxuICApLm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLnNlYXJjaEZpbHRlcnNXcmFwcGVyKS5hZGRDbGFzcyhcbiAgICAgIFwiaGlkZGVuLXNtLWRvd25cIixcbiAgICApO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jb250ZW50V3JhcHBlcikucmVtb3ZlQ2xhc3MoXCJoaWRkZW4tc20tZG93blwiKTtcbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuZm9vdGVyKS5yZW1vdmVDbGFzcyhcImhpZGRlbi1zbS1kb3duXCIpO1xuICB9KTtcbiAgJChgJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVyQ29udHJvbHN9IC5va2ApLm9uKFxuICAgIFwiY2xpY2tcIixcbiAgICAoKSA9PiB7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJzV3JhcHBlcikuYWRkQ2xhc3MoXG4gICAgICAgIFwiaGlkZGVuLXNtLWRvd25cIixcbiAgICAgICk7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY29udGVudFdyYXBwZXIpLnJlbW92ZUNsYXNzKFwiaGlkZGVuLXNtLWRvd25cIik7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuZm9vdGVyKS5yZW1vdmVDbGFzcyhcImhpZGRlbi1zbS1kb3duXCIpO1xuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgcGFyc2VTZWFyY2hVcmwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmRhdGFzZXQuc2VhcmNoVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmVudC50YXJnZXQuZGF0YXNldC5zZWFyY2hVcmw7XG4gICAgfVxuXG4gICAgaWYgKCQoZXZlbnQudGFyZ2V0KS5wYXJlbnQoKVswXS5kYXRhc2V0LnNlYXJjaFVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gbm90IHBhcnNlIHNlYXJjaCBVUkxcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuICQoZXZlbnQudGFyZ2V0KS5wYXJlbnQoKVswXS5kYXRhc2V0LnNlYXJjaFVybDtcbiAgfTtcblxuICBmdW5jdGlvbiB1cGRhdGVQcm9kdWN0TGlzdERPTShkYXRhKSB7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVycykucmVwbGFjZVdpdGgoXG4gICAgICBkYXRhLnJlbmRlcmVkX2ZhY2V0cyxcbiAgICApO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmFjdGl2ZVNlYXJjaEZpbHRlcnMpLnJlcGxhY2VXaXRoKFxuICAgICAgZGF0YS5yZW5kZXJlZF9hY3RpdmVfZmlsdGVycyxcbiAgICApO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmxpc3RUb3ApLnJlcGxhY2VXaXRoKFxuICAgICAgZGF0YS5yZW5kZXJlZF9wcm9kdWN0c190b3AsXG4gICAgKTtcblxuICAgIGNvbnN0IHJlbmRlcmVkUHJvZHVjdHMgPSAkKGRhdGEucmVuZGVyZWRfcHJvZHVjdHMpO1xuICAgIGNvbnN0IHByb2R1Y3RTZWxlY3RvcnMgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5wcm9kdWN0KTtcblxuICAgIGlmIChwcm9kdWN0U2VsZWN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb2R1Y3RTZWxlY3RvcnNcbiAgICAgICAgLnJlbW92ZUNsYXNzKClcbiAgICAgICAgLmFkZENsYXNzKHByb2R1Y3RTZWxlY3RvcnMuZmlyc3QoKS5hdHRyKFwiY2xhc3NcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0U2VsZWN0b3JzXG4gICAgICAgIC5yZW1vdmVDbGFzcygpXG4gICAgICAgIC5hZGRDbGFzcyhyZW5kZXJlZFByb2R1Y3RzLmZpcnN0KCkuYXR0cihcImNsYXNzXCIpKTtcbiAgICB9XG5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5saXN0KS5yZXBsYWNlV2l0aChyZW5kZXJlZFByb2R1Y3RzKTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmxpc3RCb3R0b20pLnJlcGxhY2VXaXRoKFxuICAgICAgZGF0YS5yZW5kZXJlZF9wcm9kdWN0c19ib3R0b20sXG4gICAgKTtcbiAgICBpZiAoZGF0YS5yZW5kZXJlZF9wcm9kdWN0c19oZWFkZXIpIHtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmxpc3RIZWFkZXIpLnJlcGxhY2VXaXRoKFxuICAgICAgICBkYXRhLnJlbmRlcmVkX3Byb2R1Y3RzX2hlYWRlcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgJCgnI3Nob3ctZmlsdGVycycpLm9uKCdjbGljay5vZmZjYW52YXMnLCAoKSA9PiB7XG4gICAgICAkKCcjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzJykuc2hvdygpO1xuICAgIH0pO1xuICBcbiAgICAkKCcjaGlkZS1maWx0ZXJzJykub24oJ2NsaWNrLm9mZmNhbnZhcycsICgpID0+IHtcbiAgICAgICQoJyNwcm9kdWN0LWxpc3QtdG9wLWZpbHRlcnMnKS5oaWRlKCk7XG4gICAgICAkKCcjb3ZlcmxheScpLmhpZGUoKTsgXG4gICAgfSk7XG5cbiAgICAkKCcjc2hvdy1maWx0ZXJzJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAkKCcjb3ZlcmxheScpLnNob3coKTtcbiAgICB9KTtcblxuICAgICQoJyNwcm9kdWN0LWxpc3QtdG9wLWZpbHRlcnMnKS5zaG93KCk7XG4gIFxuICAgIGZ1bmN0aW9uIGNoZWNrQW5kU2hvd092ZXJsYXkoKSB7XG4gICAgICBpZiAoJCgnI3Byb2R1Y3QtbGlzdC10b3AtZmlsdGVycycpLmlzKCc6dmlzaWJsZScpKSB7IFxuICAgICAgICAgICQoJyNvdmVybGF5Jykuc2hvdygpO1xuICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgJCgnI292ZXJsYXknKS5oaWRlKCk7XG4gICAgICB9XG4gIH1cblxuICAkKCcjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzJykuc2hvdyhmdW5jdGlvbigpIHtcbiAgICBjaGVja0FuZFNob3dPdmVybGF5KCk7XG4gICAgfSk7XG5cbiAgICAkKCcjb3ZlcmxheScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgJCgnI3Byb2R1Y3QtbGlzdC10b3AtZmlsdGVycycpLmhpZGUoKTtcbiAgICAgICQoJyNvdmVybGF5JykuaGlkZSgpOyAgXG4gICAgIFxuICB9KTtcblxuICAgICQoJy50aC1hY2NvcmRpb24nKS50aGFjY29yZGlvbigpO1xuXG4gICAgY29uc3QgcHJvZHVjdE1pbml0YXR1cmUgPSBuZXcgUHJvZHVjdE1pbml0YXR1cmUoKTtcbiAgICBwcm9kdWN0TWluaXRhdHVyZS5pbml0KCk7XG4gIH1cblxuICBcblxuICAkKFwiYm9keVwiKS5vbihcbiAgICBcImNoYW5nZVwiLFxuICAgIGAke3ByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJzfSBpbnB1dFtkYXRhLXNlYXJjaC11cmxdYCxcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIHByZXN0YXNob3AuZW1pdChcInVwZGF0ZUZhY2V0c1wiLCBwYXJzZVNlYXJjaFVybChldmVudCkpO1xuICAgIH0sXG4gICk7XG5cbiAgJChcImJvZHlcIikub24oXG4gICAgXCJjbGlja1wiLFxuICAgIHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJzQ2xlYXJBbGwsXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBwcmVzdGFzaG9wLmVtaXQoXCJ1cGRhdGVGYWNldHNcIiwgcGFyc2VTZWFyY2hVcmwoZXZlbnQpKTtcbiAgICB9LFxuICApO1xuXG4gICQoXCJib2R5XCIpLm9uKFxuICAgIFwiY2xpY2tcIixcbiAgICBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoTGluayxcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBwcmVzdGFzaG9wLmVtaXQoXCJ1cGRhdGVGYWNldHNcIiwgJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCJhXCIpLmdldCgwKS5ocmVmKTtcbiAgICB9LFxuICApO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgKGUpID0+IHtcbiAgICBpZiAoZS5zdGF0ZSAmJiBlLnN0YXRlLmN1cnJlbnRfdXJsKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGUuc3RhdGUuY3VycmVudF91cmw7XG4gICAgfVxuICB9KTtcblxuICAkKFwiYm9keVwiKS5vbihcbiAgICBcImNoYW5nZVwiLFxuICAgIGAke3ByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJzfSBzZWxlY3RgLFxuICAgIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgZm9ybSA9ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiZm9ybVwiKTtcbiAgICAgIHByZXN0YXNob3AuZW1pdChcInVwZGF0ZUZhY2V0c1wiLCBgPyR7Zm9ybS5zZXJpYWxpemUoKX1gKTtcbiAgICB9LFxuICApO1xuXG4gIHByZXN0YXNob3Aub24oXCJ1cGRhdGVQcm9kdWN0TGlzdFwiLCAoZGF0YSkgPT4ge1xuICAgIHVwZGF0ZVByb2R1Y3RMaXN0RE9NKGRhdGEpO1xuICAgIHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcbiAgfSk7XG59KTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5Jztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuaW1wb3J0ICd2ZWxvY2l0eS1hbmltYXRlJztcbi8vIGltcG9ydCB1cGRhdGVTb3VyY2VzIGZyb20gJ3VwZGF0ZS1zb3VyY2VzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdFNlbGVjdCB7XG4gIGluaXQoKSB7XG4gICAgY29uc3QgTUFYX1RIVU1CUyA9IDU7XG4gICAgY29uc3QgJGFycm93cyA9ICQoJy5qcy1tb2RhbC1hcnJvd3MnKTtcbiAgICBjb25zdCAkdGh1bWJuYWlscyA9ICQoJy5qcy1tb2RhbC1wcm9kdWN0LWltYWdlcycpO1xuXG4gICAgJCgnYm9keScpXG4gICAgICAub24oJ2NsaWNrJywgJy5qcy1tb2RhbC10aHVtYicsIChldmVudCkgPT4ge1xuICAgICAgICAvLyBTd2FwIGFjdGl2ZSBjbGFzc2VzIG9uIHRodW1ibmFpbFxuICAgICAgICBpZiAoJCgnLmpzLW1vZGFsLXRodW1iJykuaGFzQ2xhc3MoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAkKCcuanMtbW9kYWwtdGh1bWInKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc3JjLCBhbHQgYW5kIHRpdGxlXG4gICAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0Lm1vZGFsUHJvZHVjdENvdmVyKS5hdHRyKCdzcmMnLCAkKGV2ZW50LnRhcmdldCkuZGF0YSgnaW1hZ2UtbGFyZ2Utc3JjJykpO1xuICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5tb2RhbFByb2R1Y3RDb3ZlcikuYXR0cigndGl0bGUnLCAkKGV2ZW50LnRhcmdldCkuYXR0cigndGl0bGUnKSk7XG4gICAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0Lm1vZGFsUHJvZHVjdENvdmVyKS5hdHRyKCdhbHQnLCAkKGV2ZW50LnRhcmdldCkuYXR0cignYWx0JykpO1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc291cmNlc1xuICAgICAgICAvLyB1cGRhdGVTb3VyY2VzKFxuICAgICAgICAvLyAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0Lm1vZGFsUHJvZHVjdENvdmVyKSxcbiAgICAgICAgLy8gICAkKGV2ZW50LnRhcmdldCkuZGF0YSgnaW1hZ2UtbGFyZ2Utc291cmNlcycpLFxuICAgICAgICAvLyApO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAnYXNpZGUjdGh1bWJuYWlscycsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmlkID09PSAndGh1bWJuYWlscycpIHtcbiAgICAgICAgICAkKCcjcHJvZHVjdC1tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKCQoJy5qcy1tb2RhbC1wcm9kdWN0LWltYWdlcyBsaScpLmxlbmd0aCA8PSBNQVhfVEhVTUJTKSB7XG4gICAgICAkYXJyb3dzLmNzcygnb3BhY2l0eScsICcuMicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkYXJyb3dzLm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmhhc0NsYXNzKCdhcnJvdy11cCcpICYmICR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wIDwgMCkge1xuICAgICAgICAgIHRoaXMubW92ZSgndXAnKTtcbiAgICAgICAgICAkKCcuanMtbW9kYWwtYXJyb3ctZG93bicpLmNzcygnb3BhY2l0eScsICcxJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgJChldmVudC50YXJnZXQpLmhhc0NsYXNzKCdhcnJvdy1kb3duJylcbiAgICAgICAgICAmJiAkdGh1bWJuYWlscy5wb3NpdGlvbigpLnRvcCArICR0aHVtYm5haWxzLmhlaWdodCgpID4gJCgnLmpzLW1vZGFsLW1hc2snKS5oZWlnaHQoKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm1vdmUoJ2Rvd24nKTtcbiAgICAgICAgICAkKCcuanMtbW9kYWwtYXJyb3ctdXAnKS5jc3MoJ29wYWNpdHknLCAnMScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBtb3ZlKGRpcmVjdGlvbikge1xuICAgIGNvbnN0IFRIVU1CX01BUkdJTiA9IDEwO1xuICAgIGNvbnN0ICR0aHVtYm5haWxzID0gJCgnLmpzLW1vZGFsLXByb2R1Y3QtaW1hZ2VzJyk7XG4gICAgY29uc3QgdGh1bWJIZWlnaHQgPSAkKCcuanMtbW9kYWwtcHJvZHVjdC1pbWFnZXMgbGkgaW1nJykuaGVpZ2h0KCkgKyBUSFVNQl9NQVJHSU47XG4gICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gJHRodW1ibmFpbHMucG9zaXRpb24oKS50b3A7XG4gICAgJHRodW1ibmFpbHMudmVsb2NpdHkoXG4gICAgICB7XG4gICAgICAgIHRyYW5zbGF0ZVk6IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGN1cnJlbnRQb3NpdGlvbiArIHRodW1iSGVpZ2h0IDogY3VycmVudFBvc2l0aW9uIC0gdGh1bWJIZWlnaHQsXG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoJHRodW1ibmFpbHMucG9zaXRpb24oKS50b3AgPj0gMCkge1xuICAgICAgICAgICQoJy5qcy1tb2RhbC1hcnJvdy11cCcpLmNzcygnb3BhY2l0eScsICcuMicpO1xuICAgICAgICB9IGVsc2UgaWYgKCR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wICsgJHRodW1ibmFpbHMuaGVpZ2h0KCkgPD0gJCgnLmpzLW1vZGFsLW1hc2snKS5oZWlnaHQoKSkge1xuICAgICAgICAgICQoJy5qcy1tb2RhbC1hcnJvdy1kb3duJykuY3NzKCdvcGFjaXR5JywgJy4yJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5pbXBvcnQgUHJvZHVjdFNlbGVjdCBmcm9tICcuL2NvbXBvbmVudHMvcHJvZHVjdC1zZWxlY3QnO1xuaW1wb3J0IHVwZGF0ZVNvdXJjZXMgZnJvbSAnLi9jb21wb25lbnRzL3VwZGF0ZS1zb3VyY2VzJztcblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBmdW5jdGlvbiBjb3ZlckltYWdlKCkge1xuICAgIGNvbnN0IHByb2R1Y3RDb3ZlciA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmNvdmVyKTtcbiAgICBjb25zdCBtb2RhbFByb2R1Y3RDb3ZlciA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0Lm1vZGFsUHJvZHVjdENvdmVyKTtcbiAgICBsZXQgdGh1bWJTZWxlY3RlZCA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnNlbGVjdGVkKTtcblxuICAgIGNvbnN0IHN3aXBlID0gKHNlbGVjdGVkVGh1bWIsIHRodW1iUGFyZW50KSA9PiB7XG4gICAgICBjb25zdCBuZXdTZWxlY3RlZFRodW1iID0gdGh1bWJQYXJlbnQuZmluZChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QudGh1bWIpO1xuXG4gICAgICAvLyBTd2FwIGFjdGl2ZSBjbGFzc2VzIG9uIHRodW1ibmFpbFxuICAgICAgc2VsZWN0ZWRUaHVtYi5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgIG5ld1NlbGVjdGVkVGh1bWIuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7XG5cbiAgICAgIC8vIFVwZGF0ZSBzb3VyY2VzIG9mIGJvdGggY292ZXIgYW5kIG1vZGFsIGNvdmVyXG4gICAgICBtb2RhbFByb2R1Y3RDb3Zlci5wcm9wKCdzcmMnLCBuZXdTZWxlY3RlZFRodW1iLmRhdGEoJ2ltYWdlLWxhcmdlLXNyYycpKTtcbiAgICAgIHByb2R1Y3RDb3Zlci5wcm9wKCdzcmMnLCBuZXdTZWxlY3RlZFRodW1iLmRhdGEoJ2ltYWdlLW1lZGl1bS1zcmMnKSk7XG4gICAgICAkKCcuZWFzeXpvb20gI2Vhc3l6b29tLWxhcmdlLWltZy1hbmNob3InKS5hdHRyKCdocmVmJywgbmV3U2VsZWN0ZWRUaHVtYi5kYXRhKCdpbWFnZS1sYXJnZS1zcmMnKSk7XG5cbiAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc3JjLCBhbHQgYW5kIHRpdGxlXG4gICAgICBwcm9kdWN0Q292ZXIuYXR0cigndGl0bGUnLCBuZXdTZWxlY3RlZFRodW1iLmF0dHIoJ3RpdGxlJykpO1xuICAgICAgbW9kYWxQcm9kdWN0Q292ZXIuYXR0cigndGl0bGUnLCBuZXdTZWxlY3RlZFRodW1iLmF0dHIoJ3RpdGxlJykpO1xuICAgICAgcHJvZHVjdENvdmVyLmF0dHIoJ2FsdCcsIG5ld1NlbGVjdGVkVGh1bWIuYXR0cignYWx0JykpO1xuICAgICAgbW9kYWxQcm9kdWN0Q292ZXIuYXR0cignYWx0JywgbmV3U2VsZWN0ZWRUaHVtYi5hdHRyKCdhbHQnKSk7XG5cbiAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc291cmNlc1xuICAgICAgdXBkYXRlU291cmNlcyhwcm9kdWN0Q292ZXIsIG5ld1NlbGVjdGVkVGh1bWIuZGF0YSgnaW1hZ2UtbWVkaXVtLXNvdXJjZXMnKSk7XG4gICAgICB1cGRhdGVTb3VyY2VzKG1vZGFsUHJvZHVjdENvdmVyLCBuZXdTZWxlY3RlZFRodW1iLmRhdGEoJ2ltYWdlLWxhcmdlLXNvdXJjZXMnKSk7XG4gICAgfTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnRodW1iKS5vbignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgIHRodW1iU2VsZWN0ZWQgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5zZWxlY3RlZCk7XG4gICAgICBzd2lwZSh0aHVtYlNlbGVjdGVkLCAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QudGh1bWJDb250YWluZXIpKTtcbiAgICB9KTtcblxuICAgIHByb2R1Y3RDb3Zlci5zd2lwZSh7XG4gICAgICBzd2lwZTogKGV2ZW50LCBkaXJlY3Rpb24pID0+IHtcbiAgICAgICAgdGh1bWJTZWxlY3RlZCA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnNlbGVjdGVkKTtcbiAgICAgICAgY29uc3QgcGFyZW50VGh1bWIgPSB0aHVtYlNlbGVjdGVkLmNsb3Nlc3QocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnRodW1iQ29udGFpbmVyKTtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHBhcmVudFRodW1iLnByZXYoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzd2lwZSh0aHVtYlNlbGVjdGVkLCBwYXJlbnRUaHVtYi5wcmV2KCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50VGh1bWIubmV4dCgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN3aXBlKHRodW1iU2VsZWN0ZWQsIHBhcmVudFRodW1iLm5leHQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHBhcmVudFRodW1iLm5leHQoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzd2lwZSh0aHVtYlNlbGVjdGVkLCBwYXJlbnRUaHVtYi5uZXh0KCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50VGh1bWIucHJldigpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN3aXBlKHRodW1iU2VsZWN0ZWQsIHBhcmVudFRodW1iLnByZXYoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYWxsb3dQYWdlU2Nyb2xsOiAndmVydGljYWwnLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaW1hZ2VTY3JvbGxCb3goKSB7XG4gICAgaWYgKCQoJyNtYWluIC5qcy1xdi1wcm9kdWN0LWltYWdlcyBsaScpLmxlbmd0aCA+IDIpIHtcbiAgICAgICQoJyNtYWluIC5qcy1xdi1tYXNrJykuYWRkQ2xhc3MoJ3Njcm9sbCcpO1xuICAgICAgJCgnLnNjcm9sbC1ib3gtYXJyb3dzJykuYWRkQ2xhc3MoJ3Njcm9sbCcpO1xuICAgICAgJCgnI21haW4gLmpzLXF2LW1hc2snKS5zY3JvbGxib3goe1xuICAgICAgICBkaXJlY3Rpb246ICdoJyxcbiAgICAgICAgZGlzdGFuY2U6IDExMyxcbiAgICAgICAgYXV0b1BsYXk6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICAkKCcuc2Nyb2xsLWJveC1hcnJvd3MgLmxlZnQnKS5jbGljaygoKSA9PiB7XG4gICAgICAgICQoJyNtYWluIC5qcy1xdi1tYXNrJykudHJpZ2dlcignYmFja3dhcmQnKTtcbiAgICAgIH0pO1xuICAgICAgJCgnLnNjcm9sbC1ib3gtYXJyb3dzIC5yaWdodCcpLmNsaWNrKCgpID0+IHtcbiAgICAgICAgJCgnI21haW4gLmpzLXF2LW1hc2snKS50cmlnZ2VyKCdmb3J3YXJkJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnI21haW4gLmpzLXF2LW1hc2snKS5yZW1vdmVDbGFzcygnc2Nyb2xsJyk7XG4gICAgICAkKCcuc2Nyb2xsLWJveC1hcnJvd3MnKS5yZW1vdmVDbGFzcygnc2Nyb2xsJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5wdXRGaWxlKCkge1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5maWxlSW5wdXQpLm9uKCdjaGFuZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldClbMF07XG4gICAgICBjb25zdCBmaWxlID0gKHRhcmdldCkgPyB0YXJnZXQuZmlsZXNbMF0gOiBudWxsO1xuXG4gICAgICBpZiAodGFyZ2V0ICYmIGZpbGUpIHtcbiAgICAgICAgJCh0YXJnZXQpLnByZXYoKS50ZXh0KGZpbGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcm9kdWN0U3BpbigpIHtcbiAgICBjb25zdCAkcXVhbnRpdHlJbnB1dCA9ICQocHJlc3Rhc2hvcC5zZWxlY3RvcnMucXVhbnRpdHlXYW50ZWQpO1xuXG4gICAgJHF1YW50aXR5SW5wdXQuVG91Y2hTcGluKHtcbiAgICAgIHZlcnRpY2FsYnV0dG9uczogdHJ1ZSxcbiAgICAgIHZlcnRpY2FsdXBjbGFzczogJ21hdGVyaWFsLWljb25zIHRvdWNoc3Bpbi11cCcsXG4gICAgICB2ZXJ0aWNhbGRvd25jbGFzczogJ21hdGVyaWFsLWljb25zIHRvdWNoc3Bpbi1kb3duJyxcbiAgICAgIGJ1dHRvbmRvd25fY2xhc3M6ICdidG4gYnRuLXRvdWNoc3BpbiBqcy10b3VjaHNwaW4nLFxuICAgICAgYnV0dG9udXBfY2xhc3M6ICdidG4gYnRuLXRvdWNoc3BpbiBqcy10b3VjaHNwaW4nLFxuICAgICAgbWluOiBwYXJzZUludCgkcXVhbnRpdHlJbnB1dC5hdHRyKCdtaW4nKSwgMTApLFxuICAgICAgbWF4OiAxMDAwMDAwLFxuICAgIH0pO1xuXG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnRvdWNoc3Bpbikub2ZmKCd0b3VjaHN0YXJ0LnRvdWNoc3BpbicpO1xuXG4gICAgJHF1YW50aXR5SW5wdXQub24oJ2ZvY3Vzb3V0JywgKCkgPT4ge1xuICAgICAgaWYgKCRxdWFudGl0eUlucHV0LnZhbCgpID09PSAnJyB8fCAkcXVhbnRpdHlJbnB1dC52YWwoKSA8ICRxdWFudGl0eUlucHV0LmF0dHIoJ21pbicpKSB7XG4gICAgICAgICRxdWFudGl0eUlucHV0LnZhbCgkcXVhbnRpdHlJbnB1dC5hdHRyKCdtaW4nKSk7XG4gICAgICAgICRxdWFudGl0eUlucHV0LnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnYm9keScpLm9uKCdjaGFuZ2Uga2V5dXAnLCBwcmVzdGFzaG9wLnNlbGVjdG9ycy5xdWFudGl0eVdhbnRlZCwgKGUpID0+IHtcbiAgICAgIGlmICgkcXVhbnRpdHlJbnB1dC52YWwoKSAhPT0gJycpIHtcbiAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLnRyaWdnZXIoJ3RvdWNoc3Bpbi5zdG9wc3BpbicpO1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoJ3VwZGF0ZVByb2R1Y3QnLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAndXBkYXRlZFByb2R1Y3RRdWFudGl0eScsXG4gICAgICAgICAgZXZlbnQ6IGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkSnNQcm9kdWN0VGFiQWN0aXZlU2VsZWN0b3IoKSB7XG4gICAgY29uc3QgbmF2ID0gJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QudGFicyk7XG4gICAgbmF2Lm9uKCdzaG93LmJzLnRhYicsIChlKSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSAkKGUudGFyZ2V0KTtcbiAgICAgIHRhcmdldC5hZGRDbGFzcyhwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuYWN0aXZlTmF2Q2xhc3MpO1xuICAgICAgJCh0YXJnZXQuYXR0cignaHJlZicpKS5hZGRDbGFzcyhwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuYWN0aXZlVGFiQ2xhc3MpO1xuICAgIH0pO1xuICAgIG5hdi5vbignaGlkZS5icy50YWInLCAoZSkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gJChlLnRhcmdldCk7XG4gICAgICB0YXJnZXQucmVtb3ZlQ2xhc3MocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFjdGl2ZU5hdkNsYXNzKTtcbiAgICAgICQodGFyZ2V0LmF0dHIoJ2hyZWYnKSkucmVtb3ZlQ2xhc3MocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFjdGl2ZVRhYkNsYXNzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVByb2R1Y3RTcGluKCk7XG4gIGNyZWF0ZUlucHV0RmlsZSgpO1xuICBjb3ZlckltYWdlKCk7XG4gIGltYWdlU2Nyb2xsQm94KCk7XG4gIGFkZEpzUHJvZHVjdFRhYkFjdGl2ZVNlbGVjdG9yKCk7XG5cbiAgcHJlc3Rhc2hvcC5vbigndXBkYXRlZFByb2R1Y3QnLCAoZXZlbnQpID0+IHtcbiAgICBjcmVhdGVJbnB1dEZpbGUoKTtcbiAgICBjb3ZlckltYWdlKCk7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnByb2R1Y3RfbWluaW1hbF9xdWFudGl0eSkge1xuICAgICAgY29uc3QgbWluaW1hbFByb2R1Y3RRdWFudGl0eSA9IHBhcnNlSW50KGV2ZW50LnByb2R1Y3RfbWluaW1hbF9xdWFudGl0eSwgMTApO1xuICAgICAgY29uc3QgcXVhbnRpdHlJbnB1dFNlbGVjdG9yID0gcHJlc3Rhc2hvcC5zZWxlY3RvcnMucXVhbnRpdHlXYW50ZWQ7XG4gICAgICBjb25zdCBxdWFudGl0eUlucHV0ID0gJChxdWFudGl0eUlucHV0U2VsZWN0b3IpO1xuXG4gICAgICAvLyBAc2VlIGh0dHA6Ly93d3cudmlydHVvc29mdC5ldS9jb2RlL2Jvb3RzdHJhcC10b3VjaHNwaW4vIGFib3V0IEJvb3RzdHJhcCBUb3VjaFNwaW5cbiAgICAgIHF1YW50aXR5SW5wdXQudHJpZ2dlcigndG91Y2hzcGluLnVwZGF0ZXNldHRpbmdzJywge1xuICAgICAgICBtaW46IG1pbmltYWxQcm9kdWN0UXVhbnRpdHksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaW1hZ2VTY3JvbGxCb3goKTtcbiAgICAkKCQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFjdGl2ZVRhYnMpLmF0dHIoJ2hyZWYnKSkuYWRkQ2xhc3MoJ2FjdGl2ZScpLnJlbW92ZUNsYXNzKCdmYWRlJyk7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuaW1hZ2VzTW9kYWwpLnJlcGxhY2VXaXRoKGV2ZW50LnByb2R1Y3RfaW1hZ2VzX21vZGFsKTtcblxuICAgIGNvbnN0IHByb2R1Y3RTZWxlY3QgPSBuZXcgUHJvZHVjdFNlbGVjdCgpO1xuICAgIHByb2R1Y3RTZWxlY3QuaW5pdCgpO1xuICB9KTtcbn0pO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHRpbWVvdXQgPSAzMDApIHtcbiAgbGV0IHRpbWVyO1xuXG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgZnVuYy5hcHBseSh0aGlzLCBhcmdzKTsgfSwgdGltZW91dCk7XG4gIH07XG59XG4iLCJpbXBvcnQgJCBmcm9tIFwianF1ZXJ5XCI7XG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tIFwicHJlc3Rhc2hvcFwiO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCIuL2NvbXBvbmVudHMvZGVib3VuY2VcIjtcblxucHJlc3Rhc2hvcC5jYXJ0ID0gcHJlc3Rhc2hvcC5jYXJ0IHx8IHt9O1xuXG5wcmVzdGFzaG9wLmNhcnQuYWN0aXZlX2lucHV0cyA9IG51bGw7XG5cbmNvbnN0IHNwaW5uZXJTZWxlY3RvciA9ICdpbnB1dFtuYW1lPVwicHJvZHVjdC1xdWFudGl0eS1zcGluXCJdJztcbmxldCBoYXNFcnJvciA9IGZhbHNlO1xubGV0IGlzVXBkYXRlT3BlcmF0aW9uID0gZmFsc2U7XG5sZXQgZXJyb3JNc2cgPSBcIlwiO1xuXG5jb25zdCBDaGVja1VwZGF0ZVF1YW50aXR5T3BlcmF0aW9ucyA9IHtcbiAgc3dpdGNoRXJyb3JTdGF0OiAoKSA9PiB7XG4gICAgLyoqXG4gICAgICogaWYgZXJyb3JNc2cgaXMgbm90IGVtcHR5IG9yIGlmIG5vdGlmaWNhdGlvbnMgYXJlIHNob3duLCB3ZSBoYXZlIGVycm9yIHRvIGRpc3BsYXlcbiAgICAgKiBpZiBoYXNFcnJvciBpcyB0cnVlLCBxdWFudGl0eSB3YXMgbm90IHVwZGF0ZWQgOiB3ZSBkb24ndCBkaXNhYmxlIGNoZWNrb3V0IGJ1dHRvblxuICAgICAqL1xuICAgIGNvbnN0ICRjaGVja291dEJ0biA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jaGVja291dC5idG4pO1xuXG4gICAgaWYgKFxuICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm5vdGlmaWNhdGlvbnMuZGFuZ2VyQWxlcnQpLmxlbmd0aCB8fFxuICAgICAgKGVycm9yTXNnICE9PSBcIlwiICYmICFoYXNFcnJvcilcbiAgICApIHtcbiAgICAgICRjaGVja291dEJ0bi5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgIH1cblxuICAgIGlmIChlcnJvck1zZyAhPT0gXCJcIikge1xuICAgICAgY29uc3Qgc3RyRXJyb3IgPSBgXG4gICAgICAgIDxhcnRpY2xlIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCIgZGF0YS1hbGVydD1cImRhbmdlclwiPlxuICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgIDxsaT4ke2Vycm9yTXNnfTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9hcnRpY2xlPlxuICAgICAgYDtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5ub3RpZmljYXRpb25zLmNvbnRhaW5lcikuaHRtbChzdHJFcnJvcik7XG4gICAgICBlcnJvck1zZyA9IFwiXCI7XG4gICAgICBpc1VwZGF0ZU9wZXJhdGlvbiA9IGZhbHNlO1xuICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgIC8vIGlmIGhhc0Vycm9yIGlzIHRydWUsIHF1YW50aXR5IHdhcyBub3QgdXBkYXRlZCA6IGFsbG93IGNoZWNrb3V0XG4gICAgICAgICRjaGVja291dEJ0bi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWhhc0Vycm9yICYmIGlzVXBkYXRlT3BlcmF0aW9uKSB7XG4gICAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgaXNVcGRhdGVPcGVyYXRpb24gPSBmYWxzZTtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5ub3RpZmljYXRpb25zLmNvbnRhaW5lcikuaHRtbChcIlwiKTtcbiAgICAgICRjaGVja291dEJ0bi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgfSxcbiAgY2hlY2tVcGRhdGVPcGVyYXRpb246IChyZXNwKSA9PiB7XG4gICAgLyoqXG4gICAgICogcmVzcC5oYXNFcnJvciBjYW4gYmUgbm90IGRlZmluZWQgYnV0IHJlc3AuZXJyb3JzIG5vdCBlbXB0eTogcXVhbnRpdHkgaXMgdXBkYXRlZCBidXQgb3JkZXIgY2Fubm90IGJlIHBsYWNlZFxuICAgICAqIHdoZW4gcmVzcC5oYXNFcnJvcj10cnVlLCBxdWFudGl0eSBpcyBub3QgdXBkYXRlZFxuICAgICAqL1xuICAgIGNvbnN0IHsgaGFzRXJyb3I6IGhhc0Vycm9yT2NjdXJyZWQsIGVycm9yczogZXJyb3JEYXRhIH0gPSByZXNwO1xuICAgIGhhc0Vycm9yID0gaGFzRXJyb3JPY2N1cnJlZCA/PyBmYWxzZTtcbiAgICBjb25zdCBlcnJvcnMgPSBlcnJvckRhdGEgPz8gXCJcIjtcblxuICAgIC8vIDEuNy4yLnggcmV0dXJucyBlcnJvcnMgYXMgc3RyaW5nLCAxLjcuMy54IHJldHVybnMgYXJyYXlcbiAgICBpZiAoZXJyb3JzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGVycm9yTXNnID0gZXJyb3JzLmpvaW4oXCIgXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvck1zZyA9IGVycm9ycztcbiAgICB9XG5cbiAgICBpc1VwZGF0ZU9wZXJhdGlvbiA9IHRydWU7XG4gIH0sXG59O1xuXG4vKipcbiAqIEF0dGFjaCBCb290c3RyYXAgVG91Y2hTcGluIGV2ZW50IGhhbmRsZXJzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNwaW4oKSB7XG4gICQuZWFjaCgkKHNwaW5uZXJTZWxlY3RvciksIChpbmRleCwgc3Bpbm5lcikgPT4ge1xuICAgICQoc3Bpbm5lcikuVG91Y2hTcGluKHtcbiAgICAgIG1pbjogcGFyc2VJbnQoJChzcGlubmVyKS5hdHRyKFwibWluXCIpLCAxMCksXG4gICAgICBtYXg6IDEwMDAwMDAsXG4gICAgfSk7XG4gIH0pO1xuXG4gICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy50b3VjaHNwaW4pLm9mZihcInRvdWNoc3RhcnQudG91Y2hzcGluXCIpO1xuXG4gIENoZWNrVXBkYXRlUXVhbnRpdHlPcGVyYXRpb25zLnN3aXRjaEVycm9yU3RhdCgpO1xufVxuXG5jb25zdCBwcmV2ZW50Q3VzdG9tTW9kYWxPcGVuID0gKGV2ZW50KSA9PiB7XG4gIGlmICh3aW5kb3cuc2hvdWxkUHJldmVudE1vZGFsKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiQoZnVuY3Rpb24gKCkge1xuICBjb25zdCBwcm9kdWN0TGluZUluQ2FydFNlbGVjdG9yID1cbiAgICBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQucHJvZHVjdExpbmVRdHk7XG4gIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgcHJlc3Rhc2hvcC5vbihcInVwZGF0ZWRDYXJ0XCIsICgpID0+IHtcbiAgICB3aW5kb3cuc2hvdWxkUHJldmVudE1vZGFsID0gZmFsc2U7XG5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5jdXN0b21pemF0aW9uTW9kYWwpLm9uKFxuICAgICAgXCJzaG93LmJzLm1vZGFsXCIsXG4gICAgICAobW9kYWxFdmVudCkgPT4ge1xuICAgICAgICBwcmV2ZW50Q3VzdG9tTW9kYWxPcGVuKG1vZGFsRXZlbnQpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY3JlYXRlU3BpbigpO1xuICB9KTtcblxuICBjcmVhdGVTcGluKCk7XG5cbiAgY29uc3QgJGJvZHkgPSAkKFwiYm9keVwiKTtcblxuICBmdW5jdGlvbiBpc1RvdWNoU3BpbihuYW1lc3BhY2UpIHtcbiAgICByZXR1cm4gbmFtZXNwYWNlID09PSBcIm9uLnN0YXJ0dXBzcGluXCIgfHwgbmFtZXNwYWNlID09PSBcIm9uLnN0YXJ0ZG93bnNwaW5cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEluY3JlYXNlUHJvZHVjdFF1YW50aXR5KG5hbWVzcGFjZSkge1xuICAgIHJldHVybiBuYW1lc3BhY2UgPT09IFwib24uc3RhcnR1cHNwaW5cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRDYXJ0TGluZVByb2R1Y3RRdWFudGl0eUlucHV0KCR0YXJnZXQpIHtcbiAgICBjb25zdCAkaW5wdXQgPSAkdGFyZ2V0XG4gICAgICAucGFyZW50cyhwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQudG91Y2hzcGluKVxuICAgICAgLmZpbmQocHJvZHVjdExpbmVJbkNhcnRTZWxlY3Rvcik7XG5cbiAgICBpZiAoJGlucHV0LmlzKFwiOmZvY3VzXCIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gJGlucHV0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FtZWxpemUoc3ViamVjdCkge1xuICAgIGNvbnN0IGFjdGlvblR5cGVQYXJ0cyA9IHN1YmplY3Quc3BsaXQoXCItXCIpO1xuICAgIGxldCBpO1xuICAgIGxldCBwYXJ0O1xuICAgIGxldCBjYW1lbGl6ZWRTdWJqZWN0ID0gXCJcIjtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBhY3Rpb25UeXBlUGFydHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHBhcnQgPSBhY3Rpb25UeXBlUGFydHNbaV07XG5cbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIHBhcnQgPSBwYXJ0LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcGFydC5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG5cbiAgICAgIGNhbWVsaXplZFN1YmplY3QgKz0gcGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FtZWxpemVkU3ViamVjdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQ2FydEFjdGlvbigkdGFyZ2V0LCBuYW1lc3BhY2UpIHtcbiAgICBpZiAoIWlzVG91Y2hTcGluKG5hbWVzcGFjZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybDogJHRhcmdldC5hdHRyKFwiaHJlZlwiKSxcbiAgICAgICAgdHlwZTogY2FtZWxpemUoJHRhcmdldC5kYXRhKFwibGluay1hY3Rpb25cIikpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCAkaW5wdXQgPSBmaW5kQ2FydExpbmVQcm9kdWN0UXVhbnRpdHlJbnB1dCgkdGFyZ2V0KTtcblxuICAgIGlmICghJGlucHV0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGNhcnRBY3Rpb24gPSB7fTtcblxuICAgIGlmIChzaG91bGRJbmNyZWFzZVByb2R1Y3RRdWFudGl0eShuYW1lc3BhY2UpKSB7XG4gICAgICBjYXJ0QWN0aW9uID0ge1xuICAgICAgICB1cmw6ICRpbnB1dC5kYXRhKFwidXAtdXJsXCIpLFxuICAgICAgICB0eXBlOiBcImluY3JlYXNlUHJvZHVjdFF1YW50aXR5XCIsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJ0QWN0aW9uID0ge1xuICAgICAgICB1cmw6ICRpbnB1dC5kYXRhKFwiZG93bi11cmxcIiksXG4gICAgICAgIHR5cGU6IFwiZGVjcmVhc2VQcm9kdWN0UXVhbnRpdHlcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhcnRBY3Rpb247XG4gIH1cblxuICBjb25zdCBhYm9ydFByZXZpb3VzUmVxdWVzdHMgPSAoKSA9PiB7XG4gICAgbGV0IHByb21pc2U7XG4gICAgd2hpbGUgKHByb21pc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlcy5wb3AoKTtcbiAgICAgIHByb21pc2UuYWJvcnQoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0VG91Y2hTcGluSW5wdXQgPSAoJGJ1dHRvbikgPT5cbiAgICAkKCRidXR0b24ucGFyZW50cyhwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQudG91Y2hzcGluKS5maW5kKFwiaW5wdXRcIikpO1xuXG4gICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmN1c3RvbWl6YXRpb25Nb2RhbCkub24oXG4gICAgXCJzaG93LmJzLm1vZGFsXCIsXG4gICAgKG1vZGFsRXZlbnQpID0+IHtcbiAgICAgIHByZXZlbnRDdXN0b21Nb2RhbE9wZW4obW9kYWxFdmVudCk7XG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBoYW5kbGVDYXJ0QWN0aW9uID0gKGV2ZW50KSA9PiB7XG4gICAgYWJvcnRQcmV2aW91c1JlcXVlc3RzKCk7XG4gICAgd2luZG93LnNob3VsZFByZXZlbnRNb2RhbCA9IHRydWU7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIGNvbnN0IHsgZGF0YXNldCB9ID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICBjb25zdCBjYXJ0QWN0aW9uID0gcGFyc2VDYXJ0QWN0aW9uKCR0YXJnZXQsIGV2ZW50Lm5hbWVzcGFjZSk7XG4gICAgY29uc3QgcmVxdWVzdERhdGEgPSB7XG4gICAgICBhamF4OiBcIjFcIixcbiAgICAgIGFjdGlvbjogXCJ1cGRhdGVcIixcbiAgICB9O1xuXG4gICAgaWYgKCFjYXJ0QWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogY2FydEFjdGlvbi51cmwsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgZGF0YTogcmVxdWVzdERhdGEsXG4gICAgICBkYXRhVHlwZTogXCJqc29uXCIsXG4gICAgICBiZWZvcmVTZW5kKGpxWEhSKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goanFYSFIpO1xuICAgICAgfSxcbiAgICB9KVxuICAgICAgLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgY29uc3QgJHF1YW50aXR5SW5wdXQgPSBnZXRUb3VjaFNwaW5JbnB1dCgkdGFyZ2V0KTtcbiAgICAgICAgQ2hlY2tVcGRhdGVRdWFudGl0eU9wZXJhdGlvbnMuY2hlY2tVcGRhdGVPcGVyYXRpb24ocmVzcCk7XG4gICAgICAgICRxdWFudGl0eUlucHV0LnZhbChyZXNwLnF1YW50aXR5KTtcblxuICAgICAgICAvLyBSZWZyZXNoIGNhcnQgcHJldmlld1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoXCJ1cGRhdGVDYXJ0XCIsIHtcbiAgICAgICAgICByZWFzb246IGRhdGFzZXQsXG4gICAgICAgICAgcmVzcCxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmZhaWwoKHJlc3ApID0+IHtcbiAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KFwiaGFuZGxlRXJyb3JcIiwge1xuICAgICAgICAgIGV2ZW50VHlwZTogXCJ1cGRhdGVQcm9kdWN0SW5DYXJ0XCIsXG4gICAgICAgICAgcmVzcCxcbiAgICAgICAgICBjYXJ0QWN0aW9uOiBjYXJ0QWN0aW9uLnR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH07XG5cbiAgJGJvZHkub24oXCJjbGlja1wiLCBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQuYWN0aW9ucywgaGFuZGxlQ2FydEFjdGlvbik7XG5cbiAgZnVuY3Rpb24gc2VuZFVwZGF0ZVF1YW50aXR5SW5DYXJ0UmVxdWVzdChcbiAgICB1cGRhdGVRdWFudGl0eUluQ2FydFVybCxcbiAgICByZXF1ZXN0RGF0YSxcbiAgICAkdGFyZ2V0LFxuICApIHtcbiAgICBhYm9ydFByZXZpb3VzUmVxdWVzdHMoKTtcbiAgICB3aW5kb3cuc2hvdWxkUHJldmVudE1vZGFsID0gdHJ1ZTtcblxuICAgIHJldHVybiAkLmFqYXgoe1xuICAgICAgdXJsOiB1cGRhdGVRdWFudGl0eUluQ2FydFVybCxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBkYXRhOiByZXF1ZXN0RGF0YSxcbiAgICAgIGRhdGFUeXBlOiBcImpzb25cIixcbiAgICAgIGJlZm9yZVNlbmQoanFYSFIpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChqcVhIUik7XG4gICAgICB9LFxuICAgIH0pXG4gICAgICAudGhlbigocmVzcCkgPT4ge1xuICAgICAgICBDaGVja1VwZGF0ZVF1YW50aXR5T3BlcmF0aW9ucy5jaGVja1VwZGF0ZU9wZXJhdGlvbihyZXNwKTtcblxuICAgICAgICAkdGFyZ2V0LnZhbChyZXNwLnF1YW50aXR5KTtcbiAgICAgICAgY29uc3QgZGF0YXNldCA9ICR0YXJnZXQgJiYgJHRhcmdldC5kYXRhc2V0ID8gJHRhcmdldC5kYXRhc2V0IDogcmVzcDtcblxuICAgICAgICAvLyBSZWZyZXNoIGNhcnQgcHJldmlld1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoXCJ1cGRhdGVDYXJ0XCIsIHtcbiAgICAgICAgICByZWFzb246IGRhdGFzZXQsXG4gICAgICAgICAgcmVzcCxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmZhaWwoKHJlc3ApID0+IHtcbiAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KFwiaGFuZGxlRXJyb3JcIiwge1xuICAgICAgICAgIGV2ZW50VHlwZTogXCJ1cGRhdGVQcm9kdWN0UXVhbnRpdHlJbkNhcnRcIixcbiAgICAgICAgICByZXNwLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UXVhbnRpdHlDaGFuZ2VUeXBlKCRxdWFudGl0eSkge1xuICAgIHJldHVybiAkcXVhbnRpdHkgPiAwID8gXCJ1cFwiIDogXCJkb3duXCI7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXF1ZXN0RGF0YShxdWFudGl0eSkge1xuICAgIHJldHVybiB7XG4gICAgICBhamF4OiBcIjFcIixcbiAgICAgIHF0eTogTWF0aC5hYnMocXVhbnRpdHkpLFxuICAgICAgYWN0aW9uOiBcInVwZGF0ZVwiLFxuICAgICAgb3A6IGdldFF1YW50aXR5Q2hhbmdlVHlwZShxdWFudGl0eSksXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVByb2R1Y3RRdWFudGl0eUluQ2FydChldmVudCkge1xuICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIGNvbnN0IHVwZGF0ZVF1YW50aXR5SW5DYXJ0VXJsID0gJHRhcmdldC5kYXRhKFwidXBkYXRlLXVybFwiKTtcbiAgICBjb25zdCBiYXNlVmFsdWUgPSAkdGFyZ2V0LmF0dHIoXCJ2YWx1ZVwiKTtcblxuICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhIHZhbGlkIHByb2R1Y3QgcXVhbnRpdHkgaW4gY2FydFxuICAgIGNvbnN0IHRhcmdldFZhbHVlID0gJHRhcmdldC52YWwoKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIGlmIChcbiAgICAgIHRhcmdldFZhbHVlICE9IHBhcnNlSW50KHRhcmdldFZhbHVlLCAxMCkgfHxcbiAgICAgIHRhcmdldFZhbHVlIDwgMCB8fFxuICAgICAgaXNOYU4odGFyZ2V0VmFsdWUpXG4gICAgKSB7XG4gICAgICB3aW5kb3cuc2hvdWxkUHJldmVudE1vZGFsID0gZmFsc2U7XG4gICAgICAkdGFyZ2V0LnZhbChiYXNlVmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgLy8gVGhlcmUgc2hvdWxkIGJlIGEgbmV3IHByb2R1Y3QgcXVhbnRpdHkgaW4gY2FydFxuICAgIGNvbnN0IHF0eSA9IHRhcmdldFZhbHVlIC0gYmFzZVZhbHVlO1xuXG4gICAgaWYgKHF0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXRWYWx1ZSA9PT0gXCIwXCIpIHtcbiAgICAgICR0YXJnZXRcbiAgICAgICAgLmNsb3Nlc3QoXCIucHJvZHVjdC1saW5lLWFjdGlvbnNcIilcbiAgICAgICAgLmZpbmQoJ1tkYXRhLWxpbmstYWN0aW9uPVwiZGVsZXRlLWZyb20tY2FydFwiXScpXG4gICAgICAgIC5jbGljaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkdGFyZ2V0LmF0dHIoXCJ2YWx1ZVwiLCB0YXJnZXRWYWx1ZSk7XG4gICAgICBzZW5kVXBkYXRlUXVhbnRpdHlJbkNhcnRSZXF1ZXN0KFxuICAgICAgICB1cGRhdGVRdWFudGl0eUluQ2FydFVybCxcbiAgICAgICAgZ2V0UmVxdWVzdERhdGEocXR5KSxcbiAgICAgICAgJHRhcmdldCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgJGJvZHkub24oXG4gICAgXCJ0b3VjaHNwaW4ub24uc3RvcHNwaW5cIixcbiAgICBzcGlubmVyU2VsZWN0b3IsXG4gICAgZGVib3VuY2UodXBkYXRlUHJvZHVjdFF1YW50aXR5SW5DYXJ0KSxcbiAgKTtcblxuICAkYm9keS5vbihcImZvY3Vzb3V0IGtleXVwXCIsIHByb2R1Y3RMaW5lSW5DYXJ0U2VsZWN0b3IsIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC50eXBlID09PSBcImtleXVwXCIpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICBpc1VwZGF0ZU9wZXJhdGlvbiA9IHRydWU7XG4gICAgICAgIHVwZGF0ZVByb2R1Y3RRdWFudGl0eUluQ2FydChldmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVXBkYXRlT3BlcmF0aW9uKSB7XG4gICAgICB1cGRhdGVQcm9kdWN0UXVhbnRpdHlJbkNhcnQoZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgY29uc3QgJHRpbWVvdXRFZmZlY3QgPSA0MDA7XG5cbiAgJGJvZHkub24oXG4gICAgXCJoaWRkZW4uYnMuY29sbGFwc2VcIixcbiAgICBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQucHJvbW9Db2RlLFxuICAgICgpID0+IHtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jYXJ0LmRpc3BsYXlQcm9tbykuc2hvdygkdGltZW91dEVmZmVjdCk7XG4gICAgfSxcbiAgKTtcblxuICAkYm9keS5vbihcImNsaWNrXCIsIHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5wcm9tb0NvZGVCdXR0b24sIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5wcm9tb0NvZGUpLmNvbGxhcHNlKFwidG9nZ2xlXCIpO1xuICB9KTtcblxuICAkYm9keS5vbihcImNsaWNrXCIsIHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5kaXNwbGF5UHJvbW8sIChldmVudCkgPT4ge1xuICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuaGlkZSgkdGltZW91dEVmZmVjdCk7XG4gIH0pO1xuXG4gICRib2R5Lm9uKFwiY2xpY2tcIiwgcHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jYXJ0LmRpc2NvdW50Q29kZSwgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCAkY29kZSA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgY29uc3QgJGRpc2NvdW50SW5wdXQgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5kaXNjb3VudE5hbWUpO1xuXG4gICAgJGRpc2NvdW50SW5wdXQudmFsKCRjb2RlLnRleHQoKSk7XG4gICAgLy8gU2hvdyBwcm9tbyBjb2RlIGZpZWxkXG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQucHJvbW9Db2RlKS5jb2xsYXBzZShcInNob3dcIik7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQuZGlzcGxheVByb21vKS5oaWRlKCR0aW1lb3V0RWZmZWN0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59KTtcblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBwcmVzdGFzaG9wLm9uKFwidXBkYXRlQ2FydFwiLCAoZSkgPT4ge1xuICAgIHByZXN0YXNob3AuY2FydCA9IGUucmVzcC5jYXJ0O1xuICAgIGNvbnN0IG4gPSAkKFwiLmpzLWNhcnRcIikuZGF0YShcInJlZnJlc2gtdXJsXCIpO1xuICAgIGlmICghbikgcmV0dXJuO1xuICAgIGxldCBvID0ge307XG4gICAgZSAmJlxuICAgICAgZS5yZWFzb24gJiZcbiAgICAgIChvID0ge1xuICAgICAgICBpZF9wcm9kdWN0X2F0dHJpYnV0ZTogZS5yZWFzb24uaWRQcm9kdWN0QXR0cmlidXRlLFxuICAgICAgICBpZF9wcm9kdWN0OiBlLnJlYXNvbi5pZFByb2R1Y3QsXG4gICAgICB9KSxcbiAgICAgICQucG9zdChuLCBvKVxuICAgICAgICAudGhlbigoZSkgPT4ge1xuICAgICAgICAgICQocHJlc3Rhc2hvcC5zZWxlY3RvcnMuY2FydC5kZXRhaWxlZFRvdGFscykucmVwbGFjZVdpdGgoXG4gICAgICAgICAgICBlLmNhcnRfZGV0YWlsZWRfdG90YWxzLFxuICAgICAgICAgICksXG4gICAgICAgICAgICAkKHByZXN0YXNob3Auc2VsZWN0b3JzLmNhcnQuc3VtbWFyeUl0ZW1zU3VidG90YWwpLnJlcGxhY2VXaXRoKFxuICAgICAgICAgICAgICBlLmNhcnRfc3VtbWFyeV9pdGVtc19zdWJ0b3RhbCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAkKHByZXN0YXNob3Auc2VsZWN0b3JzLmNhcnQuc3VtbWFyeVN1YlRvdGFsc0NvbnRhaW5lcikucmVwbGFjZVdpdGgoXG4gICAgICAgICAgICAgIGUuY2FydF9zdW1tYXJ5X3N1YnRvdGFsc19jb250YWluZXIsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgJChwcmVzdGFzaG9wLnNlbGVjdG9ycy5jYXJ0LnN1bW1hcnlQcm9kdWN0cykucmVwbGFjZVdpdGgoXG4gICAgICAgICAgICAgIGUuY2FydF9zdW1tYXJ5X3Byb2R1Y3RzLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICQocHJlc3Rhc2hvcC5zZWxlY3RvcnMuY2FydC5zdW1tYXJ5VG90YWxzKS5yZXBsYWNlV2l0aChcbiAgICAgICAgICAgICAgZS5jYXJ0X3N1bW1hcnlfdG90YWxzLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICQocHJlc3Rhc2hvcC5zZWxlY3RvcnMuY2FydC5kZXRhaWxlZEFjdGlvbnMpLnJlcGxhY2VXaXRoKFxuICAgICAgICAgICAgICBlLmNhcnRfZGV0YWlsZWRfYWN0aW9ucyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAkKHByZXN0YXNob3Auc2VsZWN0b3JzLmNhcnQudm91Y2hlcikucmVwbGFjZVdpdGgoZS5jYXJ0X3ZvdWNoZXIpLFxuICAgICAgICAgICAgJChwcmVzdGFzaG9wLnNlbGVjdG9ycy5jYXJ0Lm92ZXJ2aWV3KS5yZXBsYWNlV2l0aChlLmNhcnRfZGV0YWlsZWQpLFxuICAgICAgICAgICAgJChwcmVzdGFzaG9wLnNlbGVjdG9ycy5jYXJ0LnN1bW1hcnlUb3ApLnJlcGxhY2VXaXRoKFxuICAgICAgICAgICAgICBlLmNhcnRfc3VtbWFyeV90b3AsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgJChwcmVzdGFzaG9wLnNlbGVjdG9ycy5jYXJ0LnByb2R1Y3RDdXN0b21pemF0aW9uSWQpLnZhbCgwKSxcbiAgICAgICAgICAgICQocHJlc3Rhc2hvcC5zZWxlY3RvcnMuY2FydC5saW5lUHJvZHVjdFF1YW50aXR5KS5lYWNoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHIgPSAkKG4pO1xuICAgICAgICAgICAgICByLmF0dHIoXCJ2YWx1ZVwiLCByLnZhbCgpKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgJChwcmVzdGFzaG9wLnNlbGVjdG9ycy5jaGVja291dC5jYXJ0UGF5bWVudFN0ZXBSZWZyZXNoKS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgaSgpLFxuICAgICAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KFwidXBkYXRlZENhcnRcIiwge1xuICAgICAgICAgICAgICBldmVudFR5cGU6IFwidXBkYXRlQ2FydFwiLFxuICAgICAgICAgICAgICByZXNwOiBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5mYWlsKChlKSA9PiB7XG4gICAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KFwiaGFuZGxlRXJyb3JcIiwgeyBldmVudFR5cGU6IFwidXBkYXRlQ2FydFwiLCByZXNwOiBlIH0pO1xuICAgICAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGUgPSAkKFwiYm9keVwiKTtcbiAgZS5vbihcImNsaWNrXCIsICdbZGF0YS1idXR0b24tYWN0aW9uPVwiYWRkLXRvLWNhcnRcIl0nLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bCQ7XG4gICAgY29uc3QgbiA9ICQoZS5jdXJyZW50VGFyZ2V0LmZvcm0pLFxuICAgICAgbyA9IGAke24uc2VyaWFsaXplKCl9JmFkZD0xJmFjdGlvbj11cGRhdGVgLFxuICAgICAgaSA9IG4uYXR0cihcImFjdGlvblwiKSxcbiAgICAgIGEgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgYS5wcm9wKFwiZGlzYWJsZWRcIiwgITApO1xuICAgIGxldCBzID0gKGUpID0+IHtcbiAgICAgIGVcbiAgICAgICAgLnBhcmVudHMocHJlc3Rhc2hvcC5zZWxlY3RvcnMucHJvZHVjdC5hZGRUb0NhcnQpXG4gICAgICAgIC5maXJzJC5maW5kKHByZXN0YXNob3Auc2VsZWN0b3JzLnByb2R1Y3QubWluaW1hbFF1YW50aXR5KVxuICAgICAgICAuYWRkQ2xhc3MoXCJlcnJvclwiKSxcbiAgICAgICAgZS5wYXJlbiQuZmluZChcImxhYmVsXCIpLmFkZENsYXNzKFwiZXJyb3JcIik7XG4gICAgfTtcbiAgICBjb25zdCBjID0gbi5maW5kKFwiaW5wdXRbbWluXVwiKTtcbiAgICAoKGUpID0+IHtcbiAgICAgIGxldCBuID0gITA7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBlLmVhY2goKGUsIHIpID0+IHtcbiAgICAgICAgICBjb25zdCBvID0gJChyKSxcbiAgICAgICAgICAgIGkgPSBwYXJzZUludChvLmF0dHIoXCJtaW5cIiksIDEwKTtcbiAgICAgICAgICBpICYmIG8udmFsKCkgPCBpICYmIChzKG8pLCAobiA9ICExKSk7XG4gICAgICAgIH0pLFxuICAgICAgICBuXG4gICAgICApO1xuICAgIH0pKGMpXG4gICAgICA/ICQucG9zdChpLCBvLCBudWxsLCBcImpzb25cIilcbiAgICAgICAgICAudGhlbigoZSkgPT4ge1xuICAgICAgICAgICAgZS5oYXNFcnJvclxuICAgICAgICAgICAgICA/IHByZXN0YXNob3AuZW1pdChcImhhbmRsZUVycm9yXCIsIHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogXCJhZGRQcm9kdWN0VG9DYXJ0XCIsXG4gICAgICAgICAgICAgICAgICByZXNwOiBlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogcHJlc3Rhc2hvcC5lbWl0KFwidXBkYXRlQ2FydFwiLCB7XG4gICAgICAgICAgICAgICAgICByZWFzb246IHtcbiAgICAgICAgICAgICAgICAgICAgaWRQcm9kdWN0OiBlLmlkX3Byb2R1Y3QsXG4gICAgICAgICAgICAgICAgICAgIGlkUHJvZHVjdEF0dHJpYnV0ZTogZS5pZF9wcm9kdWN0X2F0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICAgICAgaWRDdXN0b21pemF0aW9uOiBlLmlkX2N1c3RvbWl6YXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGxpbmtBY3Rpb246IFwiYWRkLXRvLWNhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgY2FydDogZS5jYXJ0LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHJlc3A6IGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmFpbCgoZSkgPT4ge1xuICAgICAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KFwiaGFuZGxlRXJyb3JcIiwge1xuICAgICAgICAgICAgICBldmVudFR5cGU6IFwiYWRkUHJvZHVjdFRvQ2FydFwiLFxuICAgICAgICAgICAgICByZXNwOiBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYWx3YXlzKCgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBhLnByb3AoXCJkaXNhYmxlZFwiLCAhMSk7XG4gICAgICAgICAgICB9LCAxZTMpO1xuICAgICAgICAgIH0pXG4gICAgICA6IHMoYyk7XG4gIH0pLFxuICAgIGUub2ZmKFwic3VibWl0XCIsICdbZGF0YS1saW5rLWFjdGlvbj1cImFkZC12b3VjaGVyXCJdJyksXG4gICAgZS5vbihcInN1Ym1pdFwiLCAnW2RhdGEtbGluay1hY3Rpb249XCJhZGQtdm91Y2hlclwiXScsIChlKSA9PiB7XG4gICAgICBjb25zdCBwcm9tb1N1Ym1pdEJ0biA9ICQoXCIjcHJvbW8tY29kZS1mb3JtIGJ1dHRvblwiKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IG4gPSAkKGUuY3VycmVudFRhcmdldCksXG4gICAgICAgIG8gPSBuLmF0dHIoXCJhY3Rpb25cIik7XG4gICAgICAwID09PSBuLmZpbmQoXCJbbmFtZT1hY3Rpb25dXCIpLmxlbmd0aCAmJlxuICAgICAgICBuLmFwcGVuZCgkKFwiPGlucHV0PlwiLCB7IHR5cGU6IFwiaGlkZGVuXCIsIG5hbWU6IFwiYWpheFwiLCB2YWx1ZTogMSB9KSksXG4gICAgICAgIDAgPT09IG4uZmluZChcIltuYW1lPWFjdGlvbl1cIikubGVuZ3RoICYmXG4gICAgICAgICAgbi5hcHBlbmQoXG4gICAgICAgICAgICAkKFwiPGlucHV0PlwiLCB7IHR5cGU6IFwiaGlkZGVuXCIsIG5hbWU6IFwiYWN0aW9uXCIsIHZhbHVlOiBcInVwZGF0ZVwiIH0pLFxuICAgICAgICAgICksXG4gICAgICAgIHByb21vU3VibWl0QnRuLnRleHQoXCJDSEVDS0lOR1wiKTtcbiAgICAgIHByb21vU3VibWl0QnRuLnByb3AoXCJkaXNhYmxlXCIsIHRydWUpO1xuICAgICAgJC5wb3N0KG8sIG4uc2VyaWFsaXplKCksIG51bGwsIFwianNvblwiKVxuICAgICAgICAudGhlbigobikgPT4ge1xuICAgICAgICAgIG4uaGFzRXJyb3JcbiAgICAgICAgICAgID8gJChcIi5qcy1lcnJvclwiKS5zaG93KCkuZmluZChcIi5qcy1lcnJvci10ZXh0XCIpLnRleHQobi5lcnJvcnNbMF0pXG4gICAgICAgICAgICA6IHByZXN0YXNob3AuZW1pdChcInVwZGF0ZUNhcnRcIiwge1xuICAgICAgICAgICAgICAgIHJlYXNvbjogZS50YXJnZXQuZGF0YXNldCxcbiAgICAgICAgICAgICAgICByZXNwOiBuLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICBwcm9tb1N1Ym1pdEJ0bi50ZXh0KFwiQUREXCIpO1xuICAgICAgICAgIHByb21vU3VibWl0QnRuLnByb3AoXCJkaXNhYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZhaWwoKGUpID0+IHtcbiAgICAgICAgICBwcmVzdGFzaG9wLmVtaXQoXCJoYW5kbGVFcnJvclwiLCB7XG4gICAgICAgICAgICBldmVudFR5cGU6IFwidXBkYXRlQ2FydFwiLFxuICAgICAgICAgICAgcmVzcDogZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwcm9tb1N1Ym1pdEJ0bi50ZXh0KFwiQUREXCIpO1xuICAgICAgICAgIHByb21vU3VibWl0QnRuLnByb3AoXCJkaXNhYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyb3BEb3duIHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuZWwub24oJ3Nob3cuYnMuZHJvcGRvd24nLCAoZSwgZWwpID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICAkKGAjJHtlbH1gKS5maW5kKCcuZHJvcGRvd24tbWVudScpLmZpcnN0KCkuc3RvcCh0cnVlLCB0cnVlKVxuICAgICAgICAgIC5zbGlkZURvd24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoZS50YXJnZXQpLmZpbmQoJy5kcm9wZG93bi1tZW51JykuZmlyc3QoKS5zdG9wKHRydWUsIHRydWUpXG4gICAgICAgICAgLnNsaWRlRG93bigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5vbignaGlkZS5icy5kcm9wZG93bicsIChlLCBlbCkgPT4ge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgICQoYCMke2VsfWApLmZpbmQoJy5kcm9wZG93bi1tZW51JykuZmlyc3QoKS5zdG9wKHRydWUsIHRydWUpXG4gICAgICAgICAgLnNsaWRlVXAoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoZS50YXJnZXQpLmZpbmQoJy5kcm9wZG93bi1tZW51JykuZmlyc3QoKS5zdG9wKHRydWUsIHRydWUpXG4gICAgICAgICAgLnNsaWRlVXAoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZWwuZmluZCgnc2VsZWN0LmxpbmsnKS5lYWNoKChpZHgsIGVsKSA9PiB7XG4gICAgICAkKGVsKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybSB7XG4gIGluaXQoKSB7XG4gICAgdGhpcy5wYXJlbnRGb2N1cygpO1xuICAgIHRoaXMudG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KCk7XG4gIH1cblxuICBwYXJlbnRGb2N1cygpIHtcbiAgICAkKCcuanMtY2hpbGQtZm9jdXMnKS5vbignZm9jdXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5qcy1wYXJlbnQtZm9jdXMnKS5hZGRDbGFzcygnZm9jdXMnKTtcbiAgICB9KTtcbiAgICAkKCcuanMtY2hpbGQtZm9jdXMnKS5vbignZm9jdXNvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5qcy1wYXJlbnQtZm9jdXMnKS5yZW1vdmVDbGFzcygnZm9jdXMnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eSgpIHtcbiAgICAkKCdidXR0b25bZGF0YS1hY3Rpb249XCJzaG93LXBhc3N3b3JkXCJdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZWxtID0gJCh0aGlzKS5jbG9zZXN0KCcuaW5wdXQtZ3JvdXAnKS5jaGlsZHJlbignaW5wdXQuanMtdmlzaWJsZS1wYXNzd29yZCcpO1xuXG4gICAgICBpZiAoZWxtLmF0dHIoJ3R5cGUnKSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICBlbG0uYXR0cigndHlwZScsICd0ZXh0Jyk7XG4gICAgICAgICQodGhpcykudGV4dCgkKHRoaXMpLmRhdGEoJ3RleHRIaWRlJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxtLmF0dHIoJ3R5cGUnLCAncGFzc3dvcmQnKTtcbiAgICAgICAgJCh0aGlzKS50ZXh0KCQodGhpcykuZGF0YSgndGV4dFNob3cnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3csIGV4cG9ydHMsIGRlZmluZSAqL1xuXG4hZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnXG5cbiAgICB2YXIgcmUgPSB7XG4gICAgICAgIG5vdF9zdHJpbmc6IC9bXnNdLyxcbiAgICAgICAgbm90X2Jvb2w6IC9bXnRdLyxcbiAgICAgICAgbm90X3R5cGU6IC9bXlRdLyxcbiAgICAgICAgbm90X3ByaW1pdGl2ZTogL1tedl0vLFxuICAgICAgICBudW1iZXI6IC9bZGllZmddLyxcbiAgICAgICAgbnVtZXJpY19hcmc6IC9bYmNkaWVmZ3V4WF0vLFxuICAgICAgICBqc29uOiAvW2pdLyxcbiAgICAgICAgbm90X2pzb246IC9bXmpdLyxcbiAgICAgICAgdGV4dDogL15bXlxceDI1XSsvLFxuICAgICAgICBtb2R1bG86IC9eXFx4MjV7Mn0vLFxuICAgICAgICBwbGFjZWhvbGRlcjogL15cXHgyNSg/OihbMS05XVxcZCopXFwkfFxcKChbXildKylcXCkpPyhcXCspPygwfCdbXiRdKT8oLSk/KFxcZCspPyg/OlxcLihcXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLFxuICAgICAgICBrZXk6IC9eKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGtleV9hY2Nlc3M6IC9eXFwuKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGluZGV4X2FjY2VzczogL15cXFsoXFxkKylcXF0vLFxuICAgICAgICBzaWduOiAvXlsrLV0vXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ByaW50ZihrZXkpIHtcbiAgICAgICAgLy8gYGFyZ3VtZW50c2AgaXMgbm90IGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGZpbmUgZm9yIHRoaXMgY2FsbFxuICAgICAgICByZXR1cm4gc3ByaW50Zl9mb3JtYXQoc3ByaW50Zl9wYXJzZShrZXkpLCBhcmd1bWVudHMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdnNwcmludGYoZm10LCBhcmd2KSB7XG4gICAgICAgIHJldHVybiBzcHJpbnRmLmFwcGx5KG51bGwsIFtmbXRdLmNvbmNhdChhcmd2IHx8IFtdKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmX2Zvcm1hdChwYXJzZV90cmVlLCBhcmd2KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSAxLCB0cmVlX2xlbmd0aCA9IHBhcnNlX3RyZWUubGVuZ3RoLCBhcmcsIG91dHB1dCA9ICcnLCBpLCBrLCBwaCwgcGFkLCBwYWRfY2hhcmFjdGVyLCBwYWRfbGVuZ3RoLCBpc19wb3NpdGl2ZSwgc2lnblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJlZV9sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZV90cmVlW2ldID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBwYXJzZV90cmVlW2ldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGFyc2VfdHJlZVtpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBwaCA9IHBhcnNlX3RyZWVbaV0gLy8gY29udmVuaWVuY2UgcHVycG9zZXMgb25seVxuICAgICAgICAgICAgICAgIGlmIChwaC5rZXlzKSB7IC8vIGtleXdvcmQgYXJndW1lbnRcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltjdXJzb3JdXG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwaC5rZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdbc3ByaW50Zl0gQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBcIiVzXCIgb2YgdW5kZWZpbmVkIHZhbHVlIFwiJXNcIicsIHBoLmtleXNba10sIHBoLmtleXNbay0xXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdbcGgua2V5c1trXV1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwaC5wYXJhbV9ubykgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChleHBsaWNpdClcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltwaC5wYXJhbV9ub11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIHBvc2l0aW9uYWwgYXJndW1lbnQgKGltcGxpY2l0KVxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcisrXVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5ub3RfdHlwZS50ZXN0KHBoLnR5cGUpICYmIHJlLm5vdF9wcmltaXRpdmUudGVzdChwaC50eXBlKSAmJiBhcmcgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5udW1lcmljX2FyZy50ZXN0KHBoLnR5cGUpICYmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyAmJiBpc05hTihhcmcpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNwcmludGYoJ1tzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlVCcsIGFyZykpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzX3Bvc2l0aXZlID0gYXJnID49IDBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBoLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKS50b1N0cmluZygyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2onOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCBwaC53aWR0aCA/IHBhcnNlSW50KHBoLndpZHRoKSA6IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZykudG9FeHBvbmVudGlhbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0ZpeGVkKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gU3RyaW5nKE51bWJlcihhcmcudG9QcmVjaXNpb24ocGgucHJlY2lzaW9uKSkpIDogcGFyc2VGbG9hdChhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoOClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nKGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZyghIWFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKSA+Pj4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmUuanNvbi50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBhcmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS5udW1iZXIudGVzdChwaC50eXBlKSAmJiAoIWlzX3Bvc2l0aXZlIHx8IHBoLnNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gaXNfcG9zaXRpdmUgPyAnKycgOiAnLSdcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy50b1N0cmluZygpLnJlcGxhY2UocmUuc2lnbiwgJycpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcmFjdGVyID0gcGgucGFkX2NoYXIgPyBwaC5wYWRfY2hhciA9PT0gJzAnID8gJzAnIDogcGgucGFkX2NoYXIuY2hhckF0KDEpIDogJyAnXG4gICAgICAgICAgICAgICAgICAgIHBhZF9sZW5ndGggPSBwaC53aWR0aCAtIChzaWduICsgYXJnKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcGFkID0gcGgud2lkdGggPyAocGFkX2xlbmd0aCA+IDAgPyBwYWRfY2hhcmFjdGVyLnJlcGVhdChwYWRfbGVuZ3RoKSA6ICcnKSA6ICcnXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBwaC5hbGlnbiA/IHNpZ24gKyBhcmcgKyBwYWQgOiAocGFkX2NoYXJhY3RlciA9PT0gJzAnID8gc2lnbiArIHBhZCArIGFyZyA6IHBhZCArIHNpZ24gKyBhcmcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICB2YXIgc3ByaW50Zl9jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICAgIGZ1bmN0aW9uIHNwcmludGZfcGFyc2UoZm10KSB7XG4gICAgICAgIGlmIChzcHJpbnRmX2NhY2hlW2ZtdF0pIHtcbiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmX2NhY2hlW2ZtdF1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZm10ID0gZm10LCBtYXRjaCwgcGFyc2VfdHJlZSA9IFtdLCBhcmdfbmFtZXMgPSAwXG4gICAgICAgIHdoaWxlIChfZm10KSB7XG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gcmUudGV4dC5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaChtYXRjaFswXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLm1vZHVsby5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaCgnJScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSByZS5wbGFjZWhvbGRlci5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMVxuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRfbGlzdCA9IFtdLCByZXBsYWNlbWVudF9maWVsZCA9IG1hdGNoWzJdLCBmaWVsZF9tYXRjaCA9IFtdXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXkuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlcGxhY2VtZW50X2ZpZWxkID0gcmVwbGFjZW1lbnRfZmllbGQuc3Vic3RyaW5nKGZpZWxkX21hdGNoWzBdLmxlbmd0aCkpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXlfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmluZGV4X2FjY2Vzcy5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPSBmaWVsZF9saXN0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJnX25hbWVzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9ubzogICAgbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduOiAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcjogICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246ICAgbWF0Y2hbN10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAgbWF0Y2hbOF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXInKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZtdCA9IF9mbXQuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3ByaW50Zl9jYWNoZVtmbXRdID0gcGFyc2VfdHJlZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGV4cG9ydCB0byBlaXRoZXIgYnJvd3NlciBvciBub2RlLmpzXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHNbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgZXhwb3J0c1sndnNwcmludGYnXSA9IHZzcHJpbnRmXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3dbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgd2luZG93Wyd2c3ByaW50ZiddID0gdnNwcmludGZcblxuICAgICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICAgICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgJ3NwcmludGYnOiBzcHJpbnRmLFxuICAgICAgICAgICAgICAgICAgICAndnNwcmludGYnOiB2c3ByaW50ZlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBxdW90ZS1wcm9wcyAqL1xufSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cblxuaW1wb3J0IHtzcHJpbnRmfSBmcm9tICdzcHJpbnRmLWpzJztcblxuY29uc3Qge3Bhc3N3b3JkUG9saWN5OiBQYXNzd29yZFBvbGljeU1hcH0gPSBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzO1xuXG5jb25zdCBQQVNTV09SRF9QT0xJQ1lfRVJST1IgPSAnVGhlIHBhc3N3b3JkIHBvbGljeSBlbGVtZW50cyBhcmUgdW5kZWZpbmVkLic7XG5cbmNvbnN0IGdldFBhc3N3b3JkU3RyZW5ndGhGZWVkYmFjayA9IChcbiAgc3RyZW5ndGgsXG4pID0+IHtcbiAgc3dpdGNoIChzdHJlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiAnYmctZGFuZ2VyJyxcbiAgICAgIH07XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogJ2JnLWRhbmdlcicsXG4gICAgICB9O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sb3I6ICdiZy13YXJuaW5nJyxcbiAgICAgIH07XG5cbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogJ2JnLXN1Y2Nlc3MnLFxuICAgICAgfTtcblxuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiAnYmctc3VjY2VzcycsXG4gICAgICB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXNzd29yZCBzdHJlbmd0aCBpbmRpY2F0b3IuJyk7XG4gIH1cbn07XG5cbmNvbnN0IHdhdGNoUGFzc3dvcmQgPSBhc3luYyAoXG4gIGVsZW1lbnRJbnB1dCxcbiAgZmVlZGJhY2tDb250YWluZXIsXG4gIGhpbnRzLFxuKSA9PiB7XG4gIGNvbnN0IHtwcmVzdGFzaG9wfSA9IHdpbmRvdztcbiAgY29uc3QgcGFzc3dvcmRWYWx1ZSA9IGVsZW1lbnRJbnB1dC52YWx1ZTtcbiAgY29uc3QgZWxlbWVudEljb24gPSBmZWVkYmFja0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLnJlcXVpcmVtZW50U2NvcmVJY29uKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJlc3Rhc2hvcC5jaGVja1Bhc3N3b3JkU2NvcmUocGFzc3dvcmRWYWx1ZSk7XG4gIGNvbnN0IGZlZWRiYWNrID0gZ2V0UGFzc3dvcmRTdHJlbmd0aEZlZWRiYWNrKHJlc3VsdC5zY29yZSk7XG4gIGNvbnN0IHBhc3N3b3JkTGVuZ3RoID0gcGFzc3dvcmRWYWx1ZS5sZW5ndGg7XG4gIGNvbnN0IHBvcG92ZXJDb250ZW50ID0gW107XG5cbiAgJChlbGVtZW50SW5wdXQpLnBvcG92ZXIoJ2Rpc3Bvc2UnKTtcblxuICBmZWVkYmFja0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gcGFzc3dvcmRWYWx1ZSA9PT0gJycgPyAnbm9uZScgOiAnYmxvY2snO1xuXG4gIGlmIChyZXN1bHQuZmVlZGJhY2sud2FybmluZyAhPT0gJycpIHtcbiAgICBpZiAocmVzdWx0LmZlZWRiYWNrLndhcm5pbmcgaW4gaGludHMpIHtcbiAgICAgIHBvcG92ZXJDb250ZW50LnB1c2goaGludHNbcmVzdWx0LmZlZWRiYWNrLndhcm5pbmddKTtcbiAgICB9XG4gIH1cblxuICByZXN1bHQuZmVlZGJhY2suc3VnZ2VzdGlvbnMuZm9yRWFjaCgoc3VnZ2VzdGlvbikgPT4ge1xuICAgIGlmIChzdWdnZXN0aW9uIGluIGhpbnRzKSB7XG4gICAgICBwb3BvdmVyQ29udGVudC5wdXNoKGhpbnRzW3N1Z2dlc3Rpb25dKTtcbiAgICB9XG4gIH0pO1xuXG4gICQoZWxlbWVudElucHV0KS5wb3BvdmVyKHtcbiAgICBodG1sOiB0cnVlLFxuICAgIHBsYWNlbWVudDogJ3RvcCcsXG4gICAgY29udGVudDogcG9wb3ZlckNvbnRlbnQuam9pbignPGJyLz4nKSxcbiAgfSkucG9wb3Zlcignc2hvdycpO1xuXG4gIGNvbnN0IHBhc3N3b3JkTGVuZ3RoVmFsaWQgPSBwYXNzd29yZExlbmd0aCA+PSBwYXJzZUludChlbGVtZW50SW5wdXQuZGF0YXNldC5taW5sZW5ndGgsIDEwKVxuICAgICYmIHBhc3N3b3JkTGVuZ3RoIDw9IHBhcnNlSW50KGVsZW1lbnRJbnB1dC5kYXRhc2V0Lm1heGxlbmd0aCwgMTApO1xuICBjb25zdCBwYXNzd29yZFNjb3JlVmFsaWQgPSBwYXJzZUludChlbGVtZW50SW5wdXQuZGF0YXNldC5taW5zY29yZSwgMTApIDw9IHJlc3VsdC5zY29yZTtcblxuICBmZWVkYmFja0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLnJlcXVpcmVtZW50TGVuZ3RoSWNvbikuY2xhc3NMaXN0LnRvZ2dsZShcbiAgICAndGV4dC1zdWNjZXNzJyxcbiAgICBwYXNzd29yZExlbmd0aFZhbGlkLFxuICApO1xuXG4gIGVsZW1lbnRJY29uLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgJ3RleHQtc3VjY2VzcycsXG4gICAgcGFzc3dvcmRTY29yZVZhbGlkLFxuICApO1xuXG4gIC8vIENoYW5nZSBpbnB1dCBib3JkZXIgY29sb3IgZGVwZW5kaW5nIG9uIHRoZSB2YWxpZGl0eVxuICBlbGVtZW50SW5wdXRcbiAgICAuY2xhc3NMaXN0LnJlbW92ZSgnYm9yZGVyLXN1Y2Nlc3MnLCAnYm9yZGVyLWRhbmdlcicpO1xuICBlbGVtZW50SW5wdXRcbiAgICAuY2xhc3NMaXN0LmFkZChwYXNzd29yZFNjb3JlVmFsaWQgJiYgcGFzc3dvcmRMZW5ndGhWYWxpZCA/ICdib3JkZXItc3VjY2VzcycgOiAnYm9yZGVyLWRhbmdlcicpO1xuICBlbGVtZW50SW5wdXRcbiAgICAuY2xhc3NMaXN0LmFkZCgnZm9ybS1jb250cm9sJywgJ2JvcmRlcicpO1xuXG4gIGNvbnN0IHBlcmNlbnRhZ2UgPSAocmVzdWx0LnNjb3JlICogMjApICsgMjA7XG4gIGNvbnN0IHByb2dyZXNzQmFyID0gZmVlZGJhY2tDb250YWluZXIucXVlcnlTZWxlY3RvcihQYXNzd29yZFBvbGljeU1hcC5wcm9ncmVzc0Jhcik7XG5cbiAgLy8gaW5jcmVhc2UgYW5kIGRlY3JlYXNlIHByb2dyZXNzIGJhclxuICBpZiAocHJvZ3Jlc3NCYXIpIHtcbiAgICBwcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9IGAke3BlcmNlbnRhZ2V9JWA7XG4gICAgcHJvZ3Jlc3NCYXIuY2xhc3NMaXN0LnJlbW92ZSgnYmctc3VjY2VzcycsICdiZy1kYW5nZXInLCAnYmctd2FybmluZycpO1xuICAgIHByb2dyZXNzQmFyLmNsYXNzTGlzdC5hZGQoZmVlZGJhY2suY29sb3IpO1xuICB9XG59O1xuXG4vLyBOb3QgdGVzdGFibGUgYmVjYXVzZSBpdCBtYW5pcHVsYXRlcyBTVkcgZWxlbWVudHMsIHVuc3VwcG9ydGVkIGJ5IEpTRG9tXG5jb25zdCB1c2VQYXNzd29yZFBvbGljeSA9IChzZWxlY3RvcikgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgaW5wdXRDb2x1bW4gPSBlbGVtZW50Py5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLmlucHV0Q29sdW1uKTtcbiAgICBjb25zdCBlbGVtZW50SW5wdXQgPSBlbGVtZW50Py5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGZlZWRiYWNrVGVtcGxhdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLnRlbXBsYXRlKTtcbiAgICBsZXQgZmVlZGJhY2tDb250YWluZXI7XG5cbiAgICBpZiAoZmVlZGJhY2tUZW1wbGF0ZSAmJiBlbGVtZW50ICYmIGlucHV0Q29sdW1uICYmIGVsZW1lbnRJbnB1dCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IGZlZWRiYWNrVGVtcGxhdGUuaW5uZXJIVE1MO1xuICAgICAgaW5wdXRDb2x1bW4uYXBwZW5kKHRlbXBsYXRlRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0NvbnRhaW5lciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihQYXNzd29yZFBvbGljeU1hcC5jb250YWluZXIpO1xuXG4gICAgICBpZiAoZmVlZGJhY2tDb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgaGludEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLmhpbnQpO1xuXG4gICAgICAgIGlmIChoaW50RWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGhpbnRzID0gSlNPTi5wYXJzZShoaW50RWxlbWVudC5pbm5lckhUTUwpO1xuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICBjb25zdCBwYXNzd29yZFJlcXVpcmVtZW50c0xlbmd0aCA9IGZlZWRiYWNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoUGFzc3dvcmRQb2xpY3lNYXAucmVxdWlyZW1lbnRMZW5ndGgpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgY29uc3QgcGFzc3dvcmRSZXF1aXJlbWVudHNTY29yZSA9IGZlZWRiYWNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoUGFzc3dvcmRQb2xpY3lNYXAucmVxdWlyZW1lbnRTY29yZSk7XG4gICAgICAgICAgY29uc3QgcGFzc3dvcmRMZW5ndGhUZXh0ID0gcGFzc3dvcmRSZXF1aXJlbWVudHNMZW5ndGg/LnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKTtcbiAgICAgICAgICBjb25zdCBwYXNzd29yZFJlcXVpcmVtZW50c1RleHQgPSBwYXNzd29yZFJlcXVpcmVtZW50c1Njb3JlPy5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XG5cbiAgICAgICAgICBpZiAocGFzc3dvcmRMZW5ndGhUZXh0ICYmIHBhc3N3b3JkUmVxdWlyZW1lbnRzTGVuZ3RoICYmIHBhc3N3b3JkUmVxdWlyZW1lbnRzTGVuZ3RoLmRhdGFzZXQudHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHBhc3N3b3JkTGVuZ3RoVGV4dC5pbm5lclRleHQgPSBzcHJpbnRmKFxuICAgICAgICAgICAgICBwYXNzd29yZFJlcXVpcmVtZW50c0xlbmd0aC5kYXRhc2V0LnRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgICBlbGVtZW50SW5wdXQuZGF0YXNldC5taW5sZW5ndGgsXG4gICAgICAgICAgICAgIGVsZW1lbnRJbnB1dC5kYXRhc2V0Lm1heGxlbmd0aCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhc3N3b3JkUmVxdWlyZW1lbnRzVGV4dCAmJiBwYXNzd29yZFJlcXVpcmVtZW50c1Njb3JlICYmIHBhc3N3b3JkUmVxdWlyZW1lbnRzU2NvcmUuZGF0YXNldC50cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgcGFzc3dvcmRSZXF1aXJlbWVudHNUZXh0LmlubmVyVGV4dCA9IHNwcmludGYoXG4gICAgICAgICAgICAgIHBhc3N3b3JkUmVxdWlyZW1lbnRzU2NvcmUuZGF0YXNldC50cmFuc2xhdGlvbixcbiAgICAgICAgICAgICAgaGludHNbZWxlbWVudElucHV0LmRhdGFzZXQubWluc2NvcmVdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgIGVsZW1lbnRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsICgpID0+IHdhdGNoUGFzc3dvcmQoZWxlbWVudElucHV0LCBmZWVkYmFja0NvbnRhaW5lciwgaGludHMpKTtcbiAgICAgICAgICBlbGVtZW50SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgICQoZWxlbWVudElucHV0KS5wb3BvdmVyKCdkaXNwb3NlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiBuZXcgRXJyb3IoUEFTU1dPUkRfUE9MSUNZX0VSUk9SKSxcbiAgICB9O1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVBhc3N3b3JkUG9saWN5O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5pbXBvcnQgRHJvcERvd24gZnJvbSAnLi9kcm9wLWRvd24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb3BNZW51IGV4dGVuZHMgRHJvcERvd24ge1xuICBpbml0KCkge1xuICAgIGxldCBlbG10Q2xhc3M7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5lbC5maW5kKCdsaScpLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCAoZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZWwucGFyZW50KCkuaGFzQ2xhc3MoJ21vYmlsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXRDbGFzcyA9ICQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCdjbGFzcycpO1xuXG4gICAgICBpZiAoZWxtdENsYXNzICE9PSBjdXJyZW50VGFyZ2V0Q2xhc3MpIHtcbiAgICAgICAgY29uc3QgY2xhc3Nlc1NlbGVjdGVkID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gICAgICAgICAgLmNhbGwoZS5jdXJyZW50VGFyZ2V0LmNsYXNzTGlzdClcbiAgICAgICAgICAubWFwKChlbGVtKSA9PiAodHlwZW9mIGVsZW0gPT09ICdzdHJpbmcnID8gYC4ke2VsZW19YCA6IGZhbHNlKSk7XG5cbiAgICAgICAgZWxtdENsYXNzID0gY2xhc3Nlc1NlbGVjdGVkLmpvaW4oJycpO1xuXG4gICAgICAgIGlmIChlbG10Q2xhc3MgJiYgJChlLnRhcmdldCkuZGF0YSgnZGVwdGgnKSA9PT0gMCkge1xuICAgICAgICAgICQoYCR7ZWxtdENsYXNzfSAuanMtc3ViLW1lbnVgKS5jc3Moe1xuICAgICAgICAgICAgdG9wOiAkKGAke2VsbXRDbGFzc31gKS5oZWlnaHQoKSArICQoYCR7ZWxtdENsYXNzfWApLnBvc2l0aW9uKCkudG9wLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgJCgnI21lbnUtaWNvbicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICQoJyNtb2JpbGVfdG9wX21lbnVfd3JhcHBlcicpLnRvZ2dsZSgpO1xuICAgICAgc2VsZi50b2dnbGVNb2JpbGVNZW51KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAodGhpcy5lbC5wYXJlbnQoKS5oYXNDbGFzcygnbW9iaWxlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIHByZXN0YXNob3Aub24oJ3Jlc3BvbnNpdmUgdXBkYXRlJywgKCkgPT4ge1xuICAgICAgJCgnLmpzLXN1Yi1tZW51JykucmVtb3ZlQXR0cignc3R5bGUnKTtcbiAgICAgIHNlbGYudG9nZ2xlTW9iaWxlTWVudSgpO1xuICAgIH0pO1xuICAgIHN1cGVyLmluaXQoKTtcbiAgfVxuXG4gIHRvZ2dsZU1vYmlsZU1lbnUoKSB7XG4gICAgJCgnI2hlYWRlcicpLnRvZ2dsZUNsYXNzKCdpcy1vcGVuJyk7XG4gICAgaWYgKCQoJyNtb2JpbGVfdG9wX21lbnVfd3JhcHBlcicpLmlzKCc6dmlzaWJsZScpKSB7XG4gICAgICAkKCcjbm90aWZpY2F0aW9ucywgI3dyYXBwZXIsICNmb290ZXInKS5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJyNub3RpZmljYXRpb25zLCAjd3JhcHBlciwgI2Zvb3RlcicpLnNob3coKTtcbiAgICB9XG4gIH1cbn1cbiIsIlwiZnVuY3Rpb25cIiE9dHlwZW9mIE9iamVjdC5jcmVhdGUmJihPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oKXt9cmV0dXJuIG8ucHJvdG90eXBlPXQsbmV3IG99KSxmdW5jdGlvbih0LG8saSxzKXtcInVzZSBzdHJpY3RcIjt2YXIgbj17X3Bvc2l0aW9uQ2xhc3NlczpbXCJib3R0b20tbGVmdFwiLFwiYm90dG9tLXJpZ2h0XCIsXCJ0b3AtcmlnaHRcIixcInRvcC1sZWZ0XCIsXCJib3R0b20tY2VudGVyXCIsXCJ0b3AtY2VudGVyXCIsXCJtaWQtY2VudGVyXCJdLF9kZWZhdWx0SWNvbnM6W1wic3VjY2Vzc1wiLFwiZXJyb3JcIixcImluZm9cIixcIndhcm5pbmdcIl0saW5pdDpmdW5jdGlvbihvLGkpe3RoaXMucHJlcGFyZU9wdGlvbnMobyx0LnRvYXN0Lm9wdGlvbnMpLHRoaXMucHJvY2VzcygpfSxwcmVwYXJlT3B0aW9uczpmdW5jdGlvbihvLGkpe3ZhciBzPXt9O1wic3RyaW5nXCI9PXR5cGVvZiBvfHxvIGluc3RhbmNlb2YgQXJyYXk/cy50ZXh0PW86cz1vLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxpLHMpfSxwcm9jZXNzOmZ1bmN0aW9uKCl7dGhpcy5zZXR1cCgpLHRoaXMuYWRkVG9Eb20oKSx0aGlzLnBvc2l0aW9uKCksdGhpcy5iaW5kVG9hc3QoKSx0aGlzLmFuaW1hdGUoKX0sc2V0dXA6ZnVuY3Rpb24oKXt2YXIgbz1cIlwiO2lmKHRoaXMuX3RvYXN0RWw9dGhpcy5fdG9hc3RFbHx8dChcIjxkaXY+PC9kaXY+XCIse1wiY2xhc3NcIjpcImpxLXRvYXN0LXNpbmdsZVwifSksbys9JzxzcGFuIGNsYXNzPVwianEtdG9hc3QtbG9hZGVyXCI+PC9zcGFuPicsdGhpcy5vcHRpb25zLmFsbG93VG9hc3RDbG9zZSYmKG8rPSc8c3BhbiBjbGFzcz1cImNsb3NlLWpxLXRvYXN0LXNpbmdsZVwiPiZ0aW1lczs8L3NwYW4+JyksdGhpcy5vcHRpb25zLnRleHQgaW5zdGFuY2VvZiBBcnJheSl7dGhpcy5vcHRpb25zLmhlYWRpbmcmJihvKz0nPGgyIGNsYXNzPVwianEtdG9hc3QtaGVhZGluZ1wiPicrdGhpcy5vcHRpb25zLmhlYWRpbmcrXCI8L2gyPlwiKSxvKz0nPHVsIGNsYXNzPVwianEtdG9hc3QtdWxcIj4nO2Zvcih2YXIgaT0wO2k8dGhpcy5vcHRpb25zLnRleHQubGVuZ3RoO2krKylvKz0nPGxpIGNsYXNzPVwianEtdG9hc3QtbGlcIiBpZD1cImpxLXRvYXN0LWl0ZW0tJytpKydcIj4nK3RoaXMub3B0aW9ucy50ZXh0W2ldK1wiPC9saT5cIjtvKz1cIjwvdWw+XCJ9ZWxzZSB0aGlzLm9wdGlvbnMuaGVhZGluZyYmKG8rPSc8aDIgY2xhc3M9XCJqcS10b2FzdC1oZWFkaW5nXCI+Jyt0aGlzLm9wdGlvbnMuaGVhZGluZytcIjwvaDI+XCIpLG8rPXRoaXMub3B0aW9ucy50ZXh0O3RoaXMuX3RvYXN0RWwuaHRtbChvKSx0aGlzLm9wdGlvbnMuYmdDb2xvciE9PSExJiZ0aGlzLl90b2FzdEVsLmNzcyhcImJhY2tncm91bmQtY29sb3JcIix0aGlzLm9wdGlvbnMuYmdDb2xvciksdGhpcy5vcHRpb25zLnRleHRDb2xvciE9PSExJiZ0aGlzLl90b2FzdEVsLmNzcyhcImNvbG9yXCIsdGhpcy5vcHRpb25zLnRleHRDb2xvciksdGhpcy5vcHRpb25zLnRleHRBbGlnbiYmdGhpcy5fdG9hc3RFbC5jc3MoXCJ0ZXh0LWFsaWduXCIsdGhpcy5vcHRpb25zLnRleHRBbGlnbiksdGhpcy5vcHRpb25zLmljb24hPT0hMSYmKHRoaXMuX3RvYXN0RWwuYWRkQ2xhc3MoXCJqcS1oYXMtaWNvblwiKSwtMSE9PXQuaW5BcnJheSh0aGlzLm9wdGlvbnMuaWNvbix0aGlzLl9kZWZhdWx0SWNvbnMpJiZ0aGlzLl90b2FzdEVsLmFkZENsYXNzKFwianEtaWNvbi1cIit0aGlzLm9wdGlvbnMuaWNvbikpLHRoaXMub3B0aW9uc1tcImNsYXNzXCJdIT09ITEmJnRoaXMuX3RvYXN0RWwuYWRkQ2xhc3ModGhpcy5vcHRpb25zW1wiY2xhc3NcIl0pfSxwb3NpdGlvbjpmdW5jdGlvbigpe1wic3RyaW5nXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMucG9zaXRpb24mJi0xIT09dC5pbkFycmF5KHRoaXMub3B0aW9ucy5wb3NpdGlvbix0aGlzLl9wb3NpdGlvbkNsYXNzZXMpP1wiYm90dG9tLWNlbnRlclwiPT09dGhpcy5vcHRpb25zLnBvc2l0aW9uP3RoaXMuX2NvbnRhaW5lci5jc3Moe2xlZnQ6dChvKS5vdXRlcldpZHRoKCkvMi10aGlzLl9jb250YWluZXIub3V0ZXJXaWR0aCgpLzIsYm90dG9tOjIwfSk6XCJ0b3AtY2VudGVyXCI9PT10aGlzLm9wdGlvbnMucG9zaXRpb24/dGhpcy5fY29udGFpbmVyLmNzcyh7bGVmdDp0KG8pLm91dGVyV2lkdGgoKS8yLXRoaXMuX2NvbnRhaW5lci5vdXRlcldpZHRoKCkvMix0b3A6MjB9KTpcIm1pZC1jZW50ZXJcIj09PXRoaXMub3B0aW9ucy5wb3NpdGlvbj90aGlzLl9jb250YWluZXIuY3NzKHtsZWZ0OnQobykub3V0ZXJXaWR0aCgpLzItdGhpcy5fY29udGFpbmVyLm91dGVyV2lkdGgoKS8yLHRvcDp0KG8pLm91dGVySGVpZ2h0KCkvMi10aGlzLl9jb250YWluZXIub3V0ZXJIZWlnaHQoKS8yfSk6dGhpcy5fY29udGFpbmVyLmFkZENsYXNzKHRoaXMub3B0aW9ucy5wb3NpdGlvbik6XCJvYmplY3RcIj09dHlwZW9mIHRoaXMub3B0aW9ucy5wb3NpdGlvbj90aGlzLl9jb250YWluZXIuY3NzKHt0b3A6dGhpcy5vcHRpb25zLnBvc2l0aW9uLnRvcD90aGlzLm9wdGlvbnMucG9zaXRpb24udG9wOlwiYXV0b1wiLGJvdHRvbTp0aGlzLm9wdGlvbnMucG9zaXRpb24uYm90dG9tP3RoaXMub3B0aW9ucy5wb3NpdGlvbi5ib3R0b206XCJhdXRvXCIsbGVmdDp0aGlzLm9wdGlvbnMucG9zaXRpb24ubGVmdD90aGlzLm9wdGlvbnMucG9zaXRpb24ubGVmdDpcImF1dG9cIixyaWdodDp0aGlzLm9wdGlvbnMucG9zaXRpb24ucmlnaHQ/dGhpcy5vcHRpb25zLnBvc2l0aW9uLnJpZ2h0OlwiYXV0b1wifSk6dGhpcy5fY29udGFpbmVyLmFkZENsYXNzKFwiYm90dG9tLWxlZnRcIil9LGJpbmRUb2FzdDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fdG9hc3RFbC5vbihcImFmdGVyU2hvd25cIixmdW5jdGlvbigpe3QucHJvY2Vzc0xvYWRlcigpfSksdGhpcy5fdG9hc3RFbC5maW5kKFwiLmNsb3NlLWpxLXRvYXN0LXNpbmdsZVwiKS5vbihcImNsaWNrXCIsZnVuY3Rpb24obyl7by5wcmV2ZW50RGVmYXVsdCgpLFwiZmFkZVwiPT09dC5vcHRpb25zLnNob3dIaWRlVHJhbnNpdGlvbj8odC5fdG9hc3RFbC50cmlnZ2VyKFwiYmVmb3JlSGlkZVwiKSx0Ll90b2FzdEVsLmZhZGVPdXQoZnVuY3Rpb24oKXt0Ll90b2FzdEVsLnRyaWdnZXIoXCJhZnRlckhpZGRlblwiKX0pKTpcInNsaWRlXCI9PT10Lm9wdGlvbnMuc2hvd0hpZGVUcmFuc2l0aW9uPyh0Ll90b2FzdEVsLnRyaWdnZXIoXCJiZWZvcmVIaWRlXCIpLHQuX3RvYXN0RWwuc2xpZGVVcChmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVySGlkZGVuXCIpfSkpOih0Ll90b2FzdEVsLnRyaWdnZXIoXCJiZWZvcmVIaWRlXCIpLHQuX3RvYXN0RWwuaGlkZShmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVySGlkZGVuXCIpfSkpfSksXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmJlZm9yZVNob3cmJnRoaXMuX3RvYXN0RWwub24oXCJiZWZvcmVTaG93XCIsZnVuY3Rpb24oKXt0Lm9wdGlvbnMuYmVmb3JlU2hvdygpfSksXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmFmdGVyU2hvd24mJnRoaXMuX3RvYXN0RWwub24oXCJhZnRlclNob3duXCIsZnVuY3Rpb24oKXt0Lm9wdGlvbnMuYWZ0ZXJTaG93bigpfSksXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmJlZm9yZUhpZGUmJnRoaXMuX3RvYXN0RWwub24oXCJiZWZvcmVIaWRlXCIsZnVuY3Rpb24oKXt0Lm9wdGlvbnMuYmVmb3JlSGlkZSgpfSksXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmFmdGVySGlkZGVuJiZ0aGlzLl90b2FzdEVsLm9uKFwiYWZ0ZXJIaWRkZW5cIixmdW5jdGlvbigpe3Qub3B0aW9ucy5hZnRlckhpZGRlbigpfSl9LGFkZFRvRG9tOmZ1bmN0aW9uKCl7dmFyIG89dChcIi5qcS10b2FzdC13cmFwXCIpO2lmKDA9PT1vLmxlbmd0aD8obz10KFwiPGRpdj48L2Rpdj5cIix7XCJjbGFzc1wiOlwianEtdG9hc3Qtd3JhcFwifSksdChcImJvZHlcIikuYXBwZW5kKG8pKTooIXRoaXMub3B0aW9ucy5zdGFja3x8aXNOYU4ocGFyc2VJbnQodGhpcy5vcHRpb25zLnN0YWNrLDEwKSkpJiZvLmVtcHR5KCksby5maW5kKFwiLmpxLXRvYXN0LXNpbmdsZTpoaWRkZW5cIikucmVtb3ZlKCksby5hcHBlbmQodGhpcy5fdG9hc3RFbCksdGhpcy5vcHRpb25zLnN0YWNrJiYhaXNOYU4ocGFyc2VJbnQodGhpcy5vcHRpb25zLnN0YWNrKSwxMCkpe3ZhciBpPW8uZmluZChcIi5qcS10b2FzdC1zaW5nbGVcIikubGVuZ3RoLHM9aS10aGlzLm9wdGlvbnMuc3RhY2s7cz4wJiZ0KFwiLmpxLXRvYXN0LXdyYXBcIikuZmluZChcIi5qcS10b2FzdC1zaW5nbGVcIikuc2xpY2UoMCxzKS5yZW1vdmUoKX10aGlzLl9jb250YWluZXI9b30sY2FuQXV0b0hpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmhpZGVBZnRlciE9PSExJiYhaXNOYU4ocGFyc2VJbnQodGhpcy5vcHRpb25zLmhpZGVBZnRlciwxMCkpfSxwcm9jZXNzTG9hZGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FuQXV0b0hpZGUoKXx8dGhpcy5vcHRpb25zLmxvYWRlcj09PSExKXJldHVybiExO3ZhciB0PXRoaXMuX3RvYXN0RWwuZmluZChcIi5qcS10b2FzdC1sb2FkZXJcIiksbz0odGhpcy5vcHRpb25zLmhpZGVBZnRlci00MDApLzFlMytcInNcIixpPXRoaXMub3B0aW9ucy5sb2FkZXJCZyxzPXQuYXR0cihcInN0eWxlXCIpfHxcIlwiO3M9cy5zdWJzdHJpbmcoMCxzLmluZGV4T2YoXCItd2Via2l0LXRyYW5zaXRpb25cIikpLHMrPVwiLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCBcIitvK1wiIGVhc2UtaW47ICAgICAgICAgICAgICAgICAgICAgICAtby10cmFuc2l0aW9uOiB3aWR0aCBcIitvK1wiIGVhc2UtaW47ICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCBcIitvK1wiIGVhc2UtaW47ICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBcIitpK1wiO1wiLHQuYXR0cihcInN0eWxlXCIscykuYWRkQ2xhc3MoXCJqcS10b2FzdC1sb2FkZWRcIil9LGFuaW1hdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuX3RvYXN0RWwuaGlkZSgpLHRoaXMuX3RvYXN0RWwudHJpZ2dlcihcImJlZm9yZVNob3dcIiksXCJmYWRlXCI9PT10aGlzLm9wdGlvbnMuc2hvd0hpZGVUcmFuc2l0aW9uLnRvTG93ZXJDYXNlKCk/dGhpcy5fdG9hc3RFbC5mYWRlSW4oZnVuY3Rpb24oKXt0Ll90b2FzdEVsLnRyaWdnZXIoXCJhZnRlclNob3duXCIpfSk6XCJzbGlkZVwiPT09dGhpcy5vcHRpb25zLnNob3dIaWRlVHJhbnNpdGlvbi50b0xvd2VyQ2FzZSgpP3RoaXMuX3RvYXN0RWwuc2xpZGVEb3duKGZ1bmN0aW9uKCl7dC5fdG9hc3RFbC50cmlnZ2VyKFwiYWZ0ZXJTaG93blwiKX0pOnRoaXMuX3RvYXN0RWwuc2hvdyhmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVyU2hvd25cIil9KSx0aGlzLmNhbkF1dG9IaWRlKCkpe3ZhciB0PXRoaXM7by5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XCJmYWRlXCI9PT10Lm9wdGlvbnMuc2hvd0hpZGVUcmFuc2l0aW9uLnRvTG93ZXJDYXNlKCk/KHQuX3RvYXN0RWwudHJpZ2dlcihcImJlZm9yZUhpZGVcIiksdC5fdG9hc3RFbC5mYWRlT3V0KGZ1bmN0aW9uKCl7dC5fdG9hc3RFbC50cmlnZ2VyKFwiYWZ0ZXJIaWRkZW5cIil9KSk6XCJzbGlkZVwiPT09dC5vcHRpb25zLnNob3dIaWRlVHJhbnNpdGlvbi50b0xvd2VyQ2FzZSgpPyh0Ll90b2FzdEVsLnRyaWdnZXIoXCJiZWZvcmVIaWRlXCIpLHQuX3RvYXN0RWwuc2xpZGVVcChmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVySGlkZGVuXCIpfSkpOih0Ll90b2FzdEVsLnRyaWdnZXIoXCJiZWZvcmVIaWRlXCIpLHQuX3RvYXN0RWwuaGlkZShmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVySGlkZGVuXCIpfSkpfSx0aGlzLm9wdGlvbnMuaGlkZUFmdGVyKX19LHJlc2V0OmZ1bmN0aW9uKG8pe1wiYWxsXCI9PT1vP3QoXCIuanEtdG9hc3Qtd3JhcFwiKS5yZW1vdmUoKTp0aGlzLl90b2FzdEVsLnJlbW92ZSgpfSx1cGRhdGU6ZnVuY3Rpb24odCl7dGhpcy5wcmVwYXJlT3B0aW9ucyh0LHRoaXMub3B0aW9ucyksdGhpcy5zZXR1cCgpLHRoaXMuYmluZFRvYXN0KCl9fTt0LnRvYXN0PWZ1bmN0aW9uKHQpe3ZhciBvPU9iamVjdC5jcmVhdGUobik7cmV0dXJuIG8uaW5pdCh0LHRoaXMpLHtyZXNldDpmdW5jdGlvbih0KXtvLnJlc2V0KHQpfSx1cGRhdGU6ZnVuY3Rpb24odCl7by51cGRhdGUodCl9fX0sdC50b2FzdC5vcHRpb25zPXt0ZXh0OlwiXCIsaGVhZGluZzpcIlwiLHNob3dIaWRlVHJhbnNpdGlvbjpcImZhZGVcIixhbGxvd1RvYXN0Q2xvc2U6ITAsaGlkZUFmdGVyOjNlMyxsb2FkZXI6ITAsbG9hZGVyQmc6XCIjOUVDNjAwXCIsc3RhY2s6NSxwb3NpdGlvbjpcImJvdHRvbS1sZWZ0XCIsYmdDb2xvcjohMSx0ZXh0Q29sb3I6ITEsdGV4dEFsaWduOlwibGVmdFwiLGljb246ITEsYmVmb3JlU2hvdzpmdW5jdGlvbigpe30sYWZ0ZXJTaG93bjpmdW5jdGlvbigpe30sYmVmb3JlSGlkZTpmdW5jdGlvbigpe30sYWZ0ZXJIaWRkZW46ZnVuY3Rpb24oKXt9fX0oalF1ZXJ5LHdpbmRvdyxkb2N1bWVudCk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tICdwcmVzdGFzaG9wJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJ2pxdWVyeS10b2FzdC1wbHVnaW4nO1xuaW1wb3J0ICdqcXVlcnktdG9hc3QtcGx1Z2luL2Rpc3QvanF1ZXJ5LnRvYXN0Lm1pbi5jc3MnO1xuXG4kKCgpID0+IHtcbiAgcHJlc3Rhc2hvcC5ibG9ja2NhcnQgPSBwcmVzdGFzaG9wLmJsb2NrY2FydCB8fCB7fTtcbiAgY29uc3Qgc2hvd01vZGFsID0gcHJlc3Rhc2hvcC5ibG9ja2NhcnQuc2hvd01vZGFsXG4gICAgfHwgZnVuY3Rpb24gKG1vZGFsKSB7XG4gICAgICBjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcbiAgICAgICRib2R5LmFwcGVuZChtb2RhbCk7XG4gICAgICAkKCcjYmxvY2tjYXJ0LW1vZGFsJykubW9kYWwoKTtcbiAgICAgIGNvbnNvbGUubG9nKCdjYWxsZWQnKTtcbiAgICAgICRib2R5Lm9uZSgnY2xpY2snLCAnI2Jsb2NrY2FydC1tb2RhbCcsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmlkID09PSAnYmxvY2tjYXJ0LW1vZGFsJykge1xuICAgICAgICAgICQubW9kYWwuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgcHJlc3Rhc2hvcC5vbigndXBkYXRlQ2FydCcsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHJlZnJlc2hVUkwgPSAkKCcuYmxvY2tjYXJ0JykuZGF0YSgncmVmcmVzaC11cmwnKTtcbiAgICBsZXQgcmVxdWVzdERhdGEgPSB7fTtcblxuICAgIGlmIChcbiAgICAgIGV2ZW50XG4gICAgICAmJiBldmVudC5yZWFzb25cbiAgICAgICYmIHR5cGVvZiBldmVudC5yZXNwICE9PSAndW5kZWZpbmVkJ1xuICAgICAgJiYgIWV2ZW50LnJlc3AuaGFzRXJyb3JcbiAgICApIHtcbiAgICAgIHJlcXVlc3REYXRhID0ge1xuICAgICAgICBpZF9jdXN0b21pemF0aW9uOiBldmVudC5yZWFzb24uaWRDdXN0b21pemF0aW9uLFxuICAgICAgICBpZF9wcm9kdWN0X2F0dHJpYnV0ZTogZXZlbnQucmVhc29uLmlkUHJvZHVjdEF0dHJpYnV0ZSxcbiAgICAgICAgaWRfcHJvZHVjdDogZXZlbnQucmVhc29uLmlkUHJvZHVjdCxcbiAgICAgICAgYWN0aW9uOiBldmVudC5yZWFzb24ubGlua0FjdGlvbixcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChldmVudCAmJiBldmVudC5yZXNwICYmIGV2ZW50LnJlc3AuaGFzRXJyb3IpIHtcbiAgICAgIHByZXN0YXNob3AuZW1pdCgnc2hvd0Vycm9yTmV4dFRvQWRkdG9DYXJ0QnV0dG9uJywge1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGV2ZW50LnJlc3AuZXJyb3JzLmpvaW4oJzxici8+JyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgJC5wb3N0KHJlZnJlc2hVUkwsIHJlcXVlc3REYXRhKVxuICAgICAgLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgJCgnLmJsb2NrY2FydCcpLnJlcGxhY2VXaXRoKCQocmVzcC5wcmV2aWV3KS5maW5kKCcuYmxvY2tjYXJ0JykpO1xuICAgICAgICBpZiAocmVzcC5tb2RhbCkge1xuICAgICAgICAgICQudG9hc3Qoe1xuICAgICAgICAgICAgaGVhZGluZzogJ0FkZGVkIHRvIENhcnQnLFxuICAgICAgICAgICAgdGV4dDogJ1lvdSBjYW4gY2hlY2tvdXQgb3IgY29udGludWUgc2hvcHBpbmcuJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHRvcDogJzEwMHB4JyxcbiAgICAgICAgICAgICAgcmlnaHQ6ICcyMHB4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiZ0NvbG9yOiAnI2ZmZmZmZicsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6ICcjMTExODI3JyxcbiAgICAgICAgICAgIGxvYWRlckJnOiAnIzE3MjU1NCcsXG4gICAgICAgICAgICBjbGFzczogJ3JvdW5kZWQtbm9uZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5mYWlsKChyZXNwKSA9PiB7XG4gICAgICAgIHByZXN0YXNob3AuZW1pdCgnaGFuZGxlRXJyb3InLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAndXBkYXRlU2hvcHBpbmdDYXJ0JyxcbiAgICAgICAgICByZXNwLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9KTtcbn0pO1xuIiwiLyoqXG4gKiBqUXVlcnkub2ZmY2FudmFzIHYzLjQuNyAtIEVhc3kgdG8gdXNlIGpRdWVyeSBvZmZjYW52YXMgcGx1Z2luLlxuICogQ29weXJpZ2h0IDIwMTYgTGFycyBHcmF1Ym5lciAtIGh0dHA6Ly9sZ3JhdWJuZXIuZ2l0aHViLmlvL2pxdWVyeS1vZmZjYW52YXMvXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQscyl7cmV0dXJuIHZvaWQgMD09PXMmJihzPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/cmVxdWlyZShcImpxdWVyeVwiKTpyZXF1aXJlKFwianF1ZXJ5XCIpKHQpKSxlKHMpLHN9OlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5IFwiXSxlKTplKGpRdWVyeSl9KHRoaXMsZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZSh0LGUscyl7dmFyIGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxvPWFyZ3VtZW50cyxoPWZ1bmN0aW9uKCl7aT1udWxsLHN8fHQuYXBwbHkobixvKX0sYT1zJiYhaTtjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KGgsZSksYSYmdC5hcHBseShuLG8pfX1mdW5jdGlvbiBzKGUscyl7dmFyIG4sbyxoPXQoZSkuZGF0YSgpO3RoaXMuJGVsPXQoZSk7Zm9yKG4gaW4gaCloLmhhc093blByb3BlcnR5KG4pJiYvXm9mZmNhbnZhc1tBLVpdKy8udGVzdChuKSYmKG89bltpLmxlbmd0aF0udG9Mb3dlckNhc2UoKStuLnN1YnN0cihpLmxlbmd0aCsxKSxoW29dPWhbbl0pO3RoaXMuc2V0dGluZ3M9dC5leHRlbmQoITAse30sdC5mbltpXS5kZWZhdWx0cyxzLGgpLHRoaXMubmFtZT1pLHRoaXMuJGVsLmRhdGEodGhpcy5uYW1lK1wiLm9wdHNcIix0aGlzLnNldHRpbmdzKSx0aGlzLmluaXQoKX12YXIgaT1cIm9mZmNhbnZhc1wiO3QuZXh0ZW5kKHMucHJvdG90eXBlLHtzZXRIZWlnaHRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy4kb3V0ZXJXcmFwcGVyLmhlaWdodCgpO3RoaXMuJGVsLmRhdGEodGhpcy5uYW1lK1wiLm9wdHNcIikmJih0aGlzLiRlbGVtZW50LmNzcyhcImhlaWdodFwiLHQpLHRoaXMuc2V0dGluZ3Mub3ZlcmxheSYmdGhpcy4kb3ZlcmxheS5jc3MoXCJoZWlnaHRcIix0KSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgZT17fTt0aGlzLnZpc2libGV8fCh0aGlzLiRjb250LmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vcGVuKSx0aGlzLnZpc2libGU9ITAsdGhpcy4kZWwudHJpZ2dlcihcInNob3cuXCIrdGhpcy5uYW1lKSx0aGlzLiRlbC50cmlnZ2VyKFwidG9nZ2xlLlwiK3RoaXMubmFtZSx0aGlzLnZpc2libGUpLHRoaXMuc2V0SGVpZ2h0cygpLGVbdGhpcy5zZXR0aW5ncy5vcmlnaW5dPXRoaXMuZWZmZWN0c1t0aGlzLnNldHRpbmdzLmVmZmVjdF0udG8sdGhpcy5lZmZlY3RzW3RoaXMuc2V0dGluZ3MuZWZmZWN0XS4kZWwudmVsb2NpdHkoZSx0LmV4dGVuZCh7Y29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLiRlbC50cmlnZ2VyKFwic2hvd24uXCIrdGhpcy5uYW1lKSx0aGlzLnNldHRpbmdzLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkub25lKFwiY2xpY2suXCIrdGhpcy5uYW1lLGZ1bmN0aW9uKCl7dGhpcy5oaWRlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpfSx0aGlzLmFuaW1hdGlvbk9wdGlvbnMpKSx0aGlzLnNldHRpbmdzLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkudmVsb2NpdHkoe29wYWNpdHk6MX0sdC5leHRlbmQoe2Rpc3BsYXk6XCJibG9ja1wifSx0aGlzLmFuaW1hdGlvbk9wdGlvbnMpKSl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLnZpc2libGUmJih0aGlzLiRjb250LnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vcGVuKSx0aGlzLnZpc2libGU9ITEsdGhpcy4kZWwudHJpZ2dlcihcImhpZGUuXCIrdGhpcy5uYW1lKSx0aGlzLiRlbC50cmlnZ2VyKFwidG9nZ2xlLlwiK3RoaXMubmFtZSx0aGlzLnZpc2libGUpLHRoaXMuZWZmZWN0c1t0aGlzLnNldHRpbmdzLmVmZmVjdF0uJGVsLnZlbG9jaXR5KFwic3RvcFwiKS52ZWxvY2l0eShcInJldmVyc2VcIix0LmV4dGVuZCh7Y29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLiRlbC50cmlnZ2VyKFwiaGlkZGVuLlwiK3RoaXMubmFtZSl9LmJpbmQodGhpcyl9LHRoaXMuYW5pbWF0aW9uT3B0aW9ucykpLHRoaXMuc2V0dGluZ3Mub3ZlcmxheSYmdGhpcy4kb3ZlcmxheS52ZWxvY2l0eShcInN0b3BcIikudmVsb2NpdHkoXCJyZXZlcnNlXCIsdC5leHRlbmQoe2Rpc3BsYXk6XCJub25lXCJ9LHRoaXMuYW5pbWF0aW9uT3B0aW9ucykpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMudmlzaWJsZT90aGlzLmhpZGU6dGhpcy5zaG93KS5jYWxsKHRoaXMpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy4kZWwuZGF0YSh0aGlzLm5hbWUrXCIub3B0c1wiKSYmKHRoaXMuJGlubmVyV3JhcHBlci51bndyYXAoKSx0aGlzLiRpbm5lcldyYXBwZXIuY2hpbGRyZW4oKS51bndyYXAoKSx0aGlzLiRjb250LnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5jb250YWluZXIpLnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vcGVuKSx0aGlzLnNldHRpbmdzLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkub2ZmKFwiY2xpY2suXCIrdGhpcy5uYW1lKS5yZW1vdmUoKSx0aGlzLiRlbC51bndyYXAoKS5yZW1vdmVEYXRhKHRoaXMubmFtZStcIi5vcHRzXCIpLnJlbW92ZUF0dHIoXCJzdHlsZVwiKSx0aGlzLiR3aW4ub2ZmKFwicmVzaXplLlwiK3RoaXMubmFtZSkpfSxpbml0OmZ1bmN0aW9uKCl7dmFyIHM9e307dGhpcy4kd2luPXQod2luZG93KSx0aGlzLiRib2R5PXQoXCJib2R5XCIpLHRoaXMudmlzaWJsZT0hMSx0aGlzLiRjb250PXQodGhpcy5zZXR0aW5ncy5jb250YWluZXIpLHRoaXMuJGNvbnQuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLmNvbnRhaW5lcikuY2hpbGRyZW4oXCI6bm90KHNjcmlwdClcIikud3JhcEFsbCh0KFwiPGRpdi8+XCIpLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vdXRlcikpLHRoaXMuJG91dGVyV3JhcHBlcj10KFwiLlwiK3RoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vdXRlcikud3JhcElubmVyKHQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLmlubmVyKSksdGhpcy4kaW5uZXJXcmFwcGVyPXQoXCIuXCIrdGhpcy5zZXR0aW5ncy5jbGFzc2VzLmlubmVyKSx0aGlzLnNldHRpbmdzLm92ZXJsYXkmJih0aGlzLiRpbm5lcldyYXBwZXIuYXBwZW5kKHQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLm92ZXJsYXkpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIix0aGlzLnNldHRpbmdzLm92ZXJsYXlDb2xvcikpLHRoaXMuJG92ZXJsYXk9dChcIi5cIit0aGlzLnNldHRpbmdzLmNsYXNzZXMub3ZlcmxheSkpLHRoaXMuJGVsLndyYXAodChcIjxkaXYvPlwiKS5hZGRDbGFzcyh0aGlzLnNldHRpbmdzLmNsYXNzZXMuZWxlbWVudCkpLHRoaXMuJGVsZW1lbnQ9dGhpcy4kZWwucGFyZW50KCksc1t0aGlzLnNldHRpbmdzLm9yaWdpbl09XCItXCIrdGhpcy5zZXR0aW5ncy5jb3ZlcmFnZSxzLndpZHRoPXRoaXMuc2V0dGluZ3MuY292ZXJhZ2UsdGhpcy4kZWxlbWVudC5jc3MocyksdGhpcy5lZmZlY3RzPXtwdXNoOnskZWw6dGhpcy4kaW5uZXJXcmFwcGVyLGZyb206MCx0bzp0aGlzLnNldHRpbmdzLmNvdmVyYWdlfSxcInNsaWRlLWluLW92ZXJcIjp7JGVsOnRoaXMuJGVsZW1lbnQsZnJvbTpcIi1cIit0aGlzLnNldHRpbmdzLmNvdmVyYWdlLHRvOjB9fSx0aGlzLmFuaW1hdGlvbk9wdGlvbnM9e2Vhc2luZzp0aGlzLnNldHRpbmdzLmVhc2luZyxkdXJhdGlvbjp0aGlzLnNldHRpbmdzLmR1cmF0aW9ufSx0aGlzLiR3aW4ub24oXCJyZXNpemUuXCIrdGhpcy5uYW1lLGUodGhpcy5zZXRIZWlnaHRzLDMwMCkuYmluZCh0aGlzKSksdGhpcy5zZXRIZWlnaHRzKCksdGhpcy4kZWwudHJpZ2dlcihcImluaXQuXCIrdGhpcy5uYW1lKX19KSx0LmZuW2ldPWZ1bmN0aW9uKGUpe3ZhciBuLG89YXJndW1lbnRzO3JldHVybiB2b2lkIDA9PT1lfHxcIm9iamVjdFwiPT10eXBlb2YgZT90aGlzLmVhY2goZnVuY3Rpb24oKXt0LmRhdGEodGhpcyxcInBsdWdpbl9cIitpKXx8dC5kYXRhKHRoaXMsXCJwbHVnaW5fXCIraSxuZXcgcyh0aGlzLGUpKX0pOlwic3RyaW5nXCI9PXR5cGVvZiBlJiZcIl9cIiE9PWVbMF0mJlwiaW5pdFwiIT09ZSYmKHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBoPXQuZGF0YSh0aGlzLFwicGx1Z2luX1wiK2kpO2ggaW5zdGFuY2VvZiBzJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBoW2VdJiYobj1oW2VdLmFwcGx5KGgsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobywxKSkpLFwiZGVzdHJveVwiPT09ZSYmdC5kYXRhKHRoaXMsXCJwbHVnaW5fXCIraSxudWxsKX0pLHZvaWQgMCE9PW4/bjp0aGlzKX0sdC5mbltpXS5kZWZhdWx0cz17Y2xhc3Nlczp7Y29udGFpbmVyOmksZWxlbWVudDppK1wiLWVsZW1lbnRcIixpbm5lcjppK1wiLWlubmVyXCIsb3BlbjppK1wiLW9wZW5cIixvdXRlcjppK1wiLW91dGVyXCIsb3ZlcmxheTppK1wiLW92ZXJsYXlcIn0sY29udGFpbmVyOlwiYm9keVwiLGNvdmVyYWdlOlwiMjIwcHhcIixvcmlnaW46XCJsZWZ0XCIsZHVyYXRpb246MzAwLGVhc2luZzpcImVhc2UtaW4tb3V0XCIsZWZmZWN0OlwicHVzaFwiLG92ZXJsYXk6ITEsb3ZlcmxheUNvbG9yOlwicmdiYSgwLCAwLCAwLCAwLjcpXCJ9fSk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gaW1wb3J0ICdib290c3RyYXAvZGlzdC9qcy9ib290c3RyYXAubWluJztcbmltcG9ydCBcImpxdWVyeS1tb2RhbFwiO1xuLy8gaW1wb3J0IFwianF1ZXJ5LW9mZmNhbnZhcy9kaXN0L2pxdWVyeS5vZmZjYW52YXMubWluLmNzc1wiO1xuaW1wb3J0IFwidG9vbHRpcHN0ZXJcIjtcbmltcG9ydCBcInRvb2x0aXBzdGVyL2Rpc3QvY3NzL3Rvb2x0aXBzdGVyLmJ1bmRsZS5taW4uY3NzXCI7XG5pbXBvcnQgXCJ0b29sdGlwc3Rlci9kaXN0L2Nzcy9wbHVnaW5zL3Rvb2x0aXBzdGVyL3NpZGVUaXAvdGhlbWVzL3Rvb2x0aXBzdGVyLXNpZGVUaXAtc2hhZG93Lm1pbi5jc3NcIjtcbmltcG9ydCB0b3VjaHNwaW4gZnJvbSBcImJvb3RzdHJhcC10b3VjaHNwaW5cIjtcbmltcG9ydCBcImpxdWVyeS10b3VjaHN3aXBlXCI7XG5pbXBvcnQgXCIuL3NlbGVjdG9yc1wiO1xuaW1wb3J0IFwiLi90YWJzLmpzXCI7XG5pbXBvcnQgXCIuL2Vhc3l6b29tXCI7XG5cbmltcG9ydCBcIi4vcmVzcG9uc2l2ZVwiO1xuaW1wb3J0IFwiLi9jaGVja291dFwiO1xuaW1wb3J0IFwiLi9jdXN0b21lclwiO1xuaW1wb3J0IFwiLi9saXN0aW5nXCI7XG5pbXBvcnQgXCIuL3Byb2R1Y3RcIjtcbmltcG9ydCBcIi4vY2FydFwiO1xuaW1wb3J0IFwiLi9mYWNldHNcIjtcblxuaW1wb3J0IHByZXN0YXNob3AgZnJvbSBcInByZXN0YXNob3BcIjtcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiO1xuaW1wb3J0IERyb3BEb3duIGZyb20gXCIuL2NvbXBvbmVudHMvZHJvcC1kb3duXCI7XG5pbXBvcnQgRm9ybSBmcm9tIFwiLi9jb21wb25lbnRzL2Zvcm1cIjtcbmltcG9ydCB1c2VQYXNzd29yZFBvbGljeSBmcm9tIFwiLi9jb21wb25lbnRzL3VzZVBhc3N3b3JkUG9saWN5XCI7XG5pbXBvcnQgUHJvZHVjdE1pbml0YXR1cmUgZnJvbSBcIi4vY29tcG9uZW50cy9wcm9kdWN0LW1pbmlhdHVyZVwiO1xuaW1wb3J0IFByb2R1Y3RTZWxlY3QgZnJvbSBcIi4vY29tcG9uZW50cy9wcm9kdWN0LXNlbGVjdFwiO1xuaW1wb3J0IFRvcE1lbnUgZnJvbSBcIi4vY29tcG9uZW50cy90b3AtbWVudVwiO1xuXG5pbXBvcnQgXCIuL2NvbXBvbmVudHMvYmxvY2stY2FydFwiO1xuaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiO1xuaW1wb3J0IGpvIGZyb20gXCJqcXVlcnktb2ZmY2FudmFzXCI7XG5qbyh3aW5kb3csICQpO1xudG91Y2hzcGluKHdpbmRvdywgJCk7XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbi8vIFwiaW5oZXJpdFwiIEV2ZW50RW1pdHRlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5mb3IgKGNvbnN0IGkgaW4gRXZlbnRFbWl0dGVyLnByb3RvdHlwZSkge1xuICBwcmVzdGFzaG9wW2ldID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZVtpXTtcbn1cblxuJCgoKSA9PiB7XG4gIGNvbnN0IGRyb3BEb3duRWwgPSAkKCcuanMtZHJvcGRvd24nKTtcbiAgY29uc3QgZm9ybSA9IG5ldyBGb3JtKCk7XG4gIGNvbnN0IHRvcE1lbnVFbCA9ICQoJy5qcy10b3AtbWVudSB1bFtkYXRhLWRlcHRoPVwiMFwiXScpO1xuICBjb25zdCBkcm9wRG93biA9IG5ldyBEcm9wRG93bihkcm9wRG93bkVsKTtcbiAgY29uc3QgdG9wTWVudSA9IG5ldyBUb3BNZW51KHRvcE1lbnVFbCk7XG4gIGNvbnN0IHByb2R1Y3RNaW5pdGF0dXJlID0gbmV3IFByb2R1Y3RNaW5pdGF0dXJlKCk7XG4gIGNvbnN0IHByb2R1Y3RTZWxlY3QgPSBuZXcgUHJvZHVjdFNlbGVjdCgpO1xuICBkcm9wRG93bi5pbml0KCk7XG4gIGZvcm0uaW5pdCgpO1xuICB0b3BNZW51LmluaXQoKTtcbiAgcHJvZHVjdE1pbml0YXR1cmUuaW5pdCgpO1xuICBwcm9kdWN0U2VsZWN0LmluaXQoKTtcbiAgdXNlUGFzc3dvcmRQb2xpY3koJy5maWVsZC1wYXNzd29yZC1wb2xpY3knKTtcblxuXG4gICQoJy5lYXN5em9vbScpLmVhc3lab29tKHtcbiAgfSk7XG5cbiAgJCgnLmNhcm91c2VsW2RhdGEtdG91Y2g9XCJ0cnVlXCJdJykuc3dpcGUoe1xuICAgIHN3aXBlKGV2ZW50LCBkaXJlY3Rpb24pIHtcbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAkKHRoaXMpLmNhcm91c2VsKCduZXh0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICQodGhpcykuY2Fyb3VzZWwoJ3ByZXYnKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFsbG93UGFnZVNjcm9sbDogJ3ZlcnRpY2FsJyxcbiAgfSk7XG5cbiAgJCgnI3Byb2R1Y3QtbGlzdC10b3AtZmlsdGVycycpLm9mZmNhbnZhcyh7XG4gICAgZHVyYXRpb246IDEwMCxcbiAgICBlZmZlY3Q6ICdzbGlkZS1pbi1vdmVyJyxcbiAgICBjbGFzc2VzOiB7XG4gICAgICBlbGVtZW50OiAnYWJzb2x1dGUgdG9wLTAgei01MCcsXG4gICAgfSxcbiAgfSk7XG5cbiAgJCgnI3Nob3ctZmlsdGVycycpLm9uKCdjbGljay5vZmZjYW52YXMnLCAoKSA9PiB7XG4gICAgJCgnI292ZXJsYXknKS5zaG93KCk7ICBcbiAgICAkKCcjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzJykuc2hvdygpOyAgXG4gIH0pO1xuICBcbiAgJCgnI2hpZGUtZmlsdGVycycpLm9uKCdjbGljay5vZmZjYW52YXMnLCAoKSA9PiB7XG4gICAgJCgnI3Byb2R1Y3QtbGlzdC10b3AtZmlsdGVycycpLmhpZGUoKTsgXG4gICAgJCgnI292ZXJsYXknKS5oaWRlKCk7XG4gIH0pO1xuICBcbiAgJCgnI292ZXJsYXknKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAkKCcjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzJykuaGlkZSgpOyAgXG4gICAgJCgnI292ZXJsYXknKS5oaWRlKCk7ICBcbiAgfSk7XG5cbiAgZnVuY3Rpb24gVGhBY2NvcmRpb24oKSB7fVxuXG4gICQuZXh0ZW5kKFRoQWNjb3JkaW9uLnByb3RvdHlwZSwge1xuICAgIGluaXQoKSB7fSxcbiAgfSk7XG5cbiAgJC5mbi50aGFjY29yZGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzZWxlY3RvcnMgPSB7XG4gICAgICByb290OiAnLnRoLWFjY29yZGlvbicsXG4gICAgICBpdGVtOiAnLnRoLWFjY29yZGlvbi1pdGVtJyxcbiAgICAgIHRyaWdnZXI6ICcudGgtYWNjb3JkaW9uLWl0ZW0tdHJpZ2dlcicsXG4gICAgICBzdmc6ICcudGgtYWNjb3JkaW9uLWl0ZW0tdHJpZ2dlci1zdmcnLFxuICAgICAgY29udGVudDogJy50aC1hY2NvcmRpb24taXRlbS1jb250ZW50JyxcbiAgICB9O1xuICAgIGxldCBzZWxlY3Rpb24gPSBudWxsO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5maW5kKHNlbGVjdG9ycy5pdGVtKTtcbiAgICBjb25zdCByb3RhdGVDbGFzcyA9ICdyb3RhdGUtOTAgZHVyYXRpb24tNTAwJztcblxuICAgIGZ1bmN0aW9uIGNvbGxhcHNlQWxsKCkge1xuICAgICAgaXRlbXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICQodGhpcykuZmluZChzZWxlY3RvcnMuY29udGVudCkuaGlkZSg1MDApO1xuICAgICAgICAkKHRoaXMpLmZpbmQoc2VsZWN0b3JzLnN2ZykucmVtb3ZlQ2xhc3Mocm90YXRlQ2xhc3MpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgJChzZWxlY3Rpb24pLmZpbmQoc2VsZWN0b3JzLmNvbnRlbnQpLmhpZGUoNTAwKTtcbiAgICAgICQoc2VsZWN0aW9uKS5maW5kKHNlbGVjdG9ycy5zdmcpLnJlbW92ZUNsYXNzKCdyb3RhdGUtOTAnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvcGVuKCkge1xuICAgICAgY29sbGFwc2VBbGwoKTtcbiAgICAgICQoc2VsZWN0aW9uKS5maW5kKHNlbGVjdG9ycy5jb250ZW50KS5zaG93KDUwMCk7XG4gICAgICAkKHNlbGVjdGlvbikuZmluZChzZWxlY3RvcnMuc3ZnKS5hZGRDbGFzcyhyb3RhdGVDbGFzcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPcGVuKGl0ZW0pIHtcbiAgICAgIHJldHVybiAkKGl0ZW0pLmZpbmQoc2VsZWN0b3JzLmNvbnRlbnQpLmlzKCc6dmlzaWJsZScpO1xuICAgIH1cblxuICAgIGNvbGxhcHNlQWxsKCk7XG5cbiAgICBpdGVtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgJCh0aGlzKVxuICAgICAgICAuZmluZChzZWxlY3RvcnMudHJpZ2dlcilcbiAgICAgICAgLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uID09PSBzZWxmKSB7XG4gICAgICAgICAgICBpZiAoaXNPcGVuKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZjtcbiAgICAgICAgICAgIGlmICghaXNPcGVuKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgb3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgJCgnLnRoLWFjY29yZGlvbicpLnRoYWNjb3JkaW9uKCk7XG4gICQoJy50b29sdGlwJykudG9vbHRpcHN0ZXIoe1xuICAgIHRoZW1lOiAndG9vbHRpcHN0ZXItc2hhZG93JyxcbiAgICB0cmlnZ2VyT3Blbjoge1xuICAgICAgY2xpY2s6IHRydWUsXG4gICAgICBtb3VzZWVudGVyOiB0cnVlLFxuICAgICAgdG91Y2hzdGFydDogdHJ1ZSxcbiAgICB9LFxuICAgIGRlbGF5VG91Y2g6IFswLCAyMDAwXSxcbiAgfSk7XG5cbiAgJCgnLnRvZ2dsZS1tYWluLW1lbnUnKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgJCgnLm1vYmlsZS1tYWluLW1lbnUnKS50b2dnbGUoKTtcbiAgfSk7XG5cdFxufSk7XG5cbiJdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwiJCIsIndpbmRvdyIsImRvY3VtZW50IiwidW5kZWZpbmVkIiwiaSIsIm1vZHVsZSIsInRoaXMiLCJhIiwiYiIsImMiLCJkIiwiZSIsImciLCJmIiwiaiIsImsiLCJoIiwibCIsIm0iLCJuIiwibyIsInAiLCJvYmoiLCJqUXVlcnkiLCJ2YWx1ZSIsInBoYXNlIiwiZGlyZWN0aW9uIiwiZGlzdGFuY2UiLCJwcmVzdGFzaG9wIiwic2VsZiIsImVsZW0iLCJvZmZzZXRQYXJlbnQiLCJnbG9iYWwiLCIkMiIsImVsZW1lbnQiLCJwcm9wZXJ0eSIsIm9wdHMiLCJjYWxsSW5kZXgiLCJkZWxheUNvbXBsZXRlIiwidmFsdWVEYXRhIiwiZW5kVmFsdWUiLCJlYXNpbmciLCJzdGFydFZhbHVlIiwidHdlZW5EZWx0YSIsIlJlZmxlY3RBcHBseSIsIlJlZmxlY3RPd25LZXlzIiwiTnVtYmVySXNOYU4iLCJldmVudHNNb2R1bGUiLCJldmVudHMiLCJvbmNlIiwic3ByaW50ZiIsInMiLCJ0IiwiRXZlbnRFbWl0dGVyIl0sIm1hcHBpbmdz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QUVBLEdBQUUsT0FBTyxLQUFLLFFBQU0sSUFBRSxHQUFFQSxHQUFFLE9BQU8sYUFBYSxRQUFNLEdBQUVBLEdBQUUsT0FBTyxhQUFhLE9BQUs7QUFBRTtBQUFBLGNBQU0sS0FBSTtBQUFPLHlCQUFRLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLFFBQU8sSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLEtBQUk7QUFBQyxzQkFBSSxJQUFFLEVBQUUsQ0FBQztBQUFFLDRCQUFRLEtBQUcsSUFBRSxNQUFJLElBQUUsR0FBRSxNQUFJLE1BQUksSUFBRSxLQUFJLElBQUUsTUFBSSxJQUFFLElBQUcsSUFBRSxVQUFRLElBQUUsTUFBSSxJQUFFLEdBQUUsS0FBRyxNQUFJLElBQUUsS0FBSSxJQUFFLE1BQUksSUFBRSxJQUFHLElBQUU7QUFBQSxnQkFBTztBQUFDLGdCQUFBQSxHQUFFLE9BQU8sS0FBSyxTQUFPLElBQUUsR0FBRUEsR0FBRSxPQUFPLEtBQUssUUFBTSxJQUFFLEdBQUVBLEdBQUUsT0FBTyxhQUFhLFFBQU0sR0FBRUEsR0FBRSxPQUFPLGFBQWEsT0FBSztBQUFBLFlBQUM7QUFBQSxRQUFDO0FBQUMsWUFBSSxJQUFFLFNBQVNSLElBQUU7QUFBQyxVQUFBUSxHQUFFLE9BQU8sS0FBSyxTQUFPUixHQUFFLFFBQU9RLEdBQUUsT0FBTyxhQUFhLE9BQUtSLEdBQUUsTUFBS1EsR0FBRSxPQUFPLGFBQWEsTUFBSVIsR0FBRSxLQUFJUSxHQUFFLE9BQU8sS0FBSyxRQUFNUixHQUFFO0FBQUEsUUFBSztBQUFFLGFBQUlDLEdBQUUsU0FBUyxFQUFDLE1BQUssWUFBVyxNQUFLLEdBQUUsVUFBUyxFQUFDLFFBQU9PLEdBQUUsT0FBTyxLQUFLLFFBQU8sTUFBS0EsR0FBRSxPQUFPLGFBQWEsTUFBSyxLQUFJQSxHQUFFLE9BQU8sYUFBYSxLQUFJLE9BQU1BLEdBQUUsT0FBTyxLQUFLLE1BQUssRUFBQyxDQUFDLEdBQUVBLEdBQUUsT0FBTyxhQUFhLFFBQU1BLEdBQUUsT0FBTyxhQUFhLE9BQUtBLEdBQUUsT0FBTyxLQUFLLE9BQU1BLEdBQUUsT0FBTyxhQUFhLFNBQU9BLEdBQUUsT0FBTyxhQUFhLE1BQUlBLEdBQUUsT0FBTyxLQUFLLFFBQU9BLEdBQUUsT0FBTyxPQUFPLE9BQUtBLEdBQUUsT0FBTyxhQUFhLE9BQUtBLEdBQUUsT0FBTyxPQUFPLE1BQUtBLEdBQUUsT0FBTyxPQUFPLE1BQUlBLEdBQUUsT0FBTyxhQUFhLE1BQUlBLEdBQUUsT0FBTyxPQUFPLEtBQUlBLEdBQUUsT0FBTyxPQUFPLFNBQU9BLEdBQUUsT0FBTyxPQUFPLE1BQUlBLEdBQUUsT0FBTyxLQUFLLFFBQU9BLEdBQUUsT0FBTyxPQUFPLFFBQU1BLEdBQUUsT0FBTyxPQUFPLE9BQUtBLEdBQUUsT0FBTyxLQUFLLE9BQU1BLEdBQUUsVUFBVSxXQUFTLEVBQUMsUUFBTyxFQUFDLFFBQU9BLEdBQUUsU0FBUyxLQUFLLFNBQU9BLEdBQUUsT0FBTyxPQUFPLFFBQU8sT0FBTUEsR0FBRSxTQUFTLEtBQUssTUFBSyxHQUFFLE1BQUssRUFBQyxRQUFPQSxHQUFFLFNBQVMsS0FBSyxRQUFPLE9BQU1BLEdBQUUsT0FBTyxPQUFPLEtBQUksR0FBRSxPQUFNLEVBQUMsUUFBT0EsR0FBRSxTQUFTLEtBQUssUUFBTyxPQUFNQSxHQUFFLFNBQVMsS0FBSyxRQUFNQSxHQUFFLE9BQU8sT0FBTyxNQUFLLEdBQUUsS0FBSSxFQUFDLFFBQU9BLEdBQUUsT0FBTyxPQUFPLEtBQUksT0FBTUEsR0FBRSxTQUFTLEtBQUssTUFBSyxFQUFDLEdBQUVBLEdBQUUsVUFBVSxTQUFPLEVBQUMsUUFBTyxFQUFDLFFBQU8sS0FBSyxJQUFJQSxHQUFFLE9BQU8sS0FBSyxTQUFPLEtBQUssSUFBSUEsR0FBRSxPQUFPLGFBQWEsUUFBTyxDQUFDLEdBQUUsQ0FBQyxHQUFFLE9BQU1BLEdBQUUsT0FBTyxLQUFLLE1BQUssR0FBRSxNQUFLLEVBQUMsUUFBT0EsR0FBRSxPQUFPLEtBQUssUUFBTyxPQUFNLEtBQUssSUFBSUEsR0FBRSxPQUFPLGFBQWEsTUFBSyxD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UUFBUSxJQUFHQSxHQUFFLFVBQVUsU0FBUyxTQUFPLE1BQUksV0FBU0EsR0FBRSxVQUFVLFNBQVMsQ0FBQyxNQUFJQSxHQUFFLFVBQVUsU0FBUyxDQUFDLElBQUVBLEdBQUUsVUFBVSxTQUFTLENBQUMsSUFBRyxXQUFTQSxHQUFFLFVBQVUsU0FBUyxDQUFDLE1BQUlBLEdBQUUsVUFBVSxTQUFTLENBQUMsSUFBRUEsR0FBRSxVQUFVLFNBQVMsQ0FBQyxJQUFHLFdBQVNBLEdBQUUsVUFBVSxTQUFTLENBQUMsTUFBSUEsR0FBRSxVQUFVLFNBQVMsQ0FBQyxJQUFFQSxHQUFFLFVBQVUsU0FBUyxDQUFDLEtBQUlBLEdBQUUsVUFBVSxXQUFTLEVBQUMsS0FBSUEsR0FBRSxVQUFVLFNBQVMsQ0FBQyxHQUFFLE9BQU1BLEdBQUUsVUFBVSxTQUFTLENBQUMsR0FBRSxRQUFPQSxHQUFFLFVBQVUsU0FBUyxDQUFDLEdBQUUsTUFBS0EsR0FBRSxVQUFVLFNBQVMsQ0FBQyxFQUFDLEdBQUUsWUFBVSxPQUFPQSxHQUFFLFVBQVUsTUFBSztBQUFDLGNBQUlDLEtBQUUsRUFBQyxLQUFJLFVBQVMsT0FBTSxRQUFPLFFBQU8sT0FBTSxNQUFLLFFBQU87QUFBRSxVQUFBRCxHQUFFLFVBQVUsT0FBSyxDQUFDQSxHQUFFLFVBQVUsTUFBS0MsR0FBRUQsR0FBRSxVQUFVLElBQUksQ0FBQyxHQUFFLFVBQVFBLEdBQUUsVUFBVSxLQUFLLENBQUMsS0FBRyxXQUFTQSxHQUFFLFVBQVUsS0FBSyxDQUFDLElBQUVBLEdBQUUsVUFBVSxLQUFLLEtBQUssT0FBTSxRQUFRLElBQUVBLEdBQUUsVUFBVSxLQUFLLEtBQUssU0FBUSxNQUFNO0FBQUEsUUFBQztBQUFDLGNBQUksRUFBRSxZQUFZLEtBQUssTUFBSUEsR0FBRSxVQUFVLFVBQVEsU0FBS0EsR0FBRSxVQUFVLFFBQU07QUFBQSxNQUFHLEdBQUUsY0FBYSxTQUFTQSxJQUFFQyxJQUFFO0FBQUMsWUFBSUMsSUFBRUMsS0FBRSxNQUFLRSxLQUFFRixHQUFFLGFBQWFGLEVBQUMsR0FBRUcs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YTtBQUFBLGNBQ2IsYUFBYTtBQUFBLGNBQ2IsZUFBZTtBQUFBLGNBQ2Ysa0JBQWtCO0FBQUEsY0FDbEIsY0FBYztBQUFBLGNBQ2QsY0FBYztBQUFBLGNBQ2QsV0FBVztBQUFBLGNBQ1gsY0FBYztBQUFBLGNBQ2QsZ0JBQWdCO0FBQUEsY0FDaEIsaUJBQWlCO0FBQUEsY0FDakIsaUJBQWlCO0FBQUEsY0FDakIsaUJBQWlCO0FBQUEsY0FDakIsY0FBYztBQUFBLGNBQ2QsWUFBWTtBQUFBLGNBQ1osZUFBZTtBQUFBLGNBQ2YsV0FBVztBQUFBLGNBQ1gsV0FBVztBQUFBLGNBQ1gsY0FBYztBQUFBLGNBQ2QsYUFBYTtBQUFBLGNBQ2IsZUFBZTtBQUFBLGNBQ2YsZUFBZTtBQUFBLGNBQ2YsV0FBVztBQUFBLGNBQ1gsYUFBYTtBQUFBLGNBQ2IsY0FBYztBQUFBLGNBQ2QsUUFBUTtBQUFBLGNBQ1IsYUFBYTtBQUFBLGNBQ2IsUUFBUTtBQUFBLGNBQ1IsUUFBUTtBQUFBLGNBQ1IsZUFBZTtBQUFBLGNBQ2YsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLGNBQ1osV0FBVztBQUFBLGNBQ1gsYUFBYTtBQUFBLGNBQ2IsVUFBVTtBQUFBLGNBQ1YsU0FBUztBQUFBLGNBQ1QsU0FBUztBQUFBLGNBQ1QsaUJBQWlCO0FBQUEsY0FDakIsWUFBWTtBQUFBLGNBQ1osYUFBYTtBQUFBLGNBQ2IsZ0JBQWdCO0FBQUEsY0FDaEIsYUFBYTtBQUFBLGNBQ2IsY0FBYztBQUFBLGNBQ2QsYUFBYTtBQUFBLGNBQ2Isd0JBQXdCO0FBQUEsY0FDeEIsYUFBYTtBQUFBLGNBQ2IsYUFBYTtBQUFBLGNBQ2IsY0FBYztBQUFBLGNBQ2QsYUFBYTtBQUFBLGNBQ2IsZUFBZTtBQUFBLGNBQ2YsaUJBQWlCO0FBQUEsY0FDakIsZ0JBQWdCO0FBQUEsY0FDaEIsa0JBQWtCO0FBQUEsY0FDbEIsa0JBQWtCO0FBQUEsY0FDbEIsZUFBZTtBQUFBLGNBQ2YsYUFBYTtBQUFBLGNBQ2IsUUFBUTtBQUFBLGNBQ1IsU0FBUztBQUFBLGNBQ1QsV0FBVztBQUFBLGNBQ1gsVUFBVTtBQUFBLGNBQ1Ysb0JBQW9CO0FBQUEsY0FDcEIsY0FBYztBQUFBLGNBQ2QsZ0JBQWdCO0FBQUEsY0FDaEIsZ0JBQWdCO0FBQUEsY0FDaEIsa0JBQWtCO0FBQUEsY0FDbEIsbUJBQW1CO0FBQUEsY0FDbkIscUJBQXFCO0FBQUEsY0FDckIsbUJBQW1CO0FBQUEsY0FDbkIsbUJBQW1CO0FBQUEsY0FDbkIsZ0JBQWdCO0FBQUEsY0FDaEIsYUFBYTtBQUFBLGNBQ2IsYUFBYTtBQUFBLGNBQ2IsWUFBWTtBQUFBLGNBQ1osZUFBZTtBQUFBLGNBQ2YsUUFBUTtBQUFBLGNBQ1IsV0FBVztBQUFBLGNBQ1gsYUFBYTtBQUFBLGNBQ2IsU0FBUztBQUFBLGNBQ1QsYUFBYTtBQUFBLGNBQ2IsVUFBVTtBQUFBLGNBQ1YsVUFBVTtBQUFBLGNBQ1YsaUJBQWlCO0FBQUEsY0FDakIsYUFBYTtBQUFBLGNBQ2IsaUJBQWlCO0FBQUEsY0FDakIsaUJBQWlCO0FBQUEsY0FDakIsY0FBYztBQUFBLGNBQ2QsYUFBYTtBQUFBLGNBQ2IsUUFBUTtBQUFBLGNBQ1IsUUFBUTtBQUFBLGNBQ1IsUUFBUTtBQUFBLGNBQ1IsY0FBYztBQUFBLGNBQ2QsVUFBVTtBQUFBLGNBQ1YsT0FBTztBQUFBLGNBQ1AsYUFBYTtBQUFBLGNBQ2IsYUFBYTtBQUFBLGNBQ2IsZUFBZTtBQUFBLGNBQ2YsVUFBVTtBQUFBLGNBQ1YsY0FBYztBQUFBLGNBQ2QsWUFBWTtBQUFBLGNBQ1osWUFBWTtBQUFBLGNBQ1osVUFBVTtBQUFBLGNBQ1YsVUFBVTtBQUFBLGNBQ1YsV0FBVztBQUFBLGNBQ1gsYUFBYTtBQUFBLGNBQ2IsYUFBYTtBQUFBLGNBQ2IsUUFBUTtBQUFBLGNBQ1IsZUFBZTtBQUFBLGNBQ2YsYUFBYTtBQUFBLGNBQ2IsT0FBTztBQUFBLGNBQ1AsUUFBUTtBQUFBLGNBQ1IsV0FBVztBQUFBLGNBQ1gsVUFBVTtBQUFBLGNBQ1YsYUFBYTtBQUFBLGNBQ2IsVUFBVTtBQUFBLGNBQ1YsU0FBUztBQUFBLGNBQ1QsY0FBYztBQUFBLGNBQ2QsU0FBUztB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QVcsSUFBSSxFQUFDLE1BQUssRUFBRSxDQUFDLEVBQUUsV0FBWSxJQUFDLElBQUUsS0FBSyxXQUFXLFdBQVksSUFBQyxHQUFFLFFBQU8sR0FBRSxDQUFDLElBQUUsaUJBQWUsS0FBSyxRQUFRLFdBQVMsS0FBSyxXQUFXLElBQUksRUFBQyxNQUFLLEVBQUUsQ0FBQyxFQUFFLFdBQVksSUFBQyxJQUFFLEtBQUssV0FBVyxXQUFZLElBQUMsR0FBRSxLQUFJLEdBQUUsQ0FBQyxJQUFFLGlCQUFlLEtBQUssUUFBUSxXQUFTLEtBQUssV0FBVyxJQUFJLEVBQUMsTUFBSyxFQUFFLENBQUMsRUFBRSxXQUFZLElBQUMsSUFBRSxLQUFLLFdBQVcsV0FBWSxJQUFDLEdBQUUsS0FBSSxFQUFFLENBQUMsRUFBRSxZQUFhLElBQUMsSUFBRSxLQUFLLFdBQVcsWUFBYSxJQUFDLEVBQUMsQ0FBQyxJQUFFLEtBQUssV0FBVyxTQUFTLEtBQUssUUFBUSxRQUFRLElBQUUsWUFBVSxPQUFPLEtBQUssUUFBUSxXQUFTLEtBQUssV0FBVyxJQUFJLEVBQUMsS0FBSSxLQUFLLFFBQVEsU0FBUyxNQUFJLEtBQUssUUFBUSxTQUFTLE1BQUksUUFBTyxRQUFPLEtBQUssUUFBUSxTQUFTLFNBQU8sS0FBSyxRQUFRLFNBQVMsU0FBTyxRQUFPLE1BQUssS0FBSyxRQUFRLFNBQVMsT0FBSyxLQUFLLFFBQVEsU0FBUyxPQUFLLFFBQU8sT0FBTSxLQUFLLFFBQVEsU0FBUyxRQUFNLEtBQUssUUFBUSxTQUFTLFFBQU0sT0FBTSxDQUFDLElBQUUsS0FBSyxXQUFXLFNBQVMsYUFBYTtBQUFBLElBQUMsR0FBRSxXQUFVLFdBQVU7QUFBQyxVQUFJZ0MsS0FBRTtBQUFLLFdBQUssU0FBUyxHQUFHLGNBQWEsV0FBVTtBQUFDLFFBQUFBLEdBQUUsY0FBYTtBQUFBLE1BQUUsQ0FBQyxHQUFFLEtBQUssU0FBUyxLQUFLLHdCQUF3QixFQUFFLEdBQUcsU0FBUSxTQUFTaEMsSUFBRTtBQUFDLFFBQUFBLEdBQUUsZUFBYyxHQUFHLFdBQVNnQyxHQUFFLFFBQVEs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LEtBQUssS0FBSyxPQUFLLFNBQVEsS0FBSyxRQUFRLEdBQUUsS0FBSztNQUFNO0FBQUMsVUFBSUEsS0FBRTtBQUFZLFFBQUUsT0FBTyxFQUFFLFdBQVUsRUFBQyxZQUFXLFdBQVU7QUFBQyxZQUFJZ0QsS0FBRSxLQUFLLGNBQWMsT0FBTTtBQUFHLGFBQUssSUFBSSxLQUFLLEtBQUssT0FBSyxPQUFPLE1BQUksS0FBSyxTQUFTLElBQUksVUFBU0EsRUFBQyxHQUFFLEtBQUssU0FBUyxXQUFTLEtBQUssU0FBUyxJQUFJLFVBQVNBLEVBQUM7QUFBQSxNQUFFLEdBQUUsTUFBSyxXQUFVO0FBQUMsWUFBSXpDLEtBQUUsQ0FBRTtBQUFDLGFBQUssWUFBVSxLQUFLLE1BQU0sU0FBUyxLQUFLLFNBQVMsUUFBUSxJQUFJLEdBQUUsS0FBSyxVQUFRLE1BQUcsS0FBSyxJQUFJLFFBQVEsVUFBUSxLQUFLLElBQUksR0FBRSxLQUFLLElBQUksUUFBUSxZQUFVLEtBQUssTUFBSyxLQUFLLE9BQU8sR0FBRSxLQUFLLFdBQVksR0FBQ0EsR0FBRSxLQUFLLFNBQVMsTUFBTSxJQUFFLEtBQUssUUFBUSxLQUFLLFNBQVMsTUFBTSxFQUFFLElBQUcsS0FBSyxRQUFRLEtBQUssU0FBUyxNQUFNLEVBQUUsSUFBSSxTQUFTQSxJQUFFLEVBQUUsT0FBTyxFQUFDLFdBQVMsV0FBVTtBQUFDLGVBQUssSUFBSSxRQUFRLFdBQVMsS0FBSyxJQUFJLEdBQUUsS0FBSyxTQUFTLFdBQVMsS0FBSyxTQUFTLElBQUksV0FBUyxLQUFLLE9BQUssV0FBVTtBQUFDLGlCQUFLLEtBQUk7QUFBQSxVQUFFLEdBQUUsS0FBSyxJQUFJLENBQUM7QUFBQSxRQUFDLEdBQUUsS0FBSyxJQUFJLEVBQUMsR0FBRSxLQUFLLGdCQUFnQixDQUFDLEdBQUUsS0FBSyxTQUFTLFdBQVMsS0FBSyxTQUFTLFNBQVMsRUFBQyxTQUFRLEVBQUMsR0FBRSxFQUFFLE9BQU8sRUFBQyxTQUFRLFFBQU8sR0FBRSxLQUFLLGdCQUFnQixDQUFDO0FBQUEsTUFBRSxHQUFFLE1BQUssV0FBVTtBQUFDLGFBQUssWUFBVSxLQUFLLE1BQU0sWUFBWSxLQUFLLFNBQVMsUUFBUSxJQUFJLEdBQUUsS0FBSyxVQUFRLE9BQUcsS0FBSyxJQUFJLFFBQVEsVUFBUSxLQUFLLElBQUksR0FBRSxLQUFLLElBQUksUUFBUSxZQUFVLEtBQUssTUFBSyxLQUFLLE9BQU8sR0FBRSxLQUFLLFFBQVEsS0FBSyxTQUFTLE1BQU0sRUFBRSxJQUFJLFNBQVMsTUFBTSxFQUFFLFNBQVMsV0FBVSxFQUFFLE9BQU8sRUFBQyxXQUFTLFdBQVU7QUFBQyxlQUFLLElBQUksUUFBUSxZQUFVLEtBQUssSUFBSTtBQUFBLFFBQUMsR0FBRSxLQUFLLElBQUksRUFBQyxHQUFFLEtBQUssZ0JBQWdCLENBQUMsR0FBRSxLQUFLLFNBQVMsV0FBUyxLQUFLLFNBQVMsU0FBUyxNQUFNLEVBQUUsU0FBUyxXQUFVLEVBQUUsT0FBTyxFQUFDLFNBQVEsT0FBTSxHQUFFLEtBQUssZ0JBQWdCLENBQUM7QUFBQSxNQUFFLEdBQUUsUUFBTyxXQUFVO0FBQUMsZ0JBQU8sS0FBSyxVQUFRLEtBQUssT0FBSyxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsTUFBQyxHQUFFLFNBQVEsV0FBVTtBQUFDLGFBQUssSUFBSSxLQUFLLEtBQUssT0FBSyxPQUFPLE1BQUksS0FBSyxjQUFjLFVBQVMsS0FBSyxjQUFjLFNBQVUsRUFBQyxPQUFRLEdBQUMsS0FBSyxNQUFNLFlBQVksS0FBSyxTQUFTLFFBQVEsU0FBUyxFQUFFLFlBQVksS0FBSyxTQUFTLFFBQVEsSUFBSSxHQUFFLEtBQUssU0FBUyxXQUFTLEtBQUssU0FBUyxJQUFJLFdBQVMsS0FBSyxJQUFJLEVBQUUsVUFBUyxLQUFLLElBQUksT0FBUSxFQUFDLFdBQVcsS0FBSyxPQUFLLE9BQU8sRUFBRSxXQUFXLE9BQU8sR0FBRSxLQUFLLEtBQUssSUFBSSxZQUFVLEtBQUssSUFBSTtBQUFBLE1BQUUsR0FBRSxNQUFLLFdBQVU7QUFBQyxZQUFJd0MsS0FBRSxDQUFFO0FBQUMsYUFBSyxPQUFLLEVBQUUsTUFB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
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuanMiLCJzb3VyY2VzIjpbIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL2pxdWVyeS1tb2RhbC9qcXVlcnkubW9kYWwuanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy90b29sdGlwc3Rlci9kaXN0L2pzL3Rvb2x0aXBzdGVyLmJ1bmRsZS5taW4uanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy9ib290c3RyYXAtdG91Y2hzcGluL2Rpc3QvanF1ZXJ5LmJvb3RzdHJhcC10b3VjaHNwaW4uanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy9qcXVlcnktdG91Y2hzd2lwZS9qcXVlcnkudG91Y2hTd2lwZS5taW4uanMiLCIuLi8uLi9fZGV2L2pzL3NlbGVjdG9ycy5qcyIsIi4uLy4uL19kZXYvanMvdGFicy5qcyIsIi4uLy4uL19kZXYvanMvZWFzeXpvb20uanMiLCIuLi8uLi9fZGV2L2pzL3Jlc3BvbnNpdmUuanMiLCIuLi8uLi9fZGV2L2pzL2NoZWNrb3V0LmpzIiwiLi4vLi4vX2Rldi9qcy9jdXN0b21lci5qcyIsIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL3ZlbG9jaXR5LWFuaW1hdGUvdmVsb2NpdHkuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvdXBkYXRlLXNvdXJjZXMuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvcHJvZHVjdC1taW5pYXR1cmUuanMiLCIuLi8uLi9fZGV2L2pzL2xpc3RpbmcuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvcHJvZHVjdC1zZWxlY3QuanMiLCIuLi8uLi9fZGV2L2pzL3Byb2R1Y3QuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvZGVib3VuY2UuanMiLCIuLi8uLi9fZGV2L2pzL2NhcnQuanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwiLi4vLi4vX2Rldi9qcy9jb21wb25lbnRzL2Ryb3AtZG93bi5qcyIsIi4uLy4uL19kZXYvanMvY29tcG9uZW50cy9mb3JtLmpzIiwiLi4vLi4vX2Rldi9ub2RlX21vZHVsZXMvc3ByaW50Zi1qcy9zcmMvc3ByaW50Zi5qcyIsIi4uLy4uL19kZXYvanMvY29tcG9uZW50cy91c2VQYXNzd29yZFBvbGljeS5qcyIsIi4uLy4uL19kZXYvanMvY29tcG9uZW50cy90b3AtbWVudS5qcyIsIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL2pxdWVyeS10b2FzdC1wbHVnaW4vZGlzdC9qcXVlcnkudG9hc3QubWluLmpzIiwiLi4vLi4vX2Rldi9qcy9jb21wb25lbnRzL2Jsb2NrLWNhcnQuanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy9qcXVlcnktb2ZmY2FudmFzL2Rpc3QvanF1ZXJ5Lm9mZmNhbnZhcy5taW4uanMiLCIuLi8uLi9fZGV2L2pzL3RoZW1lLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgQSBzaW1wbGUgalF1ZXJ5IG1vZGFsIChodHRwOi8vZ2l0aHViLmNvbS9reWxlZm94L2pxdWVyeS1tb2RhbClcbiAgICBWZXJzaW9uIDAuOS4yXG4qL1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgLy8gTWFraW5nIHlvdXIgalF1ZXJ5IHBsdWdpbiB3b3JrIGJldHRlciB3aXRoIG5wbSB0b29sc1xuICAvLyBodHRwOi8vYmxvZy5ucG1qcy5vcmcvcG9zdC8xMTI3MTIxNjk4MzAvbWFraW5nLXlvdXItanF1ZXJ5LXBsdWdpbi13b3JrLWJldHRlci13aXRoLW5wbVxuICBpZih0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIGZhY3RvcnkocmVxdWlyZShcImpxdWVyeVwiKSwgd2luZG93LCBkb2N1bWVudCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZmFjdG9yeShqUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuICB9XG59KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG4gIHZhciBtb2RhbHMgPSBbXSxcbiAgICAgIGdldEN1cnJlbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG1vZGFscy5sZW5ndGggPyBtb2RhbHNbbW9kYWxzLmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICAgIH0sXG4gICAgICBzZWxlY3RDdXJyZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChpPW1vZGFscy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7XG4gICAgICAgICAgaWYgKG1vZGFsc1tpXS4kYmxvY2tlcikge1xuICAgICAgICAgICAgbW9kYWxzW2ldLiRibG9ja2VyLnRvZ2dsZUNsYXNzKCdjdXJyZW50Jywhc2VsZWN0ZWQpLnRvZ2dsZUNsYXNzKCdiZWhpbmQnLHNlbGVjdGVkKTtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgJC5tb2RhbCA9IGZ1bmN0aW9uKGVsLCBvcHRpb25zKSB7XG4gICAgdmFyIHJlbW92ZSwgdGFyZ2V0O1xuICAgIHRoaXMuJGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sICQubW9kYWwuZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIHRoaXMub3B0aW9ucy5kb0ZhZGUgPSAhaXNOYU4ocGFyc2VJbnQodGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiwgMTApKTtcbiAgICB0aGlzLiRibG9ja2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlRXhpc3RpbmcpXG4gICAgICB3aGlsZSAoJC5tb2RhbC5pc0FjdGl2ZSgpKVxuICAgICAgICAkLm1vZGFsLmNsb3NlKCk7IC8vIENsb3NlIGFueSBvcGVuIG1vZGFscy5cbiAgICBtb2RhbHMucHVzaCh0aGlzKTtcbiAgICBpZiAoZWwuaXMoJ2EnKSkge1xuICAgICAgdGFyZ2V0ID0gZWwuYXR0cignaHJlZicpO1xuICAgICAgdGhpcy5hbmNob3IgPSBlbDtcbiAgICAgIC8vU2VsZWN0IGVsZW1lbnQgYnkgaWQgZnJvbSBocmVmXG4gICAgICBpZiAoL14jLy50ZXN0KHRhcmdldCkpIHtcbiAgICAgICAgdGhpcy4kZWxtID0gJCh0YXJnZXQpO1xuICAgICAgICBpZiAodGhpcy4kZWxtLmxlbmd0aCAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuJGJvZHkuYXBwZW5kKHRoaXMuJGVsbSk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgLy9BSkFYXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiRlbG0gPSAkKCc8ZGl2PicpO1xuICAgICAgICB0aGlzLiRib2R5LmFwcGVuZCh0aGlzLiRlbG0pO1xuICAgICAgICByZW1vdmUgPSBmdW5jdGlvbihldmVudCwgbW9kYWwpIHsgbW9kYWwuZWxtLnJlbW92ZSgpOyB9O1xuICAgICAgICB0aGlzLnNob3dTcGlubmVyKCk7XG4gICAgICAgIGVsLnRyaWdnZXIoJC5tb2RhbC5BSkFYX1NFTkQpO1xuICAgICAgICAkLmdldCh0YXJnZXQpLmRvbmUoZnVuY3Rpb24oaHRtbCkge1xuICAgICAgICAgIGlmICghJC5tb2RhbC5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgICAgZWwudHJpZ2dlcigkLm1vZGFsLkFKQVhfU1VDQ0VTUyk7XG4gICAgICAgICAgdmFyIGN1cnJlbnQgPSBnZXRDdXJyZW50KCk7XG4gICAgICAgICAgY3VycmVudC4kZWxtLmVtcHR5KCkuYXBwZW5kKGh0bWwpLm9uKCQubW9kYWwuQ0xPU0UsIHJlbW92ZSk7XG4gICAgICAgICAgY3VycmVudC5oaWRlU3Bpbm5lcigpO1xuICAgICAgICAgIGN1cnJlbnQub3BlbigpO1xuICAgICAgICAgIGVsLnRyaWdnZXIoJC5tb2RhbC5BSkFYX0NPTVBMRVRFKTtcbiAgICAgICAgfSkuZmFpbChmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbC50cmlnZ2VyKCQubW9kYWwuQUpBWF9GQUlMKTtcbiAgICAgICAgICB2YXIgY3VycmVudCA9IGdldEN1cnJlbnQoKTtcbiAgICAgICAgICBjdXJyZW50LmhpZGVTcGlubmVyKCk7XG4gICAgICAgICAgbW9kYWxzLnBvcCgpOyAvLyByZW1vdmUgZXhwZWN0ZWQgbW9kYWwgZnJvbSB0aGUgbGlzdFxuICAgICAgICAgIGVsLnRyaWdnZXIoJC5tb2RhbC5BSkFYX0NPTVBMRVRFKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuJGVsbSA9IGVsO1xuICAgICAgdGhpcy5hbmNob3IgPSBlbDtcbiAgICAgIHRoaXMuJGJvZHkuYXBwZW5kKHRoaXMuJGVsbSk7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH07XG5cbiAgJC5tb2RhbC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6ICQubW9kYWwsXG5cbiAgICBvcGVuOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBtID0gdGhpcztcbiAgICAgIHRoaXMuYmxvY2soKTtcbiAgICAgIHRoaXMuYW5jaG9yLmJsdXIoKTtcbiAgICAgIGlmKHRoaXMub3B0aW9ucy5kb0ZhZGUpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICBtLnNob3coKTtcbiAgICAgICAgfSwgdGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiAqIHRoaXMub3B0aW9ucy5mYWRlRGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgICAkKGRvY3VtZW50KS5vZmYoJ2tleWRvd24ubW9kYWwnKS5vbigna2V5ZG93bi5tb2RhbCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gZ2V0Q3VycmVudCgpO1xuICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IDI3ICYmIGN1cnJlbnQub3B0aW9ucy5lc2NhcGVDbG9zZSkgY3VycmVudC5jbG9zZSgpO1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNsaWNrQ2xvc2UpXG4gICAgICAgIHRoaXMuJGJsb2NrZXIuY2xpY2soZnVuY3Rpb24oZSkge1xuICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcylcbiAgICAgICAgICAgICQubW9kYWwuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIGNsb3NlOiBmdW5jdGlvbigpIHtcbiAgICAgIG1vZGFscy5wb3AoKTtcbiAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICBpZiAoISQubW9kYWwuaXNBY3RpdmUoKSlcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKCdrZXlkb3duLm1vZGFsJyk7XG4gICAgfSxcblxuICAgIGJsb2NrOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuJGVsbS50cmlnZ2VyKCQubW9kYWwuQkVGT1JFX0JMT0NLLCBbdGhpcy5fY3R4KCldKTtcbiAgICAgIHRoaXMuJGJvZHkuY3NzKCdvdmVyZmxvdycsJ2hpZGRlbicpO1xuICAgICAgdGhpcy4kYmxvY2tlciA9ICQoJzxkaXYgY2xhc3M9XCInICsgdGhpcy5vcHRpb25zLmJsb2NrZXJDbGFzcyArICcgYmxvY2tlciBjdXJyZW50XCI+PC9kaXY+JykuYXBwZW5kVG8odGhpcy4kYm9keSk7XG4gICAgICBzZWxlY3RDdXJyZW50KCk7XG4gICAgICBpZih0aGlzLm9wdGlvbnMuZG9GYWRlKSB7XG4gICAgICAgIHRoaXMuJGJsb2NrZXIuY3NzKCdvcGFjaXR5JywwKS5hbmltYXRlKHtvcGFjaXR5OiAxfSwgdGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLkJMT0NLLCBbdGhpcy5fY3R4KCldKTtcbiAgICB9LFxuXG4gICAgdW5ibG9jazogZnVuY3Rpb24obm93KSB7XG4gICAgICBpZiAoIW5vdyAmJiB0aGlzLm9wdGlvbnMuZG9GYWRlKVxuICAgICAgICB0aGlzLiRibG9ja2VyLmZhZGVPdXQodGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiwgdGhpcy51bmJsb2NrLmJpbmQodGhpcyx0cnVlKSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy4kYmxvY2tlci5jaGlsZHJlbigpLmFwcGVuZFRvKHRoaXMuJGJvZHkpO1xuICAgICAgICB0aGlzLiRibG9ja2VyLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLiRibG9ja2VyID0gbnVsbDtcbiAgICAgICAgc2VsZWN0Q3VycmVudCgpO1xuICAgICAgICBpZiAoISQubW9kYWwuaXNBY3RpdmUoKSlcbiAgICAgICAgICB0aGlzLiRib2R5LmNzcygnb3ZlcmZsb3cnLCcnKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdzogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLkJFRk9SRV9PUEVOLCBbdGhpcy5fY3R4KCldKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0Nsb3NlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24gPSAkKCc8YSBocmVmPVwiI2Nsb3NlLW1vZGFsXCIgcmVsPVwibW9kYWw6Y2xvc2VcIiBjbGFzcz1cImNsb3NlLW1vZGFsICcgKyB0aGlzLm9wdGlvbnMuY2xvc2VDbGFzcyArICdcIj4nICsgdGhpcy5vcHRpb25zLmNsb3NlVGV4dCArICc8L2E+Jyk7XG4gICAgICAgIHRoaXMuJGVsbS5hcHBlbmQodGhpcy5jbG9zZUJ1dHRvbik7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbG0uYWRkQ2xhc3ModGhpcy5vcHRpb25zLm1vZGFsQ2xhc3MpLmFwcGVuZFRvKHRoaXMuJGJsb2NrZXIpO1xuICAgICAgaWYodGhpcy5vcHRpb25zLmRvRmFkZSkge1xuICAgICAgICB0aGlzLiRlbG0uY3NzKHtvcGFjaXR5OiAwLCBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ30pLmFuaW1hdGUoe29wYWNpdHk6IDF9LCB0aGlzLm9wdGlvbnMuZmFkZUR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuJGVsbS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLk9QRU4sIFt0aGlzLl9jdHgoKV0pO1xuICAgIH0sXG5cbiAgICBoaWRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuJGVsbS50cmlnZ2VyKCQubW9kYWwuQkVGT1JFX0NMT1NFLCBbdGhpcy5fY3R4KCldKTtcbiAgICAgIGlmICh0aGlzLmNsb3NlQnV0dG9uKSB0aGlzLmNsb3NlQnV0dG9uLnJlbW92ZSgpO1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIGlmKHRoaXMub3B0aW9ucy5kb0ZhZGUpIHtcbiAgICAgICAgdGhpcy4kZWxtLmZhZGVPdXQodGhpcy5vcHRpb25zLmZhZGVEdXJhdGlvbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLkFGVEVSX0NMT1NFLCBbX3RoaXMuX2N0eCgpXSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4kZWxtLmhpZGUoMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLiRlbG0udHJpZ2dlcigkLm1vZGFsLkFGVEVSX0NMT1NFLCBbX3RoaXMuX2N0eCgpXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy4kZWxtLnRyaWdnZXIoJC5tb2RhbC5DTE9TRSwgW3RoaXMuX2N0eCgpXSk7XG4gICAgfSxcblxuICAgIHNob3dTcGlubmVyOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dTcGlubmVyKSByZXR1cm47XG4gICAgICB0aGlzLnNwaW5uZXIgPSB0aGlzLnNwaW5uZXIgfHwgJCgnPGRpdiBjbGFzcz1cIicgKyB0aGlzLm9wdGlvbnMubW9kYWxDbGFzcyArICctc3Bpbm5lclwiPjwvZGl2PicpXG4gICAgICAgIC5hcHBlbmQodGhpcy5vcHRpb25zLnNwaW5uZXJIdG1sKTtcbiAgICAgIHRoaXMuJGJvZHkuYXBwZW5kKHRoaXMuc3Bpbm5lcik7XG4gICAgICB0aGlzLnNwaW5uZXIuc2hvdygpO1xuICAgIH0sXG5cbiAgICBoaWRlU3Bpbm5lcjogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zcGlubmVyKSB0aGlzLnNwaW5uZXIucmVtb3ZlKCk7XG4gICAgfSxcblxuICAgIC8vUmV0dXJuIGNvbnRleHQgZm9yIGN1c3RvbSBldmVudHNcbiAgICBfY3R4OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7IGVsbTogdGhpcy4kZWxtLCAkZWxtOiB0aGlzLiRlbG0sICRibG9ja2VyOiB0aGlzLiRibG9ja2VyLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsICRhbmNob3I6IHRoaXMuYW5jaG9yIH07XG4gICAgfVxuICB9O1xuXG4gICQubW9kYWwuY2xvc2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICghJC5tb2RhbC5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgaWYgKGV2ZW50KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBjdXJyZW50ID0gZ2V0Q3VycmVudCgpO1xuICAgIGN1cnJlbnQuY2xvc2UoKTtcbiAgICByZXR1cm4gY3VycmVudC4kZWxtO1xuICB9O1xuXG4gIC8vIFJldHVybnMgaWYgdGhlcmUgY3VycmVudGx5IGlzIGFuIGFjdGl2ZSBtb2RhbFxuICAkLm1vZGFsLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtb2RhbHMubGVuZ3RoID4gMDtcbiAgfTtcblxuICAkLm1vZGFsLmdldEN1cnJlbnQgPSBnZXRDdXJyZW50O1xuXG4gICQubW9kYWwuZGVmYXVsdHMgPSB7XG4gICAgY2xvc2VFeGlzdGluZzogdHJ1ZSxcbiAgICBlc2NhcGVDbG9zZTogdHJ1ZSxcbiAgICBjbGlja0Nsb3NlOiB0cnVlLFxuICAgIGNsb3NlVGV4dDogJ0Nsb3NlJyxcbiAgICBjbG9zZUNsYXNzOiAnJyxcbiAgICBtb2RhbENsYXNzOiBcIm1vZGFsXCIsXG4gICAgYmxvY2tlckNsYXNzOiBcImpxdWVyeS1tb2RhbFwiLFxuICAgIHNwaW5uZXJIdG1sOiAnPGRpdiBjbGFzcz1cInJlY3QxXCI+PC9kaXY+PGRpdiBjbGFzcz1cInJlY3QyXCI+PC9kaXY+PGRpdiBjbGFzcz1cInJlY3QzXCI+PC9kaXY+PGRpdiBjbGFzcz1cInJlY3Q0XCI+PC9kaXY+JyxcbiAgICBzaG93U3Bpbm5lcjogdHJ1ZSxcbiAgICBzaG93Q2xvc2U6IHRydWUsXG4gICAgZmFkZUR1cmF0aW9uOiBudWxsLCAgIC8vIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhlIGZhZGUgYW5pbWF0aW9uIHRha2VzLlxuICAgIGZhZGVEZWxheTogMS4wICAgICAgICAvLyBQb2ludCBkdXJpbmcgdGhlIG92ZXJsYXkncyBmYWRlLWluIHRoYXQgdGhlIG1vZGFsIGJlZ2lucyB0byBmYWRlIGluICguNSA9IDUwJSwgMS41ID0gMTUwJSwgZXRjLilcbiAgfTtcblxuICAvLyBFdmVudCBjb25zdGFudHNcbiAgJC5tb2RhbC5CRUZPUkVfQkxPQ0sgPSAnbW9kYWw6YmVmb3JlLWJsb2NrJztcbiAgJC5tb2RhbC5CTE9DSyA9ICdtb2RhbDpibG9jayc7XG4gICQubW9kYWwuQkVGT1JFX09QRU4gPSAnbW9kYWw6YmVmb3JlLW9wZW4nO1xuICAkLm1vZGFsLk9QRU4gPSAnbW9kYWw6b3Blbic7XG4gICQubW9kYWwuQkVGT1JFX0NMT1NFID0gJ21vZGFsOmJlZm9yZS1jbG9zZSc7XG4gICQubW9kYWwuQ0xPU0UgPSAnbW9kYWw6Y2xvc2UnO1xuICAkLm1vZGFsLkFGVEVSX0NMT1NFID0gJ21vZGFsOmFmdGVyLWNsb3NlJztcbiAgJC5tb2RhbC5BSkFYX1NFTkQgPSAnbW9kYWw6YWpheDpzZW5kJztcbiAgJC5tb2RhbC5BSkFYX1NVQ0NFU1MgPSAnbW9kYWw6YWpheDpzdWNjZXNzJztcbiAgJC5tb2RhbC5BSkFYX0ZBSUwgPSAnbW9kYWw6YWpheDpmYWlsJztcbiAgJC5tb2RhbC5BSkFYX0NPTVBMRVRFID0gJ21vZGFsOmFqYXg6Y29tcGxldGUnO1xuXG4gICQuZm4ubW9kYWwgPSBmdW5jdGlvbihvcHRpb25zKXtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIG5ldyAkLm1vZGFsKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBBdXRvbWF0aWNhbGx5IGJpbmQgbGlua3Mgd2l0aCByZWw9XCJtb2RhbDpjbG9zZVwiIHRvLCB3ZWxsLCBjbG9zZSB0aGUgbW9kYWwuXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljay5tb2RhbCcsICdhW3JlbH49XCJtb2RhbDpjbG9zZVwiXScsICQubW9kYWwuY2xvc2UpO1xuICAkKGRvY3VtZW50KS5vbignY2xpY2subW9kYWwnLCAnYVtyZWx+PVwibW9kYWw6b3BlblwiXScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAkKHRoaXMpLm1vZGFsKCk7XG4gIH0pO1xufSkpO1xuIiwiLyohIHRvb2x0aXBzdGVyIHY0LjIuOCAqLyFmdW5jdGlvbihhLGIpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5XCJdLGZ1bmN0aW9uKGEpe3JldHVybiBiKGEpfSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YihyZXF1aXJlKFwianF1ZXJ5XCIpKTpiKGpRdWVyeSl9KHRoaXMsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt0aGlzLiRjb250YWluZXIsdGhpcy5jb25zdHJhaW50cz1udWxsLHRoaXMuX18kdG9vbHRpcCx0aGlzLl9faW5pdChhKX1mdW5jdGlvbiBjKGIsYyl7dmFyIGQ9ITA7cmV0dXJuIGEuZWFjaChiLGZ1bmN0aW9uKGEsZSl7cmV0dXJuIHZvaWQgMD09PWNbYV18fGJbYV0hPT1jW2FdPyhkPSExLCExKTp2b2lkIDB9KSxkfWZ1bmN0aW9uIGQoYil7dmFyIGM9Yi5hdHRyKFwiaWRcIiksZD1jP2gud2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGMpOm51bGw7cmV0dXJuIGQ/ZD09PWJbMF06YS5jb250YWlucyhoLndpbmRvdy5kb2N1bWVudC5ib2R5LGJbMF0pfWZ1bmN0aW9uIGUoKXtpZighZylyZXR1cm4hMTt2YXIgYT1nLmRvY3VtZW50LmJvZHl8fGcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGI9YS5zdHlsZSxjPVwidHJhbnNpdGlvblwiLGQ9W1wiTW96XCIsXCJXZWJraXRcIixcIktodG1sXCIsXCJPXCIsXCJtc1wiXTtpZihcInN0cmluZ1wiPT10eXBlb2YgYltjXSlyZXR1cm4hMDtjPWMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYy5zdWJzdHIoMSk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoXCJzdHJpbmdcIj09dHlwZW9mIGJbZFtlXStjXSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgZj17YW5pbWF0aW9uOlwiZmFkZVwiLGFuaW1hdGlvbkR1cmF0aW9uOjM1MCxjb250ZW50Om51bGwsY29udGVudEFzSFRNTDohMSxjb250ZW50Q2xvbmluZzohMSxkZWJ1ZzohMCxkZWxheTozMDAsZGVsYXlUb3VjaDpbMzAwLDUwMF0sZnVuY3Rpb25Jbml0Om51bGwsZnVuY3Rpb25CZWZvcmU6bnVsbCxmdW5jdGlvblJlYWR5Om51bGwsZnVuY3Rpb25BZnRlcjpudWxsLGZ1bmN0aW9uRm9ybWF0Om51bGwsSUVtaW46NixpbnRlcmFjdGl2ZTohMSxtdWx0aXBsZTohMSxwYXJlbnQ6bnVsbCxwbHVnaW5zOltcInNpZGVUaXBcIl0scmVwb3NpdGlvbk9uU2Nyb2xsOiExLHJlc3RvcmF0aW9uOlwibm9uZVwiLHNlbGZEZXN0cnVjdGlvbjohMCx0aGVtZTpbXSx0aW1lcjowLHRyYWNrZXJJbnRlcnZhbDo1MDAsdHJhY2tPcmlnaW46ITEsdHJhY2tUb29sdGlwOiExLHRyaWdnZXI6XCJob3ZlclwiLHRyaWdnZXJDbG9zZTp7Y2xpY2s6ITEsbW91c2VsZWF2ZTohMSxvcmlnaW5DbGljazohMSxzY3JvbGw6ITEsdGFwOiExLHRvdWNobGVhdmU6ITF9LHRyaWdnZXJPcGVuOntjbGljazohMSxtb3VzZWVudGVyOiExLHRhcDohMSx0b3VjaHN0YXJ0OiExfSx1cGRhdGVBbmltYXRpb246XCJyb3RhdGVcIix6SW5kZXg6OTk5OTk5OX0sZz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzpudWxsLGg9e2hhc1RvdWNoQ2FwYWJpbGl0eTohKCFnfHwhKFwib250b3VjaHN0YXJ0XCJpbiBnfHxnLkRvY3VtZW50VG91Y2gmJmcuZG9jdW1lbnQgaW5zdGFuY2VvZiBnLkRvY3VtZW50VG91Y2h8fGcubmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzKSksaGFzVHJhbnNpdGlvbnM6ZSgpLElFOiExLHNlbVZlcjpcIjQuMi44XCIsd2luZG93Omd9LGk9ZnVuY3Rpb24oKXt0aGlzLl9fJGVtaXR0ZXJQcml2YXRlPWEoe30pLHRoaXMuX18kZW1pdHRlclB1YmxpYz1hKHt9KSx0aGlzLl9faW5zdGFuY2VzTGF0ZXN0QXJyPVtdLHRoaXMuX19wbHVnaW5zPXt9LHRoaXMuX2Vudj1ofTtpLnByb3RvdHlwZT17X19icmlkZ2U6ZnVuY3Rpb24oYixjLGQpe2lmKCFjW2RdKXt2YXIgZT1mdW5jdGlvbigpe307ZS5wcm90b3R5cGU9Yjt2YXIgZz1uZXcgZTtnLl9faW5pdCYmZy5fX2luaXQoYyksYS5lYWNoKGIsZnVuY3Rpb24oYSxiKXswIT1hLmluZGV4T2YoXCJfX1wiKSYmKGNbYV0/Zi5kZWJ1ZyYmY29uc29sZS5sb2coXCJUaGUgXCIrYStcIiBtZXRob2Qgb2YgdGhlIFwiK2QrXCIgcGx1Z2luIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgcGx1Z2luIG9yIG5hdGl2ZSBtZXRob2RzXCIpOihjW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIGdbYV0uYXBwbHkoZyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSl9LGNbYV0uYnJpZGdlZD1nKSl9KSxjW2RdPWd9cmV0dXJuIHRoaXN9LF9fc2V0V2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBoLndpbmRvdz1hLHRoaXN9LF9nZXRSdWxlcjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGIoYSl9LF9vZmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fXyRlbWl0dGVyUHJpdmF0ZS5vZmYuYXBwbHkodGhpcy5fXyRlbWl0dGVyUHJpdmF0ZSxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sX29uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX18kZW1pdHRlclByaXZhdGUub24uYXBwbHkodGhpcy5fXyRlbWl0dGVyUHJpdmF0ZSxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sX29uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLm9uZS5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpKSx0aGlzfSxfcGx1Z2luOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGIpe3ZhciBkPWIsZT1udWxsO3JldHVybiBkLmluZGV4T2YoXCIuXCIpPjA/ZT1jLl9fcGx1Z2luc1tkXTphLmVhY2goYy5fX3BsdWdpbnMsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5uYW1lLnN1YnN0cmluZyhiLm5hbWUubGVuZ3RoLWQubGVuZ3RoLTEpPT1cIi5cIitkPyhlPWIsITEpOnZvaWQgMH0pLGV9aWYoYi5uYW1lLmluZGV4T2YoXCIuXCIpPDApdGhyb3cgbmV3IEVycm9yKFwiUGx1Z2lucyBtdXN0IGJlIG5hbWVzcGFjZWRcIik7cmV0dXJuIGMuX19wbHVnaW5zW2IubmFtZV09YixiLmNvcmUmJmMuX19icmlkZ2UoYi5jb3JlLGMsYi5uYW1lKSx0aGlzfSxfdHJpZ2dlcjpmdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpO3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBhWzBdJiYoYVswXT17dHlwZTphWzBdfSksdGhpcy5fXyRlbWl0dGVyUHJpdmF0ZS50cmlnZ2VyLmFwcGx5KHRoaXMuX18kZW1pdHRlclByaXZhdGUsYSksdGhpcy5fXyRlbWl0dGVyUHVibGljLnRyaWdnZXIuYXBwbHkodGhpcy5fXyRlbWl0dGVyUHVibGljLGEpLHRoaXN9LGluc3RhbmNlczpmdW5jdGlvbihiKXt2YXIgYz1bXSxkPWJ8fFwiLnRvb2x0aXBzdGVyZWRcIjtyZXR1cm4gYShkKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxkPWIuZGF0YShcInRvb2x0aXBzdGVyLW5zXCIpO2QmJmEuZWFjaChkLGZ1bmN0aW9uKGEsZCl7Yy5wdXNoKGIuZGF0YShkKSl9KX0pLGN9LGluc3RhbmNlc0xhdGVzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faW5zdGFuY2VzTGF0ZXN0QXJyfSxvZmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fXyRlbWl0dGVyUHVibGljLm9mZi5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9LG9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX18kZW1pdHRlclB1YmxpYy5vbi5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9LG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fJGVtaXR0ZXJQdWJsaWMub25lLmFwcGx5KHRoaXMuX18kZW1pdHRlclB1YmxpYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sb3JpZ2luczpmdW5jdGlvbihiKXt2YXIgYz1iP2IrXCIgXCI6XCJcIjtyZXR1cm4gYShjK1wiLnRvb2x0aXBzdGVyZWRcIikudG9BcnJheSgpfSxzZXREZWZhdWx0czpmdW5jdGlvbihiKXtyZXR1cm4gYS5leHRlbmQoZixiKSx0aGlzfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fJGVtaXR0ZXJQdWJsaWMudHJpZ2dlckhhbmRsZXIuYXBwbHkodGhpcy5fXyRlbWl0dGVyUHVibGljLEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpKSx0aGlzfX0sYS50b29sdGlwc3Rlcj1uZXcgaSxhLlRvb2x0aXBzdGVyPWZ1bmN0aW9uKGIsYyl7dGhpcy5fX2NhbGxiYWNrcz17Y2xvc2U6W10sb3BlbjpbXX0sdGhpcy5fX2Nsb3NpbmdUaW1lLHRoaXMuX19Db250ZW50LHRoaXMuX19jb250ZW50QmNyLHRoaXMuX19kZXN0cm95ZWQ9ITEsdGhpcy5fXyRlbWl0dGVyUHJpdmF0ZT1hKHt9KSx0aGlzLl9fJGVtaXR0ZXJQdWJsaWM9YSh7fSksdGhpcy5fX2VuYWJsZWQ9ITAsdGhpcy5fX2dhcmJhZ2VDb2xsZWN0b3IsdGhpcy5fX0dlb21ldHJ5LHRoaXMuX19sYXN0UG9zaXRpb24sdGhpcy5fX25hbWVzcGFjZT1cInRvb2x0aXBzdGVyLVwiK01hdGgucm91bmQoMWU2Kk1hdGgucmFuZG9tKCkpLHRoaXMuX19vcHRpb25zLHRoaXMuX18kb3JpZ2luUGFyZW50cyx0aGlzLl9fcG9pbnRlcklzT3Zlck9yaWdpbj0hMSx0aGlzLl9fcHJldmlvdXNUaGVtZXM9W10sdGhpcy5fX3N0YXRlPVwiY2xvc2VkXCIsdGhpcy5fX3RpbWVvdXRzPXtjbG9zZTpbXSxvcGVuOm51bGx9LHRoaXMuX190b3VjaEV2ZW50cz1bXSx0aGlzLl9fdHJhY2tlcj1udWxsLHRoaXMuXyRvcmlnaW4sdGhpcy5fJHRvb2x0aXAsdGhpcy5fX2luaXQoYixjKX0sYS5Ub29sdGlwc3Rlci5wcm90b3R5cGU9e19faW5pdDpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXM7aWYoZC5fJG9yaWdpbj1hKGIpLGQuX19vcHRpb25zPWEuZXh0ZW5kKCEwLHt9LGYsYyksZC5fX29wdGlvbnNGb3JtYXQoKSwhaC5JRXx8aC5JRT49ZC5fX29wdGlvbnMuSUVtaW4pe3ZhciBlPW51bGw7aWYodm9pZCAwPT09ZC5fJG9yaWdpbi5kYXRhKFwidG9vbHRpcHN0ZXItaW5pdGlhbFRpdGxlXCIpJiYoZT1kLl8kb3JpZ2luLmF0dHIoXCJ0aXRsZVwiKSx2b2lkIDA9PT1lJiYoZT1udWxsKSxkLl8kb3JpZ2luLmRhdGEoXCJ0b29sdGlwc3Rlci1pbml0aWFsVGl0bGVcIixlKSksbnVsbCE9PWQuX19vcHRpb25zLmNvbnRlbnQpZC5fX2NvbnRlbnRTZXQoZC5fX29wdGlvbnMuY29udGVudCk7ZWxzZXt2YXIgZyxpPWQuXyRvcmlnaW4uYXR0cihcImRhdGEtdG9vbHRpcC1jb250ZW50XCIpO2kmJihnPWEoaSkpLGcmJmdbMF0/ZC5fX2NvbnRlbnRTZXQoZy5maXJzdCgpKTpkLl9fY29udGVudFNldChlKX1kLl8kb3JpZ2luLnJlbW92ZUF0dHIoXCJ0aXRsZVwiKS5hZGRDbGFzcyhcInRvb2x0aXBzdGVyZWRcIiksZC5fX3ByZXBhcmVPcmlnaW4oKSxkLl9fcHJlcGFyZUdDKCksYS5lYWNoKGQuX19vcHRpb25zLnBsdWdpbnMsZnVuY3Rpb24oYSxiKXtkLl9wbHVnKGIpfSksaC5oYXNUb3VjaENhcGFiaWxpdHkmJmEoaC53aW5kb3cuZG9jdW1lbnQuYm9keSkub24oXCJ0b3VjaG1vdmUuXCIrZC5fX25hbWVzcGFjZStcIi10cmlnZ2VyT3BlblwiLGZ1bmN0aW9uKGEpe2QuX3RvdWNoUmVjb3JkRXZlbnQoYSl9KSxkLl9vbihcImNyZWF0ZWRcIixmdW5jdGlvbigpe2QuX19wcmVwYXJlVG9vbHRpcCgpfSkuX29uKFwicmVwb3NpdGlvbmVkXCIsZnVuY3Rpb24oYSl7ZC5fX2xhc3RQb3NpdGlvbj1hLnBvc2l0aW9ufSl9ZWxzZSBkLl9fb3B0aW9ucy5kaXNhYmxlZD0hMH0sX19jb250ZW50SW5zZXJ0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEuXyR0b29sdGlwLmZpbmQoXCIudG9vbHRpcHN0ZXItY29udGVudFwiKSxjPWEuX19Db250ZW50LGQ9ZnVuY3Rpb24oYSl7Yz1hfTtyZXR1cm4gYS5fdHJpZ2dlcih7dHlwZTpcImZvcm1hdFwiLGNvbnRlbnQ6YS5fX0NvbnRlbnQsZm9ybWF0OmR9KSxhLl9fb3B0aW9ucy5mdW5jdGlvbkZvcm1hdCYmKGM9YS5fX29wdGlvbnMuZnVuY3Rpb25Gb3JtYXQuY2FsbChhLGEse29yaWdpbjphLl8kb3JpZ2luWzBdfSxhLl9fQ29udGVudCkpLFwic3RyaW5nXCIhPXR5cGVvZiBjfHxhLl9fb3B0aW9ucy5jb250ZW50QXNIVE1MP2IuZW1wdHkoKS5hcHBlbmQoYyk6Yi50ZXh0KGMpLGF9LF9fY29udGVudFNldDpmdW5jdGlvbihiKXtyZXR1cm4gYiBpbnN0YW5jZW9mIGEmJnRoaXMuX19vcHRpb25zLmNvbnRlbnRDbG9uaW5nJiYoYj1iLmNsb25lKCEwKSksdGhpcy5fX0NvbnRlbnQ9Yix0aGlzLl90cmlnZ2VyKHt0eXBlOlwidXBkYXRlZFwiLGNvbnRlbnQ6Yn0pLHRoaXN9LF9fZGVzdHJveUVycm9yOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiVGhpcyB0b29sdGlwIGhhcyBiZWVuIGRlc3Ryb3llZCBhbmQgY2Fubm90IGV4ZWN1dGUgeW91ciBtZXRob2QgY2FsbC5cIil9LF9fZ2VvbWV0cnk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9Yi5fJG9yaWdpbixkPWIuXyRvcmlnaW4uaXMoXCJhcmVhXCIpO2lmKGQpe3ZhciBlPWIuXyRvcmlnaW4ucGFyZW50KCkuYXR0cihcIm5hbWVcIik7Yz1hKCdpbWdbdXNlbWFwPVwiIycrZSsnXCJdJyl9dmFyIGY9Y1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxnPWEoaC53aW5kb3cuZG9jdW1lbnQpLGk9YShoLndpbmRvdyksaj1jLGs9e2F2YWlsYWJsZTp7ZG9jdW1lbnQ6bnVsbCx3aW5kb3c6bnVsbH0sZG9jdW1lbnQ6e3NpemU6e2hlaWdodDpnLmhlaWdodCgpLHdpZHRoOmcud2lkdGgoKX19LHdpbmRvdzp7c2Nyb2xsOntsZWZ0Omgud2luZG93LnNjcm9sbFh8fGgud2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LHRvcDpoLndpbmRvdy5zY3JvbGxZfHxoLndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfSxzaXplOntoZWlnaHQ6aS5oZWlnaHQoKSx3aWR0aDppLndpZHRoKCl9fSxvcmlnaW46e2ZpeGVkTGluZWFnZTohMSxvZmZzZXQ6e30sc2l6ZTp7aGVpZ2h0OmYuYm90dG9tLWYudG9wLHdpZHRoOmYucmlnaHQtZi5sZWZ0fSx1c2VtYXBJbWFnZTpkP2NbMF06bnVsbCx3aW5kb3dPZmZzZXQ6e2JvdHRvbTpmLmJvdHRvbSxsZWZ0OmYubGVmdCxyaWdodDpmLnJpZ2h0LHRvcDpmLnRvcH19fTtpZihkKXt2YXIgbD1iLl8kb3JpZ2luLmF0dHIoXCJzaGFwZVwiKSxtPWIuXyRvcmlnaW4uYXR0cihcImNvb3Jkc1wiKTtpZihtJiYobT1tLnNwbGl0KFwiLFwiKSxhLm1hcChtLGZ1bmN0aW9uKGEsYil7bVtiXT1wYXJzZUludChhKX0pKSxcImRlZmF1bHRcIiE9bClzd2l0Y2gobCl7Y2FzZVwiY2lyY2xlXCI6dmFyIG49bVswXSxvPW1bMV0scD1tWzJdLHE9by1wLHI9bi1wO2sub3JpZ2luLnNpemUuaGVpZ2h0PTIqcCxrLm9yaWdpbi5zaXplLndpZHRoPWsub3JpZ2luLnNpemUuaGVpZ2h0LGsub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0Kz1yLGsub3JpZ2luLndpbmRvd09mZnNldC50b3ArPXE7YnJlYWs7Y2FzZVwicmVjdFwiOnZhciBzPW1bMF0sdD1tWzFdLHU9bVsyXSx2PW1bM107ay5vcmlnaW4uc2l6ZS5oZWlnaHQ9di10LGsub3JpZ2luLnNpemUud2lkdGg9dS1zLGsub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0Kz1zLGsub3JpZ2luLndpbmRvd09mZnNldC50b3ArPXQ7YnJlYWs7Y2FzZVwicG9seVwiOmZvcih2YXIgdz0wLHg9MCx5PTAsej0wLEE9XCJldmVuXCIsQj0wO0I8bS5sZW5ndGg7QisrKXt2YXIgQz1tW0JdO1wiZXZlblwiPT1BPyhDPnkmJih5PUMsMD09PUImJih3PXkpKSx3PkMmJih3PUMpLEE9XCJvZGRcIik6KEM+eiYmKHo9QywxPT1CJiYoeD16KSkseD5DJiYoeD1DKSxBPVwiZXZlblwiKX1rLm9yaWdpbi5zaXplLmhlaWdodD16LXgsay5vcmlnaW4uc2l6ZS53aWR0aD15LXcsay5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQrPXcsay5vcmlnaW4ud2luZG93T2Zmc2V0LnRvcCs9eH19dmFyIEQ9ZnVuY3Rpb24oYSl7ay5vcmlnaW4uc2l6ZS5oZWlnaHQ9YS5oZWlnaHQsay5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQ9YS5sZWZ0LGsub3JpZ2luLndpbmRvd09mZnNldC50b3A9YS50b3Asay5vcmlnaW4uc2l6ZS53aWR0aD1hLndpZHRofTtmb3IoYi5fdHJpZ2dlcih7dHlwZTpcImdlb21ldHJ5XCIsZWRpdDpELGdlb21ldHJ5OntoZWlnaHQ6ay5vcmlnaW4uc2l6ZS5oZWlnaHQsbGVmdDprLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCx0b3A6ay5vcmlnaW4ud2luZG93T2Zmc2V0LnRvcCx3aWR0aDprLm9yaWdpbi5zaXplLndpZHRofX0pLGsub3JpZ2luLndpbmRvd09mZnNldC5yaWdodD1rLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCtrLm9yaWdpbi5zaXplLndpZHRoLGsub3JpZ2luLndpbmRvd09mZnNldC5ib3R0b209ay5vcmlnaW4ud2luZG93T2Zmc2V0LnRvcCtrLm9yaWdpbi5zaXplLmhlaWdodCxrLm9yaWdpbi5vZmZzZXQubGVmdD1rLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCtrLndpbmRvdy5zY3JvbGwubGVmdCxrLm9yaWdpbi5vZmZzZXQudG9wPWsub3JpZ2luLndpbmRvd09mZnNldC50b3Aray53aW5kb3cuc2Nyb2xsLnRvcCxrLm9yaWdpbi5vZmZzZXQuYm90dG9tPWsub3JpZ2luLm9mZnNldC50b3Aray5vcmlnaW4uc2l6ZS5oZWlnaHQsay5vcmlnaW4ub2Zmc2V0LnJpZ2h0PWsub3JpZ2luLm9mZnNldC5sZWZ0K2sub3JpZ2luLnNpemUud2lkdGgsay5hdmFpbGFibGUuZG9jdW1lbnQ9e2JvdHRvbTp7aGVpZ2h0OmsuZG9jdW1lbnQuc2l6ZS5oZWlnaHQtay5vcmlnaW4ub2Zmc2V0LmJvdHRvbSx3aWR0aDprLmRvY3VtZW50LnNpemUud2lkdGh9LGxlZnQ6e2hlaWdodDprLmRvY3VtZW50LnNpemUuaGVpZ2h0LHdpZHRoOmsub3JpZ2luLm9mZnNldC5sZWZ0fSxyaWdodDp7aGVpZ2h0OmsuZG9jdW1lbnQuc2l6ZS5oZWlnaHQsd2lkdGg6ay5kb2N1bWVudC5zaXplLndpZHRoLWsub3JpZ2luLm9mZnNldC5yaWdodH0sdG9wOntoZWlnaHQ6ay5vcmlnaW4ub2Zmc2V0LnRvcCx3aWR0aDprLmRvY3VtZW50LnNpemUud2lkdGh9fSxrLmF2YWlsYWJsZS53aW5kb3c9e2JvdHRvbTp7aGVpZ2h0Ok1hdGgubWF4KGsud2luZG93LnNpemUuaGVpZ2h0LU1hdGgubWF4KGsub3JpZ2luLndpbmRvd09mZnNldC5ib3R0b20sMCksMCksd2lkdGg6ay53aW5kb3cuc2l6ZS53aWR0aH0sbGVmdDp7aGVpZ2h0Omsud2luZG93LnNpemUuaGVpZ2h0LHdpZHRoOk1hdGgubWF4KGsub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0LDApfSxyaWdodDp7aGVpZ2h0Omsud2luZG93LnNpemUuaGVpZ2h0LHdpZHRoOk1hdGgubWF4KGsud2luZG93LnNpemUud2lkdGgtTWF0aC5tYXgoay5vcmlnaW4ud2luZG93T2Zmc2V0LnJpZ2h0LDApLDApfSx0b3A6e2hlaWdodDpNYXRoLm1heChrLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wLDApLHdpZHRoOmsud2luZG93LnNpemUud2lkdGh9fTtcImh0bWxcIiE9alswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7KXtpZihcImZpeGVkXCI9PWouY3NzKFwicG9zaXRpb25cIikpe2sub3JpZ2luLmZpeGVkTGluZWFnZT0hMDticmVha31qPWoucGFyZW50KCl9cmV0dXJuIGt9LF9fb3B0aW9uc0Zvcm1hdDpmdW5jdGlvbigpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbiYmKHRoaXMuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uPVt0aGlzLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbix0aGlzLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbl0pLFwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLl9fb3B0aW9ucy5kZWxheSYmKHRoaXMuX19vcHRpb25zLmRlbGF5PVt0aGlzLl9fb3B0aW9ucy5kZWxheSx0aGlzLl9fb3B0aW9ucy5kZWxheV0pLFwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLl9fb3B0aW9ucy5kZWxheVRvdWNoJiYodGhpcy5fX29wdGlvbnMuZGVsYXlUb3VjaD1bdGhpcy5fX29wdGlvbnMuZGVsYXlUb3VjaCx0aGlzLl9fb3B0aW9ucy5kZWxheVRvdWNoXSksXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMuX19vcHRpb25zLnRoZW1lJiYodGhpcy5fX29wdGlvbnMudGhlbWU9W3RoaXMuX19vcHRpb25zLnRoZW1lXSksbnVsbD09PXRoaXMuX19vcHRpb25zLnBhcmVudD90aGlzLl9fb3B0aW9ucy5wYXJlbnQ9YShoLndpbmRvdy5kb2N1bWVudC5ib2R5KTpcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5fX29wdGlvbnMucGFyZW50JiYodGhpcy5fX29wdGlvbnMucGFyZW50PWEodGhpcy5fX29wdGlvbnMucGFyZW50KSksXCJob3ZlclwiPT10aGlzLl9fb3B0aW9ucy50cmlnZ2VyPyh0aGlzLl9fb3B0aW9ucy50cmlnZ2VyT3Blbj17bW91c2VlbnRlcjohMCx0b3VjaHN0YXJ0OiEwfSx0aGlzLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2U9e21vdXNlbGVhdmU6ITAsb3JpZ2luQ2xpY2s6ITAsdG91Y2hsZWF2ZTohMH0pOlwiY2xpY2tcIj09dGhpcy5fX29wdGlvbnMudHJpZ2dlciYmKHRoaXMuX19vcHRpb25zLnRyaWdnZXJPcGVuPXtjbGljazohMCx0YXA6ITB9LHRoaXMuX19vcHRpb25zLnRyaWdnZXJDbG9zZT17Y2xpY2s6ITAsdGFwOiEwfSksdGhpcy5fdHJpZ2dlcihcIm9wdGlvbnNcIiksdGhpc30sX19wcmVwYXJlR0M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3JldHVybiBiLl9fb3B0aW9ucy5zZWxmRGVzdHJ1Y3Rpb24/Yi5fX2dhcmJhZ2VDb2xsZWN0b3I9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTtiLl9fdG91Y2hFdmVudHM9YS5ncmVwKGIuX190b3VjaEV2ZW50cyxmdW5jdGlvbihhLGIpe3JldHVybiBjLWEudGltZT42ZTR9KSxkKGIuXyRvcmlnaW4pfHxiLmNsb3NlKGZ1bmN0aW9uKCl7Yi5kZXN0cm95KCl9KX0sMmU0KTpjbGVhckludGVydmFsKGIuX19nYXJiYWdlQ29sbGVjdG9yKSxifSxfX3ByZXBhcmVPcmlnaW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2lmKGEuXyRvcmlnaW4ub2ZmKFwiLlwiK2EuX19uYW1lc3BhY2UrXCItdHJpZ2dlck9wZW5cIiksaC5oYXNUb3VjaENhcGFiaWxpdHkmJmEuXyRvcmlnaW4ub24oXCJ0b3VjaHN0YXJ0LlwiK2EuX19uYW1lc3BhY2UrXCItdHJpZ2dlck9wZW4gdG91Y2hlbmQuXCIrYS5fX25hbWVzcGFjZStcIi10cmlnZ2VyT3BlbiB0b3VjaGNhbmNlbC5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuXCIsZnVuY3Rpb24oYil7YS5fdG91Y2hSZWNvcmRFdmVudChiKX0pLGEuX19vcHRpb25zLnRyaWdnZXJPcGVuLmNsaWNrfHxhLl9fb3B0aW9ucy50cmlnZ2VyT3Blbi50YXAmJmguaGFzVG91Y2hDYXBhYmlsaXR5KXt2YXIgYj1cIlwiO2EuX19vcHRpb25zLnRyaWdnZXJPcGVuLmNsaWNrJiYoYis9XCJjbGljay5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuIFwiKSxhLl9fb3B0aW9ucy50cmlnZ2VyT3Blbi50YXAmJmguaGFzVG91Y2hDYXBhYmlsaXR5JiYoYis9XCJ0b3VjaGVuZC5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuXCIpLGEuXyRvcmlnaW4ub24oYixmdW5jdGlvbihiKXthLl90b3VjaElzTWVhbmluZ2Z1bEV2ZW50KGIpJiZhLl9vcGVuKGIpfSl9aWYoYS5fX29wdGlvbnMudHJpZ2dlck9wZW4ubW91c2VlbnRlcnx8YS5fX29wdGlvbnMudHJpZ2dlck9wZW4udG91Y2hzdGFydCYmaC5oYXNUb3VjaENhcGFiaWxpdHkpe3ZhciBiPVwiXCI7YS5fX29wdGlvbnMudHJpZ2dlck9wZW4ubW91c2VlbnRlciYmKGIrPVwibW91c2VlbnRlci5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuIFwiKSxhLl9fb3B0aW9ucy50cmlnZ2VyT3Blbi50b3VjaHN0YXJ0JiZoLmhhc1RvdWNoQ2FwYWJpbGl0eSYmKGIrPVwidG91Y2hzdGFydC5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuXCIpLGEuXyRvcmlnaW4ub24oYixmdW5jdGlvbihiKXshYS5fdG91Y2hJc1RvdWNoRXZlbnQoYikmJmEuX3RvdWNoSXNFbXVsYXRlZEV2ZW50KGIpfHwoYS5fX3BvaW50ZXJJc092ZXJPcmlnaW49ITAsYS5fb3BlblNob3J0bHkoYikpfSl9aWYoYS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLm1vdXNlbGVhdmV8fGEuX19vcHRpb25zLnRyaWdnZXJDbG9zZS50b3VjaGxlYXZlJiZoLmhhc1RvdWNoQ2FwYWJpbGl0eSl7dmFyIGI9XCJcIjthLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UubW91c2VsZWF2ZSYmKGIrPVwibW91c2VsZWF2ZS5cIithLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuIFwiKSxhLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UudG91Y2hsZWF2ZSYmaC5oYXNUb3VjaENhcGFiaWxpdHkmJihiKz1cInRvdWNoZW5kLlwiK2EuX19uYW1lc3BhY2UrXCItdHJpZ2dlck9wZW4gdG91Y2hjYW5jZWwuXCIrYS5fX25hbWVzcGFjZStcIi10cmlnZ2VyT3BlblwiKSxhLl8kb3JpZ2luLm9uKGIsZnVuY3Rpb24oYil7YS5fdG91Y2hJc01lYW5pbmdmdWxFdmVudChiKSYmKGEuX19wb2ludGVySXNPdmVyT3JpZ2luPSExKX0pfXJldHVybiBhfSxfX3ByZXBhcmVUb29sdGlwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIuX19vcHRpb25zLmludGVyYWN0aXZlP1wiYXV0b1wiOlwiXCI7cmV0dXJuIGIuXyR0b29sdGlwLmF0dHIoXCJpZFwiLGIuX19uYW1lc3BhY2UpLmNzcyh7XCJwb2ludGVyLWV2ZW50c1wiOmMsekluZGV4OmIuX19vcHRpb25zLnpJbmRleH0pLGEuZWFjaChiLl9fcHJldmlvdXNUaGVtZXMsZnVuY3Rpb24oYSxjKXtiLl8kdG9vbHRpcC5yZW1vdmVDbGFzcyhjKX0pLGEuZWFjaChiLl9fb3B0aW9ucy50aGVtZSxmdW5jdGlvbihhLGMpe2IuXyR0b29sdGlwLmFkZENsYXNzKGMpfSksYi5fX3ByZXZpb3VzVGhlbWVzPWEubWVyZ2UoW10sYi5fX29wdGlvbnMudGhlbWUpLGJ9LF9fc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzO2lmKGMuX19vcHRpb25zLnRyaWdnZXJDbG9zZS5zY3JvbGwpYy5fY2xvc2UoYik7ZWxzZSBpZihkKGMuXyRvcmlnaW4pJiZkKGMuXyR0b29sdGlwKSl7dmFyIGU9bnVsbDtpZihiLnRhcmdldD09PWgud2luZG93LmRvY3VtZW50KWMuX19HZW9tZXRyeS5vcmlnaW4uZml4ZWRMaW5lYWdlfHxjLl9fb3B0aW9ucy5yZXBvc2l0aW9uT25TY3JvbGwmJmMucmVwb3NpdGlvbihiKTtlbHNle2U9Yy5fX2dlb21ldHJ5KCk7dmFyIGY9ITE7aWYoXCJmaXhlZFwiIT1jLl8kb3JpZ2luLmNzcyhcInBvc2l0aW9uXCIpJiZjLl9fJG9yaWdpblBhcmVudHMuZWFjaChmdW5jdGlvbihiLGMpe3ZhciBkPWEoYyksZz1kLmNzcyhcIm92ZXJmbG93LXhcIiksaD1kLmNzcyhcIm92ZXJmbG93LXlcIik7aWYoXCJ2aXNpYmxlXCIhPWd8fFwidmlzaWJsZVwiIT1oKXt2YXIgaT1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKFwidmlzaWJsZVwiIT1nJiYoZS5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQ8aS5sZWZ0fHxlLm9yaWdpbi53aW5kb3dPZmZzZXQucmlnaHQ+aS5yaWdodCkpcmV0dXJuIGY9ITAsITE7aWYoXCJ2aXNpYmxlXCIhPWgmJihlLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wPGkudG9wfHxlLm9yaWdpbi53aW5kb3dPZmZzZXQuYm90dG9tPmkuYm90dG9tKSlyZXR1cm4gZj0hMCwhMX1yZXR1cm5cImZpeGVkXCI9PWQuY3NzKFwicG9zaXRpb25cIik/ITE6dm9pZCAwfSksZiljLl8kdG9vbHRpcC5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJoaWRkZW5cIik7ZWxzZSBpZihjLl8kdG9vbHRpcC5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJ2aXNpYmxlXCIpLGMuX19vcHRpb25zLnJlcG9zaXRpb25PblNjcm9sbCljLnJlcG9zaXRpb24oYik7ZWxzZXt2YXIgZz1lLm9yaWdpbi5vZmZzZXQubGVmdC1jLl9fR2VvbWV0cnkub3JpZ2luLm9mZnNldC5sZWZ0LGk9ZS5vcmlnaW4ub2Zmc2V0LnRvcC1jLl9fR2VvbWV0cnkub3JpZ2luLm9mZnNldC50b3A7Yy5fJHRvb2x0aXAuY3NzKHtsZWZ0OmMuX19sYXN0UG9zaXRpb24uY29vcmQubGVmdCtnLHRvcDpjLl9fbGFzdFBvc2l0aW9uLmNvb3JkLnRvcCtpfSl9fWMuX3RyaWdnZXIoe3R5cGU6XCJzY3JvbGxcIixldmVudDpiLGdlbzplfSl9cmV0dXJuIGN9LF9fc3RhdGVTZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zdGF0ZT1hLHRoaXMuX3RyaWdnZXIoe3R5cGU6XCJzdGF0ZVwiLHN0YXRlOmF9KSx0aGlzfSxfX3RpbWVvdXRzQ2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gY2xlYXJUaW1lb3V0KHRoaXMuX190aW1lb3V0cy5vcGVuKSx0aGlzLl9fdGltZW91dHMub3Blbj1udWxsLGEuZWFjaCh0aGlzLl9fdGltZW91dHMuY2xvc2UsZnVuY3Rpb24oYSxiKXtjbGVhclRpbWVvdXQoYil9KSx0aGlzLl9fdGltZW91dHMuY2xvc2U9W10sdGhpc30sX190cmFja2VyU3RhcnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5fJHRvb2x0aXAuZmluZChcIi50b29sdGlwc3Rlci1jb250ZW50XCIpO3JldHVybiBhLl9fb3B0aW9ucy50cmFja1Rvb2x0aXAmJihhLl9fY29udGVudEJjcj1iWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxhLl9fdHJhY2tlcj1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2lmKGQoYS5fJG9yaWdpbikmJmQoYS5fJHRvb2x0aXApKXtpZihhLl9fb3B0aW9ucy50cmFja09yaWdpbil7dmFyIGU9YS5fX2dlb21ldHJ5KCksZj0hMTtjKGUub3JpZ2luLnNpemUsYS5fX0dlb21ldHJ5Lm9yaWdpbi5zaXplKSYmKGEuX19HZW9tZXRyeS5vcmlnaW4uZml4ZWRMaW5lYWdlP2MoZS5vcmlnaW4ud2luZG93T2Zmc2V0LGEuX19HZW9tZXRyeS5vcmlnaW4ud2luZG93T2Zmc2V0KSYmKGY9ITApOmMoZS5vcmlnaW4ub2Zmc2V0LGEuX19HZW9tZXRyeS5vcmlnaW4ub2Zmc2V0KSYmKGY9ITApKSxmfHwoYS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLm1vdXNlbGVhdmU/YS5fY2xvc2UoKTphLnJlcG9zaXRpb24oKSl9aWYoYS5fX29wdGlvbnMudHJhY2tUb29sdGlwKXt2YXIgZz1iWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2cuaGVpZ2h0PT09YS5fX2NvbnRlbnRCY3IuaGVpZ2h0JiZnLndpZHRoPT09YS5fX2NvbnRlbnRCY3Iud2lkdGh8fChhLnJlcG9zaXRpb24oKSxhLl9fY29udGVudEJjcj1nKX19ZWxzZSBhLl9jbG9zZSgpfSxhLl9fb3B0aW9ucy50cmFja2VySW50ZXJ2YWwpLGF9LF9jbG9zZTpmdW5jdGlvbihiLGMsZCl7dmFyIGU9dGhpcyxmPSEwO2lmKGUuX3RyaWdnZXIoe3R5cGU6XCJjbG9zZVwiLGV2ZW50OmIsc3RvcDpmdW5jdGlvbigpe2Y9ITF9fSksZnx8ZCl7YyYmZS5fX2NhbGxiYWNrcy5jbG9zZS5wdXNoKGMpLGUuX19jYWxsYmFja3Mub3Blbj1bXSxlLl9fdGltZW91dHNDbGVhcigpO3ZhciBnPWZ1bmN0aW9uKCl7YS5lYWNoKGUuX19jYWxsYmFja3MuY2xvc2UsZnVuY3Rpb24oYSxjKXtjLmNhbGwoZSxlLHtldmVudDpiLG9yaWdpbjplLl8kb3JpZ2luWzBdfSl9KSxlLl9fY2FsbGJhY2tzLmNsb3NlPVtdfTtpZihcImNsb3NlZFwiIT1lLl9fc3RhdGUpe3ZhciBpPSEwLGo9bmV3IERhdGUsaz1qLmdldFRpbWUoKSxsPWsrZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMV07aWYoXCJkaXNhcHBlYXJpbmdcIj09ZS5fX3N0YXRlJiZsPmUuX19jbG9zaW5nVGltZSYmZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMV0+MCYmKGk9ITEpLGkpe2UuX19jbG9zaW5nVGltZT1sLFwiZGlzYXBwZWFyaW5nXCIhPWUuX19zdGF0ZSYmZS5fX3N0YXRlU2V0KFwiZGlzYXBwZWFyaW5nXCIpO3ZhciBtPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChlLl9fdHJhY2tlciksZS5fdHJpZ2dlcih7dHlwZTpcImNsb3NpbmdcIixldmVudDpifSksZS5fJHRvb2x0aXAub2ZmKFwiLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlXCIpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItZHlpbmdcIiksYShoLndpbmRvdykub2ZmKFwiLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlXCIpLGUuX18kb3JpZ2luUGFyZW50cy5lYWNoKGZ1bmN0aW9uKGIsYyl7YShjKS5vZmYoXCJzY3JvbGwuXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2VcIil9KSxlLl9fJG9yaWdpblBhcmVudHM9bnVsbCxhKGgud2luZG93LmRvY3VtZW50LmJvZHkpLm9mZihcIi5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiKSxlLl8kb3JpZ2luLm9mZihcIi5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiKSxlLl9vZmYoXCJkaXNtaXNzYWJsZVwiKSxlLl9fc3RhdGVTZXQoXCJjbG9zZWRcIiksZS5fdHJpZ2dlcih7dHlwZTpcImFmdGVyXCIsZXZlbnQ6Yn0pLGUuX19vcHRpb25zLmZ1bmN0aW9uQWZ0ZXImJmUuX19vcHRpb25zLmZ1bmN0aW9uQWZ0ZXIuY2FsbChlLGUse2V2ZW50OmIsb3JpZ2luOmUuXyRvcmlnaW5bMF19KSxnKCl9O2guaGFzVHJhbnNpdGlvbnM/KGUuXyR0b29sdGlwLmNzcyh7XCItbW96LWFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzFdK1wibXNcIixcIi1tcy1hbmltYXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblsxXStcIm1zXCIsXCItby1hbmltYXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblsxXStcIm1zXCIsXCItd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzFdK1wibXNcIixcImFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzFdK1wibXNcIixcInRyYW5zaXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblsxXStcIm1zXCJ9KSxlLl8kdG9vbHRpcC5jbGVhclF1ZXVlKCkucmVtb3ZlQ2xhc3MoXCJ0b29sdGlwc3Rlci1zaG93XCIpLmFkZENsYXNzKFwidG9vbHRpcHN0ZXItZHlpbmdcIiksZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMV0+MCYmZS5fJHRvb2x0aXAuZGVsYXkoZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMV0pLGUuXyR0b29sdGlwLnF1ZXVlKG0pKTplLl8kdG9vbHRpcC5zdG9wKCkuZmFkZU91dChlLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblsxXSxtKX19ZWxzZSBnKCl9cmV0dXJuIGV9LF9vZmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fXyRlbWl0dGVyUHJpdmF0ZS5vZmYuYXBwbHkodGhpcy5fXyRlbWl0dGVyUHJpdmF0ZSxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sX29uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX18kZW1pdHRlclByaXZhdGUub24uYXBwbHkodGhpcy5fXyRlbWl0dGVyUHJpdmF0ZSxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sX29uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLm9uZS5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpKSx0aGlzfSxfb3BlbjpmdW5jdGlvbihiLGMpe3ZhciBlPXRoaXM7aWYoIWUuX19kZXN0cm95aW5nJiZkKGUuXyRvcmlnaW4pJiZlLl9fZW5hYmxlZCl7dmFyIGY9ITA7aWYoXCJjbG9zZWRcIj09ZS5fX3N0YXRlJiYoZS5fdHJpZ2dlcih7dHlwZTpcImJlZm9yZVwiLGV2ZW50OmIsc3RvcDpmdW5jdGlvbigpe2Y9ITF9fSksZiYmZS5fX29wdGlvbnMuZnVuY3Rpb25CZWZvcmUmJihmPWUuX19vcHRpb25zLmZ1bmN0aW9uQmVmb3JlLmNhbGwoZSxlLHtldmVudDpiLG9yaWdpbjplLl8kb3JpZ2luWzBdfSkpKSxmIT09ITEmJm51bGwhPT1lLl9fQ29udGVudCl7YyYmZS5fX2NhbGxiYWNrcy5vcGVuLnB1c2goYyksZS5fX2NhbGxiYWNrcy5jbG9zZT1bXSxlLl9fdGltZW91dHNDbGVhcigpO3ZhciBnLGk9ZnVuY3Rpb24oKXtcInN0YWJsZVwiIT1lLl9fc3RhdGUmJmUuX19zdGF0ZVNldChcInN0YWJsZVwiKSxhLmVhY2goZS5fX2NhbGxiYWNrcy5vcGVuLGZ1bmN0aW9uKGEsYil7Yi5jYWxsKGUsZSx7b3JpZ2luOmUuXyRvcmlnaW5bMF0sdG9vbHRpcDplLl8kdG9vbHRpcFswXX0pfSksZS5fX2NhbGxiYWNrcy5vcGVuPVtdfTtpZihcImNsb3NlZFwiIT09ZS5fX3N0YXRlKWc9MCxcImRpc2FwcGVhcmluZ1wiPT09ZS5fX3N0YXRlPyhlLl9fc3RhdGVTZXQoXCJhcHBlYXJpbmdcIiksaC5oYXNUcmFuc2l0aW9ucz8oZS5fJHRvb2x0aXAuY2xlYXJRdWV1ZSgpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItZHlpbmdcIikuYWRkQ2xhc3MoXCJ0b29sdGlwc3Rlci1zaG93XCIpLGUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdPjAmJmUuXyR0b29sdGlwLmRlbGF5KGUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdKSxlLl8kdG9vbHRpcC5xdWV1ZShpKSk6ZS5fJHRvb2x0aXAuc3RvcCgpLmZhZGVJbihpKSk6XCJzdGFibGVcIj09ZS5fX3N0YXRlJiZpKCk7ZWxzZXtpZihlLl9fc3RhdGVTZXQoXCJhcHBlYXJpbmdcIiksZz1lLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXSxlLl9fY29udGVudEluc2VydCgpLGUucmVwb3NpdGlvbihiLCEwKSxoLmhhc1RyYW5zaXRpb25zPyhlLl8kdG9vbHRpcC5hZGRDbGFzcyhcInRvb2x0aXBzdGVyLVwiK2UuX19vcHRpb25zLmFuaW1hdGlvbikuYWRkQ2xhc3MoXCJ0b29sdGlwc3Rlci1pbml0aWFsXCIpLmNzcyh7XCItbW96LWFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdK1wibXNcIixcIi1tcy1hbmltYXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXStcIm1zXCIsXCItby1hbmltYXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXStcIm1zXCIsXCItd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdK1wibXNcIixcImFuaW1hdGlvbi1kdXJhdGlvblwiOmUuX19vcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uWzBdK1wibXNcIixcInRyYW5zaXRpb24tZHVyYXRpb25cIjplLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXStcIm1zXCJ9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XCJjbG9zZWRcIiE9ZS5fX3N0YXRlJiYoZS5fJHRvb2x0aXAuYWRkQ2xhc3MoXCJ0b29sdGlwc3Rlci1zaG93XCIpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItaW5pdGlhbFwiKSxlLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXT4wJiZlLl8kdG9vbHRpcC5kZWxheShlLl9fb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvblswXSksZS5fJHRvb2x0aXAucXVldWUoaSkpfSwwKSk6ZS5fJHRvb2x0aXAuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKS5mYWRlSW4oZS5fX29wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb25bMF0saSksZS5fX3RyYWNrZXJTdGFydCgpLGEoaC53aW5kb3cpLm9uKFwicmVzaXplLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlXCIsZnVuY3Rpb24oYil7dmFyIGM9YShkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsoYy5pcyhcImlucHV0XCIpfHxjLmlzKFwidGV4dGFyZWFcIikpJiZhLmNvbnRhaW5zKGUuXyR0b29sdGlwWzBdLGNbMF0pfHxlLnJlcG9zaXRpb24oYil9KS5vbihcInNjcm9sbC5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiLGZ1bmN0aW9uKGEpe2UuX19zY3JvbGxIYW5kbGVyKGEpfSksZS5fXyRvcmlnaW5QYXJlbnRzPWUuXyRvcmlnaW4ucGFyZW50cygpLGUuX18kb3JpZ2luUGFyZW50cy5lYWNoKGZ1bmN0aW9uKGIsYyl7YShjKS5vbihcInNjcm9sbC5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiLGZ1bmN0aW9uKGEpe2UuX19zY3JvbGxIYW5kbGVyKGEpfSl9KSxlLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UubW91c2VsZWF2ZXx8ZS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLnRvdWNobGVhdmUmJmguaGFzVG91Y2hDYXBhYmlsaXR5KXtlLl9vbihcImRpc21pc3NhYmxlXCIsZnVuY3Rpb24oYSl7YS5kaXNtaXNzYWJsZT9hLmRlbGF5PyhtPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9jbG9zZShhLmV2ZW50KX0sYS5kZWxheSksZS5fX3RpbWVvdXRzLmNsb3NlLnB1c2gobSkpOmUuX2Nsb3NlKGEpOmNsZWFyVGltZW91dChtKX0pO3ZhciBqPWUuXyRvcmlnaW4saz1cIlwiLGw9XCJcIixtPW51bGw7ZS5fX29wdGlvbnMuaW50ZXJhY3RpdmUmJihqPWouYWRkKGUuXyR0b29sdGlwKSksZS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLm1vdXNlbGVhdmUmJihrKz1cIm1vdXNlZW50ZXIuXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2UgXCIsbCs9XCJtb3VzZWxlYXZlLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlIFwiKSxlLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UudG91Y2hsZWF2ZSYmaC5oYXNUb3VjaENhcGFiaWxpdHkmJihrKz1cInRvdWNoc3RhcnQuXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2VcIixsKz1cInRvdWNoZW5kLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlIHRvdWNoY2FuY2VsLlwiK2UuX19uYW1lc3BhY2UrXCItdHJpZ2dlckNsb3NlXCIpLGoub24obCxmdW5jdGlvbihhKXtpZihlLl90b3VjaElzVG91Y2hFdmVudChhKXx8IWUuX3RvdWNoSXNFbXVsYXRlZEV2ZW50KGEpKXt2YXIgYj1cIm1vdXNlbGVhdmVcIj09YS50eXBlP2UuX19vcHRpb25zLmRlbGF5OmUuX19vcHRpb25zLmRlbGF5VG91Y2g7ZS5fdHJpZ2dlcih7ZGVsYXk6YlsxXSxkaXNtaXNzYWJsZTohMCxldmVudDphLHR5cGU6XCJkaXNtaXNzYWJsZVwifSl9fSkub24oayxmdW5jdGlvbihhKXshZS5fdG91Y2hJc1RvdWNoRXZlbnQoYSkmJmUuX3RvdWNoSXNFbXVsYXRlZEV2ZW50KGEpfHxlLl90cmlnZ2VyKHtkaXNtaXNzYWJsZTohMSxldmVudDphLHR5cGU6XCJkaXNtaXNzYWJsZVwifSl9KX1lLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2Uub3JpZ2luQ2xpY2smJmUuXyRvcmlnaW4ub24oXCJjbGljay5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiLGZ1bmN0aW9uKGEpe2UuX3RvdWNoSXNUb3VjaEV2ZW50KGEpfHxlLl90b3VjaElzRW11bGF0ZWRFdmVudChhKXx8ZS5fY2xvc2UoYSl9KSwoZS5fX29wdGlvbnMudHJpZ2dlckNsb3NlLmNsaWNrfHxlLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UudGFwJiZoLmhhc1RvdWNoQ2FwYWJpbGl0eSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihcImNsb3NlZFwiIT1lLl9fc3RhdGUpe3ZhciBiPVwiXCIsYz1hKGgud2luZG93LmRvY3VtZW50LmJvZHkpO2UuX19vcHRpb25zLnRyaWdnZXJDbG9zZS5jbGljayYmKGIrPVwiY2xpY2suXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2UgXCIpLGUuX19vcHRpb25zLnRyaWdnZXJDbG9zZS50YXAmJmguaGFzVG91Y2hDYXBhYmlsaXR5JiYoYis9XCJ0b3VjaGVuZC5cIitlLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJDbG9zZVwiKSxjLm9uKGIsZnVuY3Rpb24oYil7ZS5fdG91Y2hJc01lYW5pbmdmdWxFdmVudChiKSYmKGUuX3RvdWNoUmVjb3JkRXZlbnQoYiksZS5fX29wdGlvbnMuaW50ZXJhY3RpdmUmJmEuY29udGFpbnMoZS5fJHRvb2x0aXBbMF0sYi50YXJnZXQpfHxlLl9jbG9zZShiKSl9KSxlLl9fb3B0aW9ucy50cmlnZ2VyQ2xvc2UudGFwJiZoLmhhc1RvdWNoQ2FwYWJpbGl0eSYmYy5vbihcInRvdWNoc3RhcnQuXCIrZS5fX25hbWVzcGFjZStcIi10cmlnZ2VyQ2xvc2VcIixmdW5jdGlvbihhKXtlLl90b3VjaFJlY29yZEV2ZW50KGEpfSl9fSwwKSxlLl90cmlnZ2VyKFwicmVhZHlcIiksZS5fX29wdGlvbnMuZnVuY3Rpb25SZWFkeSYmZS5fX29wdGlvbnMuZnVuY3Rpb25SZWFkeS5jYWxsKGUsZSx7b3JpZ2luOmUuXyRvcmlnaW5bMF0sdG9vbHRpcDplLl8kdG9vbHRpcFswXX0pfWlmKGUuX19vcHRpb25zLnRpbWVyPjApe3ZhciBtPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9jbG9zZSgpfSxlLl9fb3B0aW9ucy50aW1lcitnKTtlLl9fdGltZW91dHMuY2xvc2UucHVzaChtKX19fXJldHVybiBlfSxfb3BlblNob3J0bHk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPSEwO2lmKFwic3RhYmxlXCIhPWIuX19zdGF0ZSYmXCJhcHBlYXJpbmdcIiE9Yi5fX3N0YXRlJiYhYi5fX3RpbWVvdXRzLm9wZW4mJihiLl90cmlnZ2VyKHt0eXBlOlwic3RhcnRcIixldmVudDphLHN0b3A6ZnVuY3Rpb24oKXtjPSExfX0pLGMpKXt2YXIgZD0wPT1hLnR5cGUuaW5kZXhPZihcInRvdWNoXCIpP2IuX19vcHRpb25zLmRlbGF5VG91Y2g6Yi5fX29wdGlvbnMuZGVsYXk7ZFswXT9iLl9fdGltZW91dHMub3Blbj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5fX3RpbWVvdXRzLm9wZW49bnVsbCxiLl9fcG9pbnRlcklzT3Zlck9yaWdpbiYmYi5fdG91Y2hJc01lYW5pbmdmdWxFdmVudChhKT8oYi5fdHJpZ2dlcihcInN0YXJ0ZW5kXCIpLGIuX29wZW4oYSkpOmIuX3RyaWdnZXIoXCJzdGFydGNhbmNlbFwiKX0sZFswXSk6KGIuX3RyaWdnZXIoXCJzdGFydGVuZFwiKSxiLl9vcGVuKGEpKX1yZXR1cm4gYn0sX29wdGlvbnNFeHRyYWN0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcyxlPWEuZXh0ZW5kKCEwLHt9LGMpLGY9ZC5fX29wdGlvbnNbYl07cmV0dXJuIGZ8fChmPXt9LGEuZWFjaChjLGZ1bmN0aW9uKGEsYil7dmFyIGM9ZC5fX29wdGlvbnNbYV07dm9pZCAwIT09YyYmKGZbYV09Yyl9KSksYS5lYWNoKGUsZnVuY3Rpb24oYixjKXt2b2lkIDAhPT1mW2JdJiYoXCJvYmplY3RcIiE9dHlwZW9mIGN8fGMgaW5zdGFuY2VvZiBBcnJheXx8bnVsbD09Y3x8XCJvYmplY3RcIiE9dHlwZW9mIGZbYl18fGZbYl1pbnN0YW5jZW9mIEFycmF5fHxudWxsPT1mW2JdP2VbYl09ZltiXTphLmV4dGVuZChlW2JdLGZbYl0pKX0pLGV9LF9wbHVnOmZ1bmN0aW9uKGIpe3ZhciBjPWEudG9vbHRpcHN0ZXIuX3BsdWdpbihiKTtpZighYyl0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcIicrYisnXCIgcGx1Z2luIGlzIG5vdCBkZWZpbmVkJyk7cmV0dXJuIGMuaW5zdGFuY2UmJmEudG9vbHRpcHN0ZXIuX19icmlkZ2UoYy5pbnN0YW5jZSx0aGlzLGMubmFtZSksdGhpc30sX3RvdWNoSXNFbXVsYXRlZEV2ZW50OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMSxjPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGQ9dGhpcy5fX3RvdWNoRXZlbnRzLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgZT10aGlzLl9fdG91Y2hFdmVudHNbZF07aWYoIShjLWUudGltZTw1MDApKWJyZWFrO2UudGFyZ2V0PT09YS50YXJnZXQmJihiPSEwKX1yZXR1cm4gYn0sX3RvdWNoSXNNZWFuaW5nZnVsRXZlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3RvdWNoSXNUb3VjaEV2ZW50KGEpJiYhdGhpcy5fdG91Y2hTd2lwZWQoYS50YXJnZXQpfHwhdGhpcy5fdG91Y2hJc1RvdWNoRXZlbnQoYSkmJiF0aGlzLl90b3VjaElzRW11bGF0ZWRFdmVudChhKX0sX3RvdWNoSXNUb3VjaEV2ZW50OmZ1bmN0aW9uKGEpe3JldHVybiAwPT1hLnR5cGUuaW5kZXhPZihcInRvdWNoXCIpfSxfdG91Y2hSZWNvcmRFdmVudDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fdG91Y2hJc1RvdWNoRXZlbnQoYSkmJihhLnRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCksdGhpcy5fX3RvdWNoRXZlbnRzLnB1c2goYSkpLHRoaXN9LF90b3VjaFN3aXBlZDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITEsYz10aGlzLl9fdG91Y2hFdmVudHMubGVuZ3RoLTE7Yz49MDtjLS0pe3ZhciBkPXRoaXMuX190b3VjaEV2ZW50c1tjXTtpZihcInRvdWNobW92ZVwiPT1kLnR5cGUpe2I9ITA7YnJlYWt9aWYoXCJ0b3VjaHN0YXJ0XCI9PWQudHlwZSYmYT09PWQudGFyZ2V0KWJyZWFrfXJldHVybiBifSxfdHJpZ2dlcjpmdW5jdGlvbigpe3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpO3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBiWzBdJiYoYlswXT17dHlwZTpiWzBdfSksYlswXS5pbnN0YW5jZT10aGlzLGJbMF0ub3JpZ2luPXRoaXMuXyRvcmlnaW4/dGhpcy5fJG9yaWdpblswXTpudWxsLGJbMF0udG9vbHRpcD10aGlzLl8kdG9vbHRpcD90aGlzLl8kdG9vbHRpcFswXTpudWxsLHRoaXMuX18kZW1pdHRlclByaXZhdGUudHJpZ2dlci5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQcml2YXRlLGIpLGEudG9vbHRpcHN0ZXIuX3RyaWdnZXIuYXBwbHkoYS50b29sdGlwc3RlcixiKSx0aGlzLl9fJGVtaXR0ZXJQdWJsaWMudHJpZ2dlci5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsYiksdGhpc30sX3VucGx1ZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzO2lmKGNbYl0pe3ZhciBkPWEudG9vbHRpcHN0ZXIuX3BsdWdpbihiKTtkLmluc3RhbmNlJiZhLmVhY2goZC5pbnN0YW5jZSxmdW5jdGlvbihhLGQpe2NbYV0mJmNbYV0uYnJpZGdlZD09PWNbYl0mJmRlbGV0ZSBjW2FdfSksY1tiXS5fX2Rlc3Ryb3kmJmNbYl0uX19kZXN0cm95KCksZGVsZXRlIGNbYl19cmV0dXJuIGN9LGNsb3NlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9fZGVzdHJveWVkP3RoaXMuX19kZXN0cm95RXJyb3IoKTp0aGlzLl9jbG9zZShudWxsLGEpLHRoaXN9LGNvbnRlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztpZih2b2lkIDA9PT1hKXJldHVybiBiLl9fQ29udGVudDtpZihiLl9fZGVzdHJveWVkKWIuX19kZXN0cm95RXJyb3IoKTtlbHNlIGlmKGIuX19jb250ZW50U2V0KGEpLG51bGwhPT1iLl9fQ29udGVudCl7aWYoXCJjbG9zZWRcIiE9PWIuX19zdGF0ZSYmKGIuX19jb250ZW50SW5zZXJ0KCksYi5yZXBvc2l0aW9uKCksYi5fX29wdGlvbnMudXBkYXRlQW5pbWF0aW9uKSlpZihoLmhhc1RyYW5zaXRpb25zKXt2YXIgYz1iLl9fb3B0aW9ucy51cGRhdGVBbmltYXRpb247Yi5fJHRvb2x0aXAuYWRkQ2xhc3MoXCJ0b29sdGlwc3Rlci11cGRhdGUtXCIrYyksc2V0VGltZW91dChmdW5jdGlvbigpe1wiY2xvc2VkXCIhPWIuX19zdGF0ZSYmYi5fJHRvb2x0aXAucmVtb3ZlQ2xhc3MoXCJ0b29sdGlwc3Rlci11cGRhdGUtXCIrYyl9LDFlMyl9ZWxzZSBiLl8kdG9vbHRpcC5mYWRlVG8oMjAwLC41LGZ1bmN0aW9uKCl7XCJjbG9zZWRcIiE9Yi5fX3N0YXRlJiZiLl8kdG9vbHRpcC5mYWRlVG8oMjAwLDEpfSl9ZWxzZSBiLl9jbG9zZSgpO3JldHVybiBifSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcztpZihiLl9fZGVzdHJveWVkKWIuX19kZXN0cm95RXJyb3IoKTtlbHNle1wiY2xvc2VkXCIhPWIuX19zdGF0ZT9iLm9wdGlvbihcImFuaW1hdGlvbkR1cmF0aW9uXCIsMCkuX2Nsb3NlKG51bGwsbnVsbCwhMCk6Yi5fX3RpbWVvdXRzQ2xlYXIoKSxiLl90cmlnZ2VyKFwiZGVzdHJveVwiKSxiLl9fZGVzdHJveWVkPSEwLGIuXyRvcmlnaW4ucmVtb3ZlRGF0YShiLl9fbmFtZXNwYWNlKS5vZmYoXCIuXCIrYi5fX25hbWVzcGFjZStcIi10cmlnZ2VyT3BlblwiKSxhKGgud2luZG93LmRvY3VtZW50LmJvZHkpLm9mZihcIi5cIitiLl9fbmFtZXNwYWNlK1wiLXRyaWdnZXJPcGVuXCIpO3ZhciBjPWIuXyRvcmlnaW4uZGF0YShcInRvb2x0aXBzdGVyLW5zXCIpO2lmKGMpaWYoMT09PWMubGVuZ3RoKXt2YXIgZD1udWxsO1wicHJldmlvdXNcIj09Yi5fX29wdGlvbnMucmVzdG9yYXRpb24/ZD1iLl8kb3JpZ2luLmRhdGEoXCJ0b29sdGlwc3Rlci1pbml0aWFsVGl0bGVcIik6XCJjdXJyZW50XCI9PWIuX19vcHRpb25zLnJlc3RvcmF0aW9uJiYoZD1cInN0cmluZ1wiPT10eXBlb2YgYi5fX0NvbnRlbnQ/Yi5fX0NvbnRlbnQ6YShcIjxkaXY+PC9kaXY+XCIpLmFwcGVuZChiLl9fQ29udGVudCkuaHRtbCgpKSxkJiZiLl8kb3JpZ2luLmF0dHIoXCJ0aXRsZVwiLGQpLGIuXyRvcmlnaW4ucmVtb3ZlQ2xhc3MoXCJ0b29sdGlwc3RlcmVkXCIpLGIuXyRvcmlnaW4ucmVtb3ZlRGF0YShcInRvb2x0aXBzdGVyLW5zXCIpLnJlbW92ZURhdGEoXCJ0b29sdGlwc3Rlci1pbml0aWFsVGl0bGVcIil9ZWxzZSBjPWEuZ3JlcChjLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEhPT1iLl9fbmFtZXNwYWNlfSksYi5fJG9yaWdpbi5kYXRhKFwidG9vbHRpcHN0ZXItbnNcIixjKTtiLl90cmlnZ2VyKFwiZGVzdHJveWVkXCIpLGIuX29mZigpLGIub2ZmKCksYi5fX0NvbnRlbnQ9bnVsbCxiLl9fJGVtaXR0ZXJQcml2YXRlPW51bGwsYi5fXyRlbWl0dGVyUHVibGljPW51bGwsYi5fX29wdGlvbnMucGFyZW50PW51bGwsYi5fJG9yaWdpbj1udWxsLGIuXyR0b29sdGlwPW51bGwsYS50b29sdGlwc3Rlci5fX2luc3RhbmNlc0xhdGVzdEFycj1hLmdyZXAoYS50b29sdGlwc3Rlci5fX2luc3RhbmNlc0xhdGVzdEFycixmdW5jdGlvbihhLGMpe3JldHVybiBiIT09YX0pLGNsZWFySW50ZXJ2YWwoYi5fX2dhcmJhZ2VDb2xsZWN0b3IpfXJldHVybiBifSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19kZXN0cm95ZWQ/KHRoaXMuX19kZXN0cm95RXJyb3IoKSx0aGlzKToodGhpcy5fY2xvc2UoKSx0aGlzLl9fZW5hYmxlZD0hMSx0aGlzKX0sZWxlbWVudE9yaWdpbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZGVzdHJveWVkP3ZvaWQgdGhpcy5fX2Rlc3Ryb3lFcnJvcigpOnRoaXMuXyRvcmlnaW5bMF19LGVsZW1lbnRUb29sdGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXyR0b29sdGlwP3RoaXMuXyR0b29sdGlwWzBdOm51bGx9LGVuYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZW5hYmxlZD0hMCx0aGlzfSxoaWRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNsb3NlKGEpfSxpbnN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2Rlc3Ryb3llZHx8dGhpcy5fXyRlbWl0dGVyUHVibGljLm9mZi5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9LG9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19kZXN0cm95ZWQ/dGhpcy5fX2Rlc3Ryb3lFcnJvcigpOnRoaXMuX18kZW1pdHRlclB1YmxpYy5vbi5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9LG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZGVzdHJveWVkP3RoaXMuX19kZXN0cm95RXJyb3IoKTp0aGlzLl9fJGVtaXR0ZXJQdWJsaWMub25lLmFwcGx5KHRoaXMuX18kZW1pdHRlclB1YmxpYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSksdGhpc30sb3BlbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX2Rlc3Ryb3llZD90aGlzLl9fZGVzdHJveUVycm9yKCk6dGhpcy5fb3BlbihudWxsLGEpLHRoaXN9LG9wdGlvbjpmdW5jdGlvbihiLGMpe3JldHVybiB2b2lkIDA9PT1jP3RoaXMuX19vcHRpb25zW2JdOih0aGlzLl9fZGVzdHJveWVkP3RoaXMuX19kZXN0cm95RXJyb3IoKToodGhpcy5fX29wdGlvbnNbYl09Yyx0aGlzLl9fb3B0aW9uc0Zvcm1hdCgpLGEuaW5BcnJheShiLFtcInRyaWdnZXJcIixcInRyaWdnZXJDbG9zZVwiLFwidHJpZ2dlck9wZW5cIl0pPj0wJiZ0aGlzLl9fcHJlcGFyZU9yaWdpbigpLFwic2VsZkRlc3RydWN0aW9uXCI9PT1iJiZ0aGlzLl9fcHJlcGFyZUdDKCkpLHRoaXMpfSxyZXBvc2l0aW9uOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztyZXR1cm4gYy5fX2Rlc3Ryb3llZD9jLl9fZGVzdHJveUVycm9yKCk6XCJjbG9zZWRcIiE9Yy5fX3N0YXRlJiZkKGMuXyRvcmlnaW4pJiYoYnx8ZChjLl8kdG9vbHRpcCkpJiYoYnx8Yy5fJHRvb2x0aXAuZGV0YWNoKCksYy5fX0dlb21ldHJ5PWMuX19nZW9tZXRyeSgpLGMuX3RyaWdnZXIoe3R5cGU6XCJyZXBvc2l0aW9uXCIsZXZlbnQ6YSxoZWxwZXI6e2dlbzpjLl9fR2VvbWV0cnl9fSkpLGN9LHNob3c6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub3BlbihhKX0sc3RhdHVzOmZ1bmN0aW9uKCl7cmV0dXJue2Rlc3Ryb3llZDp0aGlzLl9fZGVzdHJveWVkLGVuYWJsZWQ6dGhpcy5fX2VuYWJsZWQsb3BlbjpcImNsb3NlZFwiIT09dGhpcy5fX3N0YXRlLHN0YXRlOnRoaXMuX19zdGF0ZX19LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19kZXN0cm95ZWQ/dGhpcy5fX2Rlc3Ryb3lFcnJvcigpOnRoaXMuX18kZW1pdHRlclB1YmxpYy50cmlnZ2VySGFuZGxlci5hcHBseSh0aGlzLl9fJGVtaXR0ZXJQdWJsaWMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpLHRoaXN9fSxhLmZuLnRvb2x0aXBzdGVyPWZ1bmN0aW9uKCl7dmFyIGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cyksYz1cIllvdSBhcmUgdXNpbmcgYSBzaW5nbGUgSFRNTCBlbGVtZW50IGFzIGNvbnRlbnQgZm9yIHNldmVyYWwgdG9vbHRpcHMuIFlvdSBwcm9iYWJseSB3YW50IHRvIHNldCB0aGUgY29udGVudENsb25pbmcgb3B0aW9uIHRvIFRSVUUuXCI7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBiWzBdKXt2YXIgZD1cIiMqJH4mXCI7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWEodGhpcykuZGF0YShcInRvb2x0aXBzdGVyLW5zXCIpLGY9ZT9hKHRoaXMpLmRhdGEoZVswXSk6bnVsbDtpZighZil0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2FsbGVkIFRvb2x0aXBzdGVyJ3MgXFxcIlwiK2JbMF0rJ1wiIG1ldGhvZCBvbiBhbiB1bmluaXRpYWxpemVkIGVsZW1lbnQnKTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBmW2JbMF1dKXRocm93IG5ldyBFcnJvcignVW5rbm93biBtZXRob2QgXCInK2JbMF0rJ1wiJyk7dGhpcy5sZW5ndGg+MSYmXCJjb250ZW50XCI9PWJbMF0mJihiWzFdaW5zdGFuY2VvZiBhfHxcIm9iamVjdFwiPT10eXBlb2YgYlsxXSYmbnVsbCE9YlsxXSYmYlsxXS50YWdOYW1lKSYmIWYuX19vcHRpb25zLmNvbnRlbnRDbG9uaW5nJiZmLl9fb3B0aW9ucy5kZWJ1ZyYmY29uc29sZS5sb2coYyk7dmFyIGc9ZltiWzBdXShiWzFdLGJbMl0pO3JldHVybiBnIT09Znx8XCJpbnN0YW5jZVwiPT09YlswXT8oZD1nLCExKTp2b2lkIDB9KSxcIiMqJH4mXCIhPT1kP2Q6dGhpc31hLnRvb2x0aXBzdGVyLl9faW5zdGFuY2VzTGF0ZXN0QXJyPVtdO3ZhciBlPWJbMF0mJnZvaWQgMCE9PWJbMF0ubXVsdGlwbGUsZz1lJiZiWzBdLm11bHRpcGxlfHwhZSYmZi5tdWx0aXBsZSxoPWJbMF0mJnZvaWQgMCE9PWJbMF0uY29udGVudCxpPWgmJmJbMF0uY29udGVudHx8IWgmJmYuY29udGVudCxqPWJbMF0mJnZvaWQgMCE9PWJbMF0uY29udGVudENsb25pbmcsaz1qJiZiWzBdLmNvbnRlbnRDbG9uaW5nfHwhaiYmZi5jb250ZW50Q2xvbmluZyxsPWJbMF0mJnZvaWQgMCE9PWJbMF0uZGVidWcsbT1sJiZiWzBdLmRlYnVnfHwhbCYmZi5kZWJ1ZztyZXR1cm4gdGhpcy5sZW5ndGg+MSYmKGkgaW5zdGFuY2VvZiBhfHxcIm9iamVjdFwiPT10eXBlb2YgaSYmbnVsbCE9aSYmaS50YWdOYW1lKSYmIWsmJm0mJmNvbnNvbGUubG9nKGMpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPSExLGQ9YSh0aGlzKSxlPWQuZGF0YShcInRvb2x0aXBzdGVyLW5zXCIpLGY9bnVsbDtlP2c/Yz0hMDptJiYoY29uc29sZS5sb2coXCJUb29sdGlwc3Rlcjogb25lIG9yIG1vcmUgdG9vbHRpcHMgYXJlIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQgYmVsb3cuIElnbm9yaW5nLlwiKSxjb25zb2xlLmxvZyh0aGlzKSk6Yz0hMCxjJiYoZj1uZXcgYS5Ub29sdGlwc3Rlcih0aGlzLGJbMF0pLGV8fChlPVtdKSxlLnB1c2goZi5fX25hbWVzcGFjZSksZC5kYXRhKFwidG9vbHRpcHN0ZXItbnNcIixlKSxkLmRhdGEoZi5fX25hbWVzcGFjZSxmKSxmLl9fb3B0aW9ucy5mdW5jdGlvbkluaXQmJmYuX19vcHRpb25zLmZ1bmN0aW9uSW5pdC5jYWxsKGYsZix7b3JpZ2luOnRoaXN9KSxmLl90cmlnZ2VyKFwiaW5pdFwiKSksYS50b29sdGlwc3Rlci5fX2luc3RhbmNlc0xhdGVzdEFyci5wdXNoKGYpfSksdGhpc30sYi5wcm90b3R5cGU9e19faW5pdDpmdW5jdGlvbihiKXt0aGlzLl9fJHRvb2x0aXA9Yix0aGlzLl9fJHRvb2x0aXAuY3NzKHtsZWZ0OjAsb3ZlcmZsb3c6XCJoaWRkZW5cIixwb3NpdGlvbjpcImFic29sdXRlXCIsdG9wOjB9KS5maW5kKFwiLnRvb2x0aXBzdGVyLWNvbnRlbnRcIikuY3NzKFwib3ZlcmZsb3dcIixcImF1dG9cIiksdGhpcy4kY29udGFpbmVyPWEoJzxkaXYgY2xhc3M9XCJ0b29sdGlwc3Rlci1ydWxlclwiPjwvZGl2PicpLmFwcGVuZCh0aGlzLl9fJHRvb2x0aXApLmFwcGVuZFRvKGgud2luZG93LmRvY3VtZW50LmJvZHkpfSxfX2ZvcmNlUmVkcmF3OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fXyR0b29sdGlwLnBhcmVudCgpO3RoaXMuX18kdG9vbHRpcC5kZXRhY2goKSx0aGlzLl9fJHRvb2x0aXAuYXBwZW5kVG8oYSl9LGNvbnN0cmFpbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNvbnN0cmFpbnRzPXt3aWR0aDphLGhlaWdodDpifSx0aGlzLl9fJHRvb2x0aXAuY3NzKHtkaXNwbGF5OlwiYmxvY2tcIixoZWlnaHQ6XCJcIixvdmVyZmxvdzpcImF1dG9cIix3aWR0aDphfSksdGhpc30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX18kdG9vbHRpcC5kZXRhY2goKS5maW5kKFwiLnRvb2x0aXBzdGVyLWNvbnRlbnRcIikuY3NzKHtkaXNwbGF5OlwiXCIsb3ZlcmZsb3c6XCJcIn0pLHRoaXMuJGNvbnRhaW5lci5yZW1vdmUoKX0sZnJlZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cmFpbnRzPW51bGwsdGhpcy5fXyR0b29sdGlwLmNzcyh7ZGlzcGxheTpcIlwiLGhlaWdodDpcIlwiLG92ZXJmbG93OlwidmlzaWJsZVwiLHdpZHRoOlwiXCJ9KSx0aGlzfSxtZWFzdXJlOmZ1bmN0aW9uKCl7dGhpcy5fX2ZvcmNlUmVkcmF3KCk7dmFyIGE9dGhpcy5fXyR0b29sdGlwWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGI9e3NpemU6e2hlaWdodDphLmhlaWdodHx8YS5ib3R0b20tYS50b3Asd2lkdGg6YS53aWR0aHx8YS5yaWdodC1hLmxlZnR9fTtpZih0aGlzLmNvbnN0cmFpbnRzKXt2YXIgYz10aGlzLl9fJHRvb2x0aXAuZmluZChcIi50b29sdGlwc3Rlci1jb250ZW50XCIpLGQ9dGhpcy5fXyR0b29sdGlwLm91dGVySGVpZ2h0KCksZT1jWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9e2hlaWdodDpkPD10aGlzLmNvbnN0cmFpbnRzLmhlaWdodCx3aWR0aDphLndpZHRoPD10aGlzLmNvbnN0cmFpbnRzLndpZHRoJiZlLndpZHRoPj1jWzBdLnNjcm9sbFdpZHRoLTF9O2IuZml0cz1mLmhlaWdodCYmZi53aWR0aH1yZXR1cm4gaC5JRSYmaC5JRTw9MTEmJmIuc2l6ZS53aWR0aCE9PWgud2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCYmKGIuc2l6ZS53aWR0aD1NYXRoLmNlaWwoYi5zaXplLndpZHRoKSsxKSxifX07dmFyIGo9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOy0xIT1qLmluZGV4T2YoXCJtc2llXCIpP2guSUU9cGFyc2VJbnQoai5zcGxpdChcIm1zaWVcIilbMV0pOi0xIT09ai50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ0cmlkZW50XCIpJiYtMSE9PWouaW5kZXhPZihcIiBydjoxMVwiKT9oLklFPTExOi0xIT1qLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImVkZ2UvXCIpJiYoaC5JRT1wYXJzZUludChqLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCJlZGdlL1wiKVsxXSkpO3ZhciBrPVwidG9vbHRpcHN0ZXIuc2lkZVRpcFwiO3JldHVybiBhLnRvb2x0aXBzdGVyLl9wbHVnaW4oe25hbWU6ayxpbnN0YW5jZTp7X19kZWZhdWx0czpmdW5jdGlvbigpe3JldHVybnthcnJvdzohMCxkaXN0YW5jZTo2LGZ1bmN0aW9uUG9zaXRpb246bnVsbCxtYXhXaWR0aDpudWxsLG1pbkludGVyc2VjdGlvbjoxNixtaW5XaWR0aDowLHBvc2l0aW9uOm51bGwsc2lkZTpcInRvcFwiLHZpZXdwb3J0QXdhcmU6ITB9fSxfX2luaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLl9faW5zdGFuY2U9YSxiLl9fbmFtZXNwYWNlPVwidG9vbHRpcHN0ZXItc2lkZVRpcC1cIitNYXRoLnJvdW5kKDFlNipNYXRoLnJhbmRvbSgpKSxiLl9fcHJldmlvdXNTdGF0ZT1cImNsb3NlZFwiLGIuX19vcHRpb25zLGIuX19vcHRpb25zRm9ybWF0KCksYi5fX2luc3RhbmNlLl9vbihcInN0YXRlLlwiK2IuX19uYW1lc3BhY2UsZnVuY3Rpb24oYSl7XCJjbG9zZWRcIj09YS5zdGF0ZT9iLl9fY2xvc2UoKTpcImFwcGVhcmluZ1wiPT1hLnN0YXRlJiZcImNsb3NlZFwiPT1iLl9fcHJldmlvdXNTdGF0ZSYmYi5fX2NyZWF0ZSgpLGIuX19wcmV2aW91c1N0YXRlPWEuc3RhdGV9KSxiLl9faW5zdGFuY2UuX29uKFwib3B0aW9ucy5cIitiLl9fbmFtZXNwYWNlLGZ1bmN0aW9uKCl7Yi5fX29wdGlvbnNGb3JtYXQoKX0pLGIuX19pbnN0YW5jZS5fb24oXCJyZXBvc2l0aW9uLlwiK2IuX19uYW1lc3BhY2UsZnVuY3Rpb24oYSl7Yi5fX3JlcG9zaXRpb24oYS5ldmVudCxhLmhlbHBlcil9KX0sX19jbG9zZTpmdW5jdGlvbigpe3RoaXMuX19pbnN0YW5jZS5jb250ZW50KClpbnN0YW5jZW9mIGEmJnRoaXMuX19pbnN0YW5jZS5jb250ZW50KCkuZGV0YWNoKCksdGhpcy5fX2luc3RhbmNlLl8kdG9vbHRpcC5yZW1vdmUoKSx0aGlzLl9faW5zdGFuY2UuXyR0b29sdGlwPW51bGx9LF9fY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9YSgnPGRpdiBjbGFzcz1cInRvb2x0aXBzdGVyLWJhc2UgdG9vbHRpcHN0ZXItc2lkZXRpcFwiPjxkaXYgY2xhc3M9XCJ0b29sdGlwc3Rlci1ib3hcIj48ZGl2IGNsYXNzPVwidG9vbHRpcHN0ZXItY29udGVudFwiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9XCJ0b29sdGlwc3Rlci1hcnJvd1wiPjxkaXYgY2xhc3M9XCJ0b29sdGlwc3Rlci1hcnJvdy11bmNyb3BwZWRcIj48ZGl2IGNsYXNzPVwidG9vbHRpcHN0ZXItYXJyb3ctYm9yZGVyXCI+PC9kaXY+PGRpdiBjbGFzcz1cInRvb2x0aXBzdGVyLWFycm93LWJhY2tncm91bmRcIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTt0aGlzLl9fb3B0aW9ucy5hcnJvd3x8Yi5maW5kKFwiLnRvb2x0aXBzdGVyLWJveFwiKS5jc3MoXCJtYXJnaW5cIiwwKS5lbmQoKS5maW5kKFwiLnRvb2x0aXBzdGVyLWFycm93XCIpLmhpZGUoKSx0aGlzLl9fb3B0aW9ucy5taW5XaWR0aCYmYi5jc3MoXCJtaW4td2lkdGhcIix0aGlzLl9fb3B0aW9ucy5taW5XaWR0aCtcInB4XCIpLHRoaXMuX19vcHRpb25zLm1heFdpZHRoJiZiLmNzcyhcIm1heC13aWR0aFwiLHRoaXMuX19vcHRpb25zLm1heFdpZHRoK1wicHhcIiksXG50aGlzLl9faW5zdGFuY2UuXyR0b29sdGlwPWIsdGhpcy5fX2luc3RhbmNlLl90cmlnZ2VyKFwiY3JlYXRlZFwiKX0sX19kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fX2luc3RhbmNlLl9vZmYoXCIuXCIrc2VsZi5fX25hbWVzcGFjZSl9LF9fb3B0aW9uc0Zvcm1hdDpmdW5jdGlvbigpe3ZhciBiPXRoaXM7aWYoYi5fX29wdGlvbnM9Yi5fX2luc3RhbmNlLl9vcHRpb25zRXh0cmFjdChrLGIuX19kZWZhdWx0cygpKSxiLl9fb3B0aW9ucy5wb3NpdGlvbiYmKGIuX19vcHRpb25zLnNpZGU9Yi5fX29wdGlvbnMucG9zaXRpb24pLFwib2JqZWN0XCIhPXR5cGVvZiBiLl9fb3B0aW9ucy5kaXN0YW5jZSYmKGIuX19vcHRpb25zLmRpc3RhbmNlPVtiLl9fb3B0aW9ucy5kaXN0YW5jZV0pLGIuX19vcHRpb25zLmRpc3RhbmNlLmxlbmd0aDw0JiYodm9pZCAwPT09Yi5fX29wdGlvbnMuZGlzdGFuY2VbMV0mJihiLl9fb3B0aW9ucy5kaXN0YW5jZVsxXT1iLl9fb3B0aW9ucy5kaXN0YW5jZVswXSksdm9pZCAwPT09Yi5fX29wdGlvbnMuZGlzdGFuY2VbMl0mJihiLl9fb3B0aW9ucy5kaXN0YW5jZVsyXT1iLl9fb3B0aW9ucy5kaXN0YW5jZVswXSksdm9pZCAwPT09Yi5fX29wdGlvbnMuZGlzdGFuY2VbM10mJihiLl9fb3B0aW9ucy5kaXN0YW5jZVszXT1iLl9fb3B0aW9ucy5kaXN0YW5jZVsxXSkpLGIuX19vcHRpb25zLmRpc3RhbmNlPXt0b3A6Yi5fX29wdGlvbnMuZGlzdGFuY2VbMF0scmlnaHQ6Yi5fX29wdGlvbnMuZGlzdGFuY2VbMV0sYm90dG9tOmIuX19vcHRpb25zLmRpc3RhbmNlWzJdLGxlZnQ6Yi5fX29wdGlvbnMuZGlzdGFuY2VbM119LFwic3RyaW5nXCI9PXR5cGVvZiBiLl9fb3B0aW9ucy5zaWRlKXt2YXIgYz17dG9wOlwiYm90dG9tXCIscmlnaHQ6XCJsZWZ0XCIsYm90dG9tOlwidG9wXCIsbGVmdDpcInJpZ2h0XCJ9O2IuX19vcHRpb25zLnNpZGU9W2IuX19vcHRpb25zLnNpZGUsY1tiLl9fb3B0aW9ucy5zaWRlXV0sXCJsZWZ0XCI9PWIuX19vcHRpb25zLnNpZGVbMF18fFwicmlnaHRcIj09Yi5fX29wdGlvbnMuc2lkZVswXT9iLl9fb3B0aW9ucy5zaWRlLnB1c2goXCJ0b3BcIixcImJvdHRvbVwiKTpiLl9fb3B0aW9ucy5zaWRlLnB1c2goXCJyaWdodFwiLFwibGVmdFwiKX02PT09YS50b29sdGlwc3Rlci5fZW52LklFJiZiLl9fb3B0aW9ucy5hcnJvdyE9PSEwJiYoYi5fX29wdGlvbnMuYXJyb3c9ITEpfSxfX3JlcG9zaXRpb246ZnVuY3Rpb24oYixjKXt2YXIgZCxlPXRoaXMsZj1lLl9fdGFyZ2V0RmluZChjKSxnPVtdO2UuX19pbnN0YW5jZS5fJHRvb2x0aXAuZGV0YWNoKCk7dmFyIGg9ZS5fX2luc3RhbmNlLl8kdG9vbHRpcC5jbG9uZSgpLGk9YS50b29sdGlwc3Rlci5fZ2V0UnVsZXIoaCksaj0hMSxrPWUuX19pbnN0YW5jZS5vcHRpb24oXCJhbmltYXRpb25cIik7c3dpdGNoKGsmJmgucmVtb3ZlQ2xhc3MoXCJ0b29sdGlwc3Rlci1cIitrKSxhLmVhY2goW1wid2luZG93XCIsXCJkb2N1bWVudFwiXSxmdW5jdGlvbihkLGspe3ZhciBsPW51bGw7aWYoZS5fX2luc3RhbmNlLl90cmlnZ2VyKHtjb250YWluZXI6ayxoZWxwZXI6YyxzYXRpc2ZpZWQ6aix0YWtlVGVzdDpmdW5jdGlvbihhKXtsPWF9LHJlc3VsdHM6Zyx0eXBlOlwicG9zaXRpb25UZXN0XCJ9KSwxPT1sfHwwIT1sJiYwPT1qJiYoXCJ3aW5kb3dcIiE9a3x8ZS5fX29wdGlvbnMudmlld3BvcnRBd2FyZSkpZm9yKHZhciBkPTA7ZDxlLl9fb3B0aW9ucy5zaWRlLmxlbmd0aDtkKyspe3ZhciBtPXtob3Jpem9udGFsOjAsdmVydGljYWw6MH0sbj1lLl9fb3B0aW9ucy5zaWRlW2RdO1widG9wXCI9PW58fFwiYm90dG9tXCI9PW4/bS52ZXJ0aWNhbD1lLl9fb3B0aW9ucy5kaXN0YW5jZVtuXTptLmhvcml6b250YWw9ZS5fX29wdGlvbnMuZGlzdGFuY2Vbbl0sZS5fX3NpZGVDaGFuZ2UoaCxuKSxhLmVhY2goW1wibmF0dXJhbFwiLFwiY29uc3RyYWluZWRcIl0sZnVuY3Rpb24oYSxkKXtpZihsPW51bGwsZS5fX2luc3RhbmNlLl90cmlnZ2VyKHtjb250YWluZXI6ayxldmVudDpiLGhlbHBlcjpjLG1vZGU6ZCxyZXN1bHRzOmcsc2F0aXNmaWVkOmosc2lkZTpuLHRha2VUZXN0OmZ1bmN0aW9uKGEpe2w9YX0sdHlwZTpcInBvc2l0aW9uVGVzdFwifSksMT09bHx8MCE9bCYmMD09ail7dmFyIGg9e2NvbnRhaW5lcjprLGRpc3RhbmNlOm0sZml0czpudWxsLG1vZGU6ZCxvdXRlclNpemU6bnVsbCxzaWRlOm4sc2l6ZTpudWxsLHRhcmdldDpmW25dLHdob2xlOm51bGx9LG89XCJuYXR1cmFsXCI9PWQ/aS5mcmVlKCk6aS5jb25zdHJhaW4oYy5nZW8uYXZhaWxhYmxlW2tdW25dLndpZHRoLW0uaG9yaXpvbnRhbCxjLmdlby5hdmFpbGFibGVba11bbl0uaGVpZ2h0LW0udmVydGljYWwpLHA9by5tZWFzdXJlKCk7aWYoaC5zaXplPXAuc2l6ZSxoLm91dGVyU2l6ZT17aGVpZ2h0OnAuc2l6ZS5oZWlnaHQrbS52ZXJ0aWNhbCx3aWR0aDpwLnNpemUud2lkdGgrbS5ob3Jpem9udGFsfSxcIm5hdHVyYWxcIj09ZD9jLmdlby5hdmFpbGFibGVba11bbl0ud2lkdGg+PWgub3V0ZXJTaXplLndpZHRoJiZjLmdlby5hdmFpbGFibGVba11bbl0uaGVpZ2h0Pj1oLm91dGVyU2l6ZS5oZWlnaHQ/aC5maXRzPSEwOmguZml0cz0hMTpoLmZpdHM9cC5maXRzLFwid2luZG93XCI9PWsmJihoLmZpdHM/XCJ0b3BcIj09bnx8XCJib3R0b21cIj09bj9oLndob2xlPWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQucmlnaHQ+PWUuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbiYmYy5nZW8ud2luZG93LnNpemUud2lkdGgtYy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0Pj1lLl9fb3B0aW9ucy5taW5JbnRlcnNlY3Rpb246aC53aG9sZT1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LmJvdHRvbT49ZS5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uJiZjLmdlby53aW5kb3cuc2l6ZS5oZWlnaHQtYy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC50b3A+PWUuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbjpoLndob2xlPSExKSxnLnB1c2goaCksaC53aG9sZSlqPSEwO2Vsc2UgaWYoXCJuYXR1cmFsXCI9PWgubW9kZSYmKGguZml0c3x8aC5zaXplLndpZHRoPD1jLmdlby5hdmFpbGFibGVba11bbl0ud2lkdGgpKXJldHVybiExfX0pfX0pLGUuX19pbnN0YW5jZS5fdHJpZ2dlcih7ZWRpdDpmdW5jdGlvbihhKXtnPWF9LGV2ZW50OmIsaGVscGVyOmMscmVzdWx0czpnLHR5cGU6XCJwb3NpdGlvblRlc3RlZFwifSksZy5zb3J0KGZ1bmN0aW9uKGEsYil7aWYoYS53aG9sZSYmIWIud2hvbGUpcmV0dXJuLTE7aWYoIWEud2hvbGUmJmIud2hvbGUpcmV0dXJuIDE7aWYoYS53aG9sZSYmYi53aG9sZSl7dmFyIGM9ZS5fX29wdGlvbnMuc2lkZS5pbmRleE9mKGEuc2lkZSksZD1lLl9fb3B0aW9ucy5zaWRlLmluZGV4T2YoYi5zaWRlKTtyZXR1cm4gZD5jPy0xOmM+ZD8xOlwibmF0dXJhbFwiPT1hLm1vZGU/LTE6MX1pZihhLmZpdHMmJiFiLmZpdHMpcmV0dXJuLTE7aWYoIWEuZml0cyYmYi5maXRzKXJldHVybiAxO2lmKGEuZml0cyYmYi5maXRzKXt2YXIgYz1lLl9fb3B0aW9ucy5zaWRlLmluZGV4T2YoYS5zaWRlKSxkPWUuX19vcHRpb25zLnNpZGUuaW5kZXhPZihiLnNpZGUpO3JldHVybiBkPmM/LTE6Yz5kPzE6XCJuYXR1cmFsXCI9PWEubW9kZT8tMToxfXJldHVyblwiZG9jdW1lbnRcIj09YS5jb250YWluZXImJlwiYm90dG9tXCI9PWEuc2lkZSYmXCJuYXR1cmFsXCI9PWEubW9kZT8tMToxfSksZD1nWzBdLGQuY29vcmQ9e30sZC5zaWRlKXtjYXNlXCJsZWZ0XCI6Y2FzZVwicmlnaHRcIjpkLmNvb3JkLnRvcD1NYXRoLmZsb29yKGQudGFyZ2V0LWQuc2l6ZS5oZWlnaHQvMik7YnJlYWs7Y2FzZVwiYm90dG9tXCI6Y2FzZVwidG9wXCI6ZC5jb29yZC5sZWZ0PU1hdGguZmxvb3IoZC50YXJnZXQtZC5zaXplLndpZHRoLzIpfXN3aXRjaChkLnNpZGUpe2Nhc2VcImxlZnRcIjpkLmNvb3JkLmxlZnQ9Yy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0LWQub3V0ZXJTaXplLndpZHRoO2JyZWFrO2Nhc2VcInJpZ2h0XCI6ZC5jb29yZC5sZWZ0PWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQucmlnaHQrZC5kaXN0YW5jZS5ob3Jpem9udGFsO2JyZWFrO2Nhc2VcInRvcFwiOmQuY29vcmQudG9wPWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wLWQub3V0ZXJTaXplLmhlaWdodDticmVhaztjYXNlXCJib3R0b21cIjpkLmNvb3JkLnRvcD1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LmJvdHRvbStkLmRpc3RhbmNlLnZlcnRpY2FsfVwid2luZG93XCI9PWQuY29udGFpbmVyP1widG9wXCI9PWQuc2lkZXx8XCJib3R0b21cIj09ZC5zaWRlP2QuY29vcmQubGVmdDwwP2MuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQucmlnaHQtdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uPj0wP2QuY29vcmQubGVmdD0wOmQuY29vcmQubGVmdD1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LnJpZ2h0LXRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbi0xOmQuY29vcmQubGVmdD5jLmdlby53aW5kb3cuc2l6ZS53aWR0aC1kLnNpemUud2lkdGgmJihjLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQrdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uPD1jLmdlby53aW5kb3cuc2l6ZS53aWR0aD9kLmNvb3JkLmxlZnQ9Yy5nZW8ud2luZG93LnNpemUud2lkdGgtZC5zaXplLndpZHRoOmQuY29vcmQubGVmdD1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LmxlZnQrdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uKzEtZC5zaXplLndpZHRoKTpkLmNvb3JkLnRvcDwwP2MuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQuYm90dG9tLXRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbj49MD9kLmNvb3JkLnRvcD0wOmQuY29vcmQudG9wPWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQuYm90dG9tLXRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbi0xOmQuY29vcmQudG9wPmMuZ2VvLndpbmRvdy5zaXplLmhlaWdodC1kLnNpemUuaGVpZ2h0JiYoYy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC50b3ArdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uPD1jLmdlby53aW5kb3cuc2l6ZS5oZWlnaHQ/ZC5jb29yZC50b3A9Yy5nZW8ud2luZG93LnNpemUuaGVpZ2h0LWQuc2l6ZS5oZWlnaHQ6ZC5jb29yZC50b3A9Yy5nZW8ub3JpZ2luLndpbmRvd09mZnNldC50b3ArdGhpcy5fX29wdGlvbnMubWluSW50ZXJzZWN0aW9uKzEtZC5zaXplLmhlaWdodCk6KGQuY29vcmQubGVmdD5jLmdlby53aW5kb3cuc2l6ZS53aWR0aC1kLnNpemUud2lkdGgmJihkLmNvb3JkLmxlZnQ9Yy5nZW8ud2luZG93LnNpemUud2lkdGgtZC5zaXplLndpZHRoKSxkLmNvb3JkLmxlZnQ8MCYmKGQuY29vcmQubGVmdD0wKSksZS5fX3NpZGVDaGFuZ2UoaCxkLnNpZGUpLGMudG9vbHRpcENsb25lPWhbMF0sYy50b29sdGlwUGFyZW50PWUuX19pbnN0YW5jZS5vcHRpb24oXCJwYXJlbnRcIikucGFyZW50WzBdLGMubW9kZT1kLm1vZGUsYy53aG9sZT1kLndob2xlLGMub3JpZ2luPWUuX19pbnN0YW5jZS5fJG9yaWdpblswXSxjLnRvb2x0aXA9ZS5fX2luc3RhbmNlLl8kdG9vbHRpcFswXSxkZWxldGUgZC5jb250YWluZXIsZGVsZXRlIGQuZml0cyxkZWxldGUgZC5tb2RlLGRlbGV0ZSBkLm91dGVyU2l6ZSxkZWxldGUgZC53aG9sZSxkLmRpc3RhbmNlPWQuZGlzdGFuY2UuaG9yaXpvbnRhbHx8ZC5kaXN0YW5jZS52ZXJ0aWNhbDt2YXIgbD1hLmV4dGVuZCghMCx7fSxkKTtpZihlLl9faW5zdGFuY2UuX3RyaWdnZXIoe2VkaXQ6ZnVuY3Rpb24oYSl7ZD1hfSxldmVudDpiLGhlbHBlcjpjLHBvc2l0aW9uOmwsdHlwZTpcInBvc2l0aW9uXCJ9KSxlLl9fb3B0aW9ucy5mdW5jdGlvblBvc2l0aW9uKXt2YXIgbT1lLl9fb3B0aW9ucy5mdW5jdGlvblBvc2l0aW9uLmNhbGwoZSxlLl9faW5zdGFuY2UsYyxsKTttJiYoZD1tKX1pLmRlc3Ryb3koKTt2YXIgbixvO1widG9wXCI9PWQuc2lkZXx8XCJib3R0b21cIj09ZC5zaWRlPyhuPXtwcm9wOlwibGVmdFwiLHZhbDpkLnRhcmdldC1kLmNvb3JkLmxlZnR9LG89ZC5zaXplLndpZHRoLXRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbik6KG49e3Byb3A6XCJ0b3BcIix2YWw6ZC50YXJnZXQtZC5jb29yZC50b3B9LG89ZC5zaXplLmhlaWdodC10aGlzLl9fb3B0aW9ucy5taW5JbnRlcnNlY3Rpb24pLG4udmFsPHRoaXMuX19vcHRpb25zLm1pbkludGVyc2VjdGlvbj9uLnZhbD10aGlzLl9fb3B0aW9ucy5taW5JbnRlcnNlY3Rpb246bi52YWw+byYmKG4udmFsPW8pO3ZhciBwO3A9Yy5nZW8ub3JpZ2luLmZpeGVkTGluZWFnZT9jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0OntsZWZ0OmMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCtjLmdlby53aW5kb3cuc2Nyb2xsLmxlZnQsdG9wOmMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wK2MuZ2VvLndpbmRvdy5zY3JvbGwudG9wfSxkLmNvb3JkPXtsZWZ0OnAubGVmdCsoZC5jb29yZC5sZWZ0LWMuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQubGVmdCksdG9wOnAudG9wKyhkLmNvb3JkLnRvcC1jLmdlby5vcmlnaW4ud2luZG93T2Zmc2V0LnRvcCl9LGUuX19zaWRlQ2hhbmdlKGUuX19pbnN0YW5jZS5fJHRvb2x0aXAsZC5zaWRlKSxjLmdlby5vcmlnaW4uZml4ZWRMaW5lYWdlP2UuX19pbnN0YW5jZS5fJHRvb2x0aXAuY3NzKFwicG9zaXRpb25cIixcImZpeGVkXCIpOmUuX19pbnN0YW5jZS5fJHRvb2x0aXAuY3NzKFwicG9zaXRpb25cIixcIlwiKSxlLl9faW5zdGFuY2UuXyR0b29sdGlwLmNzcyh7bGVmdDpkLmNvb3JkLmxlZnQsdG9wOmQuY29vcmQudG9wLGhlaWdodDpkLnNpemUuaGVpZ2h0LHdpZHRoOmQuc2l6ZS53aWR0aH0pLmZpbmQoXCIudG9vbHRpcHN0ZXItYXJyb3dcIikuY3NzKHtsZWZ0OlwiXCIsdG9wOlwiXCJ9KS5jc3Mobi5wcm9wLG4udmFsKSxlLl9faW5zdGFuY2UuXyR0b29sdGlwLmFwcGVuZFRvKGUuX19pbnN0YW5jZS5vcHRpb24oXCJwYXJlbnRcIikpLGUuX19pbnN0YW5jZS5fdHJpZ2dlcih7dHlwZTpcInJlcG9zaXRpb25lZFwiLGV2ZW50OmIscG9zaXRpb246ZH0pfSxfX3NpZGVDaGFuZ2U6ZnVuY3Rpb24oYSxiKXthLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItYm90dG9tXCIpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItbGVmdFwiKS5yZW1vdmVDbGFzcyhcInRvb2x0aXBzdGVyLXJpZ2h0XCIpLnJlbW92ZUNsYXNzKFwidG9vbHRpcHN0ZXItdG9wXCIpLmFkZENsYXNzKFwidG9vbHRpcHN0ZXItXCIrYil9LF9fdGFyZ2V0RmluZDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPXRoaXMuX19pbnN0YW5jZS5fJG9yaWdpblswXS5nZXRDbGllbnRSZWN0cygpO2lmKGMubGVuZ3RoPjEpe3ZhciBkPXRoaXMuX19pbnN0YW5jZS5fJG9yaWdpbi5jc3MoXCJvcGFjaXR5XCIpOzE9PWQmJih0aGlzLl9faW5zdGFuY2UuXyRvcmlnaW4uY3NzKFwib3BhY2l0eVwiLC45OSksYz10aGlzLl9faW5zdGFuY2UuXyRvcmlnaW5bMF0uZ2V0Q2xpZW50UmVjdHMoKSx0aGlzLl9faW5zdGFuY2UuXyRvcmlnaW4uY3NzKFwib3BhY2l0eVwiLDEpKX1pZihjLmxlbmd0aDwyKWIudG9wPU1hdGguZmxvb3IoYS5nZW8ub3JpZ2luLndpbmRvd09mZnNldC5sZWZ0K2EuZ2VvLm9yaWdpbi5zaXplLndpZHRoLzIpLGIuYm90dG9tPWIudG9wLGIubGVmdD1NYXRoLmZsb29yKGEuZ2VvLm9yaWdpbi53aW5kb3dPZmZzZXQudG9wK2EuZ2VvLm9yaWdpbi5zaXplLmhlaWdodC8yKSxiLnJpZ2h0PWIubGVmdDtlbHNle3ZhciBlPWNbMF07Yi50b3A9TWF0aC5mbG9vcihlLmxlZnQrKGUucmlnaHQtZS5sZWZ0KS8yKSxlPWMubGVuZ3RoPjI/Y1tNYXRoLmNlaWwoYy5sZW5ndGgvMiktMV06Y1swXSxiLnJpZ2h0PU1hdGguZmxvb3IoZS50b3ArKGUuYm90dG9tLWUudG9wKS8yKSxlPWNbYy5sZW5ndGgtMV0sYi5ib3R0b209TWF0aC5mbG9vcihlLmxlZnQrKGUucmlnaHQtZS5sZWZ0KS8yKSxlPWMubGVuZ3RoPjI/Y1tNYXRoLmNlaWwoKGMubGVuZ3RoKzEpLzIpLTFdOmNbYy5sZW5ndGgtMV0sYi5sZWZ0PU1hdGguZmxvb3IoZS50b3ArKGUuYm90dG9tLWUudG9wKS8yKX1yZXR1cm4gYn19fSksYX0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG4vKlxyXG4gKiAgQm9vdHN0cmFwIFRvdWNoc3BpbiAtIHY0LjcuM1xyXG4gKiAgQSBtb2JpbGUgYW5kIHRvdWNoIGZyaWVuZGx5IGlucHV0IHNwaW5uZXIgY29tcG9uZW50IGZvciBCb290c3RyYXAgMyAmIDQuXHJcbiAqICBodHRwczovL3d3dy52aXJ0dW9zb2Z0LmV1L2NvZGUvYm9vdHN0cmFwLXRvdWNoc3Bpbi9cclxuICpcclxuICogIE1hZGUgYnkgSXN0dsOhbiBVamotTcOpc3rDoXJvc1xyXG4gKiAgVW5kZXIgTUlUIExpY2Vuc2VcclxuICovXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTtcbiAgfSBlbHNlIGlmICgodHlwZW9mIG1vZHVsZSA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG1vZHVsZSkpID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJvb3QsIGpRdWVyeSkge1xuICAgICAgaWYgKGpRdWVyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpKHJvb3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmYWN0b3J5KGpRdWVyeSk7XG4gICAgICByZXR1cm4galF1ZXJ5O1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZmFjdG9yeShqUXVlcnkpO1xuICB9XG59KShmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIF9jdXJyZW50U3Bpbm5lcklkID0gMDtcbiAgJC5mbi5Ub3VjaFNwaW4gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIG1pbjogMCxcbiAgICAgIC8vIElmIG51bGwsIHRoZXJlIGlzIG5vIG1pbmltdW0gZW5mb3JjZWRcbiAgICAgIG1heDogMTAwLFxuICAgICAgLy8gSWYgbnVsbCwgdGhlcmUgaXMgbm8gbWF4aW11bSBlbmZvcmNlZFxuICAgICAgaW5pdHZhbDogJycsXG4gICAgICByZXBsYWNlbWVudHZhbDogJycsXG4gICAgICBmaXJzdGNsaWNrdmFsdWVpZmVtcHR5OiBudWxsLFxuICAgICAgc3RlcDogMSxcbiAgICAgIGRlY2ltYWxzOiAwLFxuICAgICAgc3RlcGludGVydmFsOiAxMDAsXG4gICAgICBmb3JjZXN0ZXBkaXZpc2liaWxpdHk6ICdyb3VuZCcsXG4gICAgICAvLyBub25lIHwgZmxvb3IgfCByb3VuZCB8IGNlaWxcbiAgICAgIHN0ZXBpbnRlcnZhbGRlbGF5OiA1MDAsXG4gICAgICB2ZXJ0aWNhbGJ1dHRvbnM6IGZhbHNlLFxuICAgICAgdmVydGljYWx1cDogJyZwbHVzOycsXG4gICAgICB2ZXJ0aWNhbGRvd246ICcmbWludXM7JyxcbiAgICAgIHZlcnRpY2FsdXBjbGFzczogJycsXG4gICAgICB2ZXJ0aWNhbGRvd25jbGFzczogJycsXG4gICAgICBwcmVmaXg6ICcnLFxuICAgICAgcG9zdGZpeDogJycsXG4gICAgICBwcmVmaXhfZXh0cmFjbGFzczogJycsXG4gICAgICBwb3N0Zml4X2V4dHJhY2xhc3M6ICcnLFxuICAgICAgYm9vc3RlcjogdHJ1ZSxcbiAgICAgIGJvb3N0YXQ6IDEwLFxuICAgICAgbWF4Ym9vc3RlZHN0ZXA6IGZhbHNlLFxuICAgICAgbW91c2V3aGVlbDogdHJ1ZSxcbiAgICAgIGJ1dHRvbmRvd25fY2xhc3M6ICdidG4gYnRuLXByaW1hcnknLFxuICAgICAgYnV0dG9udXBfY2xhc3M6ICdidG4gYnRuLXByaW1hcnknLFxuICAgICAgYnV0dG9uZG93bl90eHQ6ICcmbWludXM7JyxcbiAgICAgIGJ1dHRvbnVwX3R4dDogJyZwbHVzOycsXG4gICAgICBjYWxsYmFja19iZWZvcmVfY2FsY3VsYXRpb246IGZ1bmN0aW9uIGNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgY2FsbGJhY2tfYWZ0ZXJfY2FsY3VsYXRpb246IGZ1bmN0aW9uIGNhbGxiYWNrX2FmdGVyX2NhbGN1bGF0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBhdHRyaWJ1dGVNYXAgPSB7XG4gICAgICBtaW46ICdtaW4nLFxuICAgICAgbWF4OiAnbWF4JyxcbiAgICAgIGluaXR2YWw6ICdpbml0LXZhbCcsXG4gICAgICByZXBsYWNlbWVudHZhbDogJ3JlcGxhY2VtZW50LXZhbCcsXG4gICAgICBmaXJzdGNsaWNrdmFsdWVpZmVtcHR5OiAnZmlyc3QtY2xpY2stdmFsdWUtaWYtZW1wdHknLFxuICAgICAgc3RlcDogJ3N0ZXAnLFxuICAgICAgZGVjaW1hbHM6ICdkZWNpbWFscycsXG4gICAgICBzdGVwaW50ZXJ2YWw6ICdzdGVwLWludGVydmFsJyxcbiAgICAgIHZlcnRpY2FsYnV0dG9uczogJ3ZlcnRpY2FsLWJ1dHRvbnMnLFxuICAgICAgdmVydGljYWx1cGNsYXNzOiAndmVydGljYWwtdXAtY2xhc3MnLFxuICAgICAgdmVydGljYWxkb3duY2xhc3M6ICd2ZXJ0aWNhbC1kb3duLWNsYXNzJyxcbiAgICAgIGZvcmNlc3RlcGRpdmlzaWJpbGl0eTogJ2ZvcmNlLXN0ZXAtZGl2aXNpYmlsaXR5JyxcbiAgICAgIHN0ZXBpbnRlcnZhbGRlbGF5OiAnc3RlcC1pbnRlcnZhbC1kZWxheScsXG4gICAgICBwcmVmaXg6ICdwcmVmaXgnLFxuICAgICAgcG9zdGZpeDogJ3Bvc3RmaXgnLFxuICAgICAgcHJlZml4X2V4dHJhY2xhc3M6ICdwcmVmaXgtZXh0cmEtY2xhc3MnLFxuICAgICAgcG9zdGZpeF9leHRyYWNsYXNzOiAncG9zdGZpeC1leHRyYS1jbGFzcycsXG4gICAgICBib29zdGVyOiAnYm9vc3RlcicsXG4gICAgICBib29zdGF0OiAnYm9vc3RhdCcsXG4gICAgICBtYXhib29zdGVkc3RlcDogJ21heC1ib29zdGVkLXN0ZXAnLFxuICAgICAgbW91c2V3aGVlbDogJ21vdXNlLXdoZWVsJyxcbiAgICAgIGJ1dHRvbmRvd25fY2xhc3M6ICdidXR0b24tZG93bi1jbGFzcycsXG4gICAgICBidXR0b251cF9jbGFzczogJ2J1dHRvbi11cC1jbGFzcycsXG4gICAgICBidXR0b25kb3duX3R4dDogJ2J1dHRvbi1kb3duLXR4dCcsXG4gICAgICBidXR0b251cF90eHQ6ICdidXR0b24tdXAtdHh0J1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2V0dGluZ3MsXG4gICAgICAgIG9yaWdpbmFsaW5wdXQgPSAkKHRoaXMpLFxuICAgICAgICBvcmlnaW5hbGlucHV0X2RhdGEgPSBvcmlnaW5hbGlucHV0LmRhdGEoKSxcbiAgICAgICAgX2RldGFjaGVkX3ByZWZpeCxcbiAgICAgICAgX2RldGFjaGVkX3Bvc3RmaXgsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIHZlcnRpY2FsYnV0dG9uc19odG1sLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZG93blNwaW5UaW1lcixcbiAgICAgICAgdXBTcGluVGltZXIsXG4gICAgICAgIGRvd25EZWxheVRpbWVvdXQsXG4gICAgICAgIHVwRGVsYXlUaW1lb3V0LFxuICAgICAgICBzcGluY291bnQgPSAwLFxuICAgICAgICBzcGlubmluZyA9IGZhbHNlO1xuICAgICAgaW5pdCgpO1xuICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuZGF0YSgnYWxyZWFkeWluaXRpYWxpemVkJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb3JpZ2luYWxpbnB1dC5kYXRhKCdhbHJlYWR5aW5pdGlhbGl6ZWQnLCB0cnVlKTtcbiAgICAgICAgX2N1cnJlbnRTcGlubmVySWQgKz0gMTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5kYXRhKCdzcGlubmVyaWQnLCBfY3VycmVudFNwaW5uZXJJZCk7XG4gICAgICAgIGlmICghb3JpZ2luYWxpbnB1dC5pcygnaW5wdXQnKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdNdXN0IGJlIGFuIGlucHV0LicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBfaW5pdFNldHRpbmdzKCk7XG4gICAgICAgIF9zZXRJbml0dmFsKCk7XG4gICAgICAgIF9jaGVja1ZhbHVlKCk7XG4gICAgICAgIF9idWlsZEh0bWwoKTtcbiAgICAgICAgX2luaXRFbGVtZW50cygpO1xuICAgICAgICBfdXBkYXRlQnV0dG9uRGlzYWJsZWRTdGF0ZSgpO1xuICAgICAgICBfaGlkZUVtcHR5UHJlZml4UG9zdGZpeCgpO1xuICAgICAgICBfc2V0dXBNdXRhdGlvbk9ic2VydmVycygpO1xuICAgICAgICBfYmluZEV2ZW50cygpO1xuICAgICAgICBfYmluZEV2ZW50c0ludGVyZmFjZSgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3NldEluaXR2YWwoKSB7XG4gICAgICAgIGlmIChzZXR0aW5ncy5pbml0dmFsICE9PSAnJyAmJiBvcmlnaW5hbGlucHV0LnZhbCgpID09PSAnJykge1xuICAgICAgICAgIG9yaWdpbmFsaW5wdXQudmFsKHNldHRpbmdzLmluaXR2YWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjaGFuZ2VTZXR0aW5ncyhuZXdzZXR0aW5ncykge1xuICAgICAgICBfdXBkYXRlU2V0dGluZ3MobmV3c2V0dGluZ3MpO1xuICAgICAgICBfY2hlY2tWYWx1ZSgpO1xuICAgICAgICB2YXIgdmFsdWUgPSBlbGVtZW50cy5pbnB1dC52YWwoKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSAnJykge1xuICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdChzZXR0aW5ncy5jYWxsYmFja19iZWZvcmVfY2FsY3VsYXRpb24oZWxlbWVudHMuaW5wdXQudmFsKCkpKTtcbiAgICAgICAgICBlbGVtZW50cy5pbnB1dC52YWwoc2V0dGluZ3MuY2FsbGJhY2tfYWZ0ZXJfY2FsY3VsYXRpb24ocGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscykpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2luaXRTZXR0aW5ncygpIHtcbiAgICAgICAgc2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9yaWdpbmFsaW5wdXRfZGF0YSwgX3BhcnNlQXR0cmlidXRlcygpLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2V0dGluZ3Muc3RlcCkgIT09IDEpIHtcbiAgICAgICAgICB2YXIgcmVtYWluZGVyO1xuXG4gICAgICAgICAgLy8gTW9kaWZ5IHNldHRpbmdzLm1heCB0byBiZSBkaXZpc2libGUgYnkgc3RlcFxuICAgICAgICAgIHJlbWFpbmRlciA9IHNldHRpbmdzLm1heCAlIHNldHRpbmdzLnN0ZXA7XG4gICAgICAgICAgaWYgKHJlbWFpbmRlciAhPT0gMCkge1xuICAgICAgICAgICAgc2V0dGluZ3MubWF4ID0gcGFyc2VGbG9hdChzZXR0aW5ncy5tYXgpIC0gcmVtYWluZGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERvIHRoZSBzYW1lIHdpdGggbWluLCBzaG91bGQgd29yayB3aXRoIG5lZ2F0aXZlIG51bWJlcnMgdG9vXG4gICAgICAgICAgcmVtYWluZGVyID0gc2V0dGluZ3MubWluICUgc2V0dGluZ3Muc3RlcDtcbiAgICAgICAgICBpZiAocmVtYWluZGVyICE9PSAwKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy5taW4gPSBwYXJzZUZsb2F0KHNldHRpbmdzLm1pbikgKyAocGFyc2VGbG9hdChzZXR0aW5ncy5zdGVwKSAtIHJlbWFpbmRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfcGFyc2VBdHRyaWJ1dGVzKCkge1xuICAgICAgICB2YXIgZGF0YSA9IHt9O1xuXG4gICAgICAgIC8vIFNldHRpbmcgdXAgYmFzZWQgb24gZGF0YSBhdHRyaWJ1dGVzXG4gICAgICAgICQuZWFjaChhdHRyaWJ1dGVNYXAsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgdmFyIGF0dHJOYW1lID0gJ2J0cy0nICsgdmFsdWUgKyAnJztcbiAgICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5pcygnW2RhdGEtJyArIGF0dHJOYW1lICsgJ10nKSkge1xuICAgICAgICAgICAgZGF0YVtrZXldID0gb3JpZ2luYWxpbnB1dC5kYXRhKGF0dHJOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNldHRpbmcgdXAgYmFzZWQgb24gaW5wdXQgYXR0cmlidXRlcyBpZiBzcGVjaWZpZWQgKGlucHV0IGF0dHJpYnV0ZXMgaGF2ZSBwcmVjZWRlbmNlKVxuICAgICAgICAkLmVhY2goWydtaW4nLCAnbWF4JywgJ3N0ZXAnXSwgZnVuY3Rpb24gKGksIGtleSkge1xuICAgICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCdbJyArIGtleSArICddJykpIHtcbiAgICAgICAgICAgIGlmIChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0JvdGggdGhlIFwiZGF0YS1idHMtJyArIGtleSArICdcIiBkYXRhIGF0dHJpYnV0ZSBhbmQgdGhlIFwiJyArIGtleSArICdcIiBpbmRpdmlkdWFsIGF0dHJpYnV0ZSB3ZXJlIHNwZWNpZmllZCwgdGhlIGluZGl2aWR1YWwgYXR0cmlidXRlIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG9uOiAnLCBvcmlnaW5hbGlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFba2V5XSA9IG9yaWdpbmFsaW5wdXQuYXR0cihrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2Rlc3Ryb3koKSB7XG4gICAgICAgIHZhciAkcGFyZW50ID0gb3JpZ2luYWxpbnB1dC5wYXJlbnQoKTtcbiAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5vZmYoJy50b3VjaHNwaW4nKTtcbiAgICAgICAgaWYgKCRwYXJlbnQuaGFzQ2xhc3MoJ2Jvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWQnKSkge1xuICAgICAgICAgIG9yaWdpbmFsaW5wdXQuc2libGluZ3MoKS5yZW1vdmUoKTtcbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnVud3JhcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoJy5ib290c3RyYXAtdG91Y2hzcGluLWluamVjdGVkJywgJHBhcmVudCkucmVtb3ZlKCk7XG4gICAgICAgICAgJHBhcmVudC5yZW1vdmVDbGFzcygnYm9vdHN0cmFwLXRvdWNoc3BpbicpO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbmFsaW5wdXQuZGF0YSgnYWxyZWFkeWluaXRpYWxpemVkJywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3VwZGF0ZVNldHRpbmdzKG5ld3NldHRpbmdzKSB7XG4gICAgICAgIHNldHRpbmdzID0gJC5leHRlbmQoe30sIHNldHRpbmdzLCBuZXdzZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHBvc3RmaXggYW5kIHByZWZpeCB0ZXh0cyBpZiB0aG9zZSBzZXR0aW5ncyB3ZXJlIGNoYW5nZWQuXG4gICAgICAgIGlmIChuZXdzZXR0aW5ncy5wb3N0Zml4KSB7XG4gICAgICAgICAgdmFyICRwb3N0Zml4ID0gb3JpZ2luYWxpbnB1dC5wYXJlbnQoKS5maW5kKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wb3N0Zml4Jyk7XG4gICAgICAgICAgaWYgKCRwb3N0Zml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgX2RldGFjaGVkX3Bvc3RmaXguaW5zZXJ0QWZ0ZXIob3JpZ2luYWxpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9yaWdpbmFsaW5wdXQucGFyZW50KCkuZmluZCgnLmJvb3RzdHJhcC10b3VjaHNwaW4tcG9zdGZpeCAuaW5wdXQtZ3JvdXAtdGV4dCcpLnRleHQobmV3c2V0dGluZ3MucG9zdGZpeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld3NldHRpbmdzLnByZWZpeCkge1xuICAgICAgICAgIHZhciAkcHJlZml4ID0gb3JpZ2luYWxpbnB1dC5wYXJlbnQoKS5maW5kKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXgnKTtcbiAgICAgICAgICBpZiAoJHByZWZpeC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIF9kZXRhY2hlZF9wcmVmaXguaW5zZXJ0QmVmb3JlKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnBhcmVudCgpLmZpbmQoJy5ib290c3RyYXAtdG91Y2hzcGluLXByZWZpeCAuaW5wdXQtZ3JvdXAtdGV4dCcpLnRleHQobmV3c2V0dGluZ3MucHJlZml4KTtcbiAgICAgICAgfVxuICAgICAgICBfaGlkZUVtcHR5UHJlZml4UG9zdGZpeCgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2J1aWxkSHRtbCgpIHtcbiAgICAgICAgdmFyIGluaXR2YWwgPSBvcmlnaW5hbGlucHV0LnZhbCgpLFxuICAgICAgICAgIHBhcmVudGVsZW1lbnQgPSBvcmlnaW5hbGlucHV0LnBhcmVudCgpO1xuICAgICAgICBpZiAoaW5pdHZhbCAhPT0gJycpIHtcbiAgICAgICAgICAvLyBpbml0dmFsIG1heSBub3QgYmUgcGFyc2FibGUgYXMgYSBudW1iZXIgKGNhbGxiYWNrX2FmdGVyX2NhbGN1bGF0aW9uKCkgbWF5IGRlY29yYXRlIGl0IHNvIGl0IGNhbnQgYmUgcGFyc2VkKS4gIFVzZSB0aGUgY2FsbGJhY2tzIGlmIHByb3ZpZGVkLlxuICAgICAgICAgIGluaXR2YWwgPSBzZXR0aW5ncy5jYWxsYmFja19iZWZvcmVfY2FsY3VsYXRpb24oaW5pdHZhbCk7XG4gICAgICAgICAgaW5pdHZhbCA9IHNldHRpbmdzLmNhbGxiYWNrX2FmdGVyX2NhbGN1bGF0aW9uKHBhcnNlRmxvYXQoaW5pdHZhbCkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscykpO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbmFsaW5wdXQuZGF0YSgnaW5pdHZhbHVlJywgaW5pdHZhbCkudmFsKGluaXR2YWwpO1xuICAgICAgICBvcmlnaW5hbGlucHV0LmFkZENsYXNzKCdmb3JtLWNvbnRyb2wnKTtcbiAgICAgICAgdmVydGljYWxidXR0b25zX2h0bWwgPSBcIlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gYm9vdHN0cmFwLXRvdWNoc3Bpbi12ZXJ0aWNhbC1idXR0b24td3JhcHBlclxcXCI+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWJ0bi12ZXJ0aWNhbFxcXCI+XFxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVxcXCItMVxcXCIgY2xhc3M9XFxcIlwiLmNvbmNhdChzZXR0aW5ncy5idXR0b25kb3duX2NsYXNzLCBcIiBib290c3RyYXAtdG91Y2hzcGluLXVwIFwiKS5jb25jYXQoc2V0dGluZ3MudmVydGljYWx1cGNsYXNzLCBcIlxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnZlcnRpY2FsdXAsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVxcXCItMVxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc2V0dGluZ3MuYnV0dG9udXBfY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tZG93biBcIikuY29uY2F0KHNldHRpbmdzLnZlcnRpY2FsZG93bmNsYXNzLCBcIlxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnZlcnRpY2FsZG93biwgXCI8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgXCIpO1xuICAgICAgICBpZiAocGFyZW50ZWxlbWVudC5oYXNDbGFzcygnaW5wdXQtZ3JvdXAnKSkge1xuICAgICAgICAgIF9hZHZhbmNlSW5wdXRHcm91cChwYXJlbnRlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfYnVpbGRJbnB1dEdyb3VwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9hZHZhbmNlSW5wdXRHcm91cChwYXJlbnRlbGVtZW50KSB7XG4gICAgICAgIHBhcmVudGVsZW1lbnQuYWRkQ2xhc3MoJ2Jvb3RzdHJhcC10b3VjaHNwaW4nKTtcbiAgICAgICAgdmFyIHByZXYgPSBvcmlnaW5hbGlucHV0LnByZXYoKSxcbiAgICAgICAgICBuZXh0ID0gb3JpZ2luYWxpbnB1dC5uZXh0KCk7XG4gICAgICAgIHZhciBkb3duaHRtbCxcbiAgICAgICAgICB1cGh0bWwsXG4gICAgICAgICAgcHJlZml4aHRtbCA9IFwiXFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGlucHV0LWdyb3VwLXByZXBlbmQgYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXggaW5wdXQtZ3JvdXAtcHJlcGVuZCBib290c3RyYXAtdG91Y2hzcGluLWluamVjdGVkXFxcIj5cXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC10ZXh0XFxcIj5cIi5jb25jYXQoc2V0dGluZ3MucHJlZml4LCBcIjwvc3Bhbj5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgIFwiKSxcbiAgICAgICAgICBwb3N0Zml4aHRtbCA9IFwiXFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGlucHV0LWdyb3VwLWFwcGVuZCBib290c3RyYXAtdG91Y2hzcGluLXBvc3RmaXggaW5wdXQtZ3JvdXAtYXBwZW5kIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLXRleHRcXFwiPlwiLmNvbmNhdChzZXR0aW5ncy5wb3N0Zml4LCBcIjwvc3Bhbj5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgIFwiKTtcbiAgICAgICAgaWYgKHNldHRpbmdzLnZlcnRpY2FsYnV0dG9ucykge1xuICAgICAgICAgICQodmVydGljYWxidXR0b25zX2h0bWwpLmluc2VydEFmdGVyKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChwcmV2Lmhhc0NsYXNzKCdpbnB1dC1ncm91cC1idG4nKSB8fCBwcmV2Lmhhc0NsYXNzKCdpbnB1dC1ncm91cC1wcmVwZW5kJykpIHtcbiAgICAgICAgICAgIGRvd25odG1sID0gXCJcXG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XFxcIi0xXFxcIiBjbGFzcz1cXFwiXCIuY29uY2F0KHNldHRpbmdzLmJ1dHRvbmRvd25fY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tZG93biBib290c3RyYXAtdG91Y2hzcGluLWluamVjdGVkXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiPlwiKS5jb25jYXQoc2V0dGluZ3MuYnV0dG9uZG93bl90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgXCIpO1xuICAgICAgICAgICAgcHJldi5hcHBlbmQoZG93bmh0bWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb3duaHRtbCA9IFwiXFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYnRuIGlucHV0LWdyb3VwLXByZXBlbmQgYm9vdHN0cmFwLXRvdWNoc3Bpbi1pbmplY3RlZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XFxcIi0xXFxcIiBjbGFzcz1cXFwiXCIuY29uY2F0KHNldHRpbmdzLmJ1dHRvbmRvd25fY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tZG93blxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIikuY29uY2F0KHNldHRpbmdzLmJ1dHRvbmRvd25fdHh0LCBcIjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIFwiKTtcbiAgICAgICAgICAgICQoZG93bmh0bWwpLmluc2VydEJlZm9yZShvcmlnaW5hbGlucHV0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5leHQuaGFzQ2xhc3MoJ2lucHV0LWdyb3VwLWJ0bicpIHx8IG5leHQuaGFzQ2xhc3MoJ2lucHV0LWdyb3VwLWFwcGVuZCcpKSB7XG4gICAgICAgICAgICB1cGh0bWwgPSBcIlxcbiAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XFxcIi0xXFxcIiBjbGFzcz1cXFwiXCIuY29uY2F0KHNldHRpbmdzLmJ1dHRvbnVwX2NsYXNzLCBcIiBib290c3RyYXAtdG91Y2hzcGluLXVwIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b251cF90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgIFwiKTtcbiAgICAgICAgICAgIG5leHQucHJlcGVuZCh1cGh0bWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cGh0bWwgPSBcIlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC1idG4gaW5wdXQtZ3JvdXAtYXBwZW5kIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiPlxcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cXFwiLTFcXFwiIGNsYXNzPVxcXCJcIi5jb25jYXQoc2V0dGluZ3MuYnV0dG9udXBfY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tdXBcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b251cF90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICBcIik7XG4gICAgICAgICAgICAkKHVwaHRtbCkuaW5zZXJ0QWZ0ZXIob3JpZ2luYWxpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICQocHJlZml4aHRtbCkuaW5zZXJ0QmVmb3JlKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICAkKHBvc3RmaXhodG1sKS5pbnNlcnRBZnRlcihvcmlnaW5hbGlucHV0KTtcbiAgICAgICAgY29udGFpbmVyID0gcGFyZW50ZWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9idWlsZElucHV0R3JvdXAoKSB7XG4gICAgICAgIHZhciBodG1sO1xuICAgICAgICB2YXIgaW5wdXRHcm91cFNpemUgPSAnJztcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaGFzQ2xhc3MoJ2lucHV0LXNtJykgfHwgb3JpZ2luYWxpbnB1dC5oYXNDbGFzcygnZm9ybS1jb250cm9sLXNtJykpIHtcbiAgICAgICAgICBpbnB1dEdyb3VwU2l6ZSA9ICdpbnB1dC1ncm91cC1zbSc7XG4gICAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxpbnB1dC5oYXNDbGFzcygnaW5wdXQtbGcnKSB8fCBvcmlnaW5hbGlucHV0Lmhhc0NsYXNzKCdmb3JtLWNvbnRyb2wtbGcnKSkge1xuICAgICAgICAgIGlucHV0R3JvdXBTaXplID0gJ2lucHV0LWdyb3VwLWxnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MudmVydGljYWxidXR0b25zKSB7XG4gICAgICAgICAgaHRtbCA9IFwiXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAgXCIuY29uY2F0KGlucHV0R3JvdXBTaXplLCBcIiBib290c3RyYXAtdG91Y2hzcGluIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGlucHV0LWdyb3VwLXByZXBlbmQgYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXhcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtdGV4dFxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5wcmVmaXgsIFwiPC9zcGFuPlxcbiAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGJvb3RzdHJhcC10b3VjaHNwaW4tcG9zdGZpeCBpbnB1dC1ncm91cC1hcHBlbmRcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtdGV4dFxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5wb3N0Zml4LCBcIjwvc3Bhbj5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgIFwiKS5jb25jYXQodmVydGljYWxidXR0b25zX2h0bWwsIFwiXFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodG1sID0gXCJcXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJpbnB1dC1ncm91cCBib290c3RyYXAtdG91Y2hzcGluIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWJ0biBpbnB1dC1ncm91cC1wcmVwZW5kXFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cXFwiLTFcXFwiIGNsYXNzPVxcXCJcIi5jb25jYXQoc2V0dGluZ3MuYnV0dG9uZG93bl9jbGFzcywgXCIgYm9vdHN0cmFwLXRvdWNoc3Bpbi1kb3duXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiPlwiKS5jb25jYXQoc2V0dGluZ3MuYnV0dG9uZG93bl90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXggaW5wdXQtZ3JvdXAtcHJlcGVuZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC10ZXh0XFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnByZWZpeCwgXCI8L3NwYW4+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gYm9vdHN0cmFwLXRvdWNoc3Bpbi1wb3N0Zml4IGlucHV0LWdyb3VwLWFwcGVuZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC10ZXh0XFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnBvc3RmaXgsIFwiPC9zcGFuPlxcbiAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWJ0biBpbnB1dC1ncm91cC1hcHBlbmRcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVxcXCItMVxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc2V0dGluZ3MuYnV0dG9udXBfY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tdXBcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b251cF90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5lciA9ICQoaHRtbCkuaW5zZXJ0QmVmb3JlKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICAkKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXgnLCBjb250YWluZXIpLmFmdGVyKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5oYXNDbGFzcygnaW5wdXQtc20nKSB8fCBvcmlnaW5hbGlucHV0Lmhhc0NsYXNzKCdmb3JtLWNvbnRyb2wtc20nKSkge1xuICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcygnaW5wdXQtZ3JvdXAtc20nKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbGlucHV0Lmhhc0NsYXNzKCdpbnB1dC1sZycpIHx8IG9yaWdpbmFsaW5wdXQuaGFzQ2xhc3MoJ2Zvcm0tY29udHJvbC1sZycpKSB7XG4gICAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKCdpbnB1dC1ncm91cC1sZycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfaW5pdEVsZW1lbnRzKCkge1xuICAgICAgICBlbGVtZW50cyA9IHtcbiAgICAgICAgICBkb3duOiAkKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1kb3duJywgY29udGFpbmVyKSxcbiAgICAgICAgICB1cDogJCgnLmJvb3RzdHJhcC10b3VjaHNwaW4tdXAnLCBjb250YWluZXIpLFxuICAgICAgICAgIGlucHV0OiAkKCdpbnB1dCcsIGNvbnRhaW5lciksXG4gICAgICAgICAgcHJlZml4OiAkKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wcmVmaXgnLCBjb250YWluZXIpLmFkZENsYXNzKHNldHRpbmdzLnByZWZpeF9leHRyYWNsYXNzKSxcbiAgICAgICAgICBwb3N0Zml4OiAkKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wb3N0Zml4JywgY29udGFpbmVyKS5hZGRDbGFzcyhzZXR0aW5ncy5wb3N0Zml4X2V4dHJhY2xhc3MpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfaGlkZUVtcHR5UHJlZml4UG9zdGZpeCgpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzLnByZWZpeCA9PT0gJycpIHtcbiAgICAgICAgICBfZGV0YWNoZWRfcHJlZml4ID0gZWxlbWVudHMucHJlZml4LmRldGFjaCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5wb3N0Zml4ID09PSAnJykge1xuICAgICAgICAgIF9kZXRhY2hlZF9wb3N0Zml4ID0gZWxlbWVudHMucG9zdGZpeC5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2JpbmRFdmVudHMoKSB7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ2tleWRvd24udG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgdmFyIGNvZGUgPSBldi5rZXlDb2RlIHx8IGV2LndoaWNoO1xuICAgICAgICAgIGlmIChjb2RlID09PSAzOCkge1xuICAgICAgICAgICAgaWYgKHNwaW5uaW5nICE9PSAndXAnKSB7XG4gICAgICAgICAgICAgIHVwT25jZSgpO1xuICAgICAgICAgICAgICBzdGFydFVwU3BpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDQwKSB7XG4gICAgICAgICAgICBpZiAoc3Bpbm5pbmcgIT09ICdkb3duJykge1xuICAgICAgICAgICAgICBkb3duT25jZSgpO1xuICAgICAgICAgICAgICBzdGFydERvd25TcGluKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gOSB8fCBjb2RlID09PSAxMykge1xuICAgICAgICAgICAgX2NoZWNrVmFsdWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCdrZXl1cC50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGV2LmtleUNvZGUgfHwgZXYud2hpY2g7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gNDApIHtcbiAgICAgICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjaGFuZ2UgaXMgZmlyZWQgYmVmb3JlIGJsdXIsIHNvIHdlIG5lZWQgdG8gd29yayBhcm91bmQgdGhhdFxuICAgICAgICAkKGRvY3VtZW50KS5vbignbW91c2Vkb3duIHRvdWNoc3RhcnQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmlzKG9yaWdpbmFsaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jaGVja1ZhbHVlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCdibHVyLnRvdWNoc3BpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfY2hlY2tWYWx1ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMuZG93bi5vbigna2V5ZG93bicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIHZhciBjb2RlID0gZXYua2V5Q29kZSB8fCBldi53aGljaDtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gMzIgfHwgY29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgIGlmIChzcGlubmluZyAhPT0gJ2Rvd24nKSB7XG4gICAgICAgICAgICAgIGRvd25PbmNlKCk7XG4gICAgICAgICAgICAgIHN0YXJ0RG93blNwaW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMuZG93bi5vbigna2V5dXAudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgdmFyIGNvZGUgPSBldi5rZXlDb2RlIHx8IGV2LndoaWNoO1xuICAgICAgICAgIGlmIChjb2RlID09PSAzMiB8fCBjb2RlID09PSAxMykge1xuICAgICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy51cC5vbigna2V5ZG93bi50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGV2LmtleUNvZGUgfHwgZXYud2hpY2g7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDMyIHx8IGNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBpZiAoc3Bpbm5pbmcgIT09ICd1cCcpIHtcbiAgICAgICAgICAgICAgdXBPbmNlKCk7XG4gICAgICAgICAgICAgIHN0YXJ0VXBTcGluKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLnVwLm9uKCdrZXl1cC50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGV2LmtleUNvZGUgfHwgZXYud2hpY2g7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDMyIHx8IGNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLmRvd24ub24oJ21vdXNlZG93bi50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICBlbGVtZW50cy5kb3duLm9mZigndG91Y2hzdGFydC50b3VjaHNwaW4nKTsgLy8gYW5kcm9pZCA0IHdvcmthcm91bmRcblxuICAgICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRvd25PbmNlKCk7XG4gICAgICAgICAgc3RhcnREb3duU3BpbigpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy5kb3duLm9uKCd0b3VjaHN0YXJ0LnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGVsZW1lbnRzLmRvd24ub2ZmKCdtb3VzZWRvd24udG91Y2hzcGluJyk7IC8vIGFuZHJvaWQgNCB3b3JrYXJvdW5kXG5cbiAgICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5pcygnOmRpc2FibGVkLFtyZWFkb25seV0nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb3duT25jZSgpO1xuICAgICAgICAgIHN0YXJ0RG93blNwaW4oKTtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMudXAub24oJ21vdXNlZG93bi50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICBlbGVtZW50cy51cC5vZmYoJ3RvdWNoc3RhcnQudG91Y2hzcGluJyk7IC8vIGFuZHJvaWQgNCB3b3JrYXJvdW5kXG5cbiAgICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5pcygnOmRpc2FibGVkLFtyZWFkb25seV0nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cE9uY2UoKTtcbiAgICAgICAgICBzdGFydFVwU3BpbigpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy51cC5vbigndG91Y2hzdGFydC50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICBlbGVtZW50cy51cC5vZmYoJ21vdXNlZG93bi50b3VjaHNwaW4nKTsgLy8gYW5kcm9pZCA0IHdvcmthcm91bmRcblxuICAgICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwT25jZSgpO1xuICAgICAgICAgIHN0YXJ0VXBTcGluKCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLnVwLm9uKCdtb3VzZXVwLnRvdWNoc3BpbiBtb3VzZW91dC50b3VjaHNwaW4gdG91Y2hsZWF2ZS50b3VjaHNwaW4gdG91Y2hlbmQudG91Y2hzcGluIHRvdWNoY2FuY2VsLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGlmICghc3Bpbm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLmRvd24ub24oJ21vdXNldXAudG91Y2hzcGluIG1vdXNlb3V0LnRvdWNoc3BpbiB0b3VjaGxlYXZlLnRvdWNoc3BpbiB0b3VjaGVuZC50b3VjaHNwaW4gdG91Y2hjYW5jZWwudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgaWYgKCFzcGlubmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMuZG93bi5vbignbW91c2Vtb3ZlLnRvdWNoc3BpbiB0b3VjaG1vdmUudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgaWYgKCFzcGlubmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMudXAub24oJ21vdXNlbW92ZS50b3VjaHNwaW4gdG91Y2htb3ZlLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGlmICghc3Bpbm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ21vdXNld2hlZWwudG91Y2hzcGluIERPTU1vdXNlU2Nyb2xsLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGlmICghc2V0dGluZ3MubW91c2V3aGVlbCB8fCAhb3JpZ2luYWxpbnB1dC5pcygnOmZvY3VzJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGRlbHRhID0gZXYub3JpZ2luYWxFdmVudC53aGVlbERlbHRhIHx8IC1ldi5vcmlnaW5hbEV2ZW50LmRlbHRhWSB8fCAtZXYub3JpZ2luYWxFdmVudC5kZXRhaWw7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBpZiAoZGVsdGEgPCAwKSB7XG4gICAgICAgICAgICBkb3duT25jZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cE9uY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2JpbmRFdmVudHNJbnRlcmZhY2UoKSB7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ3RvdWNoc3Bpbi5kZXN0cm95JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF9kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCd0b3VjaHNwaW4udXBvbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgICAgdXBPbmNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCd0b3VjaHNwaW4uZG93bm9uY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgICBkb3duT25jZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5vbigndG91Y2hzcGluLnN0YXJ0dXBzcGluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN0YXJ0VXBTcGluKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCd0b3VjaHNwaW4uc3RhcnRkb3duc3BpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzdGFydERvd25TcGluKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCd0b3VjaHNwaW4uc3RvcHNwaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ3RvdWNoc3Bpbi51cGRhdGVzZXR0aW5ncycsIGZ1bmN0aW9uIChlLCBuZXdzZXR0aW5ncykge1xuICAgICAgICAgIGNoYW5nZVNldHRpbmdzKG5ld3NldHRpbmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfc2V0dXBNdXRhdGlvbk9ic2VydmVycygpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9ucykge1xuICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG11dGF0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycgJiYgKG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdkaXNhYmxlZCcgfHwgbXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ3JlYWRvbmx5JykpIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlQnV0dG9uRGlzYWJsZWRTdGF0ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKG9yaWdpbmFsaW5wdXRbMF0sIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2ZvcmNlc3RlcGRpdmlzaWJpbGl0eSh2YWx1ZSkge1xuICAgICAgICBzd2l0Y2ggKHNldHRpbmdzLmZvcmNlc3RlcGRpdmlzaWJpbGl0eSkge1xuICAgICAgICAgIGNhc2UgJ3JvdW5kJzpcbiAgICAgICAgICAgIHJldHVybiAoTWF0aC5yb3VuZCh2YWx1ZSAvIHNldHRpbmdzLnN0ZXApICogc2V0dGluZ3Muc3RlcCkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscyk7XG4gICAgICAgICAgY2FzZSAnZmxvb3InOlxuICAgICAgICAgICAgcmV0dXJuIChNYXRoLmZsb29yKHZhbHVlIC8gc2V0dGluZ3Muc3RlcCkgKiBzZXR0aW5ncy5zdGVwKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKTtcbiAgICAgICAgICBjYXNlICdjZWlsJzpcbiAgICAgICAgICAgIHJldHVybiAoTWF0aC5jZWlsKHZhbHVlIC8gc2V0dGluZ3Muc3RlcCkgKiBzZXR0aW5ncy5zdGVwKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoc2V0dGluZ3MuZGVjaW1hbHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfY2hlY2tWYWx1ZSgpIHtcbiAgICAgICAgdmFyIHZhbCwgcGFyc2VkdmFsLCByZXR1cm52YWw7XG4gICAgICAgIHZhbCA9IHNldHRpbmdzLmNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbihvcmlnaW5hbGlucHV0LnZhbCgpKTtcbiAgICAgICAgaWYgKHZhbCA9PT0gJycpIHtcbiAgICAgICAgICBpZiAoc2V0dGluZ3MucmVwbGFjZW1lbnR2YWwgIT09ICcnKSB7XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnZhbChzZXR0aW5ncy5yZXBsYWNlbWVudHZhbCk7XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLmRlY2ltYWxzID4gMCAmJiB2YWwgPT09ICcuJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXJzZWR2YWwgPSBwYXJzZUZsb2F0KHZhbCk7XG4gICAgICAgIGlmIChpc05hTihwYXJzZWR2YWwpKSB7XG4gICAgICAgICAgaWYgKHNldHRpbmdzLnJlcGxhY2VtZW50dmFsICE9PSAnJykge1xuICAgICAgICAgICAgcGFyc2VkdmFsID0gc2V0dGluZ3MucmVwbGFjZW1lbnR2YWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlZHZhbCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybnZhbCA9IHBhcnNlZHZhbDtcbiAgICAgICAgaWYgKHBhcnNlZHZhbC50b1N0cmluZygpICE9PSB2YWwpIHtcbiAgICAgICAgICByZXR1cm52YWwgPSBwYXJzZWR2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJudmFsID0gX2ZvcmNlc3RlcGRpdmlzaWJpbGl0eShwYXJzZWR2YWwpO1xuICAgICAgICBpZiAoc2V0dGluZ3MubWluICE9PSBudWxsICYmIHBhcnNlZHZhbCA8IHNldHRpbmdzLm1pbikge1xuICAgICAgICAgIHJldHVybnZhbCA9IHNldHRpbmdzLm1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MubWF4ICE9PSBudWxsICYmIHBhcnNlZHZhbCA+IHNldHRpbmdzLm1heCkge1xuICAgICAgICAgIHJldHVybnZhbCA9IHNldHRpbmdzLm1heDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VGbG9hdChwYXJzZWR2YWwpLnRvU3RyaW5nKCkgIT09IHBhcnNlRmxvYXQocmV0dXJudmFsKS50b1N0cmluZygpKSB7XG4gICAgICAgICAgb3JpZ2luYWxpbnB1dC52YWwocmV0dXJudmFsKTtcbiAgICAgICAgfVxuICAgICAgICBvcmlnaW5hbGlucHV0LnZhbChzZXR0aW5ncy5jYWxsYmFja19hZnRlcl9jYWxjdWxhdGlvbihwYXJzZUZsb2F0KHJldHVybnZhbCkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscykpKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9nZXRCb29zdGVkU3RlcCgpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncy5ib29zdGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHNldHRpbmdzLnN0ZXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGJvb3N0ZWQgPSBNYXRoLnBvdygyLCBNYXRoLmZsb29yKHNwaW5jb3VudCAvIHNldHRpbmdzLmJvb3N0YXQpKSAqIHNldHRpbmdzLnN0ZXA7XG4gICAgICAgICAgaWYgKHNldHRpbmdzLm1heGJvb3N0ZWRzdGVwKSB7XG4gICAgICAgICAgICBpZiAoYm9vc3RlZCA+IHNldHRpbmdzLm1heGJvb3N0ZWRzdGVwKSB7XG4gICAgICAgICAgICAgIGJvb3N0ZWQgPSBzZXR0aW5ncy5tYXhib29zdGVkc3RlcDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gYm9vc3RlZCkgKiBib29zdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoc2V0dGluZ3Muc3RlcCwgYm9vc3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHZhbHVlSWZJc05hTigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5maXJzdGNsaWNrdmFsdWVpZmVtcHR5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5maXJzdGNsaWNrdmFsdWVpZmVtcHR5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAoc2V0dGluZ3MubWluICsgc2V0dGluZ3MubWF4KSAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF91cGRhdGVCdXR0b25EaXNhYmxlZFN0YXRlKCkge1xuICAgICAgICB2YXIgaXNEaXNhYmxlZCA9IG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJyk7XG4gICAgICAgIGVsZW1lbnRzLnVwLnByb3AoJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7XG4gICAgICAgIGVsZW1lbnRzLmRvd24ucHJvcCgnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgICAgICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1cE9uY2UoKSB7XG4gICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIF9jaGVja1ZhbHVlKCk7XG4gICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdChzZXR0aW5ncy5jYWxsYmFja19iZWZvcmVfY2FsY3VsYXRpb24oZWxlbWVudHMuaW5wdXQudmFsKCkpKTtcbiAgICAgICAgdmFyIGluaXR2YWx1ZSA9IHZhbHVlO1xuICAgICAgICB2YXIgYm9vc3RlZHN0ZXA7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlSWZJc05hTigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvb3N0ZWRzdGVwID0gX2dldEJvb3N0ZWRTdGVwKCk7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZSArIGJvb3N0ZWRzdGVwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5tYXggIT09IG51bGwgJiYgdmFsdWUgPj0gc2V0dGluZ3MubWF4KSB7XG4gICAgICAgICAgdmFsdWUgPSBzZXR0aW5ncy5tYXg7XG4gICAgICAgICAgb3JpZ2luYWxpbnB1dC50cmlnZ2VyKCd0b3VjaHNwaW4ub24ubWF4Jyk7XG4gICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cy5pbnB1dC52YWwoc2V0dGluZ3MuY2FsbGJhY2tfYWZ0ZXJfY2FsY3VsYXRpb24ocGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscykpKTtcbiAgICAgICAgaWYgKGluaXR2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkb3duT25jZSgpIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX2NoZWNrVmFsdWUoKTtcbiAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHNldHRpbmdzLmNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbihlbGVtZW50cy5pbnB1dC52YWwoKSkpO1xuICAgICAgICB2YXIgaW5pdHZhbHVlID0gdmFsdWU7XG4gICAgICAgIHZhciBib29zdGVkc3RlcDtcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVJZklzTmFOKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYm9vc3RlZHN0ZXAgPSBfZ2V0Qm9vc3RlZFN0ZXAoKTtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlIC0gYm9vc3RlZHN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLm1pbiAhPT0gbnVsbCAmJiB2YWx1ZSA8PSBzZXR0aW5ncy5taW4pIHtcbiAgICAgICAgICB2YWx1ZSA9IHNldHRpbmdzLm1pbjtcbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5taW4nKTtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLmlucHV0LnZhbChzZXR0aW5ncy5jYWxsYmFja19hZnRlcl9jYWxjdWxhdGlvbihwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKSkpO1xuICAgICAgICBpZiAoaW5pdHZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHN0YXJ0RG93blNwaW4oKSB7XG4gICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgIHNwaW5jb3VudCA9IDA7XG4gICAgICAgIHNwaW5uaW5nID0gJ2Rvd24nO1xuICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdGFydHNwaW4nKTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC50cmlnZ2VyKCd0b3VjaHNwaW4ub24uc3RhcnRkb3duc3BpbicpO1xuICAgICAgICBkb3duRGVsYXlUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZG93blNwaW5UaW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNwaW5jb3VudCsrO1xuICAgICAgICAgICAgZG93bk9uY2UoKTtcbiAgICAgICAgICB9LCBzZXR0aW5ncy5zdGVwaW50ZXJ2YWwpO1xuICAgICAgICB9LCBzZXR0aW5ncy5zdGVwaW50ZXJ2YWxkZWxheSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBzdGFydFVwU3BpbigpIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgc3BpbmNvdW50ID0gMDtcbiAgICAgICAgc3Bpbm5pbmcgPSAndXAnO1xuICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdGFydHNwaW4nKTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC50cmlnZ2VyKCd0b3VjaHNwaW4ub24uc3RhcnR1cHNwaW4nKTtcbiAgICAgICAgdXBEZWxheVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1cFNwaW5UaW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNwaW5jb3VudCsrO1xuICAgICAgICAgICAgdXBPbmNlKCk7XG4gICAgICAgICAgfSwgc2V0dGluZ3Muc3RlcGludGVydmFsKTtcbiAgICAgICAgfSwgc2V0dGluZ3Muc3RlcGludGVydmFsZGVsYXkpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gc3RvcFNwaW4oKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChkb3duRGVsYXlUaW1lb3V0KTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHVwRGVsYXlUaW1lb3V0KTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChkb3duU3BpblRpbWVyKTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh1cFNwaW5UaW1lcik7XG4gICAgICAgIHN3aXRjaCAoc3Bpbm5pbmcpIHtcbiAgICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdG9wdXBzcGluJyk7XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdG9wc3BpbicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdG9wZG93bnNwaW4nKTtcbiAgICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcigndG91Y2hzcGluLm9uLnN0b3BzcGluJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzcGluY291bnQgPSAwO1xuICAgICAgICBzcGlubmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1qcXVlcnkuYm9vdHN0cmFwLXRvdWNoc3Bpbi5qcy5tYXBcbiIsIi8qIVxuICogQGZpbGVPdmVydmlldyBUb3VjaFN3aXBlIC0galF1ZXJ5IFBsdWdpblxuICogQHZlcnNpb24gMS42LjE4XG4gKlxuICogQGF1dGhvciBNYXR0IEJyeXNvbiBodHRwOi8vd3d3LmdpdGh1Yi5jb20vbWF0dGJyeXNvblxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWF0dGJyeXNvbi9Ub3VjaFN3aXBlLUpxdWVyeS1QbHVnaW5cbiAqIEBzZWUgaHR0cDovL2xhYnMucmFtcGludGVyYWN0aXZlLmNvLnVrL3RvdWNoU3dpcGUvXG4gKiBAc2VlIGh0dHA6Ly9wbHVnaW5zLmpxdWVyeS5jb20vcHJvamVjdC90b3VjaFN3aXBlXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgTWF0dCBCcnlzb25cbiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLlxuICpcbiAqL1xuIWZ1bmN0aW9uKGZhY3Rvcnkpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnk/ZGVmaW5lKFtcImpxdWVyeVwiXSxmYWN0b3J5KTpmYWN0b3J5KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP3JlcXVpcmUoXCJqcXVlcnlcIik6alF1ZXJ5KX0oZnVuY3Rpb24oJCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaW5pdChvcHRpb25zKXtyZXR1cm4hb3B0aW9uc3x8dm9pZCAwIT09b3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGx8fHZvaWQgMD09PW9wdGlvbnMuc3dpcGUmJnZvaWQgMD09PW9wdGlvbnMuc3dpcGVTdGF0dXN8fChvcHRpb25zLmFsbG93UGFnZVNjcm9sbD1OT05FKSx2b2lkIDAhPT1vcHRpb25zLmNsaWNrJiZ2b2lkIDA9PT1vcHRpb25zLnRhcCYmKG9wdGlvbnMudGFwPW9wdGlvbnMuY2xpY2spLG9wdGlvbnN8fChvcHRpb25zPXt9KSxvcHRpb25zPSQuZXh0ZW5kKHt9LCQuZm4uc3dpcGUuZGVmYXVsdHMsb3B0aW9ucyksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICR0aGlzPSQodGhpcykscGx1Z2luPSR0aGlzLmRhdGEoUExVR0lOX05TKTtwbHVnaW58fChwbHVnaW49bmV3IFRvdWNoU3dpcGUodGhpcyxvcHRpb25zKSwkdGhpcy5kYXRhKFBMVUdJTl9OUyxwbHVnaW4pKX0pfWZ1bmN0aW9uIFRvdWNoU3dpcGUoZWxlbWVudCxvcHRpb25zKXtmdW5jdGlvbiB0b3VjaFN0YXJ0KGpxRXZlbnQpe2lmKCEoZ2V0VG91Y2hJblByb2dyZXNzKCl8fCQoanFFdmVudC50YXJnZXQpLmNsb3Nlc3Qob3B0aW9ucy5leGNsdWRlZEVsZW1lbnRzLCRlbGVtZW50KS5sZW5ndGg+MCkpe3ZhciBldmVudD1qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ/anFFdmVudC5vcmlnaW5hbEV2ZW50OmpxRXZlbnQ7aWYoIWV2ZW50LnBvaW50ZXJUeXBlfHxcIm1vdXNlXCIhPWV2ZW50LnBvaW50ZXJUeXBlfHwwIT1vcHRpb25zLmZhbGxiYWNrVG9Nb3VzZUV2ZW50cyl7dmFyIHJldCx0b3VjaGVzPWV2ZW50LnRvdWNoZXMsZXZ0PXRvdWNoZXM/dG91Y2hlc1swXTpldmVudDtyZXR1cm4gcGhhc2U9UEhBU0VfU1RBUlQsdG91Y2hlcz9maW5nZXJDb3VudD10b3VjaGVzLmxlbmd0aDpvcHRpb25zLnByZXZlbnREZWZhdWx0RXZlbnRzIT09ITEmJmpxRXZlbnQucHJldmVudERlZmF1bHQoKSxkaXN0YW5jZT0wLGRpcmVjdGlvbj1udWxsLGN1cnJlbnREaXJlY3Rpb249bnVsbCxwaW5jaERpcmVjdGlvbj1udWxsLGR1cmF0aW9uPTAsc3RhcnRUb3VjaGVzRGlzdGFuY2U9MCxlbmRUb3VjaGVzRGlzdGFuY2U9MCxwaW5jaFpvb209MSxwaW5jaERpc3RhbmNlPTAsbWF4aW11bXNNYXA9Y3JlYXRlTWF4aW11bXNEYXRhKCksY2FuY2VsTXVsdGlGaW5nZXJSZWxlYXNlKCksY3JlYXRlRmluZ2VyRGF0YSgwLGV2dCksIXRvdWNoZXN8fGZpbmdlckNvdW50PT09b3B0aW9ucy5maW5nZXJzfHxvcHRpb25zLmZpbmdlcnM9PT1BTExfRklOR0VSU3x8aGFzUGluY2hlcygpPyhzdGFydFRpbWU9Z2V0VGltZVN0YW1wKCksMj09ZmluZ2VyQ291bnQmJihjcmVhdGVGaW5nZXJEYXRhKDEsdG91Y2hlc1sxXSksc3RhcnRUb3VjaGVzRGlzdGFuY2U9ZW5kVG91Y2hlc0Rpc3RhbmNlPWNhbGN1bGF0ZVRvdWNoZXNEaXN0YW5jZShmaW5nZXJEYXRhWzBdLnN0YXJ0LGZpbmdlckRhdGFbMV0uc3RhcnQpKSwob3B0aW9ucy5zd2lwZVN0YXR1c3x8b3B0aW9ucy5waW5jaFN0YXR1cykmJihyZXQ9dHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpKSk6cmV0PSExLHJldD09PSExPyhwaGFzZT1QSEFTRV9DQU5DRUwsdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpLHJldCk6KG9wdGlvbnMuaG9sZCYmKGhvbGRUaW1lb3V0PXNldFRpbWVvdXQoJC5wcm94eShmdW5jdGlvbigpeyRlbGVtZW50LnRyaWdnZXIoXCJob2xkXCIsW2V2ZW50LnRhcmdldF0pLG9wdGlvbnMuaG9sZCYmKHJldD1vcHRpb25zLmhvbGQuY2FsbCgkZWxlbWVudCxldmVudCxldmVudC50YXJnZXQpKX0sdGhpcyksb3B0aW9ucy5sb25nVGFwVGhyZXNob2xkKSksc2V0VG91Y2hJblByb2dyZXNzKCEwKSxudWxsKX19fWZ1bmN0aW9uIHRvdWNoTW92ZShqcUV2ZW50KXt2YXIgZXZlbnQ9anFFdmVudC5vcmlnaW5hbEV2ZW50P2pxRXZlbnQub3JpZ2luYWxFdmVudDpqcUV2ZW50O2lmKHBoYXNlIT09UEhBU0VfRU5EJiZwaGFzZSE9PVBIQVNFX0NBTkNFTCYmIWluTXVsdGlGaW5nZXJSZWxlYXNlKCkpe3ZhciByZXQsdG91Y2hlcz1ldmVudC50b3VjaGVzLGV2dD10b3VjaGVzP3RvdWNoZXNbMF06ZXZlbnQsY3VycmVudEZpbmdlcj11cGRhdGVGaW5nZXJEYXRhKGV2dCk7aWYoZW5kVGltZT1nZXRUaW1lU3RhbXAoKSx0b3VjaGVzJiYoZmluZ2VyQ291bnQ9dG91Y2hlcy5sZW5ndGgpLG9wdGlvbnMuaG9sZCYmY2xlYXJUaW1lb3V0KGhvbGRUaW1lb3V0KSxwaGFzZT1QSEFTRV9NT1ZFLDI9PWZpbmdlckNvdW50JiYoMD09c3RhcnRUb3VjaGVzRGlzdGFuY2U/KGNyZWF0ZUZpbmdlckRhdGEoMSx0b3VjaGVzWzFdKSxzdGFydFRvdWNoZXNEaXN0YW5jZT1lbmRUb3VjaGVzRGlzdGFuY2U9Y2FsY3VsYXRlVG91Y2hlc0Rpc3RhbmNlKGZpbmdlckRhdGFbMF0uc3RhcnQsZmluZ2VyRGF0YVsxXS5zdGFydCkpOih1cGRhdGVGaW5nZXJEYXRhKHRvdWNoZXNbMV0pLGVuZFRvdWNoZXNEaXN0YW5jZT1jYWxjdWxhdGVUb3VjaGVzRGlzdGFuY2UoZmluZ2VyRGF0YVswXS5lbmQsZmluZ2VyRGF0YVsxXS5lbmQpLHBpbmNoRGlyZWN0aW9uPWNhbGN1bGF0ZVBpbmNoRGlyZWN0aW9uKGZpbmdlckRhdGFbMF0uZW5kLGZpbmdlckRhdGFbMV0uZW5kKSkscGluY2hab29tPWNhbGN1bGF0ZVBpbmNoWm9vbShzdGFydFRvdWNoZXNEaXN0YW5jZSxlbmRUb3VjaGVzRGlzdGFuY2UpLHBpbmNoRGlzdGFuY2U9TWF0aC5hYnMoc3RhcnRUb3VjaGVzRGlzdGFuY2UtZW5kVG91Y2hlc0Rpc3RhbmNlKSksZmluZ2VyQ291bnQ9PT1vcHRpb25zLmZpbmdlcnN8fG9wdGlvbnMuZmluZ2Vycz09PUFMTF9GSU5HRVJTfHwhdG91Y2hlc3x8aGFzUGluY2hlcygpKXtpZihkaXJlY3Rpb249Y2FsY3VsYXRlRGlyZWN0aW9uKGN1cnJlbnRGaW5nZXIuc3RhcnQsY3VycmVudEZpbmdlci5lbmQpLGN1cnJlbnREaXJlY3Rpb249Y2FsY3VsYXRlRGlyZWN0aW9uKGN1cnJlbnRGaW5nZXIubGFzdCxjdXJyZW50RmluZ2VyLmVuZCksdmFsaWRhdGVEZWZhdWx0RXZlbnQoanFFdmVudCxjdXJyZW50RGlyZWN0aW9uKSxkaXN0YW5jZT1jYWxjdWxhdGVEaXN0YW5jZShjdXJyZW50RmluZ2VyLnN0YXJ0LGN1cnJlbnRGaW5nZXIuZW5kKSxkdXJhdGlvbj1jYWxjdWxhdGVEdXJhdGlvbigpLHNldE1heERpc3RhbmNlKGRpcmVjdGlvbixkaXN0YW5jZSkscmV0PXRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKSwhb3B0aW9ucy50cmlnZ2VyT25Ub3VjaEVuZHx8b3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlKXt2YXIgaW5Cb3VuZHM9ITA7aWYob3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlKXt2YXIgYm91bmRzPWdldGJvdW5kcyh0aGlzKTtpbkJvdW5kcz1pc0luQm91bmRzKGN1cnJlbnRGaW5nZXIuZW5kLGJvdW5kcyl9IW9wdGlvbnMudHJpZ2dlck9uVG91Y2hFbmQmJmluQm91bmRzP3BoYXNlPWdldE5leHRQaGFzZShQSEFTRV9NT1ZFKTpvcHRpb25zLnRyaWdnZXJPblRvdWNoTGVhdmUmJiFpbkJvdW5kcyYmKHBoYXNlPWdldE5leHRQaGFzZShQSEFTRV9FTkQpKSxwaGFzZSE9UEhBU0VfQ0FOQ0VMJiZwaGFzZSE9UEhBU0VfRU5EfHx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSl9fWVsc2UgcGhhc2U9UEhBU0VfQ0FOQ0VMLHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKTtyZXQ9PT0hMSYmKHBoYXNlPVBIQVNFX0NBTkNFTCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpfX1mdW5jdGlvbiB0b3VjaEVuZChqcUV2ZW50KXt2YXIgZXZlbnQ9anFFdmVudC5vcmlnaW5hbEV2ZW50P2pxRXZlbnQub3JpZ2luYWxFdmVudDpqcUV2ZW50LHRvdWNoZXM9ZXZlbnQudG91Y2hlcztpZih0b3VjaGVzKXtpZih0b3VjaGVzLmxlbmd0aCYmIWluTXVsdGlGaW5nZXJSZWxlYXNlKCkpcmV0dXJuIHN0YXJ0TXVsdGlGaW5nZXJSZWxlYXNlKGV2ZW50KSwhMDtpZih0b3VjaGVzLmxlbmd0aCYmaW5NdWx0aUZpbmdlclJlbGVhc2UoKSlyZXR1cm4hMH1yZXR1cm4gaW5NdWx0aUZpbmdlclJlbGVhc2UoKSYmKGZpbmdlckNvdW50PWZpbmdlckNvdW50QXRSZWxlYXNlKSxlbmRUaW1lPWdldFRpbWVTdGFtcCgpLGR1cmF0aW9uPWNhbGN1bGF0ZUR1cmF0aW9uKCksZGlkU3dpcGVCYWNrVG9DYW5jZWwoKXx8IXZhbGlkYXRlU3dpcGVEaXN0YW5jZSgpPyhwaGFzZT1QSEFTRV9DQU5DRUwsdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpKTpvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kfHxvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kPT09ITEmJnBoYXNlPT09UEhBU0VfTU9WRT8ob3B0aW9ucy5wcmV2ZW50RGVmYXVsdEV2ZW50cyE9PSExJiZqcUV2ZW50LmNhbmNlbGFibGUhPT0hMSYmanFFdmVudC5wcmV2ZW50RGVmYXVsdCgpLHBoYXNlPVBIQVNFX0VORCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpOiFvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kJiZoYXNUYXAoKT8ocGhhc2U9UEhBU0VfRU5ELHRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxUQVApKTpwaGFzZT09PVBIQVNFX01PVkUmJihwaGFzZT1QSEFTRV9DQU5DRUwsdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpKSxzZXRUb3VjaEluUHJvZ3Jlc3MoITEpLG51bGx9ZnVuY3Rpb24gdG91Y2hDYW5jZWwoKXtmaW5nZXJDb3VudD0wLGVuZFRpbWU9MCxzdGFydFRpbWU9MCxzdGFydFRvdWNoZXNEaXN0YW5jZT0wLGVuZFRvdWNoZXNEaXN0YW5jZT0wLHBpbmNoWm9vbT0xLGNhbmNlbE11bHRpRmluZ2VyUmVsZWFzZSgpLHNldFRvdWNoSW5Qcm9ncmVzcyghMSl9ZnVuY3Rpb24gdG91Y2hMZWF2ZShqcUV2ZW50KXt2YXIgZXZlbnQ9anFFdmVudC5vcmlnaW5hbEV2ZW50P2pxRXZlbnQub3JpZ2luYWxFdmVudDpqcUV2ZW50O29wdGlvbnMudHJpZ2dlck9uVG91Y2hMZWF2ZSYmKHBoYXNlPWdldE5leHRQaGFzZShQSEFTRV9FTkQpLHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKSl9ZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKCl7JGVsZW1lbnQub2ZmKFNUQVJUX0VWLHRvdWNoU3RhcnQpLCRlbGVtZW50Lm9mZihDQU5DRUxfRVYsdG91Y2hDYW5jZWwpLCRlbGVtZW50Lm9mZihNT1ZFX0VWLHRvdWNoTW92ZSksJGVsZW1lbnQub2ZmKEVORF9FVix0b3VjaEVuZCksTEVBVkVfRVYmJiRlbGVtZW50Lm9mZihMRUFWRV9FVix0b3VjaExlYXZlKSxzZXRUb3VjaEluUHJvZ3Jlc3MoITEpfWZ1bmN0aW9uIGdldE5leHRQaGFzZShjdXJyZW50UGhhc2Upe3ZhciBuZXh0UGhhc2U9Y3VycmVudFBoYXNlLHZhbGlkVGltZT12YWxpZGF0ZVN3aXBlVGltZSgpLHZhbGlkRGlzdGFuY2U9dmFsaWRhdGVTd2lwZURpc3RhbmNlKCksZGlkQ2FuY2VsPWRpZFN3aXBlQmFja1RvQ2FuY2VsKCk7cmV0dXJuIXZhbGlkVGltZXx8ZGlkQ2FuY2VsP25leHRQaGFzZT1QSEFTRV9DQU5DRUw6IXZhbGlkRGlzdGFuY2V8fGN1cnJlbnRQaGFzZSE9UEhBU0VfTU9WRXx8b3B0aW9ucy50cmlnZ2VyT25Ub3VjaEVuZCYmIW9wdGlvbnMudHJpZ2dlck9uVG91Y2hMZWF2ZT8hdmFsaWREaXN0YW5jZSYmY3VycmVudFBoYXNlPT1QSEFTRV9FTkQmJm9wdGlvbnMudHJpZ2dlck9uVG91Y2hMZWF2ZSYmKG5leHRQaGFzZT1QSEFTRV9DQU5DRUwpOm5leHRQaGFzZT1QSEFTRV9FTkQsbmV4dFBoYXNlfWZ1bmN0aW9uIHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKXt2YXIgcmV0LHRvdWNoZXM9ZXZlbnQudG91Y2hlcztyZXR1cm4oZGlkU3dpcGUoKXx8aGFzU3dpcGVzKCkpJiYocmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxTV0lQRSkpLChkaWRQaW5jaCgpfHxoYXNQaW5jaGVzKCkpJiZyZXQhPT0hMSYmKHJldD10cmlnZ2VySGFuZGxlckZvckdlc3R1cmUoZXZlbnQscGhhc2UsUElOQ0gpKSxkaWREb3VibGVUYXAoKSYmcmV0IT09ITE/cmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxET1VCTEVfVEFQKTpkaWRMb25nVGFwKCkmJnJldCE9PSExP3JldD10cmlnZ2VySGFuZGxlckZvckdlc3R1cmUoZXZlbnQscGhhc2UsTE9OR19UQVApOmRpZFRhcCgpJiZyZXQhPT0hMSYmKHJldD10cmlnZ2VySGFuZGxlckZvckdlc3R1cmUoZXZlbnQscGhhc2UsVEFQKSkscGhhc2U9PT1QSEFTRV9DQU5DRUwmJnRvdWNoQ2FuY2VsKGV2ZW50KSxwaGFzZT09PVBIQVNFX0VORCYmKHRvdWNoZXM/dG91Y2hlcy5sZW5ndGh8fHRvdWNoQ2FuY2VsKGV2ZW50KTp0b3VjaENhbmNlbChldmVudCkpLHJldH1mdW5jdGlvbiB0cmlnZ2VySGFuZGxlckZvckdlc3R1cmUoZXZlbnQscGhhc2UsZ2VzdHVyZSl7dmFyIHJldDtpZihnZXN0dXJlPT1TV0lQRSl7aWYoJGVsZW1lbnQudHJpZ2dlcihcInN3aXBlU3RhdHVzXCIsW3BoYXNlLGRpcmVjdGlvbnx8bnVsbCxkaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlU3RhdHVzJiYocmV0PW9wdGlvbnMuc3dpcGVTdGF0dXMuY2FsbCgkZWxlbWVudCxldmVudCxwaGFzZSxkaXJlY3Rpb258fG51bGwsZGlzdGFuY2V8fDAsZHVyYXRpb258fDAsZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uKSxyZXQ9PT0hMSkpcmV0dXJuITE7aWYocGhhc2U9PVBIQVNFX0VORCYmdmFsaWRhdGVTd2lwZSgpKXtpZihjbGVhclRpbWVvdXQoc2luZ2xlVGFwVGltZW91dCksY2xlYXJUaW1lb3V0KGhvbGRUaW1lb3V0KSwkZWxlbWVudC50cmlnZ2VyKFwic3dpcGVcIixbZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbl0pLG9wdGlvbnMuc3dpcGUmJihyZXQ9b3B0aW9ucy5zd2lwZS5jYWxsKCRlbGVtZW50LGV2ZW50LGRpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pLHJldD09PSExKSlyZXR1cm4hMTtzd2l0Y2goZGlyZWN0aW9uKXtjYXNlIExFRlQ6JGVsZW1lbnQudHJpZ2dlcihcInN3aXBlTGVmdFwiLFtkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uXSksb3B0aW9ucy5zd2lwZUxlZnQmJihyZXQ9b3B0aW9ucy5zd2lwZUxlZnQuY2FsbCgkZWxlbWVudCxldmVudCxkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uKSk7YnJlYWs7Y2FzZSBSSUdIVDokZWxlbWVudC50cmlnZ2VyKFwic3dpcGVSaWdodFwiLFtkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uXSksb3B0aW9ucy5zd2lwZVJpZ2h0JiYocmV0PW9wdGlvbnMuc3dpcGVSaWdodC5jYWxsKCRlbGVtZW50LGV2ZW50LGRpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pKTticmVhaztjYXNlIFVQOiRlbGVtZW50LnRyaWdnZXIoXCJzd2lwZVVwXCIsW2RpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlVXAmJihyZXQ9b3B0aW9ucy5zd2lwZVVwLmNhbGwoJGVsZW1lbnQsZXZlbnQsZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbikpO2JyZWFrO2Nhc2UgRE9XTjokZWxlbWVudC50cmlnZ2VyKFwic3dpcGVEb3duXCIsW2RpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlRG93biYmKHJldD1vcHRpb25zLnN3aXBlRG93bi5jYWxsKCRlbGVtZW50LGV2ZW50LGRpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pKX19fWlmKGdlc3R1cmU9PVBJTkNIKXtpZigkZWxlbWVudC50cmlnZ2VyKFwicGluY2hTdGF0dXNcIixbcGhhc2UscGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YV0pLG9wdGlvbnMucGluY2hTdGF0dXMmJihyZXQ9b3B0aW9ucy5waW5jaFN0YXR1cy5jYWxsKCRlbGVtZW50LGV2ZW50LHBoYXNlLHBpbmNoRGlyZWN0aW9ufHxudWxsLHBpbmNoRGlzdGFuY2V8fDAsZHVyYXRpb258fDAsZmluZ2VyQ291bnQscGluY2hab29tLGZpbmdlckRhdGEpLHJldD09PSExKSlyZXR1cm4hMTtpZihwaGFzZT09UEhBU0VfRU5EJiZ2YWxpZGF0ZVBpbmNoKCkpc3dpdGNoKHBpbmNoRGlyZWN0aW9uKXtjYXNlIElOOiRlbGVtZW50LnRyaWdnZXIoXCJwaW5jaEluXCIsW3BpbmNoRGlyZWN0aW9ufHxudWxsLHBpbmNoRGlzdGFuY2V8fDAsZHVyYXRpb258fDAsZmluZ2VyQ291bnQscGluY2hab29tLGZpbmdlckRhdGFdKSxvcHRpb25zLnBpbmNoSW4mJihyZXQ9b3B0aW9ucy5waW5jaEluLmNhbGwoJGVsZW1lbnQsZXZlbnQscGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YSkpO2JyZWFrO2Nhc2UgT1VUOiRlbGVtZW50LnRyaWdnZXIoXCJwaW5jaE91dFwiLFtwaW5jaERpcmVjdGlvbnx8bnVsbCxwaW5jaERpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LHBpbmNoWm9vbSxmaW5nZXJEYXRhXSksb3B0aW9ucy5waW5jaE91dCYmKHJldD1vcHRpb25zLnBpbmNoT3V0LmNhbGwoJGVsZW1lbnQsZXZlbnQscGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YSkpfX1yZXR1cm4gZ2VzdHVyZT09VEFQP3BoYXNlIT09UEhBU0VfQ0FOQ0VMJiZwaGFzZSE9PVBIQVNFX0VORHx8KGNsZWFyVGltZW91dChzaW5nbGVUYXBUaW1lb3V0KSxjbGVhclRpbWVvdXQoaG9sZFRpbWVvdXQpLGhhc0RvdWJsZVRhcCgpJiYhaW5Eb3VibGVUYXAoKT8oZG91YmxlVGFwU3RhcnRUaW1lPWdldFRpbWVTdGFtcCgpLHNpbmdsZVRhcFRpbWVvdXQ9c2V0VGltZW91dCgkLnByb3h5KGZ1bmN0aW9uKCl7ZG91YmxlVGFwU3RhcnRUaW1lPW51bGwsJGVsZW1lbnQudHJpZ2dlcihcInRhcFwiLFtldmVudC50YXJnZXRdKSxvcHRpb25zLnRhcCYmKHJldD1vcHRpb25zLnRhcC5jYWxsKCRlbGVtZW50LGV2ZW50LGV2ZW50LnRhcmdldCkpfSx0aGlzKSxvcHRpb25zLmRvdWJsZVRhcFRocmVzaG9sZCkpOihkb3VibGVUYXBTdGFydFRpbWU9bnVsbCwkZWxlbWVudC50cmlnZ2VyKFwidGFwXCIsW2V2ZW50LnRhcmdldF0pLG9wdGlvbnMudGFwJiYocmV0PW9wdGlvbnMudGFwLmNhbGwoJGVsZW1lbnQsZXZlbnQsZXZlbnQudGFyZ2V0KSkpKTpnZXN0dXJlPT1ET1VCTEVfVEFQP3BoYXNlIT09UEhBU0VfQ0FOQ0VMJiZwaGFzZSE9PVBIQVNFX0VORHx8KGNsZWFyVGltZW91dChzaW5nbGVUYXBUaW1lb3V0KSxjbGVhclRpbWVvdXQoaG9sZFRpbWVvdXQpLGRvdWJsZVRhcFN0YXJ0VGltZT1udWxsLCRlbGVtZW50LnRyaWdnZXIoXCJkb3VibGV0YXBcIixbZXZlbnQudGFyZ2V0XSksb3B0aW9ucy5kb3VibGVUYXAmJihyZXQ9b3B0aW9ucy5kb3VibGVUYXAuY2FsbCgkZWxlbWVudCxldmVudCxldmVudC50YXJnZXQpKSk6Z2VzdHVyZT09TE9OR19UQVAmJihwaGFzZSE9PVBIQVNFX0NBTkNFTCYmcGhhc2UhPT1QSEFTRV9FTkR8fChjbGVhclRpbWVvdXQoc2luZ2xlVGFwVGltZW91dCksZG91YmxlVGFwU3RhcnRUaW1lPW51bGwsJGVsZW1lbnQudHJpZ2dlcihcImxvbmd0YXBcIixbZXZlbnQudGFyZ2V0XSksb3B0aW9ucy5sb25nVGFwJiYocmV0PW9wdGlvbnMubG9uZ1RhcC5jYWxsKCRlbGVtZW50LGV2ZW50LGV2ZW50LnRhcmdldCkpKSkscmV0fWZ1bmN0aW9uIHZhbGlkYXRlU3dpcGVEaXN0YW5jZSgpe3ZhciB2YWxpZD0hMDtyZXR1cm4gbnVsbCE9PW9wdGlvbnMudGhyZXNob2xkJiYodmFsaWQ9ZGlzdGFuY2U+PW9wdGlvbnMudGhyZXNob2xkKSx2YWxpZH1mdW5jdGlvbiBkaWRTd2lwZUJhY2tUb0NhbmNlbCgpe3ZhciBjYW5jZWxsZWQ9ITE7cmV0dXJuIG51bGwhPT1vcHRpb25zLmNhbmNlbFRocmVzaG9sZCYmbnVsbCE9PWRpcmVjdGlvbiYmKGNhbmNlbGxlZD1nZXRNYXhEaXN0YW5jZShkaXJlY3Rpb24pLWRpc3RhbmNlPj1vcHRpb25zLmNhbmNlbFRocmVzaG9sZCksY2FuY2VsbGVkfWZ1bmN0aW9uIHZhbGlkYXRlUGluY2hEaXN0YW5jZSgpe3JldHVybiBudWxsIT09b3B0aW9ucy5waW5jaFRocmVzaG9sZD9waW5jaERpc3RhbmNlPj1vcHRpb25zLnBpbmNoVGhyZXNob2xkOiEwfWZ1bmN0aW9uIHZhbGlkYXRlU3dpcGVUaW1lKCl7dmFyIHJlc3VsdDtyZXR1cm4gcmVzdWx0PW9wdGlvbnMubWF4VGltZVRocmVzaG9sZD8hKGR1cmF0aW9uPj1vcHRpb25zLm1heFRpbWVUaHJlc2hvbGQpOiEwfWZ1bmN0aW9uIHZhbGlkYXRlRGVmYXVsdEV2ZW50KGpxRXZlbnQsZGlyZWN0aW9uKXtpZihvcHRpb25zLnByZXZlbnREZWZhdWx0RXZlbnRzIT09ITEpaWYob3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGw9PT1OT05FKWpxRXZlbnQucHJldmVudERlZmF1bHQoKTtlbHNle3ZhciBhdXRvPW9wdGlvbnMuYWxsb3dQYWdlU2Nyb2xsPT09QVVUTztzd2l0Y2goZGlyZWN0aW9uKXtjYXNlIExFRlQ6KG9wdGlvbnMuc3dpcGVMZWZ0JiZhdXRvfHwhYXV0byYmb3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGwhPUhPUklaT05UQUwpJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBSSUdIVDoob3B0aW9ucy5zd2lwZVJpZ2h0JiZhdXRvfHwhYXV0byYmb3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGwhPUhPUklaT05UQUwpJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBVUDoob3B0aW9ucy5zd2lwZVVwJiZhdXRvfHwhYXV0byYmb3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGwhPVZFUlRJQ0FMKSYmanFFdmVudC5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgRE9XTjoob3B0aW9ucy5zd2lwZURvd24mJmF1dG98fCFhdXRvJiZvcHRpb25zLmFsbG93UGFnZVNjcm9sbCE9VkVSVElDQUwpJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBOT05FOn19fWZ1bmN0aW9uIHZhbGlkYXRlUGluY2goKXt2YXIgaGFzQ29ycmVjdEZpbmdlckNvdW50PXZhbGlkYXRlRmluZ2VycygpLGhhc0VuZFBvaW50PXZhbGlkYXRlRW5kUG9pbnQoKSxoYXNDb3JyZWN0RGlzdGFuY2U9dmFsaWRhdGVQaW5jaERpc3RhbmNlKCk7cmV0dXJuIGhhc0NvcnJlY3RGaW5nZXJDb3VudCYmaGFzRW5kUG9pbnQmJmhhc0NvcnJlY3REaXN0YW5jZX1mdW5jdGlvbiBoYXNQaW5jaGVzKCl7cmV0dXJuISEob3B0aW9ucy5waW5jaFN0YXR1c3x8b3B0aW9ucy5waW5jaElufHxvcHRpb25zLnBpbmNoT3V0KX1mdW5jdGlvbiBkaWRQaW5jaCgpe3JldHVybiEoIXZhbGlkYXRlUGluY2goKXx8IWhhc1BpbmNoZXMoKSl9ZnVuY3Rpb24gdmFsaWRhdGVTd2lwZSgpe3ZhciBoYXNWYWxpZFRpbWU9dmFsaWRhdGVTd2lwZVRpbWUoKSxoYXNWYWxpZERpc3RhbmNlPXZhbGlkYXRlU3dpcGVEaXN0YW5jZSgpLGhhc0NvcnJlY3RGaW5nZXJDb3VudD12YWxpZGF0ZUZpbmdlcnMoKSxoYXNFbmRQb2ludD12YWxpZGF0ZUVuZFBvaW50KCksZGlkQ2FuY2VsPWRpZFN3aXBlQmFja1RvQ2FuY2VsKCksdmFsaWQ9IWRpZENhbmNlbCYmaGFzRW5kUG9pbnQmJmhhc0NvcnJlY3RGaW5nZXJDb3VudCYmaGFzVmFsaWREaXN0YW5jZSYmaGFzVmFsaWRUaW1lO3JldHVybiB2YWxpZH1mdW5jdGlvbiBoYXNTd2lwZXMoKXtyZXR1cm4hIShvcHRpb25zLnN3aXBlfHxvcHRpb25zLnN3aXBlU3RhdHVzfHxvcHRpb25zLnN3aXBlTGVmdHx8b3B0aW9ucy5zd2lwZVJpZ2h0fHxvcHRpb25zLnN3aXBlVXB8fG9wdGlvbnMuc3dpcGVEb3duKX1mdW5jdGlvbiBkaWRTd2lwZSgpe3JldHVybiEoIXZhbGlkYXRlU3dpcGUoKXx8IWhhc1N3aXBlcygpKX1mdW5jdGlvbiB2YWxpZGF0ZUZpbmdlcnMoKXtyZXR1cm4gZmluZ2VyQ291bnQ9PT1vcHRpb25zLmZpbmdlcnN8fG9wdGlvbnMuZmluZ2Vycz09PUFMTF9GSU5HRVJTfHwhU1VQUE9SVFNfVE9VQ0h9ZnVuY3Rpb24gdmFsaWRhdGVFbmRQb2ludCgpe3JldHVybiAwIT09ZmluZ2VyRGF0YVswXS5lbmQueH1mdW5jdGlvbiBoYXNUYXAoKXtyZXR1cm4hIW9wdGlvbnMudGFwfWZ1bmN0aW9uIGhhc0RvdWJsZVRhcCgpe3JldHVybiEhb3B0aW9ucy5kb3VibGVUYXB9ZnVuY3Rpb24gaGFzTG9uZ1RhcCgpe3JldHVybiEhb3B0aW9ucy5sb25nVGFwfWZ1bmN0aW9uIHZhbGlkYXRlRG91YmxlVGFwKCl7aWYobnVsbD09ZG91YmxlVGFwU3RhcnRUaW1lKXJldHVybiExO3ZhciBub3c9Z2V0VGltZVN0YW1wKCk7cmV0dXJuIGhhc0RvdWJsZVRhcCgpJiZub3ctZG91YmxlVGFwU3RhcnRUaW1lPD1vcHRpb25zLmRvdWJsZVRhcFRocmVzaG9sZH1mdW5jdGlvbiBpbkRvdWJsZVRhcCgpe3JldHVybiB2YWxpZGF0ZURvdWJsZVRhcCgpfWZ1bmN0aW9uIHZhbGlkYXRlVGFwKCl7cmV0dXJuKDE9PT1maW5nZXJDb3VudHx8IVNVUFBPUlRTX1RPVUNIKSYmKGlzTmFOKGRpc3RhbmNlKXx8ZGlzdGFuY2U8b3B0aW9ucy50aHJlc2hvbGQpfWZ1bmN0aW9uIHZhbGlkYXRlTG9uZ1RhcCgpe3JldHVybiBkdXJhdGlvbj5vcHRpb25zLmxvbmdUYXBUaHJlc2hvbGQmJkRPVUJMRV9UQVBfVEhSRVNIT0xEPmRpc3RhbmNlfWZ1bmN0aW9uIGRpZFRhcCgpe3JldHVybiEoIXZhbGlkYXRlVGFwKCl8fCFoYXNUYXAoKSl9ZnVuY3Rpb24gZGlkRG91YmxlVGFwKCl7cmV0dXJuISghdmFsaWRhdGVEb3VibGVUYXAoKXx8IWhhc0RvdWJsZVRhcCgpKX1mdW5jdGlvbiBkaWRMb25nVGFwKCl7cmV0dXJuISghdmFsaWRhdGVMb25nVGFwKCl8fCFoYXNMb25nVGFwKCkpfWZ1bmN0aW9uIHN0YXJ0TXVsdGlGaW5nZXJSZWxlYXNlKGV2ZW50KXtwcmV2aW91c1RvdWNoRW5kVGltZT1nZXRUaW1lU3RhbXAoKSxmaW5nZXJDb3VudEF0UmVsZWFzZT1ldmVudC50b3VjaGVzLmxlbmd0aCsxfWZ1bmN0aW9uIGNhbmNlbE11bHRpRmluZ2VyUmVsZWFzZSgpe3ByZXZpb3VzVG91Y2hFbmRUaW1lPTAsZmluZ2VyQ291bnRBdFJlbGVhc2U9MH1mdW5jdGlvbiBpbk11bHRpRmluZ2VyUmVsZWFzZSgpe3ZhciB3aXRoaW5UaHJlc2hvbGQ9ITE7aWYocHJldmlvdXNUb3VjaEVuZFRpbWUpe3ZhciBkaWZmPWdldFRpbWVTdGFtcCgpLXByZXZpb3VzVG91Y2hFbmRUaW1lO2RpZmY8PW9wdGlvbnMuZmluZ2VyUmVsZWFzZVRocmVzaG9sZCYmKHdpdGhpblRocmVzaG9sZD0hMCl9cmV0dXJuIHdpdGhpblRocmVzaG9sZH1mdW5jdGlvbiBnZXRUb3VjaEluUHJvZ3Jlc3MoKXtyZXR1cm4hKCRlbGVtZW50LmRhdGEoUExVR0lOX05TK1wiX2ludG91Y2hcIikhPT0hMCl9ZnVuY3Rpb24gc2V0VG91Y2hJblByb2dyZXNzKHZhbCl7JGVsZW1lbnQmJih2YWw9PT0hMD8oJGVsZW1lbnQub24oTU9WRV9FVix0b3VjaE1vdmUpLCRlbGVtZW50Lm9uKEVORF9FVix0b3VjaEVuZCksTEVBVkVfRVYmJiRlbGVtZW50Lm9uKExFQVZFX0VWLHRvdWNoTGVhdmUpKTooJGVsZW1lbnQub2ZmKE1PVkVfRVYsdG91Y2hNb3ZlLCExKSwkZWxlbWVudC5vZmYoRU5EX0VWLHRvdWNoRW5kLCExKSxMRUFWRV9FViYmJGVsZW1lbnQub2ZmKExFQVZFX0VWLHRvdWNoTGVhdmUsITEpKSwkZWxlbWVudC5kYXRhKFBMVUdJTl9OUytcIl9pbnRvdWNoXCIsdmFsPT09ITApKX1mdW5jdGlvbiBjcmVhdGVGaW5nZXJEYXRhKGlkLGV2dCl7dmFyIGY9e3N0YXJ0Ont4OjAseTowfSxsYXN0Ont4OjAseTowfSxlbmQ6e3g6MCx5OjB9fTtyZXR1cm4gZi5zdGFydC54PWYubGFzdC54PWYuZW5kLng9ZXZ0LnBhZ2VYfHxldnQuY2xpZW50WCxmLnN0YXJ0Lnk9Zi5sYXN0Lnk9Zi5lbmQueT1ldnQucGFnZVl8fGV2dC5jbGllbnRZLGZpbmdlckRhdGFbaWRdPWYsZn1mdW5jdGlvbiB1cGRhdGVGaW5nZXJEYXRhKGV2dCl7dmFyIGlkPXZvaWQgMCE9PWV2dC5pZGVudGlmaWVyP2V2dC5pZGVudGlmaWVyOjAsZj1nZXRGaW5nZXJEYXRhKGlkKTtyZXR1cm4gbnVsbD09PWYmJihmPWNyZWF0ZUZpbmdlckRhdGEoaWQsZXZ0KSksZi5sYXN0Lng9Zi5lbmQueCxmLmxhc3QueT1mLmVuZC55LGYuZW5kLng9ZXZ0LnBhZ2VYfHxldnQuY2xpZW50WCxmLmVuZC55PWV2dC5wYWdlWXx8ZXZ0LmNsaWVudFksZn1mdW5jdGlvbiBnZXRGaW5nZXJEYXRhKGlkKXtyZXR1cm4gZmluZ2VyRGF0YVtpZF18fG51bGx9ZnVuY3Rpb24gc2V0TWF4RGlzdGFuY2UoZGlyZWN0aW9uLGRpc3RhbmNlKXtkaXJlY3Rpb24hPU5PTkUmJihkaXN0YW5jZT1NYXRoLm1heChkaXN0YW5jZSxnZXRNYXhEaXN0YW5jZShkaXJlY3Rpb24pKSxtYXhpbXVtc01hcFtkaXJlY3Rpb25dLmRpc3RhbmNlPWRpc3RhbmNlKX1mdW5jdGlvbiBnZXRNYXhEaXN0YW5jZShkaXJlY3Rpb24pe3JldHVybiBtYXhpbXVtc01hcFtkaXJlY3Rpb25dP21heGltdW1zTWFwW2RpcmVjdGlvbl0uZGlzdGFuY2U6dm9pZCAwfWZ1bmN0aW9uIGNyZWF0ZU1heGltdW1zRGF0YSgpe3ZhciBtYXhEYXRhPXt9O3JldHVybiBtYXhEYXRhW0xFRlRdPWNyZWF0ZU1heGltdW1WTyhMRUZUKSxtYXhEYXRhW1JJR0hUXT1jcmVhdGVNYXhpbXVtVk8oUklHSFQpLG1heERhdGFbVVBdPWNyZWF0ZU1heGltdW1WTyhVUCksbWF4RGF0YVtET1dOXT1jcmVhdGVNYXhpbXVtVk8oRE9XTiksbWF4RGF0YX1mdW5jdGlvbiBjcmVhdGVNYXhpbXVtVk8oZGlyKXtyZXR1cm57ZGlyZWN0aW9uOmRpcixkaXN0YW5jZTowfX1mdW5jdGlvbiBjYWxjdWxhdGVEdXJhdGlvbigpe3JldHVybiBlbmRUaW1lLXN0YXJ0VGltZX1mdW5jdGlvbiBjYWxjdWxhdGVUb3VjaGVzRGlzdGFuY2Uoc3RhcnRQb2ludCxlbmRQb2ludCl7dmFyIGRpZmZYPU1hdGguYWJzKHN0YXJ0UG9pbnQueC1lbmRQb2ludC54KSxkaWZmWT1NYXRoLmFicyhzdGFydFBvaW50LnktZW5kUG9pbnQueSk7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5zcXJ0KGRpZmZYKmRpZmZYK2RpZmZZKmRpZmZZKSl9ZnVuY3Rpb24gY2FsY3VsYXRlUGluY2hab29tKHN0YXJ0RGlzdGFuY2UsZW5kRGlzdGFuY2Upe3ZhciBwZXJjZW50PWVuZERpc3RhbmNlL3N0YXJ0RGlzdGFuY2UqMTtyZXR1cm4gcGVyY2VudC50b0ZpeGVkKDIpfWZ1bmN0aW9uIGNhbGN1bGF0ZVBpbmNoRGlyZWN0aW9uKCl7cmV0dXJuIDE+cGluY2hab29tP09VVDpJTn1mdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShzdGFydFBvaW50LGVuZFBvaW50KXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnNxcnQoTWF0aC5wb3coZW5kUG9pbnQueC1zdGFydFBvaW50LngsMikrTWF0aC5wb3coZW5kUG9pbnQueS1zdGFydFBvaW50LnksMikpKX1mdW5jdGlvbiBjYWxjdWxhdGVBbmdsZShzdGFydFBvaW50LGVuZFBvaW50KXt2YXIgeD1zdGFydFBvaW50LngtZW5kUG9pbnQueCx5PWVuZFBvaW50Lnktc3RhcnRQb2ludC55LHI9TWF0aC5hdGFuMih5LHgpLGFuZ2xlPU1hdGgucm91bmQoMTgwKnIvTWF0aC5QSSk7cmV0dXJuIDA+YW5nbGUmJihhbmdsZT0zNjAtTWF0aC5hYnMoYW5nbGUpKSxhbmdsZX1mdW5jdGlvbiBjYWxjdWxhdGVEaXJlY3Rpb24oc3RhcnRQb2ludCxlbmRQb2ludCl7aWYoY29tcGFyZVBvaW50cyhzdGFydFBvaW50LGVuZFBvaW50KSlyZXR1cm4gTk9ORTt2YXIgYW5nbGU9Y2FsY3VsYXRlQW5nbGUoc3RhcnRQb2ludCxlbmRQb2ludCk7cmV0dXJuIDQ1Pj1hbmdsZSYmYW5nbGU+PTA/TEVGVDozNjA+PWFuZ2xlJiZhbmdsZT49MzE1P0xFRlQ6YW5nbGU+PTEzNSYmMjI1Pj1hbmdsZT9SSUdIVDphbmdsZT40NSYmMTM1PmFuZ2xlP0RPV046VVB9ZnVuY3Rpb24gZ2V0VGltZVN0YW1wKCl7dmFyIG5vdz1uZXcgRGF0ZTtyZXR1cm4gbm93LmdldFRpbWUoKX1mdW5jdGlvbiBnZXRib3VuZHMoZWwpe2VsPSQoZWwpO3ZhciBvZmZzZXQ9ZWwub2Zmc2V0KCksYm91bmRzPXtsZWZ0Om9mZnNldC5sZWZ0LHJpZ2h0Om9mZnNldC5sZWZ0K2VsLm91dGVyV2lkdGgoKSx0b3A6b2Zmc2V0LnRvcCxib3R0b206b2Zmc2V0LnRvcCtlbC5vdXRlckhlaWdodCgpfTtyZXR1cm4gYm91bmRzfWZ1bmN0aW9uIGlzSW5Cb3VuZHMocG9pbnQsYm91bmRzKXtyZXR1cm4gcG9pbnQueD5ib3VuZHMubGVmdCYmcG9pbnQueDxib3VuZHMucmlnaHQmJnBvaW50Lnk+Ym91bmRzLnRvcCYmcG9pbnQueTxib3VuZHMuYm90dG9tfWZ1bmN0aW9uIGNvbXBhcmVQb2ludHMocG9pbnRBLHBvaW50Qil7cmV0dXJuIHBvaW50QS54PT1wb2ludEIueCYmcG9pbnRBLnk9PXBvaW50Qi55fXZhciBvcHRpb25zPSQuZXh0ZW5kKHt9LG9wdGlvbnMpLHVzZVRvdWNoRXZlbnRzPVNVUFBPUlRTX1RPVUNIfHxTVVBQT1JUU19QT0lOVEVSfHwhb3B0aW9ucy5mYWxsYmFja1RvTW91c2VFdmVudHMsU1RBUlRfRVY9dXNlVG91Y2hFdmVudHM/U1VQUE9SVFNfUE9JTlRFUj9TVVBQT1JUU19QT0lOVEVSX0lFMTA/XCJNU1BvaW50ZXJEb3duXCI6XCJwb2ludGVyZG93blwiOlwidG91Y2hzdGFydFwiOlwibW91c2Vkb3duXCIsTU9WRV9FVj11c2VUb3VjaEV2ZW50cz9TVVBQT1JUU19QT0lOVEVSP1NVUFBPUlRTX1BPSU5URVJfSUUxMD9cIk1TUG9pbnRlck1vdmVcIjpcInBvaW50ZXJtb3ZlXCI6XCJ0b3VjaG1vdmVcIjpcIm1vdXNlbW92ZVwiLEVORF9FVj11c2VUb3VjaEV2ZW50cz9TVVBQT1JUU19QT0lOVEVSP1NVUFBPUlRTX1BPSU5URVJfSUUxMD9cIk1TUG9pbnRlclVwXCI6XCJwb2ludGVydXBcIjpcInRvdWNoZW5kXCI6XCJtb3VzZXVwXCIsTEVBVkVfRVY9dXNlVG91Y2hFdmVudHM/U1VQUE9SVFNfUE9JTlRFUj9cIm1vdXNlbGVhdmVcIjpudWxsOlwibW91c2VsZWF2ZVwiLENBTkNFTF9FVj1TVVBQT1JUU19QT0lOVEVSP1NVUFBPUlRTX1BPSU5URVJfSUUxMD9cIk1TUG9pbnRlckNhbmNlbFwiOlwicG9pbnRlcmNhbmNlbFwiOlwidG91Y2hjYW5jZWxcIixkaXN0YW5jZT0wLGRpcmVjdGlvbj1udWxsLGN1cnJlbnREaXJlY3Rpb249bnVsbCxkdXJhdGlvbj0wLHN0YXJ0VG91Y2hlc0Rpc3RhbmNlPTAsZW5kVG91Y2hlc0Rpc3RhbmNlPTAscGluY2hab29tPTEscGluY2hEaXN0YW5jZT0wLHBpbmNoRGlyZWN0aW9uPTAsbWF4aW11bXNNYXA9bnVsbCwkZWxlbWVudD0kKGVsZW1lbnQpLHBoYXNlPVwic3RhcnRcIixmaW5nZXJDb3VudD0wLGZpbmdlckRhdGE9e30sc3RhcnRUaW1lPTAsZW5kVGltZT0wLHByZXZpb3VzVG91Y2hFbmRUaW1lPTAsZmluZ2VyQ291bnRBdFJlbGVhc2U9MCxkb3VibGVUYXBTdGFydFRpbWU9MCxzaW5nbGVUYXBUaW1lb3V0PW51bGwsaG9sZFRpbWVvdXQ9bnVsbDt0cnl7JGVsZW1lbnQub24oU1RBUlRfRVYsdG91Y2hTdGFydCksJGVsZW1lbnQub24oQ0FOQ0VMX0VWLHRvdWNoQ2FuY2VsKX1jYXRjaChlKXskLmVycm9yKFwiZXZlbnRzIG5vdCBzdXBwb3J0ZWQgXCIrU1RBUlRfRVYrXCIsXCIrQ0FOQ0VMX0VWK1wiIG9uIGpRdWVyeS5zd2lwZVwiKX10aGlzLmVuYWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGUoKSwkZWxlbWVudC5vbihTVEFSVF9FVix0b3VjaFN0YXJ0KSwkZWxlbWVudC5vbihDQU5DRUxfRVYsdG91Y2hDYW5jZWwpLCRlbGVtZW50fSx0aGlzLmRpc2FibGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmVtb3ZlTGlzdGVuZXJzKCksJGVsZW1lbnR9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3JlbW92ZUxpc3RlbmVycygpLCRlbGVtZW50LmRhdGEoUExVR0lOX05TLG51bGwpLCRlbGVtZW50PW51bGx9LHRoaXMub3B0aW9uPWZ1bmN0aW9uKHByb3BlcnR5LHZhbHVlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgcHJvcGVydHkpb3B0aW9ucz0kLmV4dGVuZChvcHRpb25zLHByb3BlcnR5KTtlbHNlIGlmKHZvaWQgMCE9PW9wdGlvbnNbcHJvcGVydHldKXtpZih2b2lkIDA9PT12YWx1ZSlyZXR1cm4gb3B0aW9uc1twcm9wZXJ0eV07b3B0aW9uc1twcm9wZXJ0eV09dmFsdWV9ZWxzZXtpZighcHJvcGVydHkpcmV0dXJuIG9wdGlvbnM7JC5lcnJvcihcIk9wdGlvbiBcIitwcm9wZXJ0eStcIiBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuc3dpcGUub3B0aW9uc1wiKX1yZXR1cm4gbnVsbH19dmFyIFZFUlNJT049XCIxLjYuMThcIixMRUZUPVwibGVmdFwiLFJJR0hUPVwicmlnaHRcIixVUD1cInVwXCIsRE9XTj1cImRvd25cIixJTj1cImluXCIsT1VUPVwib3V0XCIsTk9ORT1cIm5vbmVcIixBVVRPPVwiYXV0b1wiLFNXSVBFPVwic3dpcGVcIixQSU5DSD1cInBpbmNoXCIsVEFQPVwidGFwXCIsRE9VQkxFX1RBUD1cImRvdWJsZXRhcFwiLExPTkdfVEFQPVwibG9uZ3RhcFwiLEhPUklaT05UQUw9XCJob3Jpem9udGFsXCIsVkVSVElDQUw9XCJ2ZXJ0aWNhbFwiLEFMTF9GSU5HRVJTPVwiYWxsXCIsRE9VQkxFX1RBUF9USFJFU0hPTEQ9MTAsUEhBU0VfU1RBUlQ9XCJzdGFydFwiLFBIQVNFX01PVkU9XCJtb3ZlXCIsUEhBU0VfRU5EPVwiZW5kXCIsUEhBU0VfQ0FOQ0VMPVwiY2FuY2VsXCIsU1VQUE9SVFNfVE9VQ0g9XCJvbnRvdWNoc3RhcnRcImluIHdpbmRvdyxTVVBQT1JUU19QT0lOVEVSX0lFMTA9d2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkJiYhd2luZG93LlBvaW50ZXJFdmVudCYmIVNVUFBPUlRTX1RPVUNILFNVUFBPUlRTX1BPSU5URVI9KHdpbmRvdy5Qb2ludGVyRXZlbnR8fHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZCkmJiFTVVBQT1JUU19UT1VDSCxQTFVHSU5fTlM9XCJUb3VjaFN3aXBlXCIsZGVmYXVsdHM9e2ZpbmdlcnM6MSx0aHJlc2hvbGQ6NzUsY2FuY2VsVGhyZXNob2xkOm51bGwscGluY2hUaHJlc2hvbGQ6MjAsbWF4VGltZVRocmVzaG9sZDpudWxsLGZpbmdlclJlbGVhc2VUaHJlc2hvbGQ6MjUwLGxvbmdUYXBUaHJlc2hvbGQ6NTAwLGRvdWJsZVRhcFRocmVzaG9sZDoyMDAsc3dpcGU6bnVsbCxzd2lwZUxlZnQ6bnVsbCxzd2lwZVJpZ2h0Om51bGwsc3dpcGVVcDpudWxsLHN3aXBlRG93bjpudWxsLHN3aXBlU3RhdHVzOm51bGwscGluY2hJbjpudWxsLHBpbmNoT3V0Om51bGwscGluY2hTdGF0dXM6bnVsbCxjbGljazpudWxsLHRhcDpudWxsLGRvdWJsZVRhcDpudWxsLGxvbmdUYXA6bnVsbCxob2xkOm51bGwsdHJpZ2dlck9uVG91Y2hFbmQ6ITAsdHJpZ2dlck9uVG91Y2hMZWF2ZTohMSxhbGxvd1BhZ2VTY3JvbGw6XCJhdXRvXCIsZmFsbGJhY2tUb01vdXNlRXZlbnRzOiEwLGV4Y2x1ZGVkRWxlbWVudHM6XCIubm9Td2lwZVwiLHByZXZlbnREZWZhdWx0RXZlbnRzOiEwfTskLmZuLnN3aXBlPWZ1bmN0aW9uKG1ldGhvZCl7dmFyICR0aGlzPSQodGhpcykscGx1Z2luPSR0aGlzLmRhdGEoUExVR0lOX05TKTtpZihwbHVnaW4mJlwic3RyaW5nXCI9PXR5cGVvZiBtZXRob2Qpe2lmKHBsdWdpblttZXRob2RdKXJldHVybiBwbHVnaW5bbWV0aG9kXS5hcHBseShwbHVnaW4sQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTskLmVycm9yKFwiTWV0aG9kIFwiK21ldGhvZCtcIiBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuc3dpcGVcIil9ZWxzZSBpZihwbHVnaW4mJlwib2JqZWN0XCI9PXR5cGVvZiBtZXRob2QpcGx1Z2luLm9wdGlvbi5hcHBseShwbHVnaW4sYXJndW1lbnRzKTtlbHNlIGlmKCEocGx1Z2lufHxcIm9iamVjdFwiIT10eXBlb2YgbWV0aG9kJiZtZXRob2QpKXJldHVybiBpbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gJHRoaXN9LCQuZm4uc3dpcGUudmVyc2lvbj1WRVJTSU9OLCQuZm4uc3dpcGUuZGVmYXVsdHM9ZGVmYXVsdHMsJC5mbi5zd2lwZS5waGFzZXM9e1BIQVNFX1NUQVJUOlBIQVNFX1NUQVJULFBIQVNFX01PVkU6UEhBU0VfTU9WRSxQSEFTRV9FTkQ6UEhBU0VfRU5ELFBIQVNFX0NBTkNFTDpQSEFTRV9DQU5DRUx9LCQuZm4uc3dpcGUuZGlyZWN0aW9ucz17TEVGVDpMRUZULFJJR0hUOlJJR0hULFVQOlVQLERPV046RE9XTixJTjpJTixPVVQ6T1VUfSwkLmZuLnN3aXBlLnBhZ2VTY3JvbGw9e05PTkU6Tk9ORSxIT1JJWk9OVEFMOkhPUklaT05UQUwsVkVSVElDQUw6VkVSVElDQUwsQVVUTzpBVVRPfSwkLmZuLnN3aXBlLmZpbmdlcnM9e09ORToxLFRXTzoyLFRIUkVFOjMsRk9VUjo0LEZJVkU6NSxBTEw6QUxMX0ZJTkdFUlN9fSk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tIFwicHJlc3Rhc2hvcFwiO1xuaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiO1xuXG5jb25zdCBwYXNzd29yZFBvbGljeSA9IHtcbiAgdGVtcGxhdGU6IFwiI3Bhc3N3b3JkLWZlZWRiYWNrXCIsXG4gIGhpbnQ6IFwiLmpzLWhpbnQtcGFzc3dvcmRcIixcbiAgY29udGFpbmVyOiBcIi5wYXNzd29yZC1zdHJlbmd0aC1mZWVkYmFja1wiLFxuICBzdHJlbmd0aFRleHQ6IFwiLnBhc3N3b3JkLXN0cmVuZ3RoLXRleHRcIixcbiAgcmVxdWlyZW1lbnRTY29yZTogXCIucGFzc3dvcmQtcmVxdWlyZW1lbnRzLXNjb3JlXCIsXG4gIHJlcXVpcmVtZW50TGVuZ3RoOiBcIi5wYXNzd29yZC1yZXF1aXJlbWVudHMtbGVuZ3RoXCIsXG4gIHJlcXVpcmVtZW50U2NvcmVJY29uOiBcIi5wYXNzd29yZC1yZXF1aXJlbWVudHMtc2NvcmUgaVwiLFxuICByZXF1aXJlbWVudExlbmd0aEljb246IFwiLnBhc3N3b3JkLXJlcXVpcmVtZW50cy1sZW5ndGggaVwiLFxuICBwcm9ncmVzc0JhcjogXCIucHJvZ3Jlc3MtYmFyXCIsXG4gIGlucHV0Q29sdW1uOiBcIi5qcy1pbnB1dC1jb2x1bW5cIixcbn07XG5cbnByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMgPSB7XG4gIHByb2R1Y3Q6IHtcbiAgICB0YWJzOiBcIi50YWJzIC5uYXYtbGlua1wiLFxuICAgIGFjdGl2ZU5hdkNsYXNzOiBcImpzLXByb2R1Y3QtbmF2LWFjdGl2ZVwiLFxuICAgIGFjdGl2ZVRhYkNsYXNzOiBcImpzLXByb2R1Y3QtdGFiLWFjdGl2ZVwiLFxuICAgIGFjdGl2ZVRhYnM6IFwiLnRhYnMgLm5hdi1saW5rLmFjdGl2ZSwgLmpzLXByb2R1Y3QtbmF2LWFjdGl2ZVwiLFxuICAgIGltYWdlc01vZGFsOiBcIi5qcy1wcm9kdWN0LWltYWdlcy1tb2RhbFwiLFxuICAgIHRodW1iOiBcIi5qcy10aHVtYlwiLFxuICAgIHRodW1iQ29udGFpbmVyOiBcIi50aHVtYi1jb250YWluZXIsIC5qcy10aHVtYi1jb250YWluZXJcIixcbiAgICBhcnJvd3M6IFwiLmpzLWFycm93c1wiLFxuICAgIHNlbGVjdGVkOiBcIi5zZWxlY3RlZCwgLmpzLXRodW1iLXNlbGVjdGVkXCIsXG4gICAgbW9kYWxQcm9kdWN0Q292ZXI6IFwiLmpzLW1vZGFsLXByb2R1Y3QtY292ZXJcIixcbiAgICBjb3ZlcjogXCIuanMtcXYtcHJvZHVjdC1jb3ZlclwiLFxuICAgIGN1c3RvbWl6YXRpb25Nb2RhbDogXCIuanMtY3VzdG9taXphdGlvbi1tb2RhbFwiLFxuICB9LFxuICBsaXN0aW5nOiB7XG4gICAgc2VhcmNoRmlsdGVyVG9nZ2xlcjogXCIjc2VhcmNoX2ZpbHRlcl90b2dnbGVyLCAuanMtc2VhcmNoLXRvZ2dsZXJcIixcbiAgICBzZWFyY2hGaWx0ZXJzV3JhcHBlcjogXCIjc2VhcmNoX2ZpbHRlcnNfd3JhcHBlclwiLFxuICAgIHNlYXJjaEZpbHRlckNvbnRyb2xzOiBcIiNzZWFyY2hfZmlsdGVyX2NvbnRyb2xzXCIsXG4gICAgc2VhcmNoRmlsdGVyczogXCIjc2VhcmNoX2ZpbHRlcnNcIixcbiAgICBhY3RpdmVTZWFyY2hGaWx0ZXJzOiBcIiNqcy1hY3RpdmUtc2VhcmNoLWZpbHRlcnNcIixcbiAgICBsaXN0VG9wOiBcIiNqcy1wcm9kdWN0LWxpc3QtdG9wXCIsXG4gICAgcHJvZHVjdDogXCIuanMtcHJvZHVjdFwiLFxuICAgIGxpc3Q6IFwiI2pzLXByb2R1Y3QtbGlzdFwiLFxuICAgIGxpc3RCb3R0b206IFwiI2pzLXByb2R1Y3QtbGlzdC1ib3R0b21cIixcbiAgICBsaXN0SGVhZGVyOiBcIiNqcy1wcm9kdWN0LWxpc3QtaGVhZGVyXCIsXG4gICAgc2VhcmNoRmlsdGVyc0NsZWFyQWxsOiBcIi5qcy1zZWFyY2gtZmlsdGVycy1jbGVhci1hbGxcIixcbiAgICBzZWFyY2hMaW5rOiBcIi5qcy1zZWFyY2gtbGlua1wiLFxuICB9LFxuICBvcmRlcjoge1xuICAgIHJldHVybkZvcm06IFwiI29yZGVyLXJldHVybi1mb3JtLCAuanMtb3JkZXItcmV0dXJuLWZvcm1cIixcbiAgfSxcbiAgYXJyb3dEb3duOiBcIi5hcnJvdy1kb3duLCAuanMtYXJyb3ctZG93blwiLFxuICBhcnJvd1VwOiBcIi5hcnJvdy11cCwgLmpzLWFycm93LXVwXCIsXG4gIGNsZWFyOiBcIi5jbGVhclwiLFxuICBmaWxlSW5wdXQ6IFwiLmpzLWZpbGUtaW5wdXRcIixcbiAgY29udGVudFdyYXBwZXI6IFwiI2NvbnRlbnQtd3JhcHBlciwgLmpzLWNvbnRlbnQtd3JhcHBlclwiLFxuICBmb290ZXI6IFwiI2Zvb3RlciwgLmpzLWZvb3RlclwiLFxuICBtb2RhbENvbnRlbnQ6IFwiLmpzLW1vZGFsLWNvbnRlbnRcIixcbiAgbW9kYWw6IFwiI21vZGFsLCAuanMtY2hlY2tvdXQtbW9kYWxcIixcbiAgdG91Y2hzcGluOiBcIi5qcy10b3VjaHNwaW5cIixcbiAgY2hlY2tvdXQ6IHtcbiAgICB0ZXJtc0xpbms6IFwiLmpzLXRlcm1zIGFcIixcbiAgICBnaWZ0Q2hlY2tib3g6IFwiLmpzLWdpZnQtY2hlY2tib3hcIixcbiAgICBpbWFnZXNMaW5rOiBcIi5jYXJkLWJsb2NrIC5jYXJ0LXN1bW1hcnktcHJvZHVjdHMgcCBhLCAuanMtc2hvdy1kZXRhaWxzXCIsXG4gICAgY2FycmllckV4dHJhQ29udGVudDogXCIuY2Fycmllci1leHRyYS1jb250ZW50LCAuanMtY2Fycmllci1leHRyYS1jb250ZW50XCIsXG4gICAgYnRuOiBcIi5jaGVja291dCBhXCIsXG4gIH0sXG4gIGNhcnQ6IHtcbiAgICBwcm9kdWN0TGluZVF0eTogXCIuanMtY2FydC1saW5lLXByb2R1Y3QtcXVhbnRpdHlcIixcbiAgICBxdWlja3ZpZXc6IFwiLnF1aWNrdmlld1wiLFxuICAgIHRvdWNoc3BpbjogXCIuYm9vdHN0cmFwLXRvdWNoc3BpblwiLFxuICAgIHByb21vQ29kZTogXCIjcHJvbW8tY29kZVwiLFxuICAgIGRpc3BsYXlQcm9tbzogXCIuZGlzcGxheS1wcm9tb1wiLFxuICAgIHByb21vQ29kZUJ1dHRvbjogXCIucHJvbW8tY29kZS1idXR0b25cIixcbiAgICBkaXNjb3VudENvZGU6IFwiLmpzLWRpc2NvdW50IC5jb2RlXCIsXG4gICAgZGlzY291bnROYW1lOiBcIltuYW1lPWRpc2NvdW50X25hbWVdXCIsXG4gICAgYWN0aW9uczpcbiAgICAgICdbZGF0YS1saW5rLWFjdGlvbj1cImRlbGV0ZS1mcm9tLWNhcnRcIl0sIFtkYXRhLWxpbmstYWN0aW9uPVwicmVtb3ZlLXZvdWNoZXJcIl0nLFxuICB9LFxuICBub3RpZmljYXRpb25zOiB7XG4gICAgZGFuZ2VyQWxlcnQ6IFwiI25vdGlmaWNhdGlvbnMgYXJ0aWNsZS5hbGVydC1kYW5nZXJcIixcbiAgICBjb250YWluZXI6IFwiI25vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbnMtY29udGFpbmVyXCIsXG4gIH0sXG4gIHBhc3N3b3JkUG9saWN5LFxufTtcblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBwcmVzdGFzaG9wLmVtaXQoXCJ0aGVtZVNlbGVjdG9yc0luaXRcIik7XG59KTtcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSdcblxudmFyIHNpbXBsZXRhYnNwbHVnaW5uYW1lID0gJ3NpbXBsZXRhYnMnXG5mdW5jdGlvbiBTaW1wbGVUYWJzUGx1Z2luKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgdGhpcy4kZWwgPSAkKGVsZW1lbnQpXG4gIHRoaXMuJHRhYnMgPSBbXVxuICB0aGlzLmluaXQoKVxufVxuXG4kLmV4dGVuZChTaW1wbGVUYWJzUGx1Z2luLnByb3RvdHlwZSwge1xuICBpbml0KCkge1xuICAgIHZhciBzZWxmID0gdGhpc1xuICAgIHRoaXMuJHRhYnMgPSBbXVxuICAgIHRoaXMuJGVsLmZpbmQoJ3VsID4gbGkgPiBhJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciAkYSA9ICQodGhpcylcbiAgICAgIHZhciBpZCA9ICRhLmF0dHIoJ2hyZWYnKVxuICAgICAgaWYgKCBpZC5zdGFydHNXaXRoKCcjJykgKSB7XG4gICAgICAgIGlkID0gaWQucmVwbGFjZSgnIycsICcnKVxuICAgICAgICB2YXIgZXhpc3RzID0gc2VsZi4kdGFicy5maW5kKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudCA9PT0gaWRcbiAgICAgICAgfSlcbiAgICAgICAgdmFyIGNvbnRlbnRzZWxlY3RvciA9ICcjJyArIGlkICsgJy50YWJzLWNvbnRlbnQnXG4gICAgICAgIHZhciBjb250ZW50ID0gc2VsZi4kZWwuZmluZChjb250ZW50c2VsZWN0b3IpXG4gICAgICAgIGlmICggZXhpc3RzICkge1xuICAgICAgICAgIGV4aXN0cy50YWIgPSAkYVxuICAgICAgICAgIGV4aXN0cy5jb250ZW50ID0gY29udGVudFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuJHRhYnMucHVzaCh7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICB0YWI6ICRhLFxuICAgICAgICAgICAgY29udGVudDogY29udGVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHNlbGYuJHRhYnMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICBpZiAoIWVsZW1lbnQudGFiLmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuICAgICAgICBzZWxmLmhpZGUoZWxlbWVudC5pZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuc2hvdyhlbGVtZW50LmlkKVxuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnRhYi5jbGljayhmdW5jdGlvbihldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHNlbGYuc2hvdyhlbGVtZW50LmlkKVxuICAgICAgfSlcbiAgICB9KVxuICB9LFxuICBzaG93KGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgdGhpcy4kdGFicy5mb3JFYWNoKGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuICAgICAgc2VsZi5oaWRlKGVsZW1lbnQuaWQpXG4gICAgICBpZiAoIGVsZW1lbnQuaWQgPT09IGlkICkge1xuICAgICAgICBlbGVtZW50LnRhYi5hZGRDbGFzcygnYWN0aXZlJykuYWRkQ2xhc3MoJ2ZvbnQtYm9sZCcpXG4gICAgICAgIGVsZW1lbnQuY29udGVudC5yZW1vdmVDbGFzcygnaGlkZGVuJylcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICBoaWRlKGlkKSB7XG4gICAgdGhpcy4kdGFicy5mb3JFYWNoKGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuICAgICAgaWYgKCBlbGVtZW50LmlkID09PSBpZCApIHtcbiAgICAgICAgZWxlbWVudC50YWIucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLnJlbW92ZUNsYXNzKCdmb250LWJvbGQnKVxuICAgICAgICBlbGVtZW50LmNvbnRlbnQuYWRkQ2xhc3MoJ2hpZGRlbicpXG4gICAgICB9XG4gICAgfSlcbiAgfSxcbn0pXG5cbiQuZm4uc2ltcGxldGFicyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGlmICggISQuZGF0YSh0aGlzLCAncGx1Z2luXycgKyBzaW1wbGV0YWJzcGx1Z2lubmFtZSkpIHtcbiAgICAgICQuZGF0YSh0aGlzLCAncGx1Z2luXycgKyBzaW1wbGV0YWJzcGx1Z2lubmFtZSwgbmV3IFNpbXBsZVRhYnNQbHVnaW4odGhpcywgb3B0aW9ucykpXG4gICAgfVxuICB9KVxufVxuXG5cbiIsIihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZ1bmN0aW9uKCQpe1xuICAgICAgICAgICAgZmFjdG9yeSgkKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gKHJvb3QuRWFzeVpvb20gPSBmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdC5FYXN5Wm9vbSA9IGZhY3Rvcnkocm9vdC5qUXVlcnkpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCQpIHtcblxuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciB6b29tSW1nT3ZlcmxhcFg7XG4gICAgdmFyIHpvb21JbWdPdmVybGFwWTtcbiAgICB2YXIgcmF0aW9YO1xuICAgIHZhciByYXRpb1k7XG4gICAgdmFyIHBvaW50ZXJQb3NpdGlvblg7XG4gICAgdmFyIHBvaW50ZXJQb3NpdGlvblk7XG5cbiAgICB2YXIgZGVmYXVsdHMgPSB7XG5cbiAgICAgICAgLy8gVGhlIHRleHQgdG8gZGlzcGxheSB3aXRoaW4gdGhlIG5vdGljZSBib3ggd2hpbGUgbG9hZGluZyB0aGUgem9vbSBpbWFnZS5cbiAgICAgICAgbG9hZGluZ05vdGljZTogJ0xvYWRpbmcgaW1hZ2UnLFxuXG4gICAgICAgIC8vIFRoZSB0ZXh0IHRvIGRpc3BsYXkgd2l0aGluIHRoZSBub3RpY2UgYm94IGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGxvYWRpbmcgdGhlIHpvb20gaW1hZ2UuXG4gICAgICAgIGVycm9yTm90aWNlOiAnVGhlIGltYWdlIGNvdWxkIG5vdCBiZSBsb2FkZWQnLFxuXG4gICAgICAgIC8vIFRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRvIGRpc3BsYXkgdGhlIGVycm9yIG5vdGljZS5cbiAgICAgICAgZXJyb3JEdXJhdGlvbjogMjUwMCxcblxuICAgICAgICAvLyBBdHRyaWJ1dGUgdG8gcmV0cmlldmUgdGhlIHpvb20gaW1hZ2UgVVJMIGZyb20uXG4gICAgICAgIGxpbmtBdHRyaWJ1dGU6ICdocmVmJyxcblxuICAgICAgICAvLyBQcmV2ZW50IGNsaWNrcyBvbiB0aGUgem9vbSBpbWFnZSBsaW5rLlxuICAgICAgICBwcmV2ZW50Q2xpY2tzOiB0cnVlLFxuXG4gICAgICAgIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYmVmb3JlIHRoZSBmbHlvdXQgaXMgZGlzcGxheWVkLlxuICAgICAgICBiZWZvcmVTaG93OiAkLm5vb3AsXG5cbiAgICAgICAgLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSBiZWZvcmUgdGhlIGZseW91dCBpcyByZW1vdmVkLlxuICAgICAgICBiZWZvcmVIaWRlOiAkLm5vb3AsXG5cbiAgICAgICAgLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBmbHlvdXQgaXMgZGlzcGxheWVkLlxuICAgICAgICBvblNob3c6ICQubm9vcCxcblxuICAgICAgICAvLyBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGZseW91dCBpcyByZW1vdmVkLlxuICAgICAgICBvbkhpZGU6ICQubm9vcCxcblxuICAgICAgICAvLyBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGN1cnNvciBpcyBtb3ZlZCB3aGlsZSBvdmVyIHRoZSBpbWFnZS5cbiAgICAgICAgb25Nb3ZlOiAkLm5vb3BcblxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFYXN5Wm9vbVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAoT3B0aW9uYWwpXG4gICAgICovXG4gICAgZnVuY3Rpb24gRWFzeVpvb20odGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuJHRhcmdldCA9ICQodGFyZ2V0KTtcbiAgICAgICAgdGhpcy5vcHRzID0gJC5leHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zLCB0aGlzLiR0YXJnZXQuZGF0YSgpKTtcblxuICAgICAgICB0aGlzLmlzT3BlbiA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX2luaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy4kbGluayAgID0gdGhpcy4kdGFyZ2V0LmZpbmQoJ2EnKTtcbiAgICAgICAgdGhpcy4kaW1hZ2UgID0gdGhpcy4kdGFyZ2V0LmZpbmQoJ2ltZycpO1xuXG4gICAgICAgIHRoaXMuJGZseW91dCA9ICQoJzxkaXYgY2xhc3M9XCJlYXN5em9vbS1mbHlvdXRcIiAvPicpO1xuICAgICAgICB0aGlzLiRub3RpY2UgPSAkKCc8ZGl2IGNsYXNzPVwiZWFzeXpvb20tbm90aWNlXCIgLz4nKTtcblxuICAgICAgICB0aGlzLiR0YXJnZXQub24oe1xuICAgICAgICAgICAgJ21vdXNlbW92ZS5lYXN5em9vbSB0b3VjaG1vdmUuZWFzeXpvb20nOiAkLnByb3h5KHRoaXMuX29uTW92ZSwgdGhpcyksXG4gICAgICAgICAgICAnbW91c2VsZWF2ZS5lYXN5em9vbSB0b3VjaGVuZC5lYXN5em9vbSc6ICQucHJveHkodGhpcy5fb25MZWF2ZSwgdGhpcyksXG4gICAgICAgICAgICAnbW91c2VlbnRlci5lYXN5em9vbSB0b3VjaHN0YXJ0LmVhc3l6b29tJzogJC5wcm94eSh0aGlzLl9vbkVudGVyLCB0aGlzKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9wdHMucHJldmVudENsaWNrcyAmJiB0aGlzLiR0YXJnZXQub24oJ2NsaWNrLmVhc3l6b29tJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hvd1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudHxUb3VjaEV2ZW50fSBlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB0ZXN0TW91c2VPdmVyIChPcHRpb25hbClcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGUsIHRlc3RNb3VzZU92ZXIpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMuYmVmb3JlU2hvdy5jYWxsKHRoaXMpID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1JlYWR5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZEltYWdlKHRoaXMuJGxpbmsuYXR0cih0aGlzLm9wdHMubGlua0F0dHJpYnV0ZSksIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmlzTW91c2VPdmVyIHx8ICF0ZXN0TW91c2VPdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuJHRhcmdldC5hcHBlbmQodGhpcy4kZmx5b3V0KTtcblxuICAgICAgICB2YXIgdGFyZ2V0V2lkdGggPSB0aGlzLiR0YXJnZXQub3V0ZXJXaWR0aCgpO1xuICAgICAgICB2YXIgdGFyZ2V0SGVpZ2h0ID0gdGhpcy4kdGFyZ2V0Lm91dGVySGVpZ2h0KCk7XG5cbiAgICAgICAgdmFyIGZseW91dElubmVyV2lkdGggPSB0aGlzLiRmbHlvdXQud2lkdGgoKTtcbiAgICAgICAgdmFyIGZseW91dElubmVySGVpZ2h0ID0gdGhpcy4kZmx5b3V0LmhlaWdodCgpO1xuXG4gICAgICAgIHZhciB6b29tSW1nV2lkdGggPSB0aGlzLiR6b29tLndpZHRoKCk7XG4gICAgICAgIHZhciB6b29tSW1nSGVpZ2h0ID0gdGhpcy4kem9vbS5oZWlnaHQoKTtcblxuICAgICAgICB6b29tSW1nT3ZlcmxhcFggPSBNYXRoLmNlaWwoem9vbUltZ1dpZHRoIC0gZmx5b3V0SW5uZXJXaWR0aCk7XG4gICAgICAgIHpvb21JbWdPdmVybGFwWSA9IE1hdGguY2VpbCh6b29tSW1nSGVpZ2h0IC0gZmx5b3V0SW5uZXJIZWlnaHQpO1xuXG5cbiAgICAgICAgLy8gRm9yIHdoZW4gdGhlIHpvb20gaW1hZ2UgaXMgc21hbGxlciB0aGFuIHRoZSBmbHlvdXQgZWxlbWVudC5cbiAgICAgICAgaWYgKHpvb21JbWdPdmVybGFwWCA8IDApIHpvb21JbWdPdmVybGFwWCA9IDA7XG4gICAgICAgIGlmICh6b29tSW1nT3ZlcmxhcFkgPCAwKSB6b29tSW1nT3ZlcmxhcFkgPSAwO1xuXG4gICAgICAgIHJhdGlvWCA9IHpvb21JbWdPdmVybGFwWCAvIHRhcmdldFdpZHRoO1xuICAgICAgICByYXRpb1kgPSB6b29tSW1nT3ZlcmxhcFkgLyB0YXJnZXRIZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuXG4gICAgICAgIHRoaXMub3B0cy5vblNob3cuY2FsbCh0aGlzKTtcblxuICAgICAgICBlICYmIHRoaXMuX21vdmUoZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE9uIGVudGVyXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICovXG4gICAgRWFzeVpvb20ucHJvdG90eXBlLl9vbkVudGVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzO1xuXG4gICAgICAgIHRoaXMuaXNNb3VzZU92ZXIgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdG91Y2hlcyB8fCB0b3VjaGVzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNob3coZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogT24gbW92ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFdmVudH0gZVxuICAgICAqL1xuICAgIEVhc3lab29tLnByb3RvdHlwZS5fb25Nb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKSByZXR1cm47XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9tb3ZlKGUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBPbiBsZWF2ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgRWFzeVpvb20ucHJvdG90eXBlLl9vbkxlYXZlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuaXNNb3VzZU92ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc09wZW4gJiYgdGhpcy5oaWRlKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE9uIGxvYWRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGVcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuX29uTG9hZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgLy8gSUUgbWF5IGZpcmUgYSBsb2FkIGV2ZW50IGV2ZW4gb24gZXJyb3Igc28gdGVzdCB0aGUgaW1hZ2UgZGltZW5zaW9uc1xuICAgICAgICBpZiAoIWUuY3VycmVudFRhcmdldC53aWR0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaXNSZWFkeSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy4kbm90aWNlLmRldGFjaCgpO1xuICAgICAgICB0aGlzLiRmbHlvdXQuaHRtbCh0aGlzLiR6b29tKTtcbiAgICAgICAgdGhpcy4kdGFyZ2V0LnJlbW92ZUNsYXNzKCdpcy1sb2FkaW5nJykuYWRkQ2xhc3MoJ2lzLXJlYWR5Jyk7XG5cbiAgICAgICAgZS5kYXRhLmNhbGwgJiYgZS5kYXRhKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE9uIGVycm9yXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuX29uRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuJG5vdGljZS50ZXh0KHRoaXMub3B0cy5lcnJvck5vdGljZSk7XG4gICAgICAgIHRoaXMuJHRhcmdldC5yZW1vdmVDbGFzcygnaXMtbG9hZGluZycpLmFkZENsYXNzKCdpcy1lcnJvcicpO1xuXG4gICAgICAgIHRoaXMuZGV0YWNoTm90aWNlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuJG5vdGljZS5kZXRhY2goKTtcbiAgICAgICAgICAgIHNlbGYuZGV0YWNoTm90aWNlID0gbnVsbDtcbiAgICAgICAgfSwgdGhpcy5vcHRzLmVycm9yRHVyYXRpb24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGltYWdlXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHJlZlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgRWFzeVpvb20ucHJvdG90eXBlLl9sb2FkSW1hZ2UgPSBmdW5jdGlvbihocmVmLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgem9vbSA9IG5ldyBJbWFnZSgpO1xuXG4gICAgICAgIHRoaXMuJHRhcmdldFxuICAgICAgICAgICAgLmFkZENsYXNzKCdpcy1sb2FkaW5nJylcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy4kbm90aWNlLnRleHQodGhpcy5vcHRzLmxvYWRpbmdOb3RpY2UpKTtcblxuICAgICAgICB0aGlzLiR6b29tID0gJCh6b29tKVxuICAgICAgICAgICAgLm9uKCdlcnJvcicsICQucHJveHkodGhpcy5fb25FcnJvciwgdGhpcykpXG4gICAgICAgICAgICAub24oJ2xvYWQnLCBjYWxsYmFjaywgJC5wcm94eSh0aGlzLl9vbkxvYWQsIHRoaXMpKTtcblxuICAgICAgICB6b29tLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgem9vbS5zcmMgPSBocmVmO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICovXG4gICAgRWFzeVpvb20ucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24oZSkge1xuXG4gICAgICAgIGlmIChlLnR5cGUuaW5kZXhPZigndG91Y2gnKSA9PT0gMCkge1xuICAgICAgICAgICAgdmFyIHRvdWNobGlzdCA9IGUudG91Y2hlcyB8fCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICAgICAgICAgIHBvaW50ZXJQb3NpdGlvblggPSB0b3VjaGxpc3RbMF0ucGFnZVg7XG4gICAgICAgICAgICBwb2ludGVyUG9zaXRpb25ZID0gdG91Y2hsaXN0WzBdLnBhZ2VZO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9pbnRlclBvc2l0aW9uWCA9IGUucGFnZVggfHwgcG9pbnRlclBvc2l0aW9uWDtcbiAgICAgICAgICAgIHBvaW50ZXJQb3NpdGlvblkgPSBlLnBhZ2VZIHx8IHBvaW50ZXJQb3NpdGlvblk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGFyZ2V0T2Zmc2V0ICA9IHRoaXMuJHRhcmdldC5vZmZzZXQoKTtcbiAgICAgICAgdmFyIHJlbGF0aXZlUG9zaXRpb25YID0gcG9pbnRlclBvc2l0aW9uWCAtIHRhcmdldE9mZnNldC5sZWZ0O1xuICAgICAgICB2YXIgcmVsYXRpdmVQb3NpdGlvblkgPSBwb2ludGVyUG9zaXRpb25ZIC0gdGFyZ2V0T2Zmc2V0LnRvcDtcbiAgICAgICAgdmFyIG1vdmVYID0gTWF0aC5jZWlsKHJlbGF0aXZlUG9zaXRpb25YICogcmF0aW9YKTtcbiAgICAgICAgdmFyIG1vdmVZID0gTWF0aC5jZWlsKHJlbGF0aXZlUG9zaXRpb25ZICogcmF0aW9ZKTtcblxuICAgICAgICAvLyBDbG9zZSBpZiBvdXRzaWRlXG4gICAgICAgIGlmIChtb3ZlWCA8IDAgfHwgbW92ZVkgPCAwIHx8IG1vdmVYID4gem9vbUltZ092ZXJsYXBYIHx8IG1vdmVZID4gem9vbUltZ092ZXJsYXBZKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0b3AgPSBtb3ZlWSAqIC0xO1xuICAgICAgICAgICAgdmFyIGxlZnQgPSBtb3ZlWCAqIC0xO1xuXG4gICAgICAgICAgICBpZiAoJ3RyYW5zZm9ybScgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHpvb20uY3NzKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlKCcgKyBsZWZ0ICsgJ3B4LCAnICsgdG9wICsgJ3B4KScgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuJHpvb20uY3NzKHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5vbk1vdmUuY2FsbCh0aGlzLCB0b3AsIGxlZnQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhpZGVcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYmVmb3JlSGlkZS5jYWxsKHRoaXMpID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuJGZseW91dC5kZXRhY2goKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgICAgICB0aGlzLm9wdHMub25IaWRlLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN3YXBcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhbmRhcmRTcmNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gem9vbUhyZWZcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gc3Jjc2V0IChPcHRpb25hbClcbiAgICAgKi9cbiAgICBFYXN5Wm9vbS5wcm90b3R5cGUuc3dhcCA9IGZ1bmN0aW9uKHN0YW5kYXJkU3JjLCB6b29tSHJlZiwgc3Jjc2V0KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB0aGlzLmlzUmVhZHkgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmRldGFjaE5vdGljZSAmJiBjbGVhclRpbWVvdXQodGhpcy5kZXRhY2hOb3RpY2UpO1xuXG4gICAgICAgIHRoaXMuJG5vdGljZS5wYXJlbnQoKS5sZW5ndGggJiYgdGhpcy4kbm90aWNlLmRldGFjaCgpO1xuXG4gICAgICAgIHRoaXMuJHRhcmdldC5yZW1vdmVDbGFzcygnaXMtbG9hZGluZyBpcy1yZWFkeSBpcy1lcnJvcicpO1xuXG4gICAgICAgIHRoaXMuJGltYWdlLmF0dHIoe1xuICAgICAgICAgICAgc3JjOiBzdGFuZGFyZFNyYyxcbiAgICAgICAgICAgIHNyY3NldDogJC5pc0FycmF5KHNyY3NldCkgPyBzcmNzZXQuam9pbigpIDogc3Jjc2V0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuJGxpbmsuYXR0cih0aGlzLm9wdHMubGlua0F0dHJpYnV0ZSwgem9vbUhyZWYpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZWFyZG93blxuICAgICAqL1xuICAgIEVhc3lab29tLnByb3RvdHlwZS50ZWFyZG93biA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcblxuICAgICAgICB0aGlzLiR0YXJnZXRcbiAgICAgICAgICAgIC5vZmYoJy5lYXN5em9vbScpXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2lzLWxvYWRpbmcgaXMtcmVhZHkgaXMtZXJyb3InKTtcblxuICAgICAgICB0aGlzLmRldGFjaE5vdGljZSAmJiBjbGVhclRpbWVvdXQodGhpcy5kZXRhY2hOb3RpY2UpO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLiRsaW5rO1xuICAgICAgICBkZWxldGUgdGhpcy4kem9vbTtcbiAgICAgICAgZGVsZXRlIHRoaXMuJGltYWdlO1xuICAgICAgICBkZWxldGUgdGhpcy4kbm90aWNlO1xuICAgICAgICBkZWxldGUgdGhpcy4kZmx5b3V0O1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLmlzT3BlbjtcbiAgICAgICAgZGVsZXRlIHRoaXMuaXNSZWFkeTtcbiAgICB9O1xuXG4gICAgLy8galF1ZXJ5IHBsdWdpbiB3cmFwcGVyXG4gICAgJC5mbi5lYXN5Wm9vbSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBhcGkgPSAkLmRhdGEodGhpcywgJ2Vhc3lab29tJyk7XG5cbiAgICAgICAgICAgIGlmICghYXBpKSB7XG4gICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsICdlYXN5Wm9vbScsIG5ldyBFYXN5Wm9vbSh0aGlzLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS5pc09wZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFwaS5faW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEVhc3lab29tO1xufSkpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5cbnByZXN0YXNob3AucmVzcG9uc2l2ZSA9IHByZXN0YXNob3AucmVzcG9uc2l2ZSB8fCB7fTtcblxucHJlc3Rhc2hvcC5yZXNwb25zaXZlLmN1cnJlbnRfd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbnByZXN0YXNob3AucmVzcG9uc2l2ZS5taW5fd2lkdGggPSA3Njg7XG5wcmVzdGFzaG9wLnJlc3BvbnNpdmUubW9iaWxlID0gcHJlc3Rhc2hvcC5yZXNwb25zaXZlLmN1cnJlbnRfd2lkdGggPCBwcmVzdGFzaG9wLnJlc3BvbnNpdmUubWluX3dpZHRoO1xuXG5mdW5jdGlvbiBzd2FwQ2hpbGRyZW4ob2JqMSwgb2JqMikge1xuICBjb25zdCB0ZW1wID0gb2JqMi5jaGlsZHJlbigpLmRldGFjaCgpO1xuICBvYmoyLmVtcHR5KCkuYXBwZW5kKG9iajEuY2hpbGRyZW4oKS5kZXRhY2goKSk7XG4gIG9iajEuYXBwZW5kKHRlbXApO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVNb2JpbGVTdHlsZXMoKSB7XG4gIGlmIChwcmVzdGFzaG9wLnJlc3BvbnNpdmUubW9iaWxlKSB7XG4gICAgJChcIipbaWRePSdfZGVza3RvcF8nXVwiKS5lYWNoKChpZHgsIGVsKSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSAkKGAjJHtlbC5pZC5yZXBsYWNlKCdfZGVza3RvcF8nLCAnX21vYmlsZV8nKX1gKTtcblxuICAgICAgaWYgKHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgc3dhcENoaWxkcmVuKCQoZWwpLCB0YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgICQoXCIqW2lkXj0nX21vYmlsZV8nXVwiKS5lYWNoKChpZHgsIGVsKSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSAkKGAjJHtlbC5pZC5yZXBsYWNlKCdfbW9iaWxlXycsICdfZGVza3RvcF8nKX1gKTtcblxuICAgICAgaWYgKHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgc3dhcENoaWxkcmVuKCQoZWwpLCB0YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHByZXN0YXNob3AuZW1pdCgncmVzcG9uc2l2ZSB1cGRhdGUnLCB7XG4gICAgbW9iaWxlOiBwcmVzdGFzaG9wLnJlc3BvbnNpdmUubW9iaWxlLFxuICB9KTtcbn1cblxuJCh3aW5kb3cpLm9uKCdyZXNpemUnLCAoKSA9PiB7XG4gIGNvbnN0IGN3ID0gcHJlc3Rhc2hvcC5yZXNwb25zaXZlLmN1cnJlbnRfd2lkdGg7XG4gIGNvbnN0IG13ID0gcHJlc3Rhc2hvcC5yZXNwb25zaXZlLm1pbl93aWR0aDtcbiAgY29uc3QgdyA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICBjb25zdCB0b2dnbGUgPSAoY3cgPj0gbXcgJiYgdyA8IG13KSB8fCAoY3cgPCBtdyAmJiB3ID49IG13KTtcblxuICBwcmVzdGFzaG9wLnJlc3BvbnNpdmUuY3VycmVudF93aWR0aCA9IHc7XG4gIHByZXN0YXNob3AucmVzcG9uc2l2ZS5tb2JpbGUgPSBwcmVzdGFzaG9wLnJlc3BvbnNpdmUuY3VycmVudF93aWR0aCA8IHByZXN0YXNob3AucmVzcG9uc2l2ZS5taW5fd2lkdGg7XG4gIGlmICh0b2dnbGUpIHtcbiAgICB0b2dnbGVNb2JpbGVTdHlsZXMoKTtcbiAgfVxufSk7XG5cbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcbiAgaWYgKHByZXN0YXNob3AucmVzcG9uc2l2ZS5tb2JpbGUpIHtcbiAgICB0b2dnbGVNb2JpbGVTdHlsZXMoKTtcbiAgfVxufSk7XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tICdwcmVzdGFzaG9wJztcblxuZnVuY3Rpb24gc2V0VXBDaGVja291dCgpIHtcbiAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNoZWNrb3V0LnRlcm1zTGluaykub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBsZXQgdXJsID0gJChldmVudC50YXJnZXQpLmF0dHIoJ2hyZWYnKTtcblxuICAgIGlmICh1cmwpIHtcbiAgICAgIC8vIFRPRE86IEhhbmRsZSByZXF1ZXN0IGlmIG5vIHByZXR0eSBVUkxcbiAgICAgIHVybCArPSAnP2NvbnRlbnRfb25seT0xJztcbiAgICAgICQuZ2V0KHVybCwgKGNvbnRlbnQpID0+IHtcbiAgICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm1vZGFsKVxuICAgICAgICAgIC5maW5kKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubW9kYWxDb250ZW50KVxuICAgICAgICAgIC5odG1sKCQoY29udGVudCkuZmluZCgnLnBhZ2UtY21zJykuY29udGVudHMoKSk7XG4gICAgICB9KS5mYWlsKChyZXNwKSA9PiB7XG4gICAgICAgIHByZXN0YXNob3AuZW1pdCgnaGFuZGxlRXJyb3InLCB7ZXZlbnRUeXBlOiAnY2xpY2tUZXJtcycsIHJlc3B9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5tb2RhbCkubW9kYWwoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNoZWNrb3V0LmdpZnRDaGVja2JveCkub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICQoJyNnaWZ0Jykuc2xpZGVUb2dnbGUoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUltYWdlKCkge1xuICAvLyBBcnJvdyBzaG93L2hpZGUgZGV0YWlscyBDaGVja291dCBwYWdlXG4gICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jaGVja291dC5pbWFnZXNMaW5rKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaWNvbiA9ICQodGhpcykuZmluZCgnaS5tYXRlcmlhbC1pY29ucycpO1xuXG4gICAgaWYgKGljb24udGV4dCgpID09PSAnZXhwYW5kX21vcmUnKSB7XG4gICAgICBpY29uLnRleHQoJ2V4cGFuZF9sZXNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGljb24udGV4dCgnZXhwYW5kX21vcmUnKTtcbiAgICB9XG4gIH0pO1xufVxuXG4kKGZ1bmN0aW9uKCkge1xuICBpZiAoJCgnYm9keSNjaGVja291dCcpLmxlbmd0aCA9PT0gMSkge1xuICAgIHNldFVwQ2hlY2tvdXQoKTtcbiAgICB0b2dnbGVJbWFnZSgpO1xuICB9XG5cbiAgJCgnLnRhYnMnKS5zaW1wbGV0YWJzKClcblxuICBwcmVzdGFzaG9wLm9uKCd1cGRhdGVkRGVsaXZlcnlGb3JtJywgKHBhcmFtcykgPT4ge1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmRlbGl2ZXJ5T3B0aW9uID09PSAndW5kZWZpbmVkJyB8fCBwYXJhbXMuZGVsaXZlcnlPcHRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEhpZGUgYWxsIGNhcnJpZXIgZXh0cmEgY29udGVudCAuLi5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2hlY2tvdXQuY2FycmllckV4dHJhQ29udGVudCkuaGlkZSgpO1xuICAgIC8vIGFuZCBzaG93IHRoZSBvbmUgcmVsYXRlZCB0byB0aGUgc2VsZWN0ZWQgY2FycmllclxuICAgIHBhcmFtcy5kZWxpdmVyeU9wdGlvbi5uZXh0KHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2hlY2tvdXQuY2FycmllckV4dHJhQ29udGVudCkuc2xpZGVEb3duKCk7XG4gIH0pO1xufSk7XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tICdwcmVzdGFzaG9wJztcblxuZnVuY3Rpb24gaW5pdFJtYUl0ZW1TZWxlY3RvcigpIHtcbiAgJChgJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm9yZGVyLnJldHVybkZvcm19IHRhYmxlIHRoZWFkIGlucHV0W3R5cGU9Y2hlY2tib3hdYCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNoZWNrZWQgPSAkKHRoaXMpLnByb3AoJ2NoZWNrZWQnKTtcbiAgICAkKGAke3ByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMub3JkZXIucmV0dXJuRm9ybX0gdGFibGUgdGJvZHkgaW5wdXRbdHlwZT1jaGVja2JveF1gKS5lYWNoKChfLCBjaGVja2JveCkgPT4ge1xuICAgICAgJChjaGVja2JveCkucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0dXBDdXN0b21lclNjcmlwdHMoKSB7XG4gIGlmICgkKCdib2R5I29yZGVyLWRldGFpbCcpKSB7XG4gICAgaW5pdFJtYUl0ZW1TZWxlY3RvcigpO1xuICB9XG59XG5cbiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwQ3VzdG9tZXJTY3JpcHRzKTtcbiIsIi8qISBWZWxvY2l0eUpTLm9yZyAoMS41LjIpLiAoQykgMjAxNCBKdWxpYW4gU2hhcGlyby4gTUlUIEBsaWNlbnNlOiBlbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cclxuXHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiBWZWxvY2l0eSBqUXVlcnkgU2hpbVxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbi8qISBWZWxvY2l0eUpTLm9yZyBqUXVlcnkgU2hpbSAoMS4wLjEpLiAoQykgMjAxNCBUaGUgalF1ZXJ5IEZvdW5kYXRpb24uIE1JVCBAbGljZW5zZTogZW4ud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlLiAqL1xyXG5cclxuLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBqUXVlcnkgZnVuY3Rpb25zIHRoYXQgVmVsb2NpdHkgcmVsaWVzIG9uLCB0aGVyZWJ5IHJlbW92aW5nIFZlbG9jaXR5J3MgZGVwZW5kZW5jeSBvbiBhIGZ1bGwgY29weSBvZiBqUXVlcnksIGFuZCBhbGxvd2luZyBpdCB0byB3b3JrIGluIGFueSBlbnZpcm9ubWVudC4gKi9cclxuLyogVGhlc2Ugc2hpbW1lZCBmdW5jdGlvbnMgYXJlIG9ubHkgdXNlZCBpZiBqUXVlcnkgaXNuJ3QgcHJlc2VudC4gSWYgYm90aCB0aGlzIHNoaW0gYW5kIGpRdWVyeSBhcmUgbG9hZGVkLCBWZWxvY2l0eSBkZWZhdWx0cyB0byBqUXVlcnkgcHJvcGVyLiAqL1xyXG4vKiBCcm93c2VyIHN1cHBvcnQ6IFVzaW5nIHRoaXMgc2hpbSBpbnN0ZWFkIG9mIGpRdWVyeSBwcm9wZXIgcmVtb3ZlcyBzdXBwb3J0IGZvciBJRTguICovXHJcblxyXG4oZnVuY3Rpb24od2luZG93KSB7XHJcblx0XCJ1c2Ugc3RyaWN0XCI7XHJcblx0LyoqKioqKioqKioqKioqKlxyXG5cdCBTZXR1cFxyXG5cdCAqKioqKioqKioqKioqKiovXHJcblxyXG5cdC8qIElmIGpRdWVyeSBpcyBhbHJlYWR5IGxvYWRlZCwgdGhlcmUncyBubyBwb2ludCBpbiBsb2FkaW5nIHRoaXMgc2hpbS4gKi9cclxuXHRpZiAod2luZG93LmpRdWVyeSkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0LyogalF1ZXJ5IGJhc2UuICovXHJcblx0dmFyICQgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCkge1xyXG5cdFx0cmV0dXJuIG5ldyAkLmZuLmluaXQoc2VsZWN0b3IsIGNvbnRleHQpO1xyXG5cdH07XHJcblxyXG5cdC8qKioqKioqKioqKioqKioqKioqKlxyXG5cdCBQcml2YXRlIE1ldGhvZHNcclxuXHQgKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdC8qIGpRdWVyeSAqL1xyXG5cdCQuaXNXaW5kb3cgPSBmdW5jdGlvbihvYmopIHtcclxuXHRcdC8qIGpzaGludCBlcWVxZXE6IGZhbHNlICovXHJcblx0XHRyZXR1cm4gb2JqICYmIG9iaiA9PT0gb2JqLndpbmRvdztcclxuXHR9O1xyXG5cclxuXHQvKiBqUXVlcnkgKi9cclxuXHQkLnR5cGUgPSBmdW5jdGlvbihvYmopIHtcclxuXHRcdGlmICghb2JqKSB7XHJcblx0XHRcdHJldHVybiBvYmogKyBcIlwiO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XHJcblx0XHRcdFx0Y2xhc3MydHlwZVt0b1N0cmluZy5jYWxsKG9iaildIHx8IFwib2JqZWN0XCIgOlxyXG5cdFx0XHRcdHR5cGVvZiBvYmo7XHJcblx0fTtcclxuXHJcblx0LyogalF1ZXJ5ICovXHJcblx0JC5pc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcclxuXHRcdHJldHVybiAkLnR5cGUob2JqKSA9PT0gXCJhcnJheVwiO1xyXG5cdH07XHJcblxyXG5cdC8qIGpRdWVyeSAqL1xyXG5cdGZ1bmN0aW9uIGlzQXJyYXlsaWtlKG9iaikge1xyXG5cdFx0dmFyIGxlbmd0aCA9IG9iai5sZW5ndGgsXHJcblx0XHRcdFx0dHlwZSA9ICQudHlwZShvYmopO1xyXG5cclxuXHRcdGlmICh0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgJC5pc1dpbmRvdyhvYmopKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAob2JqLm5vZGVUeXBlID09PSAxICYmIGxlbmd0aCkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgKGxlbmd0aCAtIDEpIGluIG9iajtcclxuXHR9XHJcblxyXG5cdC8qKioqKioqKioqKioqKipcclxuXHQgJCBNZXRob2RzXHJcblx0ICoqKioqKioqKioqKioqKi9cclxuXHJcblx0LyogalF1ZXJ5OiBTdXBwb3J0IHJlbW92ZWQgZm9yIElFPDkuICovXHJcblx0JC5pc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7XHJcblx0XHR2YXIga2V5O1xyXG5cclxuXHRcdGlmICghb2JqIHx8ICQudHlwZShvYmopICE9PSBcIm9iamVjdFwiIHx8IG9iai5ub2RlVHlwZSB8fCAkLmlzV2luZG93KG9iaikpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdGlmIChvYmouY29uc3RydWN0b3IgJiZcclxuXHRcdFx0XHRcdCFoYXNPd24uY2FsbChvYmosIFwiY29uc3RydWN0b3JcIikgJiZcclxuXHRcdFx0XHRcdCFoYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCBcImlzUHJvdG90eXBlT2ZcIikpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoa2V5IGluIG9iaikge1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBoYXNPd24uY2FsbChvYmosIGtleSk7XHJcblx0fTtcclxuXHJcblx0LyogalF1ZXJ5ICovXHJcblx0JC5lYWNoID0gZnVuY3Rpb24ob2JqLCBjYWxsYmFjaywgYXJncykge1xyXG5cdFx0dmFyIHZhbHVlLFxyXG5cdFx0XHRcdGkgPSAwLFxyXG5cdFx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGgsXHJcblx0XHRcdFx0aXNBcnJheSA9IGlzQXJyYXlsaWtlKG9iaik7XHJcblxyXG5cdFx0aWYgKGFyZ3MpIHtcclxuXHRcdFx0aWYgKGlzQXJyYXkpIHtcclxuXHRcdFx0XHRmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KG9ialtpXSwgYXJncyk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Zm9yIChpIGluIG9iaikge1xyXG5cdFx0XHRcdFx0aWYgKCFvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KG9ialtpXSwgYXJncyk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAoaXNBcnJheSkge1xyXG5cdFx0XHRcdGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2suY2FsbChvYmpbaV0sIGksIG9ialtpXSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Zm9yIChpIGluIG9iaikge1xyXG5cdFx0XHRcdFx0aWYgKCFvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmNhbGwob2JqW2ldLCBpLCBvYmpbaV0pO1xyXG5cclxuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG9iajtcclxuXHR9O1xyXG5cclxuXHQvKiBDdXN0b20gKi9cclxuXHQkLmRhdGEgPSBmdW5jdGlvbihub2RlLCBrZXksIHZhbHVlKSB7XHJcblx0XHQvKiAkLmdldERhdGEoKSAqL1xyXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dmFyIGdldElkID0gbm9kZVskLmV4cGFuZG9dLFxyXG5cdFx0XHRcdFx0c3RvcmUgPSBnZXRJZCAmJiBjYWNoZVtnZXRJZF07XHJcblxyXG5cdFx0XHRpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRyZXR1cm4gc3RvcmU7XHJcblx0XHRcdH0gZWxzZSBpZiAoc3RvcmUpIHtcclxuXHRcdFx0XHRpZiAoa2V5IGluIHN0b3JlKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gc3RvcmVba2V5XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0LyogJC5zZXREYXRhKCkgKi9cclxuXHRcdH0gZWxzZSBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dmFyIHNldElkID0gbm9kZVskLmV4cGFuZG9dIHx8IChub2RlWyQuZXhwYW5kb10gPSArKyQudXVpZCk7XHJcblxyXG5cdFx0XHRjYWNoZVtzZXRJZF0gPSBjYWNoZVtzZXRJZF0gfHwge307XHJcblx0XHRcdGNhY2hlW3NldElkXVtrZXldID0gdmFsdWU7XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyogQ3VzdG9tICovXHJcblx0JC5yZW1vdmVEYXRhID0gZnVuY3Rpb24obm9kZSwga2V5cykge1xyXG5cdFx0dmFyIGlkID0gbm9kZVskLmV4cGFuZG9dLFxyXG5cdFx0XHRcdHN0b3JlID0gaWQgJiYgY2FjaGVbaWRdO1xyXG5cclxuXHRcdGlmIChzdG9yZSkge1xyXG5cdFx0XHQvLyBDbGVhbnVwIHRoZSBlbnRpcmUgc3RvcmUgaWYgbm8ga2V5cyBhcmUgcHJvdmlkZWQuXHJcblx0XHRcdGlmICgha2V5cykge1xyXG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVtpZF07XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0JC5lYWNoKGtleXMsIGZ1bmN0aW9uKF8sIGtleSkge1xyXG5cdFx0XHRcdFx0ZGVsZXRlIHN0b3JlW2tleV07XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQvKiBqUXVlcnkgKi9cclxuXHQkLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIHNyYywgY29weUlzQXJyYXksIGNvcHksIG5hbWUsIG9wdGlvbnMsIGNsb25lLFxyXG5cdFx0XHRcdHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSxcclxuXHRcdFx0XHRpID0gMSxcclxuXHRcdFx0XHRsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxyXG5cdFx0XHRcdGRlZXAgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJib29sZWFuXCIpIHtcclxuXHRcdFx0ZGVlcCA9IHRhcmdldDtcclxuXHJcblx0XHRcdHRhcmdldCA9IGFyZ3VtZW50c1tpXSB8fCB7fTtcclxuXHRcdFx0aSsrO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICQudHlwZSh0YXJnZXQpICE9PSBcImZ1bmN0aW9uXCIpIHtcclxuXHRcdFx0dGFyZ2V0ID0ge307XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGkgPT09IGxlbmd0aCkge1xyXG5cdFx0XHR0YXJnZXQgPSB0aGlzO1xyXG5cdFx0XHRpLS07XHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xyXG5cdFx0XHRpZiAoKG9wdGlvbnMgPSBhcmd1bWVudHNbaV0pKSB7XHJcblx0XHRcdFx0Zm9yIChuYW1lIGluIG9wdGlvbnMpIHtcclxuXHRcdFx0XHRcdGlmICghb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHNyYyA9IHRhcmdldFtuYW1lXTtcclxuXHRcdFx0XHRcdGNvcHkgPSBvcHRpb25zW25hbWVdO1xyXG5cclxuXHRcdFx0XHRcdGlmICh0YXJnZXQgPT09IGNvcHkpIHtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKGRlZXAgJiYgY29weSAmJiAoJC5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9ICQuaXNBcnJheShjb3B5KSkpKSB7XHJcblx0XHRcdFx0XHRcdGlmIChjb3B5SXNBcnJheSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgJC5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgJC5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gJC5leHRlbmQoZGVlcCwgY2xvbmUsIGNvcHkpO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoY29weSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdHRhcmdldFtuYW1lXSA9IGNvcHk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHR9O1xyXG5cclxuXHQvKiBqUXVlcnkgMS40LjMgKi9cclxuXHQkLnF1ZXVlID0gZnVuY3Rpb24oZWxlbSwgdHlwZSwgZGF0YSkge1xyXG5cdFx0ZnVuY3Rpb24gJG1ha2VBcnJheShhcnIsIHJlc3VsdHMpIHtcclxuXHRcdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XHJcblxyXG5cdFx0XHRpZiAoYXJyKSB7XHJcblx0XHRcdFx0aWYgKGlzQXJyYXlsaWtlKE9iamVjdChhcnIpKSkge1xyXG5cdFx0XHRcdFx0LyogJC5tZXJnZSAqL1xyXG5cdFx0XHRcdFx0KGZ1bmN0aW9uKGZpcnN0LCBzZWNvbmQpIHtcclxuXHRcdFx0XHRcdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxyXG5cdFx0XHRcdFx0XHRcdFx0aiA9IDAsXHJcblx0XHRcdFx0XHRcdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRcdFx0d2hpbGUgKGogPCBsZW4pIHtcclxuXHRcdFx0XHRcdFx0XHRmaXJzdFtpKytdID0gc2Vjb25kW2orK107XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChsZW4gIT09IGxlbikge1xyXG5cdFx0XHRcdFx0XHRcdHdoaWxlIChzZWNvbmRbal0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zmlyc3RbaSsrXSA9IHNlY29uZFtqKytdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Zmlyc3QubGVuZ3RoID0gaTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBmaXJzdDtcclxuXHRcdFx0XHRcdH0pKHJldCwgdHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/IFthcnJdIDogYXJyKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0W10ucHVzaC5jYWxsKHJldCwgYXJyKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiByZXQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFlbGVtKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0eXBlID0gKHR5cGUgfHwgXCJmeFwiKSArIFwicXVldWVcIjtcclxuXHJcblx0XHR2YXIgcSA9ICQuZGF0YShlbGVtLCB0eXBlKTtcclxuXHJcblx0XHRpZiAoIWRhdGEpIHtcclxuXHRcdFx0cmV0dXJuIHEgfHwgW107XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFxIHx8ICQuaXNBcnJheShkYXRhKSkge1xyXG5cdFx0XHRxID0gJC5kYXRhKGVsZW0sIHR5cGUsICRtYWtlQXJyYXkoZGF0YSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cS5wdXNoKGRhdGEpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBxO1xyXG5cdH07XHJcblxyXG5cdC8qIGpRdWVyeSAxLjQuMyAqL1xyXG5cdCQuZGVxdWV1ZSA9IGZ1bmN0aW9uKGVsZW1zLCB0eXBlKSB7XHJcblx0XHQvKiBDdXN0b206IEVtYmVkIGVsZW1lbnQgaXRlcmF0aW9uLiAqL1xyXG5cdFx0JC5lYWNoKGVsZW1zLm5vZGVUeXBlID8gW2VsZW1zXSA6IGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKSB7XHJcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcclxuXHJcblx0XHRcdHZhciBxdWV1ZSA9ICQucXVldWUoZWxlbSwgdHlwZSksXHJcblx0XHRcdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XHJcblxyXG5cdFx0XHRpZiAoZm4gPT09IFwiaW5wcm9ncmVzc1wiKSB7XHJcblx0XHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoZm4pIHtcclxuXHRcdFx0XHRpZiAodHlwZSA9PT0gXCJmeFwiKSB7XHJcblx0XHRcdFx0XHRxdWV1ZS51bnNoaWZ0KFwiaW5wcm9ncmVzc1wiKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZuLmNhbGwoZWxlbSwgZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHQkLmRlcXVldWUoZWxlbSwgdHlwZSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH07XHJcblxyXG5cdC8qKioqKioqKioqKioqKioqKipcclxuXHQgJC5mbiBNZXRob2RzXHJcblx0ICoqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0LyogalF1ZXJ5ICovXHJcblx0JC5mbiA9ICQucHJvdG90eXBlID0ge1xyXG5cdFx0aW5pdDogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuXHRcdFx0LyogSnVzdCByZXR1cm4gdGhlIGVsZW1lbnQgd3JhcHBlZCBpbnNpZGUgYW4gYXJyYXk7IGRvbid0IHByb2NlZWQgd2l0aCB0aGUgYWN0dWFsIGpRdWVyeSBub2RlIHdyYXBwaW5nIHByb2Nlc3MuICovXHJcblx0XHRcdGlmIChzZWxlY3Rvci5ub2RlVHlwZSkge1xyXG5cdFx0XHRcdHRoaXNbMF0gPSBzZWxlY3RvcjtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGEgRE9NIG5vZGUuXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0b2Zmc2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0LyogalF1ZXJ5IGFsdGVyZWQgY29kZTogRHJvcHBlZCBkaXNjb25uZWN0ZWQgRE9NIG5vZGUgY2hlY2tpbmcuICovXHJcblx0XHRcdHZhciBib3ggPSB0aGlzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/IHRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiB7dG9wOiAwLCBsZWZ0OiAwfTtcclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0dG9wOiBib3gudG9wICsgKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5zY3JvbGxUb3AgfHwgMCkgLSAoZG9jdW1lbnQuY2xpZW50VG9wIHx8IDApLFxyXG5cdFx0XHRcdGxlZnQ6IGJveC5sZWZ0ICsgKHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvY3VtZW50LmNsaWVudExlZnQgfHwgMClcclxuXHRcdFx0fTtcclxuXHRcdH0sXHJcblx0XHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8qIGpRdWVyeSAqL1xyXG5cdFx0XHRmdW5jdGlvbiBvZmZzZXRQYXJlbnRGbihlbGVtKSB7XHJcblx0XHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50O1xyXG5cclxuXHRcdFx0XHR3aGlsZSAob2Zmc2V0UGFyZW50ICYmIChvZmZzZXRQYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJodG1sXCIgJiYgb2Zmc2V0UGFyZW50LnN0eWxlICYmIG9mZnNldFBhcmVudC5zdHlsZS5wb3NpdGlvbi50b0xvd2VyQ2FzZSgpID09PSBcInN0YXRpY1wiKSkge1xyXG5cdFx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFplcHRvICovXHJcblx0XHRcdHZhciBlbGVtID0gdGhpc1swXSxcclxuXHRcdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudEZuKGVsZW0pLFxyXG5cdFx0XHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKSxcclxuXHRcdFx0XHRcdHBhcmVudE9mZnNldCA9IC9eKD86Ym9keXxodG1sKSQvaS50ZXN0KG9mZnNldFBhcmVudC5ub2RlTmFtZSkgPyB7dG9wOiAwLCBsZWZ0OiAwfSA6ICQob2Zmc2V0UGFyZW50KS5vZmZzZXQoKTtcclxuXHJcblx0XHRcdG9mZnNldC50b3AgLT0gcGFyc2VGbG9hdChlbGVtLnN0eWxlLm1hcmdpblRvcCkgfHwgMDtcclxuXHRcdFx0b2Zmc2V0LmxlZnQgLT0gcGFyc2VGbG9hdChlbGVtLnN0eWxlLm1hcmdpbkxlZnQpIHx8IDA7XHJcblxyXG5cdFx0XHRpZiAob2Zmc2V0UGFyZW50LnN0eWxlKSB7XHJcblx0XHRcdFx0cGFyZW50T2Zmc2V0LnRvcCArPSBwYXJzZUZsb2F0KG9mZnNldFBhcmVudC5zdHlsZS5ib3JkZXJUb3BXaWR0aCkgfHwgMDtcclxuXHRcdFx0XHRwYXJlbnRPZmZzZXQubGVmdCArPSBwYXJzZUZsb2F0KG9mZnNldFBhcmVudC5zdHlsZS5ib3JkZXJMZWZ0V2lkdGgpIHx8IDA7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCxcclxuXHRcdFx0XHRsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0XHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqKioqKioqKioqKioqKioqKioqKipcclxuXHQgUHJpdmF0ZSBWYXJpYWJsZXNcclxuXHQgKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0LyogRm9yICQuZGF0YSgpICovXHJcblx0dmFyIGNhY2hlID0ge307XHJcblx0JC5leHBhbmRvID0gXCJ2ZWxvY2l0eVwiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcclxuXHQkLnV1aWQgPSAwO1xyXG5cclxuXHQvKiBGb3IgJC5xdWV1ZSgpICovXHJcblx0dmFyIGNsYXNzMnR5cGUgPSB7fSxcclxuXHRcdFx0aGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eSxcclxuXHRcdFx0dG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xyXG5cclxuXHR2YXIgdHlwZXMgPSBcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3JcIi5zcGxpdChcIiBcIik7XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0Y2xhc3MydHlwZVtcIltvYmplY3QgXCIgKyB0eXBlc1tpXSArIFwiXVwiXSA9IHR5cGVzW2ldLnRvTG93ZXJDYXNlKCk7XHJcblx0fVxyXG5cclxuXHQvKiBNYWtlcyAkKG5vZGUpIHBvc3NpYmxlLCB3aXRob3V0IGhhdmluZyB0byBjYWxsIGluaXQuICovXHJcblx0JC5mbi5pbml0LnByb3RvdHlwZSA9ICQuZm47XHJcblxyXG5cdC8qIEdsb2JhbGl6ZSBWZWxvY2l0eSBvbnRvIHRoZSB3aW5kb3csIGFuZCBhc3NpZ24gaXRzIFV0aWxpdGllcyBwcm9wZXJ0eS4gKi9cclxuXHR3aW5kb3cuVmVsb2NpdHkgPSB7VXRpbGl0aWVzOiAkfTtcclxufSkod2luZG93KTtcclxuXHJcbi8qKioqKioqKioqKioqKioqKipcclxuIFZlbG9jaXR5LmpzXHJcbiAqKioqKioqKioqKioqKioqKiovXHJcblxyXG4oZnVuY3Rpb24oZmFjdG9yeSkge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG5cdC8qIENvbW1vbkpTIG1vZHVsZS4gKi9cclxuXHRpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xyXG5cdFx0LyogQU1EIG1vZHVsZS4gKi9cclxuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XHJcblx0XHRkZWZpbmUoZmFjdG9yeSk7XHJcblx0XHQvKiBCcm93c2VyIGdsb2JhbHMuICovXHJcblx0fSBlbHNlIHtcclxuXHRcdGZhY3RvcnkoKTtcclxuXHR9XHJcbn0oZnVuY3Rpb24oKSB7XHJcblx0XCJ1c2Ugc3RyaWN0XCI7XHJcblx0cmV0dXJuIGZ1bmN0aW9uKGdsb2JhbCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqKlxyXG5cdFx0IFN1bW1hcnlcclxuXHRcdCAqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0LypcclxuXHRcdCAtIENTUzogQ1NTIHN0YWNrIHRoYXQgd29ya3MgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSByZXN0IG9mIFZlbG9jaXR5LlxyXG5cdFx0IC0gYW5pbWF0ZSgpOiBDb3JlIGFuaW1hdGlvbiBtZXRob2QgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSB0YXJnZXRlZCBlbGVtZW50cyBhbmQgcXVldWVzIHRoZSBpbmNvbWluZyBjYWxsIG9udG8gZWFjaCBlbGVtZW50IGluZGl2aWR1YWxseS5cclxuXHRcdCAtIFByZS1RdWV1ZWluZzogUHJlcGFyZSB0aGUgZWxlbWVudCBmb3IgYW5pbWF0aW9uIGJ5IGluc3RhbnRpYXRpbmcgaXRzIGRhdGEgY2FjaGUgYW5kIHByb2Nlc3NpbmcgdGhlIGNhbGwncyBvcHRpb25zLlxyXG5cdFx0IC0gUXVldWVpbmc6IFRoZSBsb2dpYyB0aGF0IHJ1bnMgb25jZSB0aGUgY2FsbCBoYXMgcmVhY2hlZCBpdHMgcG9pbnQgb2YgZXhlY3V0aW9uIGluIHRoZSBlbGVtZW50J3MgJC5xdWV1ZSgpIHN0YWNrLlxyXG5cdFx0IE1vc3QgbG9naWMgaXMgcGxhY2VkIGhlcmUgdG8gYXZvaWQgcmlza2luZyBpdCBiZWNvbWluZyBzdGFsZSAoaWYgdGhlIGVsZW1lbnQncyBwcm9wZXJ0aWVzIGhhdmUgY2hhbmdlZCkuXHJcblx0XHQgLSBQdXNoaW5nOiBDb25zb2xpZGF0aW9uIG9mIHRoZSB0d2VlbiBkYXRhIGZvbGxvd2VkIGJ5IGl0cyBwdXNoIG9udG8gdGhlIGdsb2JhbCBpbi1wcm9ncmVzcyBjYWxscyBjb250YWluZXIuXHJcblx0XHQgLSB0aWNrKCk6IFRoZSBzaW5nbGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGxvb3AgcmVzcG9uc2libGUgZm9yIHR3ZWVuaW5nIGFsbCBpbi1wcm9ncmVzcyBjYWxscy5cclxuXHRcdCAtIGNvbXBsZXRlQ2FsbCgpOiBIYW5kbGVzIHRoZSBjbGVhbnVwIHByb2Nlc3MgZm9yIGVhY2ggVmVsb2NpdHkgY2FsbC5cclxuXHRcdCAqL1xyXG5cclxuXHRcdC8qKioqKioqKioqKioqKioqKioqKipcclxuXHRcdCBIZWxwZXIgRnVuY3Rpb25zXHJcblx0XHQgKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdC8qIElFIGRldGVjdGlvbi4gR2lzdDogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vanVsaWFuc2hhcGlyby85MDk4NjA5ICovXHJcblx0XHR2YXIgSUUgPSAoZnVuY3Rpb24oKSB7XHJcblx0XHRcdGlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAodmFyIGkgPSA3OyBpID4gNDsgaS0tKSB7XHJcblx0XHRcdFx0XHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcblx0XHRcdFx0XHRkaXYuaW5uZXJIVE1MID0gXCI8IS0tW2lmIElFIFwiICsgaSArIFwiXT48c3Bhbj48L3NwYW4+PCFbZW5kaWZdLS0+XCI7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNwYW5cIikubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdGRpdiA9IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gaTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9KSgpO1xyXG5cclxuXHRcdC8qIHJBRiBzaGltLiBHaXN0OiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qdWxpYW5zaGFwaXJvLzk0OTc1MTMgKi9cclxuXHRcdHZhciByQUZTaGltID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgdGltZUxhc3QgPSAwO1xyXG5cclxuXHRcdFx0cmV0dXJuIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBmdW5jdGlvbihjYWxsYmFjaykge1xyXG5cdFx0XHRcdHZhciB0aW1lQ3VycmVudCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksXHJcblx0XHRcdFx0XHRcdHRpbWVEZWx0YTtcclxuXHJcblx0XHRcdFx0LyogRHluYW1pY2FsbHkgc2V0IGRlbGF5IG9uIGEgcGVyLXRpY2sgYmFzaXMgdG8gbWF0Y2ggNjBmcHMuICovXHJcblx0XHRcdFx0LyogVGVjaG5pcXVlIGJ5IEVyaWsgTW9sbGVyLiBNSVQgbGljZW5zZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzE1Nzk2NzEgKi9cclxuXHRcdFx0XHR0aW1lRGVsdGEgPSBNYXRoLm1heCgwLCAxNiAtICh0aW1lQ3VycmVudCAtIHRpbWVMYXN0KSk7XHJcblx0XHRcdFx0dGltZUxhc3QgPSB0aW1lQ3VycmVudCArIHRpbWVEZWx0YTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRjYWxsYmFjayh0aW1lQ3VycmVudCArIHRpbWVEZWx0YSk7XHJcblx0XHRcdFx0fSwgdGltZURlbHRhKTtcclxuXHRcdFx0fTtcclxuXHRcdH0pKCk7XHJcblxyXG5cdFx0dmFyIHBlcmZvcm1hbmNlID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgcGVyZiA9IHdpbmRvdy5wZXJmb3JtYW5jZSB8fCB7fTtcclxuXHJcblx0XHRcdGlmICh0eXBlb2YgcGVyZi5ub3cgIT09IFwiZnVuY3Rpb25cIikge1xyXG5cdFx0XHRcdHZhciBub3dPZmZzZXQgPSBwZXJmLnRpbWluZyAmJiBwZXJmLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQgPyBwZXJmLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xyXG5cclxuXHRcdFx0XHRwZXJmLm5vdyA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBub3dPZmZzZXQ7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcGVyZjtcclxuXHRcdH0pKCk7XHJcblxyXG5cdFx0LyogQXJyYXkgY29tcGFjdGluZy4gQ29weXJpZ2h0IExvLURhc2guIE1JVCBMaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dCAqL1xyXG5cdFx0ZnVuY3Rpb24gY29tcGFjdFNwYXJzZUFycmF5KGFycmF5KSB7XHJcblx0XHRcdHZhciBpbmRleCA9IC0xLFxyXG5cdFx0XHRcdFx0bGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxyXG5cdFx0XHRcdFx0cmVzdWx0ID0gW107XHJcblxyXG5cdFx0XHR3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG5cdFx0XHRcdHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcclxuXHJcblx0XHRcdFx0aWYgKHZhbHVlKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaCh2YWx1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2hpbSBmb3IgXCJmaXhpbmdcIiBJRSdzIGxhY2sgb2Ygc3VwcG9ydCAoSUUgPCA5KSBmb3IgYXBwbHlpbmcgc2xpY2VcclxuXHRcdCAqIG9uIGhvc3Qgb2JqZWN0cyBsaWtlIE5hbWVkTm9kZU1hcCwgTm9kZUxpc3QsIGFuZCBIVE1MQ29sbGVjdGlvblxyXG5cdFx0ICogKHRlY2huaWNhbGx5LCBzaW5jZSBob3N0IG9iamVjdHMgaGF2ZSBiZWVuIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCxcclxuXHRcdCAqIGF0IGxlYXN0IGJlZm9yZSBFUzIwMTUsIElFIGhhc24ndCBuZWVkZWQgdG8gd29yayB0aGlzIHdheSkuXHJcblx0XHQgKiBBbHNvIHdvcmtzIG9uIHN0cmluZ3MsIGZpeGVzIElFIDwgOSB0byBhbGxvdyBhbiBleHBsaWNpdCB1bmRlZmluZWRcclxuXHRcdCAqIGZvciB0aGUgMm5kIGFyZ3VtZW50IChhcyBpbiBGaXJlZm94KSwgYW5kIHByZXZlbnRzIGVycm9ycyB3aGVuXHJcblx0XHQgKiBjYWxsZWQgb24gb3RoZXIgRE9NIG9iamVjdHMuXHJcblx0XHQgKi9cclxuXHRcdHZhciBfc2xpY2UgPSAoZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Ly8gQ2FuJ3QgYmUgdXNlZCB3aXRoIERPTSBlbGVtZW50cyBpbiBJRSA8IDlcclxuXHRcdFx0XHRzbGljZS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XHJcblx0XHRcdFx0cmV0dXJuIHNsaWNlO1xyXG5cdFx0XHR9IGNhdGNoIChlKSB7IC8vIEZhaWxzIGluIElFIDwgOVxyXG5cclxuXHRcdFx0XHQvLyBUaGlzIHdpbGwgd29yayBmb3IgZ2VudWluZSBhcnJheXMsIGFycmF5LWxpa2Ugb2JqZWN0cywgXHJcblx0XHRcdFx0Ly8gTmFtZWROb2RlTWFwIChhdHRyaWJ1dGVzLCBlbnRpdGllcywgbm90YXRpb25zKSxcclxuXHRcdFx0XHQvLyBOb2RlTGlzdCAoZS5nLiwgZ2V0RWxlbWVudHNCeVRhZ05hbWUpLCBIVE1MQ29sbGVjdGlvbiAoZS5nLiwgY2hpbGROb2RlcyksXHJcblx0XHRcdFx0Ly8gYW5kIHdpbGwgbm90IGZhaWwgb24gb3RoZXIgRE9NIG9iamVjdHMgKGFzIGRvIERPTSBlbGVtZW50cyBpbiBJRSA8IDkpXHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcclxuXHRcdFx0XHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0XHRpZiAodHlwZW9mIGJlZ2luICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRcdFx0XHRcdGJlZ2luID0gMDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIElFIDwgOSBnZXRzIHVuaGFwcHkgd2l0aCBhbiB1bmRlZmluZWQgZW5kIGFyZ3VtZW50XHJcblx0XHRcdFx0XHRpZiAodHlwZW9mIGVuZCAhPT0gXCJudW1iZXJcIikge1xyXG5cdFx0XHRcdFx0XHRlbmQgPSBsZW47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBGb3IgbmF0aXZlIEFycmF5IG9iamVjdHMsIHdlIHVzZSB0aGUgbmF0aXZlIHNsaWNlIGZ1bmN0aW9uXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zbGljZSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCh0aGlzLCBiZWdpbiwgZW5kKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIEZvciBhcnJheSBsaWtlIG9iamVjdCB3ZSBoYW5kbGUgaXQgb3Vyc2VsdmVzLlxyXG5cdFx0XHRcdFx0dmFyIGksXHJcblx0XHRcdFx0XHRcdFx0Y2xvbmVkID0gW10sXHJcblx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIG5lZ2F0aXZlIHZhbHVlIGZvciBcImJlZ2luXCJcclxuXHRcdFx0XHRcdFx0XHRzdGFydCA9IChiZWdpbiA+PSAwKSA/IGJlZ2luIDogTWF0aC5tYXgoMCwgbGVuICsgYmVnaW4pLFxyXG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBuZWdhdGl2ZSB2YWx1ZSBmb3IgXCJlbmRcIlxyXG5cdFx0XHRcdFx0XHRcdHVwVG8gPSBlbmQgPCAwID8gbGVuICsgZW5kIDogTWF0aC5taW4oZW5kLCBsZW4pLFxyXG5cdFx0XHRcdFx0XHRcdC8vIEFjdHVhbCBleHBlY3RlZCBzaXplIG9mIHRoZSBzbGljZVxyXG5cdFx0XHRcdFx0XHRcdHNpemUgPSB1cFRvIC0gc3RhcnQ7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHNpemUgPiAwKSB7XHJcblx0XHRcdFx0XHRcdGNsb25lZCA9IG5ldyBBcnJheShzaXplKTtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuY2hhckF0KSB7XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2xvbmVkW2ldID0gdGhpcy5jaGFyQXQoc3RhcnQgKyBpKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2xvbmVkW2ldID0gdGhpc1tzdGFydCArIGldO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIGNsb25lZDtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblx0XHR9KSgpO1xyXG5cclxuXHRcdC8qIC5pbmRleE9mIGRvZXNuJ3QgZXhpc3QgaW4gSUU8OSAqL1xyXG5cdFx0dmFyIF9pbkFycmF5ID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRpZiAoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGFyciwgdmFsKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gYXJyLmluY2x1ZGVzKHZhbCk7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcclxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oYXJyLCB2YWwpIHtcclxuXHRcdFx0XHRcdHJldHVybiBhcnIuaW5kZXhPZih2YWwpID49IDA7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oYXJyLCB2YWwpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0aWYgKGFycltpXSA9PT0gdmFsKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH07XHJcblx0XHR9KTtcclxuXHJcblx0XHRmdW5jdGlvbiBzYW5pdGl6ZUVsZW1lbnRzKGVsZW1lbnRzKSB7XHJcblx0XHRcdC8qIFVud3JhcCBqUXVlcnkvWmVwdG8gb2JqZWN0cy4gKi9cclxuXHRcdFx0aWYgKFR5cGUuaXNXcmFwcGVkKGVsZW1lbnRzKSkge1xyXG5cdFx0XHRcdGVsZW1lbnRzID0gX3NsaWNlLmNhbGwoZWxlbWVudHMpO1xyXG5cdFx0XHRcdC8qIFdyYXAgYSBzaW5nbGUgZWxlbWVudCBpbiBhbiBhcnJheSBzbyB0aGF0ICQuZWFjaCgpIGNhbiBpdGVyYXRlIHdpdGggdGhlIGVsZW1lbnQgaW5zdGVhZCBvZiBpdHMgbm9kZSdzIGNoaWxkcmVuLiAqL1xyXG5cdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNOb2RlKGVsZW1lbnRzKSkge1xyXG5cdFx0XHRcdGVsZW1lbnRzID0gW2VsZW1lbnRzXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGVsZW1lbnRzO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBUeXBlID0ge1xyXG5cdFx0XHRpc051bWJlcjogZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gKHR5cGVvZiB2YXJpYWJsZSA9PT0gXCJudW1iZXJcIik7XHJcblx0XHRcdH0sXHJcblx0XHRcdGlzU3RyaW5nOiBmdW5jdGlvbih2YXJpYWJsZSkge1xyXG5cdFx0XHRcdHJldHVybiAodHlwZW9mIHZhcmlhYmxlID09PSBcInN0cmluZ1wiKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0aXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YXJpYWJsZSkge1xyXG5cdFx0XHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFyaWFibGUpID09PSBcIltvYmplY3QgQXJyYXldXCI7XHJcblx0XHRcdH0sXHJcblx0XHRcdGlzRnVuY3Rpb246IGZ1bmN0aW9uKHZhcmlhYmxlKSB7XHJcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YXJpYWJsZSkgPT09IFwiW29iamVjdCBGdW5jdGlvbl1cIjtcclxuXHRcdFx0fSxcclxuXHRcdFx0aXNOb2RlOiBmdW5jdGlvbih2YXJpYWJsZSkge1xyXG5cdFx0XHRcdHJldHVybiB2YXJpYWJsZSAmJiB2YXJpYWJsZS5ub2RlVHlwZTtcclxuXHRcdFx0fSxcclxuXHRcdFx0LyogRGV0ZXJtaW5lIGlmIHZhcmlhYmxlIGlzIGFuIGFycmF5LWxpa2Ugd3JhcHBlZCBqUXVlcnksIFplcHRvIG9yIHNpbWlsYXIgZWxlbWVudCwgb3IgZXZlbiBhIE5vZGVMaXN0IGV0Yy4gKi9cclxuXHRcdFx0LyogTk9URTogSFRNTEZvcm1FbGVtZW50cyBhbHNvIGhhdmUgYSBsZW5ndGguICovXHJcblx0XHRcdGlzV3JhcHBlZDogZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gdmFyaWFibGVcclxuXHRcdFx0XHRcdFx0JiYgdmFyaWFibGUgIT09IHdpbmRvd1xyXG5cdFx0XHRcdFx0XHQmJiBUeXBlLmlzTnVtYmVyKHZhcmlhYmxlLmxlbmd0aClcclxuXHRcdFx0XHRcdFx0JiYgIVR5cGUuaXNTdHJpbmcodmFyaWFibGUpXHJcblx0XHRcdFx0XHRcdCYmICFUeXBlLmlzRnVuY3Rpb24odmFyaWFibGUpXHJcblx0XHRcdFx0XHRcdCYmICFUeXBlLmlzTm9kZSh2YXJpYWJsZSlcclxuXHRcdFx0XHRcdFx0JiYgKHZhcmlhYmxlLmxlbmd0aCA9PT0gMCB8fCBUeXBlLmlzTm9kZSh2YXJpYWJsZVswXSkpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRpc1NWRzogZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gd2luZG93LlNWR0VsZW1lbnQgJiYgKHZhcmlhYmxlIGluc3RhbmNlb2Ygd2luZG93LlNWR0VsZW1lbnQpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbih2YXJpYWJsZSkge1xyXG5cdFx0XHRcdGZvciAodmFyIG5hbWUgaW4gdmFyaWFibGUpIHtcclxuXHRcdFx0XHRcdGlmICh2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0XHQvKioqKioqKioqKioqKioqKipcclxuXHRcdCBEZXBlbmRlbmNpZXNcclxuXHRcdCAqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHR2YXIgJCxcclxuXHRcdFx0XHRpc0pRdWVyeSA9IGZhbHNlO1xyXG5cclxuXHRcdGlmIChnbG9iYWwuZm4gJiYgZ2xvYmFsLmZuLmpxdWVyeSkge1xyXG5cdFx0XHQkID0gZ2xvYmFsO1xyXG5cdFx0XHRpc0pRdWVyeSA9IHRydWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQkID0gd2luZG93LlZlbG9jaXR5LlV0aWxpdGllcztcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoSUUgPD0gOCAmJiAhaXNKUXVlcnkpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVmVsb2NpdHk6IElFOCBhbmQgYmVsb3cgcmVxdWlyZSBqUXVlcnkgdG8gYmUgbG9hZGVkIGJlZm9yZSBWZWxvY2l0eS5cIik7XHJcblx0XHR9IGVsc2UgaWYgKElFIDw9IDcpIHtcclxuXHRcdFx0LyogUmV2ZXJ0IHRvIGpRdWVyeSdzICQuYW5pbWF0ZSgpLCBhbmQgbG9zZSBWZWxvY2l0eSdzIGV4dHJhIGZlYXR1cmVzLiAqL1xyXG5cdFx0XHRqUXVlcnkuZm4udmVsb2NpdHkgPSBqUXVlcnkuZm4uYW5pbWF0ZTtcclxuXHJcblx0XHRcdC8qIE5vdyB0aGF0ICQuZm4udmVsb2NpdHkgaXMgYWxpYXNlZCwgYWJvcnQgdGhpcyBWZWxvY2l0eSBkZWNsYXJhdGlvbi4gKi9cclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKioqKioqKioqKioqKioqKlxyXG5cdFx0IENvbnN0YW50c1xyXG5cdFx0ICoqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdHZhciBEVVJBVElPTl9ERUZBVUxUID0gNDAwLFxyXG5cdFx0XHRcdEVBU0lOR19ERUZBVUxUID0gXCJzd2luZ1wiO1xyXG5cclxuXHRcdC8qKioqKioqKioqKioqXHJcblx0XHQgU3RhdGVcclxuXHRcdCAqKioqKioqKioqKioqL1xyXG5cclxuXHRcdHZhciBWZWxvY2l0eSA9IHtcclxuXHRcdFx0LyogQ29udGFpbmVyIGZvciBwYWdlLXdpZGUgVmVsb2NpdHkgc3RhdGUgZGF0YS4gKi9cclxuXHRcdFx0U3RhdGU6IHtcclxuXHRcdFx0XHQvKiBEZXRlY3QgbW9iaWxlIGRldmljZXMgdG8gZGV0ZXJtaW5lIGlmIG1vYmlsZUhBIHNob3VsZCBiZSB0dXJuZWQgb24uICovXHJcblx0XHRcdFx0aXNNb2JpbGU6IC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksXHJcblx0XHRcdFx0LyogVGhlIG1vYmlsZUhBIG9wdGlvbidzIGJlaGF2aW9yIGNoYW5nZXMgb24gb2xkZXIgQW5kcm9pZCBkZXZpY2VzIChHaW5nZXJicmVhZCwgdmVyc2lvbnMgMi4zLjMtMi4zLjcpLiAqL1xyXG5cdFx0XHRcdGlzQW5kcm9pZDogL0FuZHJvaWQvaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSxcclxuXHRcdFx0XHRpc0dpbmdlcmJyZWFkOiAvQW5kcm9pZCAyXFwuM1xcLlszLTddL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksXHJcblx0XHRcdFx0aXNDaHJvbWU6IHdpbmRvdy5jaHJvbWUsXHJcblx0XHRcdFx0aXNGaXJlZm94OiAvRmlyZWZveC9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpLFxyXG5cdFx0XHRcdC8qIENyZWF0ZSBhIGNhY2hlZCBlbGVtZW50IGZvciByZS11c2Ugd2hlbiBjaGVja2luZyBmb3IgQ1NTIHByb3BlcnR5IHByZWZpeGVzLiAqL1xyXG5cdFx0XHRcdHByZWZpeEVsZW1lbnQ6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXHJcblx0XHRcdFx0LyogQ2FjaGUgZXZlcnkgcHJlZml4IG1hdGNoIHRvIGF2b2lkIHJlcGVhdGluZyBsb29rdXBzLiAqL1xyXG5cdFx0XHRcdHByZWZpeE1hdGNoZXM6IHt9LFxyXG5cdFx0XHRcdC8qIENhY2hlIHRoZSBhbmNob3IgdXNlZCBmb3IgYW5pbWF0aW5nIHdpbmRvdyBzY3JvbGxpbmcuICovXHJcblx0XHRcdFx0c2Nyb2xsQW5jaG9yOiBudWxsLFxyXG5cdFx0XHRcdC8qIENhY2hlIHRoZSBicm93c2VyLXNwZWNpZmljIHByb3BlcnR5IG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Nyb2xsIGFuY2hvci4gKi9cclxuXHRcdFx0XHRzY3JvbGxQcm9wZXJ0eUxlZnQ6IG51bGwsXHJcblx0XHRcdFx0c2Nyb2xsUHJvcGVydHlUb3A6IG51bGwsXHJcblx0XHRcdFx0LyogS2VlcCB0cmFjayBvZiB3aGV0aGVyIG91ciBSQUYgdGljayBpcyBydW5uaW5nLiAqL1xyXG5cdFx0XHRcdGlzVGlja2luZzogZmFsc2UsXHJcblx0XHRcdFx0LyogQ29udGFpbmVyIGZvciBldmVyeSBpbi1wcm9ncmVzcyBjYWxsIHRvIFZlbG9jaXR5LiAqL1xyXG5cdFx0XHRcdGNhbGxzOiBbXSxcclxuXHRcdFx0XHRkZWxheWVkRWxlbWVudHM6IHtcclxuXHRcdFx0XHRcdGNvdW50OiAwXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKiBWZWxvY2l0eSdzIGN1c3RvbSBDU1Mgc3RhY2suIE1hZGUgZ2xvYmFsIGZvciB1bml0IHRlc3RpbmcuICovXHJcblx0XHRcdENTUzogey8qIERlZmluZWQgYmVsb3cuICovfSxcclxuXHRcdFx0LyogQSBzaGltIG9mIHRoZSBqUXVlcnkgdXRpbGl0eSBmdW5jdGlvbnMgdXNlZCBieSBWZWxvY2l0eSAtLSBwcm92aWRlZCBieSBWZWxvY2l0eSdzIG9wdGlvbmFsIGpRdWVyeSBzaGltLiAqL1xyXG5cdFx0XHRVdGlsaXRpZXM6ICQsXHJcblx0XHRcdC8qIENvbnRhaW5lciBmb3IgdGhlIHVzZXIncyBjdXN0b20gYW5pbWF0aW9uIHJlZGlyZWN0cyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IG5hbWUgaW4gcGxhY2Ugb2YgdGhlIHByb3BlcnRpZXMgbWFwIGFyZ3VtZW50LiAqL1xyXG5cdFx0XHRSZWRpcmVjdHM6IHsvKiBNYW51YWxseSByZWdpc3RlcmVkIGJ5IHRoZSB1c2VyLiAqL30sXHJcblx0XHRcdEVhc2luZ3M6IHsvKiBEZWZpbmVkIGJlbG93LiAqL30sXHJcblx0XHRcdC8qIEF0dGVtcHQgdG8gdXNlIEVTNiBQcm9taXNlcyBieSBkZWZhdWx0LiBVc2VycyBjYW4gb3ZlcnJpZGUgdGhpcyB3aXRoIGEgdGhpcmQtcGFydHkgcHJvbWlzZXMgbGlicmFyeS4gKi9cclxuXHRcdFx0UHJvbWlzZTogd2luZG93LlByb21pc2UsXHJcblx0XHRcdC8qIFZlbG9jaXR5IG9wdGlvbiBkZWZhdWx0cywgd2hpY2ggY2FuIGJlIG92ZXJyaWRlbiBieSB0aGUgdXNlci4gKi9cclxuXHRcdFx0ZGVmYXVsdHM6IHtcclxuXHRcdFx0XHRxdWV1ZTogXCJcIixcclxuXHRcdFx0XHRkdXJhdGlvbjogRFVSQVRJT05fREVGQVVMVCxcclxuXHRcdFx0XHRlYXNpbmc6IEVBU0lOR19ERUZBVUxULFxyXG5cdFx0XHRcdGJlZ2luOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0Y29tcGxldGU6IHVuZGVmaW5lZCxcclxuXHRcdFx0XHRwcm9ncmVzczogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdGRpc3BsYXk6IHVuZGVmaW5lZCxcclxuXHRcdFx0XHR2aXNpYmlsaXR5OiB1bmRlZmluZWQsXHJcblx0XHRcdFx0bG9vcDogZmFsc2UsXHJcblx0XHRcdFx0ZGVsYXk6IGZhbHNlLFxyXG5cdFx0XHRcdG1vYmlsZUhBOiB0cnVlLFxyXG5cdFx0XHRcdC8qIEFkdmFuY2VkOiBTZXQgdG8gZmFsc2UgdG8gcHJldmVudCBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBiZWluZyBjYWNoZWQgYmV0d2VlbiBjb25zZWN1dGl2ZSBWZWxvY2l0eS1pbml0aWF0ZWQgY2hhaW4gY2FsbHMuICovXHJcblx0XHRcdFx0X2NhY2hlVmFsdWVzOiB0cnVlLFxyXG5cdFx0XHRcdC8qIEFkdmFuY2VkOiBTZXQgdG8gZmFsc2UgaWYgdGhlIHByb21pc2Ugc2hvdWxkIGFsd2F5cyByZXNvbHZlIG9uIGVtcHR5IGVsZW1lbnQgbGlzdHMuICovXHJcblx0XHRcdFx0cHJvbWlzZVJlamVjdEVtcHR5OiB0cnVlXHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIEEgZGVzaWduIGdvYWwgb2YgVmVsb2NpdHkgaXMgdG8gY2FjaGUgZGF0YSB3aGVyZXZlciBwb3NzaWJsZSBpbiBvcmRlciB0byBhdm9pZCBET00gcmVxdWVyeWluZy4gQWNjb3JkaW5nbHksIGVhY2ggZWxlbWVudCBoYXMgYSBkYXRhIGNhY2hlLiAqL1xyXG5cdFx0XHRpbml0OiBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRcdFx0JC5kYXRhKGVsZW1lbnQsIFwidmVsb2NpdHlcIiwge1xyXG5cdFx0XHRcdFx0LyogU3RvcmUgd2hldGhlciB0aGlzIGlzIGFuIFNWRyBlbGVtZW50LCBzaW5jZSBpdHMgcHJvcGVydGllcyBhcmUgcmV0cmlldmVkIGFuZCB1cGRhdGVkIGRpZmZlcmVudGx5IHRoYW4gc3RhbmRhcmQgSFRNTCBlbGVtZW50cy4gKi9cclxuXHRcdFx0XHRcdGlzU1ZHOiBUeXBlLmlzU1ZHKGVsZW1lbnQpLFxyXG5cdFx0XHRcdFx0LyogS2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGN1cnJlbnRseSBiZWluZyBhbmltYXRlZCBieSBWZWxvY2l0eS5cclxuXHRcdFx0XHRcdCBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgcHJvcGVydHkgdmFsdWVzIGFyZSBub3QgdHJhbnNmZXJyZWQgYmV0d2VlbiBub24tY29uc2VjdXRpdmUgKHN0YWxlKSBjYWxscy4gKi9cclxuXHRcdFx0XHRcdGlzQW5pbWF0aW5nOiBmYWxzZSxcclxuXHRcdFx0XHRcdC8qIEEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50J3MgbGl2ZSBjb21wdXRlZFN0eWxlIG9iamVjdC4gTGVhcm4gbW9yZSBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9BUEkvd2luZG93LmdldENvbXB1dGVkU3R5bGUgKi9cclxuXHRcdFx0XHRcdGNvbXB1dGVkU3R5bGU6IG51bGwsXHJcblx0XHRcdFx0XHQvKiBUd2VlbiBkYXRhIGlzIGNhY2hlZCBmb3IgZWFjaCBhbmltYXRpb24gb24gdGhlIGVsZW1lbnQgc28gdGhhdCBkYXRhIGNhbiBiZSBwYXNzZWQgYWNyb3NzIGNhbGxzIC0tXHJcblx0XHRcdFx0XHQgaW4gcGFydGljdWxhciwgZW5kIHZhbHVlcyBhcmUgdXNlZCBhcyBzdWJzZXF1ZW50IHN0YXJ0IHZhbHVlcyBpbiBjb25zZWN1dGl2ZSBWZWxvY2l0eSBjYWxscy4gKi9cclxuXHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lcjogbnVsbCxcclxuXHRcdFx0XHRcdC8qIFRoZSBmdWxsIHJvb3QgcHJvcGVydHkgdmFsdWVzIG9mIGVhY2ggQ1NTIGhvb2sgYmVpbmcgYW5pbWF0ZWQgb24gdGhpcyBlbGVtZW50IGFyZSBjYWNoZWQgc28gdGhhdDpcclxuXHRcdFx0XHRcdCAxKSBDb25jdXJyZW50bHktYW5pbWF0aW5nIGhvb2tzIHNoYXJpbmcgdGhlIHNhbWUgcm9vdCBjYW4gaGF2ZSB0aGVpciByb290IHZhbHVlcycgbWVyZ2VkIGludG8gb25lIHdoaWxlIHR3ZWVuaW5nLlxyXG5cdFx0XHRcdFx0IDIpIFBvc3QtaG9vay1pbmplY3Rpb24gcm9vdCB2YWx1ZXMgY2FuIGJlIHRyYW5zZmVycmVkIG92ZXIgdG8gY29uc2VjdXRpdmVseSBjaGFpbmVkIFZlbG9jaXR5IGNhbGxzIGFzIHN0YXJ0aW5nIHJvb3QgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWVDYWNoZToge30sXHJcblx0XHRcdFx0XHQvKiBBIGNhY2hlIGZvciB0cmFuc2Zvcm0gdXBkYXRlcywgd2hpY2ggbXVzdCBiZSBtYW51YWxseSBmbHVzaGVkIHZpYSBDU1MuZmx1c2hUcmFuc2Zvcm1DYWNoZSgpLiAqL1xyXG5cdFx0XHRcdFx0dHJhbnNmb3JtQ2FjaGU6IHt9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIEEgcGFyYWxsZWwgdG8galF1ZXJ5J3MgJC5jc3MoKSwgdXNlZCBmb3IgZ2V0dGluZy9zZXR0aW5nIFZlbG9jaXR5J3MgaG9va2VkIENTUyBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRob29rOiBudWxsLCAvKiBEZWZpbmVkIGJlbG93LiAqL1xyXG5cdFx0XHQvKiBWZWxvY2l0eS13aWRlIGFuaW1hdGlvbiB0aW1lIHJlbWFwcGluZyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi9cclxuXHRcdFx0bW9jazogZmFsc2UsXHJcblx0XHRcdHZlcnNpb246IHttYWpvcjogMSwgbWlub3I6IDUsIHBhdGNoOiAyfSxcclxuXHRcdFx0LyogU2V0IHRvIDEgb3IgMiAobW9zdCB2ZXJib3NlKSB0byBvdXRwdXQgZGVidWcgaW5mbyB0byBjb25zb2xlLiAqL1xyXG5cdFx0XHRkZWJ1ZzogZmFsc2UsXHJcblx0XHRcdC8qIFVzZSByQUYgaGlnaCByZXNvbHV0aW9uIHRpbWVzdGFtcCB3aGVuIGF2YWlsYWJsZSAqL1xyXG5cdFx0XHR0aW1lc3RhbXA6IHRydWUsXHJcblx0XHRcdC8qIFBhdXNlIGFsbCBhbmltYXRpb25zICovXHJcblx0XHRcdHBhdXNlQWxsOiBmdW5jdGlvbihxdWV1ZU5hbWUpIHtcclxuXHRcdFx0XHR2YXIgY3VycmVudFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xyXG5cclxuXHRcdFx0XHQkLmVhY2goVmVsb2NpdHkuU3RhdGUuY2FsbHMsIGZ1bmN0aW9uKGksIGFjdGl2ZUNhbGwpIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoYWN0aXZlQ2FsbCkge1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgd2UgaGF2ZSBhIHF1ZXVlTmFtZSBhbmQgdGhpcyBjYWxsIGlzIG5vdCBvbiB0aGF0IHF1ZXVlLCBza2lwICovXHJcblx0XHRcdFx0XHRcdGlmIChxdWV1ZU5hbWUgIT09IHVuZGVmaW5lZCAmJiAoKGFjdGl2ZUNhbGxbMl0ucXVldWUgIT09IHF1ZXVlTmFtZSkgfHwgKGFjdGl2ZUNhbGxbMl0ucXVldWUgPT09IGZhbHNlKSkpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogU2V0IGNhbGwgdG8gcGF1c2VkICovXHJcblx0XHRcdFx0XHRcdGFjdGl2ZUNhbGxbNV0gPSB7XHJcblx0XHRcdFx0XHRcdFx0cmVzdW1lOiBmYWxzZVxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHQvKiBQYXVzZSB0aW1lcnMgb24gYW55IGN1cnJlbnRseSBkZWxheWVkIGNhbGxzICovXHJcblx0XHRcdFx0JC5lYWNoKFZlbG9jaXR5LlN0YXRlLmRlbGF5ZWRFbGVtZW50cywgZnVuY3Rpb24oaywgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0aWYgKCFlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHBhdXNlRGVsYXlPbkVsZW1lbnQoZWxlbWVudCwgY3VycmVudFRpbWUpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKiBSZXN1bWUgYWxsIGFuaW1hdGlvbnMgKi9cclxuXHRcdFx0cmVzdW1lQWxsOiBmdW5jdGlvbihxdWV1ZU5hbWUpIHtcclxuXHRcdFx0XHR2YXIgY3VycmVudFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xyXG5cclxuXHRcdFx0XHQkLmVhY2goVmVsb2NpdHkuU3RhdGUuY2FsbHMsIGZ1bmN0aW9uKGksIGFjdGl2ZUNhbGwpIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoYWN0aXZlQ2FsbCkge1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgd2UgaGF2ZSBhIHF1ZXVlTmFtZSBhbmQgdGhpcyBjYWxsIGlzIG5vdCBvbiB0aGF0IHF1ZXVlLCBza2lwICovXHJcblx0XHRcdFx0XHRcdGlmIChxdWV1ZU5hbWUgIT09IHVuZGVmaW5lZCAmJiAoKGFjdGl2ZUNhbGxbMl0ucXVldWUgIT09IHF1ZXVlTmFtZSkgfHwgKGFjdGl2ZUNhbGxbMl0ucXVldWUgPT09IGZhbHNlKSkpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogU2V0IGNhbGwgdG8gcmVzdW1lZCBpZiBpdCB3YXMgcGF1c2VkICovXHJcblx0XHRcdFx0XHRcdGlmIChhY3RpdmVDYWxsWzVdKSB7XHJcblx0XHRcdFx0XHRcdFx0YWN0aXZlQ2FsbFs1XS5yZXN1bWUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0LyogUmVzdW1lIHRpbWVycyBvbiBhbnkgY3VycmVudGx5IGRlbGF5ZWQgY2FsbHMgKi9cclxuXHRcdFx0XHQkLmVhY2goVmVsb2NpdHkuU3RhdGUuZGVsYXllZEVsZW1lbnRzLCBmdW5jdGlvbihrLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRpZiAoIWVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzdW1lRGVsYXlPbkVsZW1lbnQoZWxlbWVudCwgY3VycmVudFRpbWUpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8qIFJldHJpZXZlIHRoZSBhcHByb3ByaWF0ZSBzY3JvbGwgYW5jaG9yIGFuZCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgYnJvd3NlcjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy5zY3JvbGxZICovXHJcblx0XHRpZiAod2luZG93LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0VmVsb2NpdHkuU3RhdGUuc2Nyb2xsQW5jaG9yID0gd2luZG93O1xyXG5cdFx0XHRWZWxvY2l0eS5TdGF0ZS5zY3JvbGxQcm9wZXJ0eUxlZnQgPSBcInBhZ2VYT2Zmc2V0XCI7XHJcblx0XHRcdFZlbG9jaXR5LlN0YXRlLnNjcm9sbFByb3BlcnR5VG9wID0gXCJwYWdlWU9mZnNldFwiO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0VmVsb2NpdHkuU3RhdGUuc2Nyb2xsQW5jaG9yID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5O1xyXG5cdFx0XHRWZWxvY2l0eS5TdGF0ZS5zY3JvbGxQcm9wZXJ0eUxlZnQgPSBcInNjcm9sbExlZnRcIjtcclxuXHRcdFx0VmVsb2NpdHkuU3RhdGUuc2Nyb2xsUHJvcGVydHlUb3AgPSBcInNjcm9sbFRvcFwiO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNob3J0aGFuZCBhbGlhcyBmb3IgalF1ZXJ5J3MgJC5kYXRhKCkgdXRpbGl0eS4gKi9cclxuXHRcdGZ1bmN0aW9uIERhdGEoZWxlbWVudCkge1xyXG5cdFx0XHQvKiBIYXJkY29kZSBhIHJlZmVyZW5jZSB0byB0aGUgcGx1Z2luIG5hbWUuICovXHJcblx0XHRcdHZhciByZXNwb25zZSA9ICQuZGF0YShlbGVtZW50LCBcInZlbG9jaXR5XCIpO1xyXG5cclxuXHRcdFx0LyogalF1ZXJ5IDw9MS40LjIgcmV0dXJucyBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkIHdoZW4gbm8gbWF0Y2ggaXMgZm91bmQuIFdlIG5vcm1hbGl6ZSB0aGlzIGJlaGF2aW9yLiAqL1xyXG5cdFx0XHRyZXR1cm4gcmVzcG9uc2UgPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXNwb25zZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKioqKioqKioqKioqKipcclxuXHRcdCBEZWxheSBUaW1lclxyXG5cdFx0ICoqKioqKioqKioqKioqL1xyXG5cclxuXHRcdGZ1bmN0aW9uIHBhdXNlRGVsYXlPbkVsZW1lbnQoZWxlbWVudCwgY3VycmVudFRpbWUpIHtcclxuXHRcdFx0LyogQ2hlY2sgZm9yIGFueSBkZWxheSB0aW1lcnMsIGFuZCBwYXVzZSB0aGUgc2V0IHRpbWVvdXRzICh3aGlsZSBwcmVzZXJ2aW5nIHRpbWUgZGF0YSlcclxuXHRcdFx0IHRvIGJlIHJlc3VtZWQgd2hlbiB0aGUgXCJyZXN1bWVcIiBjb21tYW5kIGlzIGlzc3VlZCAqL1xyXG5cdFx0XHR2YXIgZGF0YSA9IERhdGEoZWxlbWVudCk7XHJcblx0XHRcdGlmIChkYXRhICYmIGRhdGEuZGVsYXlUaW1lciAmJiAhZGF0YS5kZWxheVBhdXNlZCkge1xyXG5cdFx0XHRcdGRhdGEuZGVsYXlSZW1haW5pbmcgPSBkYXRhLmRlbGF5IC0gY3VycmVudFRpbWUgKyBkYXRhLmRlbGF5QmVnaW47XHJcblx0XHRcdFx0ZGF0YS5kZWxheVBhdXNlZCA9IHRydWU7XHJcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KGRhdGEuZGVsYXlUaW1lci5zZXRUaW1lb3V0KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHJlc3VtZURlbGF5T25FbGVtZW50KGVsZW1lbnQsIGN1cnJlbnRUaW1lKSB7XHJcblx0XHRcdC8qIENoZWNrIGZvciBhbnkgcGF1c2VkIHRpbWVycyBhbmQgcmVzdW1lICovXHJcblx0XHRcdHZhciBkYXRhID0gRGF0YShlbGVtZW50KTtcclxuXHRcdFx0aWYgKGRhdGEgJiYgZGF0YS5kZWxheVRpbWVyICYmIGRhdGEuZGVsYXlQYXVzZWQpIHtcclxuXHRcdFx0XHQvKiBJZiB0aGUgZWxlbWVudCB3YXMgbWlkLWRlbGF5LCByZSBpbml0aWF0ZSB0aGUgdGltZW91dCB3aXRoIHRoZSByZW1haW5pbmcgZGVsYXkgKi9cclxuXHRcdFx0XHRkYXRhLmRlbGF5UGF1c2VkID0gZmFsc2U7XHJcblx0XHRcdFx0ZGF0YS5kZWxheVRpbWVyLnNldFRpbWVvdXQgPSBzZXRUaW1lb3V0KGRhdGEuZGVsYXlUaW1lci5uZXh0LCBkYXRhLmRlbGF5UmVtYWluaW5nKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqXHJcblx0XHQgRWFzaW5nXHJcblx0XHQgKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0LyogU3RlcCBlYXNpbmcgZ2VuZXJhdG9yLiAqL1xyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVTdGVwKHN0ZXBzKSB7XHJcblx0XHRcdHJldHVybiBmdW5jdGlvbihwKSB7XHJcblx0XHRcdFx0cmV0dXJuIE1hdGgucm91bmQocCAqIHN0ZXBzKSAqICgxIC8gc3RlcHMpO1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEJlemllciBjdXJ2ZSBmdW5jdGlvbiBnZW5lcmF0b3IuIENvcHlyaWdodCBHYWV0YW4gUmVuYXVkZWF1LiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVCZXppZXIobVgxLCBtWTEsIG1YMiwgbVkyKSB7XHJcblx0XHRcdHZhciBORVdUT05fSVRFUkFUSU9OUyA9IDQsXHJcblx0XHRcdFx0XHRORVdUT05fTUlOX1NMT1BFID0gMC4wMDEsXHJcblx0XHRcdFx0XHRTVUJESVZJU0lPTl9QUkVDSVNJT04gPSAwLjAwMDAwMDEsXHJcblx0XHRcdFx0XHRTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyA9IDEwLFxyXG5cdFx0XHRcdFx0a1NwbGluZVRhYmxlU2l6ZSA9IDExLFxyXG5cdFx0XHRcdFx0a1NhbXBsZVN0ZXBTaXplID0gMS4wIC8gKGtTcGxpbmVUYWJsZVNpemUgLSAxLjApLFxyXG5cdFx0XHRcdFx0ZmxvYXQzMkFycmF5U3VwcG9ydGVkID0gXCJGbG9hdDMyQXJyYXlcIiBpbiB3aW5kb3c7XHJcblxyXG5cdFx0XHQvKiBNdXN0IGNvbnRhaW4gZm91ciBhcmd1bWVudHMuICovXHJcblx0XHRcdGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSA0KSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBBcmd1bWVudHMgbXVzdCBiZSBudW1iZXJzLiAqL1xyXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkge1xyXG5cdFx0XHRcdGlmICh0eXBlb2YgYXJndW1lbnRzW2ldICE9PSBcIm51bWJlclwiIHx8IGlzTmFOKGFyZ3VtZW50c1tpXSkgfHwgIWlzRmluaXRlKGFyZ3VtZW50c1tpXSkpIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFggdmFsdWVzIG11c3QgYmUgaW4gdGhlIFswLCAxXSByYW5nZS4gKi9cclxuXHRcdFx0bVgxID0gTWF0aC5taW4obVgxLCAxKTtcclxuXHRcdFx0bVgyID0gTWF0aC5taW4obVgyLCAxKTtcclxuXHRcdFx0bVgxID0gTWF0aC5tYXgobVgxLCAwKTtcclxuXHRcdFx0bVgyID0gTWF0aC5tYXgobVgyLCAwKTtcclxuXHJcblx0XHRcdHZhciBtU2FtcGxlVmFsdWVzID0gZmxvYXQzMkFycmF5U3VwcG9ydGVkID8gbmV3IEZsb2F0MzJBcnJheShrU3BsaW5lVGFibGVTaXplKSA6IG5ldyBBcnJheShrU3BsaW5lVGFibGVTaXplKTtcclxuXHJcblx0XHRcdGZ1bmN0aW9uIEEoYUExLCBhQTIpIHtcclxuXHRcdFx0XHRyZXR1cm4gMS4wIC0gMy4wICogYUEyICsgMy4wICogYUExO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZ1bmN0aW9uIEIoYUExLCBhQTIpIHtcclxuXHRcdFx0XHRyZXR1cm4gMy4wICogYUEyIC0gNi4wICogYUExO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZ1bmN0aW9uIEMoYUExKSB7XHJcblx0XHRcdFx0cmV0dXJuIDMuMCAqIGFBMTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gY2FsY0JlemllcihhVCwgYUExLCBhQTIpIHtcclxuXHRcdFx0XHRyZXR1cm4gKChBKGFBMSwgYUEyKSAqIGFUICsgQihhQTEsIGFBMikpICogYVQgKyBDKGFBMSkpICogYVQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGdldFNsb3BlKGFULCBhQTEsIGFBMikge1xyXG5cdFx0XHRcdHJldHVybiAzLjAgKiBBKGFBMSwgYUEyKSAqIGFUICogYVQgKyAyLjAgKiBCKGFBMSwgYUEyKSAqIGFUICsgQyhhQTEpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBuZXd0b25SYXBoc29uSXRlcmF0ZShhWCwgYUd1ZXNzVCkge1xyXG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgTkVXVE9OX0lURVJBVElPTlM7ICsraSkge1xyXG5cdFx0XHRcdFx0dmFyIGN1cnJlbnRTbG9wZSA9IGdldFNsb3BlKGFHdWVzc1QsIG1YMSwgbVgyKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoY3VycmVudFNsb3BlID09PSAwLjApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGFHdWVzc1Q7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dmFyIGN1cnJlbnRYID0gY2FsY0JlemllcihhR3Vlc3NULCBtWDEsIG1YMikgLSBhWDtcclxuXHRcdFx0XHRcdGFHdWVzc1QgLT0gY3VycmVudFggLyBjdXJyZW50U2xvcGU7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gYUd1ZXNzVDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gY2FsY1NhbXBsZVZhbHVlcygpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGtTcGxpbmVUYWJsZVNpemU7ICsraSkge1xyXG5cdFx0XHRcdFx0bVNhbXBsZVZhbHVlc1tpXSA9IGNhbGNCZXppZXIoaSAqIGtTYW1wbGVTdGVwU2l6ZSwgbVgxLCBtWDIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYmluYXJ5U3ViZGl2aWRlKGFYLCBhQSwgYUIpIHtcclxuXHRcdFx0XHR2YXIgY3VycmVudFgsIGN1cnJlbnRULCBpID0gMDtcclxuXHJcblx0XHRcdFx0ZG8ge1xyXG5cdFx0XHRcdFx0Y3VycmVudFQgPSBhQSArIChhQiAtIGFBKSAvIDIuMDtcclxuXHRcdFx0XHRcdGN1cnJlbnRYID0gY2FsY0JlemllcihjdXJyZW50VCwgbVgxLCBtWDIpIC0gYVg7XHJcblx0XHRcdFx0XHRpZiAoY3VycmVudFggPiAwLjApIHtcclxuXHRcdFx0XHRcdFx0YUIgPSBjdXJyZW50VDtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGFBID0gY3VycmVudFQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSB3aGlsZSAoTWF0aC5hYnMoY3VycmVudFgpID4gU1VCRElWSVNJT05fUFJFQ0lTSU9OICYmICsraSA8IFNVQkRJVklTSU9OX01BWF9JVEVSQVRJT05TKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRUO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBnZXRURm9yWChhWCkge1xyXG5cdFx0XHRcdHZhciBpbnRlcnZhbFN0YXJ0ID0gMC4wLFxyXG5cdFx0XHRcdFx0XHRjdXJyZW50U2FtcGxlID0gMSxcclxuXHRcdFx0XHRcdFx0bGFzdFNhbXBsZSA9IGtTcGxpbmVUYWJsZVNpemUgLSAxO1xyXG5cclxuXHRcdFx0XHRmb3IgKDsgY3VycmVudFNhbXBsZSAhPT0gbGFzdFNhbXBsZSAmJiBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdIDw9IGFYOyArK2N1cnJlbnRTYW1wbGUpIHtcclxuXHRcdFx0XHRcdGludGVydmFsU3RhcnQgKz0ga1NhbXBsZVN0ZXBTaXplO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LS1jdXJyZW50U2FtcGxlO1xyXG5cclxuXHRcdFx0XHR2YXIgZGlzdCA9IChhWCAtIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pIC8gKG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZSArIDFdIC0gbVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSksXHJcblx0XHRcdFx0XHRcdGd1ZXNzRm9yVCA9IGludGVydmFsU3RhcnQgKyBkaXN0ICoga1NhbXBsZVN0ZXBTaXplLFxyXG5cdFx0XHRcdFx0XHRpbml0aWFsU2xvcGUgPSBnZXRTbG9wZShndWVzc0ZvclQsIG1YMSwgbVgyKTtcclxuXHJcblx0XHRcdFx0aWYgKGluaXRpYWxTbG9wZSA+PSBORVdUT05fTUlOX1NMT1BFKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGd1ZXNzRm9yVCk7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChpbml0aWFsU2xvcGUgPT09IDAuMCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGd1ZXNzRm9yVDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGJpbmFyeVN1YmRpdmlkZShhWCwgaW50ZXJ2YWxTdGFydCwgaW50ZXJ2YWxTdGFydCArIGtTYW1wbGVTdGVwU2l6ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgX3ByZWNvbXB1dGVkID0gZmFsc2U7XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xyXG5cdFx0XHRcdF9wcmVjb21wdXRlZCA9IHRydWU7XHJcblx0XHRcdFx0aWYgKG1YMSAhPT0gbVkxIHx8IG1YMiAhPT0gbVkyKSB7XHJcblx0XHRcdFx0XHRjYWxjU2FtcGxlVmFsdWVzKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgZiA9IGZ1bmN0aW9uKGFYKSB7XHJcblx0XHRcdFx0aWYgKCFfcHJlY29tcHV0ZWQpIHtcclxuXHRcdFx0XHRcdHByZWNvbXB1dGUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKG1YMSA9PT0gbVkxICYmIG1YMiA9PT0gbVkyKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gYVg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhWCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIDA7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhWCA9PT0gMSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIDE7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gY2FsY0JlemllcihnZXRURm9yWChhWCksIG1ZMSwgbVkyKTtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGYuZ2V0Q29udHJvbFBvaW50cyA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHJldHVybiBbe3g6IG1YMSwgeTogbVkxfSwge3g6IG1YMiwgeTogbVkyfV07XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHR2YXIgc3RyID0gXCJnZW5lcmF0ZUJlemllcihcIiArIFttWDEsIG1ZMSwgbVgyLCBtWTJdICsgXCIpXCI7XHJcblx0XHRcdGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gc3RyO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0cmV0dXJuIGY7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogUnVuZ2UtS3V0dGEgc3ByaW5nIHBoeXNpY3MgZnVuY3Rpb24gZ2VuZXJhdG9yLiBBZGFwdGVkIGZyb20gRnJhbWVyLmpzLCBjb3B5cmlnaHQgS29lbiBCb2suIE1JVCBMaWNlbnNlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlICovXHJcblx0XHQvKiBHaXZlbiBhIHRlbnNpb24sIGZyaWN0aW9uLCBhbmQgZHVyYXRpb24sIGEgc2ltdWxhdGlvbiBhdCA2MEZQUyB3aWxsIGZpcnN0IHJ1biB3aXRob3V0IGEgZGVmaW5lZCBkdXJhdGlvbiBpbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgcGF0aC4gQSBzZWNvbmQgcGFzc1xyXG5cdFx0IHRoZW4gYWRqdXN0cyB0aGUgdGltZSBkZWx0YSAtLSB1c2luZyB0aGUgcmVsYXRpb24gYmV0d2VlbiBhY3R1YWwgdGltZSBhbmQgZHVyYXRpb24gLS0gdG8gY2FsY3VsYXRlIHRoZSBwYXRoIGZvciB0aGUgZHVyYXRpb24tY29uc3RyYWluZWQgYW5pbWF0aW9uLiAqL1xyXG5cdFx0dmFyIGdlbmVyYXRlU3ByaW5nUks0ID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRmdW5jdGlvbiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSkge1xyXG5cdFx0XHRcdHJldHVybiAoLXN0YXRlLnRlbnNpb24gKiBzdGF0ZS54KSAtIChzdGF0ZS5mcmljdGlvbiAqIHN0YXRlLnYpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoaW5pdGlhbFN0YXRlLCBkdCwgZGVyaXZhdGl2ZSkge1xyXG5cdFx0XHRcdHZhciBzdGF0ZSA9IHtcclxuXHRcdFx0XHRcdHg6IGluaXRpYWxTdGF0ZS54ICsgZGVyaXZhdGl2ZS5keCAqIGR0LFxyXG5cdFx0XHRcdFx0djogaW5pdGlhbFN0YXRlLnYgKyBkZXJpdmF0aXZlLmR2ICogZHQsXHJcblx0XHRcdFx0XHR0ZW5zaW9uOiBpbml0aWFsU3RhdGUudGVuc2lvbixcclxuXHRcdFx0XHRcdGZyaWN0aW9uOiBpbml0aWFsU3RhdGUuZnJpY3Rpb25cclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRyZXR1cm4ge2R4OiBzdGF0ZS52LCBkdjogc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpfTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gc3ByaW5nSW50ZWdyYXRlU3RhdGUoc3RhdGUsIGR0KSB7XHJcblx0XHRcdFx0dmFyIGEgPSB7XHJcblx0XHRcdFx0XHRkeDogc3RhdGUudixcclxuXHRcdFx0XHRcdGR2OiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSlcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRiID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYSksXHJcblx0XHRcdFx0XHRcdGMgPSBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoc3RhdGUsIGR0ICogMC41LCBiKSxcclxuXHRcdFx0XHRcdFx0ZCA9IHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShzdGF0ZSwgZHQsIGMpLFxyXG5cdFx0XHRcdFx0XHRkeGR0ID0gMS4wIC8gNi4wICogKGEuZHggKyAyLjAgKiAoYi5keCArIGMuZHgpICsgZC5keCksXHJcblx0XHRcdFx0XHRcdGR2ZHQgPSAxLjAgLyA2LjAgKiAoYS5kdiArIDIuMCAqIChiLmR2ICsgYy5kdikgKyBkLmR2KTtcclxuXHJcblx0XHRcdFx0c3RhdGUueCA9IHN0YXRlLnggKyBkeGR0ICogZHQ7XHJcblx0XHRcdFx0c3RhdGUudiA9IHN0YXRlLnYgKyBkdmR0ICogZHQ7XHJcblxyXG5cdFx0XHRcdHJldHVybiBzdGF0ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHNwcmluZ1JLNEZhY3RvcnkodGVuc2lvbiwgZnJpY3Rpb24sIGR1cmF0aW9uKSB7XHJcblxyXG5cdFx0XHRcdHZhciBpbml0U3RhdGUgPSB7XHJcblx0XHRcdFx0XHR4OiAtMSxcclxuXHRcdFx0XHRcdHY6IDAsXHJcblx0XHRcdFx0XHR0ZW5zaW9uOiBudWxsLFxyXG5cdFx0XHRcdFx0ZnJpY3Rpb246IG51bGxcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRwYXRoID0gWzBdLFxyXG5cdFx0XHRcdFx0XHR0aW1lX2xhcHNlZCA9IDAsXHJcblx0XHRcdFx0XHRcdHRvbGVyYW5jZSA9IDEgLyAxMDAwMCxcclxuXHRcdFx0XHRcdFx0RFQgPSAxNiAvIDEwMDAsXHJcblx0XHRcdFx0XHRcdGhhdmVfZHVyYXRpb24sIGR0LCBsYXN0X3N0YXRlO1xyXG5cclxuXHRcdFx0XHR0ZW5zaW9uID0gcGFyc2VGbG9hdCh0ZW5zaW9uKSB8fCA1MDA7XHJcblx0XHRcdFx0ZnJpY3Rpb24gPSBwYXJzZUZsb2F0KGZyaWN0aW9uKSB8fCAyMDtcclxuXHRcdFx0XHRkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IG51bGw7XHJcblxyXG5cdFx0XHRcdGluaXRTdGF0ZS50ZW5zaW9uID0gdGVuc2lvbjtcclxuXHRcdFx0XHRpbml0U3RhdGUuZnJpY3Rpb24gPSBmcmljdGlvbjtcclxuXHJcblx0XHRcdFx0aGF2ZV9kdXJhdGlvbiA9IGR1cmF0aW9uICE9PSBudWxsO1xyXG5cclxuXHRcdFx0XHQvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCB0aW1lIGl0IHRha2VzIGZvciB0aGlzIGFuaW1hdGlvbiB0byBjb21wbGV0ZSB3aXRoIHRoZSBwcm92aWRlZCBjb25kaXRpb25zLiAqL1xyXG5cdFx0XHRcdGlmIChoYXZlX2R1cmF0aW9uKSB7XHJcblx0XHRcdFx0XHQvKiBSdW4gdGhlIHNpbXVsYXRpb24gd2l0aG91dCBhIGR1cmF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0dGltZV9sYXBzZWQgPSBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uKTtcclxuXHRcdFx0XHRcdC8qIENvbXB1dGUgdGhlIGFkanVzdGVkIHRpbWUgZGVsdGEuICovXHJcblx0XHRcdFx0XHRkdCA9IHRpbWVfbGFwc2VkIC8gZHVyYXRpb24gKiBEVDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZHQgPSBEVDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHdoaWxlICh0cnVlKSB7XHJcblx0XHRcdFx0XHQvKiBOZXh0L3N0ZXAgZnVuY3Rpb24gLiovXHJcblx0XHRcdFx0XHRsYXN0X3N0YXRlID0gc3ByaW5nSW50ZWdyYXRlU3RhdGUobGFzdF9zdGF0ZSB8fCBpbml0U3RhdGUsIGR0KTtcclxuXHRcdFx0XHRcdC8qIFN0b3JlIHRoZSBwb3NpdGlvbi4gKi9cclxuXHRcdFx0XHRcdHBhdGgucHVzaCgxICsgbGFzdF9zdGF0ZS54KTtcclxuXHRcdFx0XHRcdHRpbWVfbGFwc2VkICs9IDE2O1xyXG5cdFx0XHRcdFx0LyogSWYgdGhlIGNoYW5nZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCwgYnJlYWsuICovXHJcblx0XHRcdFx0XHRpZiAoIShNYXRoLmFicyhsYXN0X3N0YXRlLngpID4gdG9sZXJhbmNlICYmIE1hdGguYWJzKGxhc3Rfc3RhdGUudikgPiB0b2xlcmFuY2UpKSB7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogSWYgZHVyYXRpb24gaXMgbm90IGRlZmluZWQsIHJldHVybiB0aGUgYWN0dWFsIHRpbWUgcmVxdWlyZWQgZm9yIGNvbXBsZXRpbmcgdGhpcyBhbmltYXRpb24uIE90aGVyd2lzZSwgcmV0dXJuIGEgY2xvc3VyZSB0aGF0IGhvbGRzIHRoZVxyXG5cdFx0XHRcdCBjb21wdXRlZCBwYXRoIGFuZCByZXR1cm5zIGEgc25hcHNob3Qgb2YgdGhlIHBvc2l0aW9uIGFjY29yZGluZyB0byBhIGdpdmVuIHBlcmNlbnRDb21wbGV0ZS4gKi9cclxuXHRcdFx0XHRyZXR1cm4gIWhhdmVfZHVyYXRpb24gPyB0aW1lX2xhcHNlZCA6IGZ1bmN0aW9uKHBlcmNlbnRDb21wbGV0ZSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHBhdGhbIChwZXJjZW50Q29tcGxldGUgKiAocGF0aC5sZW5ndGggLSAxKSkgfCAwIF07XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fTtcclxuXHRcdH0oKSk7XHJcblxyXG5cdFx0LyogalF1ZXJ5IGVhc2luZ3MuICovXHJcblx0XHRWZWxvY2l0eS5FYXNpbmdzID0ge1xyXG5cdFx0XHRsaW5lYXI6IGZ1bmN0aW9uKHApIHtcclxuXHRcdFx0XHRyZXR1cm4gcDtcclxuXHRcdFx0fSxcclxuXHRcdFx0c3dpbmc6IGZ1bmN0aW9uKHApIHtcclxuXHRcdFx0XHRyZXR1cm4gMC41IC0gTWF0aC5jb3MocCAqIE1hdGguUEkpIC8gMjtcclxuXHRcdFx0fSxcclxuXHRcdFx0LyogQm9udXMgXCJzcHJpbmdcIiBlYXNpbmcsIHdoaWNoIGlzIGEgbGVzcyBleGFnZ2VyYXRlZCB2ZXJzaW9uIG9mIGVhc2VJbk91dEVsYXN0aWMuICovXHJcblx0XHRcdHNwcmluZzogZnVuY3Rpb24ocCkge1xyXG5cdFx0XHRcdHJldHVybiAxIC0gKE1hdGguY29zKHAgKiA0LjUgKiBNYXRoLlBJKSAqIE1hdGguZXhwKC1wICogNikpO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8qIENTUzMgYW5kIFJvYmVydCBQZW5uZXIgZWFzaW5ncy4gKi9cclxuXHRcdCQuZWFjaChcclxuXHRcdFx0XHRbXHJcblx0XHRcdFx0XHRbXCJlYXNlXCIsIFswLjI1LCAwLjEsIDAuMjUsIDEuMF1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZS1pblwiLCBbMC40MiwgMC4wLCAxLjAwLCAxLjBdXSxcclxuXHRcdFx0XHRcdFtcImVhc2Utb3V0XCIsIFswLjAwLCAwLjAsIDAuNTgsIDEuMF1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZS1pbi1vdXRcIiwgWzAuNDIsIDAuMCwgMC41OCwgMS4wXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5TaW5lXCIsIFswLjQ3LCAwLCAwLjc0NSwgMC43MTVdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VPdXRTaW5lXCIsIFswLjM5LCAwLjU3NSwgMC41NjUsIDFdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJbk91dFNpbmVcIiwgWzAuNDQ1LCAwLjA1LCAwLjU1LCAwLjk1XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5RdWFkXCIsIFswLjU1LCAwLjA4NSwgMC42OCwgMC41M11dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZU91dFF1YWRcIiwgWzAuMjUsIDAuNDYsIDAuNDUsIDAuOTRdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJbk91dFF1YWRcIiwgWzAuNDU1LCAwLjAzLCAwLjUxNSwgMC45NTVdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJbkN1YmljXCIsIFswLjU1LCAwLjA1NSwgMC42NzUsIDAuMTldXSxcclxuXHRcdFx0XHRcdFtcImVhc2VPdXRDdWJpY1wiLCBbMC4yMTUsIDAuNjEsIDAuMzU1LCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5PdXRDdWJpY1wiLCBbMC42NDUsIDAuMDQ1LCAwLjM1NSwgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluUXVhcnRcIiwgWzAuODk1LCAwLjAzLCAwLjY4NSwgMC4yMl1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZU91dFF1YXJ0XCIsIFswLjE2NSwgMC44NCwgMC40NCwgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluT3V0UXVhcnRcIiwgWzAuNzcsIDAsIDAuMTc1LCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5RdWludFwiLCBbMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlT3V0UXVpbnRcIiwgWzAuMjMsIDEsIDAuMzIsIDFdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJbk91dFF1aW50XCIsIFswLjg2LCAwLCAwLjA3LCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5FeHBvXCIsIFswLjk1LCAwLjA1LCAwLjc5NSwgMC4wMzVdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VPdXRFeHBvXCIsIFswLjE5LCAxLCAwLjIyLCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5PdXRFeHBvXCIsIFsxLCAwLCAwLCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5DaXJjXCIsIFswLjYsIDAuMDQsIDAuOTgsIDAuMzM1XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlT3V0Q2lyY1wiLCBbMC4wNzUsIDAuODIsIDAuMTY1LCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5PdXRDaXJjXCIsIFswLjc4NSwgMC4xMzUsIDAuMTUsIDAuODZdXVxyXG5cdFx0XHRcdF0sIGZ1bmN0aW9uKGksIGVhc2luZ0FycmF5KSB7XHJcblx0XHRcdFZlbG9jaXR5LkVhc2luZ3NbZWFzaW5nQXJyYXlbMF1dID0gZ2VuZXJhdGVCZXppZXIuYXBwbHkobnVsbCwgZWFzaW5nQXJyYXlbMV0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBlYXNpbmcgdHlwZSBnaXZlbiBhbiBlYXNpbmcgaW5wdXQuICovXHJcblx0XHRmdW5jdGlvbiBnZXRFYXNpbmcodmFsdWUsIGR1cmF0aW9uKSB7XHJcblx0XHRcdHZhciBlYXNpbmcgPSB2YWx1ZTtcclxuXHJcblx0XHRcdC8qIFRoZSBlYXNpbmcgb3B0aW9uIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcgdGhhdCByZWZlcmVuY2VzIGEgcHJlLXJlZ2lzdGVyZWQgZWFzaW5nLFxyXG5cdFx0XHQgb3IgaXQgY2FuIGJlIGEgdHdvLS9mb3VyLWl0ZW0gYXJyYXkgb2YgaW50ZWdlcnMgdG8gYmUgY29udmVydGVkIGludG8gYSBiZXppZXIvc3ByaW5nIGZ1bmN0aW9uLiAqL1xyXG5cdFx0XHRpZiAoVHlwZS5pc1N0cmluZyh2YWx1ZSkpIHtcclxuXHRcdFx0XHQvKiBFbnN1cmUgdGhhdCB0aGUgZWFzaW5nIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGpRdWVyeSdzIFZlbG9jaXR5LkVhc2luZ3Mgb2JqZWN0LiAqL1xyXG5cdFx0XHRcdGlmICghVmVsb2NpdHkuRWFzaW5nc1t2YWx1ZV0pIHtcclxuXHRcdFx0XHRcdGVhc2luZyA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIGlmIChUeXBlLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xyXG5cdFx0XHRcdGVhc2luZyA9IGdlbmVyYXRlU3RlcC5hcHBseShudWxsLCB2YWx1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDIpIHtcclxuXHRcdFx0XHQvKiBzcHJpbmdSSzQgbXVzdCBiZSBwYXNzZWQgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IElmIHRoZSBzcHJpbmdSSzQgYXJyYXkgY29udGFpbnMgbm9uLW51bWJlcnMsIGdlbmVyYXRlU3ByaW5nUks0KCkgcmV0dXJucyBhbiBlYXNpbmdcclxuXHRcdFx0XHQgZnVuY3Rpb24gZ2VuZXJhdGVkIHdpdGggZGVmYXVsdCB0ZW5zaW9uIGFuZCBmcmljdGlvbiB2YWx1ZXMuICovXHJcblx0XHRcdFx0ZWFzaW5nID0gZ2VuZXJhdGVTcHJpbmdSSzQuYXBwbHkobnVsbCwgdmFsdWUuY29uY2F0KFtkdXJhdGlvbl0pKTtcclxuXHRcdFx0fSBlbHNlIGlmIChUeXBlLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gNCkge1xyXG5cdFx0XHRcdC8qIE5vdGU6IElmIHRoZSBiZXppZXIgYXJyYXkgY29udGFpbnMgbm9uLW51bWJlcnMsIGdlbmVyYXRlQmV6aWVyKCkgcmV0dXJucyBmYWxzZS4gKi9cclxuXHRcdFx0XHRlYXNpbmcgPSBnZW5lcmF0ZUJlemllci5hcHBseShudWxsLCB2YWx1ZSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZWFzaW5nID0gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFJldmVydCB0byB0aGUgVmVsb2NpdHktd2lkZSBkZWZhdWx0IGVhc2luZyB0eXBlLCBvciBmYWxsIGJhY2sgdG8gXCJzd2luZ1wiICh3aGljaCBpcyBhbHNvIGpRdWVyeSdzIGRlZmF1bHQpXHJcblx0XHRcdCBpZiB0aGUgVmVsb2NpdHktd2lkZSBkZWZhdWx0IGhhcyBiZWVuIGluY29ycmVjdGx5IG1vZGlmaWVkLiAqL1xyXG5cdFx0XHRpZiAoZWFzaW5nID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdGlmIChWZWxvY2l0eS5FYXNpbmdzW1ZlbG9jaXR5LmRlZmF1bHRzLmVhc2luZ10pIHtcclxuXHRcdFx0XHRcdGVhc2luZyA9IFZlbG9jaXR5LmRlZmF1bHRzLmVhc2luZztcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZWFzaW5nID0gRUFTSU5HX0RFRkFVTFQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZWFzaW5nO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKioqKioqKioqKioqKioqKlxyXG5cdFx0IENTUyBTdGFja1xyXG5cdFx0ICoqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdC8qIFRoZSBDU1Mgb2JqZWN0IGlzIGEgaGlnaGx5IGNvbmRlbnNlZCBhbmQgcGVyZm9ybWFudCBDU1Mgc3RhY2sgdGhhdCBmdWxseSByZXBsYWNlcyBqUXVlcnkncy5cclxuXHRcdCBJdCBoYW5kbGVzIHRoZSB2YWxpZGF0aW9uLCBnZXR0aW5nLCBhbmQgc2V0dGluZyBvZiBib3RoIHN0YW5kYXJkIENTUyBwcm9wZXJ0aWVzIGFuZCBDU1MgcHJvcGVydHkgaG9va3MuICovXHJcblx0XHQvKiBOb3RlOiBBIFwiQ1NTXCIgc2hvcnRoYW5kIGlzIGFsaWFzZWQgc28gdGhhdCBvdXIgY29kZSBpcyBlYXNpZXIgdG8gcmVhZC4gKi9cclxuXHRcdHZhciBDU1MgPSBWZWxvY2l0eS5DU1MgPSB7XHJcblx0XHRcdC8qKioqKioqKioqKioqXHJcblx0XHRcdCBSZWdFeFxyXG5cdFx0XHQgKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFJlZ0V4OiB7XHJcblx0XHRcdFx0aXNIZXg6IC9eIyhbQS1mXFxkXXszfSl7MSwyfSQvaSxcclxuXHRcdFx0XHQvKiBVbndyYXAgYSBwcm9wZXJ0eSB2YWx1ZSdzIHN1cnJvdW5kaW5nIHRleHQsIGUuZy4gXCJyZ2JhKDQsIDMsIDIsIDEpXCIgPT0+IFwiNCwgMywgMiwgMVwiIGFuZCBcInJlY3QoNHB4IDNweCAycHggMXB4KVwiID09PiBcIjRweCAzcHggMnB4IDFweFwiLiAqL1xyXG5cdFx0XHRcdHZhbHVlVW53cmFwOiAvXltBLXpdK1xcKCguKilcXCkkL2ksXHJcblx0XHRcdFx0d3JhcHBlZFZhbHVlQWxyZWFkeUV4dHJhY3RlZDogL1swLTkuXSsgWzAtOS5dKyBbMC05Ll0rKCBbMC05Ll0rKT8vLFxyXG5cdFx0XHRcdC8qIFNwbGl0IGEgbXVsdGktdmFsdWUgcHJvcGVydHkgaW50byBhbiBhcnJheSBvZiBzdWJ2YWx1ZXMsIGUuZy4gXCJyZ2JhKDQsIDMsIDIsIDEpIDRweCAzcHggMnB4IDFweFwiID09PiBbIFwicmdiYSg0LCAzLCAyLCAxKVwiLCBcIjRweFwiLCBcIjNweFwiLCBcIjJweFwiLCBcIjFweFwiIF0uICovXHJcblx0XHRcdFx0dmFsdWVTcGxpdDogLyhbQS16XStcXCguK1xcKSl8KChbQS16MC05Iy0uXSs/KSg/PVxcc3wkKSkvaWdcclxuXHRcdFx0fSxcclxuXHRcdFx0LyoqKioqKioqKioqKlxyXG5cdFx0XHQgTGlzdHNcclxuXHRcdFx0ICoqKioqKioqKioqKi9cclxuXHJcblx0XHRcdExpc3RzOiB7XHJcblx0XHRcdFx0Y29sb3JzOiBbXCJmaWxsXCIsIFwic3Ryb2tlXCIsIFwic3RvcENvbG9yXCIsIFwiY29sb3JcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCBcImJvcmRlclRvcENvbG9yXCIsIFwiYm9yZGVyUmlnaHRDb2xvclwiLCBcImJvcmRlckJvdHRvbUNvbG9yXCIsIFwiYm9yZGVyTGVmdENvbG9yXCIsIFwib3V0bGluZUNvbG9yXCJdLFxyXG5cdFx0XHRcdHRyYW5zZm9ybXNCYXNlOiBbXCJ0cmFuc2xhdGVYXCIsIFwidHJhbnNsYXRlWVwiLCBcInNjYWxlXCIsIFwic2NhbGVYXCIsIFwic2NhbGVZXCIsIFwic2tld1hcIiwgXCJza2V3WVwiLCBcInJvdGF0ZVpcIl0sXHJcblx0XHRcdFx0dHJhbnNmb3JtczNEOiBbXCJ0cmFuc2Zvcm1QZXJzcGVjdGl2ZVwiLCBcInRyYW5zbGF0ZVpcIiwgXCJzY2FsZVpcIiwgXCJyb3RhdGVYXCIsIFwicm90YXRlWVwiXSxcclxuXHRcdFx0XHR1bml0czogW1xyXG5cdFx0XHRcdFx0XCIlXCIsIC8vIHJlbGF0aXZlXHJcblx0XHRcdFx0XHRcImVtXCIsIFwiZXhcIiwgXCJjaFwiLCBcInJlbVwiLCAvLyBmb250IHJlbGF0aXZlXHJcblx0XHRcdFx0XHRcInZ3XCIsIFwidmhcIiwgXCJ2bWluXCIsIFwidm1heFwiLCAvLyB2aWV3cG9ydCByZWxhdGl2ZVxyXG5cdFx0XHRcdFx0XCJjbVwiLCBcIm1tXCIsIFwiUVwiLCBcImluXCIsIFwicGNcIiwgXCJwdFwiLCBcInB4XCIsIC8vIGFic29sdXRlIGxlbmd0aHNcclxuXHRcdFx0XHRcdFwiZGVnXCIsIFwiZ3JhZFwiLCBcInJhZFwiLCBcInR1cm5cIiwgLy8gYW5nbGVzXHJcblx0XHRcdFx0XHRcInNcIiwgXCJtc1wiIC8vIHRpbWVcclxuXHRcdFx0XHRdLFxyXG5cdFx0XHRcdGNvbG9yTmFtZXM6IHtcclxuXHRcdFx0XHRcdFwiYWxpY2VibHVlXCI6IFwiMjQwLDI0OCwyNTVcIixcclxuXHRcdFx0XHRcdFwiYW50aXF1ZXdoaXRlXCI6IFwiMjUwLDIzNSwyMTVcIixcclxuXHRcdFx0XHRcdFwiYXF1YW1hcmluZVwiOiBcIjEyNywyNTUsMjEyXCIsXHJcblx0XHRcdFx0XHRcImFxdWFcIjogXCIwLDI1NSwyNTVcIixcclxuXHRcdFx0XHRcdFwiYXp1cmVcIjogXCIyNDAsMjU1LDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJiZWlnZVwiOiBcIjI0NSwyNDUsMjIwXCIsXHJcblx0XHRcdFx0XHRcImJpc3F1ZVwiOiBcIjI1NSwyMjgsMTk2XCIsXHJcblx0XHRcdFx0XHRcImJsYWNrXCI6IFwiMCwwLDBcIixcclxuXHRcdFx0XHRcdFwiYmxhbmNoZWRhbG1vbmRcIjogXCIyNTUsMjM1LDIwNVwiLFxyXG5cdFx0XHRcdFx0XCJibHVldmlvbGV0XCI6IFwiMTM4LDQzLDIyNlwiLFxyXG5cdFx0XHRcdFx0XCJibHVlXCI6IFwiMCwwLDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJicm93blwiOiBcIjE2NSw0Miw0MlwiLFxyXG5cdFx0XHRcdFx0XCJidXJseXdvb2RcIjogXCIyMjIsMTg0LDEzNVwiLFxyXG5cdFx0XHRcdFx0XCJjYWRldGJsdWVcIjogXCI5NSwxNTgsMTYwXCIsXHJcblx0XHRcdFx0XHRcImNoYXJ0cmV1c2VcIjogXCIxMjcsMjU1LDBcIixcclxuXHRcdFx0XHRcdFwiY2hvY29sYXRlXCI6IFwiMjEwLDEwNSwzMFwiLFxyXG5cdFx0XHRcdFx0XCJjb3JhbFwiOiBcIjI1NSwxMjcsODBcIixcclxuXHRcdFx0XHRcdFwiY29ybmZsb3dlcmJsdWVcIjogXCIxMDAsMTQ5LDIzN1wiLFxyXG5cdFx0XHRcdFx0XCJjb3Juc2lsa1wiOiBcIjI1NSwyNDgsMjIwXCIsXHJcblx0XHRcdFx0XHRcImNyaW1zb25cIjogXCIyMjAsMjAsNjBcIixcclxuXHRcdFx0XHRcdFwiY3lhblwiOiBcIjAsMjU1LDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrYmx1ZVwiOiBcIjAsMCwxMzlcIixcclxuXHRcdFx0XHRcdFwiZGFya2N5YW5cIjogXCIwLDEzOSwxMzlcIixcclxuXHRcdFx0XHRcdFwiZGFya2dvbGRlbnJvZFwiOiBcIjE4NCwxMzQsMTFcIixcclxuXHRcdFx0XHRcdFwiZGFya2dyYXlcIjogXCIxNjksMTY5LDE2OVwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrZ3JleVwiOiBcIjE2OSwxNjksMTY5XCIsXHJcblx0XHRcdFx0XHRcImRhcmtncmVlblwiOiBcIjAsMTAwLDBcIixcclxuXHRcdFx0XHRcdFwiZGFya2toYWtpXCI6IFwiMTg5LDE4MywxMDdcIixcclxuXHRcdFx0XHRcdFwiZGFya21hZ2VudGFcIjogXCIxMzksMCwxMzlcIixcclxuXHRcdFx0XHRcdFwiZGFya29saXZlZ3JlZW5cIjogXCI4NSwxMDcsNDdcIixcclxuXHRcdFx0XHRcdFwiZGFya29yYW5nZVwiOiBcIjI1NSwxNDAsMFwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrb3JjaGlkXCI6IFwiMTUzLDUwLDIwNFwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrcmVkXCI6IFwiMTM5LDAsMFwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrc2FsbW9uXCI6IFwiMjMzLDE1MCwxMjJcIixcclxuXHRcdFx0XHRcdFwiZGFya3NlYWdyZWVuXCI6IFwiMTQzLDE4OCwxNDNcIixcclxuXHRcdFx0XHRcdFwiZGFya3NsYXRlYmx1ZVwiOiBcIjcyLDYxLDEzOVwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrc2xhdGVncmF5XCI6IFwiNDcsNzksNzlcIixcclxuXHRcdFx0XHRcdFwiZGFya3R1cnF1b2lzZVwiOiBcIjAsMjA2LDIwOVwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrdmlvbGV0XCI6IFwiMTQ4LDAsMjExXCIsXHJcblx0XHRcdFx0XHRcImRlZXBwaW5rXCI6IFwiMjU1LDIwLDE0N1wiLFxyXG5cdFx0XHRcdFx0XCJkZWVwc2t5Ymx1ZVwiOiBcIjAsMTkxLDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJkaW1ncmF5XCI6IFwiMTA1LDEwNSwxMDVcIixcclxuXHRcdFx0XHRcdFwiZGltZ3JleVwiOiBcIjEwNSwxMDUsMTA1XCIsXHJcblx0XHRcdFx0XHRcImRvZGdlcmJsdWVcIjogXCIzMCwxNDQsMjU1XCIsXHJcblx0XHRcdFx0XHRcImZpcmVicmlja1wiOiBcIjE3OCwzNCwzNFwiLFxyXG5cdFx0XHRcdFx0XCJmbG9yYWx3aGl0ZVwiOiBcIjI1NSwyNTAsMjQwXCIsXHJcblx0XHRcdFx0XHRcImZvcmVzdGdyZWVuXCI6IFwiMzQsMTM5LDM0XCIsXHJcblx0XHRcdFx0XHRcImZ1Y2hzaWFcIjogXCIyNTUsMCwyNTVcIixcclxuXHRcdFx0XHRcdFwiZ2FpbnNib3JvXCI6IFwiMjIwLDIyMCwyMjBcIixcclxuXHRcdFx0XHRcdFwiZ2hvc3R3aGl0ZVwiOiBcIjI0OCwyNDgsMjU1XCIsXHJcblx0XHRcdFx0XHRcImdvbGRcIjogXCIyNTUsMjE1LDBcIixcclxuXHRcdFx0XHRcdFwiZ29sZGVucm9kXCI6IFwiMjE4LDE2NSwzMlwiLFxyXG5cdFx0XHRcdFx0XCJncmF5XCI6IFwiMTI4LDEyOCwxMjhcIixcclxuXHRcdFx0XHRcdFwiZ3JleVwiOiBcIjEyOCwxMjgsMTI4XCIsXHJcblx0XHRcdFx0XHRcImdyZWVueWVsbG93XCI6IFwiMTczLDI1NSw0N1wiLFxyXG5cdFx0XHRcdFx0XCJncmVlblwiOiBcIjAsMTI4LDBcIixcclxuXHRcdFx0XHRcdFwiaG9uZXlkZXdcIjogXCIyNDAsMjU1LDI0MFwiLFxyXG5cdFx0XHRcdFx0XCJob3RwaW5rXCI6IFwiMjU1LDEwNSwxODBcIixcclxuXHRcdFx0XHRcdFwiaW5kaWFucmVkXCI6IFwiMjA1LDkyLDkyXCIsXHJcblx0XHRcdFx0XHRcImluZGlnb1wiOiBcIjc1LDAsMTMwXCIsXHJcblx0XHRcdFx0XHRcIml2b3J5XCI6IFwiMjU1LDI1NSwyNDBcIixcclxuXHRcdFx0XHRcdFwia2hha2lcIjogXCIyNDAsMjMwLDE0MFwiLFxyXG5cdFx0XHRcdFx0XCJsYXZlbmRlcmJsdXNoXCI6IFwiMjU1LDI0MCwyNDVcIixcclxuXHRcdFx0XHRcdFwibGF2ZW5kZXJcIjogXCIyMzAsMjMwLDI1MFwiLFxyXG5cdFx0XHRcdFx0XCJsYXduZ3JlZW5cIjogXCIxMjQsMjUyLDBcIixcclxuXHRcdFx0XHRcdFwibGVtb25jaGlmZm9uXCI6IFwiMjU1LDI1MCwyMDVcIixcclxuXHRcdFx0XHRcdFwibGlnaHRibHVlXCI6IFwiMTczLDIxNiwyMzBcIixcclxuXHRcdFx0XHRcdFwibGlnaHRjb3JhbFwiOiBcIjI0MCwxMjgsMTI4XCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0Y3lhblwiOiBcIjIyNCwyNTUsMjU1XCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFwiMjUwLDI1MCwyMTBcIixcclxuXHRcdFx0XHRcdFwibGlnaHRncmF5XCI6IFwiMjExLDIxMSwyMTFcIixcclxuXHRcdFx0XHRcdFwibGlnaHRncmV5XCI6IFwiMjExLDIxMSwyMTFcIixcclxuXHRcdFx0XHRcdFwibGlnaHRncmVlblwiOiBcIjE0NCwyMzgsMTQ0XCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0cGlua1wiOiBcIjI1NSwxODIsMTkzXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0c2FsbW9uXCI6IFwiMjU1LDE2MCwxMjJcIixcclxuXHRcdFx0XHRcdFwibGlnaHRzZWFncmVlblwiOiBcIjMyLDE3OCwxNzBcIixcclxuXHRcdFx0XHRcdFwibGlnaHRza3libHVlXCI6IFwiMTM1LDIwNiwyNTBcIixcclxuXHRcdFx0XHRcdFwibGlnaHRzbGF0ZWdyYXlcIjogXCIxMTksMTM2LDE1M1wiLFxyXG5cdFx0XHRcdFx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBcIjE3NiwxOTYsMjIyXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0eWVsbG93XCI6IFwiMjU1LDI1NSwyMjRcIixcclxuXHRcdFx0XHRcdFwibGltZWdyZWVuXCI6IFwiNTAsMjA1LDUwXCIsXHJcblx0XHRcdFx0XHRcImxpbWVcIjogXCIwLDI1NSwwXCIsXHJcblx0XHRcdFx0XHRcImxpbmVuXCI6IFwiMjUwLDI0MCwyMzBcIixcclxuXHRcdFx0XHRcdFwibWFnZW50YVwiOiBcIjI1NSwwLDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJtYXJvb25cIjogXCIxMjgsMCwwXCIsXHJcblx0XHRcdFx0XHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogXCIxMDIsMjA1LDE3MFwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1ibHVlXCI6IFwiMCwwLDIwNVwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1vcmNoaWRcIjogXCIxODYsODUsMjExXCIsXHJcblx0XHRcdFx0XHRcIm1lZGl1bXB1cnBsZVwiOiBcIjE0NywxMTIsMjE5XCIsXHJcblx0XHRcdFx0XHRcIm1lZGl1bXNlYWdyZWVuXCI6IFwiNjAsMTc5LDExM1wiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogXCIxMjMsMTA0LDIzOFwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBcIjAsMjUwLDE1NFwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW10dXJxdW9pc2VcIjogXCI3MiwyMDksMjA0XCIsXHJcblx0XHRcdFx0XHRcIm1lZGl1bXZpb2xldHJlZFwiOiBcIjE5OSwyMSwxMzNcIixcclxuXHRcdFx0XHRcdFwibWlkbmlnaHRibHVlXCI6IFwiMjUsMjUsMTEyXCIsXHJcblx0XHRcdFx0XHRcIm1pbnRjcmVhbVwiOiBcIjI0NSwyNTUsMjUwXCIsXHJcblx0XHRcdFx0XHRcIm1pc3R5cm9zZVwiOiBcIjI1NSwyMjgsMjI1XCIsXHJcblx0XHRcdFx0XHRcIm1vY2Nhc2luXCI6IFwiMjU1LDIyOCwxODFcIixcclxuXHRcdFx0XHRcdFwibmF2YWpvd2hpdGVcIjogXCIyNTUsMjIyLDE3M1wiLFxyXG5cdFx0XHRcdFx0XCJuYXZ5XCI6IFwiMCwwLDEyOFwiLFxyXG5cdFx0XHRcdFx0XCJvbGRsYWNlXCI6IFwiMjUzLDI0NSwyMzBcIixcclxuXHRcdFx0XHRcdFwib2xpdmVkcmFiXCI6IFwiMTA3LDE0MiwzNVwiLFxyXG5cdFx0XHRcdFx0XCJvbGl2ZVwiOiBcIjEyOCwxMjgsMFwiLFxyXG5cdFx0XHRcdFx0XCJvcmFuZ2VyZWRcIjogXCIyNTUsNjksMFwiLFxyXG5cdFx0XHRcdFx0XCJvcmFuZ2VcIjogXCIyNTUsMTY1LDBcIixcclxuXHRcdFx0XHRcdFwib3JjaGlkXCI6IFwiMjE4LDExMiwyMTRcIixcclxuXHRcdFx0XHRcdFwicGFsZWdvbGRlbnJvZFwiOiBcIjIzOCwyMzIsMTcwXCIsXHJcblx0XHRcdFx0XHRcInBhbGVncmVlblwiOiBcIjE1MiwyNTEsMTUyXCIsXHJcblx0XHRcdFx0XHRcInBhbGV0dXJxdW9pc2VcIjogXCIxNzUsMjM4LDIzOFwiLFxyXG5cdFx0XHRcdFx0XCJwYWxldmlvbGV0cmVkXCI6IFwiMjE5LDExMiwxNDdcIixcclxuXHRcdFx0XHRcdFwicGFwYXlhd2hpcFwiOiBcIjI1NSwyMzksMjEzXCIsXHJcblx0XHRcdFx0XHRcInBlYWNocHVmZlwiOiBcIjI1NSwyMTgsMTg1XCIsXHJcblx0XHRcdFx0XHRcInBlcnVcIjogXCIyMDUsMTMzLDYzXCIsXHJcblx0XHRcdFx0XHRcInBpbmtcIjogXCIyNTUsMTkyLDIwM1wiLFxyXG5cdFx0XHRcdFx0XCJwbHVtXCI6IFwiMjIxLDE2MCwyMjFcIixcclxuXHRcdFx0XHRcdFwicG93ZGVyYmx1ZVwiOiBcIjE3NiwyMjQsMjMwXCIsXHJcblx0XHRcdFx0XHRcInB1cnBsZVwiOiBcIjEyOCwwLDEyOFwiLFxyXG5cdFx0XHRcdFx0XCJyZWRcIjogXCIyNTUsMCwwXCIsXHJcblx0XHRcdFx0XHRcInJvc3licm93blwiOiBcIjE4OCwxNDMsMTQzXCIsXHJcblx0XHRcdFx0XHRcInJveWFsYmx1ZVwiOiBcIjY1LDEwNSwyMjVcIixcclxuXHRcdFx0XHRcdFwic2FkZGxlYnJvd25cIjogXCIxMzksNjksMTlcIixcclxuXHRcdFx0XHRcdFwic2FsbW9uXCI6IFwiMjUwLDEyOCwxMTRcIixcclxuXHRcdFx0XHRcdFwic2FuZHlicm93blwiOiBcIjI0NCwxNjQsOTZcIixcclxuXHRcdFx0XHRcdFwic2VhZ3JlZW5cIjogXCI0NiwxMzksODdcIixcclxuXHRcdFx0XHRcdFwic2Vhc2hlbGxcIjogXCIyNTUsMjQ1LDIzOFwiLFxyXG5cdFx0XHRcdFx0XCJzaWVubmFcIjogXCIxNjAsODIsNDVcIixcclxuXHRcdFx0XHRcdFwic2lsdmVyXCI6IFwiMTkyLDE5MiwxOTJcIixcclxuXHRcdFx0XHRcdFwic2t5Ymx1ZVwiOiBcIjEzNSwyMDYsMjM1XCIsXHJcblx0XHRcdFx0XHRcInNsYXRlYmx1ZVwiOiBcIjEwNiw5MCwyMDVcIixcclxuXHRcdFx0XHRcdFwic2xhdGVncmF5XCI6IFwiMTEyLDEyOCwxNDRcIixcclxuXHRcdFx0XHRcdFwic25vd1wiOiBcIjI1NSwyNTAsMjUwXCIsXHJcblx0XHRcdFx0XHRcInNwcmluZ2dyZWVuXCI6IFwiMCwyNTUsMTI3XCIsXHJcblx0XHRcdFx0XHRcInN0ZWVsYmx1ZVwiOiBcIjcwLDEzMCwxODBcIixcclxuXHRcdFx0XHRcdFwidGFuXCI6IFwiMjEwLDE4MCwxNDBcIixcclxuXHRcdFx0XHRcdFwidGVhbFwiOiBcIjAsMTI4LDEyOFwiLFxyXG5cdFx0XHRcdFx0XCJ0aGlzdGxlXCI6IFwiMjE2LDE5MSwyMTZcIixcclxuXHRcdFx0XHRcdFwidG9tYXRvXCI6IFwiMjU1LDk5LDcxXCIsXHJcblx0XHRcdFx0XHRcInR1cnF1b2lzZVwiOiBcIjY0LDIyNCwyMDhcIixcclxuXHRcdFx0XHRcdFwidmlvbGV0XCI6IFwiMjM4LDEzMCwyMzhcIixcclxuXHRcdFx0XHRcdFwid2hlYXRcIjogXCIyNDUsMjIyLDE3OVwiLFxyXG5cdFx0XHRcdFx0XCJ3aGl0ZXNtb2tlXCI6IFwiMjQ1LDI0NSwyNDVcIixcclxuXHRcdFx0XHRcdFwid2hpdGVcIjogXCIyNTUsMjU1LDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJ5ZWxsb3dncmVlblwiOiBcIjE1NCwyMDUsNTBcIixcclxuXHRcdFx0XHRcdFwieWVsbG93XCI6IFwiMjU1LDI1NSwwXCJcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKipcclxuXHRcdFx0IEhvb2tzXHJcblx0XHRcdCAqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBIb29rcyBhbGxvdyBhIHN1YnByb3BlcnR5IChlLmcuIFwiYm94U2hhZG93Qmx1clwiKSBvZiBhIGNvbXBvdW5kLXZhbHVlIENTUyBwcm9wZXJ0eVxyXG5cdFx0XHQgKGUuZy4gXCJib3hTaGFkb3c6IFggWSBCbHVyIFNwcmVhZCBDb2xvclwiKSB0byBiZSBhbmltYXRlZCBhcyBpZiBpdCB3ZXJlIGEgZGlzY3JldGUgcHJvcGVydHkuICovXHJcblx0XHRcdC8qIE5vdGU6IEJleW9uZCBlbmFibGluZyBmaW5lLWdyYWluZWQgcHJvcGVydHkgYW5pbWF0aW9uLCBob29raW5nIGlzIG5lY2Vzc2FyeSBzaW5jZSBWZWxvY2l0eSBvbmx5XHJcblx0XHRcdCB0d2VlbnMgcHJvcGVydGllcyB3aXRoIHNpbmdsZSBudW1lcmljIHZhbHVlczsgdW5saWtlIENTUyB0cmFuc2l0aW9ucywgVmVsb2NpdHkgZG9lcyBub3QgaW50ZXJwb2xhdGUgY29tcG91bmQtdmFsdWVzLiAqL1xyXG5cdFx0XHRIb29rczoge1xyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBSZWdpc3RyYXRpb25cclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIFRlbXBsYXRlcyBhcmUgYSBjb25jaXNlIHdheSBvZiBpbmRpY2F0aW5nIHdoaWNoIHN1YnByb3BlcnRpZXMgbXVzdCBiZSBpbmRpdmlkdWFsbHkgcmVnaXN0ZXJlZCBmb3IgZWFjaCBjb21wb3VuZC12YWx1ZSBDU1MgcHJvcGVydHkuICovXHJcblx0XHRcdFx0LyogRWFjaCB0ZW1wbGF0ZSBjb25zaXN0cyBvZiB0aGUgY29tcG91bmQtdmFsdWUncyBiYXNlIG5hbWUsIGl0cyBjb25zdGl0dWVudCBzdWJwcm9wZXJ0eSBuYW1lcywgYW5kIHRob3NlIHN1YnByb3BlcnRpZXMnIGRlZmF1bHQgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdHRlbXBsYXRlczoge1xyXG5cdFx0XHRcdFx0XCJ0ZXh0U2hhZG93XCI6IFtcIkNvbG9yIFggWSBCbHVyXCIsIFwiYmxhY2sgMHB4IDBweCAwcHhcIl0sXHJcblx0XHRcdFx0XHRcImJveFNoYWRvd1wiOiBbXCJDb2xvciBYIFkgQmx1ciBTcHJlYWRcIiwgXCJibGFjayAwcHggMHB4IDBweCAwcHhcIl0sXHJcblx0XHRcdFx0XHRcImNsaXBcIjogW1wiVG9wIFJpZ2h0IEJvdHRvbSBMZWZ0XCIsIFwiMHB4IDBweCAwcHggMHB4XCJdLFxyXG5cdFx0XHRcdFx0XCJiYWNrZ3JvdW5kUG9zaXRpb25cIjogW1wiWCBZXCIsIFwiMCUgMCVcIl0sXHJcblx0XHRcdFx0XHRcInRyYW5zZm9ybU9yaWdpblwiOiBbXCJYIFkgWlwiLCBcIjUwJSA1MCUgMHB4XCJdLFxyXG5cdFx0XHRcdFx0XCJwZXJzcGVjdGl2ZU9yaWdpblwiOiBbXCJYIFlcIiwgXCI1MCUgNTAlXCJdXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBBIFwicmVnaXN0ZXJlZFwiIGhvb2sgaXMgb25lIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIGZyb20gaXRzIHRlbXBsYXRlIGZvcm0gaW50byBhIGxpdmUsXHJcblx0XHRcdFx0IHR3ZWVuYWJsZSBwcm9wZXJ0eS4gSXQgY29udGFpbnMgZGF0YSB0byBhc3NvY2lhdGUgaXQgd2l0aCBpdHMgcm9vdCBwcm9wZXJ0eS4gKi9cclxuXHRcdFx0XHRyZWdpc3RlcmVkOiB7XHJcblx0XHRcdFx0XHQvKiBOb3RlOiBBIHJlZ2lzdGVyZWQgaG9vayBsb29rcyBsaWtlIHRoaXMgPT0+IHRleHRTaGFkb3dCbHVyOiBbIFwidGV4dFNoYWRvd1wiLCAzIF0sXHJcblx0XHRcdFx0XHQgd2hpY2ggY29uc2lzdHMgb2YgdGhlIHN1YnByb3BlcnR5J3MgbmFtZSwgdGhlIGFzc29jaWF0ZWQgcm9vdCBwcm9wZXJ0eSdzIG5hbWUsXHJcblx0XHRcdFx0XHQgYW5kIHRoZSBzdWJwcm9wZXJ0eSdzIHBvc2l0aW9uIGluIHRoZSByb290J3MgdmFsdWUuICovXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBDb252ZXJ0IHRoZSB0ZW1wbGF0ZXMgaW50byBpbmRpdmlkdWFsIGhvb2tzIHRoZW4gYXBwZW5kIHRoZW0gdG8gdGhlIHJlZ2lzdGVyZWQgb2JqZWN0IGFib3ZlLiAqL1xyXG5cdFx0XHRcdHJlZ2lzdGVyOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdC8qIENvbG9yIGhvb2tzIHJlZ2lzdHJhdGlvbjogQ29sb3JzIGFyZSBkZWZhdWx0ZWQgdG8gd2hpdGUgLS0gYXMgb3Bwb3NlZCB0byBibGFjayAtLSBzaW5jZSBjb2xvcnMgdGhhdCBhcmVcclxuXHRcdFx0XHRcdCBjdXJyZW50bHkgc2V0IHRvIFwidHJhbnNwYXJlbnRcIiBkZWZhdWx0IHRvIHRoZWlyIHJlc3BlY3RpdmUgdGVtcGxhdGUgYmVsb3cgd2hlbiBjb2xvci1hbmltYXRlZCxcclxuXHRcdFx0XHRcdCBhbmQgd2hpdGUgaXMgdHlwaWNhbGx5IGEgY2xvc2VyIG1hdGNoIHRvIHRyYW5zcGFyZW50IHRoYW4gYmxhY2sgaXMuIEFuIGV4Y2VwdGlvbiBpcyBtYWRlIGZvciB0ZXh0IChcImNvbG9yXCIpLFxyXG5cdFx0XHRcdFx0IHdoaWNoIGlzIGFsbW9zdCBhbHdheXMgc2V0IGNsb3NlciB0byBibGFjayB0aGFuIHdoaXRlLiAqL1xyXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBDU1MuTGlzdHMuY29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdHZhciByZ2JDb21wb25lbnRzID0gKENTUy5MaXN0cy5jb2xvcnNbaV0gPT09IFwiY29sb3JcIikgPyBcIjAgMCAwIDFcIiA6IFwiMjU1IDI1NSAyNTUgMVwiO1xyXG5cdFx0XHRcdFx0XHRDU1MuSG9va3MudGVtcGxhdGVzW0NTUy5MaXN0cy5jb2xvcnNbaV1dID0gW1wiUmVkIEdyZWVuIEJsdWUgQWxwaGFcIiwgcmdiQ29tcG9uZW50c107XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dmFyIHJvb3RQcm9wZXJ0eSxcclxuXHRcdFx0XHRcdFx0XHRob29rVGVtcGxhdGUsXHJcblx0XHRcdFx0XHRcdFx0aG9va05hbWVzO1xyXG5cclxuXHRcdFx0XHRcdC8qIEluIElFLCBjb2xvciB2YWx1ZXMgaW5zaWRlIGNvbXBvdW5kLXZhbHVlIHByb3BlcnRpZXMgYXJlIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCB0aGUgdmFsdWUgaW5zdGVhZCBvZiBhdCB0aGUgYmVnaW5uaW5nLlxyXG5cdFx0XHRcdFx0IFRodXMsIHdlIHJlLWFycmFuZ2UgdGhlIHRlbXBsYXRlcyBhY2NvcmRpbmdseS4gKi9cclxuXHRcdFx0XHRcdGlmIChJRSkge1xyXG5cdFx0XHRcdFx0XHRmb3IgKHJvb3RQcm9wZXJ0eSBpbiBDU1MuSG9va3MudGVtcGxhdGVzKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFDU1MuSG9va3MudGVtcGxhdGVzLmhhc093blByb3BlcnR5KHJvb3RQcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRob29rVGVtcGxhdGUgPSBDU1MuSG9va3MudGVtcGxhdGVzW3Jvb3RQcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdFx0aG9va05hbWVzID0gaG9va1RlbXBsYXRlWzBdLnNwbGl0KFwiIFwiKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0dmFyIGRlZmF1bHRWYWx1ZXMgPSBob29rVGVtcGxhdGVbMV0ubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlU3BsaXQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoaG9va05hbWVzWzBdID09PSBcIkNvbG9yXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIFJlcG9zaXRpb24gYm90aCB0aGUgaG9vaydzIG5hbWUgYW5kIGl0cyBkZWZhdWx0IHZhbHVlIHRvIHRoZSBlbmQgb2YgdGhlaXIgcmVzcGVjdGl2ZSBzdHJpbmdzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aG9va05hbWVzLnB1c2goaG9va05hbWVzLnNoaWZ0KCkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlcy5wdXNoKGRlZmF1bHRWYWx1ZXMuc2hpZnQoKSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogUmVwbGFjZSB0aGUgZXhpc3RpbmcgdGVtcGxhdGUgZm9yIHRoZSBob29rJ3Mgcm9vdCBwcm9wZXJ0eS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdENTUy5Ib29rcy50ZW1wbGF0ZXNbcm9vdFByb3BlcnR5XSA9IFtob29rTmFtZXMuam9pbihcIiBcIiksIGRlZmF1bHRWYWx1ZXMuam9pbihcIiBcIildO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIEhvb2sgcmVnaXN0cmF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0Zm9yIChyb290UHJvcGVydHkgaW4gQ1NTLkhvb2tzLnRlbXBsYXRlcykge1xyXG5cdFx0XHRcdFx0XHRpZiAoIUNTUy5Ib29rcy50ZW1wbGF0ZXMuaGFzT3duUHJvcGVydHkocm9vdFByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGhvb2tUZW1wbGF0ZSA9IENTUy5Ib29rcy50ZW1wbGF0ZXNbcm9vdFByb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0aG9va05hbWVzID0gaG9va1RlbXBsYXRlWzBdLnNwbGl0KFwiIFwiKTtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAodmFyIGogaW4gaG9va05hbWVzKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFob29rTmFtZXMuaGFzT3duUHJvcGVydHkoaikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR2YXIgZnVsbEhvb2tOYW1lID0gcm9vdFByb3BlcnR5ICsgaG9va05hbWVzW2pdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRob29rUG9zaXRpb24gPSBqO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBGb3IgZWFjaCBob29rLCByZWdpc3RlciBpdHMgZnVsbCBuYW1lIChlLmcuIHRleHRTaGFkb3dCbHVyKSB3aXRoIGl0cyByb290IHByb3BlcnR5IChlLmcuIHRleHRTaGFkb3cpXHJcblx0XHRcdFx0XHRcdFx0IGFuZCB0aGUgaG9vaydzIHBvc2l0aW9uIGluIGl0cyB0ZW1wbGF0ZSdzIGRlZmF1bHQgdmFsdWUgc3RyaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRcdENTUy5Ib29rcy5yZWdpc3RlcmVkW2Z1bGxIb29rTmFtZV0gPSBbcm9vdFByb3BlcnR5LCBob29rUG9zaXRpb25dO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgSW5qZWN0aW9uIGFuZCBFeHRyYWN0aW9uXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHQvKiBMb29rIHVwIHRoZSByb290IHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9vayAoZS5nLiByZXR1cm4gXCJ0ZXh0U2hhZG93XCIgZm9yIFwidGV4dFNoYWRvd0JsdXJcIikuICovXHJcblx0XHRcdFx0LyogU2luY2UgYSBob29rIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgKHRoZSBicm93c2VyIHdvbid0IHJlY29nbml6ZSBpdCksIHN0eWxlIHVwZGF0aW5nIGZvciBob29rcyBpcyByb3V0ZWQgdGhyb3VnaCB0aGUgaG9vaydzIHJvb3QgcHJvcGVydHkuICovXHJcblx0XHRcdFx0Z2V0Um9vdDogZnVuY3Rpb24ocHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdHZhciBob29rRGF0YSA9IENTUy5Ib29rcy5yZWdpc3RlcmVkW3Byb3BlcnR5XTtcclxuXHJcblx0XHRcdFx0XHRpZiAoaG9va0RhdGEpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGhvb2tEYXRhWzBdO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlcmUgd2FzIG5vIGhvb2sgbWF0Y2gsIHJldHVybiB0aGUgcHJvcGVydHkgbmFtZSB1bnRvdWNoZWQuICovXHJcblx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGdldFVuaXQ6IGZ1bmN0aW9uKHN0ciwgc3RhcnQpIHtcclxuXHRcdFx0XHRcdHZhciB1bml0ID0gKHN0ci5zdWJzdHIoc3RhcnQgfHwgMCwgNSkubWF0Y2goL15bYS16JV0rLykgfHwgW10pWzBdIHx8IFwiXCI7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHVuaXQgJiYgX2luQXJyYXkoQ1NTLkxpc3RzLnVuaXRzLCB1bml0KSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5pdDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiBcIlwiO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Zml4Q29sb3JzOiBmdW5jdGlvbihzdHIpIHtcclxuXHRcdFx0XHRcdHJldHVybiBzdHIucmVwbGFjZSgvKHJnYmE/XFwoXFxzKik/KFxcYlthLXpdK1xcYikvZywgZnVuY3Rpb24oJDAsICQxLCAkMikge1xyXG5cdFx0XHRcdFx0XHRpZiAoQ1NTLkxpc3RzLmNvbG9yTmFtZXMuaGFzT3duUHJvcGVydHkoJDIpKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuICgkMSA/ICQxIDogXCJyZ2JhKFwiKSArIENTUy5MaXN0cy5jb2xvck5hbWVzWyQyXSArICgkMSA/IFwiXCIgOiBcIiwxKVwiKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJDEgKyAkMjtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogQ29udmVydCBhbnkgcm9vdFByb3BlcnR5VmFsdWUsIG51bGwgb3Igb3RoZXJ3aXNlLCBpbnRvIGEgc3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgaG9vayB2YWx1ZXMgc28gdGhhdFxyXG5cdFx0XHRcdCB0aGUgdGFyZ2V0ZWQgaG9vayBjYW4gYmUgaW5qZWN0ZWQgb3IgZXh0cmFjdGVkIGF0IGl0cyBzdGFuZGFyZCBwb3NpdGlvbi4gKi9cclxuXHRcdFx0XHRjbGVhblJvb3RQcm9wZXJ0eVZhbHVlOiBmdW5jdGlvbihyb290UHJvcGVydHksIHJvb3RQcm9wZXJ0eVZhbHVlKSB7XHJcblx0XHRcdFx0XHQvKiBJZiB0aGUgcm9vdFByb3BlcnR5VmFsdWUgaXMgd3JhcHBlZCB3aXRoIFwicmdiKClcIiwgXCJjbGlwKClcIiwgZXRjLiwgcmVtb3ZlIHRoZSB3cmFwcGluZyB0byBub3JtYWxpemUgdGhlIHZhbHVlIGJlZm9yZSBtYW5pcHVsYXRpb24uICovXHJcblx0XHRcdFx0XHRpZiAoQ1NTLlJlZ0V4LnZhbHVlVW53cmFwLnRlc3Qocm9vdFByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlID0gcm9vdFByb3BlcnR5VmFsdWUubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlVW53cmFwKVsxXTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBJZiByb290UHJvcGVydHlWYWx1ZSBpcyBhIENTUyBudWxsLXZhbHVlIChmcm9tIHdoaWNoIHRoZXJlJ3MgaW5oZXJlbnRseSBubyBob29rIHZhbHVlIHRvIGV4dHJhY3QpLFxyXG5cdFx0XHRcdFx0IGRlZmF1bHQgdG8gdGhlIHJvb3QncyBkZWZhdWx0IHZhbHVlIGFzIGRlZmluZWQgaW4gQ1NTLkhvb2tzLnRlbXBsYXRlcy4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IENTUyBudWxsLXZhbHVlcyBpbmNsdWRlIFwibm9uZVwiLCBcImF1dG9cIiwgYW5kIFwidHJhbnNwYXJlbnRcIi4gVGhleSBtdXN0IGJlIGNvbnZlcnRlZCBpbnRvIHRoZWlyXHJcblx0XHRcdFx0XHQgemVyby12YWx1ZXMgKGUuZy4gdGV4dFNoYWRvdzogXCJub25lXCIgPT0+IHRleHRTaGFkb3c6IFwiMHB4IDBweCAwcHggYmxhY2tcIikgZm9yIGhvb2sgbWFuaXB1bGF0aW9uIHRvIHByb2NlZWQuICovXHJcblx0XHRcdFx0XHRpZiAoQ1NTLlZhbHVlcy5pc0NTU051bGxWYWx1ZShyb290UHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuSG9va3MudGVtcGxhdGVzW3Jvb3RQcm9wZXJ0eV1bMV07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJvb3RQcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogRXh0cmFjdGVkIHRoZSBob29rJ3MgdmFsdWUgZnJvbSBpdHMgcm9vdCBwcm9wZXJ0eSdzIHZhbHVlLiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBzdGFydGluZyB2YWx1ZSBvZiBhbiBhbmltYXRpbmcgaG9vay4gKi9cclxuXHRcdFx0XHRleHRyYWN0VmFsdWU6IGZ1bmN0aW9uKGZ1bGxIb29rTmFtZSwgcm9vdFByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdHZhciBob29rRGF0YSA9IENTUy5Ib29rcy5yZWdpc3RlcmVkW2Z1bGxIb29rTmFtZV07XHJcblxyXG5cdFx0XHRcdFx0aWYgKGhvb2tEYXRhKSB7XHJcblx0XHRcdFx0XHRcdHZhciBob29rUm9vdCA9IGhvb2tEYXRhWzBdLFxyXG5cdFx0XHRcdFx0XHRcdFx0aG9va1Bvc2l0aW9uID0gaG9va0RhdGFbMV07XHJcblxyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IENTUy5Ib29rcy5jbGVhblJvb3RQcm9wZXJ0eVZhbHVlKGhvb2tSb290LCByb290UHJvcGVydHlWYWx1ZSk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTcGxpdCByb290UHJvcGVydHlWYWx1ZSBpbnRvIGl0cyBjb25zdGl0dWVudCBob29rIHZhbHVlcyB0aGVuIGdyYWIgdGhlIGRlc2lyZWQgaG9vayBhdCBpdHMgc3RhbmRhcmQgcG9zaXRpb24uICovXHJcblx0XHRcdFx0XHRcdHJldHVybiByb290UHJvcGVydHlWYWx1ZS50b1N0cmluZygpLm1hdGNoKENTUy5SZWdFeC52YWx1ZVNwbGl0KVtob29rUG9zaXRpb25dO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHByb3ZpZGVkIGZ1bGxIb29rTmFtZSBpc24ndCBhIHJlZ2lzdGVyZWQgaG9vaywgcmV0dXJuIHRoZSByb290UHJvcGVydHlWYWx1ZSB0aGF0IHdhcyBwYXNzZWQgaW4uICovXHJcblx0XHRcdFx0XHRcdHJldHVybiByb290UHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIEluamVjdCB0aGUgaG9vaydzIHZhbHVlIGludG8gaXRzIHJvb3QgcHJvcGVydHkncyB2YWx1ZS4gVGhpcyBpcyB1c2VkIHRvIHBpZWNlIGJhY2sgdG9nZXRoZXIgdGhlIHJvb3QgcHJvcGVydHlcclxuXHRcdFx0XHQgb25jZSBWZWxvY2l0eSBoYXMgdXBkYXRlZCBvbmUgb2YgaXRzIGluZGl2aWR1YWxseSBob29rZWQgdmFsdWVzIHRocm91Z2ggdHdlZW5pbmcuICovXHJcblx0XHRcdFx0aW5qZWN0VmFsdWU6IGZ1bmN0aW9uKGZ1bGxIb29rTmFtZSwgaG9va1ZhbHVlLCByb290UHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0dmFyIGhvb2tEYXRhID0gQ1NTLkhvb2tzLnJlZ2lzdGVyZWRbZnVsbEhvb2tOYW1lXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoaG9va0RhdGEpIHtcclxuXHRcdFx0XHRcdFx0dmFyIGhvb2tSb290ID0gaG9va0RhdGFbMF0sXHJcblx0XHRcdFx0XHRcdFx0XHRob29rUG9zaXRpb24gPSBob29rRGF0YVsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlUGFydHMsXHJcblx0XHRcdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZVVwZGF0ZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IENTUy5Ib29rcy5jbGVhblJvb3RQcm9wZXJ0eVZhbHVlKGhvb2tSb290LCByb290UHJvcGVydHlWYWx1ZSk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTcGxpdCByb290UHJvcGVydHlWYWx1ZSBpbnRvIGl0cyBpbmRpdmlkdWFsIGhvb2sgdmFsdWVzLCByZXBsYWNlIHRoZSB0YXJnZXRlZCB2YWx1ZSB3aXRoIGhvb2tWYWx1ZSxcclxuXHRcdFx0XHRcdFx0IHRoZW4gcmVjb25zdHJ1Y3QgdGhlIHJvb3RQcm9wZXJ0eVZhbHVlIHN0cmluZy4gKi9cclxuXHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWVQYXJ0cyA9IHJvb3RQcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlU3BsaXQpO1xyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZVBhcnRzW2hvb2tQb3NpdGlvbl0gPSBob29rVmFsdWU7XHJcblx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlVXBkYXRlZCA9IHJvb3RQcm9wZXJ0eVZhbHVlUGFydHMuam9pbihcIiBcIik7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdFByb3BlcnR5VmFsdWVVcGRhdGVkO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHByb3ZpZGVkIGZ1bGxIb29rTmFtZSBpc24ndCBhIHJlZ2lzdGVyZWQgaG9vaywgcmV0dXJuIHRoZSByb290UHJvcGVydHlWYWx1ZSB0aGF0IHdhcyBwYXNzZWQgaW4uICovXHJcblx0XHRcdFx0XHRcdHJldHVybiByb290UHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBOb3JtYWxpemF0aW9uc1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdC8qIE5vcm1hbGl6YXRpb25zIHN0YW5kYXJkaXplIENTUyBwcm9wZXJ0eSBtYW5pcHVsYXRpb24gYnkgcG9sbHlmaWxsaW5nIGJyb3dzZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIChlLmcuIG9wYWNpdHkpXHJcblx0XHRcdCBhbmQgcmVmb3JtYXR0aW5nIHNwZWNpYWwgcHJvcGVydGllcyAoZS5nLiBjbGlwLCByZ2JhKSB0byBsb29rIGxpa2Ugc3RhbmRhcmQgb25lcy4gKi9cclxuXHRcdFx0Tm9ybWFsaXphdGlvbnM6IHtcclxuXHRcdFx0XHQvKiBOb3JtYWxpemF0aW9ucyBhcmUgcGFzc2VkIGEgbm9ybWFsaXphdGlvbiB0YXJnZXQgKGVpdGhlciB0aGUgcHJvcGVydHkncyBuYW1lLCBpdHMgZXh0cmFjdGVkIHZhbHVlLCBvciBpdHMgaW5qZWN0ZWQgdmFsdWUpLFxyXG5cdFx0XHRcdCB0aGUgdGFyZ2V0ZWQgZWxlbWVudCAod2hpY2ggbWF5IG5lZWQgdG8gYmUgcXVlcmllZCksIGFuZCB0aGUgdGFyZ2V0ZWQgcHJvcGVydHkgdmFsdWUuICovXHJcblx0XHRcdFx0cmVnaXN0ZXJlZDoge1xyXG5cdFx0XHRcdFx0Y2xpcDogZnVuY3Rpb24odHlwZSwgZWxlbWVudCwgcHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRjYXNlIFwibmFtZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiY2xpcFwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ2xpcCBuZWVkcyB0byBiZSB1bndyYXBwZWQgYW5kIHN0cmlwcGVkIG9mIGl0cyBjb21tYXMgZHVyaW5nIGV4dHJhY3Rpb24uICovXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBleHRyYWN0ZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgVmVsb2NpdHkgYWxzbyBleHRyYWN0ZWQgdGhpcyB2YWx1ZSwgc2tpcCBleHRyYWN0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKENTUy5SZWdFeC53cmFwcGVkVmFsdWVBbHJlYWR5RXh0cmFjdGVkLnRlc3QocHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFjdGVkID0gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFJlbW92ZSB0aGUgXCJyZWN0KClcIiB3cmFwcGVyLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRleHRyYWN0ZWQgPSBwcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlVW53cmFwKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFN0cmlwIG9mZiBjb21tYXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGV4dHJhY3RlZCA9IGV4dHJhY3RlZCA/IGV4dHJhY3RlZFsxXS5yZXBsYWNlKC8sKFxccyspPy9nLCBcIiBcIikgOiBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBleHRyYWN0ZWQ7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBDbGlwIG5lZWRzIHRvIGJlIHJlLXdyYXBwZWQgZHVyaW5nIGluamVjdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRjYXNlIFwiaW5qZWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJyZWN0KFwiICsgcHJvcGVydHlWYWx1ZSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0Ymx1cjogZnVuY3Rpb24odHlwZSwgZWxlbWVudCwgcHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRjYXNlIFwibmFtZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFZlbG9jaXR5LlN0YXRlLmlzRmlyZWZveCA/IFwiZmlsdGVyXCIgOiBcIi13ZWJraXQtZmlsdGVyXCI7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBleHRyYWN0ZWQgPSBwYXJzZUZsb2F0KHByb3BlcnR5VmFsdWUpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIElmIGV4dHJhY3RlZCBpcyBOYU4sIG1lYW5pbmcgdGhlIHZhbHVlIGlzbid0IGFscmVhZHkgZXh0cmFjdGVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCEoZXh0cmFjdGVkIHx8IGV4dHJhY3RlZCA9PT0gMCkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGJsdXJDb21wb25lbnQgPSBwcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkubWF0Y2goL2JsdXJcXCgoWzAtOV0rW0Etel0rKVxcKS9pKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBmaWx0ZXIgc3RyaW5nIGhhZCBhIGJsdXIgY29tcG9uZW50LCByZXR1cm4ganVzdCB0aGUgYmx1ciB2YWx1ZSBhbmQgdW5pdCB0eXBlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYmx1ckNvbXBvbmVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV4dHJhY3RlZCA9IGJsdXJDb21wb25lbnRbMV07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgdGhlIGNvbXBvbmVudCBkb2Vzbid0IGV4aXN0LCBkZWZhdWx0IGJsdXIgdG8gMC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRleHRyYWN0ZWQgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGV4dHJhY3RlZDtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEJsdXIgbmVlZHMgdG8gYmUgcmUtd3JhcHBlZCBkdXJpbmcgaW5qZWN0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJpbmplY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEZvciB0aGUgYmx1ciBlZmZlY3QgdG8gYmUgZnVsbHkgZGUtYXBwbGllZCwgaXQgbmVlZHMgdG8gYmUgc2V0IHRvIFwibm9uZVwiIGluc3RlYWQgb2YgMC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmICghcGFyc2VGbG9hdChwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJub25lXCI7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJibHVyKFwiICsgcHJvcGVydHlWYWx1ZSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0LyogPD1JRTggZG8gbm90IHN1cHBvcnQgdGhlIHN0YW5kYXJkIG9wYWNpdHkgcHJvcGVydHkuIFRoZXkgdXNlIGZpbHRlcjphbHBoYShvcGFjaXR5PUlOVCkgaW5zdGVhZC4gKi9cclxuXHRcdFx0XHRcdG9wYWNpdHk6IGZ1bmN0aW9uKHR5cGUsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKElFIDw9IDgpIHtcclxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJuYW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcImZpbHRlclwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogPD1JRTggcmV0dXJuIGEgXCJmaWx0ZXJcIiB2YWx1ZSBvZiBcImFscGhhKG9wYWNpdHk9XFxkezEsM30pXCIuXHJcblx0XHRcdFx0XHRcdFx0XHRcdCBFeHRyYWN0IHRoZSB2YWx1ZSBhbmQgY29udmVydCBpdCB0byBhIGRlY2ltYWwgdmFsdWUgdG8gbWF0Y2ggdGhlIHN0YW5kYXJkIENTUyBvcGFjaXR5IHByb3BlcnR5J3MgZm9ybWF0dGluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGV4dHJhY3RlZCA9IHByb3BlcnR5VmFsdWUudG9TdHJpbmcoKS5tYXRjaCgvYWxwaGFcXChvcGFjaXR5PSguKilcXCkvaSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZXh0cmFjdGVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQ29udmVydCB0byBkZWNpbWFsIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSBleHRyYWN0ZWRbMV0gLyAxMDA7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogV2hlbiBleHRyYWN0aW5nIG9wYWNpdHksIGRlZmF1bHQgdG8gMSBzaW5jZSBhIG51bGwgdmFsdWUgbWVhbnMgb3BhY2l0eSBoYXNuJ3QgYmVlbiBzZXQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IDE7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImluamVjdFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBPcGFjaWZpZWQgZWxlbWVudHMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgdGhlaXIgem9vbSBwcm9wZXJ0eSBzZXQgdG8gYSBub24temVybyB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS56b29tID0gMTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFNldHRpbmcgdGhlIGZpbHRlciBwcm9wZXJ0eSBvbiBlbGVtZW50cyB3aXRoIGNlcnRhaW4gZm9udCBwcm9wZXJ0eSBjb21iaW5hdGlvbnMgY2FuIHJlc3VsdCBpbiBhXHJcblx0XHRcdFx0XHRcdFx0XHRcdCBoaWdobHkgdW5hcHBlYWxpbmcgdWx0cmEtYm9sZGluZyBlZmZlY3QuIFRoZXJlJ3Mgbm8gd2F5IHRvIHJlbWVkeSB0aGlzIHRocm91Z2hvdXQgYSB0d2VlbiwgYnV0IGRyb3BwaW5nIHRoZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgdmFsdWUgYWx0b2dldGhlciAod2hlbiBvcGFjaXR5IGhpdHMgMSkgYXQgbGVhc3RzIGVuc3VyZXMgdGhhdCB0aGUgZ2xpdGNoIGlzIGdvbmUgcG9zdC10d2VlbmluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlRmxvYXQocHJvcGVydHlWYWx1ZSkgPj0gMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEFzIHBlciB0aGUgZmlsdGVyIHByb3BlcnR5J3Mgc3BlYywgY29udmVydCB0aGUgZGVjaW1hbCB2YWx1ZSB0byBhIHdob2xlIG51bWJlciBhbmQgd3JhcCB0aGUgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiYWxwaGEob3BhY2l0eT1cIiArIHBhcnNlSW50KHBhcnNlRmxvYXQocHJvcGVydHlWYWx1ZSkgKiAxMDAsIDEwKSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdC8qIFdpdGggYWxsIG90aGVyIGJyb3dzZXJzLCBub3JtYWxpemF0aW9uIGlzIG5vdCByZXF1aXJlZDsgcmV0dXJuIHRoZSBzYW1lIHZhbHVlcyB0aGF0IHdlcmUgcGFzc2VkIGluLiAqL1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAodHlwZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIm5hbWVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwib3BhY2l0eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiaW5qZWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IEJhdGNoZWQgUmVnaXN0cmF0aW9uc1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogTm90ZTogQmF0Y2hlZCBub3JtYWxpemF0aW9ucyBleHRlbmQgdGhlIENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkIG9iamVjdC4gKi9cclxuXHRcdFx0XHRyZWdpc3RlcjogZnVuY3Rpb24oKSB7XHJcblxyXG5cdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgVHJhbnNmb3Jtc1xyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIFRyYW5zZm9ybXMgYXJlIHRoZSBzdWJwcm9wZXJ0aWVzIGNvbnRhaW5lZCBieSB0aGUgQ1NTIFwidHJhbnNmb3JtXCIgcHJvcGVydHkuIFRyYW5zZm9ybXMgbXVzdCB1bmRlcmdvIG5vcm1hbGl6YXRpb25cclxuXHRcdFx0XHRcdCBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlZmVyZW5jZWQgaW4gYSBwcm9wZXJ0aWVzIG1hcCBieSB0aGVpciBpbmRpdmlkdWFsIG5hbWVzLiAqL1xyXG5cdFx0XHRcdFx0LyogTm90ZTogV2hlbiB0cmFuc2Zvcm1zIGFyZSBcInNldFwiLCB0aGV5IGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byBhIHBlci1lbGVtZW50IHRyYW5zZm9ybUNhY2hlLiBXaGVuIGFsbCB0cmFuc2Zvcm1cclxuXHRcdFx0XHRcdCBzZXR0aW5nIGlzIGNvbXBsZXRlIGNvbXBsZXRlLCBDU1MuZmx1c2hUcmFuc2Zvcm1DYWNoZSgpIG11c3QgYmUgbWFudWFsbHkgY2FsbGVkIHRvIGZsdXNoIHRoZSB2YWx1ZXMgdG8gdGhlIERPTS5cclxuXHRcdFx0XHRcdCBUcmFuc2Zvcm0gc2V0dGluZyBpcyBiYXRjaGVkIGluIHRoaXMgd2F5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2U6IHRoZSB0cmFuc2Zvcm0gc3R5bGUgb25seSBuZWVkcyB0byBiZSB1cGRhdGVkXHJcblx0XHRcdFx0XHQgb25jZSB3aGVuIG11bHRpcGxlIHRyYW5zZm9ybSBzdWJwcm9wZXJ0aWVzIGFyZSBiZWluZyBhbmltYXRlZCBzaW11bHRhbmVvdXNseS4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IElFOSBhbmQgQW5kcm9pZCBHaW5nZXJicmVhZCBoYXZlIHN1cHBvcnQgZm9yIDJEIC0tIGJ1dCBub3QgM0QgLS0gdHJhbnNmb3Jtcy4gU2luY2UgYW5pbWF0aW5nIHVuc3VwcG9ydGVkXHJcblx0XHRcdFx0XHQgdHJhbnNmb3JtIHByb3BlcnRpZXMgcmVzdWx0cyBpbiB0aGUgYnJvd3NlciBpZ25vcmluZyB0aGUgKmVudGlyZSogdHJhbnNmb3JtIHN0cmluZywgd2UgcHJldmVudCB0aGVzZSAzRCB2YWx1ZXNcclxuXHRcdFx0XHRcdCBmcm9tIGJlaW5nIG5vcm1hbGl6ZWQgZm9yIHRoZXNlIGJyb3dzZXJzIHNvIHRoYXQgdHdlZW5pbmcgc2tpcHMgdGhlc2UgcHJvcGVydGllcyBhbHRvZ2V0aGVyXHJcblx0XHRcdFx0XHQgKHNpbmNlIGl0IHdpbGwgaWdub3JlIHRoZW0gYXMgYmVpbmcgdW5zdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuKSAqL1xyXG5cdFx0XHRcdFx0aWYgKCghSUUgfHwgSUUgPiA5KSAmJiAhVmVsb2NpdHkuU3RhdGUuaXNHaW5nZXJicmVhZCkge1xyXG5cdFx0XHRcdFx0XHQvKiBOb3RlOiBTaW5jZSB0aGUgc3RhbmRhbG9uZSBDU1MgXCJwZXJzcGVjdGl2ZVwiIHByb3BlcnR5IGFuZCB0aGUgQ1NTIHRyYW5zZm9ybSBcInBlcnNwZWN0aXZlXCIgc3VicHJvcGVydHlcclxuXHRcdFx0XHRcdFx0IHNoYXJlIHRoZSBzYW1lIG5hbWUsIHRoZSBsYXR0ZXIgaXMgZ2l2ZW4gYSB1bmlxdWUgdG9rZW4gd2l0aGluIFZlbG9jaXR5OiBcInRyYW5zZm9ybVBlcnNwZWN0aXZlXCIuICovXHJcblx0XHRcdFx0XHRcdENTUy5MaXN0cy50cmFuc2Zvcm1zQmFzZSA9IENTUy5MaXN0cy50cmFuc2Zvcm1zQmFzZS5jb25jYXQoQ1NTLkxpc3RzLnRyYW5zZm9ybXMzRCk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBDU1MuTGlzdHMudHJhbnNmb3Jtc0Jhc2UubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0LyogV3JhcCB0aGUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIG5vcm1hbGl6YXRpb24gZnVuY3Rpb24gaW4gYSBuZXcgc2NvcGUgc28gdGhhdCB0cmFuc2Zvcm1OYW1lJ3MgdmFsdWUgaXNcclxuXHRcdFx0XHRcdFx0IHBhaXJlZCB3aXRoIGl0cyByZXNwZWN0aXZlIGZ1bmN0aW9uLiAoT3RoZXJ3aXNlLCBhbGwgZnVuY3Rpb25zIHdvdWxkIHRha2UgdGhlIGZpbmFsIGZvciBsb29wJ3MgdHJhbnNmb3JtTmFtZS4pICovXHJcblx0XHRcdFx0XHRcdChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgdHJhbnNmb3JtTmFtZSA9IENTUy5MaXN0cy50cmFuc2Zvcm1zQmFzZVtpXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbdHJhbnNmb3JtTmFtZV0gPSBmdW5jdGlvbih0eXBlLCBlbGVtZW50LCBwcm9wZXJ0eVZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogVGhlIG5vcm1hbGl6ZWQgcHJvcGVydHkgbmFtZSBpcyB0aGUgcGFyZW50IFwidHJhbnNmb3JtXCIgcHJvcGVydHkgLS0gdGhlIHByb3BlcnR5IHRoYXQgaXMgYWN0dWFsbHkgc2V0IGluIENTUy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIm5hbWVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJ0cmFuc2Zvcm1cIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBUcmFuc2Zvcm0gdmFsdWVzIGFyZSBjYWNoZWQgb250byBhIHBlci1lbGVtZW50IHRyYW5zZm9ybUNhY2hlIG9iamVjdC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB0aGlzIHRyYW5zZm9ybSBoYXMgeWV0IHRvIGJlIGFzc2lnbmVkIGEgdmFsdWUsIHJldHVybiBpdHMgbnVsbCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KSA9PT0gdW5kZWZpbmVkIHx8IERhdGEoZWxlbWVudCkudHJhbnNmb3JtQ2FjaGVbdHJhbnNmb3JtTmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogU2NhbGUgQ1NTLkxpc3RzLnRyYW5zZm9ybXNCYXNlIGRlZmF1bHQgdG8gMSB3aGVyZWFzIGFsbCBvdGhlciB0cmFuc2Zvcm0gcHJvcGVydGllcyBkZWZhdWx0IHRvIDAuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gL15zY2FsZS9pLnRlc3QodHJhbnNmb3JtTmFtZSkgPyAxIDogMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFdoZW4gdHJhbnNmb3JtIHZhbHVlcyBhcmUgc2V0LCB0aGV5IGFyZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIGFzIHBlciB0aGUgQ1NTIHNwZWMuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgVGh1cywgd2hlbiBleHRyYWN0aW5nIHRoZWlyIHZhbHVlcyAoZm9yIHR3ZWVuIGNhbGN1bGF0aW9ucyksIHdlIHN0cmlwIG9mZiB0aGUgcGFyZW50aGVzZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdLnJlcGxhY2UoL1soKV0vZywgXCJcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJpbmplY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgaW52YWxpZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiBhbiBpbmRpdmlkdWFsIHRyYW5zZm9ybSBwcm9wZXJ0eSBjb250YWlucyBhbiB1bnN1cHBvcnRlZCB1bml0IHR5cGUsIHRoZSBicm93c2VyIGlnbm9yZXMgdGhlICplbnRpcmUqIHRyYW5zZm9ybSBwcm9wZXJ0eS5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgVGh1cywgcHJvdGVjdCB1c2VycyBmcm9tIHRoZW1zZWx2ZXMgYnkgc2tpcHBpbmcgc2V0dGluZyBmb3IgdHJhbnNmb3JtIHZhbHVlcyBzdXBwbGllZCB3aXRoIGludmFsaWQgdW5pdCB0eXBlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBTd2l0Y2ggb24gdGhlIGJhc2UgdHJhbnNmb3JtIHR5cGU7IGlnbm9yZSB0aGUgYXhpcyBieSByZW1vdmluZyB0aGUgbGFzdCBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNmb3JtJ3MgbmFtZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHRyYW5zZm9ybU5hbWUuc3Vic3RyKDAsIHRyYW5zZm9ybU5hbWUubGVuZ3RoIC0gMSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFdoaXRlbGlzdCB1bml0IHR5cGVzIGZvciBlYWNoIHRyYW5zZm9ybS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJ0cmFuc2xhdGVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW52YWxpZCA9ICEvKCV8cHh8ZW18cmVtfHZ3fHZofFxcZCkkL2kudGVzdChwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFNpbmNlIGFuIGF4aXMtZnJlZSBcInNjYWxlXCIgcHJvcGVydHkgaXMgc3VwcG9ydGVkIGFzIHdlbGwsIGEgbGl0dGxlIGhhY2sgaXMgdXNlZCBoZXJlIHRvIGRldGVjdCBpdCBieSBjaG9wcGluZyBvZmYgaXRzIGxhc3QgbGV0dGVyLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInNjYWxcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJzY2FsZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBDaHJvbWUgb24gQW5kcm9pZCBoYXMgYSBidWcgaW4gd2hpY2ggc2NhbGVkIGVsZW1lbnRzIGJsdXIgaWYgdGhlaXIgaW5pdGlhbCBzY2FsZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgdmFsdWUgaXMgYmVsb3cgMSAod2hpY2ggY2FuIGhhcHBlbiB3aXRoIGZvcmNlZmVlZGluZykuIFRodXMsIHdlIGRldGVjdCBhIHlldC11bnNldCBzY2FsZSBwcm9wZXJ0eVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgYW5kIGVuc3VyZSB0aGF0IGl0cyBmaXJzdCB2YWx1ZSBpcyBhbHdheXMgMS4gTW9yZSBpbmZvOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNDE3ODkwL2NzczMtYW5pbWF0aW9ucy13aXRoLXRyYW5zZm9ybS1jYXVzZXMtYmx1cnJlZC1lbGVtZW50cy1vbi13ZWJraXQvMTA0MTc5NjIjMTA0MTc5NjIgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LlN0YXRlLmlzQW5kcm9pZCAmJiBEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdID09PSB1bmRlZmluZWQgJiYgcHJvcGVydHlWYWx1ZSA8IDEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gMTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW52YWxpZCA9ICEvKFxcZCkkL2kudGVzdChwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwic2tld1wiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpbnZhbGlkID0gIS8oZGVnfFxcZCkkL2kudGVzdChwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwicm90YXRlXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGludmFsaWQgPSAhLyhkZWd8XFxkKSQvaS50ZXN0KHByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghaW52YWxpZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQXMgcGVyIHRoZSBDU1Mgc3BlYywgd3JhcCB0aGUgdmFsdWUgaW4gcGFyZW50aGVzZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHREYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdID0gXCIoXCIgKyBwcm9wZXJ0eVZhbHVlICsgXCIpXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBBbHRob3VnaCB0aGUgdmFsdWUgaXMgc2V0IG9uIHRoZSB0cmFuc2Zvcm1DYWNoZSBvYmplY3QsIHJldHVybiB0aGUgbmV3bHktdXBkYXRlZCB2YWx1ZSBmb3IgdGhlIGNhbGxpbmcgY29kZSB0byBwcm9jZXNzIGFzIG5vcm1hbC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9KSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgQ29sb3JzXHJcblx0XHRcdFx0XHQgKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHQvKiBTaW5jZSBWZWxvY2l0eSBvbmx5IGFuaW1hdGVzIGEgc2luZ2xlIG51bWVyaWMgdmFsdWUgcGVyIHByb3BlcnR5LCBjb2xvciBhbmltYXRpb24gaXMgYWNoaWV2ZWQgYnkgaG9va2luZyB0aGUgaW5kaXZpZHVhbCBSR0JBIGNvbXBvbmVudHMgb2YgQ1NTIGNvbG9yIHByb3BlcnRpZXMuXHJcblx0XHRcdFx0XHQgQWNjb3JkaW5nbHksIGNvbG9yIHZhbHVlcyBtdXN0IGJlIG5vcm1hbGl6ZWQgKGUuZy4gXCIjZmYwMDAwXCIsIFwicmVkXCIsIGFuZCBcInJnYigyNTUsIDAsIDApXCIgPT0+IFwiMjU1IDAgMCAxXCIpIHNvIHRoYXQgdGhlaXIgY29tcG9uZW50cyBjYW4gYmUgaW5qZWN0ZWQvZXh0cmFjdGVkIGJ5IENTUy5Ib29rcyBsb2dpYy4gKi9cclxuXHRcdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgQ1NTLkxpc3RzLmNvbG9ycy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdFx0XHQvKiBXcmFwIHRoZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgbm9ybWFsaXphdGlvbiBmdW5jdGlvbiBpbiBhIG5ldyBzY29wZSBzbyB0aGF0IGNvbG9yTmFtZSdzIHZhbHVlIGlzIHBhaXJlZCB3aXRoIGl0cyByZXNwZWN0aXZlIGZ1bmN0aW9uLlxyXG5cdFx0XHRcdFx0XHQgKE90aGVyd2lzZSwgYWxsIGZ1bmN0aW9ucyB3b3VsZCB0YWtlIHRoZSBmaW5hbCBmb3IgbG9vcCdzIGNvbG9yTmFtZS4pICovXHJcblx0XHRcdFx0XHRcdChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgY29sb3JOYW1lID0gQ1NTLkxpc3RzLmNvbG9yc1tqXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogTm90ZTogSW4gSUU8PTgsIHdoaWNoIHN1cHBvcnQgcmdiIGJ1dCBub3QgcmdiYSwgY29sb3IgcHJvcGVydGllcyBhcmUgcmV2ZXJ0ZWQgdG8gcmdiIGJ5IHN0cmlwcGluZyBvZmYgdGhlIGFscGhhIGNvbXBvbmVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtjb2xvck5hbWVdID0gZnVuY3Rpb24odHlwZSwgZWxlbWVudCwgcHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJuYW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvbG9yTmFtZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBDb252ZXJ0IGFsbCBjb2xvciB2YWx1ZXMgaW50byB0aGUgcmdiIGZvcm1hdC4gKE9sZCBJRSBjYW4gcmV0dXJuIGhleCB2YWx1ZXMgYW5kIGNvbG9yIG5hbWVzIGluc3RlYWQgb2YgcmdiL3JnYmEuKSAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiZXh0cmFjdFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBleHRyYWN0ZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBjb2xvciBpcyBhbHJlYWR5IGluIGl0cyBob29rYWJsZSBmb3JtIChlLmcuIFwiMjU1IDI1NSAyNTUgMVwiKSBkdWUgdG8gaGF2aW5nIGJlZW4gcHJldmlvdXNseSBleHRyYWN0ZWQsIHNraXAgZXh0cmFjdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoQ1NTLlJlZ0V4LndyYXBwZWRWYWx1ZUFscmVhZHlFeHRyYWN0ZWQudGVzdChwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFjdGVkID0gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGNvbnZlcnRlZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2xvck5hbWVzID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YmxhY2s6IFwicmdiKDAsIDAsIDApXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRibHVlOiBcInJnYigwLCAwLCAyNTUpXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncmF5OiBcInJnYigxMjgsIDEyOCwgMTI4KVwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Z3JlZW46IFwicmdiKDAsIDEyOCwgMClcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlZDogXCJyZ2IoMjU1LCAwLCAwKVwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpdGU6IFwicmdiKDI1NSwgMjU1LCAyNTUpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIENvbnZlcnQgY29sb3IgbmFtZXMgdG8gcmdiLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKC9eW0Etel0rJC9pLnRlc3QocHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbG9yTmFtZXNbcHJvcGVydHlWYWx1ZV0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlZCA9IGNvbG9yTmFtZXNbcHJvcGVydHlWYWx1ZV07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgYW4gdW5tYXRjaGVkIGNvbG9yIG5hbWUgaXMgcHJvdmlkZWQsIGRlZmF1bHQgdG8gYmxhY2suICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVkID0gY29sb3JOYW1lcy5ibGFjaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBDb252ZXJ0IGhleCB2YWx1ZXMgdG8gcmdiLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChDU1MuUmVnRXguaXNIZXgudGVzdChwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZWQgPSBcInJnYihcIiArIENTUy5WYWx1ZXMuaGV4VG9SZ2IocHJvcGVydHlWYWx1ZSkuam9pbihcIiBcIikgKyBcIilcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgdGhlIHByb3ZpZGVkIGNvbG9yIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSBhY2NlcHRlZCBjb2xvciBmb3JtYXRzLCBkZWZhdWx0IHRvIGJsYWNrLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICghKC9ecmdiYT9cXCgvaS50ZXN0KHByb3BlcnR5VmFsdWUpKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZWQgPSBjb2xvck5hbWVzLmJsYWNrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFJlbW92ZSB0aGUgc3Vycm91bmRpbmcgXCJyZ2IvcmdiYSgpXCIgc3RyaW5nIHRoZW4gcmVwbGFjZSBjb21tYXMgd2l0aCBzcGFjZXMgYW5kIHN0cmlwXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgcmVwZWF0ZWQgc3BhY2VzIChpbiBjYXNlIHRoZSB2YWx1ZSBpbmNsdWRlZCBzcGFjZXMgdG8gYmVnaW4gd2l0aCkuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRleHRyYWN0ZWQgPSAoY29udmVydGVkIHx8IHByb3BlcnR5VmFsdWUpLnRvU3RyaW5nKCkubWF0Y2goQ1NTLlJlZ0V4LnZhbHVlVW53cmFwKVsxXS5yZXBsYWNlKC8sKFxccyspPy9nLCBcIiBcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBTbyBsb25nIGFzIHRoaXMgaXNuJ3QgPD1JRTgsIGFkZCBhIGZvdXJ0aCAoYWxwaGEpIGNvbXBvbmVudCBpZiBpdCdzIG1pc3NpbmcgYW5kIGRlZmF1bHQgaXQgdG8gMSAodmlzaWJsZSkuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCghSUUgfHwgSUUgPiA4KSAmJiBleHRyYWN0ZWQuc3BsaXQoXCIgXCIpLmxlbmd0aCA9PT0gMykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFjdGVkICs9IFwiIDFcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBleHRyYWN0ZWQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJpbmplY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB3ZSBoYXZlIGEgcGF0dGVybiB0aGVuIGl0IG1pZ2h0IGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgdmFsdWVzICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKC9ecmdiLy50ZXN0KHByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoaXMgaXMgSUU8PTggYW5kIGFuIGFscGhhIGNvbXBvbmVudCBleGlzdHMsIHN0cmlwIGl0IG9mZi4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSUUgPD0gOCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUuc3BsaXQoXCIgXCIpLmxlbmd0aCA9PT0gNCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZS5zcGxpdCgvXFxzKy8pLnNsaWNlKDAsIDMpLmpvaW4oXCIgXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogT3RoZXJ3aXNlLCBhZGQgYSBmb3VydGggKGFscGhhKSBjb21wb25lbnQgaWYgaXQncyBtaXNzaW5nIGFuZCBkZWZhdWx0IGl0IHRvIDEgKHZpc2libGUpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHlWYWx1ZS5zcGxpdChcIiBcIikubGVuZ3RoID09PSAzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlICs9IFwiIDFcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFJlLWluc2VydCB0aGUgYnJvd3Nlci1hcHByb3ByaWF0ZSB3cmFwcGVyKFwicmdiL3JnYmEoKVwiKSwgaW5zZXJ0IGNvbW1hcywgYW5kIHN0cmlwIG9mZiBkZWNpbWFsIHVuaXRzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IG9uIGFsbCB2YWx1ZXMgYnV0IHRoZSBmb3VydGggKFIsIEcsIGFuZCBCIG9ubHkgYWNjZXB0IHdob2xlIG51bWJlcnMpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAoSUUgPD0gOCA/IFwicmdiXCIgOiBcInJnYmFcIikgKyBcIihcIiArIHByb3BlcnR5VmFsdWUucmVwbGFjZSgvXFxzKy9nLCBcIixcIikucmVwbGFjZSgvXFwuKFxcZCkrKD89LCkvZywgXCJcIikgKyBcIilcIjtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9KSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IERpbWVuc2lvbnNcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKi9cclxuXHRcdFx0XHRcdGZ1bmN0aW9uIGF1Z21lbnREaW1lbnNpb24obmFtZSwgZWxlbWVudCwgd2FudElubmVyKSB7XHJcblx0XHRcdFx0XHRcdHZhciBpc0JvcmRlckJveCA9IENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiYm94U2l6aW5nXCIpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJib3JkZXItYm94XCI7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoaXNCb3JkZXJCb3ggPT09ICh3YW50SW5uZXIgfHwgZmFsc2UpKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogaW4gYm94LXNpemluZyBtb2RlLCB0aGUgQ1NTIHdpZHRoIC8gaGVpZ2h0IGFjY2Vzc29ycyBhbHJlYWR5IGdpdmUgdGhlIG91dGVyV2lkdGggLyBvdXRlckhlaWdodC4gKi9cclxuXHRcdFx0XHRcdFx0XHR2YXIgaSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGF1Z21lbnQgPSAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzaWRlcyA9IG5hbWUgPT09IFwid2lkdGhcIiA/IFtcIkxlZnRcIiwgXCJSaWdodFwiXSA6IFtcIlRvcFwiLCBcIkJvdHRvbVwiXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRzID0gW1wicGFkZGluZ1wiICsgc2lkZXNbMF0sIFwicGFkZGluZ1wiICsgc2lkZXNbMV0sIFwiYm9yZGVyXCIgKyBzaWRlc1swXSArIFwiV2lkdGhcIiwgXCJib3JkZXJcIiArIHNpZGVzWzFdICsgXCJXaWR0aFwiXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIGZpZWxkc1tpXSkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFpc05hTih2YWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXVnbWVudCArPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHdhbnRJbm5lciA/IC1hdWdtZW50IDogYXVnbWVudDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGZ1bmN0aW9uIGdldERpbWVuc2lvbihuYW1lLCB3YW50SW5uZXIpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKHR5cGUsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJuYW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBuYW1lO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlRmxvYXQocHJvcGVydHlWYWx1ZSkgKyBhdWdtZW50RGltZW5zaW9uKG5hbWUsIGVsZW1lbnQsIHdhbnRJbm5lcik7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiaW5qZWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAocGFyc2VGbG9hdChwcm9wZXJ0eVZhbHVlKSAtIGF1Z21lbnREaW1lbnNpb24obmFtZSwgZWxlbWVudCwgd2FudElubmVyKSkgKyBcInB4XCI7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWQuaW5uZXJXaWR0aCA9IGdldERpbWVuc2lvbihcIndpZHRoXCIsIHRydWUpO1xyXG5cdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWQuaW5uZXJIZWlnaHQgPSBnZXREaW1lbnNpb24oXCJoZWlnaHRcIiwgdHJ1ZSk7XHJcblx0XHRcdFx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZC5vdXRlcldpZHRoID0gZ2V0RGltZW5zaW9uKFwid2lkdGhcIik7XHJcblx0XHRcdFx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZC5vdXRlckhlaWdodCA9IGdldERpbWVuc2lvbihcImhlaWdodFwiKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IENTUyBQcm9wZXJ0eSBOYW1lc1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0TmFtZXM6IHtcclxuXHRcdFx0XHQvKiBDYW1lbGNhc2UgYSBwcm9wZXJ0eSBuYW1lIGludG8gaXRzIEphdmFTY3JpcHQgbm90YXRpb24gKGUuZy4gXCJiYWNrZ3JvdW5kLWNvbG9yXCIgPT0+IFwiYmFja2dyb3VuZENvbG9yXCIpLlxyXG5cdFx0XHRcdCBDYW1lbGNhc2luZyBpcyB1c2VkIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0eSBuYW1lcyBiZXR3ZWVuIGFuZCBhY3Jvc3MgY2FsbHMuICovXHJcblx0XHRcdFx0Y2FtZWxDYXNlOiBmdW5jdGlvbihwcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5LnJlcGxhY2UoLy0oXFx3KS9nLCBmdW5jdGlvbihtYXRjaCwgc3ViTWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHN1Yk1hdGNoLnRvVXBwZXJDYXNlKCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIEZvciBTVkcgZWxlbWVudHMsIHNvbWUgcHJvcGVydGllcyAobmFtZWx5LCBkaW1lbnNpb25hbCBvbmVzKSBhcmUgR0VUL1NFVCB2aWEgdGhlIGVsZW1lbnQncyBIVE1MIGF0dHJpYnV0ZXMgKGluc3RlYWQgb2YgdmlhIENTUyBzdHlsZXMpLiAqL1xyXG5cdFx0XHRcdFNWR0F0dHJpYnV0ZTogZnVuY3Rpb24ocHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdHZhciBTVkdBdHRyaWJ1dGVzID0gXCJ3aWR0aHxoZWlnaHR8eHx5fGN4fGN5fHJ8cnh8cnl8eDF8eDJ8eTF8eTJcIjtcclxuXHJcblx0XHRcdFx0XHQvKiBDZXJ0YWluIGJyb3dzZXJzIHJlcXVpcmUgYW4gU1ZHIHRyYW5zZm9ybSB0byBiZSBhcHBsaWVkIGFzIGFuIGF0dHJpYnV0ZS4gKE90aGVyd2lzZSwgYXBwbGljYXRpb24gdmlhIENTUyBpcyBwcmVmZXJhYmxlIGR1ZSB0byAzRCBzdXBwb3J0LikgKi9cclxuXHRcdFx0XHRcdGlmIChJRSB8fCAoVmVsb2NpdHkuU3RhdGUuaXNBbmRyb2lkICYmICFWZWxvY2l0eS5TdGF0ZS5pc0Nocm9tZSkpIHtcclxuXHRcdFx0XHRcdFx0U1ZHQXR0cmlidXRlcyArPSBcInx0cmFuc2Zvcm1cIjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFJlZ0V4cChcIl4oXCIgKyBTVkdBdHRyaWJ1dGVzICsgXCIpJFwiLCBcImlcIikudGVzdChwcm9wZXJ0eSk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBEZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgd2l0aCBhIHZlbmRvciBwcmVmaXguICovXHJcblx0XHRcdFx0LyogSWYgYSBwcmVmaXhlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBleGlzdHMsIHJldHVybiBpdC4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIG9yaWdpbmFsIHByb3BlcnR5IG5hbWUuXHJcblx0XHRcdFx0IElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgYXQgYWxsIHN1cHBvcnRlZCBieSB0aGUgYnJvd3NlciwgcmV0dXJuIGEgZmFsc2UgZmxhZy4gKi9cclxuXHRcdFx0XHRwcmVmaXhDaGVjazogZnVuY3Rpb24ocHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdC8qIElmIHRoaXMgcHJvcGVydHkgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLCByZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdGlmIChWZWxvY2l0eS5TdGF0ZS5wcmVmaXhNYXRjaGVzW3Byb3BlcnR5XSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gW1ZlbG9jaXR5LlN0YXRlLnByZWZpeE1hdGNoZXNbcHJvcGVydHldLCB0cnVlXTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHZhciB2ZW5kb3JzID0gW1wiXCIsIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiwgXCJPXCJdO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIHZlbmRvcnNMZW5ndGggPSB2ZW5kb3JzLmxlbmd0aDsgaSA8IHZlbmRvcnNMZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBwcm9wZXJ0eVByZWZpeGVkO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoaSA9PT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlQcmVmaXhlZCA9IHByb3BlcnR5O1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIHByb3BlcnR5IHRvIGNvbmZvcm0gdG8gSmF2YVNjcmlwdCB2ZW5kb3IgcHJlZml4IG5vdGF0aW9uIChlLmcuIHdlYmtpdEZpbHRlcikuICovXHJcblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVByZWZpeGVkID0gdmVuZG9yc1tpXSArIHByb3BlcnR5LnJlcGxhY2UoL15cXHcvLCBmdW5jdGlvbihtYXRjaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWF0Y2gudG9VcHBlckNhc2UoKTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogQ2hlY2sgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhpcyBwcm9wZXJ0eSBhcyBwcmVmaXhlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc1N0cmluZyhWZWxvY2l0eS5TdGF0ZS5wcmVmaXhFbGVtZW50LnN0eWxlW3Byb3BlcnR5UHJlZml4ZWRdKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ2FjaGUgdGhlIG1hdGNoLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuU3RhdGUucHJlZml4TWF0Y2hlc1twcm9wZXJ0eV0gPSBwcm9wZXJ0eVByZWZpeGVkO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBbcHJvcGVydHlQcmVmaXhlZCwgdHJ1ZV07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhpcyBwcm9wZXJ0eSBpbiBhbnkgZm9ybSwgaW5jbHVkZSBhIGZhbHNlIGZsYWcgc28gdGhhdCB0aGUgY2FsbGVyIGNhbiBkZWNpZGUgaG93IHRvIHByb2NlZWQuICovXHJcblx0XHRcdFx0XHRcdHJldHVybiBbcHJvcGVydHksIGZhbHNlXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IENTUyBQcm9wZXJ0eSBWYWx1ZXNcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFZhbHVlczoge1xyXG5cdFx0XHRcdC8qIEhleCB0byBSR0IgY29udmVyc2lvbi4gQ29weXJpZ2h0IFRpbSBEb3duOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU2MjM4MzgvcmdiLXRvLWhleC1hbmQtaGV4LXRvLXJnYiAqL1xyXG5cdFx0XHRcdGhleFRvUmdiOiBmdW5jdGlvbihoZXgpIHtcclxuXHRcdFx0XHRcdHZhciBzaG9ydGZvcm1SZWdleCA9IC9eIz8oW2EtZlxcZF0pKFthLWZcXGRdKShbYS1mXFxkXSkkL2ksXHJcblx0XHRcdFx0XHRcdFx0bG9uZ2Zvcm1SZWdleCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2ksXHJcblx0XHRcdFx0XHRcdFx0cmdiUGFydHM7XHJcblxyXG5cdFx0XHRcdFx0aGV4ID0gaGV4LnJlcGxhY2Uoc2hvcnRmb3JtUmVnZXgsIGZ1bmN0aW9uKG0sIHIsIGcsIGIpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYjtcclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdHJnYlBhcnRzID0gbG9uZ2Zvcm1SZWdleC5leGVjKGhleCk7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJnYlBhcnRzID8gW3BhcnNlSW50KHJnYlBhcnRzWzFdLCAxNiksIHBhcnNlSW50KHJnYlBhcnRzWzJdLCAxNiksIHBhcnNlSW50KHJnYlBhcnRzWzNdLCAxNildIDogWzAsIDAsIDBdO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0aXNDU1NOdWxsVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcblx0XHRcdFx0XHQvKiBUaGUgYnJvd3NlciBkZWZhdWx0cyBDU1MgdmFsdWVzIHRoYXQgaGF2ZSBub3QgYmVlbiBzZXQgdG8gZWl0aGVyIDAgb3Igb25lIG9mIHNldmVyYWwgcG9zc2libGUgbnVsbC12YWx1ZSBzdHJpbmdzLlxyXG5cdFx0XHRcdFx0IFRodXMsIHdlIGNoZWNrIGZvciBib3RoIGZhbHNpbmVzcyBhbmQgdGhlc2Ugc3BlY2lhbCBzdHJpbmdzLiAqL1xyXG5cdFx0XHRcdFx0LyogTnVsbC12YWx1ZSBjaGVja2luZyBpcyBwZXJmb3JtZWQgdG8gZGVmYXVsdCB0aGUgc3BlY2lhbCBzdHJpbmdzIHRvIDAgKGZvciB0aGUgc2FrZSBvZiB0d2VlbmluZykgb3IgdGhlaXIgaG9va1xyXG5cdFx0XHRcdFx0IHRlbXBsYXRlcyBhcyBkZWZpbmVkIGFzIENTUy5Ib29rcyAoZm9yIHRoZSBzYWtlIG9mIGhvb2sgaW5qZWN0aW9uL2V4dHJhY3Rpb24pLiAqL1xyXG5cdFx0XHRcdFx0LyogTm90ZTogQ2hyb21lIHJldHVybnMgXCJyZ2JhKDAsIDAsIDAsIDApXCIgZm9yIGFuIHVuZGVmaW5lZCBjb2xvciB3aGVyZWFzIElFIHJldHVybnMgXCJ0cmFuc3BhcmVudFwiLiAqL1xyXG5cdFx0XHRcdFx0cmV0dXJuICghdmFsdWUgfHwgL14obm9uZXxhdXRvfHRyYW5zcGFyZW50fChyZ2JhXFwoMCwgPzAsID8wLCA/MFxcKSkpJC9pLnRlc3QodmFsdWUpKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIFJldHJpZXZlIGEgcHJvcGVydHkncyBkZWZhdWx0IHVuaXQgdHlwZS4gVXNlZCBmb3IgYXNzaWduaW5nIGEgdW5pdCB0eXBlIHdoZW4gb25lIGlzIG5vdCBzdXBwbGllZCBieSB0aGUgdXNlci4gKi9cclxuXHRcdFx0XHRnZXRVbml0VHlwZTogZnVuY3Rpb24ocHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdGlmICgvXihyb3RhdGV8c2tldykvaS50ZXN0KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJkZWdcIjtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoLyheKHNjYWxlfHNjYWxlWHxzY2FsZVl8c2NhbGVafGFscGhhfGZsZXhHcm93fGZsZXhIZWlnaHR8ekluZGV4fGZvbnRXZWlnaHQpJCl8KChvcGFjaXR5fHJlZHxncmVlbnxibHVlfGFscGhhKSQpL2kudGVzdChwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0LyogVGhlIGFib3ZlIHByb3BlcnRpZXMgYXJlIHVuaXRsZXNzLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8qIERlZmF1bHQgdG8gcHggZm9yIGFsbCBvdGhlciBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJweFwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogSFRNTCBlbGVtZW50cyBkZWZhdWx0IHRvIGFuIGFzc29jaWF0ZWQgZGlzcGxheSB0eXBlIHdoZW4gdGhleSdyZSBub3Qgc2V0IHRvIGRpc3BsYXk6bm9uZS4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGNvcnJlY3RseSBzZXR0aW5nIHRoZSBub24tXCJub25lXCIgZGlzcGxheSB2YWx1ZSBpbiBjZXJ0YWluIFZlbG9jaXR5IHJlZGlyZWN0cywgc3VjaCBhcyBmYWRlSW4vT3V0LiAqL1xyXG5cdFx0XHRcdGdldERpc3BsYXlUeXBlOiBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRcdFx0XHR2YXIgdGFnTmFtZSA9IGVsZW1lbnQgJiYgZWxlbWVudC50YWdOYW1lLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoL14oYnxiaWd8aXxzbWFsbHx0dHxhYmJyfGFjcm9ueW18Y2l0ZXxjb2RlfGRmbnxlbXxrYmR8c3Ryb25nfHNhbXB8dmFyfGF8YmRvfGJyfGltZ3xtYXB8b2JqZWN0fHF8c2NyaXB0fHNwYW58c3VifHN1cHxidXR0b258aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhKSQvaS50ZXN0KHRhZ05hbWUpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBcImlubGluZVwiO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICgvXihsaSkkL2kudGVzdCh0YWdOYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJsaXN0LWl0ZW1cIjtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoL14odHIpJC9pLnRlc3QodGFnTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFwidGFibGUtcm93XCI7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKC9eKHRhYmxlKSQvaS50ZXN0KHRhZ05hbWUpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBcInRhYmxlXCI7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKC9eKHRib2R5KSQvaS50ZXN0KHRhZ05hbWUpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBcInRhYmxlLXJvdy1ncm91cFwiO1xyXG5cdFx0XHRcdFx0XHQvKiBEZWZhdWx0IHRvIFwiYmxvY2tcIiB3aGVuIG5vIG1hdGNoIGlzIGZvdW5kLiAqL1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiYmxvY2tcIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIFRoZSBjbGFzcyBhZGQvcmVtb3ZlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byB0ZW1wb3JhcmlseSBhcHBseSBhIFwidmVsb2NpdHktYW5pbWF0aW5nXCIgY2xhc3MgdG8gZWxlbWVudHMgd2hpbGUgdGhleSdyZSBhbmltYXRpbmcuICovXHJcblx0XHRcdFx0YWRkQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xyXG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc1N0cmluZyhlbGVtZW50LmNsYXNzTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBFbGVtZW50LmNsYXNzTmFtZSBpcyBhcm91bmQgMTUlIGZhc3RlciB0aGVuIHNldC9nZXRBdHRyaWJ1dGVcclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LmNsYXNzTmFtZSArPSAoZWxlbWVudC5jbGFzc05hbWUubGVuZ3RoID8gXCIgXCIgOiBcIlwiKSArIGNsYXNzTmFtZTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBXb3JrIGFyb3VuZCBmb3IgSUUgc3RyaWN0IG1vZGUgYW5pbWF0aW5nIFNWRyAtIGFuZCBhbnl0aGluZyBlbHNlIHRoYXQgZG9lc24ndCBiZWhhdmUgY29ycmVjdGx5IC0gdGhlIHNhbWUgd2F5IGpRdWVyeSBkb2VzIGl0XHJcblx0XHRcdFx0XHRcdFx0dmFyIGN1cnJlbnRDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKElFIDw9IDcgPyBcImNsYXNzTmFtZVwiIDogXCJjbGFzc1wiKSB8fCBcIlwiO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIGN1cnJlbnRDbGFzcyArIChjdXJyZW50Q2xhc3MgPyBcIiBcIiA6IFwiXCIpICsgY2xhc3NOYW1lKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xyXG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc1N0cmluZyhlbGVtZW50LmNsYXNzTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBFbGVtZW50LmNsYXNzTmFtZSBpcyBhcm91bmQgMTUlIGZhc3RlciB0aGVuIHNldC9nZXRBdHRyaWJ1dGVcclxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBOZWVkIHNvbWUganNwZXJmIHRlc3RzIG9uIHBlcmZvcm1hbmNlIC0gY2FuIHdlIGdldCByaWQgb2YgdGhlIHJlZ2V4IGFuZCBtYXliZSB1c2Ugc3BsaXQgLyBhcnJheSBtYW5pcHVsYXRpb24/XHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS50b1N0cmluZygpLnJlcGxhY2UobmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgY2xhc3NOYW1lLnNwbGl0KFwiIFwiKS5qb2luKFwifFwiKSArIFwiKFxcXFxzfCQpXCIsIFwiZ2lcIiksIFwiIFwiKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBXb3JrIGFyb3VuZCBmb3IgSUUgc3RyaWN0IG1vZGUgYW5pbWF0aW5nIFNWRyAtIGFuZCBhbnl0aGluZyBlbHNlIHRoYXQgZG9lc24ndCBiZWhhdmUgY29ycmVjdGx5IC0gdGhlIHNhbWUgd2F5IGpRdWVyeSBkb2VzIGl0XHJcblx0XHRcdFx0XHRcdFx0dmFyIGN1cnJlbnRDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKElFIDw9IDcgPyBcImNsYXNzTmFtZVwiIDogXCJjbGFzc1wiKSB8fCBcIlwiO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIGN1cnJlbnRDbGFzcy5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXnxcXHMpXCIgKyBjbGFzc05hbWUuc3BsaXQoXCIgXCIpLmpvaW4oXCJ8XCIpICsgXCIoXFxzfCQpXCIsIFwiZ2lcIiksIFwiIFwiKSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBTdHlsZSBHZXR0aW5nICYgU2V0dGluZ1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdC8qIFRoZSBzaW5ndWxhciBnZXRQcm9wZXJ0eVZhbHVlLCB3aGljaCByb3V0ZXMgdGhlIGxvZ2ljIGZvciBhbGwgbm9ybWFsaXphdGlvbnMsIGhvb2tzLCBhbmQgc3RhbmRhcmQgQ1NTIHByb3BlcnRpZXMuICovXHJcblx0XHRcdGdldFByb3BlcnR5VmFsdWU6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5LCByb290UHJvcGVydHlWYWx1ZSwgZm9yY2VTdHlsZUxvb2t1cCkge1xyXG5cdFx0XHRcdC8qIEdldCBhbiBlbGVtZW50J3MgY29tcHV0ZWQgcHJvcGVydHkgdmFsdWUuICovXHJcblx0XHRcdFx0LyogTm90ZTogUmV0cmlldmluZyB0aGUgdmFsdWUgb2YgYSBDU1MgcHJvcGVydHkgY2Fubm90IHNpbXBseSBiZSBwZXJmb3JtZWQgYnkgY2hlY2tpbmcgYW4gZWxlbWVudCdzXHJcblx0XHRcdFx0IHN0eWxlIGF0dHJpYnV0ZSAod2hpY2ggb25seSByZWZsZWN0cyB1c2VyLWRlZmluZWQgdmFsdWVzKS4gSW5zdGVhZCwgdGhlIGJyb3dzZXIgbXVzdCBiZSBxdWVyaWVkIGZvciBhIHByb3BlcnR5J3NcclxuXHRcdFx0XHQgKmNvbXB1dGVkKiB2YWx1ZS4gWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgZ2V0Q29tcHV0ZWRTdHlsZSBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9BUEkvd2luZG93LmdldENvbXB1dGVkU3R5bGUgKi9cclxuXHRcdFx0XHRmdW5jdGlvbiBjb21wdXRlUHJvcGVydHlWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0LyogV2hlbiBib3gtc2l6aW5nIGlzbid0IHNldCB0byBib3JkZXItYm94LCBoZWlnaHQgYW5kIHdpZHRoIHN0eWxlIHZhbHVlcyBhcmUgaW5jb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiBhblxyXG5cdFx0XHRcdFx0IGVsZW1lbnQncyBzY3JvbGxiYXJzIGFyZSB2aXNpYmxlICh3aGljaCBleHBhbmRzIHRoZSBlbGVtZW50J3MgZGltZW5zaW9ucykuIFRodXMsIHdlIGRlZmVyIHRvIHRoZSBtb3JlIGFjY3VyYXRlXHJcblx0XHRcdFx0XHQgb2Zmc2V0SGVpZ2h0L1dpZHRoIHByb3BlcnR5LCB3aGljaCBpbmNsdWRlcyB0aGUgdG90YWwgZGltZW5zaW9ucyBmb3IgaW50ZXJpb3IsIGJvcmRlciwgcGFkZGluZywgYW5kIHNjcm9sbGJhci5cclxuXHRcdFx0XHRcdCBXZSBzdWJ0cmFjdCBib3JkZXIgYW5kIHBhZGRpbmcgdG8gZ2V0IHRoZSBzdW0gb2YgaW50ZXJpb3IgKyBzY3JvbGxiYXIuICovXHJcblx0XHRcdFx0XHR2YXIgY29tcHV0ZWRWYWx1ZSA9IDA7XHJcblxyXG5cdFx0XHRcdFx0LyogSUU8PTggZG9lc24ndCBzdXBwb3J0IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLCB0aHVzIHdlIGRlZmVyIHRvIGpRdWVyeSwgd2hpY2ggaGFzIGFuIGV4dGVuc2l2ZSBhcnJheVxyXG5cdFx0XHRcdFx0IG9mIGhhY2tzIHRvIGFjY3VyYXRlbHkgcmV0cmlldmUgSUU4IHByb3BlcnR5IHZhbHVlcy4gUmUtaW1wbGVtZW50aW5nIHRoYXQgbG9naWMgaGVyZSBpcyBub3Qgd29ydGggYmxvYXRpbmcgdGhlXHJcblx0XHRcdFx0XHQgY29kZWJhc2UgZm9yIGEgZHlpbmcgYnJvd3Nlci4gVGhlIHBlcmZvcm1hbmNlIHJlcGVyY3Vzc2lvbnMgb2YgdXNpbmcgalF1ZXJ5IGhlcmUgYXJlIG1pbmltYWwgc2luY2VcclxuXHRcdFx0XHRcdCBWZWxvY2l0eSBpcyBvcHRpbWl6ZWQgdG8gcmFyZWx5IChhbmQgc29tZXRpbWVzIG5ldmVyKSBxdWVyeSB0aGUgRE9NLiBGdXJ0aGVyLCB0aGUgJC5jc3MoKSBjb2RlcGF0aCBpc24ndCB0aGF0IHNsb3cuICovXHJcblx0XHRcdFx0XHRpZiAoSUUgPD0gOCkge1xyXG5cdFx0XHRcdFx0XHRjb21wdXRlZFZhbHVlID0gJC5jc3MoZWxlbWVudCwgcHJvcGVydHkpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0LyogQWxsIG90aGVyIGJyb3dzZXJzIHN1cHBvcnQgZ2V0Q29tcHV0ZWRTdHlsZS4gVGhlIHJldHVybmVkIGxpdmUgb2JqZWN0IHJlZmVyZW5jZSBpcyBjYWNoZWQgb250byBpdHNcclxuXHRcdFx0XHRcdFx0IGFzc29jaWF0ZWQgZWxlbWVudCBzbyB0aGF0IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgcmVmZXRjaGVkIHVwb24gZXZlcnkgR0VULiAqL1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogQnJvd3NlcnMgZG8gbm90IHJldHVybiBoZWlnaHQgYW5kIHdpZHRoIHZhbHVlcyBmb3IgZWxlbWVudHMgdGhhdCBhcmUgc2V0IHRvIGRpc3BsYXk6XCJub25lXCIuIFRodXMsIHdlIHRlbXBvcmFyaWx5XHJcblx0XHRcdFx0XHRcdCB0b2dnbGUgZGlzcGxheSB0byB0aGUgZWxlbWVudCB0eXBlJ3MgZGVmYXVsdCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0dmFyIHRvZ2dsZURpc3BsYXkgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICgvXih3aWR0aHxoZWlnaHQpJC8udGVzdChwcm9wZXJ0eSkgJiYgQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJkaXNwbGF5XCIpID09PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0dG9nZ2xlRGlzcGxheSA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJkaXNwbGF5XCIsIENTUy5WYWx1ZXMuZ2V0RGlzcGxheVR5cGUoZWxlbWVudCkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgcmV2ZXJ0RGlzcGxheSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh0b2dnbGVEaXNwbGF5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRDU1Muc2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICghZm9yY2VTdHlsZUxvb2t1cCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gXCJoZWlnaHRcIiAmJiBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImJveFNpemluZ1wiKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgIT09IFwiYm9yZGVyLWJveFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgY29udGVudEJveEhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gKHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJib3JkZXJUb3BXaWR0aFwiKSkgfHwgMCkgLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImJvcmRlckJvdHRvbVdpZHRoXCIpKSB8fCAwKSAtIChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwicGFkZGluZ1RvcFwiKSkgfHwgMCkgLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInBhZGRpbmdCb3R0b21cIikpIHx8IDApO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV2ZXJ0RGlzcGxheSgpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBjb250ZW50Qm94SGVpZ2h0O1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkgPT09IFwid2lkdGhcIiAmJiBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImJveFNpemluZ1wiKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgIT09IFwiYm9yZGVyLWJveFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgY29udGVudEJveFdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aCAtIChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiYm9yZGVyTGVmdFdpZHRoXCIpKSB8fCAwKSAtIChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiYm9yZGVyUmlnaHRXaWR0aFwiKSkgfHwgMCkgLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInBhZGRpbmdMZWZ0XCIpKSB8fCAwKSAtIChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwicGFkZGluZ1JpZ2h0XCIpKSB8fCAwKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldmVydERpc3BsYXkoKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gY29udGVudEJveFdpZHRoO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGNvbXB1dGVkU3R5bGU7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBGb3IgZWxlbWVudHMgdGhhdCBWZWxvY2l0eSBoYXNuJ3QgYmVlbiBjYWxsZWQgb24gZGlyZWN0bHkgKGUuZy4gd2hlbiBWZWxvY2l0eSBxdWVyaWVzIHRoZSBET00gb24gYmVoYWxmXHJcblx0XHRcdFx0XHRcdCBvZiBhIHBhcmVudCBvZiBhbiBlbGVtZW50IGl0cyBhbmltYXRpbmcpLCBwZXJmb3JtIGEgZGlyZWN0IGdldENvbXB1dGVkU3R5bGUgbG9va3VwIHNpbmNlIHRoZSBvYmplY3QgaXNuJ3QgY2FjaGVkLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBJZiB0aGUgY29tcHV0ZWRTdHlsZSBvYmplY3QgaGFzIHlldCB0byBiZSBjYWNoZWQsIGRvIHNvIG5vdy4gKi9cclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICghRGF0YShlbGVtZW50KS5jb21wdXRlZFN0eWxlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZWRTdHlsZSA9IERhdGEoZWxlbWVudCkuY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBJZiBjb21wdXRlZFN0eWxlIGlzIGNhY2hlZCwgdXNlIGl0LiAqL1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXB1dGVkU3R5bGUgPSBEYXRhKGVsZW1lbnQpLmNvbXB1dGVkU3R5bGU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIElFIGFuZCBGaXJlZm94IGRvIG5vdCByZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGdlbmVyaWMgYm9yZGVyQ29sb3IgLS0gdGhleSBvbmx5IHJldHVybiBpbmRpdmlkdWFsIHZhbHVlcyBmb3IgZWFjaCBib3JkZXIgc2lkZSdzIGNvbG9yLlxyXG5cdFx0XHRcdFx0XHQgQWxzbywgaW4gYWxsIGJyb3dzZXJzLCB3aGVuIGJvcmRlciBjb2xvcnMgYXJlbid0IGFsbCB0aGUgc2FtZSwgYSBjb21wb3VuZCB2YWx1ZSBpcyByZXR1cm5lZCB0aGF0IFZlbG9jaXR5IGlzbid0IHNldHVwIHRvIHBhcnNlLlxyXG5cdFx0XHRcdFx0XHQgU28sIGFzIGEgcG9seWZpbGwgZm9yIHF1ZXJ5aW5nIGluZGl2aWR1YWwgYm9yZGVyIHNpZGUgY29sb3JzLCB3ZSBqdXN0IHJldHVybiB0aGUgdG9wIGJvcmRlcidzIGNvbG9yIGFuZCBhbmltYXRlIGFsbCBib3JkZXJzIGZyb20gdGhhdCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5ID09PSBcImJvcmRlckNvbG9yXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eSA9IFwiYm9yZGVyVG9wQ29sb3JcIjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogSUU5IGhhcyBhIGJ1ZyBpbiB3aGljaCB0aGUgXCJmaWx0ZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIGFjY2Vzc2VkIGZyb20gY29tcHV0ZWRTdHlsZSB1c2luZyB0aGUgZ2V0UHJvcGVydHlWYWx1ZSBtZXRob2RcclxuXHRcdFx0XHRcdFx0IGluc3RlYWQgb2YgYSBkaXJlY3QgcHJvcGVydHkgbG9va3VwLiBUaGUgZ2V0UHJvcGVydHlWYWx1ZSBtZXRob2QgaXMgc2xvd2VyIHRoYW4gYSBkaXJlY3QgbG9va3VwLCB3aGljaCBpcyB3aHkgd2UgYXZvaWQgaXQgYnkgZGVmYXVsdC4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKElFID09PSA5ICYmIHByb3BlcnR5ID09PSBcImZpbHRlclwiKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZWRWYWx1ZSA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSk7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXB1dGVkVmFsdWUgPSBjb21wdXRlZFN0eWxlW3Byb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogRmFsbCBiYWNrIHRvIHRoZSBwcm9wZXJ0eSdzIHN0eWxlIHZhbHVlIChpZiBkZWZpbmVkKSB3aGVuIGNvbXB1dGVkVmFsdWUgcmV0dXJucyBub3RoaW5nLFxyXG5cdFx0XHRcdFx0XHQgd2hpY2ggY2FuIGhhcHBlbiB3aGVuIHRoZSBlbGVtZW50IGhhc24ndCBiZWVuIHBhaW50ZWQuICovXHJcblx0XHRcdFx0XHRcdGlmIChjb21wdXRlZFZhbHVlID09PSBcIlwiIHx8IGNvbXB1dGVkVmFsdWUgPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHRjb21wdXRlZFZhbHVlID0gZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHJldmVydERpc3BsYXkoKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBGb3IgdG9wLCByaWdodCwgYm90dG9tLCBhbmQgbGVmdCAoVFJCTCkgdmFsdWVzIHRoYXQgYXJlIHNldCB0byBcImF1dG9cIiBvbiBlbGVtZW50cyBvZiBcImZpeGVkXCIgb3IgXCJhYnNvbHV0ZVwiIHBvc2l0aW9uLFxyXG5cdFx0XHRcdFx0IGRlZmVyIHRvIGpRdWVyeSBmb3IgY29udmVydGluZyBcImF1dG9cIiB0byBhIG51bWVyaWMgdmFsdWUuIChGb3IgZWxlbWVudHMgd2l0aCBhIFwic3RhdGljXCIgb3IgXCJyZWxhdGl2ZVwiIHBvc2l0aW9uLCBcImF1dG9cIiBoYXMgdGhlIHNhbWVcclxuXHRcdFx0XHRcdCBlZmZlY3QgYXMgYmVpbmcgc2V0IHRvIDAsIHNvIG5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5LikgKi9cclxuXHRcdFx0XHRcdC8qIEFuIGV4YW1wbGUgb2Ygd2h5IG51bWVyaWMgY29udmVyc2lvbiBpcyBuZWNlc3Nhcnk6IFdoZW4gYW4gZWxlbWVudCB3aXRoIFwicG9zaXRpb246YWJzb2x1dGVcIiBoYXMgYW4gdW50b3VjaGVkIFwibGVmdFwiXHJcblx0XHRcdFx0XHQgcHJvcGVydHksIHdoaWNoIHJldmVydHMgdG8gXCJhdXRvXCIsIGxlZnQncyB2YWx1ZSBpcyAwIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgZWxlbWVudCwgYnV0IGlzIG9mdGVuIG5vbi16ZXJvIHJlbGF0aXZlXHJcblx0XHRcdFx0XHQgdG8gaXRzICpjb250YWluaW5nKiAobm90IHBhcmVudCkgZWxlbWVudCwgd2hpY2ggaXMgdGhlIG5lYXJlc3QgXCJwb3NpdGlvbjpyZWxhdGl2ZVwiIGFuY2VzdG9yIG9yIHRoZSB2aWV3cG9ydCAoYW5kIGFsd2F5cyB0aGUgdmlld3BvcnQgaW4gdGhlIGNhc2Ugb2YgXCJwb3NpdGlvbjpmaXhlZFwiKS4gKi9cclxuXHRcdFx0XHRcdGlmIChjb21wdXRlZFZhbHVlID09PSBcImF1dG9cIiAmJiAvXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC9pLnRlc3QocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdHZhciBwb3NpdGlvbiA9IGNvbXB1dGVQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwicG9zaXRpb25cIik7IC8qIEdFVCAqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogRm9yIGFic29sdXRlIHBvc2l0aW9uaW5nLCBqUXVlcnkncyAkLnBvc2l0aW9uKCkgb25seSByZXR1cm5zIHZhbHVlcyBmb3IgdG9wIGFuZCBsZWZ0O1xyXG5cdFx0XHRcdFx0XHQgcmlnaHQgYW5kIGJvdHRvbSB3aWxsIGhhdmUgdGhlaXIgXCJhdXRvXCIgdmFsdWUgcmV2ZXJ0ZWQgdG8gMC4gKi9cclxuXHRcdFx0XHRcdFx0LyogTm90ZTogQSBqUXVlcnkgb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBoZXJlIHNpbmNlIGpRdWVyeSBkb2Vzbid0IGhhdmUgYSBsb3ctbGV2ZWwgYWxpYXMgZm9yICQucG9zaXRpb24oKS5cclxuXHRcdFx0XHRcdFx0IE5vdCBhIGJpZyBkZWFsIHNpbmNlIHdlJ3JlIGN1cnJlbnRseSBpbiBhIEdFVCBiYXRjaCBhbnl3YXkuICovXHJcblx0XHRcdFx0XHRcdGlmIChwb3NpdGlvbiA9PT0gXCJmaXhlZFwiIHx8IChwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiICYmIC90b3B8bGVmdC9pLnRlc3QocHJvcGVydHkpKSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIE5vdGU6IGpRdWVyeSBzdHJpcHMgdGhlIHBpeGVsIHVuaXQgZnJvbSBpdHMgcmV0dXJuZWQgdmFsdWVzOyB3ZSByZS1hZGQgaXQgaGVyZSB0byBjb25mb3JtIHdpdGggY29tcHV0ZVByb3BlcnR5VmFsdWUncyBiZWhhdmlvci4gKi9cclxuXHRcdFx0XHRcdFx0XHRjb21wdXRlZFZhbHVlID0gJChlbGVtZW50KS5wb3NpdGlvbigpW3Byb3BlcnR5XSArIFwicHhcIjsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gY29tcHV0ZWRWYWx1ZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHZhciBwcm9wZXJ0eVZhbHVlO1xyXG5cclxuXHRcdFx0XHQvKiBJZiB0aGlzIGlzIGEgaG9va2VkIHByb3BlcnR5IChlLmcuIFwiY2xpcExlZnRcIiBpbnN0ZWFkIG9mIHRoZSByb290IHByb3BlcnR5IG9mIFwiY2xpcFwiKSxcclxuXHRcdFx0XHQgZXh0cmFjdCB0aGUgaG9vaydzIHZhbHVlIGZyb20gYSBub3JtYWxpemVkIHJvb3RQcm9wZXJ0eVZhbHVlIHVzaW5nIENTUy5Ib29rcy5leHRyYWN0VmFsdWUoKS4gKi9cclxuXHRcdFx0XHRpZiAoQ1NTLkhvb2tzLnJlZ2lzdGVyZWRbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHR2YXIgaG9vayA9IHByb3BlcnR5LFxyXG5cdFx0XHRcdFx0XHRcdGhvb2tSb290ID0gQ1NTLkhvb2tzLmdldFJvb3QoaG9vayk7XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgYSBjYWNoZWQgcm9vdFByb3BlcnR5VmFsdWUgd2Fzbid0IHBhc3NlZCBpbiAod2hpY2ggVmVsb2NpdHkgYWx3YXlzIGF0dGVtcHRzIHRvIGRvIGluIG9yZGVyIHRvIGF2b2lkIHJlcXVlcnlpbmcgdGhlIERPTSksXHJcblx0XHRcdFx0XHQgcXVlcnkgdGhlIERPTSBmb3IgdGhlIHJvb3QgcHJvcGVydHkncyB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdGlmIChyb290UHJvcGVydHlWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdC8qIFNpbmNlIHRoZSBicm93c2VyIGlzIG5vdyBiZWluZyBkaXJlY3RseSBxdWVyaWVkLCB1c2UgdGhlIG9mZmljaWFsIHBvc3QtcHJlZml4aW5nIHByb3BlcnR5IG5hbWUgZm9yIHRoaXMgbG9va3VwLiAqL1xyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIENTUy5OYW1lcy5wcmVmaXhDaGVjayhob29rUm9vdClbMF0pOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBJZiB0aGlzIHJvb3QgaGFzIGEgbm9ybWFsaXphdGlvbiByZWdpc3RlcmVkLCBwZWZvcm0gdGhlIGFzc29jaWF0ZWQgbm9ybWFsaXphdGlvbiBleHRyYWN0aW9uLiAqL1xyXG5cdFx0XHRcdFx0aWYgKENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW2hvb2tSb290XSkge1xyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW2hvb2tSb290XShcImV4dHJhY3RcIiwgZWxlbWVudCwgcm9vdFByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIEV4dHJhY3QgdGhlIGhvb2sncyB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSBDU1MuSG9va3MuZXh0cmFjdFZhbHVlKGhvb2ssIHJvb3RQcm9wZXJ0eVZhbHVlKTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiB0aGlzIGlzIGEgbm9ybWFsaXplZCBwcm9wZXJ0eSAoZS5nLiBcIm9wYWNpdHlcIiBiZWNvbWVzIFwiZmlsdGVyXCIgaW4gPD1JRTgpIG9yIFwidHJhbnNsYXRlWFwiIGJlY29tZXMgXCJ0cmFuc2Zvcm1cIiksXHJcblx0XHRcdFx0XHQgbm9ybWFsaXplIHRoZSBwcm9wZXJ0eSdzIG5hbWUgYW5kIHZhbHVlLCBhbmQgaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgdHJhbnNmb3Jtcy4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IE5vcm1hbGl6aW5nIGEgcHJvcGVydHkgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIGZyb20gaG9va2luZyBhIHByb3BlcnR5IHNpbmNlIGhvb2stZXh0cmFjdGVkIHZhbHVlcyBhcmUgc3RyaWN0bHlcclxuXHRcdFx0XHRcdCBudW1lcmljYWwgYW5kIHRoZXJlZm9yZSBkbyBub3QgcmVxdWlyZSBub3JtYWxpemF0aW9uIGV4dHJhY3Rpb24uICovXHJcblx0XHRcdFx0fSBlbHNlIGlmIChDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdHZhciBub3JtYWxpemVkUHJvcGVydHlOYW1lLFxyXG5cdFx0XHRcdFx0XHRcdG5vcm1hbGl6ZWRQcm9wZXJ0eVZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbGl6ZWRQcm9wZXJ0eU5hbWUgPSBDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0oXCJuYW1lXCIsIGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdC8qIFRyYW5zZm9ybSB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgdmlhIG5vcm1hbGl6YXRpb24gZXh0cmFjdGlvbiAoc2VlIGJlbG93KSwgd2hpY2ggY2hlY2tzIGFnYWluc3QgdGhlIGVsZW1lbnQncyB0cmFuc2Zvcm1DYWNoZS5cclxuXHRcdFx0XHRcdCBBdCBubyBwb2ludCBkbyB0cmFuc2Zvcm0gR0VUcyBldmVyIGFjdHVhbGx5IHF1ZXJ5IHRoZSBET007IGluaXRpYWwgc3R5bGVzaGVldCB2YWx1ZXMgYXJlIG5ldmVyIHByb2Nlc3NlZC5cclxuXHRcdFx0XHRcdCBUaGlzIGlzIGJlY2F1c2UgcGFyc2luZyAzRCB0cmFuc2Zvcm0gbWF0cmljZXMgaXMgbm90IGFsd2F5cyBhY2N1cmF0ZSBhbmQgd291bGQgYmxvYXQgb3VyIGNvZGViYXNlO1xyXG5cdFx0XHRcdFx0IHRodXMsIG5vcm1hbGl6YXRpb24gZXh0cmFjdGlvbiBkZWZhdWx0cyBpbml0aWFsIHRyYW5zZm9ybSB2YWx1ZXMgdG8gdGhlaXIgemVyby12YWx1ZXMgKGUuZy4gMSBmb3Igc2NhbGVYIGFuZCAwIGZvciB0cmFuc2xhdGVYKS4gKi9cclxuXHRcdFx0XHRcdGlmIChub3JtYWxpemVkUHJvcGVydHlOYW1lICE9PSBcInRyYW5zZm9ybVwiKSB7XHJcblx0XHRcdFx0XHRcdG5vcm1hbGl6ZWRQcm9wZXJ0eVZhbHVlID0gY29tcHV0ZVByb3BlcnR5VmFsdWUoZWxlbWVudCwgQ1NTLk5hbWVzLnByZWZpeENoZWNrKG5vcm1hbGl6ZWRQcm9wZXJ0eU5hbWUpWzBdKTsgLyogR0VUICovXHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgdmFsdWUgaXMgYSBDU1MgbnVsbC12YWx1ZSBhbmQgdGhpcyBwcm9wZXJ0eSBoYXMgYSBob29rIHRlbXBsYXRlLCB1c2UgdGhhdCB6ZXJvLXZhbHVlIHRlbXBsYXRlIHNvIHRoYXQgaG9va3MgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0LiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoQ1NTLlZhbHVlcy5pc0NTU051bGxWYWx1ZShub3JtYWxpemVkUHJvcGVydHlWYWx1ZSkgJiYgQ1NTLkhvb2tzLnRlbXBsYXRlc1twcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHRub3JtYWxpemVkUHJvcGVydHlWYWx1ZSA9IENTUy5Ib29rcy50ZW1wbGF0ZXNbcHJvcGVydHldWzFdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW3Byb3BlcnR5XShcImV4dHJhY3RcIiwgZWxlbWVudCwgbm9ybWFsaXplZFByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogSWYgYSAobnVtZXJpYykgdmFsdWUgd2Fzbid0IHByb2R1Y2VkIHZpYSBob29rIGV4dHJhY3Rpb24gb3Igbm9ybWFsaXphdGlvbiwgcXVlcnkgdGhlIERPTS4gKi9cclxuXHRcdFx0XHRpZiAoIS9eW1xcZC1dLy50ZXN0KHByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHQvKiBGb3IgU1ZHIGVsZW1lbnRzLCBkaW1lbnNpb25hbCBwcm9wZXJ0aWVzICh3aGljaCBTVkdBdHRyaWJ1dGUoKSBkZXRlY3RzKSBhcmUgdHdlZW5lZCB2aWFcclxuXHRcdFx0XHRcdCB0aGVpciBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXMgaW5zdGVhZCBvZiB0aGVpciBDU1Mgc3R5bGUgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0dmFyIGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdGlmIChkYXRhICYmIGRhdGEuaXNTVkcgJiYgQ1NTLk5hbWVzLlNWR0F0dHJpYnV0ZShwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0LyogU2luY2UgdGhlIGhlaWdodC93aWR0aCBhdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgc2V0IG1hbnVhbGx5LCB0aGV5IGRvbid0IHJlZmxlY3QgY29tcHV0ZWQgdmFsdWVzLlxyXG5cdFx0XHRcdFx0XHQgVGh1cywgd2UgdXNlIHVzZSBnZXRCQm94KCkgdG8gZW5zdXJlIHdlIGFsd2F5cyBnZXQgdmFsdWVzIGZvciBlbGVtZW50cyB3aXRoIHVuZGVmaW5lZCBoZWlnaHQvd2lkdGggYXR0cmlidXRlcy4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKC9eKGhlaWdodHx3aWR0aCkkL2kudGVzdChwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBGaXJlZm94IHRocm93cyBhbiBlcnJvciBpZiAuZ2V0QkJveCgpIGlzIGNhbGxlZCBvbiBhbiBTVkcgdGhhdCBpc24ndCBhdHRhY2hlZCB0byB0aGUgRE9NLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gZWxlbWVudC5nZXRCQm94KClbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gMDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0LyogT3RoZXJ3aXNlLCBhY2Nlc3MgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBkaXJlY3RseS4gKi9cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUocHJvcGVydHkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gY29tcHV0ZVByb3BlcnR5VmFsdWUoZWxlbWVudCwgQ1NTLk5hbWVzLnByZWZpeENoZWNrKHByb3BlcnR5KVswXSk7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogU2luY2UgcHJvcGVydHkgbG9va3VwcyBhcmUgZm9yIGFuaW1hdGlvbiBwdXJwb3NlcyAod2hpY2ggZW50YWlscyBjb21wdXRpbmcgdGhlIG51bWVyaWMgZGVsdGEgYmV0d2VlbiBzdGFydCBhbmQgZW5kIHZhbHVlcyksXHJcblx0XHRcdFx0IGNvbnZlcnQgQ1NTIG51bGwtdmFsdWVzIHRvIGFuIGludGVnZXIgb2YgdmFsdWUgMC4gKi9cclxuXHRcdFx0XHRpZiAoQ1NTLlZhbHVlcy5pc0NTU051bGxWYWx1ZShwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IDA7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoVmVsb2NpdHkuZGVidWcgPj0gMikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coXCJHZXQgXCIgKyBwcm9wZXJ0eSArIFwiOiBcIiArIHByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIFRoZSBzaW5ndWxhciBzZXRQcm9wZXJ0eVZhbHVlLCB3aGljaCByb3V0ZXMgdGhlIGxvZ2ljIGZvciBhbGwgbm9ybWFsaXphdGlvbnMsIGhvb2tzLCBhbmQgc3RhbmRhcmQgQ1NTIHByb3BlcnRpZXMuICovXHJcblx0XHRcdHNldFByb3BlcnR5VmFsdWU6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5LCBwcm9wZXJ0eVZhbHVlLCByb290UHJvcGVydHlWYWx1ZSwgc2Nyb2xsRGF0YSkge1xyXG5cdFx0XHRcdHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eTtcclxuXHJcblx0XHRcdFx0LyogSW4gb3JkZXIgdG8gYmUgc3ViamVjdGVkIHRvIGNhbGwgb3B0aW9ucyBhbmQgZWxlbWVudCBxdWV1ZWluZywgc2Nyb2xsIGFuaW1hdGlvbiBpcyByb3V0ZWQgdGhyb3VnaCBWZWxvY2l0eSBhcyBpZiBpdCB3ZXJlIGEgc3RhbmRhcmQgQ1NTIHByb3BlcnR5LiAqL1xyXG5cdFx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gXCJzY3JvbGxcIikge1xyXG5cdFx0XHRcdFx0LyogSWYgYSBjb250YWluZXIgb3B0aW9uIGlzIHByZXNlbnQsIHNjcm9sbCB0aGUgY29udGFpbmVyIGluc3RlYWQgb2YgdGhlIGJyb3dzZXIgd2luZG93LiAqL1xyXG5cdFx0XHRcdFx0aWYgKHNjcm9sbERhdGEuY29udGFpbmVyKSB7XHJcblx0XHRcdFx0XHRcdHNjcm9sbERhdGEuY29udGFpbmVyW1wic2Nyb2xsXCIgKyBzY3JvbGxEYXRhLmRpcmVjdGlvbl0gPSBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHQvKiBPdGhlcndpc2UsIFZlbG9jaXR5IGRlZmF1bHRzIHRvIHNjcm9sbGluZyB0aGUgYnJvd3NlciB3aW5kb3cuICovXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRpZiAoc2Nyb2xsRGF0YS5kaXJlY3Rpb24gPT09IFwiTGVmdFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0d2luZG93LnNjcm9sbFRvKHByb3BlcnR5VmFsdWUsIHNjcm9sbERhdGEuYWx0ZXJuYXRlVmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zY3JvbGxUbyhzY3JvbGxEYXRhLmFsdGVybmF0ZVZhbHVlLCBwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvKiBUcmFuc2Zvcm1zICh0cmFuc2xhdGVYLCByb3RhdGVaLCBldGMuKSBhcmUgYXBwbGllZCB0byBhIHBlci1lbGVtZW50IHRyYW5zZm9ybUNhY2hlIG9iamVjdCwgd2hpY2ggaXMgbWFudWFsbHkgZmx1c2hlZCB2aWEgZmx1c2hUcmFuc2Zvcm1DYWNoZSgpLlxyXG5cdFx0XHRcdFx0IFRodXMsIGZvciBub3csIHdlIG1lcmVseSBjYWNoZSB0cmFuc2Zvcm1zIGJlaW5nIFNFVC4gKi9cclxuXHRcdFx0XHRcdGlmIChDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0gJiYgQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKFwibmFtZVwiLCBlbGVtZW50KSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xyXG5cdFx0XHRcdFx0XHQvKiBQZXJmb3JtIGEgbm9ybWFsaXphdGlvbiBpbmplY3Rpb24uICovXHJcblx0XHRcdFx0XHRcdC8qIE5vdGU6IFRoZSBub3JtYWxpemF0aW9uIGxvZ2ljIGhhbmRsZXMgdGhlIHRyYW5zZm9ybUNhY2hlIHVwZGF0aW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0oXCJpbmplY3RcIiwgZWxlbWVudCwgcHJvcGVydHlWYWx1ZSk7XHJcblxyXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eU5hbWUgPSBcInRyYW5zZm9ybVwiO1xyXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvKiBJbmplY3QgaG9va3MuICovXHJcblx0XHRcdFx0XHRcdGlmIChDU1MuSG9va3MucmVnaXN0ZXJlZFtwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgaG9va05hbWUgPSBwcm9wZXJ0eSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0aG9va1Jvb3QgPSBDU1MuSG9va3MuZ2V0Um9vdChwcm9wZXJ0eSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIGEgY2FjaGVkIHJvb3RQcm9wZXJ0eVZhbHVlIHdhcyBub3QgcHJvdmlkZWQsIHF1ZXJ5IHRoZSBET00gZm9yIHRoZSBob29rUm9vdCdzIGN1cnJlbnQgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSByb290UHJvcGVydHlWYWx1ZSB8fCBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBob29rUm9vdCk7IC8qIEdFVCAqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gQ1NTLkhvb2tzLmluamVjdFZhbHVlKGhvb2tOYW1lLCBwcm9wZXJ0eVZhbHVlLCByb290UHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHkgPSBob29rUm9vdDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogTm9ybWFsaXplIG5hbWVzIGFuZCB2YWx1ZXMuICovXHJcblx0XHRcdFx0XHRcdGlmIChDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKFwiaW5qZWN0XCIsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5ID0gQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKFwibmFtZVwiLCBlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogQXNzaWduIHRoZSBhcHByb3ByaWF0ZSB2ZW5kb3IgcHJlZml4IGJlZm9yZSBwZXJmb3JtaW5nIGFuIG9mZmljaWFsIHN0eWxlIHVwZGF0ZS4gKi9cclxuXHRcdFx0XHRcdFx0cHJvcGVydHlOYW1lID0gQ1NTLk5hbWVzLnByZWZpeENoZWNrKHByb3BlcnR5KVswXTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIEEgdHJ5L2NhdGNoIGlzIHVzZWQgZm9yIElFPD04LCB3aGljaCB0aHJvd3MgYW4gZXJyb3Igd2hlbiBcImludmFsaWRcIiBDU1MgdmFsdWVzIGFyZSBzZXQsIGUuZy4gYSBuZWdhdGl2ZSB3aWR0aC5cclxuXHRcdFx0XHRcdFx0IFRyeS9jYXRjaCBpcyBhdm9pZGVkIGZvciBvdGhlciBicm93c2VycyBzaW5jZSBpdCBpbmN1cnMgYSBwZXJmb3JtYW5jZSBvdmVyaGVhZC4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKElFIDw9IDgpIHtcclxuXHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZVtwcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFtcIiArIHByb3BlcnR5VmFsdWUgKyBcIl0gZm9yIFtcIiArIHByb3BlcnR5TmFtZSArIFwiXVwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0LyogU1ZHIGVsZW1lbnRzIGhhdmUgdGhlaXIgZGltZW5zaW9uYWwgcHJvcGVydGllcyAod2lkdGgsIGhlaWdodCwgeCwgeSwgY3gsIGV0Yy4pIGFwcGxpZWQgZGlyZWN0bHkgYXMgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGFzIHN0eWxlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBJRTggZG9lcyBub3Qgc3VwcG9ydCBTVkcgZWxlbWVudHMsIHNvIGl0J3Mgb2theSB0aGF0IHdlIHNraXAgaXQgZm9yIFNWRyBhbmltYXRpb24uICovXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YSAmJiBkYXRhLmlzU1ZHICYmIENTUy5OYW1lcy5TVkdBdHRyaWJ1dGUocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBGb3IgU1ZHIGF0dHJpYnV0ZXMsIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBuYW1lcyBhcmUgbmV2ZXIgdXNlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdC8qIE5vdGU6IE5vdCBhbGwgQ1NTIHByb3BlcnRpZXMgY2FuIGJlIGFuaW1hdGVkIHZpYSBhdHRyaWJ1dGVzLCBidXQgdGhlIGJyb3dzZXIgd29uJ3QgdGhyb3cgYW4gZXJyb3IgZm9yIHVuc3VwcG9ydGVkIHByb3BlcnRpZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShwcm9wZXJ0eSwgcHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGVbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoVmVsb2NpdHkuZGVidWcgPj0gMikge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiU2V0IFwiICsgcHJvcGVydHkgKyBcIiAoXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIik6IFwiICsgcHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIFJldHVybiB0aGUgbm9ybWFsaXplZCBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZSBpbiBjYXNlIHRoZSBjYWxsZXIgd2FudHMgdG8ga25vdyBob3cgdGhlc2UgdmFsdWVzIHdlcmUgbW9kaWZpZWQgYmVmb3JlIGJlaW5nIGFwcGxpZWQgdG8gdGhlIERPTS4gKi9cclxuXHRcdFx0XHRyZXR1cm4gW3Byb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZV07XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIFRvIGluY3JlYXNlIHBlcmZvcm1hbmNlIGJ5IGJhdGNoaW5nIHRyYW5zZm9ybSB1cGRhdGVzIGludG8gYSBzaW5nbGUgU0VULCB0cmFuc2Zvcm1zIGFyZSBub3QgZGlyZWN0bHkgYXBwbGllZCB0byBhbiBlbGVtZW50IHVudGlsIGZsdXNoVHJhbnNmb3JtQ2FjaGUoKSBpcyBjYWxsZWQuICovXHJcblx0XHRcdC8qIE5vdGU6IFZlbG9jaXR5IGFwcGxpZXMgdHJhbnNmb3JtIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IGFyZSBjaHJvbm9naWNhbGx5IGludHJvZHVjZWQgdG8gdGhlIGVsZW1lbnQncyBDU1Mgc3R5bGVzLiAqL1xyXG5cdFx0XHRmbHVzaFRyYW5zZm9ybUNhY2hlOiBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRcdFx0dmFyIHRyYW5zZm9ybVN0cmluZyA9IFwiXCIsXHJcblx0XHRcdFx0XHRcdGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHQvKiBDZXJ0YWluIGJyb3dzZXJzIHJlcXVpcmUgdGhhdCBTVkcgdHJhbnNmb3JtcyBiZSBhcHBsaWVkIGFzIGFuIGF0dHJpYnV0ZS4gSG93ZXZlciwgdGhlIFNWRyB0cmFuc2Zvcm0gYXR0cmlidXRlIHRha2VzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBDU1MncyB0cmFuc2Zvcm0gc3RyaW5nXHJcblx0XHRcdFx0ICh1bml0cyBhcmUgZHJvcHBlZCBhbmQsIGV4Y2VwdCBmb3Igc2tld1gvWSwgc3VicHJvcGVydGllcyBhcmUgbWVyZ2VkIGludG8gdGhlaXIgbWFzdGVyIHByb3BlcnR5IC0tIGUuZy4gc2NhbGVYIGFuZCBzY2FsZVkgYXJlIG1lcmdlZCBpbnRvIHNjYWxlKFggWSkuICovXHJcblx0XHRcdFx0aWYgKChJRSB8fCAoVmVsb2NpdHkuU3RhdGUuaXNBbmRyb2lkICYmICFWZWxvY2l0eS5TdGF0ZS5pc0Nocm9tZSkpICYmIGRhdGEgJiYgZGF0YS5pc1NWRykge1xyXG5cdFx0XHRcdFx0LyogU2luY2UgdHJhbnNmb3JtIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZWlyIHBhcmVudGhlc2VzLXdyYXBwZWQgZm9ybSwgd2UgdXNlIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHN0cmlwIG91dCB0aGVpciBudW1lcmljIHZhbHVlcy5cclxuXHRcdFx0XHRcdCBGdXJ0aGVyLCBTVkcgdHJhbnNmb3JtIHByb3BlcnRpZXMgb25seSB0YWtlIHVuaXRsZXNzIChyZXByZXNlbnRpbmcgcGl4ZWxzKSB2YWx1ZXMsIHNvIGl0J3Mgb2theSB0aGF0IHBhcnNlRmxvYXQoKSBzdHJpcHMgdGhlIHVuaXQgc3VmZml4ZWQgdG8gdGhlIGZsb2F0IHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0dmFyIGdldFRyYW5zZm9ybUZsb2F0ID0gZnVuY3Rpb24odHJhbnNmb3JtUHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgdHJhbnNmb3JtUHJvcGVydHkpKTtcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0LyogQ3JlYXRlIGFuIG9iamVjdCB0byBvcmdhbml6ZSBhbGwgdGhlIHRyYW5zZm9ybXMgdGhhdCB3ZSdsbCBhcHBseSB0byB0aGUgU1ZHIGVsZW1lbnQuIFRvIGtlZXAgdGhlIGxvZ2ljIHNpbXBsZSxcclxuXHRcdFx0XHRcdCB3ZSBwcm9jZXNzICphbGwqIHRyYW5zZm9ybSBwcm9wZXJ0aWVzIC0tIGV2ZW4gdGhvc2UgdGhhdCBtYXkgbm90IGJlIGV4cGxpY2l0bHkgYXBwbGllZCAoc2luY2UgdGhleSBkZWZhdWx0IHRvIHRoZWlyIHplcm8tdmFsdWVzIGFueXdheSkuICovXHJcblx0XHRcdFx0XHR2YXIgU1ZHVHJhbnNmb3JtcyA9IHtcclxuXHRcdFx0XHRcdFx0dHJhbnNsYXRlOiBbZ2V0VHJhbnNmb3JtRmxvYXQoXCJ0cmFuc2xhdGVYXCIpLCBnZXRUcmFuc2Zvcm1GbG9hdChcInRyYW5zbGF0ZVlcIildLFxyXG5cdFx0XHRcdFx0XHRza2V3WDogW2dldFRyYW5zZm9ybUZsb2F0KFwic2tld1hcIildLCBza2V3WTogW2dldFRyYW5zZm9ybUZsb2F0KFwic2tld1lcIildLFxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgc2NhbGUgcHJvcGVydHkgaXMgc2V0IChub24tMSksIHVzZSB0aGF0IHZhbHVlIGZvciB0aGUgc2NhbGVYIGFuZCBzY2FsZVkgdmFsdWVzXHJcblx0XHRcdFx0XHRcdCAodGhpcyBiZWhhdmlvciBtaW1pY3MgdGhlIHJlc3VsdCBvZiBhbmltYXRpbmcgYWxsIHRoZXNlIHByb3BlcnRpZXMgYXQgb25jZSBvbiBIVE1MIGVsZW1lbnRzKS4gKi9cclxuXHRcdFx0XHRcdFx0c2NhbGU6IGdldFRyYW5zZm9ybUZsb2F0KFwic2NhbGVcIikgIT09IDEgPyBbZ2V0VHJhbnNmb3JtRmxvYXQoXCJzY2FsZVwiKSwgZ2V0VHJhbnNmb3JtRmxvYXQoXCJzY2FsZVwiKV0gOiBbZ2V0VHJhbnNmb3JtRmxvYXQoXCJzY2FsZVhcIiksIGdldFRyYW5zZm9ybUZsb2F0KFwic2NhbGVZXCIpXSxcclxuXHRcdFx0XHRcdFx0LyogTm90ZTogU1ZHJ3Mgcm90YXRlIHRyYW5zZm9ybSB0YWtlcyB0aHJlZSB2YWx1ZXM6IHJvdGF0aW9uIGRlZ3JlZXMgZm9sbG93ZWQgYnkgdGhlIFggYW5kIFkgdmFsdWVzXHJcblx0XHRcdFx0XHRcdCBkZWZpbmluZyB0aGUgcm90YXRpb24ncyBvcmlnaW4gcG9pbnQuIFdlIGlnbm9yZSB0aGUgb3JpZ2luIHZhbHVlcyAoZGVmYXVsdCB0aGVtIHRvIDApLiAqL1xyXG5cdFx0XHRcdFx0XHRyb3RhdGU6IFtnZXRUcmFuc2Zvcm1GbG9hdChcInJvdGF0ZVpcIiksIDAsIDBdXHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdHJhbnNmb3JtIHByb3BlcnRpZXMgaW4gdGhlIHVzZXItZGVmaW5lZCBwcm9wZXJ0eSBtYXAgb3JkZXIuXHJcblx0XHRcdFx0XHQgKFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZiBub24tU1ZHIHRyYW5zZm9ybSBhbmltYXRpb24uKSAqL1xyXG5cdFx0XHRcdFx0JC5lYWNoKERhdGEoZWxlbWVudCkudHJhbnNmb3JtQ2FjaGUsIGZ1bmN0aW9uKHRyYW5zZm9ybU5hbWUpIHtcclxuXHRcdFx0XHRcdFx0LyogRXhjZXB0IGZvciB3aXRoIHNrZXdYL1ksIHJldmVydCB0aGUgYXhpcy1zcGVjaWZpYyB0cmFuc2Zvcm0gc3VicHJvcGVydGllcyB0byB0aGVpciBheGlzLWZyZWUgbWFzdGVyXHJcblx0XHRcdFx0XHRcdCBwcm9wZXJ0aWVzIHNvIHRoYXQgdGhleSBtYXRjaCB1cCB3aXRoIFNWRydzIGFjY2VwdGVkIHRyYW5zZm9ybSBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoL150cmFuc2xhdGUvaS50ZXN0KHRyYW5zZm9ybU5hbWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtTmFtZSA9IFwidHJhbnNsYXRlXCI7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoL15zY2FsZS9pLnRlc3QodHJhbnNmb3JtTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm1OYW1lID0gXCJzY2FsZVwiO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKC9ecm90YXRlL2kudGVzdCh0cmFuc2Zvcm1OYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRcdHRyYW5zZm9ybU5hbWUgPSBcInJvdGF0ZVwiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBDaGVjayB0aGF0IHdlIGhhdmVuJ3QgeWV0IGRlbGV0ZWQgdGhlIHByb3BlcnR5IGZyb20gdGhlIFNWR1RyYW5zZm9ybXMgY29udGFpbmVyLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoU1ZHVHJhbnNmb3Jtc1t0cmFuc2Zvcm1OYW1lXSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIEFwcGVuZCB0aGUgdHJhbnNmb3JtIHByb3BlcnR5IGluIHRoZSBTVkctc3VwcG9ydGVkIHRyYW5zZm9ybSBmb3JtYXQuIEFzIHBlciB0aGUgc3BlYywgc3Vycm91bmQgdGhlIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgaW4gcGFyZW50aGVzZXMuICovXHJcblx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtU3RyaW5nICs9IHRyYW5zZm9ybU5hbWUgKyBcIihcIiArIFNWR1RyYW5zZm9ybXNbdHJhbnNmb3JtTmFtZV0uam9pbihcIiBcIikgKyBcIilcIiArIFwiIFwiO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBBZnRlciBwcm9jZXNzaW5nIGFuIFNWRyB0cmFuc2Zvcm0gcHJvcGVydHksIGRlbGV0ZSBpdCBmcm9tIHRoZSBTVkdUcmFuc2Zvcm1zIGNvbnRhaW5lciBzbyB3ZSBkb24ndFxyXG5cdFx0XHRcdFx0XHRcdCByZS1pbnNlcnQgdGhlIHNhbWUgbWFzdGVyIHByb3BlcnR5IGlmIHdlIGVuY291bnRlciBhbm90aGVyIG9uZSBvZiBpdHMgYXhpcy1zcGVjaWZpYyBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBTVkdUcmFuc2Zvcm1zW3RyYW5zZm9ybU5hbWVdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dmFyIHRyYW5zZm9ybVZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdHBlcnNwZWN0aXZlO1xyXG5cclxuXHRcdFx0XHRcdC8qIFRyYW5zZm9ybSBwcm9wZXJ0aWVzIGFyZSBzdG9yZWQgYXMgbWVtYmVycyBvZiB0aGUgdHJhbnNmb3JtQ2FjaGUgb2JqZWN0LiBDb25jYXRlbmF0ZSBhbGwgdGhlIG1lbWJlcnMgaW50byBhIHN0cmluZy4gKi9cclxuXHRcdFx0XHRcdCQuZWFjaChEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlLCBmdW5jdGlvbih0cmFuc2Zvcm1OYW1lKSB7XHJcblx0XHRcdFx0XHRcdHRyYW5zZm9ybVZhbHVlID0gRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIFRyYW5zZm9ybSdzIHBlcnNwZWN0aXZlIHN1YnByb3BlcnR5IG11c3QgYmUgc2V0IGZpcnN0IGluIG9yZGVyIHRvIHRha2UgZWZmZWN0LiBTdG9yZSBpdCB0ZW1wb3JhcmlseS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKHRyYW5zZm9ybU5hbWUgPT09IFwidHJhbnNmb3JtUGVyc3BlY3RpdmVcIikge1xyXG5cdFx0XHRcdFx0XHRcdHBlcnNwZWN0aXZlID0gdHJhbnNmb3JtVmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIElFOSBvbmx5IHN1cHBvcnRzIG9uZSByb3RhdGlvbiB0eXBlLCByb3RhdGVaLCB3aGljaCBpdCByZWZlcnMgdG8gYXMgXCJyb3RhdGVcIi4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKElFID09PSA5ICYmIHRyYW5zZm9ybU5hbWUgPT09IFwicm90YXRlWlwiKSB7XHJcblx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtTmFtZSA9IFwicm90YXRlXCI7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHRyYW5zZm9ybVN0cmluZyArPSB0cmFuc2Zvcm1OYW1lICsgdHJhbnNmb3JtVmFsdWUgKyBcIiBcIjtcclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdC8qIElmIHByZXNlbnQsIHNldCB0aGUgcGVyc3BlY3RpdmUgc3VicHJvcGVydHkgZmlyc3QuICovXHJcblx0XHRcdFx0XHRpZiAocGVyc3BlY3RpdmUpIHtcclxuXHRcdFx0XHRcdFx0dHJhbnNmb3JtU3RyaW5nID0gXCJwZXJzcGVjdGl2ZVwiICsgcGVyc3BlY3RpdmUgKyBcIiBcIiArIHRyYW5zZm9ybVN0cmluZztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybVN0cmluZyk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0LyogUmVnaXN0ZXIgaG9va3MgYW5kIG5vcm1hbGl6YXRpb25zLiAqL1xyXG5cdFx0Q1NTLkhvb2tzLnJlZ2lzdGVyKCk7XHJcblx0XHRDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXIoKTtcclxuXHJcblx0XHQvKiBBbGxvdyBob29rIHNldHRpbmcgaW4gdGhlIHNhbWUgZmFzaGlvbiBhcyBqUXVlcnkncyAkLmNzcygpLiAqL1xyXG5cdFx0VmVsb2NpdHkuaG9vayA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBhcmcyLCBhcmczKSB7XHJcblx0XHRcdHZhciB2YWx1ZTtcclxuXHJcblx0XHRcdGVsZW1lbnRzID0gc2FuaXRpemVFbGVtZW50cyhlbGVtZW50cyk7XHJcblxyXG5cdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGksIGVsZW1lbnQpIHtcclxuXHRcdFx0XHQvKiBJbml0aWFsaXplIFZlbG9jaXR5J3MgcGVyLWVsZW1lbnQgZGF0YSBjYWNoZSBpZiB0aGlzIGVsZW1lbnQgaGFzbid0IHByZXZpb3VzbHkgYmVlbiBhbmltYXRlZC4gKi9cclxuXHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRWZWxvY2l0eS5pbml0KGVsZW1lbnQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogR2V0IHByb3BlcnR5IHZhbHVlLiBJZiBhbiBlbGVtZW50IHNldCB3YXMgcGFzc2VkIGluLCBvbmx5IHJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBmaXJzdCBlbGVtZW50LiAqL1xyXG5cdFx0XHRcdGlmIChhcmczID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdHZhbHVlID0gQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgYXJnMik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvKiBTZXQgcHJvcGVydHkgdmFsdWUuICovXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8qIHNQViByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBub3JtYWxpemVkIHByb3BlcnR5TmFtZS9wcm9wZXJ0eVZhbHVlIHBhaXIgdXNlZCB0byB1cGRhdGUgdGhlIERPTS4gKi9cclxuXHRcdFx0XHRcdHZhciBhZGp1c3RlZFNldCA9IENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIGFyZzIsIGFyZzMpO1xyXG5cclxuXHRcdFx0XHRcdC8qIFRyYW5zZm9ybSBwcm9wZXJ0aWVzIGRvbid0IGF1dG9tYXRpY2FsbHkgc2V0LiBUaGV5IGhhdmUgdG8gYmUgZmx1c2hlZCB0byB0aGUgRE9NLiAqL1xyXG5cdFx0XHRcdFx0aWYgKGFkanVzdGVkU2V0WzBdID09PSBcInRyYW5zZm9ybVwiKSB7XHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5mbHVzaFRyYW5zZm9ybUNhY2hlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhbHVlID0gYWRqdXN0ZWRTZXQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdH07XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqKioqXHJcblx0XHQgQW5pbWF0aW9uXHJcblx0XHQgKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0dmFyIGFuaW1hdGUgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG9wdHM7XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBDYWxsIENoYWluXHJcblx0XHRcdCAqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBMb2dpYyBmb3IgZGV0ZXJtaW5pbmcgd2hhdCB0byByZXR1cm4gdG8gdGhlIGNhbGwgc3RhY2sgd2hlbiBleGl0aW5nIG91dCBvZiBWZWxvY2l0eS4gKi9cclxuXHRcdFx0ZnVuY3Rpb24gZ2V0Q2hhaW4oKSB7XHJcblx0XHRcdFx0LyogSWYgd2UgYXJlIHVzaW5nIHRoZSB1dGlsaXR5IGZ1bmN0aW9uLCBhdHRlbXB0IHRvIHJldHVybiB0aGlzIGNhbGwncyBwcm9taXNlLiBJZiBubyBwcm9taXNlIGxpYnJhcnkgd2FzIGRldGVjdGVkLFxyXG5cdFx0XHRcdCBkZWZhdWx0IHRvIG51bGwgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHRhcmdldGVkIGVsZW1lbnRzIHNvIHRoYXQgdXRpbGl0eSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBpcyBzdGFuZGFyZGl6ZWQuICovXHJcblx0XHRcdFx0aWYgKGlzVXRpbGl0eSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2VEYXRhLnByb21pc2UgfHwgbnVsbDtcclxuXHRcdFx0XHRcdC8qIE90aGVyd2lzZSwgaWYgd2UncmUgdXNpbmcgJC5mbiwgcmV0dXJuIHRoZSBqUXVlcnktL1plcHRvLXdyYXBwZWQgZWxlbWVudCBzZXQuICovXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50c1dyYXBwZWQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHQgQXJndW1lbnRzIEFzc2lnbm1lbnRcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBUbyBhbGxvdyBmb3IgZXhwcmVzc2l2ZSBDb2ZmZWVTY3JpcHQgY29kZSwgVmVsb2NpdHkgc3VwcG9ydHMgYW4gYWx0ZXJuYXRpdmUgc3ludGF4IGluIHdoaWNoIFwiZWxlbWVudHNcIiAob3IgXCJlXCIpLCBcInByb3BlcnRpZXNcIiAob3IgXCJwXCIpLCBhbmQgXCJvcHRpb25zXCIgKG9yIFwib1wiKVxyXG5cdFx0XHQgb2JqZWN0cyBhcmUgZGVmaW5lZCBvbiBhIGNvbnRhaW5lciBvYmplY3QgdGhhdCdzIHBhc3NlZCBpbiBhcyBWZWxvY2l0eSdzIHNvbGUgYXJndW1lbnQuICovXHJcblx0XHRcdC8qIE5vdGU6IFNvbWUgYnJvd3NlcnMgYXV0b21hdGljYWxseSBwb3B1bGF0ZSBhcmd1bWVudHMgd2l0aCBhIFwicHJvcGVydGllc1wiIG9iamVjdC4gV2UgZGV0ZWN0IGl0IGJ5IGNoZWNraW5nIGZvciBpdHMgZGVmYXVsdCBcIm5hbWVzXCIgcHJvcGVydHkuICovXHJcblx0XHRcdHZhciBzeW50YWN0aWNTdWdhciA9IChhcmd1bWVudHNbMF0gJiYgKGFyZ3VtZW50c1swXS5wIHx8ICgoJC5pc1BsYWluT2JqZWN0KGFyZ3VtZW50c1swXS5wcm9wZXJ0aWVzKSAmJiAhYXJndW1lbnRzWzBdLnByb3BlcnRpZXMubmFtZXMpIHx8IFR5cGUuaXNTdHJpbmcoYXJndW1lbnRzWzBdLnByb3BlcnRpZXMpKSkpLFxyXG5cdFx0XHRcdFx0LyogV2hldGhlciBWZWxvY2l0eSB3YXMgY2FsbGVkIHZpYSB0aGUgdXRpbGl0eSBmdW5jdGlvbiAoYXMgb3Bwb3NlZCB0byBvbiBhIGpRdWVyeS9aZXB0byBvYmplY3QpLiAqL1xyXG5cdFx0XHRcdFx0aXNVdGlsaXR5LFxyXG5cdFx0XHRcdFx0LyogV2hlbiBWZWxvY2l0eSBpcyBjYWxsZWQgdmlhIHRoZSB1dGlsaXR5IGZ1bmN0aW9uICgkLlZlbG9jaXR5KCkvVmVsb2NpdHkoKSksIGVsZW1lbnRzIGFyZSBleHBsaWNpdGx5XHJcblx0XHRcdFx0XHQgcGFzc2VkIGluIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIFRodXMsIGFyZ3VtZW50IHBvc2l0aW9uaW5nIHZhcmllcy4gV2Ugbm9ybWFsaXplIHRoZW0gaGVyZS4gKi9cclxuXHRcdFx0XHRcdGVsZW1lbnRzV3JhcHBlZCxcclxuXHRcdFx0XHRcdGFyZ3VtZW50SW5kZXg7XHJcblxyXG5cdFx0XHR2YXIgZWxlbWVudHMsXHJcblx0XHRcdFx0XHRwcm9wZXJ0aWVzTWFwLFxyXG5cdFx0XHRcdFx0b3B0aW9ucztcclxuXHJcblx0XHRcdC8qIERldGVjdCBqUXVlcnkvWmVwdG8gZWxlbWVudHMgYmVpbmcgYW5pbWF0ZWQgdmlhIHRoZSAkLmZuIG1ldGhvZC4gKi9cclxuXHRcdFx0aWYgKFR5cGUuaXNXcmFwcGVkKHRoaXMpKSB7XHJcblx0XHRcdFx0aXNVdGlsaXR5ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdGFyZ3VtZW50SW5kZXggPSAwO1xyXG5cdFx0XHRcdGVsZW1lbnRzID0gdGhpcztcclxuXHRcdFx0XHRlbGVtZW50c1dyYXBwZWQgPSB0aGlzO1xyXG5cdFx0XHRcdC8qIE90aGVyd2lzZSwgcmF3IGVsZW1lbnRzIGFyZSBiZWluZyBhbmltYXRlZCB2aWEgdGhlIHV0aWxpdHkgZnVuY3Rpb24uICovXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aXNVdGlsaXR5ID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0YXJndW1lbnRJbmRleCA9IDE7XHJcblx0XHRcdFx0ZWxlbWVudHMgPSBzeW50YWN0aWNTdWdhciA/IChhcmd1bWVudHNbMF0uZWxlbWVudHMgfHwgYXJndW1lbnRzWzBdLmUpIDogYXJndW1lbnRzWzBdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqXHJcblx0XHRcdCBQcm9taXNlc1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0dmFyIHByb21pc2VEYXRhID0ge1xyXG5cdFx0XHRcdHByb21pc2U6IG51bGwsXHJcblx0XHRcdFx0cmVzb2x2ZXI6IG51bGwsXHJcblx0XHRcdFx0cmVqZWN0ZXI6IG51bGxcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdC8qIElmIHRoaXMgY2FsbCB3YXMgbWFkZSB2aWEgdGhlIHV0aWxpdHkgZnVuY3Rpb24gKHdoaWNoIGlzIHRoZSBkZWZhdWx0IG1ldGhvZCBvZiBpbnZvY2F0aW9uIHdoZW4galF1ZXJ5L1plcHRvIGFyZSBub3QgYmVpbmcgdXNlZCksIGFuZCBpZlxyXG5cdFx0XHQgcHJvbWlzZSBzdXBwb3J0IHdhcyBkZXRlY3RlZCwgY3JlYXRlIGEgcHJvbWlzZSBvYmplY3QgZm9yIHRoaXMgY2FsbCBhbmQgc3RvcmUgcmVmZXJlbmNlcyB0byBpdHMgcmVzb2x2ZXIgYW5kIHJlamVjdGVyIG1ldGhvZHMuIFRoZSByZXNvbHZlXHJcblx0XHRcdCBtZXRob2QgaXMgdXNlZCB3aGVuIGEgY2FsbCBjb21wbGV0ZXMgbmF0dXJhbGx5IG9yIGlzIHByZW1hdHVyZWx5IHN0b3BwZWQgYnkgdGhlIHVzZXIuIEluIGJvdGggY2FzZXMsIGNvbXBsZXRlQ2FsbCgpIGhhbmRsZXMgdGhlIGFzc29jaWF0ZWRcclxuXHRcdFx0IGNhbGwgY2xlYW51cCBhbmQgcHJvbWlzZSByZXNvbHZpbmcgbG9naWMuIFRoZSByZWplY3QgbWV0aG9kIGlzIHVzZWQgd2hlbiBhbiBpbnZhbGlkIHNldCBvZiBhcmd1bWVudHMgaXMgcGFzc2VkIGludG8gYSBWZWxvY2l0eSBjYWxsLiAqL1xyXG5cdFx0XHQvKiBOb3RlOiBWZWxvY2l0eSBlbXBsb3lzIGEgY2FsbC1iYXNlZCBxdWV1ZWluZyBhcmNoaXRlY3R1cmUsIHdoaWNoIG1lYW5zIHRoYXQgc3RvcHBpbmcgYW4gYW5pbWF0aW5nIGVsZW1lbnQgYWN0dWFsbHkgc3RvcHMgdGhlIGZ1bGwgY2FsbCB0aGF0XHJcblx0XHRcdCB0cmlnZ2VyZWQgaXQgLS0gbm90IHRoYXQgb25lIGVsZW1lbnQgZXhjbHVzaXZlbHkuIFNpbWlsYXJseSwgdGhlcmUgaXMgb25lIHByb21pc2UgcGVyIGNhbGwsIGFuZCBhbGwgZWxlbWVudHMgdGFyZ2V0ZWQgYnkgYSBWZWxvY2l0eSBjYWxsIGFyZVxyXG5cdFx0XHQgZ3JvdXBlZCB0b2dldGhlciBmb3IgdGhlIHB1cnBvc2VzIG9mIHJlc29sdmluZyBhbmQgcmVqZWN0aW5nIGEgcHJvbWlzZS4gKi9cclxuXHRcdFx0aWYgKGlzVXRpbGl0eSAmJiBWZWxvY2l0eS5Qcm9taXNlKSB7XHJcblx0XHRcdFx0cHJvbWlzZURhdGEucHJvbWlzZSA9IG5ldyBWZWxvY2l0eS5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cdFx0XHRcdFx0cHJvbWlzZURhdGEucmVzb2x2ZXIgPSByZXNvbHZlO1xyXG5cdFx0XHRcdFx0cHJvbWlzZURhdGEucmVqZWN0ZXIgPSByZWplY3Q7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChzeW50YWN0aWNTdWdhcikge1xyXG5cdFx0XHRcdHByb3BlcnRpZXNNYXAgPSBhcmd1bWVudHNbMF0ucHJvcGVydGllcyB8fCBhcmd1bWVudHNbMF0ucDtcclxuXHRcdFx0XHRvcHRpb25zID0gYXJndW1lbnRzWzBdLm9wdGlvbnMgfHwgYXJndW1lbnRzWzBdLm87XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cHJvcGVydGllc01hcCA9IGFyZ3VtZW50c1thcmd1bWVudEluZGV4XTtcclxuXHRcdFx0XHRvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50SW5kZXggKyAxXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZWxlbWVudHMgPSBzYW5pdGl6ZUVsZW1lbnRzKGVsZW1lbnRzKTtcclxuXHJcblx0XHRcdGlmICghZWxlbWVudHMpIHtcclxuXHRcdFx0XHRpZiAocHJvbWlzZURhdGEucHJvbWlzZSkge1xyXG5cdFx0XHRcdFx0aWYgKCFwcm9wZXJ0aWVzTWFwIHx8ICFvcHRpb25zIHx8IG9wdGlvbnMucHJvbWlzZVJlamVjdEVtcHR5ICE9PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0XHRwcm9taXNlRGF0YS5yZWplY3RlcigpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cHJvbWlzZURhdGEucmVzb2x2ZXIoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBUaGUgbGVuZ3RoIG9mIHRoZSBlbGVtZW50IHNldCAoaW4gdGhlIGZvcm0gb2YgYSBub2RlTGlzdCBvciBhbiBhcnJheSBvZiBlbGVtZW50cykgaXMgZGVmYXVsdGVkIHRvIDEgaW4gY2FzZSBhXHJcblx0XHRcdCBzaW5nbGUgcmF3IERPTSBlbGVtZW50IGlzIHBhc3NlZCBpbiAod2hpY2ggZG9lc24ndCBjb250YWluIGEgbGVuZ3RoIHByb3BlcnR5KS4gKi9cclxuXHRcdFx0dmFyIGVsZW1lbnRzTGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoLFxyXG5cdFx0XHRcdFx0ZWxlbWVudHNJbmRleCA9IDA7XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBBcmd1bWVudCBPdmVybG9hZGluZ1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogU3VwcG9ydCBpcyBpbmNsdWRlZCBmb3IgalF1ZXJ5J3MgYXJndW1lbnQgb3ZlcmxvYWRpbmc6ICQuYW5pbWF0ZShwcm9wZXJ0eU1hcCBbLCBkdXJhdGlvbl0gWywgZWFzaW5nXSBbLCBjb21wbGV0ZV0pLlxyXG5cdFx0XHQgT3ZlcmxvYWRpbmcgaXMgZGV0ZWN0ZWQgYnkgY2hlY2tpbmcgZm9yIHRoZSBhYnNlbmNlIG9mIGFuIG9iamVjdCBiZWluZyBwYXNzZWQgaW50byBvcHRpb25zLiAqL1xyXG5cdFx0XHQvKiBOb3RlOiBUaGUgc3RvcC9maW5pc2gvcGF1c2UvcmVzdW1lIGFjdGlvbnMgZG8gbm90IGFjY2VwdCBhbmltYXRpb24gb3B0aW9ucywgYW5kIGFyZSB0aGVyZWZvcmUgZXhjbHVkZWQgZnJvbSB0aGlzIGNoZWNrLiAqL1xyXG5cdFx0XHRpZiAoIS9eKHN0b3B8ZmluaXNofGZpbmlzaEFsbHxwYXVzZXxyZXN1bWUpJC9pLnRlc3QocHJvcGVydGllc01hcCkgJiYgISQuaXNQbGFpbk9iamVjdChvcHRpb25zKSkge1xyXG5cdFx0XHRcdC8qIFRoZSB1dGlsaXR5IGZ1bmN0aW9uIHNoaWZ0cyBhbGwgYXJndW1lbnRzIG9uZSBwb3NpdGlvbiB0byB0aGUgcmlnaHQsIHNvIHdlIGFkanVzdCBmb3IgdGhhdCBvZmZzZXQuICovXHJcblx0XHRcdFx0dmFyIHN0YXJ0aW5nQXJndW1lbnRQb3NpdGlvbiA9IGFyZ3VtZW50SW5kZXggKyAxO1xyXG5cclxuXHRcdFx0XHRvcHRpb25zID0ge307XHJcblxyXG5cdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb3B0aW9ucyBhcmd1bWVudHMgKi9cclxuXHRcdFx0XHRmb3IgKHZhciBpID0gc3RhcnRpbmdBcmd1bWVudFBvc2l0aW9uOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHQvKiBUcmVhdCBhIG51bWJlciBhcyBhIGR1cmF0aW9uLiBQYXJzZSBpdCBvdXQuICovXHJcblx0XHRcdFx0XHQvKiBOb3RlOiBUaGUgZm9sbG93aW5nIFJlZ0V4IHdpbGwgcmV0dXJuIHRydWUgaWYgcGFzc2VkIGFuIGFycmF5IHdpdGggYSBudW1iZXIgYXMgaXRzIGZpcnN0IGl0ZW0uXHJcblx0XHRcdFx0XHQgVGh1cywgYXJyYXlzIGFyZSBza2lwcGVkIGZyb20gdGhpcyBjaGVjay4gKi9cclxuXHRcdFx0XHRcdGlmICghVHlwZS5pc0FycmF5KGFyZ3VtZW50c1tpXSkgJiYgKC9eKGZhc3R8bm9ybWFsfHNsb3cpJC9pLnRlc3QoYXJndW1lbnRzW2ldKSB8fCAvXlxcZC8udGVzdChhcmd1bWVudHNbaV0pKSkge1xyXG5cdFx0XHRcdFx0XHRvcHRpb25zLmR1cmF0aW9uID0gYXJndW1lbnRzW2ldO1xyXG5cdFx0XHRcdFx0XHQvKiBUcmVhdCBzdHJpbmdzIGFuZCBhcnJheXMgYXMgZWFzaW5ncy4gKi9cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc1N0cmluZyhhcmd1bWVudHNbaV0pIHx8IFR5cGUuaXNBcnJheShhcmd1bWVudHNbaV0pKSB7XHJcblx0XHRcdFx0XHRcdG9wdGlvbnMuZWFzaW5nID0gYXJndW1lbnRzW2ldO1xyXG5cdFx0XHRcdFx0XHQvKiBUcmVhdCBhIGZ1bmN0aW9uIGFzIGEgY29tcGxldGUgY2FsbGJhY2suICovXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNGdW5jdGlvbihhcmd1bWVudHNbaV0pKSB7XHJcblx0XHRcdFx0XHRcdG9wdGlvbnMuY29tcGxldGUgPSBhcmd1bWVudHNbaV07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBBY3Rpb24gRGV0ZWN0aW9uXHJcblx0XHRcdCAqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBWZWxvY2l0eSdzIGJlaGF2aW9yIGlzIGNhdGVnb3JpemVkIGludG8gXCJhY3Rpb25zXCI6IEVsZW1lbnRzIGNhbiBlaXRoZXIgYmUgc3BlY2lhbGx5IHNjcm9sbGVkIGludG8gdmlldyxcclxuXHRcdFx0IG9yIHRoZXkgY2FuIGJlIHN0YXJ0ZWQsIHN0b3BwZWQsIHBhdXNlZCwgcmVzdW1lZCwgb3IgcmV2ZXJzZWQgLiBJZiBhIGxpdGVyYWwgb3IgcmVmZXJlbmNlZCBwcm9wZXJ0aWVzIG1hcCBpcyBwYXNzZWQgaW4gYXMgVmVsb2NpdHknc1xyXG5cdFx0XHQgZmlyc3QgYXJndW1lbnQsIHRoZSBhc3NvY2lhdGVkIGFjdGlvbiBpcyBcInN0YXJ0XCIuIEFsdGVybmF0aXZlbHksIFwic2Nyb2xsXCIsIFwicmV2ZXJzZVwiLCBcInBhdXNlXCIsIFwicmVzdW1lXCIgb3IgXCJzdG9wXCIgY2FuIGJlIHBhc3NlZCBpbiBcclxuXHRcdFx0IGluc3RlYWQgb2YgYSBwcm9wZXJ0aWVzIG1hcC4gKi9cclxuXHRcdFx0dmFyIGFjdGlvbjtcclxuXHJcblx0XHRcdHN3aXRjaCAocHJvcGVydGllc01hcCkge1xyXG5cdFx0XHRcdGNhc2UgXCJzY3JvbGxcIjpcclxuXHRcdFx0XHRcdGFjdGlvbiA9IFwic2Nyb2xsXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBcInJldmVyc2VcIjpcclxuXHRcdFx0XHRcdGFjdGlvbiA9IFwicmV2ZXJzZVwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgXCJwYXVzZVwiOlxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgQWN0aW9uOiBQYXVzZVxyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcclxuXHJcblx0XHRcdFx0XHQvKiBIYW5kbGUgZGVsYXkgdGltZXJzICovXHJcblx0XHRcdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGksIGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0cGF1c2VEZWxheU9uRWxlbWVudChlbGVtZW50LCBjdXJyZW50VGltZSk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHQvKiBQYXVzZSBhbmQgUmVzdW1lIGFyZSBjYWxsLXdpZGUgKG5vdCBvbiBhIHBlciBlbGVtZW50IGJhc2lzKS4gVGh1cywgY2FsbGluZyBwYXVzZSBvciByZXN1bWUgb24gYSBcclxuXHRcdFx0XHRcdCBzaW5nbGUgZWxlbWVudCB3aWxsIGNhdXNlIGFueSBjYWxscyB0aGF0IGNvbnRhaW50IHR3ZWVucyBmb3IgdGhhdCBlbGVtZW50IHRvIGJlIHBhdXNlZC9yZXN1bWVkXHJcblx0XHRcdFx0XHQgYXMgd2VsbC4gKi9cclxuXHJcblx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggYWxsIGNhbGxzIGFuZCBwYXVzZSBhbnkgdGhhdCBjb250YWluIGFueSBvZiBvdXIgZWxlbWVudHMgKi9cclxuXHRcdFx0XHRcdCQuZWFjaChWZWxvY2l0eS5TdGF0ZS5jYWxscywgZnVuY3Rpb24oaSwgYWN0aXZlQ2FsbCkge1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGZvdW5kID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdC8qIEluYWN0aXZlIGNhbGxzIGFyZSBzZXQgdG8gZmFsc2UgYnkgdGhlIGxvZ2ljIGluc2lkZSBjb21wbGV0ZUNhbGwoKS4gU2tpcCB0aGVtLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoYWN0aXZlQ2FsbCkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYWN0aXZlIGNhbGwncyB0YXJnZXRlZCBlbGVtZW50cy4gKi9cclxuXHRcdFx0XHRcdFx0XHQkLmVhY2goYWN0aXZlQ2FsbFsxXSwgZnVuY3Rpb24oaywgYWN0aXZlRWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIHF1ZXVlTmFtZSA9IChvcHRpb25zID09PSB1bmRlZmluZWQpID8gXCJcIiA6IG9wdGlvbnM7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHF1ZXVlTmFtZSAhPT0gdHJ1ZSAmJiAoYWN0aXZlQ2FsbFsyXS5xdWV1ZSAhPT0gcXVldWVOYW1lKSAmJiAhKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiBhY3RpdmVDYWxsWzJdLnF1ZXVlID09PSBmYWxzZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBjYWxscyB0YXJnZXRlZCBieSB0aGUgc3RvcCBjb21tYW5kLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihsLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIENoZWNrIHRoYXQgdGhpcyBjYWxsIHdhcyBhcHBsaWVkIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQpIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogU2V0IGNhbGwgdG8gcGF1c2VkICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aXZlQ2FsbFs1XSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VtZTogZmFsc2VcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBPbmNlIHdlIG1hdGNoIGFuIGVsZW1lbnQsIHdlIGNhbiBib3VuY2Ugb3V0IHRvIHRoZSBuZXh0IGNhbGwgZW50aXJlbHkgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBQcm9jZWVkIHRvIGNoZWNrIG5leHQgY2FsbCBpZiB3ZSBoYXZlIGFscmVhZHkgbWF0Y2hlZCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGZvdW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdC8qIFNpbmNlIHBhdXNlIGNyZWF0ZXMgbm8gbmV3IHR3ZWVucywgZXhpdCBvdXQgb2YgVmVsb2NpdHkuICovXHJcblx0XHRcdFx0XHRyZXR1cm4gZ2V0Q2hhaW4oKTtcclxuXHJcblx0XHRcdFx0Y2FzZSBcInJlc3VtZVwiOlxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgQWN0aW9uOiBSZXN1bWVcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIEhhbmRsZSBkZWxheSB0aW1lcnMgKi9cclxuXHRcdFx0XHRcdCQuZWFjaChlbGVtZW50cywgZnVuY3Rpb24oaSwgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bWVEZWxheU9uRWxlbWVudChlbGVtZW50LCBjdXJyZW50VGltZSk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHQvKiBQYXVzZSBhbmQgUmVzdW1lIGFyZSBjYWxsLXdpZGUgKG5vdCBvbiBhIHBlciBlbGVtbnQgYmFzaXMpLiBUaHVzLCBjYWxsaW5nIHBhdXNlIG9yIHJlc3VtZSBvbiBhIFxyXG5cdFx0XHRcdFx0IHNpbmdsZSBlbGVtZW50IHdpbGwgY2F1c2UgYW55IGNhbGxzIHRoYXQgY29udGFpbnQgdHdlZW5zIGZvciB0aGF0IGVsZW1lbnQgdG8gYmUgcGF1c2VkL3Jlc3VtZWRcclxuXHRcdFx0XHRcdCBhcyB3ZWxsLiAqL1xyXG5cclxuXHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgY2FsbHMgYW5kIHBhdXNlIGFueSB0aGF0IGNvbnRhaW4gYW55IG9mIG91ciBlbGVtZW50cyAqL1xyXG5cdFx0XHRcdFx0JC5lYWNoKFZlbG9jaXR5LlN0YXRlLmNhbGxzLCBmdW5jdGlvbihpLCBhY3RpdmVDYWxsKSB7XHJcblx0XHRcdFx0XHRcdHZhciBmb3VuZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHQvKiBJbmFjdGl2ZSBjYWxscyBhcmUgc2V0IHRvIGZhbHNlIGJ5IHRoZSBsb2dpYyBpbnNpZGUgY29tcGxldGVDYWxsKCkuIFNraXAgdGhlbS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKGFjdGl2ZUNhbGwpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGFjdGl2ZSBjYWxsJ3MgdGFyZ2V0ZWQgZWxlbWVudHMuICovXHJcblx0XHRcdFx0XHRcdFx0JC5lYWNoKGFjdGl2ZUNhbGxbMV0sIGZ1bmN0aW9uKGssIGFjdGl2ZUVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBxdWV1ZU5hbWUgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSA/IFwiXCIgOiBvcHRpb25zO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChxdWV1ZU5hbWUgIT09IHRydWUgJiYgKGFjdGl2ZUNhbGxbMl0ucXVldWUgIT09IHF1ZXVlTmFtZSkgJiYgIShvcHRpb25zID09PSB1bmRlZmluZWQgJiYgYWN0aXZlQ2FsbFsyXS5xdWV1ZSA9PT0gZmFsc2UpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFNraXAgYW55IGNhbGxzIHRoYXQgaGF2ZSBuZXZlciBiZWVuIHBhdXNlZCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFhY3RpdmVDYWxsWzVdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2FsbHMgdGFyZ2V0ZWQgYnkgdGhlIHN0b3AgY29tbWFuZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdCQuZWFjaChlbGVtZW50cywgZnVuY3Rpb24obCwgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBDaGVjayB0aGF0IHRoaXMgY2FsbCB3YXMgYXBwbGllZCB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEZsYWcgYSBwYXVzZSBvYmplY3QgdG8gYmUgcmVzdW1lZCwgd2hpY2ggd2lsbCBvY2N1ciBkdXJpbmcgdGhlIG5leHQgdGljay4gSW5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgYWRkaXRpb24sIHRoZSBwYXVzZSBvYmplY3Qgd2lsbCBhdCB0aGF0IHRpbWUgYmUgZGVsZXRlZCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGl2ZUNhbGxbNV0ucmVzdW1lID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogT25jZSB3ZSBtYXRjaCBhbiBlbGVtZW50LCB3ZSBjYW4gYm91bmNlIG91dCB0byB0aGUgbmV4dCBjYWxsIGVudGlyZWx5ICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogUHJvY2VlZCB0byBjaGVjayBuZXh0IGNhbGwgaWYgd2UgaGF2ZSBhbHJlYWR5IG1hdGNoZWQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChmb3VuZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHQvKiBTaW5jZSByZXN1bWUgY3JlYXRlcyBubyBuZXcgdHdlZW5zLCBleGl0IG91dCBvZiBWZWxvY2l0eS4gKi9cclxuXHRcdFx0XHRcdHJldHVybiBnZXRDaGFpbigpO1xyXG5cclxuXHRcdFx0XHRjYXNlIFwiZmluaXNoXCI6XHJcblx0XHRcdFx0Y2FzZSBcImZpbmlzaEFsbFwiOlxyXG5cdFx0XHRcdGNhc2UgXCJzdG9wXCI6XHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IEFjdGlvbjogU3RvcFxyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0LyogQ2xlYXIgdGhlIGN1cnJlbnRseS1hY3RpdmUgZGVsYXkgb24gZWFjaCB0YXJnZXRlZCBlbGVtZW50LiAqL1xyXG5cdFx0XHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihpLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdGlmIChEYXRhKGVsZW1lbnQpICYmIERhdGEoZWxlbWVudCkuZGVsYXlUaW1lcikge1xyXG5cdFx0XHRcdFx0XHRcdC8qIFN0b3AgdGhlIHRpbWVyIGZyb20gdHJpZ2dlcmluZyBpdHMgY2FjaGVkIG5leHQoKSBmdW5jdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRjbGVhclRpbWVvdXQoRGF0YShlbGVtZW50KS5kZWxheVRpbWVyLnNldFRpbWVvdXQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBNYW51YWxseSBjYWxsIHRoZSBuZXh0KCkgZnVuY3Rpb24gc28gdGhhdCB0aGUgc3Vic2VxdWVudCBxdWV1ZSBpdGVtcyBjYW4gcHJvZ3Jlc3MuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKERhdGEoZWxlbWVudCkuZGVsYXlUaW1lci5uZXh0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHREYXRhKGVsZW1lbnQpLmRlbGF5VGltZXIubmV4dCgpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIERhdGEoZWxlbWVudCkuZGVsYXlUaW1lcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgd2Ugd2FudCB0byBmaW5pc2ggZXZlcnl0aGluZyBpbiB0aGUgcXVldWUsIHdlIGhhdmUgdG8gaXRlcmF0ZSB0aHJvdWdoIGl0XHJcblx0XHRcdFx0XHRcdCBhbmQgY2FsbCBlYWNoIGZ1bmN0aW9uLiBUaGlzIHdpbGwgbWFrZSB0aGVtIGFjdGl2ZSBjYWxscyBiZWxvdywgd2hpY2ggd2lsbFxyXG5cdFx0XHRcdFx0XHQgY2F1c2UgdGhlbSB0byBiZSBhcHBsaWVkIHZpYSB0aGUgZHVyYXRpb24gc2V0dGluZy4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKHByb3BlcnRpZXNNYXAgPT09IFwiZmluaXNoQWxsXCIgJiYgKG9wdGlvbnMgPT09IHRydWUgfHwgVHlwZS5pc1N0cmluZyhvcHRpb25zKSkpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGl0ZW1zIGluIHRoZSBlbGVtZW50J3MgcXVldWUuICovXHJcblx0XHRcdFx0XHRcdFx0JC5lYWNoKCQucXVldWUoZWxlbWVudCwgVHlwZS5pc1N0cmluZyhvcHRpb25zKSA/IG9wdGlvbnMgOiBcIlwiKSwgZnVuY3Rpb24oXywgaXRlbSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogVGhlIHF1ZXVlIGFycmF5IGNhbiBjb250YWluIGFuIFwiaW5wcm9ncmVzc1wiIHN0cmluZywgd2hpY2ggd2Ugc2tpcC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChUeXBlLmlzRnVuY3Rpb24oaXRlbSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBDbGVhcmluZyB0aGUgJC5xdWV1ZSgpIGFycmF5IGlzIGFjaGlldmVkIGJ5IHJlc2V0dGluZyBpdCB0byBbXS4gKi9cclxuXHRcdFx0XHRcdFx0XHQkLnF1ZXVlKGVsZW1lbnQsIFR5cGUuaXNTdHJpbmcob3B0aW9ucykgPyBvcHRpb25zIDogXCJcIiwgW10pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHR2YXIgY2FsbHNUb1N0b3AgPSBbXTtcclxuXHJcblx0XHRcdFx0XHQvKiBXaGVuIHRoZSBzdG9wIGFjdGlvbiBpcyB0cmlnZ2VyZWQsIHRoZSBlbGVtZW50cycgY3VycmVudGx5IGFjdGl2ZSBjYWxsIGlzIGltbWVkaWF0ZWx5IHN0b3BwZWQuIFRoZSBhY3RpdmUgY2FsbCBtaWdodCBoYXZlXHJcblx0XHRcdFx0XHQgYmVlbiBhcHBsaWVkIHRvIG11bHRpcGxlIGVsZW1lbnRzLCBpbiB3aGljaCBjYXNlIGFsbCBvZiB0aGUgY2FsbCdzIGVsZW1lbnRzIHdpbGwgYmUgc3RvcHBlZC4gV2hlbiBhbiBlbGVtZW50XHJcblx0XHRcdFx0XHQgaXMgc3RvcHBlZCwgdGhlIG5leHQgaXRlbSBpbiBpdHMgYW5pbWF0aW9uIHF1ZXVlIGlzIGltbWVkaWF0ZWx5IHRyaWdnZXJlZC4gKi9cclxuXHRcdFx0XHRcdC8qIEFuIGFkZGl0aW9uYWwgYXJndW1lbnQgbWF5IGJlIHBhc3NlZCBpbiB0byBjbGVhciBhbiBlbGVtZW50J3MgcmVtYWluaW5nIHF1ZXVlZCBjYWxscy4gRWl0aGVyIHRydWUgKHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBcImZ4XCIgcXVldWUpXHJcblx0XHRcdFx0XHQgb3IgYSBjdXN0b20gcXVldWUgc3RyaW5nIGNhbiBiZSBwYXNzZWQgaW4uICovXHJcblx0XHRcdFx0XHQvKiBOb3RlOiBUaGUgc3RvcCBjb21tYW5kIHJ1bnMgcHJpb3IgdG8gVmVsb2NpdHkncyBRdWV1ZWluZyBwaGFzZSBzaW5jZSBpdHMgYmVoYXZpb3IgaXMgaW50ZW5kZWQgdG8gdGFrZSBlZmZlY3QgKmltbWVkaWF0ZWx5KixcclxuXHRcdFx0XHRcdCByZWdhcmRsZXNzIG9mIHRoZSBlbGVtZW50J3MgY3VycmVudCBxdWV1ZSBzdGF0ZS4gKi9cclxuXHJcblx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggZXZlcnkgYWN0aXZlIGNhbGwuICovXHJcblx0XHRcdFx0XHQkLmVhY2goVmVsb2NpdHkuU3RhdGUuY2FsbHMsIGZ1bmN0aW9uKGksIGFjdGl2ZUNhbGwpIHtcclxuXHRcdFx0XHRcdFx0LyogSW5hY3RpdmUgY2FsbHMgYXJlIHNldCB0byBmYWxzZSBieSB0aGUgbG9naWMgaW5zaWRlIGNvbXBsZXRlQ2FsbCgpLiBTa2lwIHRoZW0uICovXHJcblx0XHRcdFx0XHRcdGlmIChhY3RpdmVDYWxsKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBhY3RpdmUgY2FsbCdzIHRhcmdldGVkIGVsZW1lbnRzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdCQuZWFjaChhY3RpdmVDYWxsWzFdLCBmdW5jdGlvbihrLCBhY3RpdmVFbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBJZiB0cnVlIHdhcyBwYXNzZWQgaW4gYXMgYSBzZWNvbmRhcnkgYXJndW1lbnQsIGNsZWFyIGFic29sdXRlbHkgYWxsIGNhbGxzIG9uIHRoaXMgZWxlbWVudC4gT3RoZXJ3aXNlLCBvbmx5XHJcblx0XHRcdFx0XHRcdFx0XHQgY2xlYXIgY2FsbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxldmFudCBxdWV1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdC8qIENhbGwgc3RvcHBpbmcgbG9naWMgd29ya3MgYXMgZm9sbG93czpcclxuXHRcdFx0XHRcdFx0XHRcdCAtIG9wdGlvbnMgPT09IHRydWUgLS0+IHN0b3AgY3VycmVudCBkZWZhdWx0IHF1ZXVlIGNhbGxzIChhbmQgcXVldWU6ZmFsc2UgY2FsbHMpLCBpbmNsdWRpbmcgcmVtYWluaW5nIHF1ZXVlZCBvbmVzLlxyXG5cdFx0XHRcdFx0XHRcdFx0IC0gb3B0aW9ucyA9PT0gdW5kZWZpbmVkIC0tPiBzdG9wIGN1cnJlbnQgcXVldWU6XCJcIiBjYWxsIGFuZCBhbGwgcXVldWU6ZmFsc2UgY2FsbHMuXHJcblx0XHRcdFx0XHRcdFx0XHQgLSBvcHRpb25zID09PSBmYWxzZSAtLT4gc3RvcCBvbmx5IHF1ZXVlOmZhbHNlIGNhbGxzLlxyXG5cdFx0XHRcdFx0XHRcdFx0IC0gb3B0aW9ucyA9PT0gXCJjdXN0b21cIiAtLT4gc3RvcCBjdXJyZW50IHF1ZXVlOlwiY3VzdG9tXCIgY2FsbCwgaW5jbHVkaW5nIHJlbWFpbmluZyBxdWV1ZWQgb25lcyAodGhlcmUgaXMgbm8gZnVuY3Rpb25hbGl0eSB0byBvbmx5IGNsZWFyIHRoZSBjdXJyZW50bHktcnVubmluZyBxdWV1ZTpcImN1c3RvbVwiIGNhbGwpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIHF1ZXVlTmFtZSA9IChvcHRpb25zID09PSB1bmRlZmluZWQpID8gXCJcIiA6IG9wdGlvbnM7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHF1ZXVlTmFtZSAhPT0gdHJ1ZSAmJiAoYWN0aXZlQ2FsbFsyXS5xdWV1ZSAhPT0gcXVldWVOYW1lKSAmJiAhKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiBhY3RpdmVDYWxsWzJdLnF1ZXVlID09PSBmYWxzZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBjYWxscyB0YXJnZXRlZCBieSB0aGUgc3RvcCBjb21tYW5kLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihsLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIENoZWNrIHRoYXQgdGhpcyBjYWxsIHdhcyBhcHBsaWVkIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBPcHRpb25hbGx5IGNsZWFyIHRoZSByZW1haW5pbmcgcXVldWVkIGNhbGxzLiBJZiB3ZSdyZSBkb2luZyBcImZpbmlzaEFsbFwiIHRoaXMgd29uJ3QgZmluZCBhbnl0aGluZyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgZHVlIHRvIHRoZSBxdWV1ZS1jbGVhcmluZyBhYm92ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob3B0aW9ucyA9PT0gdHJ1ZSB8fCBUeXBlLmlzU3RyaW5nKG9wdGlvbnMpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGl0ZW1zIGluIHRoZSBlbGVtZW50J3MgcXVldWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkLmVhY2goJC5xdWV1ZShlbGVtZW50LCBUeXBlLmlzU3RyaW5nKG9wdGlvbnMpID8gb3B0aW9ucyA6IFwiXCIpLCBmdW5jdGlvbihfLCBpdGVtKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFRoZSBxdWV1ZSBhcnJheSBjYW4gY29udGFpbiBhbiBcImlucHJvZ3Jlc3NcIiBzdHJpbmcsIHdoaWNoIHdlIHNraXAuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChUeXBlLmlzRnVuY3Rpb24oaXRlbSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBQYXNzIHRoZSBpdGVtJ3MgY2FsbGJhY2sgYSBmbGFnIGluZGljYXRpbmcgdGhhdCB3ZSB3YW50IHRvIGFib3J0IGZyb20gdGhlIHF1ZXVlIGNhbGwuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IChTcGVjaWZpY2FsbHksIHRoZSBxdWV1ZSB3aWxsIHJlc29sdmUgdGhlIGNhbGwncyBhc3NvY2lhdGVkIHByb21pc2UgdGhlbiBhYm9ydC4pICAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW0obnVsbCwgdHJ1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIENsZWFyaW5nIHRoZSAkLnF1ZXVlKCkgYXJyYXkgaXMgYWNoaWV2ZWQgYnkgcmVzZXR0aW5nIGl0IHRvIFtdLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JC5xdWV1ZShlbGVtZW50LCBUeXBlLmlzU3RyaW5nKG9wdGlvbnMpID8gb3B0aW9ucyA6IFwiXCIsIFtdKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzTWFwID09PSBcInN0b3BcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogU2luY2UgXCJyZXZlcnNlXCIgdXNlcyBjYWNoZWQgc3RhcnQgdmFsdWVzICh0aGUgcHJldmlvdXMgY2FsbCdzIGVuZFZhbHVlcyksIHRoZXNlIHZhbHVlcyBtdXN0IGJlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgY2hhbmdlZCB0byByZWZsZWN0IHRoZSBmaW5hbCB2YWx1ZSB0aGF0IHRoZSBlbGVtZW50cyB3ZXJlIGFjdHVhbGx5IHR3ZWVuZWQgdG8uICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBJZiBvbmx5IHF1ZXVlOmZhbHNlL3F1ZXVlOlwiY3VzdG9tXCIgYW5pbWF0aW9ucyBhcmUgY3VycmVudGx5IHJ1bm5pbmcgb24gYW4gZWxlbWVudCwgaXQgd29uJ3QgaGF2ZSBhIHR3ZWVuc0NvbnRhaW5lclxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IG9iamVjdC4gQWxzbywgcXVldWU6ZmFsc2UvcXVldWU6XCJjdXN0b21cIiBhbmltYXRpb25zIGNhbid0IGJlIHJldmVyc2VkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGRhdGEgJiYgZGF0YS50d2VlbnNDb250YWluZXIgJiYgKHF1ZXVlTmFtZSA9PT0gdHJ1ZSB8fCBxdWV1ZU5hbWUgPT09IFwiXCIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCQuZWFjaChkYXRhLnR3ZWVuc0NvbnRhaW5lciwgZnVuY3Rpb24obSwgYWN0aXZlVHdlZW4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3RpdmVUd2Vlbi5lbmRWYWx1ZSA9IGFjdGl2ZVR3ZWVuLmN1cnJlbnRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsbHNUb1N0b3AucHVzaChpKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnRpZXNNYXAgPT09IFwiZmluaXNoXCIgfHwgcHJvcGVydGllc01hcCA9PT0gXCJmaW5pc2hBbGxcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogVG8gZ2V0IGFjdGl2ZSB0d2VlbnMgdG8gZmluaXNoIGltbWVkaWF0ZWx5LCB3ZSBmb3JjZWZ1bGx5IHNob3J0ZW4gdGhlaXIgZHVyYXRpb25zIHRvIDFtcyBzbyB0aGF0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgdGhleSBmaW5pc2ggdXBvbiB0aGUgbmV4dCByQWYgdGljayB0aGVuIHByb2NlZWQgd2l0aCBub3JtYWwgY2FsbCBjb21wbGV0aW9uIGxvZ2ljLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aXZlQ2FsbFsyXS5kdXJhdGlvbiA9IDE7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0LyogUHJlbWF0dXJlbHkgY2FsbCBjb21wbGV0ZUNhbGwoKSBvbiBlYWNoIG1hdGNoZWQgYWN0aXZlIGNhbGwuIFBhc3MgYW4gYWRkaXRpb25hbCBmbGFnIGZvciBcInN0b3BcIiB0byBpbmRpY2F0ZVxyXG5cdFx0XHRcdFx0IHRoYXQgdGhlIGNvbXBsZXRlIGNhbGxiYWNrIGFuZCBkaXNwbGF5Om5vbmUgc2V0dGluZyBzaG91bGQgYmUgc2tpcHBlZCBzaW5jZSB3ZSdyZSBjb21wbGV0aW5nIHByZW1hdHVyZWx5LiAqL1xyXG5cdFx0XHRcdFx0aWYgKHByb3BlcnRpZXNNYXAgPT09IFwic3RvcFwiKSB7XHJcblx0XHRcdFx0XHRcdCQuZWFjaChjYWxsc1RvU3RvcCwgZnVuY3Rpb24oaSwgaikge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlQ2FsbChqLCB0cnVlKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAocHJvbWlzZURhdGEucHJvbWlzZSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIEltbWVkaWF0ZWx5IHJlc29sdmUgdGhlIHByb21pc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RvcCBjYWxsIHNpbmNlIHN0b3AgcnVucyBzeW5jaHJvbm91c2x5LiAqL1xyXG5cdFx0XHRcdFx0XHRcdHByb21pc2VEYXRhLnJlc29sdmVyKGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIFNpbmNlIHdlJ3JlIHN0b3BwaW5nLCBhbmQgbm90IHByb2NlZWRpbmcgd2l0aCBxdWV1ZWluZywgZXhpdCBvdXQgb2YgVmVsb2NpdHkuICovXHJcblx0XHRcdFx0XHRyZXR1cm4gZ2V0Q2hhaW4oKTtcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdC8qIFRyZWF0IGEgbm9uLWVtcHR5IHBsYWluIG9iamVjdCBhcyBhIGxpdGVyYWwgcHJvcGVydGllcyBtYXAuICovXHJcblx0XHRcdFx0XHRpZiAoJC5pc1BsYWluT2JqZWN0KHByb3BlcnRpZXNNYXApICYmICFUeXBlLmlzRW1wdHlPYmplY3QocHJvcGVydGllc01hcCkpIHtcclxuXHRcdFx0XHRcdFx0YWN0aW9uID0gXCJzdGFydFwiO1xyXG5cclxuXHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IFJlZGlyZWN0c1xyXG5cdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIENoZWNrIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSByZWdpc3RlcmVkIHJlZGlyZWN0IChzZWUgUmVkaXJlY3RzIGFib3ZlKS4gKi9cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc1N0cmluZyhwcm9wZXJ0aWVzTWFwKSAmJiBWZWxvY2l0eS5SZWRpcmVjdHNbcHJvcGVydGllc01hcF0pIHtcclxuXHRcdFx0XHRcdFx0b3B0cyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKTtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBkdXJhdGlvbk9yaWdpbmFsID0gb3B0cy5kdXJhdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdGRlbGF5T3JpZ2luYWwgPSBvcHRzLmRlbGF5IHx8IDA7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgYmFja3dhcmRzIG9wdGlvbiB3YXMgcGFzc2VkIGluLCByZXZlcnNlIHRoZSBlbGVtZW50IHNldCBzbyB0aGF0IGVsZW1lbnRzIGFuaW1hdGUgZnJvbSB0aGUgbGFzdCB0byB0aGUgZmlyc3QuICovXHJcblx0XHRcdFx0XHRcdGlmIChvcHRzLmJhY2t3YXJkcyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnRzID0gJC5leHRlbmQodHJ1ZSwgW10sIGVsZW1lbnRzKS5yZXZlcnNlKCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIEluZGl2aWR1YWxseSB0cmlnZ2VyIHRoZSByZWRpcmVjdCBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgdG8gcHJldmVudCB1c2VycyBmcm9tIGhhdmluZyB0byBoYW5kbGUgaXRlcmF0aW9uIGxvZ2ljIGluIHRoZWlyIHJlZGlyZWN0LiAqL1xyXG5cdFx0XHRcdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGVsZW1lbnRJbmRleCwgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBzdGFnZ2VyIG9wdGlvbiB3YXMgcGFzc2VkIGluLCBzdWNjZXNzaXZlbHkgZGVsYXkgZWFjaCBlbGVtZW50IGJ5IHRoZSBzdGFnZ2VyIHZhbHVlIChpbiBtcykuIFJldGFpbiB0aGUgb3JpZ2luYWwgZGVsYXkgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlRmxvYXQob3B0cy5zdGFnZ2VyKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0b3B0cy5kZWxheSA9IGRlbGF5T3JpZ2luYWwgKyAocGFyc2VGbG9hdChvcHRzLnN0YWdnZXIpICogZWxlbWVudEluZGV4KTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNGdW5jdGlvbihvcHRzLnN0YWdnZXIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRvcHRzLmRlbGF5ID0gZGVsYXlPcmlnaW5hbCArIG9wdHMuc3RhZ2dlci5jYWxsKGVsZW1lbnQsIGVsZW1lbnRJbmRleCwgZWxlbWVudHNMZW5ndGgpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgdGhlIGRyYWcgb3B0aW9uIHdhcyBwYXNzZWQgaW4sIHN1Y2Nlc3NpdmVseSBpbmNyZWFzZS9kZWNyZWFzZSAoZGVwZW5kaW5nIG9uIHRoZSBwcmVzZW5zZSBvZiBvcHRzLmJhY2t3YXJkcylcclxuXHRcdFx0XHRcdFx0XHQgdGhlIGR1cmF0aW9uIG9mIGVhY2ggZWxlbWVudCdzIGFuaW1hdGlvbiwgdXNpbmcgZmxvb3JzIHRvIHByZXZlbnQgcHJvZHVjaW5nIHZlcnkgc2hvcnQgZHVyYXRpb25zLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChvcHRzLmRyYWcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIERlZmF1bHQgdGhlIGR1cmF0aW9uIG9mIFVJIHBhY2sgZWZmZWN0cyAoY2FsbG91dHMgYW5kIHRyYW5zaXRpb25zKSB0byAxMDAwbXMgaW5zdGVhZCBvZiB0aGUgdXN1YWwgZGVmYXVsdCBkdXJhdGlvbiBvZiA0MDBtcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSBwYXJzZUZsb2F0KGR1cmF0aW9uT3JpZ2luYWwpIHx8ICgvXihjYWxsb3V0fHRyYW5zaXRpb24pLy50ZXN0KHByb3BlcnRpZXNNYXApID8gMTAwMCA6IERVUkFUSU9OX0RFRkFVTFQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIEZvciBlYWNoIGVsZW1lbnQsIHRha2UgdGhlIGdyZWF0ZXIgZHVyYXRpb24gb2Y6IEEpIGFuaW1hdGlvbiBjb21wbGV0aW9uIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIGR1cmF0aW9uLFxyXG5cdFx0XHRcdFx0XHRcdFx0IEIpIDc1JSBvZiB0aGUgb3JpZ2luYWwgZHVyYXRpb24sIG9yIEMpIGEgMjAwbXMgZmFsbGJhY2sgKGluIGNhc2UgZHVyYXRpb24gaXMgYWxyZWFkeSBzZXQgdG8gYSBsb3cgdmFsdWUpLlxyXG5cdFx0XHRcdFx0XHRcdFx0IFRoZSBlbmQgcmVzdWx0IGlzIGEgYmFzZWxpbmUgb2YgNzUlIG9mIHRoZSByZWRpcmVjdCdzIGR1cmF0aW9uIHRoYXQgaW5jcmVhc2VzL2RlY3JlYXNlcyBhcyB0aGUgZW5kIG9mIHRoZSBlbGVtZW50IHNldCBpcyBhcHByb2FjaGVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0b3B0cy5kdXJhdGlvbiA9IE1hdGgubWF4KG9wdHMuZHVyYXRpb24gKiAob3B0cy5iYWNrd2FyZHMgPyAxIC0gZWxlbWVudEluZGV4IC8gZWxlbWVudHNMZW5ndGggOiAoZWxlbWVudEluZGV4ICsgMSkgLyBlbGVtZW50c0xlbmd0aCksIG9wdHMuZHVyYXRpb24gKiAwLjc1LCAyMDApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogUGFzcyBpbiB0aGUgY2FsbCdzIG9wdHMgb2JqZWN0IHNvIHRoYXQgdGhlIHJlZGlyZWN0IGNhbiBvcHRpb25hbGx5IGV4dGVuZCBpdC4gSXQgZGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0IGluc3RlYWQgb2YgbnVsbCB0b1xyXG5cdFx0XHRcdFx0XHRcdCByZWR1Y2UgdGhlIG9wdHMgY2hlY2tpbmcgbG9naWMgcmVxdWlyZWQgaW5zaWRlIHRoZSByZWRpcmVjdC4gKi9cclxuXHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5SZWRpcmVjdHNbcHJvcGVydGllc01hcF0uY2FsbChlbGVtZW50LCBlbGVtZW50LCBvcHRzIHx8IHt9LCBlbGVtZW50SW5kZXgsIGVsZW1lbnRzTGVuZ3RoLCBlbGVtZW50cywgcHJvbWlzZURhdGEucHJvbWlzZSA/IHByb21pc2VEYXRhIDogdW5kZWZpbmVkKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTaW5jZSB0aGUgYW5pbWF0aW9uIGxvZ2ljIHJlc2lkZXMgd2l0aGluIHRoZSByZWRpcmVjdCdzIG93biBjb2RlLCBhYm9ydCB0aGUgcmVtYWluZGVyIG9mIHRoaXMgY2FsbC5cclxuXHRcdFx0XHRcdFx0IChUaGUgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgdXAgdG8gdGhpcyBwb2ludCBpcyB2aXJ0dWFsbHkgbm9uLWV4aXN0YW50LikgKi9cclxuXHRcdFx0XHRcdFx0LyogTm90ZTogVGhlIGpRdWVyeSBjYWxsIGNoYWluIGlzIGtlcHQgaW50YWN0IGJ5IHJldHVybmluZyB0aGUgY29tcGxldGUgZWxlbWVudCBzZXQuICovXHJcblx0XHRcdFx0XHRcdHJldHVybiBnZXRDaGFpbigpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dmFyIGFib3J0RXJyb3IgPSBcIlZlbG9jaXR5OiBGaXJzdCBhcmd1bWVudCAoXCIgKyBwcm9wZXJ0aWVzTWFwICsgXCIpIHdhcyBub3QgYSBwcm9wZXJ0eSBtYXAsIGEga25vd24gYWN0aW9uLCBvciBhIHJlZ2lzdGVyZWQgcmVkaXJlY3QuIEFib3J0aW5nLlwiO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKHByb21pc2VEYXRhLnByb21pc2UpIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9taXNlRGF0YS5yZWplY3RlcihuZXcgRXJyb3IoYWJvcnRFcnJvcikpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHdpbmRvdy5jb25zb2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coYWJvcnRFcnJvcik7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBnZXRDaGFpbigpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IENhbGwtV2lkZSBWYXJpYWJsZXNcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogQSBjb250YWluZXIgZm9yIENTUyB1bml0IGNvbnZlcnNpb24gcmF0aW9zIChlLmcuICUsIHJlbSwgYW5kIGVtID09PiBweCkgdGhhdCBpcyB1c2VkIHRvIGNhY2hlIHJhdGlvcyBhY3Jvc3MgYWxsIGVsZW1lbnRzXHJcblx0XHRcdCBiZWluZyBhbmltYXRlZCBpbiBhIHNpbmdsZSBWZWxvY2l0eSBjYWxsLiBDYWxjdWxhdGluZyB1bml0IHJhdGlvcyBuZWNlc3NpdGF0ZXMgRE9NIHF1ZXJ5aW5nIGFuZCB1cGRhdGluZywgYW5kIGlzIHRoZXJlZm9yZVxyXG5cdFx0XHQgYXZvaWRlZCAodmlhIGNhY2hpbmcpIHdoZXJldmVyIHBvc3NpYmxlLiBUaGlzIGNvbnRhaW5lciBpcyBjYWxsLXdpZGUgaW5zdGVhZCBvZiBwYWdlLXdpZGUgdG8gYXZvaWQgdGhlIHJpc2sgb2YgdXNpbmcgc3RhbGVcclxuXHRcdFx0IGNvbnZlcnNpb24gbWV0cmljcyBhY3Jvc3MgVmVsb2NpdHkgYW5pbWF0aW9ucyB0aGF0IGFyZSBub3QgaW1tZWRpYXRlbHkgY29uc2VjdXRpdmVseSBjaGFpbmVkLiAqL1xyXG5cdFx0XHR2YXIgY2FsbFVuaXRDb252ZXJzaW9uRGF0YSA9IHtcclxuXHRcdFx0XHRsYXN0UGFyZW50OiBudWxsLFxyXG5cdFx0XHRcdGxhc3RQb3NpdGlvbjogbnVsbCxcclxuXHRcdFx0XHRsYXN0Rm9udFNpemU6IG51bGwsXHJcblx0XHRcdFx0bGFzdFBlcmNlbnRUb1B4V2lkdGg6IG51bGwsXHJcblx0XHRcdFx0bGFzdFBlcmNlbnRUb1B4SGVpZ2h0OiBudWxsLFxyXG5cdFx0XHRcdGxhc3RFbVRvUHg6IG51bGwsXHJcblx0XHRcdFx0cmVtVG9QeDogbnVsbCxcclxuXHRcdFx0XHR2d1RvUHg6IG51bGwsXHJcblx0XHRcdFx0dmhUb1B4OiBudWxsXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvKiBBIGNvbnRhaW5lciBmb3IgYWxsIHRoZSBlbnN1aW5nIHR3ZWVuIGRhdGEgYW5kIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhbGwuIFRoaXMgY29udGFpbmVyIGdldHMgcHVzaGVkIHRvIHRoZSBwYWdlLXdpZGVcclxuXHRcdFx0IFZlbG9jaXR5LlN0YXRlLmNhbGxzIGFycmF5IHRoYXQgaXMgcHJvY2Vzc2VkIGR1cmluZyBhbmltYXRpb24gdGlja2luZy4gKi9cclxuXHRcdFx0dmFyIGNhbGwgPSBbXTtcclxuXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IEVsZW1lbnQgUHJvY2Vzc2luZ1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogRWxlbWVudCBwcm9jZXNzaW5nIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIC0tIGRhdGEgcHJvY2Vzc2luZyB0aGF0IGNhbm5vdCBnbyBzdGFsZSBhbmQgZGF0YSBwcm9jZXNzaW5nIHRoYXQgKmNhbiogZ28gc3RhbGUgKGkuZS4gdGhpcmQtcGFydHkgc3R5bGUgbW9kaWZpY2F0aW9ucyk6XHJcblx0XHRcdCAxKSBQcmUtUXVldWVpbmc6IEVsZW1lbnQtd2lkZSB2YXJpYWJsZXMsIGluY2x1ZGluZyB0aGUgZWxlbWVudCdzIGRhdGEgc3RvcmFnZSwgYXJlIGluc3RhbnRpYXRlZC4gQ2FsbCBvcHRpb25zIGFyZSBwcmVwYXJlZC4gSWYgdHJpZ2dlcmVkLCB0aGUgU3RvcCBhY3Rpb24gaXMgZXhlY3V0ZWQuXHJcblx0XHRcdCAyKSBRdWV1ZWluZzogVGhlIGxvZ2ljIHRoYXQgcnVucyBvbmNlIHRoaXMgY2FsbCBoYXMgcmVhY2hlZCBpdHMgcG9pbnQgb2YgZXhlY3V0aW9uIGluIHRoZSBlbGVtZW50J3MgJC5xdWV1ZSgpIHN0YWNrLiBNb3N0IGxvZ2ljIGlzIHBsYWNlZCBoZXJlIHRvIGF2b2lkIHJpc2tpbmcgaXQgYmVjb21pbmcgc3RhbGUuXHJcblx0XHRcdCAzKSBQdXNoaW5nOiBDb25zb2xpZGF0aW9uIG9mIHRoZSB0d2VlbiBkYXRhIGZvbGxvd2VkIGJ5IGl0cyBwdXNoIG9udG8gdGhlIGdsb2JhbCBpbi1wcm9ncmVzcyBjYWxscyBjb250YWluZXIuXHJcblx0XHRcdCBgZWxlbWVudEFycmF5SW5kZXhgIGFsbG93cyBwYXNzaW5nIGluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCBhcnJheSB0byB2YWx1ZSBmdW5jdGlvbnMuXHJcblx0XHRcdCBJZiBgZWxlbWVudHNJbmRleGAgd2VyZSB1c2VkIGluc3RlYWQgdGhlIGluZGV4IHdvdWxkIGJlIGRldGVybWluZWQgYnkgdGhlIGVsZW1lbnRzJyBwZXItZWxlbWVudCBxdWV1ZS5cclxuXHRcdFx0ICovXHJcblx0XHRcdGZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnRBcnJheUluZGV4KSB7XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IFBhcnQgSTogUHJlLVF1ZXVlaW5nXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgRWxlbWVudC1XaWRlIFZhcmlhYmxlc1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdHZhciAvKiBUaGUgcnVudGltZSBvcHRzIG9iamVjdCBpcyB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBjdXJyZW50IGNhbGwncyBvcHRpb25zIGFuZCBWZWxvY2l0eSdzIHBhZ2Utd2lkZSBvcHRpb24gZGVmYXVsdHMuICovXHJcblx0XHRcdFx0XHRcdG9wdHMgPSAkLmV4dGVuZCh7fSwgVmVsb2NpdHkuZGVmYXVsdHMsIG9wdGlvbnMpLFxyXG5cdFx0XHRcdFx0XHQvKiBBIGNvbnRhaW5lciBmb3IgdGhlIHByb2Nlc3NlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHByb3BlcnR5IGluIHRoZSBwcm9wZXJ0eU1hcC5cclxuXHRcdFx0XHRcdFx0IChFYWNoIHByb3BlcnR5IGluIHRoZSBtYXAgcHJvZHVjZXMgaXRzIG93biBcInR3ZWVuXCIuKSAqL1xyXG5cdFx0XHRcdFx0XHR0d2VlbnNDb250YWluZXIgPSB7fSxcclxuXHRcdFx0XHRcdFx0ZWxlbWVudFVuaXRDb252ZXJzaW9uRGF0YTtcclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBFbGVtZW50IEluaXRcclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRWZWxvY2l0eS5pbml0KGVsZW1lbnQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IERlbGF5XHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogU2luY2UgcXVldWU6ZmFsc2UgZG9lc24ndCByZXNwZWN0IHRoZSBpdGVtJ3MgZXhpc3RpbmcgcXVldWUsIHdlIGF2b2lkIGluamVjdGluZyBpdHMgZGVsYXkgaGVyZSAoaXQncyBzZXQgbGF0ZXIgb24pLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IFZlbG9jaXR5IHJvbGxzIGl0cyBvd24gZGVsYXkgZnVuY3Rpb24gc2luY2UgalF1ZXJ5IGRvZXNuJ3QgaGF2ZSBhIHV0aWxpdHkgYWxpYXMgZm9yICQuZm4uZGVsYXkoKVxyXG5cdFx0XHRcdCAoYW5kIHRodXMgcmVxdWlyZXMgalF1ZXJ5IGVsZW1lbnQgY3JlYXRpb24sIHdoaWNoIHdlIGF2b2lkIHNpbmNlIGl0cyBvdmVyaGVhZCBpbmNsdWRlcyBET00gcXVlcnlpbmcpLiAqL1xyXG5cdFx0XHRcdGlmIChwYXJzZUZsb2F0KG9wdHMuZGVsYXkpICYmIG9wdHMucXVldWUgIT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHQkLnF1ZXVlKGVsZW1lbnQsIG9wdHMucXVldWUsIGZ1bmN0aW9uKG5leHQsIGNsZWFyUXVldWUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGNsZWFyUXVldWUgPT09IHRydWUpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBEbyBub3QgY29udGludWUgd2l0aCBhbmltYXRpb24gcXVldWVpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIFRoaXMgaXMgYSBmbGFnIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlIHVwY29taW5nIGNvbXBsZXRlQ2FsbCgpIGZ1bmN0aW9uIHRoYXQgdGhpcyBxdWV1ZSBlbnRyeSB3YXMgaW5pdGlhdGVkIGJ5IFZlbG9jaXR5LiBTZWUgY29tcGxldGVDYWxsKCkgZm9yIGZ1cnRoZXIgZGV0YWlscy4gKi9cclxuXHRcdFx0XHRcdFx0VmVsb2NpdHkudmVsb2NpdHlRdWV1ZUVudHJ5RmxhZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUaGUgZW5zdWluZyBxdWV1ZSBpdGVtICh3aGljaCBpcyBhc3NpZ25lZCB0byB0aGUgXCJuZXh0XCIgYXJndW1lbnQgdGhhdCAkLnF1ZXVlKCkgYXV0b21hdGljYWxseSBwYXNzZXMgaW4pIHdpbGwgYmUgdHJpZ2dlcmVkIGFmdGVyIGEgc2V0VGltZW91dCBkZWxheS5cclxuXHRcdFx0XHRcdFx0IFRoZSBzZXRUaW1lb3V0IGlzIHN0b3JlZCBzbyB0aGF0IGl0IGNhbiBiZSBzdWJqZWN0ZWQgdG8gY2xlYXJUaW1lb3V0KCkgaWYgdGhpcyBhbmltYXRpb24gaXMgcHJlbWF0dXJlbHkgc3RvcHBlZCB2aWEgVmVsb2NpdHkncyBcInN0b3BcIiBjb21tYW5kLCBhbmRcclxuXHRcdFx0XHRcdFx0IGRlbGF5QmVnaW4vZGVsYXlUaW1lIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGNhbiBcInBhdXNlXCIgYW5kIFwicmVzdW1lXCIgYSB0d2VlbiB0aGF0IGlzIHN0aWxsIG1pZC1kZWxheS4gKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIFRlbXBvcmFyaWx5IHN0b3JlIGRlbGF5ZWQgZWxlbWVudHMgdG8gZmFjaWxpdGUgYWNjZXNzIGZvciBnbG9iYWwgcGF1c2UvcmVzdW1lICovXHJcblx0XHRcdFx0XHRcdHZhciBjYWxsSW5kZXggPSBWZWxvY2l0eS5TdGF0ZS5kZWxheWVkRWxlbWVudHMuY291bnQrKztcclxuXHRcdFx0XHRcdFx0VmVsb2NpdHkuU3RhdGUuZGVsYXllZEVsZW1lbnRzW2NhbGxJbmRleF0gPSBlbGVtZW50O1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGRlbGF5Q29tcGxldGUgPSAoZnVuY3Rpb24oaW5kZXgpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBDbGVhciB0aGUgdGVtcG9yYXJ5IGVsZW1lbnQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmRlbGF5ZWRFbGVtZW50c1tpbmRleF0gPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBGaW5hbGx5LCBpc3N1ZSB0aGUgY2FsbCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0bmV4dCgpO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH0pKGNhbGxJbmRleCk7XHJcblxyXG5cclxuXHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS5kZWxheUJlZ2luID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcclxuXHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS5kZWxheSA9IHBhcnNlRmxvYXQob3B0cy5kZWxheSk7XHJcblx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkuZGVsYXlUaW1lciA9IHtcclxuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0OiBzZXRUaW1lb3V0KG5leHQsIHBhcnNlRmxvYXQob3B0cy5kZWxheSkpLFxyXG5cdFx0XHRcdFx0XHRcdG5leHQ6IGRlbGF5Q29tcGxldGVcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IER1cmF0aW9uXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogU3VwcG9ydCBmb3IgalF1ZXJ5J3MgbmFtZWQgZHVyYXRpb25zLiAqL1xyXG5cdFx0XHRcdHN3aXRjaCAob3B0cy5kdXJhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuXHRcdFx0XHRcdGNhc2UgXCJmYXN0XCI6XHJcblx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSAyMDA7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgXCJub3JtYWxcIjpcclxuXHRcdFx0XHRcdFx0b3B0cy5kdXJhdGlvbiA9IERVUkFUSU9OX0RFRkFVTFQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgXCJzbG93XCI6XHJcblx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSA2MDA7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdC8qIFJlbW92ZSB0aGUgcG90ZW50aWFsIFwibXNcIiBzdWZmaXggYW5kIGRlZmF1bHQgdG8gMSBpZiB0aGUgdXNlciBpcyBhdHRlbXB0aW5nIHRvIHNldCBhIGR1cmF0aW9uIG9mIDAgKGluIG9yZGVyIHRvIHByb2R1Y2UgYW4gaW1tZWRpYXRlIHN0eWxlIGNoYW5nZSkuICovXHJcblx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSBwYXJzZUZsb2F0KG9wdHMuZHVyYXRpb24pIHx8IDE7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IEdsb2JhbCBPcHRpb246IE1vY2tcclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRpZiAoVmVsb2NpdHkubW9jayAhPT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdC8qIEluIG1vY2sgbW9kZSwgYWxsIGFuaW1hdGlvbnMgYXJlIGZvcmNlZCB0byAxbXMgc28gdGhhdCB0aGV5IG9jY3VyIGltbWVkaWF0ZWx5IHVwb24gdGhlIG5leHQgckFGIHRpY2suXHJcblx0XHRcdFx0XHQgQWx0ZXJuYXRpdmVseSwgYSBtdWx0aXBsaWVyIGNhbiBiZSBwYXNzZWQgaW4gdG8gdGltZSByZW1hcCBhbGwgZGVsYXlzIGFuZCBkdXJhdGlvbnMuICovXHJcblx0XHRcdFx0XHRpZiAoVmVsb2NpdHkubW9jayA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0XHRvcHRzLmR1cmF0aW9uID0gb3B0cy5kZWxheSA9IDE7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRvcHRzLmR1cmF0aW9uICo9IHBhcnNlRmxvYXQoVmVsb2NpdHkubW9jaykgfHwgMTtcclxuXHRcdFx0XHRcdFx0b3B0cy5kZWxheSAqPSBwYXJzZUZsb2F0KFZlbG9jaXR5Lm1vY2spIHx8IDE7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IEVhc2luZ1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRvcHRzLmVhc2luZyA9IGdldEVhc2luZyhvcHRzLmVhc2luZywgb3B0cy5kdXJhdGlvbik7XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IE9wdGlvbjogQ2FsbGJhY2tzXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIENhbGxiYWNrcyBtdXN0IGZ1bmN0aW9ucy4gT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIG51bGwuICovXHJcblx0XHRcdFx0aWYgKG9wdHMuYmVnaW4gJiYgIVR5cGUuaXNGdW5jdGlvbihvcHRzLmJlZ2luKSkge1xyXG5cdFx0XHRcdFx0b3B0cy5iZWdpbiA9IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAob3B0cy5wcm9ncmVzcyAmJiAhVHlwZS5pc0Z1bmN0aW9uKG9wdHMucHJvZ3Jlc3MpKSB7XHJcblx0XHRcdFx0XHRvcHRzLnByb2dyZXNzID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChvcHRzLmNvbXBsZXRlICYmICFUeXBlLmlzRnVuY3Rpb24ob3B0cy5jb21wbGV0ZSkpIHtcclxuXHRcdFx0XHRcdG9wdHMuY29tcGxldGUgPSBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IERpc3BsYXkgJiBWaXNpYmlsaXR5XHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogUmVmZXIgdG8gVmVsb2NpdHkncyBkb2N1bWVudGF0aW9uIChWZWxvY2l0eUpTLm9yZy8jZGlzcGxheUFuZFZpc2liaWxpdHkpIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkaXNwbGF5IGFuZCB2aXNpYmlsaXR5IG9wdGlvbnMnIGJlaGF2aW9yLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IFdlIHN0cmljdGx5IGNoZWNrIGZvciB1bmRlZmluZWQgaW5zdGVhZCBvZiBmYWxzaW5lc3MgYmVjYXVzZSBkaXNwbGF5IGFjY2VwdHMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLiAqL1xyXG5cdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLmRpc3BsYXkgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdG9wdHMuZGlzcGxheSA9IG9wdHMuZGlzcGxheS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG5cdFx0XHRcdFx0LyogVXNlcnMgY2FuIHBhc3MgaW4gYSBzcGVjaWFsIFwiYXV0b1wiIHZhbHVlIHRvIGluc3RydWN0IFZlbG9jaXR5IHRvIHNldCB0aGUgZWxlbWVudCB0byBpdHMgZGVmYXVsdCBkaXNwbGF5IHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSA9PT0gXCJhdXRvXCIpIHtcclxuXHRcdFx0XHRcdFx0b3B0cy5kaXNwbGF5ID0gVmVsb2NpdHkuQ1NTLlZhbHVlcy5nZXREaXNwbGF5VHlwZShlbGVtZW50KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChvcHRzLnZpc2liaWxpdHkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLnZpc2liaWxpdHkgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdG9wdHMudmlzaWJpbGl0eSA9IG9wdHMudmlzaWJpbGl0eS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IG1vYmlsZUhBXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIFdoZW4gc2V0IHRvIHRydWUsIGFuZCBpZiB0aGlzIGlzIGEgbW9iaWxlIGRldmljZSwgbW9iaWxlSEEgYXV0b21hdGljYWxseSBlbmFibGVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiAodmlhIGEgbnVsbCB0cmFuc2Zvcm0gaGFjaylcclxuXHRcdFx0XHQgb24gYW5pbWF0aW5nIGVsZW1lbnRzLiBIQSBpcyByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQgYXQgdGhlIGNvbXBsZXRpb24gb2YgaXRzIGFuaW1hdGlvbi4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBBbmRyb2lkIEdpbmdlcmJyZWFkIGRvZXNuJ3Qgc3VwcG9ydCBIQS4gSWYgYSBudWxsIHRyYW5zZm9ybSBoYWNrIChtb2JpbGVIQSkgaXMgaW4gZmFjdCBzZXQsIGl0IHdpbGwgcHJldmVudCBvdGhlciB0cmFuZm9ybSBzdWJwcm9wZXJ0aWVzIGZyb20gdGFraW5nIGVmZmVjdC4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCB0aGUgdXNlIG9mIG1vYmlsZUhBIGluIFZlbG9jaXR5J3MgZG9jdW1lbnRhdGlvbjogVmVsb2NpdHlKUy5vcmcvI21vYmlsZUhBLiAqL1xyXG5cdFx0XHRcdG9wdHMubW9iaWxlSEEgPSAob3B0cy5tb2JpbGVIQSAmJiBWZWxvY2l0eS5TdGF0ZS5pc01vYmlsZSAmJiAhVmVsb2NpdHkuU3RhdGUuaXNHaW5nZXJicmVhZCk7XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBQYXJ0IElJOiBRdWV1ZWluZ1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogV2hlbiBhIHNldCBvZiBlbGVtZW50cyBpcyB0YXJnZXRlZCBieSBhIFZlbG9jaXR5IGNhbGwsIHRoZSBzZXQgaXMgYnJva2VuIHVwIGFuZCBlYWNoIGVsZW1lbnQgaGFzIHRoZSBjdXJyZW50IFZlbG9jaXR5IGNhbGwgaW5kaXZpZHVhbGx5IHF1ZXVlZCBvbnRvIGl0LlxyXG5cdFx0XHRcdCBJbiB0aGlzIHdheSwgZWFjaCBlbGVtZW50J3MgZXhpc3RpbmcgcXVldWUgaXMgcmVzcGVjdGVkOyBzb21lIGVsZW1lbnRzIG1heSBhbHJlYWR5IGJlIGFuaW1hdGluZyBhbmQgYWNjb3JkaW5nbHkgc2hvdWxkIG5vdCBoYXZlIHRoaXMgY3VycmVudCBWZWxvY2l0eSBjYWxsIHRyaWdnZXJlZCBpbW1lZGlhdGVseS4gKi9cclxuXHRcdFx0XHQvKiBJbiBlYWNoIHF1ZXVlLCB0d2VlbiBkYXRhIGlzIHByb2Nlc3NlZCBmb3IgZWFjaCBhbmltYXRpbmcgcHJvcGVydHkgdGhlbiBwdXNoZWQgb250byB0aGUgY2FsbC13aWRlIGNhbGxzIGFycmF5LiBXaGVuIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHNldCBoYXMgaGFkIGl0cyB0d2VlbnMgcHJvY2Vzc2VkLFxyXG5cdFx0XHRcdCB0aGUgY2FsbCBhcnJheSBpcyBwdXNoZWQgdG8gVmVsb2NpdHkuU3RhdGUuY2FsbHMgZm9yIGxpdmUgcHJvY2Vzc2luZyBieSB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRpY2suICovXHJcblx0XHRcdFx0ZnVuY3Rpb24gYnVpbGRRdWV1ZShuZXh0KSB7XHJcblx0XHRcdFx0XHR2YXIgZGF0YSwgbGFzdFR3ZWVuc0NvbnRhaW5lcjtcclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IE9wdGlvbjogQmVnaW5cclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIFRoZSBiZWdpbiBjYWxsYmFjayBpcyBmaXJlZCBvbmNlIHBlciBjYWxsIC0tIG5vdCBvbmNlIHBlciBlbGVtZW5ldCAtLSBhbmQgaXMgcGFzc2VkIHRoZSBmdWxsIHJhdyBET00gZWxlbWVudCBzZXQgYXMgYm90aCBpdHMgY29udGV4dCBhbmQgaXRzIGZpcnN0IGFyZ3VtZW50LiAqL1xyXG5cdFx0XHRcdFx0aWYgKG9wdHMuYmVnaW4gJiYgZWxlbWVudHNJbmRleCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0XHQvKiBXZSB0aHJvdyBjYWxsYmFja3MgaW4gYSBzZXRUaW1lb3V0IHNvIHRoYXQgdGhyb3duIGVycm9ycyBkb24ndCBoYWx0IHRoZSBleGVjdXRpb24gb2YgVmVsb2NpdHkgaXRzZWxmLiAqL1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdG9wdHMuYmVnaW4uY2FsbChlbGVtZW50cywgZWxlbWVudHMpO1xyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcclxuXHRcdFx0XHRcdFx0XHR9LCAxKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IFR3ZWVuIERhdGEgQ29uc3RydWN0aW9uIChmb3IgU2Nyb2xsKVxyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIE5vdGU6IEluIG9yZGVyIHRvIGJlIHN1YmplY3RlZCB0byBjaGFpbmluZyBhbmQgYW5pbWF0aW9uIG9wdGlvbnMsIHNjcm9sbCdzIHR3ZWVuaW5nIGlzIHJvdXRlZCB0aHJvdWdoIFZlbG9jaXR5IGFzIGlmIGl0IHdlcmUgYSBzdGFuZGFyZCBDU1MgcHJvcGVydHkgYW5pbWF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJzY3JvbGxcIikge1xyXG5cdFx0XHRcdFx0XHQvKiBUaGUgc2Nyb2xsIGFjdGlvbiB1bmlxdWVseSB0YWtlcyBhbiBvcHRpb25hbCBcIm9mZnNldFwiIG9wdGlvbiAtLSBzcGVjaWZpZWQgaW4gcGl4ZWxzIC0tIHRoYXQgb2Zmc2V0cyB0aGUgdGFyZ2V0ZWQgc2Nyb2xsIHBvc2l0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgc2Nyb2xsRGlyZWN0aW9uID0gKC9eeCQvaS50ZXN0KG9wdHMuYXhpcykgPyBcIkxlZnRcIiA6IFwiVG9wXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2Nyb2xsT2Zmc2V0ID0gcGFyc2VGbG9hdChvcHRzLm9mZnNldCkgfHwgMCxcclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uQ3VycmVudCxcclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uQ3VycmVudEFsdGVybmF0ZSxcclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uRW5kO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogU2Nyb2xsIGFsc28gdW5pcXVlbHkgdGFrZXMgYW4gb3B0aW9uYWwgXCJjb250YWluZXJcIiBvcHRpb24sIHdoaWNoIGluZGljYXRlcyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgc2Nyb2xsZWQgLS1cclxuXHRcdFx0XHRcdFx0IGFzIG9wcG9zZWQgdG8gdGhlIGJyb3dzZXIgd2luZG93IGl0c2VsZi4gVGhpcyBpcyB1c2VmdWwgZm9yIHNjcm9sbGluZyB0b3dhcmQgYW4gZWxlbWVudCB0aGF0J3MgaW5zaWRlIGFuIG92ZXJmbG93aW5nIHBhcmVudCBlbGVtZW50LiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAob3B0cy5jb250YWluZXIpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBFbnN1cmUgdGhhdCBlaXRoZXIgYSBqUXVlcnkgb2JqZWN0IG9yIGEgcmF3IERPTSBlbGVtZW50IHdhcyBwYXNzZWQgaW4uICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFR5cGUuaXNXcmFwcGVkKG9wdHMuY29udGFpbmVyKSB8fCBUeXBlLmlzTm9kZShvcHRzLmNvbnRhaW5lcikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEV4dHJhY3QgdGhlIHJhdyBET00gZWxlbWVudCBmcm9tIHRoZSBqUXVlcnkgd3JhcHBlci4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdG9wdHMuY29udGFpbmVyID0gb3B0cy5jb250YWluZXJbMF0gfHwgb3B0cy5jb250YWluZXI7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBVbmxpa2Ugb3RoZXIgcHJvcGVydGllcyBpbiBWZWxvY2l0eSwgdGhlIGJyb3dzZXIncyBzY3JvbGwgcG9zaXRpb24gaXMgbmV2ZXIgY2FjaGVkIHNpbmNlIGl0IHNvIGZyZXF1ZW50bHkgY2hhbmdlc1xyXG5cdFx0XHRcdFx0XHRcdFx0IChkdWUgdG8gdGhlIHVzZXIncyBuYXR1cmFsIGludGVyYWN0aW9uIHdpdGggdGhlIHBhZ2UpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0c2Nyb2xsUG9zaXRpb25DdXJyZW50ID0gb3B0cy5jb250YWluZXJbXCJzY3JvbGxcIiArIHNjcm9sbERpcmVjdGlvbl07IC8qIEdFVCAqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qICQucG9zaXRpb24oKSB2YWx1ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIncyBjdXJyZW50bHkgdmlld2FibGUgYXJlYSAod2l0aG91dCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBjb250YWluZXIncyB0cnVlIGRpbWVuc2lvbnNcclxuXHRcdFx0XHRcdFx0XHRcdCAtLSBzYXksIGZvciBleGFtcGxlLCBpZiB0aGUgY29udGFpbmVyIHdhcyBub3Qgb3ZlcmZsb3dpbmcpLiBUaHVzLCB0aGUgc2Nyb2xsIGVuZCB2YWx1ZSBpcyB0aGUgc3VtIG9mIHRoZSBjaGlsZCBlbGVtZW50J3MgcG9zaXRpb24gKmFuZCpcclxuXHRcdFx0XHRcdFx0XHRcdCB0aGUgc2Nyb2xsIGNvbnRhaW5lcidzIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0c2Nyb2xsUG9zaXRpb25FbmQgPSAoc2Nyb2xsUG9zaXRpb25DdXJyZW50ICsgJChlbGVtZW50KS5wb3NpdGlvbigpW3Njcm9sbERpcmVjdGlvbi50b0xvd2VyQ2FzZSgpXSkgKyBzY3JvbGxPZmZzZXQ7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgYSB2YWx1ZSBvdGhlciB0aGFuIGEgalF1ZXJ5IG9iamVjdCBvciBhIHJhdyBET00gZWxlbWVudCB3YXMgcGFzc2VkIGluLCBkZWZhdWx0IHRvIG51bGwgc28gdGhhdCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRvcHRzLmNvbnRhaW5lciA9IG51bGw7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSB3aW5kb3cgaXRzZWxmIGlzIGJlaW5nIHNjcm9sbGVkIC0tIG5vdCBhIGNvbnRhaW5pbmcgZWxlbWVudCAtLSBwZXJmb3JtIGEgbGl2ZSBzY3JvbGwgcG9zaXRpb24gbG9va3VwIHVzaW5nXHJcblx0XHRcdFx0XHRcdFx0IHRoZSBhcHByb3ByaWF0ZSBjYWNoZWQgcHJvcGVydHkgbmFtZXMgKHdoaWNoIGRpZmZlciBiYXNlZCBvbiBicm93c2VyIHR5cGUpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uQ3VycmVudCA9IFZlbG9jaXR5LlN0YXRlLnNjcm9sbEFuY2hvcltWZWxvY2l0eS5TdGF0ZVtcInNjcm9sbFByb3BlcnR5XCIgKyBzY3JvbGxEaXJlY3Rpb25dXTsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0LyogV2hlbiBzY3JvbGxpbmcgdGhlIGJyb3dzZXIgd2luZG93LCBjYWNoZSB0aGUgYWx0ZXJuYXRlIGF4aXMncyBjdXJyZW50IHZhbHVlIHNpbmNlIHdpbmRvdy5zY3JvbGxUbygpIGRvZXNuJ3QgbGV0IHVzIGNoYW5nZSBvbmx5IG9uZSB2YWx1ZSBhdCBhIHRpbWUuICovXHJcblx0XHRcdFx0XHRcdFx0c2Nyb2xsUG9zaXRpb25DdXJyZW50QWx0ZXJuYXRlID0gVmVsb2NpdHkuU3RhdGUuc2Nyb2xsQW5jaG9yW1ZlbG9jaXR5LlN0YXRlW1wic2Nyb2xsUHJvcGVydHlcIiArIChzY3JvbGxEaXJlY3Rpb24gPT09IFwiTGVmdFwiID8gXCJUb3BcIiA6IFwiTGVmdFwiKV1dOyAvKiBHRVQgKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogVW5saWtlICQucG9zaXRpb24oKSwgJC5vZmZzZXQoKSB2YWx1ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBicm93c2VyIHdpbmRvdydzIHRydWUgZGltZW5zaW9ucyAtLSBub3QgbWVyZWx5IGl0cyBjdXJyZW50bHkgdmlld2FibGUgYXJlYSAtLVxyXG5cdFx0XHRcdFx0XHRcdCBhbmQgdGhlcmVmb3JlIGVuZCB2YWx1ZXMgZG8gbm90IG5lZWQgdG8gYmUgY29tcG91bmRlZCBvbnRvIGN1cnJlbnQgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uRW5kID0gJChlbGVtZW50KS5vZmZzZXQoKVtzY3JvbGxEaXJlY3Rpb24udG9Mb3dlckNhc2UoKV0gKyBzY3JvbGxPZmZzZXQ7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTaW5jZSB0aGVyZSdzIG9ubHkgb25lIGZvcm1hdCB0aGF0IHNjcm9sbCdzIGFzc29jaWF0ZWQgdHdlZW5zQ29udGFpbmVyIGNhbiB0YWtlLCB3ZSBjcmVhdGUgaXQgbWFudWFsbHkuICovXHJcblx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lciA9IHtcclxuXHRcdFx0XHRcdFx0XHRzY3JvbGw6IHtcclxuXHRcdFx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWU6IHNjcm9sbFBvc2l0aW9uQ3VycmVudCxcclxuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRWYWx1ZTogc2Nyb2xsUG9zaXRpb25DdXJyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWU6IHNjcm9sbFBvc2l0aW9uRW5kLFxyXG5cdFx0XHRcdFx0XHRcdFx0dW5pdFR5cGU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRlYXNpbmc6IG9wdHMuZWFzaW5nLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2Nyb2xsRGF0YToge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250YWluZXI6IG9wdHMuY29udGFpbmVyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRkaXJlY3Rpb246IHNjcm9sbERpcmVjdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdFx0YWx0ZXJuYXRlVmFsdWU6IHNjcm9sbFBvc2l0aW9uQ3VycmVudEFsdGVybmF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudDogZWxlbWVudFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coXCJ0d2VlbnNDb250YWluZXIgKHNjcm9sbCk6IFwiLCB0d2VlbnNDb250YWluZXIuc2Nyb2xsLCBlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHQgVHdlZW4gRGF0YSBDb25zdHJ1Y3Rpb24gKGZvciBSZXZlcnNlKVxyXG5cdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogUmV2ZXJzZSBhY3RzIGxpa2UgYSBcInN0YXJ0XCIgYWN0aW9uIGluIHRoYXQgYSBwcm9wZXJ0eSBtYXAgaXMgYW5pbWF0ZWQgdG93YXJkLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzXHJcblx0XHRcdFx0XHRcdCB0aGF0IHRoZSBwcm9wZXJ0eSBtYXAgdXNlZCBmb3IgcmV2ZXJzZSBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgbWFwIHVzZWQgaW4gdGhlIHByZXZpb3VzIGNhbGwuIFRodXMsIHdlIG1hbmlwdWxhdGVcclxuXHRcdFx0XHRcdFx0IHRoZSBwcmV2aW91cyBjYWxsIHRvIGNvbnN0cnVjdCBvdXIgbmV3IG1hcDogdXNlIHRoZSBwcmV2aW91cyBtYXAncyBlbmQgdmFsdWVzIGFzIG91ciBuZXcgbWFwJ3Mgc3RhcnQgdmFsdWVzLiBDb3B5IG92ZXIgYWxsIG90aGVyIGRhdGEuICovXHJcblx0XHRcdFx0XHRcdC8qIE5vdGU6IFJldmVyc2UgY2FuIGJlIGRpcmVjdGx5IGNhbGxlZCB2aWEgdGhlIFwicmV2ZXJzZVwiIHBhcmFtZXRlciwgb3IgaXQgY2FuIGJlIGluZGlyZWN0bHkgdHJpZ2dlcmVkIHZpYSB0aGUgbG9vcCBvcHRpb24uIChMb29wcyBhcmUgY29tcG9zZWQgb2YgbXVsdGlwbGUgcmV2ZXJzZXMuKSAqL1xyXG5cdFx0XHRcdFx0XHQvKiBOb3RlOiBSZXZlcnNlIGNhbGxzIGRvIG5vdCBuZWVkIHRvIGJlIGNvbnNlY3V0aXZlbHkgY2hhaW5lZCBvbnRvIGEgY3VycmVudGx5LWFuaW1hdGluZyBlbGVtZW50IGluIG9yZGVyIHRvIG9wZXJhdGUgb24gY2FjaGVkIHZhbHVlcztcclxuXHRcdFx0XHRcdFx0IHRoZXJlIGlzIG5vIGhhcm0gdG8gcmV2ZXJzZSBiZWluZyBjYWxsZWQgb24gYSBwb3RlbnRpYWxseSBzdGFsZSBkYXRhIGNhY2hlIHNpbmNlIHJldmVyc2UncyBiZWhhdmlvciBpcyBzaW1wbHkgZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHQgYXMgcmV2ZXJ0aW5nIHRvIHRoZSBlbGVtZW50J3MgdmFsdWVzIGFzIHRoZXkgd2VyZSBwcmlvciB0byB0aGUgcHJldmlvdXMgKlZlbG9jaXR5KiBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24gPT09IFwicmV2ZXJzZVwiKSB7XHJcblx0XHRcdFx0XHRcdGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogQWJvcnQgaWYgdGhlcmUgaXMgbm8gcHJpb3IgYW5pbWF0aW9uIGRhdGEgdG8gcmV2ZXJzZSB0by4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKCFkYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIWRhdGEudHdlZW5zQ29udGFpbmVyKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogRGVxdWV1ZSB0aGUgZWxlbWVudCBzbyB0aGF0IHRoaXMgcXVldWUgZW50cnkgcmVsZWFzZXMgaXRzZWxmIGltbWVkaWF0ZWx5LCBhbGxvd2luZyBzdWJzZXF1ZW50IHF1ZXVlIGVudHJpZXMgdG8gcnVuLiAqL1xyXG5cdFx0XHRcdFx0XHRcdCQuZGVxdWV1ZShlbGVtZW50LCBvcHRzLnF1ZXVlKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHQgT3B0aW9ucyBQYXJzaW5nXHJcblx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgdGhlIGVsZW1lbnQgd2FzIGhpZGRlbiB2aWEgdGhlIGRpc3BsYXkgb3B0aW9uIGluIHRoZSBwcmV2aW91cyBjYWxsLFxyXG5cdFx0XHRcdFx0XHRcdCByZXZlcnQgZGlzcGxheSB0byBcImF1dG9cIiBwcmlvciB0byByZXZlcnNhbCBzbyB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgYWdhaW4uICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKGRhdGEub3B0cy5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRzLmRpc3BsYXkgPSBcImF1dG9cIjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhLm9wdHMudmlzaWJpbGl0eSA9PT0gXCJoaWRkZW5cIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRzLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBsb29wIG9wdGlvbiB3YXMgc2V0IGluIHRoZSBwcmV2aW91cyBjYWxsLCBkaXNhYmxlIGl0IHNvIHRoYXQgXCJyZXZlcnNlXCIgY2FsbHMgYXJlbid0IHJlY3Vyc2l2ZWx5IGdlbmVyYXRlZC5cclxuXHRcdFx0XHRcdFx0XHQgRnVydGhlciwgcmVtb3ZlIHRoZSBwcmV2aW91cyBjYWxsJ3MgY2FsbGJhY2sgb3B0aW9uczsgdHlwaWNhbGx5LCB1c2VycyBkbyBub3Qgd2FudCB0aGVzZSB0byBiZSByZWZpcmVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGRhdGEub3B0cy5sb29wID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRzLmJlZ2luID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wdHMuY29tcGxldGUgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBTaW5jZSB3ZSdyZSBleHRlbmRpbmcgYW4gb3B0cyBvYmplY3QgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGV4dGVuZGVkIHdpdGggdGhlIGRlZmF1bHRzIG9wdGlvbnMgb2JqZWN0LFxyXG5cdFx0XHRcdFx0XHRcdCB3ZSByZW1vdmUgbm9uLWV4cGxpY2l0bHktZGVmaW5lZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGF1dG8tYXNzaWduZWQgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5lYXNpbmcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBvcHRzLmVhc2luZztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5kdXJhdGlvbikge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIG9wdHMuZHVyYXRpb247XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBUaGUgb3B0cyBvYmplY3QgdXNlZCBmb3IgcmV2ZXJzYWwgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBvcHRpb25zIG9iamVjdCBvcHRpb25hbGx5IHBhc3NlZCBpbnRvIHRoaXNcclxuXHRcdFx0XHRcdFx0XHQgcmV2ZXJzZSBjYWxsIHBsdXMgdGhlIG9wdGlvbnMgdXNlZCBpbiB0aGUgcHJldmlvdXMgVmVsb2NpdHkgY2FsbC4gKi9cclxuXHRcdFx0XHRcdFx0XHRvcHRzID0gJC5leHRlbmQoe30sIGRhdGEub3B0cywgb3B0cyk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFR3ZWVucyBDb250YWluZXIgUmVjb25zdHJ1Y3Rpb25cclxuXHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogQ3JlYXRlIGEgZGVlcHkgY29weSAoaW5kaWNhdGVkIHZpYSB0aGUgdHJ1ZSBmbGFnKSBvZiB0aGUgcHJldmlvdXMgY2FsbCdzIHR3ZWVuc0NvbnRhaW5lci4gKi9cclxuXHRcdFx0XHRcdFx0XHRsYXN0VHdlZW5zQ29udGFpbmVyID0gJC5leHRlbmQodHJ1ZSwge30sIGRhdGEgPyBkYXRhLnR3ZWVuc0NvbnRhaW5lciA6IG51bGwpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBNYW5pcHVsYXRlIHRoZSBwcmV2aW91cyB0d2VlbnNDb250YWluZXIgYnkgcmVwbGFjaW5nIGl0cyBlbmQgdmFsdWVzIGFuZCBjdXJyZW50VmFsdWVzIHdpdGggaXRzIHN0YXJ0IHZhbHVlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRmb3IgKHZhciBsYXN0VHdlZW4gaW4gbGFzdFR3ZWVuc0NvbnRhaW5lcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSW4gYWRkaXRpb24gdG8gdHdlZW4gZGF0YSwgdHdlZW5zQ29udGFpbmVycyBjb250YWluIGFuIGVsZW1lbnQgcHJvcGVydHkgdGhhdCB3ZSBpZ25vcmUgaGVyZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChsYXN0VHdlZW5zQ29udGFpbmVyLmhhc093blByb3BlcnR5KGxhc3RUd2VlbikgJiYgbGFzdFR3ZWVuICE9PSBcImVsZW1lbnRcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgbGFzdFN0YXJ0VmFsdWUgPSBsYXN0VHdlZW5zQ29udGFpbmVyW2xhc3RUd2Vlbl0uc3RhcnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxhc3RUd2VlbnNDb250YWluZXJbbGFzdFR3ZWVuXS5zdGFydFZhbHVlID0gbGFzdFR3ZWVuc0NvbnRhaW5lcltsYXN0VHdlZW5dLmN1cnJlbnRWYWx1ZSA9IGxhc3RUd2VlbnNDb250YWluZXJbbGFzdFR3ZWVuXS5lbmRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGFzdFR3ZWVuc0NvbnRhaW5lcltsYXN0VHdlZW5dLmVuZFZhbHVlID0gbGFzdFN0YXJ0VmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBFYXNpbmcgaXMgdGhlIG9ubHkgb3B0aW9uIHRoYXQgZW1iZWRzIGludG8gdGhlIGluZGl2aWR1YWwgdHdlZW4gZGF0YSAoc2luY2UgaXQgY2FuIGJlIGRlZmluZWQgb24gYSBwZXItcHJvcGVydHkgYmFzaXMpLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgQWNjb3JkaW5nbHksIGV2ZXJ5IHByb3BlcnR5J3MgZWFzaW5nIHZhbHVlIG11c3QgYmUgdXBkYXRlZCB3aGVuIGFuIG9wdGlvbnMgb2JqZWN0IGlzIHBhc3NlZCBpbiB3aXRoIGEgcmV2ZXJzZSBjYWxsLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgVGhlIHNpZGUgZWZmZWN0IG9mIHRoaXMgZXh0ZW5zaWJpbGl0eSBpcyB0aGF0IGFsbCBwZXItcHJvcGVydHkgZWFzaW5nIHZhbHVlcyBhcmUgZm9yY2VmdWxseSByZXNldCB0byB0aGUgbmV3IHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIVR5cGUuaXNFbXB0eU9iamVjdChvcHRpb25zKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhc3RUd2VlbnNDb250YWluZXJbbGFzdFR3ZWVuXS5lYXNpbmcgPSBvcHRzLmVhc2luZztcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coXCJyZXZlcnNlIHR3ZWVuc0NvbnRhaW5lciAoXCIgKyBsYXN0VHdlZW4gKyBcIik6IFwiICsgSlNPTi5zdHJpbmdpZnkobGFzdFR3ZWVuc0NvbnRhaW5lcltsYXN0VHdlZW5dKSwgZWxlbWVudCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lciA9IGxhc3RUd2VlbnNDb250YWluZXI7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHQgVHdlZW4gRGF0YSBDb25zdHJ1Y3Rpb24gKGZvciBTdGFydClcclxuXHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uID09PSBcInN0YXJ0XCIpIHtcclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdCBWYWx1ZSBUcmFuc2ZlcnJpbmdcclxuXHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGlzIHF1ZXVlIGVudHJ5IGZvbGxvd3MgYSBwcmV2aW91cyBWZWxvY2l0eS1pbml0aWF0ZWQgcXVldWUgZW50cnkgKmFuZCogaWYgdGhpcyBlbnRyeSB3YXMgY3JlYXRlZFxyXG5cdFx0XHRcdFx0XHQgd2hpbGUgdGhlIGVsZW1lbnQgd2FzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGFuaW1hdGVkIGJ5IFZlbG9jaXR5LCB0aGVuIHRoaXMgY3VycmVudCBjYWxsIGlzIHNhZmUgdG8gdXNlXHJcblx0XHRcdFx0XHRcdCB0aGUgZW5kIHZhbHVlcyBmcm9tIHRoZSBwcmlvciBjYWxsIGFzIGl0cyBzdGFydCB2YWx1ZXMuIFZlbG9jaXR5IGF0dGVtcHRzIHRvIHBlcmZvcm0gdGhpcyB2YWx1ZSB0cmFuc2ZlclxyXG5cdFx0XHRcdFx0XHQgcHJvY2VzcyB3aGVuZXZlciBwb3NzaWJsZSBpbiBvcmRlciB0byBhdm9pZCByZXF1ZXJ5aW5nIHRoZSBET00uICovXHJcblx0XHRcdFx0XHRcdC8qIElmIHZhbHVlcyBhcmVuJ3QgdHJhbnNmZXJyZWQgZnJvbSBhIHByaW9yIGNhbGwgYW5kIHN0YXJ0IHZhbHVlcyB3ZXJlIG5vdCBmb3JjZWZlZCBieSB0aGUgdXNlciAobW9yZSBvbiB0aGlzIGJlbG93KSxcclxuXHRcdFx0XHRcdFx0IHRoZW4gdGhlIERPTSBpcyBxdWVyaWVkIGZvciB0aGUgZWxlbWVudCdzIGN1cnJlbnQgdmFsdWVzIGFzIGEgbGFzdCByZXNvcnQuICovXHJcblx0XHRcdFx0XHRcdC8qIE5vdGU6IENvbnZlcnNlbHksIGFuaW1hdGlvbiByZXZlcnNhbCAoYW5kIGxvb3BpbmcpICphbHdheXMqIHBlcmZvcm0gaW50ZXItY2FsbCB2YWx1ZSB0cmFuc2ZlcnM7IHRoZXkgbmV2ZXIgcmVxdWVyeSB0aGUgRE9NLiAqL1xyXG5cclxuXHRcdFx0XHRcdFx0ZGF0YSA9IERhdGEoZWxlbWVudCk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUaGUgcGVyLWVsZW1lbnQgaXNBbmltYXRpbmcgZmxhZyBpcyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgaXQncyBzYWZlIChpLmUuIHRoZSBkYXRhIGlzbid0IHN0YWxlKVxyXG5cdFx0XHRcdFx0XHQgdG8gdHJhbnNmZXIgb3ZlciBlbmQgdmFsdWVzIHRvIHVzZSBhcyBzdGFydCB2YWx1ZXMuIElmIGl0J3Mgc2V0IHRvIHRydWUgYW5kIHRoZXJlIGlzIGEgcHJldmlvdXNcclxuXHRcdFx0XHRcdFx0IFZlbG9jaXR5IGNhbGwgdG8gcHVsbCB2YWx1ZXMgZnJvbSwgZG8gc28uICovXHJcblx0XHRcdFx0XHRcdGlmIChkYXRhICYmIGRhdGEudHdlZW5zQ29udGFpbmVyICYmIGRhdGEuaXNBbmltYXRpbmcgPT09IHRydWUpIHtcclxuXHRcdFx0XHRcdFx0XHRsYXN0VHdlZW5zQ29udGFpbmVyID0gZGF0YS50d2VlbnNDb250YWluZXI7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IFR3ZWVuIERhdGEgQ2FsY3VsYXRpb25cclxuXHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHByb3BlcnR5IGRhdGEgYW5kIGRlZmF1bHRzIGVuZFZhbHVlLCBlYXNpbmcsIGFuZCBzdGFydFZhbHVlIGFzIGFwcHJvcHJpYXRlLiAqL1xyXG5cdFx0XHRcdFx0XHQvKiBQcm9wZXJ0eSBtYXAgdmFsdWVzIGNhbiBlaXRoZXIgdGFrZSB0aGUgZm9ybSBvZiAxKSBhIHNpbmdsZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGVuZCB2YWx1ZSxcclxuXHRcdFx0XHRcdFx0IG9yIDIpIGFuIGFycmF5IGluIHRoZSBmb3JtIG9mIFsgZW5kVmFsdWUsIFssIGVhc2luZ10gWywgc3RhcnRWYWx1ZV0gXS5cclxuXHRcdFx0XHRcdFx0IFRoZSBvcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIgaXMgYSBmb3JjZWZlZCBzdGFydFZhbHVlIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBxdWVyeWluZyB0aGUgRE9NIGZvclxyXG5cdFx0XHRcdFx0XHQgdGhlIGVsZW1lbnQncyBjdXJyZW50IHZhbHVlLiBSZWFkIFZlbG9jaXR5J3MgZG9jbWVudGF0aW9uIHRvIGxlYXJuIG1vcmUgYWJvdXQgZm9yY2VmZWVkaW5nOiBWZWxvY2l0eUpTLm9yZy8jZm9yY2VmZWVkaW5nICovXHJcblx0XHRcdFx0XHRcdHZhciBwYXJzZVByb3BlcnR5VmFsdWUgPSBmdW5jdGlvbih2YWx1ZURhdGEsIHNraXBSZXNvbHZpbmdFYXNpbmcpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgZW5kVmFsdWUsIGVhc2luZywgc3RhcnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgd2UgaGF2ZSBhIGZ1bmN0aW9uIGFzIHRoZSBtYWluIGFyZ3VtZW50IHRoZW4gcmVzb2x2ZSBpdCBmaXJzdCwgaW4gY2FzZSBpdCByZXR1cm5zIGFuIGFycmF5IHRoYXQgbmVlZHMgdG8gYmUgc3BsaXQgKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc0Z1bmN0aW9uKHZhbHVlRGF0YSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IHZhbHVlRGF0YS5jYWxsKGVsZW1lbnQsIGVsZW1lbnRBcnJheUluZGV4LCBlbGVtZW50c0xlbmd0aCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBIYW5kbGUgdGhlIGFycmF5IGZvcm1hdCwgd2hpY2ggY2FuIGJlIHN0cnVjdHVyZWQgYXMgb25lIG9mIHRocmVlIHBvdGVudGlhbCBvdmVybG9hZHM6XHJcblx0XHRcdFx0XHRcdFx0IEEpIFsgZW5kVmFsdWUsIGVhc2luZywgc3RhcnRWYWx1ZSBdLCBCKSBbIGVuZFZhbHVlLCBlYXNpbmcgXSwgb3IgQykgWyBlbmRWYWx1ZSwgc3RhcnRWYWx1ZSBdICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFR5cGUuaXNBcnJheSh2YWx1ZURhdGEpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBlbmRWYWx1ZSBpcyBhbHdheXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5LiBEb24ndCBib3RoZXIgdmFsaWRhdGluZyBlbmRWYWx1ZSdzIHZhbHVlIG5vd1xyXG5cdFx0XHRcdFx0XHRcdFx0IHNpbmNlIHRoZSBlbnN1aW5nIHByb3BlcnR5IGN5Y2xpbmcgbG9naWMgZG9lcyB0aGF0LiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSB2YWx1ZURhdGFbMF07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogVHdvLWl0ZW0gYXJyYXkgZm9ybWF0OiBJZiB0aGUgc2Vjb25kIGl0ZW0gaXMgYSBudW1iZXIsIGZ1bmN0aW9uLCBvciBoZXggc3RyaW5nLCB0cmVhdCBpdCBhcyBhXHJcblx0XHRcdFx0XHRcdFx0XHQgc3RhcnQgdmFsdWUgc2luY2UgZWFzaW5ncyBjYW4gb25seSBiZSBub24taGV4IHN0cmluZ3Mgb3IgYXJyYXlzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCghVHlwZS5pc0FycmF5KHZhbHVlRGF0YVsxXSkgJiYgL15bXFxkLV0vLnRlc3QodmFsdWVEYXRhWzFdKSkgfHwgVHlwZS5pc0Z1bmN0aW9uKHZhbHVlRGF0YVsxXSkgfHwgQ1NTLlJlZ0V4LmlzSGV4LnRlc3QodmFsdWVEYXRhWzFdKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gdmFsdWVEYXRhWzFdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBUd28gb3IgdGhyZWUtaXRlbSBhcnJheTogSWYgdGhlIHNlY29uZCBpdGVtIGlzIGEgbm9uLWhleCBzdHJpbmcgZWFzaW5nIG5hbWUgb3IgYW4gYXJyYXksIHRyZWF0IGl0IGFzIGFuIGVhc2luZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoKFR5cGUuaXNTdHJpbmcodmFsdWVEYXRhWzFdKSAmJiAhQ1NTLlJlZ0V4LmlzSGV4LnRlc3QodmFsdWVEYXRhWzFdKSAmJiBWZWxvY2l0eS5FYXNpbmdzW3ZhbHVlRGF0YVsxXV0pIHx8IFR5cGUuaXNBcnJheSh2YWx1ZURhdGFbMV0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVhc2luZyA9IHNraXBSZXNvbHZpbmdFYXNpbmcgPyB2YWx1ZURhdGFbMV0gOiBnZXRFYXNpbmcodmFsdWVEYXRhWzFdLCBvcHRzLmR1cmF0aW9uKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIERvbid0IGJvdGhlciB2YWxpZGF0aW5nIHN0YXJ0VmFsdWUncyB2YWx1ZSBub3cgc2luY2UgdGhlIGVuc3VpbmcgcHJvcGVydHkgY3ljbGluZyBsb2dpYyBpbmhlcmVudGx5IGRvZXMgdGhhdC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IHZhbHVlRGF0YVsyXTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSB2YWx1ZURhdGFbMV0gfHwgdmFsdWVEYXRhWzJdO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSGFuZGxlIHRoZSBzaW5nbGUtdmFsdWUgZm9ybWF0LiAqL1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IHZhbHVlRGF0YTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIERlZmF1bHQgdG8gdGhlIGNhbGwncyBlYXNpbmcgaWYgYSBwZXItcHJvcGVydHkgZWFzaW5nIHR5cGUgd2FzIG5vdCBkZWZpbmVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmICghc2tpcFJlc29sdmluZ0Vhc2luZykge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWFzaW5nID0gZWFzaW5nIHx8IG9wdHMuZWFzaW5nO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgZnVuY3Rpb25zIHdlcmUgcGFzc2VkIGluIGFzIHZhbHVlcywgcGFzcyB0aGUgZnVuY3Rpb24gdGhlIGN1cnJlbnQgZWxlbWVudCBhcyBpdHMgY29udGV4dCxcclxuXHRcdFx0XHRcdFx0XHQgcGx1cyB0aGUgZWxlbWVudCdzIGluZGV4IGFuZCB0aGUgZWxlbWVudCBzZXQncyBzaXplIGFzIGFyZ3VtZW50cy4gVGhlbiwgYXNzaWduIHRoZSByZXR1cm5lZCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc0Z1bmN0aW9uKGVuZFZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBlbmRWYWx1ZS5jYWxsKGVsZW1lbnQsIGVsZW1lbnRBcnJheUluZGV4LCBlbGVtZW50c0xlbmd0aCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc0Z1bmN0aW9uKHN0YXJ0VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gc3RhcnRWYWx1ZS5jYWxsKGVsZW1lbnQsIGVsZW1lbnRBcnJheUluZGV4LCBlbGVtZW50c0xlbmd0aCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBBbGxvdyBzdGFydFZhbHVlIHRvIGJlIGxlZnQgYXMgdW5kZWZpbmVkIHRvIGluZGljYXRlIHRvIHRoZSBlbnN1aW5nIGNvZGUgdGhhdCBpdHMgdmFsdWUgd2FzIG5vdCBmb3JjZWZlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gW2VuZFZhbHVlIHx8IDAsIGVhc2luZywgc3RhcnRWYWx1ZV07XHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgZml4UHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZURhdGEpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJbiBjYXNlIHRoaXMgcHJvcGVydHkgaXMgYSBob29rLCB0aGVyZSBhcmUgY2lyY3Vtc3RhbmNlcyB3aGVyZSB3ZSB3aWxsIGludGVuZCB0byB3b3JrIG9uIHRoZSBob29rJ3Mgcm9vdCBwcm9wZXJ0eSBhbmQgbm90IHRoZSBob29rZWQgc3VicHJvcGVydHkuICovXHJcblx0XHRcdFx0XHRcdFx0dmFyIHJvb3RQcm9wZXJ0eSA9IENTUy5Ib29rcy5nZXRSb290KHByb3BlcnR5KSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogUGFyc2Ugb3V0IGVuZFZhbHVlLCBlYXNpbmcsIGFuZCBzdGFydFZhbHVlIGZyb20gdGhlIHByb3BlcnR5J3MgZGF0YS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSB2YWx1ZURhdGFbMF0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVhc2luZyA9IHZhbHVlRGF0YVsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IHZhbHVlRGF0YVsyXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybjtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFN0YXJ0IFZhbHVlIFNvdXJjaW5nXHJcblx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBPdGhlciB0aGFuIGZvciB0aGUgZHVtbXkgdHdlZW4gcHJvcGVydHksIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgYnJvd3NlciAoYW5kIGRvIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbm9ybWFsaXphdGlvbikgd2lsbFxyXG5cdFx0XHRcdFx0XHRcdCBpbmhlcmVudGx5IHByb2R1Y2Ugbm8gc3R5bGUgY2hhbmdlcyB3aGVuIHNldCwgc28gdGhleSBhcmUgc2tpcHBlZCBpbiBvcmRlciB0byBkZWNyZWFzZSBhbmltYXRpb24gdGljayBvdmVyaGVhZC5cclxuXHRcdFx0XHRcdFx0XHQgUHJvcGVydHkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkIHZpYSBwcmVmaXhDaGVjaygpLCB3aGljaCByZXR1cm5zIGEgZmFsc2UgZmxhZyB3aGVuIG5vIHN1cHBvcnRlZCBpcyBkZXRlY3RlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBTaW5jZSBTVkcgZWxlbWVudHMgaGF2ZSBzb21lIG9mIHRoZWlyIHByb3BlcnRpZXMgZGlyZWN0bHkgYXBwbGllZCBhcyBIVE1MIGF0dHJpYnV0ZXMsXHJcblx0XHRcdFx0XHRcdFx0IHRoZXJlIGlzIG5vIHdheSB0byBjaGVjayBmb3IgdGhlaXIgZXhwbGljaXQgYnJvd3NlciBzdXBwb3J0LCBhbmQgc28gd2Ugc2tpcCBza2lwIHRoaXMgY2hlY2sgZm9yIHRoZW0uICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKCghZGF0YSB8fCAhZGF0YS5pc1NWRykgJiYgcm9vdFByb3BlcnR5ICE9PSBcInR3ZWVuXCIgJiYgQ1NTLk5hbWVzLnByZWZpeENoZWNrKHJvb3RQcm9wZXJ0eSlbMV0gPT09IGZhbHNlICYmIENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW3Jvb3RQcm9wZXJ0eV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiU2tpcHBpbmcgW1wiICsgcm9vdFByb3BlcnR5ICsgXCJdIGR1ZSB0byBhIGxhY2sgb2YgYnJvd3NlciBzdXBwb3J0LlwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBkaXNwbGF5IG9wdGlvbiBpcyBiZWluZyBzZXQgdG8gYSBub24tXCJub25lXCIgKGUuZy4gXCJibG9ja1wiKSBhbmQgb3BhY2l0eSAoZmlsdGVyIG9uIElFPD04KSBpcyBiZWluZ1xyXG5cdFx0XHRcdFx0XHRcdCBhbmltYXRlZCB0byBhbiBlbmRWYWx1ZSBvZiBub24temVybywgdGhlIHVzZXIncyBpbnRlbnRpb24gaXMgdG8gZmFkZSBpbiBmcm9tIGludmlzaWJsZSwgdGh1cyB3ZSBmb3JjZWZlZWQgb3BhY2l0eVxyXG5cdFx0XHRcdFx0XHRcdCBhIHN0YXJ0VmFsdWUgb2YgMCBpZiBpdHMgc3RhcnRWYWx1ZSBoYXNuJ3QgYWxyZWFkeSBiZWVuIHNvdXJjZWQgYnkgdmFsdWUgdHJhbnNmZXJyaW5nIG9yIHByaW9yIGZvcmNlZmVlZGluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoKChvcHRzLmRpc3BsYXkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLmRpc3BsYXkgIT09IG51bGwgJiYgb3B0cy5kaXNwbGF5ICE9PSBcIm5vbmVcIikgfHwgKG9wdHMudmlzaWJpbGl0eSAhPT0gdW5kZWZpbmVkICYmIG9wdHMudmlzaWJpbGl0eSAhPT0gXCJoaWRkZW5cIikpICYmIC9vcGFjaXR5fGZpbHRlci8udGVzdChwcm9wZXJ0eSkgJiYgIXN0YXJ0VmFsdWUgJiYgZW5kVmFsdWUgIT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgdmFsdWVzIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBwcmV2aW91cyBWZWxvY2l0eSBjYWxsLCBleHRyYWN0IHRoZSBlbmRWYWx1ZSBhbmQgcm9vdFByb3BlcnR5VmFsdWVcclxuXHRcdFx0XHRcdFx0XHQgZm9yIGFsbCBvZiB0aGUgY3VycmVudCBjYWxsJ3MgcHJvcGVydGllcyB0aGF0IHdlcmUgKmFsc28qIGFuaW1hdGVkIGluIHRoZSBwcmV2aW91cyBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIE5vdGU6IFZhbHVlIHRyYW5zZmVycmluZyBjYW4gb3B0aW9uYWxseSBiZSBkaXNhYmxlZCBieSB0aGUgdXNlciB2aWEgdGhlIF9jYWNoZVZhbHVlcyBvcHRpb24uICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKG9wdHMuX2NhY2hlVmFsdWVzICYmIGxhc3RUd2VlbnNDb250YWluZXIgJiYgbGFzdFR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChzdGFydFZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IGxhc3RUd2VlbnNDb250YWluZXJbcHJvcGVydHldLmVuZFZhbHVlICsgbGFzdFR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0udW5pdFR5cGU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogVGhlIHByZXZpb3VzIGNhbGwncyByb290UHJvcGVydHlWYWx1ZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgZWxlbWVudCdzIGRhdGEgY2FjaGUgc2luY2UgdGhhdCdzIHRoZVxyXG5cdFx0XHRcdFx0XHRcdFx0IGluc3RhbmNlIG9mIHJvb3RQcm9wZXJ0eVZhbHVlIHRoYXQgZ2V0cyBmcmVzaGx5IHVwZGF0ZWQgYnkgdGhlIHR3ZWVuaW5nIHByb2Nlc3MsIHdoZXJlYXMgdGhlIHJvb3RQcm9wZXJ0eVZhbHVlXHJcblx0XHRcdFx0XHRcdFx0XHQgYXR0YWNoZWQgdG8gdGhlIGluY29taW5nIGxhc3RUd2VlbnNDb250YWluZXIgaXMgZXF1YWwgdG8gdGhlIHJvb3QgcHJvcGVydHkncyB2YWx1ZSBwcmlvciB0byBhbnkgdHdlZW5pbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IGRhdGEucm9vdFByb3BlcnR5VmFsdWVDYWNoZVtyb290UHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgdmFsdWVzIHdlcmUgbm90IHRyYW5zZmVycmVkIGZyb20gYSBwcmV2aW91cyBWZWxvY2l0eSBjYWxsLCBxdWVyeSB0aGUgRE9NIGFzIG5lZWRlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSGFuZGxlIGhvb2tlZCBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKENTUy5Ib29rcy5yZWdpc3RlcmVkW3Byb3BlcnR5XSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoc3RhcnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCByb290UHJvcGVydHkpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBUaGUgZm9sbG93aW5nIGdldFByb3BlcnR5VmFsdWUoKSBjYWxsIGRvZXMgbm90IGFjdHVhbGx5IHRyaWdnZXIgYSBET00gcXVlcnk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IGdldFByb3BlcnR5VmFsdWUoKSB3aWxsIGV4dHJhY3QgdGhlIGhvb2sgZnJvbSByb290UHJvcGVydHlWYWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgcHJvcGVydHksIHJvb3RQcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiBzdGFydFZhbHVlIGlzIGFscmVhZHkgZGVmaW5lZCB2aWEgZm9yY2VmZWVkaW5nLCBkbyBub3QgcXVlcnkgdGhlIERPTSBmb3IgdGhlIHJvb3QgcHJvcGVydHkncyB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQganVzdCBncmFiIHJvb3RQcm9wZXJ0eSdzIHplcm8tdmFsdWUgdGVtcGxhdGUgZnJvbSBDU1MuSG9va3MuIFRoaXMgb3ZlcndyaXRlcyB0aGUgZWxlbWVudCdzIGFjdHVhbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCByb290IHByb3BlcnR5IHZhbHVlIChpZiBvbmUgaXMgc2V0KSwgYnV0IHRoaXMgaXMgYWNjZXB0YWJsZSBzaW5jZSB0aGUgcHJpbWFyeSByZWFzb24gdXNlcnMgZm9yY2VmZWVkIGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IHRvIGF2b2lkIERPTSBxdWVyaWVzLCBhbmQgdGh1cyB3ZSBsaWtld2lzZSBhdm9pZCBxdWVyeWluZyB0aGUgRE9NIGZvciB0aGUgcm9vdCBwcm9wZXJ0eSdzIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEdyYWIgdGhpcyBob29rJ3MgemVyby12YWx1ZSB0ZW1wbGF0ZSwgZS5nLiBcIjBweCAwcHggMHB4IGJsYWNrXCIuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuSG9va3MudGVtcGxhdGVzW3Jvb3RQcm9wZXJ0eV1bMV07XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogSGFuZGxlIG5vbi1ob29rZWQgcHJvcGVydGllcyB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIGRlZmluZWQgdmlhIGZvcmNlZmVlZGluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc3RhcnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSk7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFZhbHVlIERhdGEgRXh0cmFjdGlvblxyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0dmFyIHNlcGFyYXRlZFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZVVuaXRUeXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlVW5pdFR5cGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9wZXJhdG9yID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIFNlcGFyYXRlcyBhIHByb3BlcnR5IHZhbHVlIGludG8gaXRzIG51bWVyaWMgdmFsdWUgYW5kIGl0cyB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0dmFyIHNlcGFyYXRlVmFsdWUgPSBmdW5jdGlvbihwcm9wZXJ0eSwgdmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciB1bml0VHlwZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRudW1lcmljVmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0bnVtZXJpY1ZhbHVlID0gKHZhbHVlIHx8IFwiMFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50b1N0cmluZygpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRvTG93ZXJDYXNlKClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBNYXRjaCB0aGUgdW5pdCB0eXBlIGF0IHRoZSBlbmQgb2YgdGhlIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9bJUEtel0rJC8sIGZ1bmN0aW9uKG1hdGNoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBHcmFiIHRoZSB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bml0VHlwZSA9IG1hdGNoO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFN0cmlwIHRoZSB1bml0IHR5cGUgb2ZmIG9mIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgbm8gdW5pdCB0eXBlIHdhcyBzdXBwbGllZCwgYXNzaWduIG9uZSB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0aGlzIHByb3BlcnR5IChlLmcuIFwiZGVnXCIgZm9yIHJvdGF0ZVogb3IgXCJweFwiIGZvciB3aWR0aCkuICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIXVuaXRUeXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRUeXBlID0gQ1NTLlZhbHVlcy5nZXRVbml0VHlwZShwcm9wZXJ0eSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFtudW1lcmljVmFsdWUsIHVuaXRUeXBlXTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoc3RhcnRWYWx1ZSAhPT0gZW5kVmFsdWUgJiYgVHlwZS5pc1N0cmluZyhzdGFydFZhbHVlKSAmJiBUeXBlLmlzU3RyaW5nKGVuZFZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybiA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgaVN0YXJ0ID0gMCwgLy8gaW5kZXggaW4gc3RhcnRWYWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlFbmQgPSAwLCAvLyBpbmRleCBpbiBlbmRWYWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFTdGFydCA9IFtdLCAvLyBhcnJheSBvZiBzdGFydFZhbHVlIG51bWJlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhRW5kID0gW10sIC8vIGFycmF5IG9mIGVuZFZhbHVlIG51bWJlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbkNhbGMgPSAwLCAvLyBLZWVwIHRyYWNrIG9mIGJlaW5nIGluc2lkZSBhIFwiY2FsYygpXCIgc28gd2UgZG9uJ3QgZHVwbGljYXRlIGl0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SR0IgPSAwLCAvLyBLZWVwIHRyYWNrIG9mIGJlaW5nIGluc2lkZSBhbiBSR0IgYXMgd2UgY2FuJ3QgdXNlIGZyYWN0aW9uYWwgdmFsdWVzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SR0JBID0gMDsgLy8gS2VlcCB0cmFjayBvZiBiZWluZyBpbnNpZGUgYW4gUkdCQSBhcyB3ZSBtdXN0IHBhc3MgZnJhY3Rpb25hbCBmb3IgdGhlIGFscGhhIGNoYW5uZWxcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gQ1NTLkhvb2tzLmZpeENvbG9ycyhzdGFydFZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gQ1NTLkhvb2tzLmZpeENvbG9ycyhlbmRWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoaVN0YXJ0IDwgc3RhcnRWYWx1ZS5sZW5ndGggJiYgaUVuZCA8IGVuZFZhbHVlLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgY1N0YXJ0ID0gc3RhcnRWYWx1ZVtpU3RhcnRdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y0VuZCA9IGVuZFZhbHVlW2lFbmRdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKC9bXFxkXFwuLV0vLnRlc3QoY1N0YXJ0KSAmJiAvW1xcZFxcLi1dLy50ZXN0KGNFbmQpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHRTdGFydCA9IGNTdGFydCwgLy8gdGVtcG9yYXJ5IGNoYXJhY3RlciBidWZmZXJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dEVuZCA9IGNFbmQsIC8vIHRlbXBvcmFyeSBjaGFyYWN0ZXIgYnVmZmVyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvdFN0YXJ0ID0gXCIuXCIsIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gb25seSBldmVyIG1hdGNoIGEgc2luZ2xlIGRvdCBpbiBhIGRlY2ltYWxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG90RW5kID0gXCIuXCI7IC8vIE1ha2Ugc3VyZSB3ZSBjYW4gb25seSBldmVyIG1hdGNoIGEgc2luZ2xlIGRvdCBpbiBhIGRlY2ltYWxcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCsraVN0YXJ0IDwgc3RhcnRWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNTdGFydCA9IHN0YXJ0VmFsdWVbaVN0YXJ0XTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjU3RhcnQgPT09IGRvdFN0YXJ0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvdFN0YXJ0ID0gXCIuLlwiOyAvLyBDYW4gbmV2ZXIgbWF0Y2ggdHdvIGNoYXJhY3RlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIS9cXGQvLnRlc3QoY1N0YXJ0KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRTdGFydCArPSBjU3RhcnQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdoaWxlICgrK2lFbmQgPCBlbmRWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNFbmQgPSBlbmRWYWx1ZVtpRW5kXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjRW5kID09PSBkb3RFbmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG90RW5kID0gXCIuLlwiOyAvLyBDYW4gbmV2ZXIgbWF0Y2ggdHdvIGNoYXJhY3RlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIS9cXGQvLnRlc3QoY0VuZCkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0RW5kICs9IGNFbmQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciB1U3RhcnQgPSBDU1MuSG9va3MuZ2V0VW5pdChzdGFydFZhbHVlLCBpU3RhcnQpLCAvLyB0ZW1wb3JhcnkgdW5pdCB0eXBlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVFbmQgPSBDU1MuSG9va3MuZ2V0VW5pdChlbmRWYWx1ZSwgaUVuZCk7IC8vIHRlbXBvcmFyeSB1bml0IHR5cGVcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aVN0YXJ0ICs9IHVTdGFydC5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aUVuZCArPSB1RW5kLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodVN0YXJ0ID09PSB1RW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTYW1lIHVuaXRzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodFN0YXJ0ID09PSB0RW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNhbWUgbnVtYmVycywgc28ganVzdCBjb3B5IG92ZXJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybiArPSB0U3RhcnQgKyB1U3RhcnQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEaWZmZXJlbnQgbnVtYmVycywgc28gc3RvcmUgdGhlbVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuICs9IFwie1wiICsgYVN0YXJ0Lmxlbmd0aCArIChpblJHQiA/IFwiIVwiIDogXCJcIikgKyBcIn1cIiArIHVTdGFydDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YVN0YXJ0LnB1c2gocGFyc2VGbG9hdCh0U3RhcnQpKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUVuZC5wdXNoKHBhcnNlRmxvYXQodEVuZCkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEaWZmZXJlbnQgdW5pdHMsIHNvIHB1dCBpbnRvIGEgXCJjYWxjKGZyb20gKyB0bylcIiBhbmQgYW5pbWF0ZSBlYWNoIHNpZGUgdG8vZnJvbSB6ZXJvXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgblN0YXJ0ID0gcGFyc2VGbG9hdCh0U3RhcnQpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5FbmQgPSBwYXJzZUZsb2F0KHRFbmQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm4gKz0gKGluQ2FsYyA8IDUgPyBcImNhbGNcIiA6IFwiXCIpICsgXCIoXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIChuU3RhcnQgPyBcIntcIiArIGFTdGFydC5sZW5ndGggKyAoaW5SR0IgPyBcIiFcIiA6IFwiXCIpICsgXCJ9XCIgOiBcIjBcIikgKyB1U3RhcnRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIFwiICsgXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIChuRW5kID8gXCJ7XCIgKyAoYVN0YXJ0Lmxlbmd0aCArIChuU3RhcnQgPyAxIDogMCkpICsgKGluUkdCID8gXCIhXCIgOiBcIlwiKSArIFwifVwiIDogXCIwXCIpICsgdUVuZFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgXCIpXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoblN0YXJ0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTdGFydC5wdXNoKG5TdGFydCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFFbmQucHVzaCgwKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChuRW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTdGFydC5wdXNoKDApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRW5kLnB1c2gobkVuZCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGNTdGFydCA9PT0gY0VuZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm4gKz0gY1N0YXJ0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlTdGFydCsrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlFbmQrKztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBLZWVwIHRyYWNrIG9mIGJlaW5nIGluc2lkZSBhIGNhbGMoKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpbkNhbGMgPT09IDAgJiYgY1N0YXJ0ID09PSBcImNcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpbkNhbGMgPT09IDEgJiYgY1N0YXJ0ID09PSBcImFcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpbkNhbGMgPT09IDIgJiYgY1N0YXJ0ID09PSBcImxcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpbkNhbGMgPT09IDMgJiYgY1N0YXJ0ID09PSBcImNcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpbkNhbGMgPj0gNCAmJiBjU3RhcnQgPT09IFwiKFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5DYWxjKys7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICgoaW5DYWxjICYmIGluQ2FsYyA8IDUpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHx8IGluQ2FsYyA+PSA0ICYmIGNTdGFydCA9PT0gXCIpXCIgJiYgLS1pbkNhbGMgPCA1KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpbkNhbGMgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBLZWVwIHRyYWNrIG9mIGJlaW5nIGluc2lkZSBhbiByZ2IoKSAvIHJnYmEoKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpblJHQiA9PT0gMCAmJiBjU3RhcnQgPT09IFwiclwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHx8IGluUkdCID09PSAxICYmIGNTdGFydCA9PT0gXCJnXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fHwgaW5SR0IgPT09IDIgJiYgY1N0YXJ0ID09PSBcImJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpblJHQiA9PT0gMyAmJiBjU3RhcnQgPT09IFwiYVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHx8IGluUkdCID49IDMgJiYgY1N0YXJ0ID09PSBcIihcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpblJHQiA9PT0gMyAmJiBjU3RhcnQgPT09IFwiYVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluUkdCQSA9IDE7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpblJHQisrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5SR0JBICYmIGNTdGFydCA9PT0gXCIsXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICgrK2luUkdCQSA+IDMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SR0IgPSBpblJHQkEgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoKGluUkdCQSAmJiBpblJHQiA8IChpblJHQkEgPyA1IDogNCkpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHx8IGluUkdCID49IChpblJHQkEgPyA0IDogMykgJiYgY1N0YXJ0ID09PSBcIilcIiAmJiAtLWluUkdCIDwgKGluUkdCQSA/IDUgOiA0KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SR0IgPSBpblJHQkEgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbkNhbGMgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFRPRE86IGNoYW5naW5nIHVuaXRzLCBmaXhpbmcgY29sb3Vyc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoaVN0YXJ0ICE9PSBzdGFydFZhbHVlLmxlbmd0aCB8fCBpRW5kICE9PSBlbmRWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcIlRyeWluZyB0byBwYXR0ZXJuIG1hdGNoIG1pcy1tYXRjaGVkIHN0cmluZ3MgW1xcXCJcIiArIGVuZFZhbHVlICsgXCJcXFwiLCBcXFwiXCIgKyBzdGFydFZhbHVlICsgXCJcXFwiXVwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhdHRlcm4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFTdGFydC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoVmVsb2NpdHkuZGVidWcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiUGF0dGVybiBmb3VuZCBcXFwiXCIgKyBwYXR0ZXJuICsgXCJcXFwiIC0+IFwiLCBhU3RhcnQsIGFFbmQsIFwiW1wiICsgc3RhcnRWYWx1ZSArIFwiLFwiICsgZW5kVmFsdWUgKyBcIl1cIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSBhU3RhcnQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBhRW5kO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBzdGFydFZhbHVlVW5pdFR5cGUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm4gPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICghcGF0dGVybikge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogU2VwYXJhdGUgc3RhcnRWYWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHNlcGFyYXRlZFZhbHVlID0gc2VwYXJhdGVWYWx1ZShwcm9wZXJ0eSwgc3RhcnRWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gc2VwYXJhdGVkVmFsdWVbMF07XHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlVW5pdFR5cGUgPSBzZXBhcmF0ZWRWYWx1ZVsxXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBTZXBhcmF0ZSBlbmRWYWx1ZSwgYW5kIGV4dHJhY3QgYSB2YWx1ZSBvcGVyYXRvciAoZS5nLiBcIis9XCIsIFwiLT1cIikgaWYgb25lIGV4aXN0cy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHNlcGFyYXRlZFZhbHVlID0gc2VwYXJhdGVWYWx1ZShwcm9wZXJ0eSwgZW5kVmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBzZXBhcmF0ZWRWYWx1ZVswXS5yZXBsYWNlKC9eKFsrLVxcLypdKT0vLCBmdW5jdGlvbihtYXRjaCwgc3ViTWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0b3BlcmF0b3IgPSBzdWJNYXRjaDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFN0cmlwIHRoZSBvcGVyYXRvciBvZmYgb2YgdGhlIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWVVbml0VHlwZSA9IHNlcGFyYXRlZFZhbHVlWzFdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFBhcnNlIGZsb2F0IHZhbHVlcyBmcm9tIGVuZFZhbHVlIGFuZCBzdGFydFZhbHVlLiBEZWZhdWx0IHRvIDAgaWYgTmFOIGlzIHJldHVybmVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IHBhcnNlRmxvYXQoc3RhcnRWYWx1ZSkgfHwgMDtcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gcGFyc2VGbG9hdChlbmRWYWx1ZSkgfHwgMDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0XHQgUHJvcGVydHktU3BlY2lmaWMgVmFsdWUgQ29udmVyc2lvblxyXG5cdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBDdXN0b20gc3VwcG9ydCBmb3IgcHJvcGVydGllcyB0aGF0IGRvbid0IGFjdHVhbGx5IGFjY2VwdCB0aGUgJSB1bml0IHR5cGUsIGJ1dCB3aGVyZSBwb2xseWZpbGxpbmcgaXMgdHJpdmlhbCBhbmQgcmVsYXRpdmVseSBmb29scHJvb2YuICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZW5kVmFsdWVVbml0VHlwZSA9PT0gXCIlXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogQSAlLXZhbHVlIGZvbnRTaXplL2xpbmVIZWlnaHQgaXMgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCdzIGZvbnRTaXplIChhcyBvcHBvc2VkIHRvIHRoZSBwYXJlbnQncyBkaW1lbnNpb25zKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHdoaWNoIGlzIGlkZW50aWNhbCB0byB0aGUgZW0gdW5pdCdzIGJlaGF2aW9yLCBzbyB3ZSBwaWdneWJhY2sgb2ZmIG9mIHRoYXQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICgvXihmb250U2l6ZXxsaW5lSGVpZ2h0KSQvLnRlc3QocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQ29udmVydCAlIGludG8gYW4gZW0gZGVjaW1hbCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IGVuZFZhbHVlIC8gMTAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBcImVtXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogRm9yIHNjYWxlWCBhbmQgc2NhbGVZLCBjb252ZXJ0IHRoZSB2YWx1ZSBpbnRvIGl0cyBkZWNpbWFsIGZvcm1hdCBhbmQgc3RyaXAgb2ZmIHRoZSB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoL15zY2FsZS8udGVzdChwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IGVuZFZhbHVlIC8gMTAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEZvciBSR0IgY29tcG9uZW50cywgdGFrZSB0aGUgZGVmaW5lZCBwZXJjZW50YWdlIG9mIDI1NSBhbmQgc3RyaXAgb2ZmIHRoZSB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoLyhSZWR8R3JlZW58Qmx1ZSkkL2kudGVzdChwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IChlbmRWYWx1ZSAvIDEwMCkgKiAyNTU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWVVbml0VHlwZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHQgVW5pdCBSYXRpbyBDYWxjdWxhdGlvblxyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIFdoZW4gcXVlcmllZCwgdGhlIGJyb3dzZXIgcmV0dXJucyAobW9zdCkgQ1NTIHByb3BlcnR5IHZhbHVlcyBpbiBwaXhlbHMuIFRoZXJlZm9yZSwgaWYgYW4gZW5kVmFsdWUgd2l0aCBhIHVuaXQgdHlwZSBvZlxyXG5cdFx0XHRcdFx0XHRcdCAlLCBlbSwgb3IgcmVtIGlzIGFuaW1hdGVkIHRvd2FyZCwgc3RhcnRWYWx1ZSBtdXN0IGJlIGNvbnZlcnRlZCBmcm9tIHBpeGVscyBpbnRvIHRoZSBzYW1lIHVuaXQgdHlwZSBhcyBlbmRWYWx1ZSBpbiBvcmRlclxyXG5cdFx0XHRcdFx0XHRcdCBmb3IgdmFsdWUgbWFuaXB1bGF0aW9uIGxvZ2ljIChpbmNyZW1lbnQvZGVjcmVtZW50KSB0byBwcm9jZWVkLiBGdXJ0aGVyLCBpZiB0aGUgc3RhcnRWYWx1ZSB3YXMgZm9yY2VmZWQgb3IgdHJhbnNmZXJyZWRcclxuXHRcdFx0XHRcdFx0XHQgZnJvbSBhIHByZXZpb3VzIGNhbGwsIHN0YXJ0VmFsdWUgbWF5IGFsc28gbm90IGJlIGluIHBpeGVscy4gVW5pdCBjb252ZXJzaW9uIGxvZ2ljIHRoZXJlZm9yZSBjb25zaXN0cyBvZiB0d28gc3RlcHM6XHJcblx0XHRcdFx0XHRcdFx0IDEpIENhbGN1bGF0aW5nIHRoZSByYXRpbyBvZiAlL2VtL3JlbS92aC92dyByZWxhdGl2ZSB0byBwaXhlbHNcclxuXHRcdFx0XHRcdFx0XHQgMikgQ29udmVydGluZyBzdGFydFZhbHVlIGludG8gdGhlIHNhbWUgdW5pdCBvZiBtZWFzdXJlbWVudCBhcyBlbmRWYWx1ZSBiYXNlZCBvbiB0aGVzZSByYXRpb3MuICovXHJcblx0XHRcdFx0XHRcdFx0LyogVW5pdCBjb252ZXJzaW9uIHJhdGlvcyBhcmUgY2FsY3VsYXRlZCBieSBpbnNlcnRpbmcgYSBzaWJsaW5nIG5vZGUgbmV4dCB0byB0aGUgdGFyZ2V0IG5vZGUsIGNvcHlpbmcgb3ZlciBpdHMgcG9zaXRpb24gcHJvcGVydHksXHJcblx0XHRcdFx0XHRcdFx0IHNldHRpbmcgdmFsdWVzIHdpdGggdGhlIHRhcmdldCB1bml0IHR5cGUgdGhlbiBjb21wYXJpbmcgdGhlIHJldHVybmVkIHBpeGVsIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIE5vdGU6IEV2ZW4gaWYgb25seSBvbmUgb2YgdGhlc2UgdW5pdCB0eXBlcyBpcyBiZWluZyBhbmltYXRlZCwgYWxsIHVuaXQgcmF0aW9zIGFyZSBjYWxjdWxhdGVkIGF0IG9uY2Ugc2luY2UgdGhlIG92ZXJoZWFkXHJcblx0XHRcdFx0XHRcdFx0IG9mIGJhdGNoaW5nIHRoZSBTRVRzIGFuZCBHRVRzIHRvZ2V0aGVyIHVwZnJvbnQgb3V0d2VpZ2h0cyB0aGUgcG90ZW50aWFsIG92ZXJoZWFkXHJcblx0XHRcdFx0XHRcdFx0IG9mIGxheW91dCB0aHJhc2hpbmcgY2F1c2VkIGJ5IHJlLXF1ZXJ5aW5nIGZvciB1bmNhbGN1bGF0ZWQgcmF0aW9zIGZvciBzdWJzZXF1ZW50bHktcHJvY2Vzc2VkIHByb3BlcnRpZXMuICovXHJcblx0XHRcdFx0XHRcdFx0LyogVG9kbzogU2hpZnQgdGhpcyBsb2dpYyBpbnRvIHRoZSBjYWxscycgZmlyc3QgdGljayBpbnN0YW5jZSBzbyB0aGF0IGl0J3Mgc3luY2VkIHdpdGggUkFGLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHZhciBjYWxjdWxhdGVVbml0UmF0aW9zID0gZnVuY3Rpb24oKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0IFNhbWUgUmF0aW8gQ2hlY2tzXHJcblx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFRoZSBwcm9wZXJ0aWVzIGJlbG93IGFyZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBlbGVtZW50IGRpZmZlcnMgc3VmZmljaWVudGx5IGZyb20gdGhpcyBjYWxsJ3NcclxuXHRcdFx0XHRcdFx0XHRcdCBwcmV2aW91c2x5IGl0ZXJhdGVkIGVsZW1lbnQgdG8gYWxzbyBkaWZmZXIgaW4gaXRzIHVuaXQgY29udmVyc2lvbiByYXRpb3MuIElmIHRoZSBwcm9wZXJ0aWVzIG1hdGNoIHVwIHdpdGggdGhvc2VcclxuXHRcdFx0XHRcdFx0XHRcdCBvZiB0aGUgcHJpb3IgZWxlbWVudCwgdGhlIHByaW9yIGVsZW1lbnQncyBjb252ZXJzaW9uIHJhdGlvcyBhcmUgdXNlZC4gTGlrZSBtb3N0IG9wdGltaXphdGlvbnMgaW4gVmVsb2NpdHksXHJcblx0XHRcdFx0XHRcdFx0XHQgdGhpcyBpcyBkb25lIHRvIG1pbmltaXplIERPTSBxdWVyeWluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHZhciBzYW1lUmF0aW9JbmRpY2F0b3JzID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRteVBhcmVudDogZWxlbWVudC5wYXJlbnROb2RlIHx8IGRvY3VtZW50LmJvZHksIC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRwb3NpdGlvbjogQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJwb3NpdGlvblwiKSwgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvbnRTaXplOiBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImZvbnRTaXplXCIpIC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBEZXRlcm1pbmUgaWYgdGhlIHNhbWUgJSByYXRpbyBjYW4gYmUgdXNlZC4gJSBpcyBiYXNlZCBvbiB0aGUgZWxlbWVudCdzIHBvc2l0aW9uIHZhbHVlIGFuZCBpdHMgcGFyZW50J3Mgd2lkdGggYW5kIGhlaWdodCBkaW1lbnNpb25zLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNhbWVQZXJjZW50UmF0aW8gPSAoKHNhbWVSYXRpb0luZGljYXRvcnMucG9zaXRpb24gPT09IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdFBvc2l0aW9uKSAmJiAoc2FtZVJhdGlvSW5kaWNhdG9ycy5teVBhcmVudCA9PT0gY2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0UGFyZW50KSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogRGV0ZXJtaW5lIGlmIHRoZSBzYW1lIGVtIHJhdGlvIGNhbiBiZSB1c2VkLiBlbSBpcyByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCdzIGZvbnRTaXplLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNhbWVFbVJhdGlvID0gKHNhbWVSYXRpb0luZGljYXRvcnMuZm9udFNpemUgPT09IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdEZvbnRTaXplKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBTdG9yZSB0aGVzZSByYXRpbyBpbmRpY2F0b3JzIGNhbGwtd2lkZSBmb3IgdGhlIG5leHQgZWxlbWVudCB0byBjb21wYXJlIGFnYWluc3QuICovXHJcblx0XHRcdFx0XHRcdFx0XHRjYWxsVW5pdENvbnZlcnNpb25EYXRhLmxhc3RQYXJlbnQgPSBzYW1lUmF0aW9JbmRpY2F0b3JzLm15UGFyZW50O1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0UG9zaXRpb24gPSBzYW1lUmF0aW9JbmRpY2F0b3JzLnBvc2l0aW9uO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0Rm9udFNpemUgPSBzYW1lUmF0aW9JbmRpY2F0b3JzLmZvbnRTaXplO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdCBFbGVtZW50LVNwZWNpZmljIFVuaXRzXHJcblx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIE5vdGU6IElFOCByb3VuZHMgdG8gdGhlIG5lYXJlc3QgcGl4ZWwgd2hlbiByZXR1cm5pbmcgQ1NTIHZhbHVlcywgdGh1cyB3ZSBwZXJmb3JtIGNvbnZlcnNpb25zIHVzaW5nIGEgbWVhc3VyZW1lbnRcclxuXHRcdFx0XHRcdFx0XHRcdCBvZiAxMDAgKGluc3RlYWQgb2YgMSkgdG8gZ2l2ZSBvdXIgcmF0aW9zIGEgcHJlY2lzaW9uIG9mIGF0IGxlYXN0IDIgZGVjaW1hbCB2YWx1ZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgbWVhc3VyZW1lbnQgPSAxMDAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pdFJhdGlvcyA9IHt9O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICghc2FtZUVtUmF0aW8gfHwgIXNhbWVQZXJjZW50UmF0aW8pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGR1bW15ID0gZGF0YSAmJiBkYXRhLmlzU1ZHID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJyZWN0XCIpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LmluaXQoZHVtbXkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzYW1lUmF0aW9JbmRpY2F0b3JzLm15UGFyZW50LmFwcGVuZENoaWxkKGR1bW15KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFRvIGFjY3VyYXRlbHkgYW5kIGNvbnNpc3RlbnRseSBjYWxjdWxhdGUgY29udmVyc2lvbiByYXRpb3MsIHRoZSBlbGVtZW50J3MgY2FzY2FkZWQgb3ZlcmZsb3cgYW5kIGJveC1zaXppbmcgYXJlIHN0cmlwcGVkLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgU2ltaWxhcmx5LCBzaW5jZSB3aWR0aC9oZWlnaHQgY2FuIGJlIGFydGlmaWNpYWxseSBjb25zdHJhaW5lZCBieSB0aGVpciBtaW4tL21heC0gZXF1aXZhbGVudHMsIHRoZXNlIGFyZSBjb250cm9sbGVkIGZvciBhcyB3ZWxsLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBPdmVyZmxvdyBtdXN0IGJlIGFsc28gYmUgY29udHJvbGxlZCBmb3IgcGVyLWF4aXMgc2luY2UgdGhlIG92ZXJmbG93IHByb3BlcnR5IG92ZXJ3cml0ZXMgaXRzIHBlci1heGlzIHZhbHVlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0JC5lYWNoKFtcIm92ZXJmbG93XCIsIFwib3ZlcmZsb3dYXCIsIFwib3ZlcmZsb3dZXCJdLCBmdW5jdGlvbihpLCBwcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5zZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBwcm9wZXJ0eSwgXCJoaWRkZW5cIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5DU1Muc2V0UHJvcGVydHlWYWx1ZShkdW1teSwgXCJwb3NpdGlvblwiLCBzYW1lUmF0aW9JbmRpY2F0b3JzLnBvc2l0aW9uKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuQ1NTLnNldFByb3BlcnR5VmFsdWUoZHVtbXksIFwiZm9udFNpemVcIiwgc2FtZVJhdGlvSW5kaWNhdG9ycy5mb250U2l6ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5zZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBcImJveFNpemluZ1wiLCBcImNvbnRlbnQtYm94XCIpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Lyogd2lkdGggYW5kIGhlaWdodCBhY3QgYXMgb3VyIHByb3h5IHByb3BlcnRpZXMgZm9yIG1lYXN1cmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgJSByYXRpb3MuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdCQuZWFjaChbXCJtaW5XaWR0aFwiLCBcIm1heFdpZHRoXCIsIFwid2lkdGhcIiwgXCJtaW5IZWlnaHRcIiwgXCJtYXhIZWlnaHRcIiwgXCJoZWlnaHRcIl0sIGZ1bmN0aW9uKGksIHByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuQ1NTLnNldFByb3BlcnR5VmFsdWUoZHVtbXksIHByb3BlcnR5LCBtZWFzdXJlbWVudCArIFwiJVwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIHBhZGRpbmdMZWZ0IGFyYml0cmFyaWx5IGFjdHMgYXMgb3VyIHByb3h5IHByb3BlcnR5IGZvciB0aGUgZW0gcmF0aW8uICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5zZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBcInBhZGRpbmdMZWZ0XCIsIG1lYXN1cmVtZW50ICsgXCJlbVwiKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIERpdmlkZSB0aGUgcmV0dXJuZWQgdmFsdWUgYnkgdGhlIG1lYXN1cmVtZW50IHRvIGdldCB0aGUgcmF0aW8gYmV0d2VlbiAxJSBhbmQgMXB4LiBEZWZhdWx0IHRvIDEgc2luY2Ugd29ya2luZyB3aXRoIDAgY2FuIHByb2R1Y2UgSW5maW5pdGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MucGVyY2VudFRvUHhXaWR0aCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdFBlcmNlbnRUb1B4V2lkdGggPSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShkdW1teSwgXCJ3aWR0aFwiLCBudWxsLCB0cnVlKSkgfHwgMSkgLyBtZWFzdXJlbWVudDsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MucGVyY2VudFRvUHhIZWlnaHQgPSBjYWxsVW5pdENvbnZlcnNpb25EYXRhLmxhc3RQZXJjZW50VG9QeEhlaWdodCA9IChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBcImhlaWdodFwiLCBudWxsLCB0cnVlKSkgfHwgMSkgLyBtZWFzdXJlbWVudDsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MuZW1Ub1B4ID0gY2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0RW1Ub1B4ID0gKHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZHVtbXksIFwicGFkZGluZ0xlZnRcIikpIHx8IDEpIC8gbWVhc3VyZW1lbnQ7IC8qIEdFVCAqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0c2FtZVJhdGlvSW5kaWNhdG9ycy5teVBhcmVudC5yZW1vdmVDaGlsZChkdW1teSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bml0UmF0aW9zLmVtVG9QeCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdEVtVG9QeDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dW5pdFJhdGlvcy5wZXJjZW50VG9QeFdpZHRoID0gY2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0UGVyY2VudFRvUHhXaWR0aDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dW5pdFJhdGlvcy5wZXJjZW50VG9QeEhlaWdodCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdFBlcmNlbnRUb1B4SGVpZ2h0O1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdCBFbGVtZW50LUFnbm9zdGljIFVuaXRzXHJcblx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFdoZXJlYXMgJSBhbmQgZW0gcmF0aW9zIGFyZSBkZXRlcm1pbmVkIG9uIGEgcGVyLWVsZW1lbnQgYmFzaXMsIHRoZSByZW0gdW5pdCBvbmx5IG5lZWRzIHRvIGJlIGNoZWNrZWRcclxuXHRcdFx0XHRcdFx0XHRcdCBvbmNlIHBlciBjYWxsIHNpbmNlIGl0J3MgZXhjbHVzaXZlbHkgZGVwZW5kYW50IHVwb24gZG9jdW1lbnQuYm9keSdzIGZvbnRTaXplLiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lXHJcblx0XHRcdFx0XHRcdFx0XHQgdGhhdCBjYWxjdWxhdGVVbml0UmF0aW9zKCkgaXMgYmVpbmcgcnVuIGR1cmluZyB0aGlzIGNhbGwsIHJlbVRvUHggd2lsbCBzdGlsbCBiZSBzZXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUgb2YgbnVsbCxcclxuXHRcdFx0XHRcdFx0XHRcdCBzbyB3ZSBjYWxjdWxhdGUgaXQgbm93LiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNhbGxVbml0Q29udmVyc2lvbkRhdGEucmVtVG9QeCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBEZWZhdWx0IHRvIGJyb3dzZXJzJyBkZWZhdWx0IGZvbnRTaXplIG9mIDE2cHggaW4gdGhlIGNhc2Ugb2YgMC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS5yZW1Ub1B4ID0gcGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShkb2N1bWVudC5ib2R5LCBcImZvbnRTaXplXCIpKSB8fCAxNjsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogU2ltaWxhcmx5LCB2aWV3cG9ydCB1bml0cyBhcmUgJS1yZWxhdGl2ZSB0byB0aGUgd2luZG93J3MgaW5uZXIgZGltZW5zaW9ucy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChjYWxsVW5pdENvbnZlcnNpb25EYXRhLnZ3VG9QeCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYWxsVW5pdENvbnZlcnNpb25EYXRhLnZ3VG9QeCA9IHBhcnNlRmxvYXQod2luZG93LmlubmVyV2lkdGgpIC8gMTAwOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS52aFRvUHggPSBwYXJzZUZsb2F0KHdpbmRvdy5pbm5lckhlaWdodCkgLyAxMDA7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MucmVtVG9QeCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEucmVtVG9QeDtcclxuXHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MudndUb1B4ID0gY2FsbFVuaXRDb252ZXJzaW9uRGF0YS52d1RvUHg7XHJcblx0XHRcdFx0XHRcdFx0XHR1bml0UmF0aW9zLnZoVG9QeCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEudmhUb1B4O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChWZWxvY2l0eS5kZWJ1ZyA+PSAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiVW5pdCByYXRpb3M6IFwiICsgSlNPTi5zdHJpbmdpZnkodW5pdFJhdGlvcyksIGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuaXRSYXRpb3M7XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFVuaXQgQ29udmVyc2lvblxyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogVGhlICogYW5kIC8gb3BlcmF0b3JzLCB3aGljaCBhcmUgbm90IHBhc3NlZCBpbiB3aXRoIGFuIGFzc29jaWF0ZWQgdW5pdCwgaW5oZXJlbnRseSB1c2Ugc3RhcnRWYWx1ZSdzIHVuaXQuIFNraXAgdmFsdWUgYW5kIHVuaXQgY29udmVyc2lvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoL1tcXC8qXS8udGVzdChvcGVyYXRvcikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBzdGFydFZhbHVlVW5pdFR5cGU7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBJZiBzdGFydFZhbHVlIGFuZCBlbmRWYWx1ZSBkaWZmZXIgaW4gdW5pdCB0eXBlLCBjb252ZXJ0IHN0YXJ0VmFsdWUgaW50byB0aGUgc2FtZSB1bml0IHR5cGUgYXMgZW5kVmFsdWUgc28gdGhhdCBpZiBlbmRWYWx1ZVVuaXRUeXBlXHJcblx0XHRcdFx0XHRcdFx0XHQgaXMgYSByZWxhdGl2ZSB1bml0ICglLCBlbSwgcmVtKSwgdGhlIHZhbHVlcyBzZXQgZHVyaW5nIHR3ZWVuaW5nIHdpbGwgY29udGludWUgdG8gYmUgYWNjdXJhdGVseSByZWxhdGl2ZSBldmVuIGlmIHRoZSBtZXRyaWNzIHRoZXkgZGVwZW5kXHJcblx0XHRcdFx0XHRcdFx0XHQgb24gYXJlIGR5bmFtaWNhbGx5IGNoYW5naW5nIGR1cmluZyB0aGUgY291cnNlIG9mIHRoZSBhbmltYXRpb24uIENvbnZlcnNlbHksIGlmIHdlIGFsd2F5cyBub3JtYWxpemVkIGludG8gcHggYW5kIHVzZWQgcHggZm9yIHNldHRpbmcgdmFsdWVzLCB0aGUgcHggcmF0aW9cclxuXHRcdFx0XHRcdFx0XHRcdCB3b3VsZCBiZWNvbWUgc3RhbGUgaWYgdGhlIG9yaWdpbmFsIHVuaXQgYmVpbmcgYW5pbWF0ZWQgdG93YXJkIHdhcyByZWxhdGl2ZSBhbmQgdGhlIHVuZGVybHlpbmcgbWV0cmljcyBjaGFuZ2UgZHVyaW5nIHRoZSBhbmltYXRpb24uICovXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBTaW5jZSAwIGlzIDAgaW4gYW55IHVuaXQgdHlwZSwgbm8gY29udmVyc2lvbiBpcyBuZWNlc3Nhcnkgd2hlbiBzdGFydFZhbHVlIGlzIDAgLS0gd2UganVzdCBzdGFydCBhdCAwIHdpdGggZW5kVmFsdWVVbml0VHlwZS4gKi9cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKChzdGFydFZhbHVlVW5pdFR5cGUgIT09IGVuZFZhbHVlVW5pdFR5cGUpICYmIHN0YXJ0VmFsdWUgIT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIFVuaXQgY29udmVyc2lvbiBpcyBhbHNvIHNraXBwZWQgd2hlbiBlbmRWYWx1ZSBpcyAwLCBidXQgKnN0YXJ0VmFsdWVVbml0VHlwZSogbXVzdCBiZSB1c2VkIGZvciB0d2VlbiB2YWx1ZXMgdG8gcmVtYWluIGFjY3VyYXRlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogTm90ZTogU2tpcHBpbmcgdW5pdCBjb252ZXJzaW9uIGhlcmUgbWVhbnMgdGhhdCBpZiBlbmRWYWx1ZVVuaXRUeXBlIHdhcyBvcmlnaW5hbGx5IGEgcmVsYXRpdmUgdW5pdCwgdGhlIGFuaW1hdGlvbiB3b24ndCByZWxhdGl2ZWx5XHJcblx0XHRcdFx0XHRcdFx0XHQgbWF0Y2ggdGhlIHVuZGVybHlpbmcgbWV0cmljcyBpZiB0aGV5IGNoYW5nZSwgYnV0IHRoaXMgaXMgYWNjZXB0YWJsZSBzaW5jZSB3ZSdyZSBhbmltYXRpbmcgdG93YXJkIGludmlzaWJpbGl0eSBpbnN0ZWFkIG9mIHRvd2FyZCB2aXNpYmlsaXR5LFxyXG5cdFx0XHRcdFx0XHRcdFx0IHdoaWNoIHJlbWFpbnMgcGFzdCB0aGUgcG9pbnQgb2YgdGhlIGFuaW1hdGlvbidzIGNvbXBsZXRpb24uICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZW5kVmFsdWUgPT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWVVbml0VHlwZSA9IHN0YXJ0VmFsdWVVbml0VHlwZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIEJ5IHRoaXMgcG9pbnQsIHdlIGNhbm5vdCBhdm9pZCB1bml0IGNvbnZlcnNpb24gKGl0J3MgdW5kZXNpcmFibGUgc2luY2UgaXQgY2F1c2VzIGxheW91dCB0aHJhc2hpbmcpLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgSWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCB3ZSB0cmlnZ2VyIGNhbGN1bGF0ZVVuaXRSYXRpb3MoKSwgd2hpY2ggcnVucyBvbmNlIHBlciBlbGVtZW50IHBlciBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhID0gZWxlbWVudFVuaXRDb252ZXJzaW9uRGF0YSB8fCBjYWxjdWxhdGVVbml0UmF0aW9zKCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBUaGUgZm9sbG93aW5nIFJlZ0V4IG1hdGNoZXMgQ1NTIHByb3BlcnRpZXMgdGhhdCBoYXZlIHRoZWlyICUgdmFsdWVzIG1lYXN1cmVkIHJlbGF0aXZlIHRvIHRoZSB4LWF4aXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIE5vdGU6IFczQyBzcGVjIG1hbmRhdGVzIHRoYXQgYWxsIG9mIG1hcmdpbiBhbmQgcGFkZGluZydzIHByb3BlcnRpZXMgKGV2ZW4gdG9wIGFuZCBib3R0b20pIGFyZSAlLXJlbGF0aXZlIHRvIHRoZSAqd2lkdGgqIG9mIHRoZSBwYXJlbnQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGF4aXMgPSAoL21hcmdpbnxwYWRkaW5nfGxlZnR8cmlnaHR8d2lkdGh8dGV4dHx3b3JkfGxldHRlci9pLnRlc3QocHJvcGVydHkpIHx8IC9YJC8udGVzdChwcm9wZXJ0eSkgfHwgcHJvcGVydHkgPT09IFwieFwiKSA/IFwieFwiIDogXCJ5XCI7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBJbiBvcmRlciB0byBhdm9pZCBnZW5lcmF0aW5nIG5eMiBiZXNwb2tlIGNvbnZlcnNpb24gZnVuY3Rpb25zLCB1bml0IGNvbnZlcnNpb24gaXMgYSB0d28tc3RlcCBwcm9jZXNzOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgMSkgQ29udmVydCBzdGFydFZhbHVlIGludG8gcGl4ZWxzLiAyKSBDb252ZXJ0IHRoaXMgbmV3IHBpeGVsIHZhbHVlIGludG8gZW5kVmFsdWUncyB1bml0IHR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN3aXRjaCAoc3RhcnRWYWx1ZVVuaXRUeXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIiVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIE5vdGU6IHRyYW5zbGF0ZVggYW5kIHRyYW5zbGF0ZVkgYXJlIHRoZSBvbmx5IHByb3BlcnRpZXMgdGhhdCBhcmUgJS1yZWxhdGl2ZSB0byBhbiBlbGVtZW50J3Mgb3duIGRpbWVuc2lvbnMgLS0gbm90IGl0cyBwYXJlbnQncyBkaW1lbnNpb25zLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IFZlbG9jaXR5IGRvZXMgbm90IGluY2x1ZGUgYSBzcGVjaWFsIGNvbnZlcnNpb24gcHJvY2VzcyB0byBhY2NvdW50IGZvciB0aGlzIGJlaGF2aW9yLiBUaGVyZWZvcmUsIGFuaW1hdGluZyB0cmFuc2xhdGVYL1kgZnJvbSBhICUgdmFsdWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCB0byBhIG5vbi0lIHZhbHVlIHdpbGwgcHJvZHVjZSBhbiBpbmNvcnJlY3Qgc3RhcnQgdmFsdWUuIEZvcnR1bmF0ZWx5LCB0aGlzIHNvcnQgb2YgY3Jvc3MtdW5pdCBjb252ZXJzaW9uIGlzIHJhcmVseSBkb25lIGJ5IHVzZXJzIGluIHByYWN0aWNlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSAqPSAoYXhpcyA9PT0gXCJ4XCIgPyBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhLnBlcmNlbnRUb1B4V2lkdGggOiBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhLnBlcmNlbnRUb1B4SGVpZ2h0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwicHhcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIHB4IGFjdHMgYXMgb3VyIG1pZHBvaW50IGluIHRoZSB1bml0IGNvbnZlcnNpb24gcHJvY2VzczsgZG8gbm90aGluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSAqPSBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhW3N0YXJ0VmFsdWVVbml0VHlwZSArIFwiVG9QeFwiXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogSW52ZXJ0IHRoZSBweCByYXRpb3MgdG8gY29udmVydCBpbnRvIHRvIHRoZSB0YXJnZXQgdW5pdC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0c3dpdGNoIChlbmRWYWx1ZVVuaXRUeXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIiVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgKj0gMSAvIChheGlzID09PSBcInhcIiA/IGVsZW1lbnRVbml0Q29udmVyc2lvbkRhdGEucGVyY2VudFRvUHhXaWR0aCA6IGVsZW1lbnRVbml0Q29udmVyc2lvbkRhdGEucGVyY2VudFRvUHhIZWlnaHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJweFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Lyogc3RhcnRWYWx1ZSBpcyBhbHJlYWR5IGluIHB4LCBkbyBub3RoaW5nOyB3ZSdyZSBkb25lLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlICo9IDEgLyBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhW2VuZFZhbHVlVW5pdFR5cGUgKyBcIlRvUHhcIl07XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHQgUmVsYXRpdmUgVmFsdWVzXHJcblx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogT3BlcmF0b3IgbG9naWMgbXVzdCBiZSBwZXJmb3JtZWQgbGFzdCBzaW5jZSBpdCByZXF1aXJlcyB1bml0LW5vcm1hbGl6ZWQgc3RhcnQgYW5kIGVuZCB2YWx1ZXMuICovXHJcblx0XHRcdFx0XHRcdFx0LyogTm90ZTogUmVsYXRpdmUgKnBlcmNlbnQgdmFsdWVzKiBkbyBub3QgYmVoYXZlIGhvdyBtb3N0IHBlb3BsZSB0aGluazsgd2hpbGUgb25lIHdvdWxkIGV4cGVjdCBcIis9NTAlXCJcclxuXHRcdFx0XHRcdFx0XHQgdG8gaW5jcmVhc2UgdGhlIHByb3BlcnR5IDEuNXggaXRzIGN1cnJlbnQgdmFsdWUsIGl0IGluIGZhY3QgaW5jcmVhc2VzIHRoZSBwZXJjZW50IHVuaXRzIGluIGFic29sdXRlIHRlcm1zOlxyXG5cdFx0XHRcdFx0XHRcdCA1MCBwb2ludHMgaXMgYWRkZWQgb24gdG9wIG9mIHRoZSBjdXJyZW50ICUgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChvcGVyYXRvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIitcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBzdGFydFZhbHVlICsgZW5kVmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCItXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gc3RhcnRWYWx1ZSAtIGVuZFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiKlwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IHN0YXJ0VmFsdWUgKiBlbmRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIi9cIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBzdGFydFZhbHVlIC8gZW5kVmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IHR3ZWVuc0NvbnRhaW5lciBQdXNoXHJcblx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBDb25zdHJ1Y3QgdGhlIHBlci1wcm9wZXJ0eSB0d2VlbiBvYmplY3QsIGFuZCBwdXNoIGl0IHRvIHRoZSBlbGVtZW50J3MgdHdlZW5zQ29udGFpbmVyLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0gPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZTogcm9vdFByb3BlcnR5VmFsdWUsXHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlOiBzdGFydFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFZhbHVlOiBzdGFydFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWU6IGVuZFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0dW5pdFR5cGU6IGVuZFZhbHVlVW5pdFR5cGUsXHJcblx0XHRcdFx0XHRcdFx0XHRlYXNpbmc6IGVhc2luZ1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0aWYgKHBhdHRlcm4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0ucGF0dGVybiA9IHBhdHRlcm47XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoVmVsb2NpdHkuZGVidWcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwidHdlZW5zQ29udGFpbmVyIChcIiArIHByb3BlcnR5ICsgXCIpOiBcIiArIEpTT04uc3RyaW5naWZ5KHR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0pLCBlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBDcmVhdGUgYSB0d2VlbiBvdXQgb2YgZWFjaCBwcm9wZXJ0eSwgYW5kIGFwcGVuZCBpdHMgYXNzb2NpYXRlZCBkYXRhIHRvIHR3ZWVuc0NvbnRhaW5lci4gKi9cclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllc01hcCkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIXByb3BlcnRpZXNNYXAuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0LyogVGhlIG9yaWdpbmFsIHByb3BlcnR5IG5hbWUncyBmb3JtYXQgbXVzdCBiZSB1c2VkIGZvciB0aGUgcGFyc2VQcm9wZXJ0eVZhbHVlKCkgbG9va3VwLFxyXG5cdFx0XHRcdFx0XHRcdCBidXQgd2UgdGhlbiB1c2UgaXRzIGNhbWVsQ2FzZSBzdHlsaW5nIHRvIG5vcm1hbGl6ZSBpdCBmb3IgbWFuaXB1bGF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHZhciBwcm9wZXJ0eU5hbWUgPSBDU1MuTmFtZXMuY2FtZWxDYXNlKHByb3BlcnR5KSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWVEYXRhID0gcGFyc2VQcm9wZXJ0eVZhbHVlKHByb3BlcnRpZXNNYXBbcHJvcGVydHldKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogRmluZCBzaG9ydGhhbmQgY29sb3IgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgYSBoZXggc3RyaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIFdvdWxkIGJlIHF1aWNrZXIgdG8gdXNlIENTUy5MaXN0cy5jb2xvcnMuaW5jbHVkZXMoKSBpZiBwb3NzaWJsZSAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChfaW5BcnJheShDU1MuTGlzdHMuY29sb3JzLCBwcm9wZXJ0eU5hbWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBQYXJzZSB0aGUgdmFsdWUgZGF0YSBmb3IgZWFjaCBzaG9ydGhhbmQuICovXHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgZW5kVmFsdWUgPSB2YWx1ZURhdGFbMF0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWFzaW5nID0gdmFsdWVEYXRhWzFdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSB2YWx1ZURhdGFbMl07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKENTUy5SZWdFeC5pc0hleC50ZXN0KGVuZFZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBDb252ZXJ0IHRoZSBoZXggc3RyaW5ncyBpbnRvIHRoZWlyIFJHQiBjb21wb25lbnQgYXJyYXlzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgY29sb3JDb21wb25lbnRzID0gW1wiUmVkXCIsIFwiR3JlZW5cIiwgXCJCbHVlXCJdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWVSR0IgPSBDU1MuVmFsdWVzLmhleFRvUmdiKGVuZFZhbHVlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWVSR0IgPSBzdGFydFZhbHVlID8gQ1NTLlZhbHVlcy5oZXhUb1JnYihzdGFydFZhbHVlKSA6IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIEluamVjdCB0aGUgUkdCIGNvbXBvbmVudCB0d2VlbnMgaW50byBwcm9wZXJ0aWVzTWFwLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNvbG9yQ29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBkYXRhQXJyYXkgPSBbZW5kVmFsdWVSR0JbaV1dO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZWFzaW5nKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhQXJyYXkucHVzaChlYXNpbmcpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHN0YXJ0VmFsdWVSR0IgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YUFycmF5LnB1c2goc3RhcnRWYWx1ZVJHQltpXSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaXhQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSArIGNvbG9yQ29tcG9uZW50c1tpXSwgZGF0YUFycmF5KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB3ZSBoYXZlIHJlcGxhY2VkIGEgc2hvcnRjdXQgY29sb3IgdmFsdWUgdGhlbiBkb24ndCB1cGRhdGUgdGhlIHN0YW5kYXJkIHByb3BlcnR5IG5hbWUgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGZpeFByb3BlcnR5VmFsdWUocHJvcGVydHlOYW1lLCB2YWx1ZURhdGEpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBBbG9uZyB3aXRoIGl0cyBwcm9wZXJ0eSBkYXRhLCBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBpdHNlbGYgb250byB0d2VlbnNDb250YWluZXIuICovXHJcblx0XHRcdFx0XHRcdHR3ZWVuc0NvbnRhaW5lci5lbGVtZW50ID0gZWxlbWVudDtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdCBDYWxsIFB1c2hcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHQvKiBOb3RlOiB0d2VlbnNDb250YWluZXIgY2FuIGJlIGVtcHR5IGlmIGFsbCBvZiB0aGUgcHJvcGVydGllcyBpbiB0aGlzIGNhbGwncyBwcm9wZXJ0eSBtYXAgd2VyZSBza2lwcGVkIGR1ZSB0byBub3RcclxuXHRcdFx0XHRcdCBiZWluZyBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuIFRoZSBlbGVtZW50IHByb3BlcnR5IGlzIHVzZWQgZm9yIGNoZWNraW5nIHRoYXQgdGhlIHR3ZWVuc0NvbnRhaW5lciBoYXMgYmVlbiBhcHBlbmRlZCB0by4gKi9cclxuXHRcdFx0XHRcdGlmICh0d2VlbnNDb250YWluZXIuZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHQvKiBBcHBseSB0aGUgXCJ2ZWxvY2l0eS1hbmltYXRpbmdcIiBpbmRpY2F0b3IgY2xhc3MuICovXHJcblx0XHRcdFx0XHRcdENTUy5WYWx1ZXMuYWRkQ2xhc3MoZWxlbWVudCwgXCJ2ZWxvY2l0eS1hbmltYXRpbmdcIik7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUaGUgY2FsbCBhcnJheSBob3VzZXMgdGhlIHR3ZWVuc0NvbnRhaW5lcnMgZm9yIGVhY2ggZWxlbWVudCBiZWluZyBhbmltYXRlZCBpbiB0aGUgY3VycmVudCBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0XHRjYWxsLnB1c2godHdlZW5zQ29udGFpbmVyKTtcclxuXHJcblx0XHRcdFx0XHRcdGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKGRhdGEpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBTdG9yZSB0aGUgdHdlZW5zQ29udGFpbmVyIGFuZCBvcHRpb25zIGlmIHdlJ3JlIHdvcmtpbmcgb24gdGhlIGRlZmF1bHQgZWZmZWN0cyBxdWV1ZSwgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGJ5IHRoZSByZXZlcnNlIGNvbW1hbmQuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKG9wdHMucXVldWUgPT09IFwiXCIpIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhLnR3ZWVuc0NvbnRhaW5lciA9IHR3ZWVuc0NvbnRhaW5lcjtcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGEub3B0cyA9IG9wdHM7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBTd2l0Y2ggb24gdGhlIGVsZW1lbnQncyBhbmltYXRpbmcgZmxhZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRkYXRhLmlzQW5pbWF0aW5nID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogT25jZSB0aGUgZmluYWwgZWxlbWVudCBpbiB0aGlzIGNhbGwncyBlbGVtZW50IHNldCBoYXMgYmVlbiBwcm9jZXNzZWQsIHB1c2ggdGhlIGNhbGwgYXJyYXkgb250b1xyXG5cdFx0XHRcdFx0XHQgVmVsb2NpdHkuU3RhdGUuY2FsbHMgZm9yIHRoZSBhbmltYXRpb24gdGljayB0byBpbW1lZGlhdGVseSBiZWdpbiBwcm9jZXNzaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudHNJbmRleCA9PT0gZWxlbWVudHNMZW5ndGggLSAxKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogQWRkIHRoZSBjdXJyZW50IGNhbGwgcGx1cyBpdHMgYXNzb2NpYXRlZCBtZXRhZGF0YSAodGhlIGVsZW1lbnQgc2V0IGFuZCB0aGUgY2FsbCdzIG9wdGlvbnMpIG9udG8gdGhlIGdsb2JhbCBjYWxsIGNvbnRhaW5lci5cclxuXHRcdFx0XHRcdFx0XHQgQW55dGhpbmcgb24gdGhpcyBjYWxsIGNvbnRhaW5lciBpcyBzdWJqZWN0ZWQgdG8gdGljaygpIHByb2Nlc3NpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuU3RhdGUuY2FsbHMucHVzaChbY2FsbCwgZWxlbWVudHMsIG9wdHMsIG51bGwsIHByb21pc2VEYXRhLnJlc29sdmVyLCBudWxsLCAwXSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBhbmltYXRpb24gdGljayBpc24ndCBydW5uaW5nLCBzdGFydCBpdC4gKFZlbG9jaXR5IHNodXRzIGl0IG9mZiB3aGVuIHRoZXJlIGFyZSBubyBhY3RpdmUgY2FsbHMgdG8gcHJvY2Vzcy4pICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LlN0YXRlLmlzVGlja2luZyA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmlzVGlja2luZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogU3RhcnQgdGhlIHRpY2sgbG9vcC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHRpY2soKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudHNJbmRleCsrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKiBXaGVuIHRoZSBxdWV1ZSBvcHRpb24gaXMgc2V0IHRvIGZhbHNlLCB0aGUgY2FsbCBza2lwcyB0aGUgZWxlbWVudCdzIHF1ZXVlIGFuZCBmaXJlcyBpbW1lZGlhdGVseS4gKi9cclxuXHRcdFx0XHRpZiAob3B0cy5xdWV1ZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdC8qIFNpbmNlIHRoaXMgYnVpbGRRdWV1ZSBjYWxsIGRvZXNuJ3QgcmVzcGVjdCB0aGUgZWxlbWVudCdzIGV4aXN0aW5nIHF1ZXVlICh3aGljaCBpcyB3aGVyZSBhIGRlbGF5IG9wdGlvbiB3b3VsZCBoYXZlIGJlZW4gYXBwZW5kZWQpLFxyXG5cdFx0XHRcdFx0IHdlIG1hbnVhbGx5IGluamVjdCB0aGUgZGVsYXkgcHJvcGVydHkgaGVyZSB3aXRoIGFuIGV4cGxpY2l0IHNldFRpbWVvdXQuICovXHJcblx0XHRcdFx0XHRpZiAob3B0cy5kZWxheSkge1xyXG5cclxuXHRcdFx0XHRcdFx0LyogVGVtcG9yYXJpbHkgc3RvcmUgZGVsYXllZCBlbGVtZW50cyB0byBmYWNpbGl0YXRlIGFjY2VzcyBmb3IgZ2xvYmFsIHBhdXNlL3Jlc3VtZSAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgY2FsbEluZGV4ID0gVmVsb2NpdHkuU3RhdGUuZGVsYXllZEVsZW1lbnRzLmNvdW50Kys7XHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmRlbGF5ZWRFbGVtZW50c1tjYWxsSW5kZXhdID0gZWxlbWVudDtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBkZWxheUNvbXBsZXRlID0gKGZ1bmN0aW9uKGluZGV4KSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ2xlYXIgdGhlIHRlbXBvcmFyeSBlbGVtZW50ICovXHJcblx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5kZWxheWVkRWxlbWVudHNbaW5kZXhdID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogRmluYWxseSwgaXNzdWUgdGhlIGNhbGwgKi9cclxuXHRcdFx0XHRcdFx0XHRcdGJ1aWxkUXVldWUoKTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9KShjYWxsSW5kZXgpO1xyXG5cclxuXHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS5kZWxheUJlZ2luID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcclxuXHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS5kZWxheSA9IHBhcnNlRmxvYXQob3B0cy5kZWxheSk7XHJcblx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkuZGVsYXlUaW1lciA9IHtcclxuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0OiBzZXRUaW1lb3V0KGJ1aWxkUXVldWUsIHBhcnNlRmxvYXQob3B0cy5kZWxheSkpLFxyXG5cdFx0XHRcdFx0XHRcdG5leHQ6IGRlbGF5Q29tcGxldGVcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGJ1aWxkUXVldWUoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8qIE90aGVyd2lzZSwgdGhlIGNhbGwgdW5kZXJnb2VzIGVsZW1lbnQgcXVldWVpbmcgYXMgbm9ybWFsLiAqL1xyXG5cdFx0XHRcdFx0LyogTm90ZTogVG8gaW50ZXJvcGVyYXRlIHdpdGggalF1ZXJ5LCBWZWxvY2l0eSB1c2VzIGpRdWVyeSdzIG93biAkLnF1ZXVlKCkgc3RhY2sgZm9yIHF1ZXVpbmcgbG9naWMuICovXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdCQucXVldWUoZWxlbWVudCwgb3B0cy5xdWV1ZSwgZnVuY3Rpb24obmV4dCwgY2xlYXJRdWV1ZSkge1xyXG5cdFx0XHRcdFx0XHQvKiBJZiB0aGUgY2xlYXJRdWV1ZSBmbGFnIHdhcyBwYXNzZWQgaW4gYnkgdGhlIHN0b3AgY29tbWFuZCwgcmVzb2x2ZSB0aGlzIGNhbGwncyBwcm9taXNlLiAoUHJvbWlzZXMgY2FuIG9ubHkgYmUgcmVzb2x2ZWQgb25jZSxcclxuXHRcdFx0XHRcdFx0IHNvIGl0J3MgZmluZSBpZiB0aGlzIGlzIHJlcGVhdGVkbHkgdHJpZ2dlcmVkIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGFzc29jaWF0ZWQgY2FsbC4pICovXHJcblx0XHRcdFx0XHRcdGlmIChjbGVhclF1ZXVlID09PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHByb21pc2VEYXRhLnByb21pc2UpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHByb21pc2VEYXRhLnJlc29sdmVyKGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIERvIG5vdCBjb250aW51ZSB3aXRoIGFuaW1hdGlvbiBxdWV1ZWluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogVGhpcyBmbGFnIGluZGljYXRlcyB0byB0aGUgdXBjb21pbmcgY29tcGxldGVDYWxsKCkgZnVuY3Rpb24gdGhhdCB0aGlzIHF1ZXVlIGVudHJ5IHdhcyBpbml0aWF0ZWQgYnkgVmVsb2NpdHkuXHJcblx0XHRcdFx0XHRcdCBTZWUgY29tcGxldGVDYWxsKCkgZm9yIGZ1cnRoZXIgZGV0YWlscy4gKi9cclxuXHRcdFx0XHRcdFx0VmVsb2NpdHkudmVsb2NpdHlRdWV1ZUVudHJ5RmxhZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRidWlsZFF1ZXVlKG5leHQpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IEF1dG8tRGVxdWV1aW5nXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogQXMgcGVyIGpRdWVyeSdzICQucXVldWUoKSBiZWhhdmlvciwgdG8gZmlyZSB0aGUgZmlyc3Qgbm9uLWN1c3RvbS1xdWV1ZSBlbnRyeSBvbiBhbiBlbGVtZW50LCB0aGUgZWxlbWVudFxyXG5cdFx0XHRcdCBtdXN0IGJlIGRlcXVldWVkIGlmIGl0cyBxdWV1ZSBzdGFjayBjb25zaXN0cyAqc29sZWx5KiBvZiB0aGUgY3VycmVudCBjYWxsLiAoVGhpcyBjYW4gYmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZ1xyXG5cdFx0XHRcdCBmb3IgdGhlIFwiaW5wcm9ncmVzc1wiIGl0ZW0gdGhhdCBqUXVlcnkgcHJlcGVuZHMgdG8gYWN0aXZlIHF1ZXVlIHN0YWNrIGFycmF5cy4pIFJlZ2FyZGxlc3MsIHdoZW5ldmVyIHRoZSBlbGVtZW50J3NcclxuXHRcdFx0XHQgcXVldWUgaXMgZnVydGhlciBhcHBlbmRlZCB3aXRoIGFkZGl0aW9uYWwgaXRlbXMgLS0gaW5jbHVkaW5nICQuZGVsYXkoKSdzIG9yIGV2ZW4gJC5hbmltYXRlKCkgY2FsbHMsIHRoZSBxdWV1ZSdzXHJcblx0XHRcdFx0IGZpcnN0IGVudHJ5IGlzIGF1dG9tYXRpY2FsbHkgZmlyZWQuIFRoaXMgYmVoYXZpb3IgY29udHJhc3RzIHRoYXQgb2YgY3VzdG9tIHF1ZXVlcywgd2hpY2ggbmV2ZXIgYXV0by1maXJlLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IFdoZW4gYW4gZWxlbWVudCBzZXQgaXMgYmVpbmcgc3ViamVjdGVkIHRvIGEgbm9uLXBhcmFsbGVsIFZlbG9jaXR5IGNhbGwsIHRoZSBhbmltYXRpb24gd2lsbCBub3QgYmVnaW4gdW50aWxcclxuXHRcdFx0XHQgZWFjaCBvbmUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzZXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgaW5kaXZpZHVhbGx5IHByZS1leGlzdGluZyBxdWV1ZSBjaGFpbi4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBVbmZvcnR1bmF0ZWx5LCBtb3N0IHBlb3BsZSBkb24ndCBmdWxseSBncmFzcCBqUXVlcnkncyBwb3dlcmZ1bCwgeWV0IHF1aXJreSwgJC5xdWV1ZSgpIGZ1bmN0aW9uLlxyXG5cdFx0XHRcdCBMZWFuIG1vcmUgaGVyZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDU4MTU4L2Nhbi1zb21lYm9keS1leHBsYWluLWpxdWVyeS1xdWV1ZS10by1tZSAqL1xyXG5cdFx0XHRcdGlmICgob3B0cy5xdWV1ZSA9PT0gXCJcIiB8fCBvcHRzLnF1ZXVlID09PSBcImZ4XCIpICYmICQucXVldWUoZWxlbWVudClbMF0gIT09IFwiaW5wcm9ncmVzc1wiKSB7XHJcblx0XHRcdFx0XHQkLmRlcXVldWUoZWxlbWVudCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IEVsZW1lbnQgU2V0IEl0ZXJhdGlvblxyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBJZiB0aGUgXCJub2RlVHlwZVwiIHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgZWxlbWVudHMgdmFyaWFibGUsIHdlJ3JlIGFuaW1hdGluZyBhIHNpbmdsZSBlbGVtZW50LlxyXG5cdFx0XHQgUGxhY2UgaXQgaW4gYW4gYXJyYXkgc28gdGhhdCAkLmVhY2goKSBjYW4gaXRlcmF0ZSBvdmVyIGl0LiAqL1xyXG5cdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGksIGVsZW1lbnQpIHtcclxuXHRcdFx0XHQvKiBFbnN1cmUgZWFjaCBlbGVtZW50IGluIGEgc2V0IGhhcyBhIG5vZGVUeXBlIChpcyBhIHJlYWwgZWxlbWVudCkgdG8gYXZvaWQgdGhyb3dpbmcgZXJyb3JzLiAqL1xyXG5cdFx0XHRcdGlmIChUeXBlLmlzTm9kZShlbGVtZW50KSkge1xyXG5cdFx0XHRcdFx0cHJvY2Vzc0VsZW1lbnQoZWxlbWVudCwgaSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IE9wdGlvbjogTG9vcFxyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogVGhlIGxvb3Agb3B0aW9uIGFjY2VwdHMgYW4gaW50ZWdlciBpbmRpY2F0aW5nIGhvdyBtYW55IHRpbWVzIHRoZSBlbGVtZW50IHNob3VsZCBsb29wIGJldHdlZW4gdGhlIHZhbHVlcyBpbiB0aGVcclxuXHRcdFx0IGN1cnJlbnQgY2FsbCdzIHByb3BlcnRpZXMgbWFwIGFuZCB0aGUgZWxlbWVudCdzIHByb3BlcnR5IHZhbHVlcyBwcmlvciB0byB0aGlzIGNhbGwuICovXHJcblx0XHRcdC8qIE5vdGU6IFRoZSBsb29wIG9wdGlvbidzIGxvZ2ljIGlzIHBlcmZvcm1lZCBoZXJlIC0tIGFmdGVyIGVsZW1lbnQgcHJvY2Vzc2luZyAtLSBiZWNhdXNlIHRoZSBjdXJyZW50IGNhbGwgbmVlZHNcclxuXHRcdFx0IHRvIHVuZGVyZ28gaXRzIHF1ZXVlIGluc2VydGlvbiBwcmlvciB0byB0aGUgbG9vcCBvcHRpb24gZ2VuZXJhdGluZyBpdHMgc2VyaWVzIG9mIGNvbnN0aXR1ZW50IFwicmV2ZXJzZVwiIGNhbGxzLFxyXG5cdFx0XHQgd2hpY2ggY2hhaW4gYWZ0ZXIgdGhlIGN1cnJlbnQgY2FsbC4gVHdvIHJldmVyc2UgY2FsbHMgKHR3byBcImFsdGVybmF0aW9uc1wiKSBjb25zdGl0dXRlIG9uZSBsb29wLiAqL1xyXG5cdFx0XHRvcHRzID0gJC5leHRlbmQoe30sIFZlbG9jaXR5LmRlZmF1bHRzLCBvcHRpb25zKTtcclxuXHRcdFx0b3B0cy5sb29wID0gcGFyc2VJbnQob3B0cy5sb29wLCAxMCk7XHJcblx0XHRcdHZhciByZXZlcnNlQ2FsbHNDb3VudCA9IChvcHRzLmxvb3AgKiAyKSAtIDE7XHJcblxyXG5cdFx0XHRpZiAob3B0cy5sb29wKSB7XHJcblx0XHRcdFx0LyogRG91YmxlIHRoZSBsb29wIGNvdW50IHRvIGNvbnZlcnQgaXQgaW50byBpdHMgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIFwicmV2ZXJzZVwiIGNhbGxzLlxyXG5cdFx0XHRcdCBTdWJ0cmFjdCAxIGZyb20gdGhlIHJlc3VsdGluZyB2YWx1ZSBzaW5jZSB0aGUgY3VycmVudCBjYWxsIGlzIGluY2x1ZGVkIGluIHRoZSB0b3RhbCBhbHRlcm5hdGlvbiBjb3VudC4gKi9cclxuXHRcdFx0XHRmb3IgKHZhciB4ID0gMDsgeCA8IHJldmVyc2VDYWxsc0NvdW50OyB4KyspIHtcclxuXHRcdFx0XHRcdC8qIFNpbmNlIHRoZSBsb2dpYyBmb3IgdGhlIHJldmVyc2UgYWN0aW9uIG9jY3VycyBpbnNpZGUgUXVldWVpbmcgYW5kIHRoZXJlZm9yZSB0aGlzIGNhbGwncyBvcHRpb25zIG9iamVjdFxyXG5cdFx0XHRcdFx0IGlzbid0IHBhcnNlZCB1bnRpbCB0aGVuIGFzIHdlbGwsIHRoZSBjdXJyZW50IGNhbGwncyBkZWxheSBvcHRpb24gbXVzdCBiZSBleHBsaWNpdGx5IHBhc3NlZCBpbnRvIHRoZSByZXZlcnNlXHJcblx0XHRcdFx0XHQgY2FsbCBzbyB0aGF0IHRoZSBkZWxheSBsb2dpYyB0aGF0IG9jY3VycyBpbnNpZGUgKlByZS1RdWV1ZWluZyogY2FuIHByb2Nlc3MgaXQuICovXHJcblx0XHRcdFx0XHR2YXIgcmV2ZXJzZU9wdGlvbnMgPSB7XHJcblx0XHRcdFx0XHRcdGRlbGF5OiBvcHRzLmRlbGF5LFxyXG5cdFx0XHRcdFx0XHRwcm9ncmVzczogb3B0cy5wcm9ncmVzc1xyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiBhIGNvbXBsZXRlIGNhbGxiYWNrIHdhcyBwYXNzZWQgaW50byB0aGlzIGNhbGwsIHRyYW5zZmVyIGl0IHRvIHRoZSBsb29wIHJlZGlyZWN0J3MgZmluYWwgXCJyZXZlcnNlXCIgY2FsbFxyXG5cdFx0XHRcdFx0IHNvIHRoYXQgaXQncyB0cmlnZ2VyZWQgd2hlbiB0aGUgZW50aXJlIHJlZGlyZWN0IGlzIGNvbXBsZXRlIChhbmQgbm90IHdoZW4gdGhlIHZlcnkgZmlyc3QgYW5pbWF0aW9uIGlzIGNvbXBsZXRlKS4gKi9cclxuXHRcdFx0XHRcdGlmICh4ID09PSByZXZlcnNlQ2FsbHNDb3VudCAtIDEpIHtcclxuXHRcdFx0XHRcdFx0cmV2ZXJzZU9wdGlvbnMuZGlzcGxheSA9IG9wdHMuZGlzcGxheTtcclxuXHRcdFx0XHRcdFx0cmV2ZXJzZU9wdGlvbnMudmlzaWJpbGl0eSA9IG9wdHMudmlzaWJpbGl0eTtcclxuXHRcdFx0XHRcdFx0cmV2ZXJzZU9wdGlvbnMuY29tcGxldGUgPSBvcHRzLmNvbXBsZXRlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGFuaW1hdGUoZWxlbWVudHMsIFwicmV2ZXJzZVwiLCByZXZlcnNlT3B0aW9ucyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqXHJcblx0XHRcdCBDaGFpbmluZ1xyXG5cdFx0XHQgKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogUmV0dXJuIHRoZSBlbGVtZW50cyBiYWNrIHRvIHRoZSBjYWxsIGNoYWluLCB3aXRoIHdyYXBwZWQgZWxlbWVudHMgdGFraW5nIHByZWNlZGVuY2UgaW4gY2FzZSBWZWxvY2l0eSB3YXMgY2FsbGVkIHZpYSB0aGUgJC5mbi4gZXh0ZW5zaW9uLiAqL1xyXG5cdFx0XHRyZXR1cm4gZ2V0Q2hhaW4oKTtcclxuXHRcdH07XHJcblxyXG5cdFx0LyogVHVybiBWZWxvY2l0eSBpbnRvIHRoZSBhbmltYXRpb24gZnVuY3Rpb24sIGV4dGVuZGVkIHdpdGggdGhlIHByZS1leGlzdGluZyBWZWxvY2l0eSBvYmplY3QuICovXHJcblx0XHRWZWxvY2l0eSA9ICQuZXh0ZW5kKGFuaW1hdGUsIFZlbG9jaXR5KTtcclxuXHRcdC8qIEZvciBsZWdhY3kgc3VwcG9ydCwgYWxzbyBleHBvc2UgdGhlIGxpdGVyYWwgYW5pbWF0ZSBtZXRob2QuICovXHJcblx0XHRWZWxvY2l0eS5hbmltYXRlID0gYW5pbWF0ZTtcclxuXHJcblx0XHQvKioqKioqKioqKioqKipcclxuXHRcdCBUaW1pbmdcclxuXHRcdCAqKioqKioqKioqKioqKi9cclxuXHJcblx0XHQvKiBUaWNrZXIgZnVuY3Rpb24uICovXHJcblx0XHR2YXIgdGlja2VyID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCByQUZTaGltO1xyXG5cclxuXHRcdC8qIEluYWN0aXZlIGJyb3dzZXIgdGFicyBwYXVzZSByQUYsIHdoaWNoIHJlc3VsdHMgaW4gYWxsIGFjdGl2ZSBhbmltYXRpb25zIGltbWVkaWF0ZWx5IHNwcmludGluZyB0byB0aGVpciBjb21wbGV0aW9uIHN0YXRlcyB3aGVuIHRoZSB0YWIgcmVmb2N1c2VzLlxyXG5cdFx0IFRvIGdldCBhcm91bmQgdGhpcywgd2UgZHluYW1pY2FsbHkgc3dpdGNoIHJBRiB0byBzZXRUaW1lb3V0ICh3aGljaCB0aGUgYnJvd3NlciAqZG9lc24ndCogcGF1c2UpIHdoZW4gdGhlIHRhYiBsb3NlcyBmb2N1cy4gV2Ugc2tpcCB0aGlzIGZvciBtb2JpbGVcclxuXHRcdCBkZXZpY2VzIHRvIGF2b2lkIHdhc3RpbmcgYmF0dGVyeSBwb3dlciBvbiBpbmFjdGl2ZSB0YWJzLiAqL1xyXG5cdFx0LyogTm90ZTogVGFiIGZvY3VzIGRldGVjdGlvbiBkb2Vzbid0IHdvcmsgb24gb2xkZXIgdmVyc2lvbnMgb2YgSUUsIGJ1dCB0aGF0J3Mgb2theSBzaW5jZSB0aGV5IGRvbid0IHN1cHBvcnQgckFGIHRvIGJlZ2luIHdpdGguICovXHJcblx0XHRpZiAoIVZlbG9jaXR5LlN0YXRlLmlzTW9iaWxlICYmIGRvY3VtZW50LmhpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHZhciB1cGRhdGVUaWNrZXIgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHQvKiBSZWFzc2lnbiB0aGUgckFGIGZ1bmN0aW9uICh3aGljaCB0aGUgZ2xvYmFsIHRpY2soKSBmdW5jdGlvbiB1c2VzKSBiYXNlZCBvbiB0aGUgdGFiJ3MgZm9jdXMgc3RhdGUuICovXHJcblx0XHRcdFx0aWYgKGRvY3VtZW50LmhpZGRlbikge1xyXG5cdFx0XHRcdFx0dGlja2VyID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdFx0LyogVGhlIHRpY2sgZnVuY3Rpb24gbmVlZHMgYSB0cnV0aHkgZmlyc3QgYXJndW1lbnQgaW4gb3JkZXIgdG8gcGFzcyBpdHMgaW50ZXJuYWwgdGltZXN0YW1wIGNoZWNrLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayh0cnVlKTtcclxuXHRcdFx0XHRcdFx0fSwgMTYpO1xyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvKiBUaGUgckFGIGxvb3AgaGFzIGJlZW4gcGF1c2VkIGJ5IHRoZSBicm93c2VyLCBzbyB3ZSBtYW51YWxseSByZXN0YXJ0IHRoZSB0aWNrLiAqL1xyXG5cdFx0XHRcdFx0dGljaygpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aWNrZXIgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHJBRlNoaW07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0LyogUGFnZSBjb3VsZCBiZSBzaXR0aW5nIGluIHRoZSBiYWNrZ3JvdW5kIGF0IHRoaXMgdGltZSAoaS5lLiBvcGVuZWQgYXMgbmV3IHRhYikgc28gbWFraW5nIHN1cmUgd2UgdXNlIGNvcnJlY3QgdGlja2VyIGZyb20gdGhlIHN0YXJ0ICovXHJcblx0XHRcdHVwZGF0ZVRpY2tlcigpO1xyXG5cclxuXHRcdFx0LyogQW5kIHRoZW4gcnVuIGNoZWNrIGFnYWluIGV2ZXJ5IHRpbWUgdmlzaWJpbGl0eSBjaGFuZ2VzICovXHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHVwZGF0ZVRpY2tlcik7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqKioqKioqKioqKlxyXG5cdFx0IFRpY2tcclxuXHRcdCAqKioqKioqKioqKiovXHJcblxyXG5cdFx0LyogTm90ZTogQWxsIGNhbGxzIHRvIFZlbG9jaXR5IGFyZSBwdXNoZWQgdG8gdGhlIFZlbG9jaXR5LlN0YXRlLmNhbGxzIGFycmF5LCB3aGljaCBpcyBmdWxseSBpdGVyYXRlZCB0aHJvdWdoIHVwb24gZWFjaCB0aWNrLiAqL1xyXG5cdFx0ZnVuY3Rpb24gdGljayh0aW1lc3RhbXApIHtcclxuXHRcdFx0LyogQW4gZW1wdHkgdGltZXN0YW1wIGFyZ3VtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgaXMgdGhlIGZpcnN0IHRpY2sgb2NjdXJlbmNlIHNpbmNlIHRpY2tpbmcgd2FzIHR1cm5lZCBvbi5cclxuXHRcdFx0IFdlIGxldmVyYWdlIHRoaXMgbWV0YWRhdGEgdG8gZnVsbHkgaWdub3JlIHRoZSBmaXJzdCB0aWNrIHBhc3Mgc2luY2UgUkFGJ3MgaW5pdGlhbCBwYXNzIGlzIGZpcmVkIHdoZW5ldmVyXHJcblx0XHRcdCB0aGUgYnJvd3NlcidzIG5leHQgdGljayBzeW5jIHRpbWUgb2NjdXJzLCB3aGljaCByZXN1bHRzIGluIHRoZSBmaXJzdCBlbGVtZW50cyBzdWJqZWN0ZWQgdG8gVmVsb2NpdHlcclxuXHRcdFx0IGNhbGxzIGJlaW5nIGFuaW1hdGVkIG91dCBvZiBzeW5jIHdpdGggYW55IGVsZW1lbnRzIGFuaW1hdGVkIGltbWVkaWF0ZWx5IHRoZXJlYWZ0ZXIuIEluIHNob3J0LCB3ZSBpZ25vcmVcclxuXHRcdFx0IHRoZSBmaXJzdCBSQUYgdGljayBwYXNzIHNvIHRoYXQgZWxlbWVudHMgYmVpbmcgaW1tZWRpYXRlbHkgY29uc2VjdXRpdmVseSBhbmltYXRlZCAtLSBpbnN0ZWFkIG9mIHNpbXVsdGFuZW91c2x5IGFuaW1hdGVkXHJcblx0XHRcdCBieSB0aGUgc2FtZSBWZWxvY2l0eSBjYWxsIC0tIGFyZSBwcm9wZXJseSBiYXRjaGVkIGludG8gdGhlIHNhbWUgaW5pdGlhbCBSQUYgdGljayBhbmQgY29uc2VxdWVudGx5IHJlbWFpbiBpbiBzeW5jIHRoZXJlYWZ0ZXIuICovXHJcblx0XHRcdGlmICh0aW1lc3RhbXApIHtcclxuXHRcdFx0XHQvKiBXZSBub3JtYWxseSB1c2UgUkFGJ3MgaGlnaCByZXNvbHV0aW9uIHRpbWVzdGFtcCBidXQgYXMgaXQgY2FuIGJlIHNpZ25pZmljYW50bHkgb2Zmc2V0IHdoZW4gdGhlIGJyb3dzZXIgaXNcclxuXHRcdFx0XHQgdW5kZXIgaGlnaCBzdHJlc3Mgd2UgZ2l2ZSB0aGUgb3B0aW9uIGZvciBjaG9wcGluZXNzIG92ZXIgYWxsb3dpbmcgdGhlIGJyb3dzZXIgdG8gZHJvcCBodWdlIGNodW5rcyBvZiBmcmFtZXMuXHJcblx0XHRcdFx0IFdlIHVzZSBwZXJmb3JtYW5jZS5ub3coKSBhbmQgc2hpbSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0IGZvciB3aGVuIHRoZSB0YWIgaXMgaGlkZGVuLiAqL1xyXG5cdFx0XHRcdHZhciB0aW1lQ3VycmVudCA9IFZlbG9jaXR5LnRpbWVzdGFtcCAmJiB0aW1lc3RhbXAgIT09IHRydWUgPyB0aW1lc3RhbXAgOiBwZXJmb3JtYW5jZS5ub3coKTtcclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IENhbGwgSXRlcmF0aW9uXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHR2YXIgY2FsbHNMZW5ndGggPSBWZWxvY2l0eS5TdGF0ZS5jYWxscy5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdC8qIFRvIHNwZWVkIHVwIGl0ZXJhdGluZyBvdmVyIHRoaXMgYXJyYXksIGl0IGlzIGNvbXBhY3RlZCAoZmFsc2V5IGl0ZW1zIC0tIGNhbGxzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgLS0gYXJlIHJlbW92ZWQpXHJcblx0XHRcdFx0IHdoZW4gaXRzIGxlbmd0aCBoYXMgYmFsbG9vbmVkIHRvIGEgcG9pbnQgdGhhdCBjYW4gaW1wYWN0IHRpY2sgcGVyZm9ybWFuY2UuIFRoaXMgb25seSBiZWNvbWVzIG5lY2Vzc2FyeSB3aGVuIGFuaW1hdGlvblxyXG5cdFx0XHRcdCBoYXMgYmVlbiBjb250aW51b3VzIHdpdGggbWFueSBlbGVtZW50cyBvdmVyIGEgbG9uZyBwZXJpb2Qgb2YgdGltZTsgd2hlbmV2ZXIgYWxsIGFjdGl2ZSBjYWxscyBhcmUgY29tcGxldGVkLCBjb21wbGV0ZUNhbGwoKSBjbGVhcnMgVmVsb2NpdHkuU3RhdGUuY2FsbHMuICovXHJcblx0XHRcdFx0aWYgKGNhbGxzTGVuZ3RoID4gMTAwMDApIHtcclxuXHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmNhbGxzID0gY29tcGFjdFNwYXJzZUFycmF5KFZlbG9jaXR5LlN0YXRlLmNhbGxzKTtcclxuXHRcdFx0XHRcdGNhbGxzTGVuZ3RoID0gVmVsb2NpdHkuU3RhdGUuY2FsbHMubGVuZ3RoO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggYWN0aXZlIGNhbGwuICovXHJcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsc0xlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHQvKiBXaGVuIGEgVmVsb2NpdHkgY2FsbCBpcyBjb21wbGV0ZWQsIGl0cyBWZWxvY2l0eS5TdGF0ZS5jYWxscyBlbnRyeSBpcyBzZXQgdG8gZmFsc2UuIENvbnRpbnVlIG9uIHRvIHRoZSBuZXh0IGNhbGwuICovXHJcblx0XHRcdFx0XHRpZiAoIVZlbG9jaXR5LlN0YXRlLmNhbGxzW2ldKSB7XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdCBDYWxsLVdpZGUgVmFyaWFibGVzXHJcblx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdHZhciBjYWxsQ29udGFpbmVyID0gVmVsb2NpdHkuU3RhdGUuY2FsbHNbaV0sXHJcblx0XHRcdFx0XHRcdFx0Y2FsbCA9IGNhbGxDb250YWluZXJbMF0sXHJcblx0XHRcdFx0XHRcdFx0b3B0cyA9IGNhbGxDb250YWluZXJbMl0sXHJcblx0XHRcdFx0XHRcdFx0dGltZVN0YXJ0ID0gY2FsbENvbnRhaW5lclszXSxcclxuXHRcdFx0XHRcdFx0XHRmaXJzdFRpY2sgPSAhdGltZVN0YXJ0LFxyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuRHVtbXlWYWx1ZSA9IG51bGwsXHJcblx0XHRcdFx0XHRcdFx0cGF1c2VPYmplY3QgPSBjYWxsQ29udGFpbmVyWzVdLFxyXG5cdFx0XHRcdFx0XHRcdG1pbGxpc2Vjb25kc0VsbGFwc2VkID0gY2FsbENvbnRhaW5lcls2XTtcclxuXHJcblxyXG5cclxuXHRcdFx0XHRcdC8qIElmIHRpbWVTdGFydCBpcyB1bmRlZmluZWQsIHRoZW4gdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGF0IHRoaXMgY2FsbCBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgdGljaygpLlxyXG5cdFx0XHRcdFx0IFdlIGFzc2lnbiB0aW1lU3RhcnQgbm93IHNvIHRoYXQgaXRzIHZhbHVlIGlzIGFzIGNsb3NlIHRvIHRoZSByZWFsIGFuaW1hdGlvbiBzdGFydCB0aW1lIGFzIHBvc3NpYmxlLlxyXG5cdFx0XHRcdFx0IChDb252ZXJzZWx5LCBoYWQgdGltZVN0YXJ0IGJlZW4gZGVmaW5lZCB3aGVuIHRoaXMgY2FsbCB3YXMgYWRkZWQgdG8gVmVsb2NpdHkuU3RhdGUuY2FsbHMsIHRoZSBkZWxheVxyXG5cdFx0XHRcdFx0IGJldHdlZW4gdGhhdCB0aW1lIGFuZCBub3cgd291bGQgY2F1c2UgdGhlIGZpcnN0IGZldyBmcmFtZXMgb2YgdGhlIHR3ZWVuIHRvIGJlIHNraXBwZWQgc2luY2VcclxuXHRcdFx0XHRcdCBwZXJjZW50Q29tcGxldGUgaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aW1lU3RhcnQuKSAqL1xyXG5cdFx0XHRcdFx0LyogRnVydGhlciwgc3VidHJhY3QgMTZtcyAodGhlIGFwcHJveGltYXRlIHJlc29sdXRpb24gb2YgUkFGKSBmcm9tIHRoZSBjdXJyZW50IHRpbWUgdmFsdWUgc28gdGhhdCB0aGVcclxuXHRcdFx0XHRcdCBmaXJzdCB0aWNrIGl0ZXJhdGlvbiBpc24ndCB3YXN0ZWQgYnkgYW5pbWF0aW5nIGF0IDAlIHR3ZWVuIGNvbXBsZXRpb24sIHdoaWNoIHdvdWxkIHByb2R1Y2UgdGhlXHJcblx0XHRcdFx0XHQgc2FtZSBzdHlsZSB2YWx1ZSBhcyB0aGUgZWxlbWVudCdzIGN1cnJlbnQgdmFsdWUuICovXHJcblx0XHRcdFx0XHRpZiAoIXRpbWVTdGFydCkge1xyXG5cdFx0XHRcdFx0XHR0aW1lU3RhcnQgPSBWZWxvY2l0eS5TdGF0ZS5jYWxsc1tpXVszXSA9IHRpbWVDdXJyZW50IC0gMTY7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgYSBwYXVzZSBvYmplY3QgaXMgcHJlc2VudCwgc2tpcCBwcm9jZXNzaW5nIHVubGVzcyBpdCBoYXMgYmVlbiBzZXQgdG8gcmVzdW1lICovXHJcblx0XHRcdFx0XHRpZiAocGF1c2VPYmplY3QpIHtcclxuXHRcdFx0XHRcdFx0aWYgKHBhdXNlT2JqZWN0LnJlc3VtZSA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIFVwZGF0ZSB0aGUgdGltZSBzdGFydCB0byBhY2NvbW9kYXRlIHRoZSBwYXVzZWQgY29tcGxldGlvbiBhbW91bnQgKi9cclxuXHRcdFx0XHRcdFx0XHR0aW1lU3RhcnQgPSBjYWxsQ29udGFpbmVyWzNdID0gTWF0aC5yb3VuZCh0aW1lQ3VycmVudCAtIG1pbGxpc2Vjb25kc0VsbGFwc2VkIC0gMTYpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBSZW1vdmUgcGF1c2Ugb2JqZWN0IGFmdGVyIHByb2Nlc3NpbmcgKi9cclxuXHRcdFx0XHRcdFx0XHRjYWxsQ29udGFpbmVyWzVdID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdG1pbGxpc2Vjb25kc0VsbGFwc2VkID0gY2FsbENvbnRhaW5lcls2XSA9IHRpbWVDdXJyZW50IC0gdGltZVN0YXJ0O1xyXG5cclxuXHRcdFx0XHRcdC8qIFRoZSB0d2VlbidzIGNvbXBsZXRpb24gcGVyY2VudGFnZSBpcyByZWxhdGl2ZSB0byB0aGUgdHdlZW4ncyBzdGFydCB0aW1lLCBub3QgdGhlIHR3ZWVuJ3Mgc3RhcnQgdmFsdWVcclxuXHRcdFx0XHRcdCAod2hpY2ggd291bGQgcmVzdWx0IGluIHVucHJlZGljdGFibGUgdHdlZW4gZHVyYXRpb25zIHNpbmNlIEphdmFTY3JpcHQncyB0aW1lcnMgYXJlIG5vdCBwYXJ0aWN1bGFybHkgYWNjdXJhdGUpLlxyXG5cdFx0XHRcdFx0IEFjY29yZGluZ2x5LCB3ZSBlbnN1cmUgdGhhdCBwZXJjZW50Q29tcGxldGUgZG9lcyBub3QgZXhjZWVkIDEuICovXHJcblx0XHRcdFx0XHR2YXIgcGVyY2VudENvbXBsZXRlID0gTWF0aC5taW4oKG1pbGxpc2Vjb25kc0VsbGFwc2VkKSAvIG9wdHMuZHVyYXRpb24sIDEpO1xyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgRWxlbWVudCBJdGVyYXRpb25cclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIEZvciBldmVyeSBjYWxsLCBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiB0aGUgZWxlbWVudHMgaW4gaXRzIHNldC4gKi9cclxuXHRcdFx0XHRcdGZvciAodmFyIGogPSAwLCBjYWxsTGVuZ3RoID0gY2FsbC5sZW5ndGg7IGogPCBjYWxsTGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdFx0dmFyIHR3ZWVuc0NvbnRhaW5lciA9IGNhbGxbal0sXHJcblx0XHRcdFx0XHRcdFx0XHRlbGVtZW50ID0gdHdlZW5zQ29udGFpbmVyLmVsZW1lbnQ7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBlbGVtZW50IGhhcyBiZWVuIGRlbGV0ZWQgbWlkd2F5IHRocm91Z2ggdGhlIGFuaW1hdGlvbiBieSBjaGVja2luZyBmb3IgdGhlXHJcblx0XHRcdFx0XHRcdCBjb250aW51ZWQgZXhpc3RlbmNlIG9mIGl0cyBkYXRhIGNhY2hlLiBJZiBpdCdzIGdvbmUsIG9yIHRoZSBlbGVtZW50IGlzIGN1cnJlbnRseSBwYXVzZWQsIHNraXAgYW5pbWF0aW5nIHRoaXMgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKCFEYXRhKGVsZW1lbnQpKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHZhciB0cmFuc2Zvcm1Qcm9wZXJ0eUV4aXN0cyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IERpc3BsYXkgJiBWaXNpYmlsaXR5IFRvZ2dsaW5nXHJcblx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIGRpc3BsYXkgb3B0aW9uIGlzIHNldCB0byBub24tXCJub25lXCIsIHNldCBpdCB1cGZyb250IHNvIHRoYXQgdGhlIGVsZW1lbnQgY2FuIGJlY29tZSB2aXNpYmxlIGJlZm9yZSB0d2VlbmluZyBiZWdpbnMuXHJcblx0XHRcdFx0XHRcdCAoT3RoZXJ3aXNlLCBkaXNwbGF5J3MgXCJub25lXCIgdmFsdWUgaXMgc2V0IGluIGNvbXBsZXRlQ2FsbCgpIG9uY2UgdGhlIGFuaW1hdGlvbiBoYXMgY29tcGxldGVkLikgKi9cclxuXHRcdFx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuZGlzcGxheSAhPT0gbnVsbCAmJiBvcHRzLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSA9PT0gXCJmbGV4XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBmbGV4VmFsdWVzID0gW1wiLXdlYmtpdC1ib3hcIiwgXCItbW96LWJveFwiLCBcIi1tcy1mbGV4Ym94XCIsIFwiLXdlYmtpdC1mbGV4XCJdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdCQuZWFjaChmbGV4VmFsdWVzLCBmdW5jdGlvbihpLCBmbGV4VmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJkaXNwbGF5XCIsIGZsZXhWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiZGlzcGxheVwiLCBvcHRzLmRpc3BsYXkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBTYW1lIGdvZXMgd2l0aCB0aGUgdmlzaWJpbGl0eSBvcHRpb24sIGJ1dCBpdHMgXCJub25lXCIgZXF1aXZhbGVudCBpcyBcImhpZGRlblwiLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAob3B0cy52aXNpYmlsaXR5ICE9PSB1bmRlZmluZWQgJiYgb3B0cy52aXNpYmlsaXR5ICE9PSBcImhpZGRlblwiKSB7XHJcblx0XHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJ2aXNpYmlsaXR5XCIsIG9wdHMudmlzaWJpbGl0eSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IFByb3BlcnR5IEl0ZXJhdGlvblxyXG5cdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogRm9yIGV2ZXJ5IGVsZW1lbnQsIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIHByb3BlcnR5LiAqL1xyXG5cdFx0XHRcdFx0XHRmb3IgKHZhciBwcm9wZXJ0eSBpbiB0d2VlbnNDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBJbiBhZGRpdGlvbiB0byBwcm9wZXJ0eSB0d2VlbiBkYXRhLCB0d2VlbnNDb250YWluZXIgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gaXRzIGFzc29jaWF0ZWQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAodHdlZW5zQ29udGFpbmVyLmhhc093blByb3BlcnR5KHByb3BlcnR5KSAmJiBwcm9wZXJ0eSAhPT0gXCJlbGVtZW50XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciB0d2VlbiA9IHR3ZWVuc0NvbnRhaW5lcltwcm9wZXJ0eV0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEVhc2luZyBjYW4gZWl0aGVyIGJlIGEgcHJlLWdlbmVyZWF0ZWQgZnVuY3Rpb24gb3IgYSBzdHJpbmcgdGhhdCByZWZlcmVuY2VzIGEgcHJlLXJlZ2lzdGVyZWQgZWFzaW5nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IG9uIHRoZSBWZWxvY2l0eS5FYXNpbmdzIG9iamVjdC4gSW4gZWl0aGVyIGNhc2UsIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgZWFzaW5nICpmdW5jdGlvbiouICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWFzaW5nID0gVHlwZS5pc1N0cmluZyh0d2Vlbi5lYXNpbmcpID8gVmVsb2NpdHkuRWFzaW5nc1t0d2Vlbi5lYXNpbmddIDogdHdlZW4uZWFzaW5nO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdCBDdXJyZW50IFZhbHVlIENhbGN1bGF0aW9uXHJcblx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChUeXBlLmlzU3RyaW5nKHR3ZWVuLnBhdHRlcm4pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBwYXR0ZXJuUmVwbGFjZSA9IHBlcmNlbnRDb21wbGV0ZSA9PT0gMSA/XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigkMCwgaW5kZXgsIHJvdW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSB0d2Vlbi5lbmRWYWx1ZVtpbmRleF07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcm91bmQgPyBNYXRoLnJvdW5kKHJlc3VsdCkgOiByZXN1bHQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IDpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCQwLCBpbmRleCwgcm91bmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHN0YXJ0VmFsdWUgPSB0d2Vlbi5zdGFydFZhbHVlW2luZGV4XSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuRGVsdGEgPSB0d2Vlbi5lbmRWYWx1ZVtpbmRleF0gLSBzdGFydFZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0ID0gc3RhcnRWYWx1ZSArICh0d2VlbkRlbHRhICogZWFzaW5nKHBlcmNlbnRDb21wbGV0ZSwgb3B0cywgdHdlZW5EZWx0YSkpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJvdW5kID8gTWF0aC5yb3VuZChyZXN1bHQpIDogcmVzdWx0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuLnBhdHRlcm4ucmVwbGFjZSgveyhcXGQrKSghKT99L2csIHBhdHRlcm5SZXBsYWNlKTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocGVyY2VudENvbXBsZXRlID09PSAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoaXMgaXMgdGhlIGxhc3QgdGljayBwYXNzIChpZiB3ZSd2ZSByZWFjaGVkIDEwMCUgY29tcGxldGlvbiBmb3IgdGhpcyB0d2VlbiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdCBlbnN1cmUgdGhhdCBjdXJyZW50VmFsdWUgaXMgZXhwbGljaXRseSBzZXQgdG8gaXRzIHRhcmdldCBlbmRWYWx1ZSBzbyB0aGF0IGl0J3Mgbm90IHN1YmplY3RlZCB0byBhbnkgcm91bmRpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuLmVuZFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogT3RoZXJ3aXNlLCBjYWxjdWxhdGUgY3VycmVudFZhbHVlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRlbHRhIGZyb20gc3RhcnRWYWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHR3ZWVuRGVsdGEgPSB0d2Vlbi5lbmRWYWx1ZSAtIHR3ZWVuLnN0YXJ0VmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSB0d2Vlbi5zdGFydFZhbHVlICsgKHR3ZWVuRGVsdGEgKiBlYXNpbmcocGVyY2VudENvbXBsZXRlLCBvcHRzLCB0d2VlbkRlbHRhKSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIG5vIHZhbHVlIGNoYW5nZSBpcyBvY2N1cnJpbmcsIGRvbid0IHByb2NlZWQgd2l0aCBET00gdXBkYXRpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIWZpcnN0VGljayAmJiAoY3VycmVudFZhbHVlID09PSB0d2Vlbi5jdXJyZW50VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHR3ZWVuLmN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBJZiB3ZSdyZSB0d2VlbmluZyBhIGZha2UgJ3R3ZWVuJyBwcm9wZXJ0eSBpbiBvcmRlciB0byBsb2cgdHJhbnNpdGlvbiB2YWx1ZXMsIHVwZGF0ZSB0aGUgb25lLXBlci1jYWxsIHZhcmlhYmxlIHNvIHRoYXRcclxuXHRcdFx0XHRcdFx0XHRcdCBpdCBjYW4gYmUgcGFzc2VkIGludG8gdGhlIHByb2dyZXNzIGNhbGxiYWNrLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5ID09PSBcInR3ZWVuXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dHdlZW5EdW1teVZhbHVlID0gY3VycmVudFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgSG9va3M6IFBhcnQgSVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgaG9va1Jvb3Q7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBGb3IgaG9va2VkIHByb3BlcnRpZXMsIHRoZSBuZXdseS11cGRhdGVkIHJvb3RQcm9wZXJ0eVZhbHVlQ2FjaGUgaXMgY2FjaGVkIG9udG8gdGhlIGVsZW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgZm9yIHN1YnNlcXVlbnQgaG9va3MgaW4gdGhpcyBjYWxsIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSByb290IHByb3BlcnR5LiBJZiB3ZSBkaWRuJ3QgY2FjaGUgdGhlIHVwZGF0ZWRcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHJvb3RQcm9wZXJ0eVZhbHVlLCBlYWNoIHN1YnNlcXVlbnQgdXBkYXRlIHRvIHRoZSByb290IHByb3BlcnR5IGluIHRoaXMgdGljayBwYXNzIHdvdWxkIHJlc2V0IHRoZSBwcmV2aW91cyBob29rJ3NcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHVwZGF0ZXMgdG8gcm9vdFByb3BlcnR5VmFsdWUgcHJpb3IgdG8gaW5qZWN0aW9uLiBBIG5pY2UgcGVyZm9ybWFuY2UgYnlwcm9kdWN0IG9mIHJvb3RQcm9wZXJ0eVZhbHVlIGNhY2hpbmcgaXMgdGhhdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgc3Vic2VxdWVudGx5IGNoYWluZWQgYW5pbWF0aW9ucyB1c2luZyB0aGUgc2FtZSBob29rUm9vdCBidXQgYSBkaWZmZXJlbnQgaG9vayBjYW4gdXNlIHRoaXMgY2FjaGVkIHJvb3RQcm9wZXJ0eVZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoQ1NTLkhvb2tzLnJlZ2lzdGVyZWRbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aG9va1Jvb3QgPSBDU1MuSG9va3MuZ2V0Um9vdChwcm9wZXJ0eSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciByb290UHJvcGVydHlWYWx1ZUNhY2hlID0gRGF0YShlbGVtZW50KS5yb290UHJvcGVydHlWYWx1ZUNhY2hlW2hvb2tSb290XTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvb3RQcm9wZXJ0eVZhbHVlQ2FjaGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuLnJvb3RQcm9wZXJ0eVZhbHVlID0gcm9vdFByb3BlcnR5VmFsdWVDYWNoZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgRE9NIFVwZGF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBzZXRQcm9wZXJ0eVZhbHVlKCkgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgbmFtZSBhbmQgcHJvcGVydHkgdmFsdWUgcG9zdCBhbnkgbm9ybWFsaXphdGlvbiB0aGF0IG1heSBoYXZlIGJlZW4gcGVyZm9ybWVkLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBUbyBzb2x2ZSBhbiBJRTw9OCBwb3NpdGlvbmluZyBidWcsIHRoZSB1bml0IHR5cGUgaXMgZHJvcHBlZCB3aGVuIHNldHRpbmcgYSBwcm9wZXJ0eSB2YWx1ZSBvZiAwLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgYWRqdXN0ZWRTZXREYXRhID0gQ1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgLyogU0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuLmN1cnJlbnRWYWx1ZSArIChJRSA8IDkgJiYgcGFyc2VGbG9hdChjdXJyZW50VmFsdWUpID09PSAwID8gXCJcIiA6IHR3ZWVuLnVuaXRUeXBlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuLnJvb3RQcm9wZXJ0eVZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHdlZW4uc2Nyb2xsRGF0YSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgSG9va3M6IFBhcnQgSUlcclxuXHRcdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBob29rJ3MgdXBkYXRlZCByb290UHJvcGVydHlWYWx1ZSAodGhlIHBvc3QtcHJvY2Vzc2VkIHZhbHVlIHByb3ZpZGVkIGJ5IGFkanVzdGVkU2V0RGF0YSksIGNhY2hlIGl0IG9udG8gdGhlIGVsZW1lbnQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChDU1MuSG9va3MucmVnaXN0ZXJlZFtwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBTaW5jZSBhZGp1c3RlZFNldERhdGEgY29udGFpbnMgbm9ybWFsaXplZCBkYXRhIHJlYWR5IGZvciBET00gdXBkYXRpbmcsIHRoZSByb290UHJvcGVydHlWYWx1ZSBuZWVkcyB0byBiZSByZS1leHRyYWN0ZWQgZnJvbSBpdHMgbm9ybWFsaXplZCBmb3JtLiA/PyAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtob29rUm9vdF0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkucm9vdFByb3BlcnR5VmFsdWVDYWNoZVtob29rUm9vdF0gPSBDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtob29rUm9vdF0oXCJleHRyYWN0XCIsIG51bGwsIGFkanVzdGVkU2V0RGF0YVsxXSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkucm9vdFByb3BlcnR5VmFsdWVDYWNoZVtob29rUm9vdF0gPSBhZGp1c3RlZFNldERhdGFbMV07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0XHRcdCBUcmFuc2Zvcm1zXHJcblx0XHRcdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBGbGFnIHdoZXRoZXIgYSB0cmFuc2Zvcm0gcHJvcGVydHkgaXMgYmVpbmcgYW5pbWF0ZWQgc28gdGhhdCBmbHVzaFRyYW5zZm9ybUNhY2hlKCkgY2FuIGJlIHRyaWdnZXJlZCBvbmNlIHRoaXMgdGljayBwYXNzIGlzIGNvbXBsZXRlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWRqdXN0ZWRTZXREYXRhWzBdID09PSBcInRyYW5zZm9ybVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtUHJvcGVydHlFeGlzdHMgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IG1vYmlsZUhBXHJcblx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgbW9iaWxlSEEgaXMgZW5hYmxlZCwgc2V0IHRoZSB0cmFuc2xhdGUzZCB0cmFuc2Zvcm0gdG8gbnVsbCB0byBmb3JjZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24uXHJcblx0XHRcdFx0XHRcdCBJdCdzIHNhZmUgdG8gb3ZlcnJpZGUgdGhpcyBwcm9wZXJ0eSBzaW5jZSBWZWxvY2l0eSBkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgaXRzIGFuaW1hdGlvbiAoaG9va3MgYXJlIHVzZWQgaW4gaXRzIHBsYWNlKS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKG9wdHMubW9iaWxlSEEpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBEb24ndCBzZXQgdGhlIG51bGwgdHJhbnNmb3JtIGhhY2sgaWYgd2UndmUgYWxyZWFkeSBkb25lIHNvLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlLnRyYW5zbGF0ZTNkID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEFsbCBlbnRyaWVzIG9uIHRoZSB0cmFuc2Zvcm1DYWNoZSBvYmplY3QgYXJlIGxhdGVyIGNvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIHRyYW5zZm9ybSBzdHJpbmcgdmlhIGZsdXNoVHJhbnNmb3JtQ2FjaGUoKS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkudHJhbnNmb3JtQ2FjaGUudHJhbnNsYXRlM2QgPSBcIigwcHgsIDBweCwgMHB4KVwiO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHRyYW5zZm9ybVByb3BlcnR5RXhpc3RzID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1Qcm9wZXJ0eUV4aXN0cykge1xyXG5cdFx0XHRcdFx0XHRcdENTUy5mbHVzaFRyYW5zZm9ybUNhY2hlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogVGhlIG5vbi1cIm5vbmVcIiBkaXNwbGF5IHZhbHVlIGlzIG9ubHkgYXBwbGllZCB0byBhbiBlbGVtZW50IG9uY2UgLS0gd2hlbiBpdHMgYXNzb2NpYXRlZCBjYWxsIGlzIGZpcnN0IHRpY2tlZCB0aHJvdWdoLlxyXG5cdFx0XHRcdFx0IEFjY29yZGluZ2x5LCBpdCdzIHNldCB0byBmYWxzZSBzbyB0aGF0IGl0IGlzbid0IHJlLXByb2Nlc3NlZCBieSB0aGlzIGNhbGwgaW4gdGhlIG5leHQgdGljay4gKi9cclxuXHRcdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmNhbGxzW2ldWzJdLmRpc3BsYXkgPSBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChvcHRzLnZpc2liaWxpdHkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLnZpc2liaWxpdHkgIT09IFwiaGlkZGVuXCIpIHtcclxuXHRcdFx0XHRcdFx0VmVsb2NpdHkuU3RhdGUuY2FsbHNbaV1bMl0udmlzaWJpbGl0eSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIFBhc3MgdGhlIGVsZW1lbnRzIGFuZCB0aGUgdGltaW5nIGRhdGEgKHBlcmNlbnRDb21wbGV0ZSwgbXNSZW1haW5pbmcsIHRpbWVTdGFydCwgdHdlZW5EdW1teVZhbHVlKSBpbnRvIHRoZSBwcm9ncmVzcyBjYWxsYmFjay4gKi9cclxuXHRcdFx0XHRcdGlmIChvcHRzLnByb2dyZXNzKSB7XHJcblx0XHRcdFx0XHRcdG9wdHMucHJvZ3Jlc3MuY2FsbChjYWxsQ29udGFpbmVyWzFdLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y2FsbENvbnRhaW5lclsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdHBlcmNlbnRDb21wbGV0ZSxcclxuXHRcdFx0XHRcdFx0XHRcdE1hdGgubWF4KDAsICh0aW1lU3RhcnQgKyBvcHRzLmR1cmF0aW9uKSAtIHRpbWVDdXJyZW50KSxcclxuXHRcdFx0XHRcdFx0XHRcdHRpbWVTdGFydCxcclxuXHRcdFx0XHRcdFx0XHRcdHR3ZWVuRHVtbXlWYWx1ZSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZCB0d2VlbmluZywgcGFzcyBpdHMgaW5kZXggdG8gY29tcGxldGVDYWxsKCkgdG8gaGFuZGxlIGNhbGwgY2xlYW51cC4gKi9cclxuXHRcdFx0XHRcdGlmIChwZXJjZW50Q29tcGxldGUgPT09IDEpIHtcclxuXHRcdFx0XHRcdFx0Y29tcGxldGVDYWxsKGkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogTm90ZTogY29tcGxldGVDYWxsKCkgc2V0cyB0aGUgaXNUaWNraW5nIGZsYWcgdG8gZmFsc2Ugd2hlbiB0aGUgbGFzdCBjYWxsIG9uIFZlbG9jaXR5LlN0YXRlLmNhbGxzIGhhcyBjb21wbGV0ZWQuICovXHJcblx0XHRcdGlmIChWZWxvY2l0eS5TdGF0ZS5pc1RpY2tpbmcpIHtcclxuXHRcdFx0XHR0aWNrZXIodGljayk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0IENhbGwgQ29tcGxldGlvblxyXG5cdFx0ICoqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0LyogTm90ZTogVW5saWtlIHRpY2soKSwgd2hpY2ggcHJvY2Vzc2VzIGFsbCBhY3RpdmUgY2FsbHMgYXQgb25jZSwgY2FsbCBjb21wbGV0aW9uIGlzIGhhbmRsZWQgb24gYSBwZXItY2FsbCBiYXNpcy4gKi9cclxuXHRcdGZ1bmN0aW9uIGNvbXBsZXRlQ2FsbChjYWxsSW5kZXgsIGlzU3RvcHBlZCkge1xyXG5cdFx0XHQvKiBFbnN1cmUgdGhlIGNhbGwgZXhpc3RzLiAqL1xyXG5cdFx0XHRpZiAoIVZlbG9jaXR5LlN0YXRlLmNhbGxzW2NhbGxJbmRleF0pIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFB1bGwgdGhlIG1ldGFkYXRhIGZyb20gdGhlIGNhbGwuICovXHJcblx0XHRcdHZhciBjYWxsID0gVmVsb2NpdHkuU3RhdGUuY2FsbHNbY2FsbEluZGV4XVswXSxcclxuXHRcdFx0XHRcdGVsZW1lbnRzID0gVmVsb2NpdHkuU3RhdGUuY2FsbHNbY2FsbEluZGV4XVsxXSxcclxuXHRcdFx0XHRcdG9wdHMgPSBWZWxvY2l0eS5TdGF0ZS5jYWxsc1tjYWxsSW5kZXhdWzJdLFxyXG5cdFx0XHRcdFx0cmVzb2x2ZXIgPSBWZWxvY2l0eS5TdGF0ZS5jYWxsc1tjYWxsSW5kZXhdWzRdO1xyXG5cclxuXHRcdFx0dmFyIHJlbWFpbmluZ0NhbGxzRXhpc3QgPSBmYWxzZTtcclxuXHJcblx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBFbGVtZW50IEZpbmFsaXphdGlvblxyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdGZvciAodmFyIGkgPSAwLCBjYWxsTGVuZ3RoID0gY2FsbC5sZW5ndGg7IGkgPCBjYWxsTGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgZWxlbWVudCA9IGNhbGxbaV0uZWxlbWVudDtcclxuXHJcblx0XHRcdFx0LyogSWYgdGhlIHVzZXIgc2V0IGRpc3BsYXkgdG8gXCJub25lXCIgKGludGVuZGluZyB0byBoaWRlIHRoZSBlbGVtZW50KSwgc2V0IGl0IG5vdyB0aGF0IHRoZSBhbmltYXRpb24gaGFzIGNvbXBsZXRlZC4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBkaXNwbGF5Om5vbmUgaXNuJ3Qgc2V0IHdoZW4gY2FsbHMgYXJlIG1hbnVhbGx5IHN0b3BwZWQgKHZpYSBWZWxvY2l0eShcInN0b3BcIikuICovXHJcblx0XHRcdFx0LyogTm90ZTogRGlzcGxheSBnZXRzIGlnbm9yZWQgd2l0aCBcInJldmVyc2VcIiBjYWxscyBhbmQgaW5maW5pdGUgbG9vcHMsIHNpbmNlIHRoaXMgYmVoYXZpb3Igd291bGQgYmUgdW5kZXNpcmFibGUuICovXHJcblx0XHRcdFx0aWYgKCFpc1N0b3BwZWQgJiYgIW9wdHMubG9vcCkge1xyXG5cdFx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSA9PT0gXCJub25lXCIpIHtcclxuXHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJkaXNwbGF5XCIsIG9wdHMuZGlzcGxheSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKG9wdHMudmlzaWJpbGl0eSA9PT0gXCJoaWRkZW5cIikge1xyXG5cdFx0XHRcdFx0XHRDU1Muc2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInZpc2liaWxpdHlcIiwgb3B0cy52aXNpYmlsaXR5KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIElmIHRoZSBlbGVtZW50J3MgcXVldWUgaXMgZW1wdHkgKGlmIG9ubHkgdGhlIFwiaW5wcm9ncmVzc1wiIGl0ZW0gaXMgbGVmdCBhdCBwb3NpdGlvbiAwKSBvciBpZiBpdHMgcXVldWUgaXMgYWJvdXQgdG8gcnVuXHJcblx0XHRcdFx0IGEgbm9uLVZlbG9jaXR5LWluaXRpYXRlZCBlbnRyeSwgdHVybiBvZmYgdGhlIGlzQW5pbWF0aW5nIGZsYWcuIEEgbm9uLVZlbG9jaXR5LWluaXRpYXRpZWQgcXVldWUgZW50cnkncyBsb2dpYyBtaWdodCBhbHRlclxyXG5cdFx0XHRcdCBhbiBlbGVtZW50J3MgQ1NTIHZhbHVlcyBhbmQgdGhlcmVieSBjYXVzZSBWZWxvY2l0eSdzIGNhY2hlZCB2YWx1ZSBkYXRhIHRvIGdvIHN0YWxlLiBUbyBkZXRlY3QgaWYgYSBxdWV1ZSBlbnRyeSB3YXMgaW5pdGlhdGVkIGJ5IFZlbG9jaXR5LFxyXG5cdFx0XHRcdCB3ZSBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBvdXIgc3BlY2lhbCBWZWxvY2l0eS5xdWV1ZUVudHJ5RmxhZyBkZWNsYXJhdGlvbiwgd2hpY2ggbWluaWZpZXJzIHdvbid0IHJlbmFtZSBzaW5jZSB0aGUgZmxhZ1xyXG5cdFx0XHRcdCBpcyBhc3NpZ25lZCB0byBqUXVlcnkncyBnbG9iYWwgJCBvYmplY3QgYW5kIHRodXMgZXhpc3RzIG91dCBvZiBWZWxvY2l0eSdzIG93biBzY29wZS4gKi9cclxuXHRcdFx0XHR2YXIgZGF0YSA9IERhdGEoZWxlbWVudCk7XHJcblxyXG5cdFx0XHRcdGlmIChvcHRzLmxvb3AgIT09IHRydWUgJiYgKCQucXVldWUoZWxlbWVudClbMV0gPT09IHVuZGVmaW5lZCB8fCAhL1xcLnZlbG9jaXR5UXVldWVFbnRyeUZsYWcvaS50ZXN0KCQucXVldWUoZWxlbWVudClbMV0pKSkge1xyXG5cdFx0XHRcdFx0LyogVGhlIGVsZW1lbnQgbWF5IGhhdmUgYmVlbiBkZWxldGVkLiBFbnN1cmUgdGhhdCBpdHMgZGF0YSBjYWNoZSBzdGlsbCBleGlzdHMgYmVmb3JlIGFjdGluZyBvbiBpdC4gKi9cclxuXHRcdFx0XHRcdGlmIChkYXRhKSB7XHJcblx0XHRcdFx0XHRcdGRhdGEuaXNBbmltYXRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0LyogQ2xlYXIgdGhlIGVsZW1lbnQncyByb290UHJvcGVydHlWYWx1ZUNhY2hlLCB3aGljaCB3aWxsIGJlY29tZSBzdGFsZS4gKi9cclxuXHRcdFx0XHRcdFx0ZGF0YS5yb290UHJvcGVydHlWYWx1ZUNhY2hlID0ge307XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgdHJhbnNmb3JtSEFQcm9wZXJ0eUV4aXN0cyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHQvKiBJZiBhbnkgM0QgdHJhbnNmb3JtIHN1YnByb3BlcnR5IGlzIGF0IGl0cyBkZWZhdWx0IHZhbHVlIChyZWdhcmRsZXNzIG9mIHVuaXQgdHlwZSksIHJlbW92ZSBpdC4gKi9cclxuXHRcdFx0XHRcdFx0JC5lYWNoKENTUy5MaXN0cy50cmFuc2Zvcm1zM0QsIGZ1bmN0aW9uKGksIHRyYW5zZm9ybU5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgZGVmYXVsdFZhbHVlID0gL15zY2FsZS8udGVzdCh0cmFuc2Zvcm1OYW1lKSA/IDEgOiAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSBkYXRhLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXSAhPT0gdW5kZWZpbmVkICYmIG5ldyBSZWdFeHAoXCJeXFxcXChcIiArIGRlZmF1bHRWYWx1ZSArIFwiW14uXVwiKS50ZXN0KGN1cnJlbnRWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRyYW5zZm9ybUhBUHJvcGVydHlFeGlzdHMgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBNb2JpbGUgZGV2aWNlcyBoYXZlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiByZW1vdmVkIGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbiBpbiBvcmRlciB0byBhdm9pZCBob2dnaW5nIHRoZSBHUFUncyBtZW1vcnkuICovXHJcblx0XHRcdFx0XHRcdGlmIChvcHRzLm1vYmlsZUhBKSB7XHJcblx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtSEFQcm9wZXJ0eUV4aXN0cyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGRhdGEudHJhbnNmb3JtQ2FjaGUudHJhbnNsYXRlM2Q7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIEZsdXNoIHRoZSBzdWJwcm9wZXJ0eSByZW1vdmFscyB0byB0aGUgRE9NLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAodHJhbnNmb3JtSEFQcm9wZXJ0eUV4aXN0cykge1xyXG5cdFx0XHRcdFx0XHRcdENTUy5mbHVzaFRyYW5zZm9ybUNhY2hlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBSZW1vdmUgdGhlIFwidmVsb2NpdHktYW5pbWF0aW5nXCIgaW5kaWNhdG9yIGNsYXNzLiAqL1xyXG5cdFx0XHRcdFx0XHRDU1MuVmFsdWVzLnJlbW92ZUNsYXNzKGVsZW1lbnQsIFwidmVsb2NpdHktYW5pbWF0aW5nXCIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IENvbXBsZXRlXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogQ29tcGxldGUgaXMgZmlyZWQgb25jZSBwZXIgY2FsbCAobm90IG9uY2UgcGVyIGVsZW1lbnQpIGFuZCBpcyBwYXNzZWQgdGhlIGZ1bGwgcmF3IERPTSBlbGVtZW50IHNldCBhcyBib3RoIGl0cyBjb250ZXh0IGFuZCBpdHMgZmlyc3QgYXJndW1lbnQuICovXHJcblx0XHRcdFx0LyogTm90ZTogQ2FsbGJhY2tzIGFyZW4ndCBmaXJlZCB3aGVuIGNhbGxzIGFyZSBtYW51YWxseSBzdG9wcGVkICh2aWEgVmVsb2NpdHkoXCJzdG9wXCIpLiAqL1xyXG5cdFx0XHRcdGlmICghaXNTdG9wcGVkICYmIG9wdHMuY29tcGxldGUgJiYgIW9wdHMubG9vcCAmJiAoaSA9PT0gY2FsbExlbmd0aCAtIDEpKSB7XHJcblx0XHRcdFx0XHQvKiBXZSB0aHJvdyBjYWxsYmFja3MgaW4gYSBzZXRUaW1lb3V0IHNvIHRoYXQgdGhyb3duIGVycm9ycyBkb24ndCBoYWx0IHRoZSBleGVjdXRpb24gb2YgVmVsb2NpdHkgaXRzZWxmLiAqL1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0b3B0cy5jb21wbGV0ZS5jYWxsKGVsZW1lbnRzLCBlbGVtZW50cyk7XHJcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRcdHRocm93IGVycm9yO1xyXG5cdFx0XHRcdFx0XHR9LCAxKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IFByb21pc2UgUmVzb2x2aW5nXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIE5vdGU6IEluZmluaXRlIGxvb3BzIGRvbid0IHJldHVybiBwcm9taXNlcy4gKi9cclxuXHRcdFx0XHRpZiAocmVzb2x2ZXIgJiYgb3B0cy5sb29wICE9PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRyZXNvbHZlcihlbGVtZW50cyk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IExvb3AgKEluZmluaXRlKVxyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRpZiAoZGF0YSAmJiBvcHRzLmxvb3AgPT09IHRydWUgJiYgIWlzU3RvcHBlZCkge1xyXG5cdFx0XHRcdFx0LyogSWYgYSByb3RhdGVYL1kvWiBwcm9wZXJ0eSBpcyBiZWluZyBhbmltYXRlZCBieSAzNjAgZGVnIHdpdGggbG9vcDp0cnVlLCBzd2FwIHR3ZWVuIHN0YXJ0L2VuZCB2YWx1ZXMgdG8gZW5hYmxlXHJcblx0XHRcdFx0XHQgY29udGludW91cyBpdGVyYXRpdmUgcm90YXRpb24gbG9vcGluZy4gKE90aGVyaXNlLCB0aGUgZWxlbWVudCB3b3VsZCBqdXN0IHJvdGF0ZSBiYWNrIGFuZCBmb3J0aC4pICovXHJcblx0XHRcdFx0XHQkLmVhY2goZGF0YS50d2VlbnNDb250YWluZXIsIGZ1bmN0aW9uKHByb3BlcnR5TmFtZSwgdHdlZW5Db250YWluZXIpIHtcclxuXHRcdFx0XHRcdFx0aWYgKC9ecm90YXRlLy50ZXN0KHByb3BlcnR5TmFtZSkgJiYgKChwYXJzZUZsb2F0KHR3ZWVuQ29udGFpbmVyLnN0YXJ0VmFsdWUpIC0gcGFyc2VGbG9hdCh0d2VlbkNvbnRhaW5lci5lbmRWYWx1ZSkpICUgMzYwID09PSAwKSkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBvbGRTdGFydFZhbHVlID0gdHdlZW5Db250YWluZXIuc3RhcnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0dHdlZW5Db250YWluZXIuc3RhcnRWYWx1ZSA9IHR3ZWVuQ29udGFpbmVyLmVuZFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuQ29udGFpbmVyLmVuZFZhbHVlID0gb2xkU3RhcnRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKC9eYmFja2dyb3VuZFBvc2l0aW9uLy50ZXN0KHByb3BlcnR5TmFtZSkgJiYgcGFyc2VGbG9hdCh0d2VlbkNvbnRhaW5lci5lbmRWYWx1ZSkgPT09IDEwMCAmJiB0d2VlbkNvbnRhaW5lci51bml0VHlwZSA9PT0gXCIlXCIpIHtcclxuXHRcdFx0XHRcdFx0XHR0d2VlbkNvbnRhaW5lci5lbmRWYWx1ZSA9IDA7XHJcblx0XHRcdFx0XHRcdFx0dHdlZW5Db250YWluZXIuc3RhcnRWYWx1ZSA9IDEwMDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0VmVsb2NpdHkoZWxlbWVudCwgXCJyZXZlcnNlXCIsIHtsb29wOiB0cnVlLCBkZWxheTogb3B0cy5kZWxheX0pO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBEZXF1ZXVlaW5nXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogRmlyZSB0aGUgbmV4dCBjYWxsIGluIHRoZSBxdWV1ZSBzbyBsb25nIGFzIHRoaXMgY2FsbCdzIHF1ZXVlIHdhc24ndCBzZXQgdG8gZmFsc2UgKHRvIHRyaWdnZXIgYSBwYXJhbGxlbCBhbmltYXRpb24pLFxyXG5cdFx0XHRcdCB3aGljaCB3b3VsZCBoYXZlIGFscmVhZHkgY2F1c2VkIHRoZSBuZXh0IGNhbGwgdG8gZmlyZS4gTm90ZTogRXZlbiBpZiB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24gcXVldWUgaGFzIGJlZW4gcmVhY2hlZCxcclxuXHRcdFx0XHQgJC5kZXF1ZXVlKCkgbXVzdCBzdGlsbCBiZSBjYWxsZWQgaW4gb3JkZXIgdG8gY29tcGxldGVseSBjbGVhciBqUXVlcnkncyBhbmltYXRpb24gcXVldWUuICovXHJcblx0XHRcdFx0aWYgKG9wdHMucXVldWUgIT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHQkLmRlcXVldWUoZWxlbWVudCwgb3B0cy5xdWV1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBDYWxscyBBcnJheSBDbGVhbnVwXHJcblx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBTaW5jZSB0aGlzIGNhbGwgaXMgY29tcGxldGUsIHNldCBpdCB0byBmYWxzZSBzbyB0aGF0IHRoZSByQUYgdGljayBza2lwcyBpdC4gVGhpcyBhcnJheSBpcyBsYXRlciBjb21wYWN0ZWQgdmlhIGNvbXBhY3RTcGFyc2VBcnJheSgpLlxyXG5cdFx0XHQgKEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgY2FsbCBpcyBzZXQgdG8gZmFsc2UgaW5zdGVhZCBvZiBiZWluZyBkZWxldGVkIGZyb20gdGhlIGFycmF5OiBodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9zcGVlZC92OC8pICovXHJcblx0XHRcdFZlbG9jaXR5LlN0YXRlLmNhbGxzW2NhbGxJbmRleF0gPSBmYWxzZTtcclxuXHJcblx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2FsbHMgYXJyYXkgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgd2FzIHRoZSBmaW5hbCBpbi1wcm9ncmVzcyBhbmltYXRpb24uXHJcblx0XHRcdCBJZiBzbywgc2V0IGEgZmxhZyB0byBlbmQgdGlja2luZyBhbmQgY2xlYXIgdGhlIGNhbGxzIGFycmF5LiAqL1xyXG5cdFx0XHRmb3IgKHZhciBqID0gMCwgY2FsbHNMZW5ndGggPSBWZWxvY2l0eS5TdGF0ZS5jYWxscy5sZW5ndGg7IGogPCBjYWxsc0xlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0aWYgKFZlbG9jaXR5LlN0YXRlLmNhbGxzW2pdICE9PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0cmVtYWluaW5nQ2FsbHNFeGlzdCA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAocmVtYWluaW5nQ2FsbHNFeGlzdCA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHQvKiB0aWNrKCkgd2lsbCBkZXRlY3QgdGhpcyBmbGFnIHVwb24gaXRzIG5leHQgaXRlcmF0aW9uIGFuZCBzdWJzZXF1ZW50bHkgdHVybiBpdHNlbGYgb2ZmLiAqL1xyXG5cdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmlzVGlja2luZyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHQvKiBDbGVhciB0aGUgY2FsbHMgYXJyYXkgc28gdGhhdCBpdHMgbGVuZ3RoIGlzIHJlc2V0LiAqL1xyXG5cdFx0XHRcdGRlbGV0ZSBWZWxvY2l0eS5TdGF0ZS5jYWxscztcclxuXHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5jYWxscyA9IFtdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqKioqKlxyXG5cdFx0IEZyYW1ld29ya3NcclxuXHRcdCAqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0LyogQm90aCBqUXVlcnkgYW5kIFplcHRvIGFsbG93IHRoZWlyICQuZm4gb2JqZWN0IHRvIGJlIGV4dGVuZGVkIHRvIGFsbG93IHdyYXBwZWQgZWxlbWVudHMgdG8gYmUgc3ViamVjdGVkIHRvIHBsdWdpbiBjYWxscy5cclxuXHRcdCBJZiBlaXRoZXIgZnJhbWV3b3JrIGlzIGxvYWRlZCwgcmVnaXN0ZXIgYSBcInZlbG9jaXR5XCIgZXh0ZW5zaW9uIHBvaW50aW5nIHRvIFZlbG9jaXR5J3MgY29yZSBhbmltYXRlKCkgbWV0aG9kLiAgVmVsb2NpdHlcclxuXHRcdCBhbHNvIHJlZ2lzdGVycyBpdHNlbGYgb250byBhIGdsb2JhbCBjb250YWluZXIgKHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvIHx8IHdpbmRvdykgc28gdGhhdCBjZXJ0YWluIGZlYXR1cmVzIGFyZVxyXG5cdFx0IGFjY2Vzc2libGUgYmV5b25kIGp1c3QgYSBwZXItZWxlbWVudCBzY29wZS4gVGhpcyBtYXN0ZXIgb2JqZWN0IGNvbnRhaW5zIGFuIC5hbmltYXRlKCkgbWV0aG9kLCB3aGljaCBpcyBsYXRlciBhc3NpZ25lZCB0byAkLmZuXHJcblx0XHQgKGlmIGpRdWVyeSBvciBaZXB0byBhcmUgcHJlc2VudCkuIEFjY29yZGluZ2x5LCBWZWxvY2l0eSBjYW4gYm90aCBhY3Qgb24gd3JhcHBlZCBET00gZWxlbWVudHMgYW5kIHN0YW5kIGFsb25lIGZvciB0YXJnZXRpbmcgcmF3IERPTSBlbGVtZW50cy4gKi9cclxuXHRcdGdsb2JhbC5WZWxvY2l0eSA9IFZlbG9jaXR5O1xyXG5cclxuXHRcdGlmIChnbG9iYWwgIT09IHdpbmRvdykge1xyXG5cdFx0XHQvKiBBc3NpZ24gdGhlIGVsZW1lbnQgZnVuY3Rpb24gdG8gVmVsb2NpdHkncyBjb3JlIGFuaW1hdGUoKSBtZXRob2QuICovXHJcblx0XHRcdGdsb2JhbC5mbi52ZWxvY2l0eSA9IGFuaW1hdGU7XHJcblx0XHRcdC8qIEFzc2lnbiB0aGUgb2JqZWN0IGZ1bmN0aW9uJ3MgZGVmYXVsdHMgdG8gVmVsb2NpdHkncyBnbG9iYWwgZGVmYXVsdHMgb2JqZWN0LiAqL1xyXG5cdFx0XHRnbG9iYWwuZm4udmVsb2NpdHkuZGVmYXVsdHMgPSBWZWxvY2l0eS5kZWZhdWx0cztcclxuXHRcdH1cclxuXHJcblx0XHQvKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdCBQYWNrYWdlZCBSZWRpcmVjdHNcclxuXHRcdCAqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHQvKiBzbGlkZVVwLCBzbGlkZURvd24gKi9cclxuXHRcdCQuZWFjaChbXCJEb3duXCIsIFwiVXBcIl0sIGZ1bmN0aW9uKGksIGRpcmVjdGlvbikge1xyXG5cdFx0XHRWZWxvY2l0eS5SZWRpcmVjdHNbXCJzbGlkZVwiICsgZGlyZWN0aW9uXSA9IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMsIGVsZW1lbnRzSW5kZXgsIGVsZW1lbnRzU2l6ZSwgZWxlbWVudHMsIHByb21pc2VEYXRhKSB7XHJcblx0XHRcdFx0dmFyIG9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyksXHJcblx0XHRcdFx0XHRcdGJlZ2luID0gb3B0cy5iZWdpbixcclxuXHRcdFx0XHRcdFx0Y29tcGxldGUgPSBvcHRzLmNvbXBsZXRlLFxyXG5cdFx0XHRcdFx0XHRpbmxpbmVWYWx1ZXMgPSB7fSxcclxuXHRcdFx0XHRcdFx0Y29tcHV0ZWRWYWx1ZXMgPSB7aGVpZ2h0OiBcIlwiLCBtYXJnaW5Ub3A6IFwiXCIsIG1hcmdpbkJvdHRvbTogXCJcIiwgcGFkZGluZ1RvcDogXCJcIiwgcGFkZGluZ0JvdHRvbTogXCJcIn07XHJcblxyXG5cdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0LyogU2hvdyB0aGUgZWxlbWVudCBiZWZvcmUgc2xpZGVEb3duIGJlZ2lucyBhbmQgaGlkZSB0aGUgZWxlbWVudCBhZnRlciBzbGlkZVVwIGNvbXBsZXRlcy4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IElubGluZSBlbGVtZW50cyBjYW5ub3QgaGF2ZSBkaW1lbnNpb25zIGFuaW1hdGVkLCBzbyB0aGV5J3JlIHJldmVydGVkIHRvIGlubGluZS1ibG9jay4gKi9cclxuXHRcdFx0XHRcdG9wdHMuZGlzcGxheSA9IChkaXJlY3Rpb24gPT09IFwiRG93blwiID8gKFZlbG9jaXR5LkNTUy5WYWx1ZXMuZ2V0RGlzcGxheVR5cGUoZWxlbWVudCkgPT09IFwiaW5saW5lXCIgPyBcImlubGluZS1ibG9ja1wiIDogXCJibG9ja1wiKSA6IFwibm9uZVwiKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdG9wdHMuYmVnaW4gPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdC8qIElmIHRoZSB1c2VyIHBhc3NlZCBpbiBhIGJlZ2luIGNhbGxiYWNrLCBmaXJlIGl0IG5vdy4gKi9cclxuXHRcdFx0XHRcdGlmIChlbGVtZW50c0luZGV4ID09PSAwICYmIGJlZ2luKSB7XHJcblx0XHRcdFx0XHRcdGJlZ2luLmNhbGwoZWxlbWVudHMsIGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBDYWNoZSB0aGUgZWxlbWVudHMnIG9yaWdpbmFsIHZlcnRpY2FsIGRpbWVuc2lvbmFsIHByb3BlcnR5IHZhbHVlcyBzbyB0aGF0IHdlIGNhbiBhbmltYXRlIGJhY2sgdG8gdGhlbS4gKi9cclxuXHRcdFx0XHRcdGZvciAodmFyIHByb3BlcnR5IGluIGNvbXB1dGVkVmFsdWVzKSB7XHJcblx0XHRcdFx0XHRcdGlmICghY29tcHV0ZWRWYWx1ZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aW5saW5lVmFsdWVzW3Byb3BlcnR5XSA9IGVsZW1lbnQuc3R5bGVbcHJvcGVydHldO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogRm9yIHNsaWRlRG93biwgdXNlIGZvcmNlZmVlZGluZyB0byBhbmltYXRlIGFsbCB2ZXJ0aWNhbCBwcm9wZXJ0aWVzIGZyb20gMC4gRm9yIHNsaWRlVXAsXHJcblx0XHRcdFx0XHRcdCB1c2UgZm9yY2VmZWVkaW5nIHRvIHN0YXJ0IGZyb20gY29tcHV0ZWQgdmFsdWVzIGFuZCBhbmltYXRlIGRvd24gdG8gMC4gKi9cclxuXHRcdFx0XHRcdFx0dmFyIHByb3BlcnR5VmFsdWUgPSBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSk7XHJcblx0XHRcdFx0XHRcdGNvbXB1dGVkVmFsdWVzW3Byb3BlcnR5XSA9IChkaXJlY3Rpb24gPT09IFwiRG93blwiKSA/IFtwcm9wZXJ0eVZhbHVlLCAwXSA6IFswLCBwcm9wZXJ0eVZhbHVlXTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBGb3JjZSB2ZXJ0aWNhbCBvdmVyZmxvdyBjb250ZW50IHRvIGNsaXAgc28gdGhhdCBzbGlkaW5nIHdvcmtzIGFzIGV4cGVjdGVkLiAqL1xyXG5cdFx0XHRcdFx0aW5saW5lVmFsdWVzLm92ZXJmbG93ID0gZWxlbWVudC5zdHlsZS5vdmVyZmxvdztcclxuXHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdG9wdHMuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdC8qIFJlc2V0IGVsZW1lbnQgdG8gaXRzIHByZS1zbGlkZSBpbmxpbmUgdmFsdWVzIG9uY2UgaXRzIHNsaWRlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4gKi9cclxuXHRcdFx0XHRcdGZvciAodmFyIHByb3BlcnR5IGluIGlubGluZVZhbHVlcykge1xyXG5cdFx0XHRcdFx0XHRpZiAoaW5saW5lVmFsdWVzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gaW5saW5lVmFsdWVzW3Byb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIElmIHRoZSB1c2VyIHBhc3NlZCBpbiBhIGNvbXBsZXRlIGNhbGxiYWNrLCBmaXJlIGl0IG5vdy4gKi9cclxuXHRcdFx0XHRcdGlmIChlbGVtZW50c0luZGV4ID09PSBlbGVtZW50c1NpemUgLSAxKSB7XHJcblx0XHRcdFx0XHRcdGlmIChjb21wbGV0ZSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlLmNhbGwoZWxlbWVudHMsIGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAocHJvbWlzZURhdGEpIHtcclxuXHRcdFx0XHRcdFx0XHRwcm9taXNlRGF0YS5yZXNvbHZlcihlbGVtZW50cyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRWZWxvY2l0eShlbGVtZW50LCBjb21wdXRlZFZhbHVlcywgb3B0cyk7XHJcblx0XHRcdH07XHJcblx0XHR9KTtcclxuXHJcblx0XHQvKiBmYWRlSW4sIGZhZGVPdXQgKi9cclxuXHRcdCQuZWFjaChbXCJJblwiLCBcIk91dFwiXSwgZnVuY3Rpb24oaSwgZGlyZWN0aW9uKSB7XHJcblx0XHRcdFZlbG9jaXR5LlJlZGlyZWN0c1tcImZhZGVcIiArIGRpcmVjdGlvbl0gPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zLCBlbGVtZW50c0luZGV4LCBlbGVtZW50c1NpemUsIGVsZW1lbnRzLCBwcm9taXNlRGF0YSkge1xyXG5cdFx0XHRcdHZhciBvcHRzID0gJC5leHRlbmQoe30sIG9wdGlvbnMpLFxyXG5cdFx0XHRcdFx0XHRjb21wbGV0ZSA9IG9wdHMuY29tcGxldGUsXHJcblx0XHRcdFx0XHRcdHByb3BlcnRpZXNNYXAgPSB7b3BhY2l0eTogKGRpcmVjdGlvbiA9PT0gXCJJblwiKSA/IDEgOiAwfTtcclxuXHJcblx0XHRcdFx0LyogU2luY2UgcmVkaXJlY3RzIGFyZSB0cmlnZ2VyZWQgaW5kaXZpZHVhbGx5IGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGFuaW1hdGVkIHNldCwgYXZvaWQgcmVwZWF0ZWRseSB0cmlnZ2VyaW5nXHJcblx0XHRcdFx0IGNhbGxiYWNrcyBieSBmaXJpbmcgdGhlbSBvbmx5IHdoZW4gdGhlIGZpbmFsIGVsZW1lbnQgaGFzIGJlZW4gcmVhY2hlZC4gKi9cclxuXHRcdFx0XHRpZiAoZWxlbWVudHNJbmRleCAhPT0gMCkge1xyXG5cdFx0XHRcdFx0b3B0cy5iZWdpbiA9IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChlbGVtZW50c0luZGV4ICE9PSBlbGVtZW50c1NpemUgLSAxKSB7XHJcblx0XHRcdFx0XHRvcHRzLmNvbXBsZXRlID0gbnVsbDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0b3B0cy5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoY29tcGxldGUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZS5jYWxsKGVsZW1lbnRzLCBlbGVtZW50cyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKHByb21pc2VEYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0cHJvbWlzZURhdGEucmVzb2x2ZXIoZWxlbWVudHMpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogSWYgYSBkaXNwbGF5IHdhcyBwYXNzZWQgaW4sIHVzZSBpdC4gT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIFwibm9uZVwiIGZvciBmYWRlT3V0IG9yIHRoZSBlbGVtZW50LXNwZWNpZmljIGRlZmF1bHQgZm9yIGZhZGVJbi4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBXZSBhbGxvdyB1c2VycyB0byBwYXNzIGluIFwibnVsbFwiIHRvIHNraXAgZGlzcGxheSBzZXR0aW5nIGFsdG9nZXRoZXIuICovXHJcblx0XHRcdFx0aWYgKG9wdHMuZGlzcGxheSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRvcHRzLmRpc3BsYXkgPSAoZGlyZWN0aW9uID09PSBcIkluXCIgPyBcImF1dG9cIiA6IFwibm9uZVwiKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFZlbG9jaXR5KHRoaXMsIHByb3BlcnRpZXNNYXAsIG9wdHMpO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmV0dXJuIFZlbG9jaXR5O1xyXG5cdH0oKHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvIHx8IHdpbmRvdyksIHdpbmRvdywgKHdpbmRvdyA/IHdpbmRvdy5kb2N1bWVudCA6IHVuZGVmaW5lZCkpO1xyXG59KSk7XHJcblxyXG4vKioqKioqKioqKioqKioqKioqXHJcbiBLbm93biBJc3N1ZXNcclxuICoqKioqKioqKioqKioqKioqKi9cclxuXHJcbi8qIFRoZSBDU1Mgc3BlYyBtYW5kYXRlcyB0aGF0IHRoZSB0cmFuc2xhdGVYL1kvWiB0cmFuc2Zvcm1zIGFyZSAlLXJlbGF0aXZlIHRvIHRoZSBlbGVtZW50IGl0c2VsZiAtLSBub3QgaXRzIHBhcmVudC5cclxuIFZlbG9jaXR5LCBob3dldmVyLCBkb2Vzbid0IG1ha2UgdGhpcyBkaXN0aW5jdGlvbi4gVGh1cywgY29udmVydGluZyB0byBvciBmcm9tIHRoZSAlIHVuaXQgd2l0aCB0aGVzZSBzdWJwcm9wZXJ0aWVzXHJcbiB3aWxsIHByb2R1Y2UgYW4gaW5hY2N1cmF0ZSBjb252ZXJzaW9uIHZhbHVlLiBUaGUgc2FtZSBpc3N1ZSBleGlzdHMgd2l0aCB0aGUgY3gvY3kgYXR0cmlidXRlcyBvZiBTVkcgY2lyY2xlcyBhbmQgZWxsaXBzZXMuICovXHJcbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXBkYXRlU291cmNlcyhpbWcsIHNvdXJjZXMpIHtcbiAgaWYgKHNvdXJjZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCBzb3VyY2Ugc2libGluZ3Mgb2YgdGhlIGltZyB0YWdcbiAgY29uc3QgaW1nU2libGluZ1dlYnAgPSAkKGltZykuc2libGluZ3MoJ3NvdXJjZVt0eXBlPVwiaW1hZ2Uvd2VicFwiXScpO1xuICBjb25zdCBpbWdTaWJsaW5nQXZpZiA9ICQoaW1nKS5zaWJsaW5ncygnc291cmNlW3R5cGU9XCJpbWFnZS9hdmlmXCJdJyk7XG5cbiAgLy8gVXBkYXRlIHRoZW0gaWYgdGhleSBleGlzdCBhbmQgd2UgaGF2ZSBhIHNvdXJjZSBmb3IgdGhlbVxuICBpZiAoc291cmNlcy53ZWJwICE9PSB1bmRlZmluZWQgJiYgaW1nU2libGluZ1dlYnAubGVuZ3RoKSB7XG4gICAgaW1nU2libGluZ1dlYnAuYXR0cignc3Jjc2V0Jywgc291cmNlcy53ZWJwKTtcbiAgfVxuICBpZiAoc291cmNlcy5hdmlmICE9PSB1bmRlZmluZWQgJiYgaW1nU2libGluZ0F2aWYubGVuZ3RoKSB7XG4gICAgaW1nU2libGluZ0F2aWYuYXR0cignc3Jjc2V0Jywgc291cmNlcy5hdmlmKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0TWluaXRhdHVyZSB7XG4gIGluaXQoKSB7XG4gICAgJCgnLmpzLXByb2R1Y3QtbWluaWF0dXJlJykuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHtcbiAgICAgIC8vIExpbWl0IG51bWJlciBvZiBzaG93biBjb2xvcnNcbiAgICAgIGlmICgkKGVsZW1lbnQpLmZpbmQoJy5jb2xvcicpLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcblxuICAgICAgICAkKGVsZW1lbnQpXG4gICAgICAgICAgLmZpbmQoJy5jb2xvcicpXG4gICAgICAgICAgLmVhY2goKGNvbG9ySW5kZXgsIGNvbG9yRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbG9ySW5kZXggPiA0KSB7XG4gICAgICAgICAgICAgICQoY29sb3JFbGVtZW50KS5oaWRlKCk7XG4gICAgICAgICAgICAgIGNvdW50ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgJChlbGVtZW50KS5maW5kKCcuanMtY291bnQnKS5hcHBlbmQoYCske2NvdW50fWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gXCJqcXVlcnlcIjtcbmltcG9ydCBwcmVzdGFzaG9wIGZyb20gXCJwcmVzdGFzaG9wXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCBcInZlbG9jaXR5LWFuaW1hdGVcIjtcbmltcG9ydCB1cGRhdGVTb3VyY2VzIGZyb20gXCIuL2NvbXBvbmVudHMvdXBkYXRlLXNvdXJjZXNcIjtcbmltcG9ydCBQcm9kdWN0TWluaXRhdHVyZSBmcm9tIFwiLi9jb21wb25lbnRzL3Byb2R1Y3QtbWluaWF0dXJlXCI7XG5cblxuXG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XG4gIGNvbnN0IG1vdmUgPSAoZGlyZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgVEhVTUJfTUFSR0lOID0gMjA7XG4gICAgY29uc3QgJHRodW1ibmFpbHMgPSAkKFwiLmpzLXF2LXByb2R1Y3QtaW1hZ2VzXCIpO1xuICAgIGNvbnN0IHRodW1iSGVpZ2h0ID1cbiAgICAgICQoXCIuanMtcXYtcHJvZHVjdC1pbWFnZXMgbGkgaW1nXCIpLmhlaWdodCgpICsgVEhVTUJfTUFSR0lOO1xuICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9ICR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wO1xuICAgICR0aHVtYm5haWxzLnZlbG9jaXR5KFxuICAgICAge1xuICAgICAgICB0cmFuc2xhdGVZOlxuICAgICAgICAgIGRpcmVjdGlvbiA9PT0gXCJ1cFwiXG4gICAgICAgICAgICA/IGN1cnJlbnRQb3NpdGlvbiArIHRodW1iSGVpZ2h0XG4gICAgICAgICAgICA6IGN1cnJlbnRQb3NpdGlvbiAtIHRodW1iSGVpZ2h0LFxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wID49IDApIHtcbiAgICAgICAgICAkKFwiLmFycm93LXVwXCIpLmNzcyhcIm9wYWNpdHlcIiwgXCIuMlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAkdGh1bWJuYWlscy5wb3NpdGlvbigpLnRvcCArICR0aHVtYm5haWxzLmhlaWdodCgpIDw9XG4gICAgICAgICAgJChcIi5qcy1xdi1tYXNrXCIpLmhlaWdodCgpXG4gICAgICAgICkge1xuICAgICAgICAgICQoXCIuYXJyb3ctZG93blwiKS5jc3MoXCJvcGFjaXR5XCIsIFwiLjJcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBwcm9kdWN0Q29uZmlnID0gKHF2KSA9PiB7XG4gICAgY29uc3QgTUFYX1RIVU1CUyA9IDQ7XG4gICAgY29uc3QgJGFycm93cyA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFycm93cyk7XG4gICAgY29uc3QgJHRodW1ibmFpbHMgPSBxdi5maW5kKFwiLmpzLXF2LXByb2R1Y3QtaW1hZ2VzXCIpO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnRodW1iKS5vbihcImNsaWNrXCIsIChldmVudCkgPT4ge1xuICAgICAgLy8gU3dhcCBhY3RpdmUgY2xhc3NlcyBvbiB0aHVtYm5haWxcbiAgICAgIGlmICgkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC50aHVtYikuaGFzQ2xhc3MoXCJzZWxlY3RlZFwiKSkge1xuICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC50aHVtYikucmVtb3ZlQ2xhc3MoXCJzZWxlY3RlZFwiKTtcbiAgICAgIH1cbiAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoXCJzZWxlY3RlZFwiKTtcblxuICAgICAgLy8gR2V0IGRhdGEgZnJvbSB0aHVtYm5haWwgYW5kIHVwZGF0ZSBjb3ZlciBzcmMsIGFsdCBhbmQgdGl0bGVcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmNvdmVyKS5hdHRyKFxuICAgICAgICBcInNyY1wiLFxuICAgICAgICAkKGV2ZW50LnRhcmdldCkuZGF0YShcImltYWdlLWxhcmdlLXNyY1wiKSxcbiAgICAgICk7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5jb3ZlcikuYXR0cihcbiAgICAgICAgXCJhbHRcIixcbiAgICAgICAgJChldmVudC50YXJnZXQpLmF0dHIoXCJhbHRcIiksXG4gICAgICApO1xuICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuY292ZXIpLmF0dHIoXG4gICAgICAgIFwidGl0bGVcIixcbiAgICAgICAgJChldmVudC50YXJnZXQpLmF0dHIoXCJ0aXRsZVwiKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc291cmNlc1xuICAgICAgdXBkYXRlU291cmNlcyhcbiAgICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuY292ZXIpLFxuICAgICAgICAkKGV2ZW50LnRhcmdldCkuZGF0YShcImltYWdlLWxhcmdlLXNvdXJjZXNcIiksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmICgkdGh1bWJuYWlscy5maW5kKFwibGlcIikubGVuZ3RoIDw9IE1BWF9USFVNQlMpIHtcbiAgICAgICRhcnJvd3MuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkYXJyb3dzLm9uKFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAkKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoXCJhcnJvdy11cFwiKSAmJlxuICAgICAgICAgICQoXCIuanMtcXYtcHJvZHVjdC1pbWFnZXNcIikucG9zaXRpb24oKS50b3AgPCAwXG4gICAgICAgICkge1xuICAgICAgICAgIG1vdmUoXCJ1cFwiKTtcbiAgICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuYXJyb3dEb3duKS5jc3MoXCJvcGFjaXR5XCIsIFwiMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAkKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoXCJhcnJvdy1kb3duXCIpICYmXG4gICAgICAgICAgJHRodW1ibmFpbHMucG9zaXRpb24oKS50b3AgKyAkdGh1bWJuYWlscy5oZWlnaHQoKSA+XG4gICAgICAgICAgICAkKFwiLmpzLXF2LW1hc2tcIikuaGVpZ2h0KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbW92ZShcImRvd25cIik7XG4gICAgICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmFycm93VXApLmNzcyhcIm9wYWNpdHlcIiwgXCIxXCIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcXYuZmluZChwcmVzdGFzaG9wLnNlbGVjdG9ycy5xdWFudGl0eVdhbnRlZCkuVG91Y2hTcGluKHtcbiAgICAgIHZlcnRpY2FsYnV0dG9uczogdHJ1ZSxcbiAgICAgIG1pbjogMSxcbiAgICAgIG1heDogMTAwMDAwMCxcbiAgICB9KTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy50b3VjaHNwaW4pLm9mZihcInRvdWNoc3RhcnQudG91Y2hzcGluXCIpO1xuICB9O1xuXG4gIHByZXN0YXNob3Aub24oXCJjbGlja1F1aWNrVmlld1wiLCAoZWxtKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJxdWlja3ZpZXdcIixcbiAgICAgIGlkX3Byb2R1Y3Q6IGVsbS5kYXRhc2V0LmlkUHJvZHVjdCxcbiAgICAgIGlkX3Byb2R1Y3RfYXR0cmlidXRlOiBlbG0uZGF0YXNldC5pZFByb2R1Y3RBdHRyaWJ1dGUsXG4gICAgfTtcbiAgICAkLnBvc3QocHJlc3Rhc2hvcC51cmxzLnBhZ2VzLnByb2R1Y3QsIGRhdGEsIG51bGwsIFwianNvblwiKVxuICAgICAgLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgJChcImJvZHlcIikuYXBwZW5kKHJlc3AucXVpY2t2aWV3X2h0bWwpO1xuICAgICAgICBjb25zdCBwcm9kdWN0TW9kYWwgPSAkKFxuICAgICAgICAgIGAjcXVpY2t2aWV3LW1vZGFsLSR7cmVzcC5wcm9kdWN0LmlkfS0ke3Jlc3AucHJvZHVjdC5pZF9wcm9kdWN0X2F0dHJpYnV0ZX1gLFxuICAgICAgICApO1xuICAgICAgICBwcm9kdWN0TW9kYWwubW9kYWwoXCJzaG93XCIpO1xuICAgICAgICBwcm9kdWN0Q29uZmlnKHByb2R1Y3RNb2RhbCk7XG4gICAgICAgIHByb2R1Y3RNb2RhbC5vbihcImhpZGRlbi5icy5tb2RhbFwiLCAoKSA9PiB7XG4gICAgICAgICAgcHJvZHVjdE1vZGFsLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuZmFpbCgocmVzcCkgPT4ge1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoXCJoYW5kbGVFcnJvclwiLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiBcImNsaWNrUXVpY2tWaWV3XCIsXG4gICAgICAgICAgcmVzcCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgJChcImJvZHlcIikub24oXG4gICAgXCJjbGlja1wiLFxuICAgIHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJUb2dnbGVyLFxuICAgICgpID0+IHtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLnNlYXJjaEZpbHRlcnNXcmFwcGVyKS5yZW1vdmVDbGFzcyhcbiAgICAgICAgXCJoaWRkZW4tc20tZG93blwiLFxuICAgICAgKTtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jb250ZW50V3JhcHBlcikuYWRkQ2xhc3MoXCJoaWRkZW4tc20tZG93blwiKTtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5mb290ZXIpLmFkZENsYXNzKFwiaGlkZGVuLXNtLWRvd25cIik7XG4gICAgfSxcbiAgKTtcbiAgJChcbiAgICBgJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVyQ29udHJvbHN9ICR7cHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jbGVhcn1gLFxuICApLm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLnNlYXJjaEZpbHRlcnNXcmFwcGVyKS5hZGRDbGFzcyhcbiAgICAgIFwiaGlkZGVuLXNtLWRvd25cIixcbiAgICApO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jb250ZW50V3JhcHBlcikucmVtb3ZlQ2xhc3MoXCJoaWRkZW4tc20tZG93blwiKTtcbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuZm9vdGVyKS5yZW1vdmVDbGFzcyhcImhpZGRlbi1zbS1kb3duXCIpO1xuICB9KTtcbiAgJChgJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVyQ29udHJvbHN9IC5va2ApLm9uKFxuICAgIFwiY2xpY2tcIixcbiAgICAoKSA9PiB7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJzV3JhcHBlcikuYWRkQ2xhc3MoXG4gICAgICAgIFwiaGlkZGVuLXNtLWRvd25cIixcbiAgICAgICk7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY29udGVudFdyYXBwZXIpLnJlbW92ZUNsYXNzKFwiaGlkZGVuLXNtLWRvd25cIik7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuZm9vdGVyKS5yZW1vdmVDbGFzcyhcImhpZGRlbi1zbS1kb3duXCIpO1xuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgcGFyc2VTZWFyY2hVcmwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmRhdGFzZXQuc2VhcmNoVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmVudC50YXJnZXQuZGF0YXNldC5zZWFyY2hVcmw7XG4gICAgfVxuXG4gICAgaWYgKCQoZXZlbnQudGFyZ2V0KS5wYXJlbnQoKVswXS5kYXRhc2V0LnNlYXJjaFVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gbm90IHBhcnNlIHNlYXJjaCBVUkxcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuICQoZXZlbnQudGFyZ2V0KS5wYXJlbnQoKVswXS5kYXRhc2V0LnNlYXJjaFVybDtcbiAgfTtcblxuICBmdW5jdGlvbiB1cGRhdGVQcm9kdWN0TGlzdERPTShkYXRhKSB7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVycykucmVwbGFjZVdpdGgoXG4gICAgICBkYXRhLnJlbmRlcmVkX2ZhY2V0cyxcbiAgICApO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmFjdGl2ZVNlYXJjaEZpbHRlcnMpLnJlcGxhY2VXaXRoKFxuICAgICAgZGF0YS5yZW5kZXJlZF9hY3RpdmVfZmlsdGVycyxcbiAgICApO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmxpc3RUb3ApLnJlcGxhY2VXaXRoKFxuICAgICAgZGF0YS5yZW5kZXJlZF9wcm9kdWN0c190b3AsXG4gICAgKTtcblxuICAgIGNvbnN0IHJlbmRlcmVkUHJvZHVjdHMgPSAkKGRhdGEucmVuZGVyZWRfcHJvZHVjdHMpO1xuICAgIGNvbnN0IHByb2R1Y3RTZWxlY3RvcnMgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5wcm9kdWN0KTtcblxuICAgIGlmIChwcm9kdWN0U2VsZWN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb2R1Y3RTZWxlY3RvcnNcbiAgICAgICAgLnJlbW92ZUNsYXNzKClcbiAgICAgICAgLmFkZENsYXNzKHByb2R1Y3RTZWxlY3RvcnMuZmlyc3QoKS5hdHRyKFwiY2xhc3NcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0U2VsZWN0b3JzXG4gICAgICAgIC5yZW1vdmVDbGFzcygpXG4gICAgICAgIC5hZGRDbGFzcyhyZW5kZXJlZFByb2R1Y3RzLmZpcnN0KCkuYXR0cihcImNsYXNzXCIpKTtcbiAgICB9XG5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5saXN0KS5yZXBsYWNlV2l0aChyZW5kZXJlZFByb2R1Y3RzKTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmxpc3RCb3R0b20pLnJlcGxhY2VXaXRoKFxuICAgICAgZGF0YS5yZW5kZXJlZF9wcm9kdWN0c19ib3R0b20sXG4gICAgKTtcbiAgICBpZiAoZGF0YS5yZW5kZXJlZF9wcm9kdWN0c19oZWFkZXIpIHtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmxpc3RIZWFkZXIpLnJlcGxhY2VXaXRoKFxuICAgICAgICBkYXRhLnJlbmRlcmVkX3Byb2R1Y3RzX2hlYWRlcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgJCgnI3Nob3ctZmlsdGVycycpLm9uKCdjbGljay5vZmZjYW52YXMnLCAoKSA9PiB7XG4gICAgICAkKCcjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzJykuc2hvdygpO1xuICAgIH0pO1xuICBcbiAgICAkKCcjaGlkZS1maWx0ZXJzJykub24oJ2NsaWNrLm9mZmNhbnZhcycsICgpID0+IHtcbiAgICAgICQoJyNwcm9kdWN0LWxpc3QtdG9wLWZpbHRlcnMnKS5oaWRlKCk7XG4gICAgICAkKCcjb3ZlcmxheScpLmhpZGUoKTsgXG4gICAgfSk7XG5cbiAgICAkKCcjc2hvdy1maWx0ZXJzJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAkKCcjb3ZlcmxheScpLnNob3coKTtcbiAgICB9KTtcblxuICAgICQoJyNwcm9kdWN0LWxpc3QtdG9wLWZpbHRlcnMnKS5zaG93KCk7XG4gIFxuICAgIGZ1bmN0aW9uIGNoZWNrQW5kU2hvd092ZXJsYXkoKSB7XG4gICAgICBpZiAoJCgnI3Byb2R1Y3QtbGlzdC10b3AtZmlsdGVycycpLmlzKCc6dmlzaWJsZScpKSB7IFxuICAgICAgICAgICQoJyNvdmVybGF5Jykuc2hvdygpO1xuICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgJCgnI292ZXJsYXknKS5oaWRlKCk7XG4gICAgICB9XG4gIH1cblxuICAkKCcjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzJykuc2hvdyhmdW5jdGlvbigpIHtcbiAgICBjaGVja0FuZFNob3dPdmVybGF5KCk7XG4gICAgfSk7XG5cbiAgICAkKCcjb3ZlcmxheScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgJCgnI3Byb2R1Y3QtbGlzdC10b3AtZmlsdGVycycpLmhpZGUoKTtcbiAgICAgICQoJyNvdmVybGF5JykuaGlkZSgpOyAgXG4gICAgIFxuICB9KTtcblxuICAgICQoJy50aC1hY2NvcmRpb24nKS50aGFjY29yZGlvbigpO1xuXG4gICAgY29uc3QgcHJvZHVjdE1pbml0YXR1cmUgPSBuZXcgUHJvZHVjdE1pbml0YXR1cmUoKTtcbiAgICBwcm9kdWN0TWluaXRhdHVyZS5pbml0KCk7XG4gIH1cblxuICBcblxuICAkKFwiYm9keVwiKS5vbihcbiAgICBcImNoYW5nZVwiLFxuICAgIGAke3ByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJzfSBpbnB1dFtkYXRhLXNlYXJjaC11cmxdYCxcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIHByZXN0YXNob3AuZW1pdChcInVwZGF0ZUZhY2V0c1wiLCBwYXJzZVNlYXJjaFVybChldmVudCkpO1xuICAgIH0sXG4gICk7XG5cbiAgJChcImJvZHlcIikub24oXG4gICAgXCJjbGlja1wiLFxuICAgIHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJzQ2xlYXJBbGwsXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBwcmVzdGFzaG9wLmVtaXQoXCJ1cGRhdGVGYWNldHNcIiwgcGFyc2VTZWFyY2hVcmwoZXZlbnQpKTtcbiAgICB9LFxuICApO1xuXG4gICQoXCJib2R5XCIpLm9uKFxuICAgIFwiY2xpY2tcIixcbiAgICBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoTGluayxcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBwcmVzdGFzaG9wLmVtaXQoXCJ1cGRhdGVGYWNldHNcIiwgJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCJhXCIpLmdldCgwKS5ocmVmKTtcbiAgICB9LFxuICApO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgKGUpID0+IHtcbiAgICBpZiAoZS5zdGF0ZSAmJiBlLnN0YXRlLmN1cnJlbnRfdXJsKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGUuc3RhdGUuY3VycmVudF91cmw7XG4gICAgfVxuICB9KTtcblxuICAkKFwiYm9keVwiKS5vbihcbiAgICBcImNoYW5nZVwiLFxuICAgIGAke3ByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJzfSBzZWxlY3RgLFxuICAgIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgZm9ybSA9ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiZm9ybVwiKTtcbiAgICAgIHByZXN0YXNob3AuZW1pdChcInVwZGF0ZUZhY2V0c1wiLCBgPyR7Zm9ybS5zZXJpYWxpemUoKX1gKTtcbiAgICB9LFxuICApO1xuXG4gIHByZXN0YXNob3Aub24oXCJ1cGRhdGVQcm9kdWN0TGlzdFwiLCAoZGF0YSkgPT4ge1xuICAgIHVwZGF0ZVByb2R1Y3RMaXN0RE9NKGRhdGEpO1xuICAgIHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcbiAgfSk7XG59KTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5Jztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuaW1wb3J0ICd2ZWxvY2l0eS1hbmltYXRlJztcbi8vIGltcG9ydCB1cGRhdGVTb3VyY2VzIGZyb20gJ3VwZGF0ZS1zb3VyY2VzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdFNlbGVjdCB7XG4gIGluaXQoKSB7XG4gICAgY29uc3QgTUFYX1RIVU1CUyA9IDU7XG4gICAgY29uc3QgJGFycm93cyA9ICQoJy5qcy1tb2RhbC1hcnJvd3MnKTtcbiAgICBjb25zdCAkdGh1bWJuYWlscyA9ICQoJy5qcy1tb2RhbC1wcm9kdWN0LWltYWdlcycpO1xuXG4gICAgJCgnYm9keScpXG4gICAgICAub24oJ2NsaWNrJywgJy5qcy1tb2RhbC10aHVtYicsIChldmVudCkgPT4ge1xuICAgICAgICAvLyBTd2FwIGFjdGl2ZSBjbGFzc2VzIG9uIHRodW1ibmFpbFxuICAgICAgICBpZiAoJCgnLmpzLW1vZGFsLXRodW1iJykuaGFzQ2xhc3MoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAkKCcuanMtbW9kYWwtdGh1bWInKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc3JjLCBhbHQgYW5kIHRpdGxlXG4gICAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0Lm1vZGFsUHJvZHVjdENvdmVyKS5hdHRyKCdzcmMnLCAkKGV2ZW50LnRhcmdldCkuZGF0YSgnaW1hZ2UtbGFyZ2Utc3JjJykpO1xuICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5tb2RhbFByb2R1Y3RDb3ZlcikuYXR0cigndGl0bGUnLCAkKGV2ZW50LnRhcmdldCkuYXR0cigndGl0bGUnKSk7XG4gICAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0Lm1vZGFsUHJvZHVjdENvdmVyKS5hdHRyKCdhbHQnLCAkKGV2ZW50LnRhcmdldCkuYXR0cignYWx0JykpO1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc291cmNlc1xuICAgICAgICAvLyB1cGRhdGVTb3VyY2VzKFxuICAgICAgICAvLyAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0Lm1vZGFsUHJvZHVjdENvdmVyKSxcbiAgICAgICAgLy8gICAkKGV2ZW50LnRhcmdldCkuZGF0YSgnaW1hZ2UtbGFyZ2Utc291cmNlcycpLFxuICAgICAgICAvLyApO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAnYXNpZGUjdGh1bWJuYWlscycsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmlkID09PSAndGh1bWJuYWlscycpIHtcbiAgICAgICAgICAkKCcjcHJvZHVjdC1tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKCQoJy5qcy1tb2RhbC1wcm9kdWN0LWltYWdlcyBsaScpLmxlbmd0aCA8PSBNQVhfVEhVTUJTKSB7XG4gICAgICAkYXJyb3dzLmNzcygnb3BhY2l0eScsICcuMicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkYXJyb3dzLm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmhhc0NsYXNzKCdhcnJvdy11cCcpICYmICR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wIDwgMCkge1xuICAgICAgICAgIHRoaXMubW92ZSgndXAnKTtcbiAgICAgICAgICAkKCcuanMtbW9kYWwtYXJyb3ctZG93bicpLmNzcygnb3BhY2l0eScsICcxJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgJChldmVudC50YXJnZXQpLmhhc0NsYXNzKCdhcnJvdy1kb3duJylcbiAgICAgICAgICAmJiAkdGh1bWJuYWlscy5wb3NpdGlvbigpLnRvcCArICR0aHVtYm5haWxzLmhlaWdodCgpID4gJCgnLmpzLW1vZGFsLW1hc2snKS5oZWlnaHQoKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm1vdmUoJ2Rvd24nKTtcbiAgICAgICAgICAkKCcuanMtbW9kYWwtYXJyb3ctdXAnKS5jc3MoJ29wYWNpdHknLCAnMScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBtb3ZlKGRpcmVjdGlvbikge1xuICAgIGNvbnN0IFRIVU1CX01BUkdJTiA9IDEwO1xuICAgIGNvbnN0ICR0aHVtYm5haWxzID0gJCgnLmpzLW1vZGFsLXByb2R1Y3QtaW1hZ2VzJyk7XG4gICAgY29uc3QgdGh1bWJIZWlnaHQgPSAkKCcuanMtbW9kYWwtcHJvZHVjdC1pbWFnZXMgbGkgaW1nJykuaGVpZ2h0KCkgKyBUSFVNQl9NQVJHSU47XG4gICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gJHRodW1ibmFpbHMucG9zaXRpb24oKS50b3A7XG4gICAgJHRodW1ibmFpbHMudmVsb2NpdHkoXG4gICAgICB7XG4gICAgICAgIHRyYW5zbGF0ZVk6IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGN1cnJlbnRQb3NpdGlvbiArIHRodW1iSGVpZ2h0IDogY3VycmVudFBvc2l0aW9uIC0gdGh1bWJIZWlnaHQsXG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoJHRodW1ibmFpbHMucG9zaXRpb24oKS50b3AgPj0gMCkge1xuICAgICAgICAgICQoJy5qcy1tb2RhbC1hcnJvdy11cCcpLmNzcygnb3BhY2l0eScsICcuMicpO1xuICAgICAgICB9IGVsc2UgaWYgKCR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wICsgJHRodW1ibmFpbHMuaGVpZ2h0KCkgPD0gJCgnLmpzLW1vZGFsLW1hc2snKS5oZWlnaHQoKSkge1xuICAgICAgICAgICQoJy5qcy1tb2RhbC1hcnJvdy1kb3duJykuY3NzKCdvcGFjaXR5JywgJy4yJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5pbXBvcnQgUHJvZHVjdFNlbGVjdCBmcm9tICcuL2NvbXBvbmVudHMvcHJvZHVjdC1zZWxlY3QnO1xuaW1wb3J0IHVwZGF0ZVNvdXJjZXMgZnJvbSAnLi9jb21wb25lbnRzL3VwZGF0ZS1zb3VyY2VzJztcblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBmdW5jdGlvbiBjb3ZlckltYWdlKCkge1xuICAgIGNvbnN0IHByb2R1Y3RDb3ZlciA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmNvdmVyKTtcbiAgICBjb25zdCBtb2RhbFByb2R1Y3RDb3ZlciA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0Lm1vZGFsUHJvZHVjdENvdmVyKTtcbiAgICBsZXQgdGh1bWJTZWxlY3RlZCA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnNlbGVjdGVkKTtcblxuICAgIGNvbnN0IHN3aXBlID0gKHNlbGVjdGVkVGh1bWIsIHRodW1iUGFyZW50KSA9PiB7XG4gICAgICBjb25zdCBuZXdTZWxlY3RlZFRodW1iID0gdGh1bWJQYXJlbnQuZmluZChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QudGh1bWIpO1xuXG4gICAgICAvLyBTd2FwIGFjdGl2ZSBjbGFzc2VzIG9uIHRodW1ibmFpbFxuICAgICAgc2VsZWN0ZWRUaHVtYi5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgIG5ld1NlbGVjdGVkVGh1bWIuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7XG5cbiAgICAgIC8vIFVwZGF0ZSBzb3VyY2VzIG9mIGJvdGggY292ZXIgYW5kIG1vZGFsIGNvdmVyXG4gICAgICBtb2RhbFByb2R1Y3RDb3Zlci5wcm9wKCdzcmMnLCBuZXdTZWxlY3RlZFRodW1iLmRhdGEoJ2ltYWdlLWxhcmdlLXNyYycpKTtcbiAgICAgIHByb2R1Y3RDb3Zlci5wcm9wKCdzcmMnLCBuZXdTZWxlY3RlZFRodW1iLmRhdGEoJ2ltYWdlLW1lZGl1bS1zcmMnKSk7XG4gICAgICAkKCcuZWFzeXpvb20gI2Vhc3l6b29tLWxhcmdlLWltZy1hbmNob3InKS5hdHRyKCdocmVmJywgbmV3U2VsZWN0ZWRUaHVtYi5kYXRhKCdpbWFnZS1sYXJnZS1zcmMnKSk7XG5cbiAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc3JjLCBhbHQgYW5kIHRpdGxlXG4gICAgICBwcm9kdWN0Q292ZXIuYXR0cigndGl0bGUnLCBuZXdTZWxlY3RlZFRodW1iLmF0dHIoJ3RpdGxlJykpO1xuICAgICAgbW9kYWxQcm9kdWN0Q292ZXIuYXR0cigndGl0bGUnLCBuZXdTZWxlY3RlZFRodW1iLmF0dHIoJ3RpdGxlJykpO1xuICAgICAgcHJvZHVjdENvdmVyLmF0dHIoJ2FsdCcsIG5ld1NlbGVjdGVkVGh1bWIuYXR0cignYWx0JykpO1xuICAgICAgbW9kYWxQcm9kdWN0Q292ZXIuYXR0cignYWx0JywgbmV3U2VsZWN0ZWRUaHVtYi5hdHRyKCdhbHQnKSk7XG5cbiAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc291cmNlc1xuICAgICAgdXBkYXRlU291cmNlcyhwcm9kdWN0Q292ZXIsIG5ld1NlbGVjdGVkVGh1bWIuZGF0YSgnaW1hZ2UtbWVkaXVtLXNvdXJjZXMnKSk7XG4gICAgICB1cGRhdGVTb3VyY2VzKG1vZGFsUHJvZHVjdENvdmVyLCBuZXdTZWxlY3RlZFRodW1iLmRhdGEoJ2ltYWdlLWxhcmdlLXNvdXJjZXMnKSk7XG4gICAgfTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnRodW1iKS5vbignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgIHRodW1iU2VsZWN0ZWQgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5zZWxlY3RlZCk7XG4gICAgICBzd2lwZSh0aHVtYlNlbGVjdGVkLCAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QudGh1bWJDb250YWluZXIpKTtcbiAgICB9KTtcblxuICAgIHByb2R1Y3RDb3Zlci5zd2lwZSh7XG4gICAgICBzd2lwZTogKGV2ZW50LCBkaXJlY3Rpb24pID0+IHtcbiAgICAgICAgdGh1bWJTZWxlY3RlZCA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnNlbGVjdGVkKTtcbiAgICAgICAgY29uc3QgcGFyZW50VGh1bWIgPSB0aHVtYlNlbGVjdGVkLmNsb3Nlc3QocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnRodW1iQ29udGFpbmVyKTtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHBhcmVudFRodW1iLnByZXYoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzd2lwZSh0aHVtYlNlbGVjdGVkLCBwYXJlbnRUaHVtYi5wcmV2KCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50VGh1bWIubmV4dCgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN3aXBlKHRodW1iU2VsZWN0ZWQsIHBhcmVudFRodW1iLm5leHQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHBhcmVudFRodW1iLm5leHQoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzd2lwZSh0aHVtYlNlbGVjdGVkLCBwYXJlbnRUaHVtYi5uZXh0KCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50VGh1bWIucHJldigpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN3aXBlKHRodW1iU2VsZWN0ZWQsIHBhcmVudFRodW1iLnByZXYoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYWxsb3dQYWdlU2Nyb2xsOiAndmVydGljYWwnLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaW1hZ2VTY3JvbGxCb3goKSB7XG4gICAgaWYgKCQoJyNtYWluIC5qcy1xdi1wcm9kdWN0LWltYWdlcyBsaScpLmxlbmd0aCA+IDIpIHtcbiAgICAgICQoJyNtYWluIC5qcy1xdi1tYXNrJykuYWRkQ2xhc3MoJ3Njcm9sbCcpO1xuICAgICAgJCgnLnNjcm9sbC1ib3gtYXJyb3dzJykuYWRkQ2xhc3MoJ3Njcm9sbCcpO1xuICAgICAgJCgnI21haW4gLmpzLXF2LW1hc2snKS5zY3JvbGxib3goe1xuICAgICAgICBkaXJlY3Rpb246ICdoJyxcbiAgICAgICAgZGlzdGFuY2U6IDExMyxcbiAgICAgICAgYXV0b1BsYXk6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICAkKCcuc2Nyb2xsLWJveC1hcnJvd3MgLmxlZnQnKS5jbGljaygoKSA9PiB7XG4gICAgICAgICQoJyNtYWluIC5qcy1xdi1tYXNrJykudHJpZ2dlcignYmFja3dhcmQnKTtcbiAgICAgIH0pO1xuICAgICAgJCgnLnNjcm9sbC1ib3gtYXJyb3dzIC5yaWdodCcpLmNsaWNrKCgpID0+IHtcbiAgICAgICAgJCgnI21haW4gLmpzLXF2LW1hc2snKS50cmlnZ2VyKCdmb3J3YXJkJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnI21haW4gLmpzLXF2LW1hc2snKS5yZW1vdmVDbGFzcygnc2Nyb2xsJyk7XG4gICAgICAkKCcuc2Nyb2xsLWJveC1hcnJvd3MnKS5yZW1vdmVDbGFzcygnc2Nyb2xsJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5wdXRGaWxlKCkge1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5maWxlSW5wdXQpLm9uKCdjaGFuZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldClbMF07XG4gICAgICBjb25zdCBmaWxlID0gKHRhcmdldCkgPyB0YXJnZXQuZmlsZXNbMF0gOiBudWxsO1xuXG4gICAgICBpZiAodGFyZ2V0ICYmIGZpbGUpIHtcbiAgICAgICAgJCh0YXJnZXQpLnByZXYoKS50ZXh0KGZpbGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcm9kdWN0U3BpbigpIHtcbiAgICBjb25zdCAkcXVhbnRpdHlJbnB1dCA9ICQocHJlc3Rhc2hvcC5zZWxlY3RvcnMucXVhbnRpdHlXYW50ZWQpO1xuXG4gICAgJHF1YW50aXR5SW5wdXQuVG91Y2hTcGluKHtcbiAgICAgIHZlcnRpY2FsYnV0dG9uczogdHJ1ZSxcbiAgICAgIHZlcnRpY2FsdXBjbGFzczogJ21hdGVyaWFsLWljb25zIHRvdWNoc3Bpbi11cCcsXG4gICAgICB2ZXJ0aWNhbGRvd25jbGFzczogJ21hdGVyaWFsLWljb25zIHRvdWNoc3Bpbi1kb3duJyxcbiAgICAgIGJ1dHRvbmRvd25fY2xhc3M6ICdidG4gYnRuLXRvdWNoc3BpbiBqcy10b3VjaHNwaW4nLFxuICAgICAgYnV0dG9udXBfY2xhc3M6ICdidG4gYnRuLXRvdWNoc3BpbiBqcy10b3VjaHNwaW4nLFxuICAgICAgbWluOiBwYXJzZUludCgkcXVhbnRpdHlJbnB1dC5hdHRyKCdtaW4nKSwgMTApLFxuICAgICAgbWF4OiAxMDAwMDAwLFxuICAgIH0pO1xuXG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnRvdWNoc3Bpbikub2ZmKCd0b3VjaHN0YXJ0LnRvdWNoc3BpbicpO1xuXG4gICAgJHF1YW50aXR5SW5wdXQub24oJ2ZvY3Vzb3V0JywgKCkgPT4ge1xuICAgICAgaWYgKCRxdWFudGl0eUlucHV0LnZhbCgpID09PSAnJyB8fCAkcXVhbnRpdHlJbnB1dC52YWwoKSA8ICRxdWFudGl0eUlucHV0LmF0dHIoJ21pbicpKSB7XG4gICAgICAgICRxdWFudGl0eUlucHV0LnZhbCgkcXVhbnRpdHlJbnB1dC5hdHRyKCdtaW4nKSk7XG4gICAgICAgICRxdWFudGl0eUlucHV0LnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnYm9keScpLm9uKCdjaGFuZ2Uga2V5dXAnLCBwcmVzdGFzaG9wLnNlbGVjdG9ycy5xdWFudGl0eVdhbnRlZCwgKGUpID0+IHtcbiAgICAgIGlmICgkcXVhbnRpdHlJbnB1dC52YWwoKSAhPT0gJycpIHtcbiAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLnRyaWdnZXIoJ3RvdWNoc3Bpbi5zdG9wc3BpbicpO1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoJ3VwZGF0ZVByb2R1Y3QnLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAndXBkYXRlZFByb2R1Y3RRdWFudGl0eScsXG4gICAgICAgICAgZXZlbnQ6IGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkSnNQcm9kdWN0VGFiQWN0aXZlU2VsZWN0b3IoKSB7XG4gICAgY29uc3QgbmF2ID0gJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QudGFicyk7XG4gICAgbmF2Lm9uKCdzaG93LmJzLnRhYicsIChlKSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSAkKGUudGFyZ2V0KTtcbiAgICAgIHRhcmdldC5hZGRDbGFzcyhwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuYWN0aXZlTmF2Q2xhc3MpO1xuICAgICAgJCh0YXJnZXQuYXR0cignaHJlZicpKS5hZGRDbGFzcyhwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuYWN0aXZlVGFiQ2xhc3MpO1xuICAgIH0pO1xuICAgIG5hdi5vbignaGlkZS5icy50YWInLCAoZSkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gJChlLnRhcmdldCk7XG4gICAgICB0YXJnZXQucmVtb3ZlQ2xhc3MocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFjdGl2ZU5hdkNsYXNzKTtcbiAgICAgICQodGFyZ2V0LmF0dHIoJ2hyZWYnKSkucmVtb3ZlQ2xhc3MocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFjdGl2ZVRhYkNsYXNzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVByb2R1Y3RTcGluKCk7XG4gIGNyZWF0ZUlucHV0RmlsZSgpO1xuICBjb3ZlckltYWdlKCk7XG4gIGltYWdlU2Nyb2xsQm94KCk7XG4gIGFkZEpzUHJvZHVjdFRhYkFjdGl2ZVNlbGVjdG9yKCk7XG5cbiAgcHJlc3Rhc2hvcC5vbigndXBkYXRlZFByb2R1Y3QnLCAoZXZlbnQpID0+IHtcbiAgICBjcmVhdGVJbnB1dEZpbGUoKTtcbiAgICBjb3ZlckltYWdlKCk7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnByb2R1Y3RfbWluaW1hbF9xdWFudGl0eSkge1xuICAgICAgY29uc3QgbWluaW1hbFByb2R1Y3RRdWFudGl0eSA9IHBhcnNlSW50KGV2ZW50LnByb2R1Y3RfbWluaW1hbF9xdWFudGl0eSwgMTApO1xuICAgICAgY29uc3QgcXVhbnRpdHlJbnB1dFNlbGVjdG9yID0gcHJlc3Rhc2hvcC5zZWxlY3RvcnMucXVhbnRpdHlXYW50ZWQ7XG4gICAgICBjb25zdCBxdWFudGl0eUlucHV0ID0gJChxdWFudGl0eUlucHV0U2VsZWN0b3IpO1xuXG4gICAgICAvLyBAc2VlIGh0dHA6Ly93d3cudmlydHVvc29mdC5ldS9jb2RlL2Jvb3RzdHJhcC10b3VjaHNwaW4vIGFib3V0IEJvb3RzdHJhcCBUb3VjaFNwaW5cbiAgICAgIHF1YW50aXR5SW5wdXQudHJpZ2dlcigndG91Y2hzcGluLnVwZGF0ZXNldHRpbmdzJywge1xuICAgICAgICBtaW46IG1pbmltYWxQcm9kdWN0UXVhbnRpdHksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaW1hZ2VTY3JvbGxCb3goKTtcbiAgICAkKCQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFjdGl2ZVRhYnMpLmF0dHIoJ2hyZWYnKSkuYWRkQ2xhc3MoJ2FjdGl2ZScpLnJlbW92ZUNsYXNzKCdmYWRlJyk7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuaW1hZ2VzTW9kYWwpLnJlcGxhY2VXaXRoKGV2ZW50LnByb2R1Y3RfaW1hZ2VzX21vZGFsKTtcblxuICAgIGNvbnN0IHByb2R1Y3RTZWxlY3QgPSBuZXcgUHJvZHVjdFNlbGVjdCgpO1xuICAgIHByb2R1Y3RTZWxlY3QuaW5pdCgpO1xuICB9KTtcbn0pO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHRpbWVvdXQgPSAzMDApIHtcbiAgbGV0IHRpbWVyO1xuXG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgZnVuYy5hcHBseSh0aGlzLCBhcmdzKTsgfSwgdGltZW91dCk7XG4gIH07XG59XG4iLCJpbXBvcnQgJCBmcm9tIFwianF1ZXJ5XCI7XG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tIFwicHJlc3Rhc2hvcFwiO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCIuL2NvbXBvbmVudHMvZGVib3VuY2VcIjtcblxucHJlc3Rhc2hvcC5jYXJ0ID0gcHJlc3Rhc2hvcC5jYXJ0IHx8IHt9O1xuXG5wcmVzdGFzaG9wLmNhcnQuYWN0aXZlX2lucHV0cyA9IG51bGw7XG5cbmNvbnN0IHNwaW5uZXJTZWxlY3RvciA9ICdpbnB1dFtuYW1lPVwicHJvZHVjdC1xdWFudGl0eS1zcGluXCJdJztcbmxldCBoYXNFcnJvciA9IGZhbHNlO1xubGV0IGlzVXBkYXRlT3BlcmF0aW9uID0gZmFsc2U7XG5sZXQgZXJyb3JNc2cgPSBcIlwiO1xuXG5jb25zdCBDaGVja1VwZGF0ZVF1YW50aXR5T3BlcmF0aW9ucyA9IHtcbiAgc3dpdGNoRXJyb3JTdGF0OiAoKSA9PiB7XG4gICAgLyoqXG4gICAgICogaWYgZXJyb3JNc2cgaXMgbm90IGVtcHR5IG9yIGlmIG5vdGlmaWNhdGlvbnMgYXJlIHNob3duLCB3ZSBoYXZlIGVycm9yIHRvIGRpc3BsYXlcbiAgICAgKiBpZiBoYXNFcnJvciBpcyB0cnVlLCBxdWFudGl0eSB3YXMgbm90IHVwZGF0ZWQgOiB3ZSBkb24ndCBkaXNhYmxlIGNoZWNrb3V0IGJ1dHRvblxuICAgICAqL1xuICAgIGNvbnN0ICRjaGVja291dEJ0biA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jaGVja291dC5idG4pO1xuXG4gICAgaWYgKFxuICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm5vdGlmaWNhdGlvbnMuZGFuZ2VyQWxlcnQpLmxlbmd0aCB8fFxuICAgICAgKGVycm9yTXNnICE9PSBcIlwiICYmICFoYXNFcnJvcilcbiAgICApIHtcbiAgICAgICRjaGVja291dEJ0bi5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgIH1cblxuICAgIGlmIChlcnJvck1zZyAhPT0gXCJcIikge1xuICAgICAgY29uc3Qgc3RyRXJyb3IgPSBgXG4gICAgICAgIDxhcnRpY2xlIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCIgZGF0YS1hbGVydD1cImRhbmdlclwiPlxuICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgIDxsaT4ke2Vycm9yTXNnfTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9hcnRpY2xlPlxuICAgICAgYDtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5ub3RpZmljYXRpb25zLmNvbnRhaW5lcikuaHRtbChzdHJFcnJvcik7XG4gICAgICBlcnJvck1zZyA9IFwiXCI7XG4gICAgICBpc1VwZGF0ZU9wZXJhdGlvbiA9IGZhbHNlO1xuICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgIC8vIGlmIGhhc0Vycm9yIGlzIHRydWUsIHF1YW50aXR5IHdhcyBub3QgdXBkYXRlZCA6IGFsbG93IGNoZWNrb3V0XG4gICAgICAgICRjaGVja291dEJ0bi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWhhc0Vycm9yICYmIGlzVXBkYXRlT3BlcmF0aW9uKSB7XG4gICAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgaXNVcGRhdGVPcGVyYXRpb24gPSBmYWxzZTtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5ub3RpZmljYXRpb25zLmNvbnRhaW5lcikuaHRtbChcIlwiKTtcbiAgICAgICRjaGVja291dEJ0bi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgfSxcbiAgY2hlY2tVcGRhdGVPcGVyYXRpb246IChyZXNwKSA9PiB7XG4gICAgLyoqXG4gICAgICogcmVzcC5oYXNFcnJvciBjYW4gYmUgbm90IGRlZmluZWQgYnV0IHJlc3AuZXJyb3JzIG5vdCBlbXB0eTogcXVhbnRpdHkgaXMgdXBkYXRlZCBidXQgb3JkZXIgY2Fubm90IGJlIHBsYWNlZFxuICAgICAqIHdoZW4gcmVzcC5oYXNFcnJvcj10cnVlLCBxdWFudGl0eSBpcyBub3QgdXBkYXRlZFxuICAgICAqL1xuICAgIGNvbnN0IHsgaGFzRXJyb3I6IGhhc0Vycm9yT2NjdXJyZWQsIGVycm9yczogZXJyb3JEYXRhIH0gPSByZXNwO1xuICAgIGhhc0Vycm9yID0gaGFzRXJyb3JPY2N1cnJlZCA/PyBmYWxzZTtcbiAgICBjb25zdCBlcnJvcnMgPSBlcnJvckRhdGEgPz8gXCJcIjtcblxuICAgIC8vIDEuNy4yLnggcmV0dXJucyBlcnJvcnMgYXMgc3RyaW5nLCAxLjcuMy54IHJldHVybnMgYXJyYXlcbiAgICBpZiAoZXJyb3JzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGVycm9yTXNnID0gZXJyb3JzLmpvaW4oXCIgXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvck1zZyA9IGVycm9ycztcbiAgICB9XG5cbiAgICBpc1VwZGF0ZU9wZXJhdGlvbiA9IHRydWU7XG4gIH0sXG59O1xuXG4vKipcbiAqIEF0dGFjaCBCb290c3RyYXAgVG91Y2hTcGluIGV2ZW50IGhhbmRsZXJzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNwaW4oKSB7XG4gICQuZWFjaCgkKHNwaW5uZXJTZWxlY3RvciksIChpbmRleCwgc3Bpbm5lcikgPT4ge1xuICAgICQoc3Bpbm5lcikuVG91Y2hTcGluKHtcbiAgICAgIG1pbjogcGFyc2VJbnQoJChzcGlubmVyKS5hdHRyKFwibWluXCIpLCAxMCksXG4gICAgICBtYXg6IDEwMDAwMDAsXG4gICAgfSk7XG4gIH0pO1xuXG4gICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy50b3VjaHNwaW4pLm9mZihcInRvdWNoc3RhcnQudG91Y2hzcGluXCIpO1xuXG4gIENoZWNrVXBkYXRlUXVhbnRpdHlPcGVyYXRpb25zLnN3aXRjaEVycm9yU3RhdCgpO1xufVxuXG5jb25zdCBwcmV2ZW50Q3VzdG9tTW9kYWxPcGVuID0gKGV2ZW50KSA9PiB7XG4gIGlmICh3aW5kb3cuc2hvdWxkUHJldmVudE1vZGFsKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiQoZnVuY3Rpb24gKCkge1xuICBjb25zdCBwcm9kdWN0TGluZUluQ2FydFNlbGVjdG9yID1cbiAgICBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQucHJvZHVjdExpbmVRdHk7XG4gIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgcHJlc3Rhc2hvcC5vbihcInVwZGF0ZWRDYXJ0XCIsICgpID0+IHtcbiAgICB3aW5kb3cuc2hvdWxkUHJldmVudE1vZGFsID0gZmFsc2U7XG5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5jdXN0b21pemF0aW9uTW9kYWwpLm9uKFxuICAgICAgXCJzaG93LmJzLm1vZGFsXCIsXG4gICAgICAobW9kYWxFdmVudCkgPT4ge1xuICAgICAgICBwcmV2ZW50Q3VzdG9tTW9kYWxPcGVuKG1vZGFsRXZlbnQpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY3JlYXRlU3BpbigpO1xuICB9KTtcblxuICBjcmVhdGVTcGluKCk7XG5cbiAgY29uc3QgJGJvZHkgPSAkKFwiYm9keVwiKTtcblxuICBmdW5jdGlvbiBpc1RvdWNoU3BpbihuYW1lc3BhY2UpIHtcbiAgICByZXR1cm4gbmFtZXNwYWNlID09PSBcIm9uLnN0YXJ0dXBzcGluXCIgfHwgbmFtZXNwYWNlID09PSBcIm9uLnN0YXJ0ZG93bnNwaW5cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEluY3JlYXNlUHJvZHVjdFF1YW50aXR5KG5hbWVzcGFjZSkge1xuICAgIHJldHVybiBuYW1lc3BhY2UgPT09IFwib24uc3RhcnR1cHNwaW5cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRDYXJ0TGluZVByb2R1Y3RRdWFudGl0eUlucHV0KCR0YXJnZXQpIHtcbiAgICBjb25zdCAkaW5wdXQgPSAkdGFyZ2V0XG4gICAgICAucGFyZW50cyhwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQudG91Y2hzcGluKVxuICAgICAgLmZpbmQocHJvZHVjdExpbmVJbkNhcnRTZWxlY3Rvcik7XG5cbiAgICBpZiAoJGlucHV0LmlzKFwiOmZvY3VzXCIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gJGlucHV0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FtZWxpemUoc3ViamVjdCkge1xuICAgIGNvbnN0IGFjdGlvblR5cGVQYXJ0cyA9IHN1YmplY3Quc3BsaXQoXCItXCIpO1xuICAgIGxldCBpO1xuICAgIGxldCBwYXJ0O1xuICAgIGxldCBjYW1lbGl6ZWRTdWJqZWN0ID0gXCJcIjtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBhY3Rpb25UeXBlUGFydHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHBhcnQgPSBhY3Rpb25UeXBlUGFydHNbaV07XG5cbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIHBhcnQgPSBwYXJ0LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcGFydC5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG5cbiAgICAgIGNhbWVsaXplZFN1YmplY3QgKz0gcGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FtZWxpemVkU3ViamVjdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQ2FydEFjdGlvbigkdGFyZ2V0LCBuYW1lc3BhY2UpIHtcbiAgICBpZiAoIWlzVG91Y2hTcGluKG5hbWVzcGFjZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybDogJHRhcmdldC5hdHRyKFwiaHJlZlwiKSxcbiAgICAgICAgdHlwZTogY2FtZWxpemUoJHRhcmdldC5kYXRhKFwibGluay1hY3Rpb25cIikpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCAkaW5wdXQgPSBmaW5kQ2FydExpbmVQcm9kdWN0UXVhbnRpdHlJbnB1dCgkdGFyZ2V0KTtcblxuICAgIGlmICghJGlucHV0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGNhcnRBY3Rpb24gPSB7fTtcblxuICAgIGlmIChzaG91bGRJbmNyZWFzZVByb2R1Y3RRdWFudGl0eShuYW1lc3BhY2UpKSB7XG4gICAgICBjYXJ0QWN0aW9uID0ge1xuICAgICAgICB1cmw6ICRpbnB1dC5kYXRhKFwidXAtdXJsXCIpLFxuICAgICAgICB0eXBlOiBcImluY3JlYXNlUHJvZHVjdFF1YW50aXR5XCIsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJ0QWN0aW9uID0ge1xuICAgICAgICB1cmw6ICRpbnB1dC5kYXRhKFwiZG93bi11cmxcIiksXG4gICAgICAgIHR5cGU6IFwiZGVjcmVhc2VQcm9kdWN0UXVhbnRpdHlcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhcnRBY3Rpb247XG4gIH1cblxuICBjb25zdCBhYm9ydFByZXZpb3VzUmVxdWVzdHMgPSAoKSA9PiB7XG4gICAgbGV0IHByb21pc2U7XG4gICAgd2hpbGUgKHByb21pc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlcy5wb3AoKTtcbiAgICAgIHByb21pc2UuYWJvcnQoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0VG91Y2hTcGluSW5wdXQgPSAoJGJ1dHRvbikgPT5cbiAgICAkKCRidXR0b24ucGFyZW50cyhwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQudG91Y2hzcGluKS5maW5kKFwiaW5wdXRcIikpO1xuXG4gICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmN1c3RvbWl6YXRpb25Nb2RhbCkub24oXG4gICAgXCJzaG93LmJzLm1vZGFsXCIsXG4gICAgKG1vZGFsRXZlbnQpID0+IHtcbiAgICAgIHByZXZlbnRDdXN0b21Nb2RhbE9wZW4obW9kYWxFdmVudCk7XG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBoYW5kbGVDYXJ0QWN0aW9uID0gKGV2ZW50KSA9PiB7XG4gICAgYWJvcnRQcmV2aW91c1JlcXVlc3RzKCk7XG4gICAgd2luZG93LnNob3VsZFByZXZlbnRNb2RhbCA9IHRydWU7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIGNvbnN0IHsgZGF0YXNldCB9ID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICBjb25zdCBjYXJ0QWN0aW9uID0gcGFyc2VDYXJ0QWN0aW9uKCR0YXJnZXQsIGV2ZW50Lm5hbWVzcGFjZSk7XG4gICAgY29uc3QgcmVxdWVzdERhdGEgPSB7XG4gICAgICBhamF4OiBcIjFcIixcbiAgICAgIGFjdGlvbjogXCJ1cGRhdGVcIixcbiAgICB9O1xuXG4gICAgaWYgKCFjYXJ0QWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogY2FydEFjdGlvbi51cmwsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgZGF0YTogcmVxdWVzdERhdGEsXG4gICAgICBkYXRhVHlwZTogXCJqc29uXCIsXG4gICAgICBiZWZvcmVTZW5kKGpxWEhSKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goanFYSFIpO1xuICAgICAgfSxcbiAgICB9KVxuICAgICAgLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgY29uc3QgJHF1YW50aXR5SW5wdXQgPSBnZXRUb3VjaFNwaW5JbnB1dCgkdGFyZ2V0KTtcbiAgICAgICAgQ2hlY2tVcGRhdGVRdWFudGl0eU9wZXJhdGlvbnMuY2hlY2tVcGRhdGVPcGVyYXRpb24ocmVzcCk7XG4gICAgICAgICRxdWFudGl0eUlucHV0LnZhbChyZXNwLnF1YW50aXR5KTtcblxuICAgICAgICAvLyBSZWZyZXNoIGNhcnQgcHJldmlld1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoXCJ1cGRhdGVDYXJ0XCIsIHtcbiAgICAgICAgICByZWFzb246IGRhdGFzZXQsXG4gICAgICAgICAgcmVzcCxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmZhaWwoKHJlc3ApID0+IHtcbiAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KFwiaGFuZGxlRXJyb3JcIiwge1xuICAgICAgICAgIGV2ZW50VHlwZTogXCJ1cGRhdGVQcm9kdWN0SW5DYXJ0XCIsXG4gICAgICAgICAgcmVzcCxcbiAgICAgICAgICBjYXJ0QWN0aW9uOiBjYXJ0QWN0aW9uLnR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH07XG5cbiAgJGJvZHkub24oXCJjbGlja1wiLCBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQuYWN0aW9ucywgaGFuZGxlQ2FydEFjdGlvbik7XG5cbiAgZnVuY3Rpb24gc2VuZFVwZGF0ZVF1YW50aXR5SW5DYXJ0UmVxdWVzdChcbiAgICB1cGRhdGVRdWFudGl0eUluQ2FydFVybCxcbiAgICByZXF1ZXN0RGF0YSxcbiAgICAkdGFyZ2V0LFxuICApIHtcbiAgICBhYm9ydFByZXZpb3VzUmVxdWVzdHMoKTtcbiAgICB3aW5kb3cuc2hvdWxkUHJldmVudE1vZGFsID0gdHJ1ZTtcblxuICAgIHJldHVybiAkLmFqYXgoe1xuICAgICAgdXJsOiB1cGRhdGVRdWFudGl0eUluQ2FydFVybCxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBkYXRhOiByZXF1ZXN0RGF0YSxcbiAgICAgIGRhdGFUeXBlOiBcImpzb25cIixcbiAgICAgIGJlZm9yZVNlbmQoanFYSFIpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChqcVhIUik7XG4gICAgICB9LFxuICAgIH0pXG4gICAgICAudGhlbigocmVzcCkgPT4ge1xuICAgICAgICBDaGVja1VwZGF0ZVF1YW50aXR5T3BlcmF0aW9ucy5jaGVja1VwZGF0ZU9wZXJhdGlvbihyZXNwKTtcblxuICAgICAgICAkdGFyZ2V0LnZhbChyZXNwLnF1YW50aXR5KTtcbiAgICAgICAgY29uc3QgZGF0YXNldCA9ICR0YXJnZXQgJiYgJHRhcmdldC5kYXRhc2V0ID8gJHRhcmdldC5kYXRhc2V0IDogcmVzcDtcblxuICAgICAgICAvLyBSZWZyZXNoIGNhcnQgcHJldmlld1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoXCJ1cGRhdGVDYXJ0XCIsIHtcbiAgICAgICAgICByZWFzb246IGRhdGFzZXQsXG4gICAgICAgICAgcmVzcCxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmZhaWwoKHJlc3ApID0+IHtcbiAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KFwiaGFuZGxlRXJyb3JcIiwge1xuICAgICAgICAgIGV2ZW50VHlwZTogXCJ1cGRhdGVQcm9kdWN0UXVhbnRpdHlJbkNhcnRcIixcbiAgICAgICAgICByZXNwLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UXVhbnRpdHlDaGFuZ2VUeXBlKCRxdWFudGl0eSkge1xuICAgIHJldHVybiAkcXVhbnRpdHkgPiAwID8gXCJ1cFwiIDogXCJkb3duXCI7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXF1ZXN0RGF0YShxdWFudGl0eSkge1xuICAgIHJldHVybiB7XG4gICAgICBhamF4OiBcIjFcIixcbiAgICAgIHF0eTogTWF0aC5hYnMocXVhbnRpdHkpLFxuICAgICAgYWN0aW9uOiBcInVwZGF0ZVwiLFxuICAgICAgb3A6IGdldFF1YW50aXR5Q2hhbmdlVHlwZShxdWFudGl0eSksXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVByb2R1Y3RRdWFudGl0eUluQ2FydChldmVudCkge1xuICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIGNvbnN0IHVwZGF0ZVF1YW50aXR5SW5DYXJ0VXJsID0gJHRhcmdldC5kYXRhKFwidXBkYXRlLXVybFwiKTtcbiAgICBjb25zdCBiYXNlVmFsdWUgPSAkdGFyZ2V0LmF0dHIoXCJ2YWx1ZVwiKTtcblxuICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhIHZhbGlkIHByb2R1Y3QgcXVhbnRpdHkgaW4gY2FydFxuICAgIGNvbnN0IHRhcmdldFZhbHVlID0gJHRhcmdldC52YWwoKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIGlmIChcbiAgICAgIHRhcmdldFZhbHVlICE9IHBhcnNlSW50KHRhcmdldFZhbHVlLCAxMCkgfHxcbiAgICAgIHRhcmdldFZhbHVlIDwgMCB8fFxuICAgICAgaXNOYU4odGFyZ2V0VmFsdWUpXG4gICAgKSB7XG4gICAgICB3aW5kb3cuc2hvdWxkUHJldmVudE1vZGFsID0gZmFsc2U7XG4gICAgICAkdGFyZ2V0LnZhbChiYXNlVmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgLy8gVGhlcmUgc2hvdWxkIGJlIGEgbmV3IHByb2R1Y3QgcXVhbnRpdHkgaW4gY2FydFxuICAgIGNvbnN0IHF0eSA9IHRhcmdldFZhbHVlIC0gYmFzZVZhbHVlO1xuXG4gICAgaWYgKHF0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXRWYWx1ZSA9PT0gXCIwXCIpIHtcbiAgICAgICR0YXJnZXRcbiAgICAgICAgLmNsb3Nlc3QoXCIucHJvZHVjdC1saW5lLWFjdGlvbnNcIilcbiAgICAgICAgLmZpbmQoJ1tkYXRhLWxpbmstYWN0aW9uPVwiZGVsZXRlLWZyb20tY2FydFwiXScpXG4gICAgICAgIC5jbGljaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkdGFyZ2V0LmF0dHIoXCJ2YWx1ZVwiLCB0YXJnZXRWYWx1ZSk7XG4gICAgICBzZW5kVXBkYXRlUXVhbnRpdHlJbkNhcnRSZXF1ZXN0KFxuICAgICAgICB1cGRhdGVRdWFudGl0eUluQ2FydFVybCxcbiAgICAgICAgZ2V0UmVxdWVzdERhdGEocXR5KSxcbiAgICAgICAgJHRhcmdldCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgJGJvZHkub24oXG4gICAgXCJ0b3VjaHNwaW4ub24uc3RvcHNwaW5cIixcbiAgICBzcGlubmVyU2VsZWN0b3IsXG4gICAgZGVib3VuY2UodXBkYXRlUHJvZHVjdFF1YW50aXR5SW5DYXJ0KSxcbiAgKTtcblxuICAkYm9keS5vbihcImZvY3Vzb3V0IGtleXVwXCIsIHByb2R1Y3RMaW5lSW5DYXJ0U2VsZWN0b3IsIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC50eXBlID09PSBcImtleXVwXCIpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICBpc1VwZGF0ZU9wZXJhdGlvbiA9IHRydWU7XG4gICAgICAgIHVwZGF0ZVByb2R1Y3RRdWFudGl0eUluQ2FydChldmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVXBkYXRlT3BlcmF0aW9uKSB7XG4gICAgICB1cGRhdGVQcm9kdWN0UXVhbnRpdHlJbkNhcnQoZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgY29uc3QgJHRpbWVvdXRFZmZlY3QgPSA0MDA7XG5cbiAgJGJvZHkub24oXG4gICAgXCJoaWRkZW4uYnMuY29sbGFwc2VcIixcbiAgICBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQucHJvbW9Db2RlLFxuICAgICgpID0+IHtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jYXJ0LmRpc3BsYXlQcm9tbykuc2hvdygkdGltZW91dEVmZmVjdCk7XG4gICAgfSxcbiAgKTtcblxuICAkYm9keS5vbihcImNsaWNrXCIsIHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5wcm9tb0NvZGVCdXR0b24sIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5wcm9tb0NvZGUpLmNvbGxhcHNlKFwidG9nZ2xlXCIpO1xuICB9KTtcblxuICAkYm9keS5vbihcImNsaWNrXCIsIHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5kaXNwbGF5UHJvbW8sIChldmVudCkgPT4ge1xuICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuaGlkZSgkdGltZW91dEVmZmVjdCk7XG4gIH0pO1xuXG4gICRib2R5Lm9uKFwiY2xpY2tcIiwgcHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jYXJ0LmRpc2NvdW50Q29kZSwgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCAkY29kZSA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgY29uc3QgJGRpc2NvdW50SW5wdXQgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5kaXNjb3VudE5hbWUpO1xuXG4gICAgJGRpc2NvdW50SW5wdXQudmFsKCRjb2RlLnRleHQoKSk7XG4gICAgLy8gU2hvdyBwcm9tbyBjb2RlIGZpZWxkXG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQucHJvbW9Db2RlKS5jb2xsYXBzZShcInNob3dcIik7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQuZGlzcGxheVByb21vKS5oaWRlKCR0aW1lb3V0RWZmZWN0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59KTtcblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBjb25zdCBlID0gJChcImJvZHlcIik7XG4gIGUub2ZmKFwic3VibWl0XCIsICdbZGF0YS1saW5rLWFjdGlvbj1cImFkZC12b3VjaGVyXCJdJyksXG4gICAgZS5vbihcInN1Ym1pdFwiLCAnW2RhdGEtbGluay1hY3Rpb249XCJhZGQtdm91Y2hlclwiXScsIChlKSA9PiB7XG4gICAgICBjb25zdCBwcm9tb1N1Ym1pdEJ0biA9ICQoXCIjcHJvbW8tY29kZS1mb3JtIGJ1dHRvblwiKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IG4gPSAkKGUuY3VycmVudFRhcmdldCksXG4gICAgICAgIG8gPSBuLmF0dHIoXCJhY3Rpb25cIik7XG4gICAgICAwID09PSBuLmZpbmQoXCJbbmFtZT1hY3Rpb25dXCIpLmxlbmd0aCAmJlxuICAgICAgICBuLmFwcGVuZCgkKFwiPGlucHV0PlwiLCB7IHR5cGU6IFwiaGlkZGVuXCIsIG5hbWU6IFwiYWpheFwiLCB2YWx1ZTogMSB9KSksXG4gICAgICAgIDAgPT09IG4uZmluZChcIltuYW1lPWFjdGlvbl1cIikubGVuZ3RoICYmXG4gICAgICAgICAgbi5hcHBlbmQoXG4gICAgICAgICAgICAkKFwiPGlucHV0PlwiLCB7IHR5cGU6IFwiaGlkZGVuXCIsIG5hbWU6IFwiYWN0aW9uXCIsIHZhbHVlOiBcInVwZGF0ZVwiIH0pLFxuICAgICAgICAgICksXG4gICAgICAgIHByb21vU3VibWl0QnRuLnRleHQoXCJDSEVDS0lOR1wiKTtcbiAgICAgIHByb21vU3VibWl0QnRuLnByb3AoXCJkaXNhYmxlXCIsIHRydWUpO1xuICAgICAgJC5wb3N0KG8sIG4uc2VyaWFsaXplKCksIG51bGwsIFwianNvblwiKVxuICAgICAgICAudGhlbigobikgPT4ge1xuICAgICAgICAgIG4uaGFzRXJyb3JcbiAgICAgICAgICAgID8gJChcIi5qcy1lcnJvclwiKS5zaG93KCkuZmluZChcIi5qcy1lcnJvci10ZXh0XCIpLnRleHQobi5lcnJvcnNbMF0pXG4gICAgICAgICAgICA6IHByZXN0YXNob3AuZW1pdChcInVwZGF0ZUNhcnRcIiwge1xuICAgICAgICAgICAgICAgIHJlYXNvbjogZS50YXJnZXQuZGF0YXNldCxcbiAgICAgICAgICAgICAgICByZXNwOiBuLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICBwcm9tb1N1Ym1pdEJ0bi50ZXh0KFwiQUREXCIpO1xuICAgICAgICAgIHByb21vU3VibWl0QnRuLnByb3AoXCJkaXNhYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZhaWwoKGUpID0+IHtcbiAgICAgICAgICBwcmVzdGFzaG9wLmVtaXQoXCJoYW5kbGVFcnJvclwiLCB7XG4gICAgICAgICAgICBldmVudFR5cGU6IFwidXBkYXRlQ2FydFwiLFxuICAgICAgICAgICAgcmVzcDogZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwcm9tb1N1Ym1pdEJ0bi50ZXh0KFwiQUREXCIpO1xuICAgICAgICAgIHByb21vU3VibWl0QnRuLnByb3AoXCJkaXNhYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyb3BEb3duIHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuZWwub24oJ3Nob3cuYnMuZHJvcGRvd24nLCAoZSwgZWwpID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICAkKGAjJHtlbH1gKS5maW5kKCcuZHJvcGRvd24tbWVudScpLmZpcnN0KCkuc3RvcCh0cnVlLCB0cnVlKVxuICAgICAgICAgIC5zbGlkZURvd24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoZS50YXJnZXQpLmZpbmQoJy5kcm9wZG93bi1tZW51JykuZmlyc3QoKS5zdG9wKHRydWUsIHRydWUpXG4gICAgICAgICAgLnNsaWRlRG93bigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5vbignaGlkZS5icy5kcm9wZG93bicsIChlLCBlbCkgPT4ge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgICQoYCMke2VsfWApLmZpbmQoJy5kcm9wZG93bi1tZW51JykuZmlyc3QoKS5zdG9wKHRydWUsIHRydWUpXG4gICAgICAgICAgLnNsaWRlVXAoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoZS50YXJnZXQpLmZpbmQoJy5kcm9wZG93bi1tZW51JykuZmlyc3QoKS5zdG9wKHRydWUsIHRydWUpXG4gICAgICAgICAgLnNsaWRlVXAoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZWwuZmluZCgnc2VsZWN0LmxpbmsnKS5lYWNoKChpZHgsIGVsKSA9PiB7XG4gICAgICAkKGVsKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybSB7XG4gIGluaXQoKSB7XG4gICAgdGhpcy5wYXJlbnRGb2N1cygpO1xuICAgIHRoaXMudG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KCk7XG4gIH1cblxuICBwYXJlbnRGb2N1cygpIHtcbiAgICAkKCcuanMtY2hpbGQtZm9jdXMnKS5vbignZm9jdXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5qcy1wYXJlbnQtZm9jdXMnKS5hZGRDbGFzcygnZm9jdXMnKTtcbiAgICB9KTtcbiAgICAkKCcuanMtY2hpbGQtZm9jdXMnKS5vbignZm9jdXNvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5qcy1wYXJlbnQtZm9jdXMnKS5yZW1vdmVDbGFzcygnZm9jdXMnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eSgpIHtcbiAgICAkKCdidXR0b25bZGF0YS1hY3Rpb249XCJzaG93LXBhc3N3b3JkXCJdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZWxtID0gJCh0aGlzKS5jbG9zZXN0KCcuaW5wdXQtZ3JvdXAnKS5jaGlsZHJlbignaW5wdXQuanMtdmlzaWJsZS1wYXNzd29yZCcpO1xuXG4gICAgICBpZiAoZWxtLmF0dHIoJ3R5cGUnKSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICBlbG0uYXR0cigndHlwZScsICd0ZXh0Jyk7XG4gICAgICAgICQodGhpcykudGV4dCgkKHRoaXMpLmRhdGEoJ3RleHRIaWRlJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxtLmF0dHIoJ3R5cGUnLCAncGFzc3dvcmQnKTtcbiAgICAgICAgJCh0aGlzKS50ZXh0KCQodGhpcykuZGF0YSgndGV4dFNob3cnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3csIGV4cG9ydHMsIGRlZmluZSAqL1xuXG4hZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnXG5cbiAgICB2YXIgcmUgPSB7XG4gICAgICAgIG5vdF9zdHJpbmc6IC9bXnNdLyxcbiAgICAgICAgbm90X2Jvb2w6IC9bXnRdLyxcbiAgICAgICAgbm90X3R5cGU6IC9bXlRdLyxcbiAgICAgICAgbm90X3ByaW1pdGl2ZTogL1tedl0vLFxuICAgICAgICBudW1iZXI6IC9bZGllZmddLyxcbiAgICAgICAgbnVtZXJpY19hcmc6IC9bYmNkaWVmZ3V4WF0vLFxuICAgICAgICBqc29uOiAvW2pdLyxcbiAgICAgICAgbm90X2pzb246IC9bXmpdLyxcbiAgICAgICAgdGV4dDogL15bXlxceDI1XSsvLFxuICAgICAgICBtb2R1bG86IC9eXFx4MjV7Mn0vLFxuICAgICAgICBwbGFjZWhvbGRlcjogL15cXHgyNSg/OihbMS05XVxcZCopXFwkfFxcKChbXildKylcXCkpPyhcXCspPygwfCdbXiRdKT8oLSk/KFxcZCspPyg/OlxcLihcXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLFxuICAgICAgICBrZXk6IC9eKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGtleV9hY2Nlc3M6IC9eXFwuKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGluZGV4X2FjY2VzczogL15cXFsoXFxkKylcXF0vLFxuICAgICAgICBzaWduOiAvXlsrLV0vXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ByaW50ZihrZXkpIHtcbiAgICAgICAgLy8gYGFyZ3VtZW50c2AgaXMgbm90IGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGZpbmUgZm9yIHRoaXMgY2FsbFxuICAgICAgICByZXR1cm4gc3ByaW50Zl9mb3JtYXQoc3ByaW50Zl9wYXJzZShrZXkpLCBhcmd1bWVudHMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdnNwcmludGYoZm10LCBhcmd2KSB7XG4gICAgICAgIHJldHVybiBzcHJpbnRmLmFwcGx5KG51bGwsIFtmbXRdLmNvbmNhdChhcmd2IHx8IFtdKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmX2Zvcm1hdChwYXJzZV90cmVlLCBhcmd2KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSAxLCB0cmVlX2xlbmd0aCA9IHBhcnNlX3RyZWUubGVuZ3RoLCBhcmcsIG91dHB1dCA9ICcnLCBpLCBrLCBwaCwgcGFkLCBwYWRfY2hhcmFjdGVyLCBwYWRfbGVuZ3RoLCBpc19wb3NpdGl2ZSwgc2lnblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJlZV9sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZV90cmVlW2ldID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBwYXJzZV90cmVlW2ldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGFyc2VfdHJlZVtpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBwaCA9IHBhcnNlX3RyZWVbaV0gLy8gY29udmVuaWVuY2UgcHVycG9zZXMgb25seVxuICAgICAgICAgICAgICAgIGlmIChwaC5rZXlzKSB7IC8vIGtleXdvcmQgYXJndW1lbnRcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltjdXJzb3JdXG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwaC5rZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdbc3ByaW50Zl0gQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBcIiVzXCIgb2YgdW5kZWZpbmVkIHZhbHVlIFwiJXNcIicsIHBoLmtleXNba10sIHBoLmtleXNbay0xXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdbcGgua2V5c1trXV1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwaC5wYXJhbV9ubykgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChleHBsaWNpdClcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltwaC5wYXJhbV9ub11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIHBvc2l0aW9uYWwgYXJndW1lbnQgKGltcGxpY2l0KVxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcisrXVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5ub3RfdHlwZS50ZXN0KHBoLnR5cGUpICYmIHJlLm5vdF9wcmltaXRpdmUudGVzdChwaC50eXBlKSAmJiBhcmcgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5udW1lcmljX2FyZy50ZXN0KHBoLnR5cGUpICYmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyAmJiBpc05hTihhcmcpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNwcmludGYoJ1tzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlVCcsIGFyZykpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzX3Bvc2l0aXZlID0gYXJnID49IDBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBoLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKS50b1N0cmluZygyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2onOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCBwaC53aWR0aCA/IHBhcnNlSW50KHBoLndpZHRoKSA6IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZykudG9FeHBvbmVudGlhbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0ZpeGVkKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gU3RyaW5nKE51bWJlcihhcmcudG9QcmVjaXNpb24ocGgucHJlY2lzaW9uKSkpIDogcGFyc2VGbG9hdChhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoOClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nKGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZyghIWFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKSA+Pj4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmUuanNvbi50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBhcmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS5udW1iZXIudGVzdChwaC50eXBlKSAmJiAoIWlzX3Bvc2l0aXZlIHx8IHBoLnNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gaXNfcG9zaXRpdmUgPyAnKycgOiAnLSdcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy50b1N0cmluZygpLnJlcGxhY2UocmUuc2lnbiwgJycpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcmFjdGVyID0gcGgucGFkX2NoYXIgPyBwaC5wYWRfY2hhciA9PT0gJzAnID8gJzAnIDogcGgucGFkX2NoYXIuY2hhckF0KDEpIDogJyAnXG4gICAgICAgICAgICAgICAgICAgIHBhZF9sZW5ndGggPSBwaC53aWR0aCAtIChzaWduICsgYXJnKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcGFkID0gcGgud2lkdGggPyAocGFkX2xlbmd0aCA+IDAgPyBwYWRfY2hhcmFjdGVyLnJlcGVhdChwYWRfbGVuZ3RoKSA6ICcnKSA6ICcnXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBwaC5hbGlnbiA/IHNpZ24gKyBhcmcgKyBwYWQgOiAocGFkX2NoYXJhY3RlciA9PT0gJzAnID8gc2lnbiArIHBhZCArIGFyZyA6IHBhZCArIHNpZ24gKyBhcmcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICB2YXIgc3ByaW50Zl9jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICAgIGZ1bmN0aW9uIHNwcmludGZfcGFyc2UoZm10KSB7XG4gICAgICAgIGlmIChzcHJpbnRmX2NhY2hlW2ZtdF0pIHtcbiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmX2NhY2hlW2ZtdF1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZm10ID0gZm10LCBtYXRjaCwgcGFyc2VfdHJlZSA9IFtdLCBhcmdfbmFtZXMgPSAwXG4gICAgICAgIHdoaWxlIChfZm10KSB7XG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gcmUudGV4dC5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaChtYXRjaFswXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLm1vZHVsby5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaCgnJScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSByZS5wbGFjZWhvbGRlci5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMVxuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRfbGlzdCA9IFtdLCByZXBsYWNlbWVudF9maWVsZCA9IG1hdGNoWzJdLCBmaWVsZF9tYXRjaCA9IFtdXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXkuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlcGxhY2VtZW50X2ZpZWxkID0gcmVwbGFjZW1lbnRfZmllbGQuc3Vic3RyaW5nKGZpZWxkX21hdGNoWzBdLmxlbmd0aCkpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXlfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmluZGV4X2FjY2Vzcy5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPSBmaWVsZF9saXN0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJnX25hbWVzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9ubzogICAgbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduOiAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcjogICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246ICAgbWF0Y2hbN10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAgbWF0Y2hbOF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXInKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZtdCA9IF9mbXQuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3ByaW50Zl9jYWNoZVtmbXRdID0gcGFyc2VfdHJlZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGV4cG9ydCB0byBlaXRoZXIgYnJvd3NlciBvciBub2RlLmpzXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHNbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgZXhwb3J0c1sndnNwcmludGYnXSA9IHZzcHJpbnRmXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3dbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgd2luZG93Wyd2c3ByaW50ZiddID0gdnNwcmludGZcblxuICAgICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICAgICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgJ3NwcmludGYnOiBzcHJpbnRmLFxuICAgICAgICAgICAgICAgICAgICAndnNwcmludGYnOiB2c3ByaW50ZlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBxdW90ZS1wcm9wcyAqL1xufSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cblxuaW1wb3J0IHtzcHJpbnRmfSBmcm9tICdzcHJpbnRmLWpzJztcblxuY29uc3Qge3Bhc3N3b3JkUG9saWN5OiBQYXNzd29yZFBvbGljeU1hcH0gPSBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzO1xuXG5jb25zdCBQQVNTV09SRF9QT0xJQ1lfRVJST1IgPSAnVGhlIHBhc3N3b3JkIHBvbGljeSBlbGVtZW50cyBhcmUgdW5kZWZpbmVkLic7XG5cbmNvbnN0IGdldFBhc3N3b3JkU3RyZW5ndGhGZWVkYmFjayA9IChcbiAgc3RyZW5ndGgsXG4pID0+IHtcbiAgc3dpdGNoIChzdHJlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiAnYmctZGFuZ2VyJyxcbiAgICAgIH07XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogJ2JnLWRhbmdlcicsXG4gICAgICB9O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sb3I6ICdiZy13YXJuaW5nJyxcbiAgICAgIH07XG5cbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogJ2JnLXN1Y2Nlc3MnLFxuICAgICAgfTtcblxuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiAnYmctc3VjY2VzcycsXG4gICAgICB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXNzd29yZCBzdHJlbmd0aCBpbmRpY2F0b3IuJyk7XG4gIH1cbn07XG5cbmNvbnN0IHdhdGNoUGFzc3dvcmQgPSBhc3luYyAoXG4gIGVsZW1lbnRJbnB1dCxcbiAgZmVlZGJhY2tDb250YWluZXIsXG4gIGhpbnRzLFxuKSA9PiB7XG4gIGNvbnN0IHtwcmVzdGFzaG9wfSA9IHdpbmRvdztcbiAgY29uc3QgcGFzc3dvcmRWYWx1ZSA9IGVsZW1lbnRJbnB1dC52YWx1ZTtcbiAgY29uc3QgZWxlbWVudEljb24gPSBmZWVkYmFja0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLnJlcXVpcmVtZW50U2NvcmVJY29uKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJlc3Rhc2hvcC5jaGVja1Bhc3N3b3JkU2NvcmUocGFzc3dvcmRWYWx1ZSk7XG4gIGNvbnN0IGZlZWRiYWNrID0gZ2V0UGFzc3dvcmRTdHJlbmd0aEZlZWRiYWNrKHJlc3VsdC5zY29yZSk7XG4gIGNvbnN0IHBhc3N3b3JkTGVuZ3RoID0gcGFzc3dvcmRWYWx1ZS5sZW5ndGg7XG4gIGNvbnN0IHBvcG92ZXJDb250ZW50ID0gW107XG5cbiAgJChlbGVtZW50SW5wdXQpLnBvcG92ZXIoJ2Rpc3Bvc2UnKTtcblxuICBmZWVkYmFja0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gcGFzc3dvcmRWYWx1ZSA9PT0gJycgPyAnbm9uZScgOiAnYmxvY2snO1xuXG4gIGlmIChyZXN1bHQuZmVlZGJhY2sud2FybmluZyAhPT0gJycpIHtcbiAgICBpZiAocmVzdWx0LmZlZWRiYWNrLndhcm5pbmcgaW4gaGludHMpIHtcbiAgICAgIHBvcG92ZXJDb250ZW50LnB1c2goaGludHNbcmVzdWx0LmZlZWRiYWNrLndhcm5pbmddKTtcbiAgICB9XG4gIH1cblxuICByZXN1bHQuZmVlZGJhY2suc3VnZ2VzdGlvbnMuZm9yRWFjaCgoc3VnZ2VzdGlvbikgPT4ge1xuICAgIGlmIChzdWdnZXN0aW9uIGluIGhpbnRzKSB7XG4gICAgICBwb3BvdmVyQ29udGVudC5wdXNoKGhpbnRzW3N1Z2dlc3Rpb25dKTtcbiAgICB9XG4gIH0pO1xuXG4gICQoZWxlbWVudElucHV0KS5wb3BvdmVyKHtcbiAgICBodG1sOiB0cnVlLFxuICAgIHBsYWNlbWVudDogJ3RvcCcsXG4gICAgY29udGVudDogcG9wb3ZlckNvbnRlbnQuam9pbignPGJyLz4nKSxcbiAgfSkucG9wb3Zlcignc2hvdycpO1xuXG4gIGNvbnN0IHBhc3N3b3JkTGVuZ3RoVmFsaWQgPSBwYXNzd29yZExlbmd0aCA+PSBwYXJzZUludChlbGVtZW50SW5wdXQuZGF0YXNldC5taW5sZW5ndGgsIDEwKVxuICAgICYmIHBhc3N3b3JkTGVuZ3RoIDw9IHBhcnNlSW50KGVsZW1lbnRJbnB1dC5kYXRhc2V0Lm1heGxlbmd0aCwgMTApO1xuICBjb25zdCBwYXNzd29yZFNjb3JlVmFsaWQgPSBwYXJzZUludChlbGVtZW50SW5wdXQuZGF0YXNldC5taW5zY29yZSwgMTApIDw9IHJlc3VsdC5zY29yZTtcblxuICBmZWVkYmFja0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLnJlcXVpcmVtZW50TGVuZ3RoSWNvbikuY2xhc3NMaXN0LnRvZ2dsZShcbiAgICAndGV4dC1zdWNjZXNzJyxcbiAgICBwYXNzd29yZExlbmd0aFZhbGlkLFxuICApO1xuXG4gIGVsZW1lbnRJY29uLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgJ3RleHQtc3VjY2VzcycsXG4gICAgcGFzc3dvcmRTY29yZVZhbGlkLFxuICApO1xuXG4gIC8vIENoYW5nZSBpbnB1dCBib3JkZXIgY29sb3IgZGVwZW5kaW5nIG9uIHRoZSB2YWxpZGl0eVxuICBlbGVtZW50SW5wdXRcbiAgICAuY2xhc3NMaXN0LnJlbW92ZSgnYm9yZGVyLXN1Y2Nlc3MnLCAnYm9yZGVyLWRhbmdlcicpO1xuICBlbGVtZW50SW5wdXRcbiAgICAuY2xhc3NMaXN0LmFkZChwYXNzd29yZFNjb3JlVmFsaWQgJiYgcGFzc3dvcmRMZW5ndGhWYWxpZCA/ICdib3JkZXItc3VjY2VzcycgOiAnYm9yZGVyLWRhbmdlcicpO1xuICBlbGVtZW50SW5wdXRcbiAgICAuY2xhc3NMaXN0LmFkZCgnZm9ybS1jb250cm9sJywgJ2JvcmRlcicpO1xuXG4gIGNvbnN0IHBlcmNlbnRhZ2UgPSAocmVzdWx0LnNjb3JlICogMjApICsgMjA7XG4gIGNvbnN0IHByb2dyZXNzQmFyID0gZmVlZGJhY2tDb250YWluZXIucXVlcnlTZWxlY3RvcihQYXNzd29yZFBvbGljeU1hcC5wcm9ncmVzc0Jhcik7XG5cbiAgLy8gaW5jcmVhc2UgYW5kIGRlY3JlYXNlIHByb2dyZXNzIGJhclxuICBpZiAocHJvZ3Jlc3NCYXIpIHtcbiAgICBwcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9IGAke3BlcmNlbnRhZ2V9JWA7XG4gICAgcHJvZ3Jlc3NCYXIuY2xhc3NMaXN0LnJlbW92ZSgnYmctc3VjY2VzcycsICdiZy1kYW5nZXInLCAnYmctd2FybmluZycpO1xuICAgIHByb2dyZXNzQmFyLmNsYXNzTGlzdC5hZGQoZmVlZGJhY2suY29sb3IpO1xuICB9XG59O1xuXG4vLyBOb3QgdGVzdGFibGUgYmVjYXVzZSBpdCBtYW5pcHVsYXRlcyBTVkcgZWxlbWVudHMsIHVuc3VwcG9ydGVkIGJ5IEpTRG9tXG5jb25zdCB1c2VQYXNzd29yZFBvbGljeSA9IChzZWxlY3RvcikgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgaW5wdXRDb2x1bW4gPSBlbGVtZW50Py5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLmlucHV0Q29sdW1uKTtcbiAgICBjb25zdCBlbGVtZW50SW5wdXQgPSBlbGVtZW50Py5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGZlZWRiYWNrVGVtcGxhdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLnRlbXBsYXRlKTtcbiAgICBsZXQgZmVlZGJhY2tDb250YWluZXI7XG5cbiAgICBpZiAoZmVlZGJhY2tUZW1wbGF0ZSAmJiBlbGVtZW50ICYmIGlucHV0Q29sdW1uICYmIGVsZW1lbnRJbnB1dCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IGZlZWRiYWNrVGVtcGxhdGUuaW5uZXJIVE1MO1xuICAgICAgaW5wdXRDb2x1bW4uYXBwZW5kKHRlbXBsYXRlRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0NvbnRhaW5lciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihQYXNzd29yZFBvbGljeU1hcC5jb250YWluZXIpO1xuXG4gICAgICBpZiAoZmVlZGJhY2tDb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgaGludEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLmhpbnQpO1xuXG4gICAgICAgIGlmIChoaW50RWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGhpbnRzID0gSlNPTi5wYXJzZShoaW50RWxlbWVudC5pbm5lckhUTUwpO1xuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICBjb25zdCBwYXNzd29yZFJlcXVpcmVtZW50c0xlbmd0aCA9IGZlZWRiYWNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoUGFzc3dvcmRQb2xpY3lNYXAucmVxdWlyZW1lbnRMZW5ndGgpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgY29uc3QgcGFzc3dvcmRSZXF1aXJlbWVudHNTY29yZSA9IGZlZWRiYWNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoUGFzc3dvcmRQb2xpY3lNYXAucmVxdWlyZW1lbnRTY29yZSk7XG4gICAgICAgICAgY29uc3QgcGFzc3dvcmRMZW5ndGhUZXh0ID0gcGFzc3dvcmRSZXF1aXJlbWVudHNMZW5ndGg/LnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKTtcbiAgICAgICAgICBjb25zdCBwYXNzd29yZFJlcXVpcmVtZW50c1RleHQgPSBwYXNzd29yZFJlcXVpcmVtZW50c1Njb3JlPy5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XG5cbiAgICAgICAgICBpZiAocGFzc3dvcmRMZW5ndGhUZXh0ICYmIHBhc3N3b3JkUmVxdWlyZW1lbnRzTGVuZ3RoICYmIHBhc3N3b3JkUmVxdWlyZW1lbnRzTGVuZ3RoLmRhdGFzZXQudHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHBhc3N3b3JkTGVuZ3RoVGV4dC5pbm5lclRleHQgPSBzcHJpbnRmKFxuICAgICAgICAgICAgICBwYXNzd29yZFJlcXVpcmVtZW50c0xlbmd0aC5kYXRhc2V0LnRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgICBlbGVtZW50SW5wdXQuZGF0YXNldC5taW5sZW5ndGgsXG4gICAgICAgICAgICAgIGVsZW1lbnRJbnB1dC5kYXRhc2V0Lm1heGxlbmd0aCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhc3N3b3JkUmVxdWlyZW1lbnRzVGV4dCAmJiBwYXNzd29yZFJlcXVpcmVtZW50c1Njb3JlICYmIHBhc3N3b3JkUmVxdWlyZW1lbnRzU2NvcmUuZGF0YXNldC50cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgcGFzc3dvcmRSZXF1aXJlbWVudHNUZXh0LmlubmVyVGV4dCA9IHNwcmludGYoXG4gICAgICAgICAgICAgIHBhc3N3b3JkUmVxdWlyZW1lbnRzU2NvcmUuZGF0YXNldC50cmFuc2xhdGlvbixcbiAgICAgICAgICAgICAgaGludHNbZWxlbWVudElucHV0LmRhdGFzZXQubWluc2NvcmVdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgIGVsZW1lbnRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsICgpID0+IHdhdGNoUGFzc3dvcmQoZWxlbWVudElucHV0LCBmZWVkYmFja0NvbnRhaW5lciwgaGludHMpKTtcbiAgICAgICAgICBlbGVtZW50SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgICQoZWxlbWVudElucHV0KS5wb3BvdmVyKCdkaXNwb3NlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiBuZXcgRXJyb3IoUEFTU1dPUkRfUE9MSUNZX0VSUk9SKSxcbiAgICB9O1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVBhc3N3b3JkUG9saWN5O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5pbXBvcnQgRHJvcERvd24gZnJvbSAnLi9kcm9wLWRvd24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb3BNZW51IGV4dGVuZHMgRHJvcERvd24ge1xuICBpbml0KCkge1xuICAgIGxldCBlbG10Q2xhc3M7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5lbC5maW5kKCdsaScpLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCAoZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZWwucGFyZW50KCkuaGFzQ2xhc3MoJ21vYmlsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXRDbGFzcyA9ICQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCdjbGFzcycpO1xuXG4gICAgICBpZiAoZWxtdENsYXNzICE9PSBjdXJyZW50VGFyZ2V0Q2xhc3MpIHtcbiAgICAgICAgY29uc3QgY2xhc3Nlc1NlbGVjdGVkID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gICAgICAgICAgLmNhbGwoZS5jdXJyZW50VGFyZ2V0LmNsYXNzTGlzdClcbiAgICAgICAgICAubWFwKChlbGVtKSA9PiAodHlwZW9mIGVsZW0gPT09ICdzdHJpbmcnID8gYC4ke2VsZW19YCA6IGZhbHNlKSk7XG5cbiAgICAgICAgZWxtdENsYXNzID0gY2xhc3Nlc1NlbGVjdGVkLmpvaW4oJycpO1xuXG4gICAgICAgIGlmIChlbG10Q2xhc3MgJiYgJChlLnRhcmdldCkuZGF0YSgnZGVwdGgnKSA9PT0gMCkge1xuICAgICAgICAgICQoYCR7ZWxtdENsYXNzfSAuanMtc3ViLW1lbnVgKS5jc3Moe1xuICAgICAgICAgICAgdG9wOiAkKGAke2VsbXRDbGFzc31gKS5oZWlnaHQoKSArICQoYCR7ZWxtdENsYXNzfWApLnBvc2l0aW9uKCkudG9wLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgJCgnI21lbnUtaWNvbicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICQoJyNtb2JpbGVfdG9wX21lbnVfd3JhcHBlcicpLnRvZ2dsZSgpO1xuICAgICAgc2VsZi50b2dnbGVNb2JpbGVNZW51KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAodGhpcy5lbC5wYXJlbnQoKS5oYXNDbGFzcygnbW9iaWxlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIHByZXN0YXNob3Aub24oJ3Jlc3BvbnNpdmUgdXBkYXRlJywgKCkgPT4ge1xuICAgICAgJCgnLmpzLXN1Yi1tZW51JykucmVtb3ZlQXR0cignc3R5bGUnKTtcbiAgICAgIHNlbGYudG9nZ2xlTW9iaWxlTWVudSgpO1xuICAgIH0pO1xuICAgIHN1cGVyLmluaXQoKTtcbiAgfVxuXG4gIHRvZ2dsZU1vYmlsZU1lbnUoKSB7XG4gICAgJCgnI2hlYWRlcicpLnRvZ2dsZUNsYXNzKCdpcy1vcGVuJyk7XG4gICAgaWYgKCQoJyNtb2JpbGVfdG9wX21lbnVfd3JhcHBlcicpLmlzKCc6dmlzaWJsZScpKSB7XG4gICAgICAkKCcjbm90aWZpY2F0aW9ucywgI3dyYXBwZXIsICNmb290ZXInKS5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJyNub3RpZmljYXRpb25zLCAjd3JhcHBlciwgI2Zvb3RlcicpLnNob3coKTtcbiAgICB9XG4gIH1cbn1cbiIsIlwiZnVuY3Rpb25cIiE9dHlwZW9mIE9iamVjdC5jcmVhdGUmJihPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oKXt9cmV0dXJuIG8ucHJvdG90eXBlPXQsbmV3IG99KSxmdW5jdGlvbih0LG8saSxzKXtcInVzZSBzdHJpY3RcIjt2YXIgbj17X3Bvc2l0aW9uQ2xhc3NlczpbXCJib3R0b20tbGVmdFwiLFwiYm90dG9tLXJpZ2h0XCIsXCJ0b3AtcmlnaHRcIixcInRvcC1sZWZ0XCIsXCJib3R0b20tY2VudGVyXCIsXCJ0b3AtY2VudGVyXCIsXCJtaWQtY2VudGVyXCJdLF9kZWZhdWx0SWNvbnM6W1wic3VjY2Vzc1wiLFwiZXJyb3JcIixcImluZm9cIixcIndhcm5pbmdcIl0saW5pdDpmdW5jdGlvbihvLGkpe3RoaXMucHJlcGFyZU9wdGlvbnMobyx0LnRvYXN0Lm9wdGlvbnMpLHRoaXMucHJvY2VzcygpfSxwcmVwYXJlT3B0aW9uczpmdW5jdGlvbihvLGkpe3ZhciBzPXt9O1wic3RyaW5nXCI9PXR5cGVvZiBvfHxvIGluc3RhbmNlb2YgQXJyYXk/cy50ZXh0PW86cz1vLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxpLHMpfSxwcm9jZXNzOmZ1bmN0aW9uKCl7dGhpcy5zZXR1cCgpLHRoaXMuYWRkVG9Eb20oKSx0aGlzLnBvc2l0aW9uKCksdGhpcy5iaW5kVG9hc3QoKSx0aGlzLmFuaW1hdGUoKX0sc2V0dXA6ZnVuY3Rpb24oKXt2YXIgbz1cIlwiO2lmKHRoaXMuX3RvYXN0RWw9dGhpcy5fdG9hc3RFbHx8dChcIjxkaXY+PC9kaXY+XCIse1wiY2xhc3NcIjpcImpxLXRvYXN0LXNpbmdsZVwifSksbys9JzxzcGFuIGNsYXNzPVwianEtdG9hc3QtbG9hZGVyXCI+PC9zcGFuPicsdGhpcy5vcHRpb25zLmFsbG93VG9hc3RDbG9zZSYmKG8rPSc8c3BhbiBjbGFzcz1cImNsb3NlLWpxLXRvYXN0LXNpbmdsZVwiPiZ0aW1lczs8L3NwYW4+JyksdGhpcy5vcHRpb25zLnRleHQgaW5zdGFuY2VvZiBBcnJheSl7dGhpcy5vcHRpb25zLmhlYWRpbmcmJihvKz0nPGgyIGNsYXNzPVwianEtdG9hc3QtaGVhZGluZ1wiPicrdGhpcy5vcHRpb25zLmhlYWRpbmcrXCI8L2gyPlwiKSxvKz0nPHVsIGNsYXNzPVwianEtdG9hc3QtdWxcIj4nO2Zvcih2YXIgaT0wO2k8dGhpcy5vcHRpb25zLnRleHQubGVuZ3RoO2krKylvKz0nPGxpIGNsYXNzPVwianEtdG9hc3QtbGlcIiBpZD1cImpxLXRvYXN0LWl0ZW0tJytpKydcIj4nK3RoaXMub3B0aW9ucy50ZXh0W2ldK1wiPC9saT5cIjtvKz1cIjwvdWw+XCJ9ZWxzZSB0aGlzLm9wdGlvbnMuaGVhZGluZyYmKG8rPSc8aDIgY2xhc3M9XCJqcS10b2FzdC1oZWFkaW5nXCI+Jyt0aGlzLm9wdGlvbnMuaGVhZGluZytcIjwvaDI+XCIpLG8rPXRoaXMub3B0aW9ucy50ZXh0O3RoaXMuX3RvYXN0RWwuaHRtbChvKSx0aGlzLm9wdGlvbnMuYmdDb2xvciE9PSExJiZ0aGlzLl90b2FzdEVsLmNzcyhcImJhY2tncm91bmQtY29sb3JcIix0aGlzLm9wdGlvbnMuYmdDb2xvciksdGhpcy5vcHRpb25zLnRleHRDb2xvciE9PSExJiZ0aGlzLl90b2FzdEVsLmNzcyhcImNvbG9yXCIsdGhpcy5vcHRpb25zLnRleHRDb2xvciksdGhpcy5vcHRpb25zLnRleHRBbGlnbiYmdGhpcy5fdG9hc3RFbC5jc3MoXCJ0ZXh0LWFsaWduXCIsdGhpcy5vcHRpb25zLnRleHRBbGlnbiksdGhpcy5vcHRpb25zLmljb24hPT0hMSYmKHRoaXMuX3RvYXN0RWwuYWRkQ2xhc3MoXCJqcS1oYXMtaWNvblwiKSwtMSE9PXQuaW5BcnJheSh0aGlzLm9wdGlvbnMuaWNvbix0aGlzLl9kZWZhdWx0SWNvbnMpJiZ0aGlzLl90b2FzdEVsLmFkZENsYXNzKFwianEtaWNvbi1cIit0aGlzLm9wdGlvbnMuaWNvbikpLHRoaXMub3B0aW9uc1tcImNsYXNzXCJdIT09ITEmJnRoaXMuX3RvYXN0RWwuYWRkQ2xhc3ModGhpcy5vcHRpb25zW1wiY2xhc3NcIl0pfSxwb3NpdGlvbjpmdW5jdGlvbigpe1wic3RyaW5nXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMucG9zaXRpb24mJi0xIT09dC5pbkFycmF5KHRoaXMub3B0aW9ucy5wb3NpdGlvbix0aGlzLl9wb3NpdGlvbkNsYXNzZXMpP1wiYm90dG9tLWNlbnRlclwiPT09dGhpcy5vcHRpb25zLnBvc2l0aW9uP3RoaXMuX2NvbnRhaW5lci5jc3Moe2xlZnQ6dChvKS5vdXRlcldpZHRoKCkvMi10aGlzLl9jb250YWluZXIub3V0ZXJXaWR0aCgpLzIsYm90dG9tOjIwfSk6XCJ0b3AtY2VudGVyXCI9PT10aGlzLm9wdGlvbnMucG9zaXRpb24/dGhpcy5fY29udGFpbmVyLmNzcyh7bGVmdDp0KG8pLm91dGVyV2lkdGgoKS8yLXRoaXMuX2NvbnRhaW5lci5vdXRlcldpZHRoKCkvMix0b3A6MjB9KTpcIm1pZC1jZW50ZXJcIj09PXRoaXMub3B0aW9ucy5wb3NpdGlvbj90aGlzLl9jb250YWluZXIuY3NzKHtsZWZ0OnQobykub3V0ZXJXaWR0aCgpLzItdGhpcy5fY29udGFpbmVyLm91dGVyV2lkdGgoKS8yLHRvcDp0KG8pLm91dGVySGVpZ2h0KCkvMi10aGlzLl9jb250YWluZXIub3V0ZXJIZWlnaHQoKS8yfSk6dGhpcy5fY29udGFpbmVyLmFkZENsYXNzKHRoaXMub3B0aW9ucy5wb3NpdGlvbik6XCJvYmplY3RcIj09dHlwZW9mIHRoaXMub3B0aW9ucy5wb3NpdGlvbj90aGlzLl9jb250YWluZXIuY3NzKHt0b3A6dGhpcy5vcHRpb25zLnBvc2l0aW9uLnRvcD90aGlzLm9wdGlvbnMucG9zaXRpb24udG9wOlwiYXV0b1wiLGJvdHRvbTp0aGlzLm9wdGlvbnMucG9zaXRpb24uYm90dG9tP3RoaXMub3B0aW9ucy5wb3NpdGlvbi5ib3R0b206XCJhdXRvXCIsbGVmdDp0aGlzLm9wdGlvbnMucG9zaXRpb24ubGVmdD90aGlzLm9wdGlvbnMucG9zaXRpb24ubGVmdDpcImF1dG9cIixyaWdodDp0aGlzLm9wdGlvbnMucG9zaXRpb24ucmlnaHQ/dGhpcy5vcHRpb25zLnBvc2l0aW9uLnJpZ2h0OlwiYXV0b1wifSk6dGhpcy5fY29udGFpbmVyLmFkZENsYXNzKFwiYm90dG9tLWxlZnRcIil9LGJpbmRUb2FzdDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fdG9hc3RFbC5vbihcImFmdGVyU2hvd25cIixmdW5jdGlvbigpe3QucHJvY2Vzc0xvYWRlcigpfSksdGhpcy5fdG9hc3RFbC5maW5kKFwiLmNsb3NlLWpxLXRvYXN0LXNpbmdsZVwiKS5vbihcImNsaWNrXCIsZnVuY3Rpb24obyl7by5wcmV2ZW50RGVmYXVsdCgpLFwiZmFkZVwiPT09dC5vcHRpb25zLnNob3dIaWRlVHJhbnNpdGlvbj8odC5fdG9hc3RFbC50cmlnZ2VyKFwiYmVmb3JlSGlkZVwiKSx0Ll90b2FzdEVsLmZhZGVPdXQoZnVuY3Rpb24oKXt0Ll90b2FzdEVsLnRyaWdnZXIoXCJhZnRlckhpZGRlblwiKX0pKTpcInNsaWRlXCI9PT10Lm9wdGlvbnMuc2hvd0hpZGVUcmFuc2l0aW9uPyh0Ll90b2FzdEVsLnRyaWdnZXIoXCJiZWZvcmVIaWRlXCIpLHQuX3RvYXN0RWwuc2xpZGVVcChmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVySGlkZGVuXCIpfSkpOih0Ll90b2FzdEVsLnRyaWdnZXIoXCJiZWZvcmVIaWRlXCIpLHQuX3RvYXN0RWwuaGlkZShmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVySGlkZGVuXCIpfSkpfSksXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmJlZm9yZVNob3cmJnRoaXMuX3RvYXN0RWwub24oXCJiZWZvcmVTaG93XCIsZnVuY3Rpb24oKXt0Lm9wdGlvbnMuYmVmb3JlU2hvdygpfSksXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmFmdGVyU2hvd24mJnRoaXMuX3RvYXN0RWwub24oXCJhZnRlclNob3duXCIsZnVuY3Rpb24oKXt0Lm9wdGlvbnMuYWZ0ZXJTaG93bigpfSksXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmJlZm9yZUhpZGUmJnRoaXMuX3RvYXN0RWwub24oXCJiZWZvcmVIaWRlXCIsZnVuY3Rpb24oKXt0Lm9wdGlvbnMuYmVmb3JlSGlkZSgpfSksXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmFmdGVySGlkZGVuJiZ0aGlzLl90b2FzdEVsLm9uKFwiYWZ0ZXJIaWRkZW5cIixmdW5jdGlvbigpe3Qub3B0aW9ucy5hZnRlckhpZGRlbigpfSl9LGFkZFRvRG9tOmZ1bmN0aW9uKCl7dmFyIG89dChcIi5qcS10b2FzdC13cmFwXCIpO2lmKDA9PT1vLmxlbmd0aD8obz10KFwiPGRpdj48L2Rpdj5cIix7XCJjbGFzc1wiOlwianEtdG9hc3Qtd3JhcFwifSksdChcImJvZHlcIikuYXBwZW5kKG8pKTooIXRoaXMub3B0aW9ucy5zdGFja3x8aXNOYU4ocGFyc2VJbnQodGhpcy5vcHRpb25zLnN0YWNrLDEwKSkpJiZvLmVtcHR5KCksby5maW5kKFwiLmpxLXRvYXN0LXNpbmdsZTpoaWRkZW5cIikucmVtb3ZlKCksby5hcHBlbmQodGhpcy5fdG9hc3RFbCksdGhpcy5vcHRpb25zLnN0YWNrJiYhaXNOYU4ocGFyc2VJbnQodGhpcy5vcHRpb25zLnN0YWNrKSwxMCkpe3ZhciBpPW8uZmluZChcIi5qcS10b2FzdC1zaW5nbGVcIikubGVuZ3RoLHM9aS10aGlzLm9wdGlvbnMuc3RhY2s7cz4wJiZ0KFwiLmpxLXRvYXN0LXdyYXBcIikuZmluZChcIi5qcS10b2FzdC1zaW5nbGVcIikuc2xpY2UoMCxzKS5yZW1vdmUoKX10aGlzLl9jb250YWluZXI9b30sY2FuQXV0b0hpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmhpZGVBZnRlciE9PSExJiYhaXNOYU4ocGFyc2VJbnQodGhpcy5vcHRpb25zLmhpZGVBZnRlciwxMCkpfSxwcm9jZXNzTG9hZGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FuQXV0b0hpZGUoKXx8dGhpcy5vcHRpb25zLmxvYWRlcj09PSExKXJldHVybiExO3ZhciB0PXRoaXMuX3RvYXN0RWwuZmluZChcIi5qcS10b2FzdC1sb2FkZXJcIiksbz0odGhpcy5vcHRpb25zLmhpZGVBZnRlci00MDApLzFlMytcInNcIixpPXRoaXMub3B0aW9ucy5sb2FkZXJCZyxzPXQuYXR0cihcInN0eWxlXCIpfHxcIlwiO3M9cy5zdWJzdHJpbmcoMCxzLmluZGV4T2YoXCItd2Via2l0LXRyYW5zaXRpb25cIikpLHMrPVwiLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCBcIitvK1wiIGVhc2UtaW47ICAgICAgICAgICAgICAgICAgICAgICAtby10cmFuc2l0aW9uOiB3aWR0aCBcIitvK1wiIGVhc2UtaW47ICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCBcIitvK1wiIGVhc2UtaW47ICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBcIitpK1wiO1wiLHQuYXR0cihcInN0eWxlXCIscykuYWRkQ2xhc3MoXCJqcS10b2FzdC1sb2FkZWRcIil9LGFuaW1hdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuX3RvYXN0RWwuaGlkZSgpLHRoaXMuX3RvYXN0RWwudHJpZ2dlcihcImJlZm9yZVNob3dcIiksXCJmYWRlXCI9PT10aGlzLm9wdGlvbnMuc2hvd0hpZGVUcmFuc2l0aW9uLnRvTG93ZXJDYXNlKCk/dGhpcy5fdG9hc3RFbC5mYWRlSW4oZnVuY3Rpb24oKXt0Ll90b2FzdEVsLnRyaWdnZXIoXCJhZnRlclNob3duXCIpfSk6XCJzbGlkZVwiPT09dGhpcy5vcHRpb25zLnNob3dIaWRlVHJhbnNpdGlvbi50b0xvd2VyQ2FzZSgpP3RoaXMuX3RvYXN0RWwuc2xpZGVEb3duKGZ1bmN0aW9uKCl7dC5fdG9hc3RFbC50cmlnZ2VyKFwiYWZ0ZXJTaG93blwiKX0pOnRoaXMuX3RvYXN0RWwuc2hvdyhmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVyU2hvd25cIil9KSx0aGlzLmNhbkF1dG9IaWRlKCkpe3ZhciB0PXRoaXM7by5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XCJmYWRlXCI9PT10Lm9wdGlvbnMuc2hvd0hpZGVUcmFuc2l0aW9uLnRvTG93ZXJDYXNlKCk/KHQuX3RvYXN0RWwudHJpZ2dlcihcImJlZm9yZUhpZGVcIiksdC5fdG9hc3RFbC5mYWRlT3V0KGZ1bmN0aW9uKCl7dC5fdG9hc3RFbC50cmlnZ2VyKFwiYWZ0ZXJIaWRkZW5cIil9KSk6XCJzbGlkZVwiPT09dC5vcHRpb25zLnNob3dIaWRlVHJhbnNpdGlvbi50b0xvd2VyQ2FzZSgpPyh0Ll90b2FzdEVsLnRyaWdnZXIoXCJiZWZvcmVIaWRlXCIpLHQuX3RvYXN0RWwuc2xpZGVVcChmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVySGlkZGVuXCIpfSkpOih0Ll90b2FzdEVsLnRyaWdnZXIoXCJiZWZvcmVIaWRlXCIpLHQuX3RvYXN0RWwuaGlkZShmdW5jdGlvbigpe3QuX3RvYXN0RWwudHJpZ2dlcihcImFmdGVySGlkZGVuXCIpfSkpfSx0aGlzLm9wdGlvbnMuaGlkZUFmdGVyKX19LHJlc2V0OmZ1bmN0aW9uKG8pe1wiYWxsXCI9PT1vP3QoXCIuanEtdG9hc3Qtd3JhcFwiKS5yZW1vdmUoKTp0aGlzLl90b2FzdEVsLnJlbW92ZSgpfSx1cGRhdGU6ZnVuY3Rpb24odCl7dGhpcy5wcmVwYXJlT3B0aW9ucyh0LHRoaXMub3B0aW9ucyksdGhpcy5zZXR1cCgpLHRoaXMuYmluZFRvYXN0KCl9fTt0LnRvYXN0PWZ1bmN0aW9uKHQpe3ZhciBvPU9iamVjdC5jcmVhdGUobik7cmV0dXJuIG8uaW5pdCh0LHRoaXMpLHtyZXNldDpmdW5jdGlvbih0KXtvLnJlc2V0KHQpfSx1cGRhdGU6ZnVuY3Rpb24odCl7by51cGRhdGUodCl9fX0sdC50b2FzdC5vcHRpb25zPXt0ZXh0OlwiXCIsaGVhZGluZzpcIlwiLHNob3dIaWRlVHJhbnNpdGlvbjpcImZhZGVcIixhbGxvd1RvYXN0Q2xvc2U6ITAsaGlkZUFmdGVyOjNlMyxsb2FkZXI6ITAsbG9hZGVyQmc6XCIjOUVDNjAwXCIsc3RhY2s6NSxwb3NpdGlvbjpcImJvdHRvbS1sZWZ0XCIsYmdDb2xvcjohMSx0ZXh0Q29sb3I6ITEsdGV4dEFsaWduOlwibGVmdFwiLGljb246ITEsYmVmb3JlU2hvdzpmdW5jdGlvbigpe30sYWZ0ZXJTaG93bjpmdW5jdGlvbigpe30sYmVmb3JlSGlkZTpmdW5jdGlvbigpe30sYWZ0ZXJIaWRkZW46ZnVuY3Rpb24oKXt9fX0oalF1ZXJ5LHdpbmRvdyxkb2N1bWVudCk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tICdwcmVzdGFzaG9wJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJ2pxdWVyeS10b2FzdC1wbHVnaW4nO1xuaW1wb3J0ICdqcXVlcnktdG9hc3QtcGx1Z2luL2Rpc3QvanF1ZXJ5LnRvYXN0Lm1pbi5jc3MnO1xuXG4kKCgpID0+IHtcbiAgcHJlc3Rhc2hvcC5ibG9ja2NhcnQgPSBwcmVzdGFzaG9wLmJsb2NrY2FydCB8fCB7fTtcbiAgY29uc3Qgc2hvd01vZGFsID0gcHJlc3Rhc2hvcC5ibG9ja2NhcnQuc2hvd01vZGFsXG4gICAgfHwgZnVuY3Rpb24gKG1vZGFsKSB7XG4gICAgICBjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcbiAgICAgICRib2R5LmFwcGVuZChtb2RhbCk7XG4gICAgICAkKCcjYmxvY2tjYXJ0LW1vZGFsJykubW9kYWwoKTtcbiAgICAgIGNvbnNvbGUubG9nKCdjYWxsZWQnKTtcbiAgICAgICRib2R5Lm9uZSgnY2xpY2snLCAnI2Jsb2NrY2FydC1tb2RhbCcsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmlkID09PSAnYmxvY2tjYXJ0LW1vZGFsJykge1xuICAgICAgICAgICQubW9kYWwuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgcHJlc3Rhc2hvcC5vbigndXBkYXRlQ2FydCcsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHJlZnJlc2hVUkwgPSAkKCcuYmxvY2tjYXJ0JykuZGF0YSgncmVmcmVzaC11cmwnKTtcbiAgICBsZXQgcmVxdWVzdERhdGEgPSB7fTtcblxuICAgIGlmIChcbiAgICAgIGV2ZW50XG4gICAgICAmJiBldmVudC5yZWFzb25cbiAgICAgICYmIHR5cGVvZiBldmVudC5yZXNwICE9PSAndW5kZWZpbmVkJ1xuICAgICAgJiYgIWV2ZW50LnJlc3AuaGFzRXJyb3JcbiAgICApIHtcbiAgICAgIHJlcXVlc3REYXRhID0ge1xuICAgICAgICBpZF9jdXN0b21pemF0aW9uOiBldmVudC5yZWFzb24uaWRDdXN0b21pemF0aW9uLFxuICAgICAgICBpZF9wcm9kdWN0X2F0dHJpYnV0ZTogZXZlbnQucmVhc29uLmlkUHJvZHVjdEF0dHJpYnV0ZSxcbiAgICAgICAgaWRfcHJvZHVjdDogZXZlbnQucmVhc29uLmlkUHJvZHVjdCxcbiAgICAgICAgYWN0aW9uOiBldmVudC5yZWFzb24ubGlua0FjdGlvbixcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChldmVudCAmJiBldmVudC5yZXNwICYmIGV2ZW50LnJlc3AuaGFzRXJyb3IpIHtcbiAgICAgIHByZXN0YXNob3AuZW1pdCgnc2hvd0Vycm9yTmV4dFRvQWRkdG9DYXJ0QnV0dG9uJywge1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGV2ZW50LnJlc3AuZXJyb3JzLmpvaW4oJzxici8+JyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgJC5wb3N0KHJlZnJlc2hVUkwsIHJlcXVlc3REYXRhKVxuICAgICAgLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgJCgnLmJsb2NrY2FydCcpLnJlcGxhY2VXaXRoKCQocmVzcC5wcmV2aWV3KS5maW5kKCcuYmxvY2tjYXJ0JykpO1xuICAgICAgICBpZiAocmVzcC5tb2RhbCkge1xuICAgICAgICAgICQudG9hc3Qoe1xuICAgICAgICAgICAgaGVhZGluZzogJ0FkZGVkIHRvIENhcnQnLFxuICAgICAgICAgICAgdGV4dDogJ1lvdSBjYW4gY2hlY2tvdXQgb3IgY29udGludWUgc2hvcHBpbmcuJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHRvcDogJzEwMHB4JyxcbiAgICAgICAgICAgICAgcmlnaHQ6ICcyMHB4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiZ0NvbG9yOiAnI2ZmZmZmZicsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6ICcjMTExODI3JyxcbiAgICAgICAgICAgIGxvYWRlckJnOiAnIzE3MjU1NCcsXG4gICAgICAgICAgICBjbGFzczogJ3JvdW5kZWQtbm9uZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5mYWlsKChyZXNwKSA9PiB7XG4gICAgICAgIHByZXN0YXNob3AuZW1pdCgnaGFuZGxlRXJyb3InLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAndXBkYXRlU2hvcHBpbmdDYXJ0JyxcbiAgICAgICAgICByZXNwLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9KTtcbn0pO1xuIiwiLyoqXG4gKiBqUXVlcnkub2ZmY2FudmFzIHYzLjQuNyAtIEVhc3kgdG8gdXNlIGpRdWVyeSBvZmZjYW52YXMgcGx1Z2luLlxuICogQ29weXJpZ2h0IDIwMTYgTGFycyBHcmF1Ym5lciAtIGh0dHA6Ly9sZ3JhdWJuZXIuZ2l0aHViLmlvL2pxdWVyeS1vZmZjYW52YXMvXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQscyl7cmV0dXJuIHZvaWQgMD09PXMmJihzPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/cmVxdWlyZShcImpxdWVyeVwiKTpyZXF1aXJlKFwianF1ZXJ5XCIpKHQpKSxlKHMpLHN9OlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wianF1ZXJ5IFwiXSxlKTplKGpRdWVyeSl9KHRoaXMsZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZSh0LGUscyl7dmFyIGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxvPWFyZ3VtZW50cyxoPWZ1bmN0aW9uKCl7aT1udWxsLHN8fHQuYXBwbHkobixvKX0sYT1zJiYhaTtjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KGgsZSksYSYmdC5hcHBseShuLG8pfX1mdW5jdGlvbiBzKGUscyl7dmFyIG4sbyxoPXQoZSkuZGF0YSgpO3RoaXMuJGVsPXQoZSk7Zm9yKG4gaW4gaCloLmhhc093blByb3BlcnR5KG4pJiYvXm9mZmNhbnZhc1tBLVpdKy8udGVzdChuKSYmKG89bltpLmxlbmd0aF0udG9Mb3dlckNhc2UoKStuLnN1YnN0cihpLmxlbmd0aCsxKSxoW29dPWhbbl0pO3RoaXMuc2V0dGluZ3M9dC5leHRlbmQoITAse30sdC5mbltpXS5kZWZhdWx0cyxzLGgpLHRoaXMubmFtZT1pLHRoaXMuJGVsLmRhdGEodGhpcy5uYW1lK1wiLm9wdHNcIix0aGlzLnNldHRpbmdzKSx0aGlzLmluaXQoKX12YXIgaT1cIm9mZmNhbnZhc1wiO3QuZXh0ZW5kKHMucHJvdG90eXBlLHtzZXRIZWlnaHRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy4kb3V0ZXJXcmFwcGVyLmhlaWdodCgpO3RoaXMuJGVsLmRhdGEodGhpcy5uYW1lK1wiLm9wdHNcIikmJih0aGlzLiRlbGVtZW50LmNzcyhcImhlaWdodFwiLHQpLHRoaXMuc2V0dGluZ3Mub3ZlcmxheSYmdGhpcy4kb3ZlcmxheS5jc3MoXCJoZWlnaHRcIix0KSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgZT17fTt0aGlzLnZpc2libGV8fCh0aGlzLiRjb250LmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vcGVuKSx0aGlzLnZpc2libGU9ITAsdGhpcy4kZWwudHJpZ2dlcihcInNob3cuXCIrdGhpcy5uYW1lKSx0aGlzLiRlbC50cmlnZ2VyKFwidG9nZ2xlLlwiK3RoaXMubmFtZSx0aGlzLnZpc2libGUpLHRoaXMuc2V0SGVpZ2h0cygpLGVbdGhpcy5zZXR0aW5ncy5vcmlnaW5dPXRoaXMuZWZmZWN0c1t0aGlzLnNldHRpbmdzLmVmZmVjdF0udG8sdGhpcy5lZmZlY3RzW3RoaXMuc2V0dGluZ3MuZWZmZWN0XS4kZWwudmVsb2NpdHkoZSx0LmV4dGVuZCh7Y29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLiRlbC50cmlnZ2VyKFwic2hvd24uXCIrdGhpcy5uYW1lKSx0aGlzLnNldHRpbmdzLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkub25lKFwiY2xpY2suXCIrdGhpcy5uYW1lLGZ1bmN0aW9uKCl7dGhpcy5oaWRlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpfSx0aGlzLmFuaW1hdGlvbk9wdGlvbnMpKSx0aGlzLnNldHRpbmdzLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkudmVsb2NpdHkoe29wYWNpdHk6MX0sdC5leHRlbmQoe2Rpc3BsYXk6XCJibG9ja1wifSx0aGlzLmFuaW1hdGlvbk9wdGlvbnMpKSl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLnZpc2libGUmJih0aGlzLiRjb250LnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vcGVuKSx0aGlzLnZpc2libGU9ITEsdGhpcy4kZWwudHJpZ2dlcihcImhpZGUuXCIrdGhpcy5uYW1lKSx0aGlzLiRlbC50cmlnZ2VyKFwidG9nZ2xlLlwiK3RoaXMubmFtZSx0aGlzLnZpc2libGUpLHRoaXMuZWZmZWN0c1t0aGlzLnNldHRpbmdzLmVmZmVjdF0uJGVsLnZlbG9jaXR5KFwic3RvcFwiKS52ZWxvY2l0eShcInJldmVyc2VcIix0LmV4dGVuZCh7Y29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLiRlbC50cmlnZ2VyKFwiaGlkZGVuLlwiK3RoaXMubmFtZSl9LmJpbmQodGhpcyl9LHRoaXMuYW5pbWF0aW9uT3B0aW9ucykpLHRoaXMuc2V0dGluZ3Mub3ZlcmxheSYmdGhpcy4kb3ZlcmxheS52ZWxvY2l0eShcInN0b3BcIikudmVsb2NpdHkoXCJyZXZlcnNlXCIsdC5leHRlbmQoe2Rpc3BsYXk6XCJub25lXCJ9LHRoaXMuYW5pbWF0aW9uT3B0aW9ucykpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMudmlzaWJsZT90aGlzLmhpZGU6dGhpcy5zaG93KS5jYWxsKHRoaXMpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy4kZWwuZGF0YSh0aGlzLm5hbWUrXCIub3B0c1wiKSYmKHRoaXMuJGlubmVyV3JhcHBlci51bndyYXAoKSx0aGlzLiRpbm5lcldyYXBwZXIuY2hpbGRyZW4oKS51bndyYXAoKSx0aGlzLiRjb250LnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5jb250YWluZXIpLnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vcGVuKSx0aGlzLnNldHRpbmdzLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkub2ZmKFwiY2xpY2suXCIrdGhpcy5uYW1lKS5yZW1vdmUoKSx0aGlzLiRlbC51bndyYXAoKS5yZW1vdmVEYXRhKHRoaXMubmFtZStcIi5vcHRzXCIpLnJlbW92ZUF0dHIoXCJzdHlsZVwiKSx0aGlzLiR3aW4ub2ZmKFwicmVzaXplLlwiK3RoaXMubmFtZSkpfSxpbml0OmZ1bmN0aW9uKCl7dmFyIHM9e307dGhpcy4kd2luPXQod2luZG93KSx0aGlzLiRib2R5PXQoXCJib2R5XCIpLHRoaXMudmlzaWJsZT0hMSx0aGlzLiRjb250PXQodGhpcy5zZXR0aW5ncy5jb250YWluZXIpLHRoaXMuJGNvbnQuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLmNvbnRhaW5lcikuY2hpbGRyZW4oXCI6bm90KHNjcmlwdClcIikud3JhcEFsbCh0KFwiPGRpdi8+XCIpLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vdXRlcikpLHRoaXMuJG91dGVyV3JhcHBlcj10KFwiLlwiK3RoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vdXRlcikud3JhcElubmVyKHQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLmlubmVyKSksdGhpcy4kaW5uZXJXcmFwcGVyPXQoXCIuXCIrdGhpcy5zZXR0aW5ncy5jbGFzc2VzLmlubmVyKSx0aGlzLnNldHRpbmdzLm92ZXJsYXkmJih0aGlzLiRpbm5lcldyYXBwZXIuYXBwZW5kKHQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLm92ZXJsYXkpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIix0aGlzLnNldHRpbmdzLm92ZXJsYXlDb2xvcikpLHRoaXMuJG92ZXJsYXk9dChcIi5cIit0aGlzLnNldHRpbmdzLmNsYXNzZXMub3ZlcmxheSkpLHRoaXMuJGVsLndyYXAodChcIjxkaXYvPlwiKS5hZGRDbGFzcyh0aGlzLnNldHRpbmdzLmNsYXNzZXMuZWxlbWVudCkpLHRoaXMuJGVsZW1lbnQ9dGhpcy4kZWwucGFyZW50KCksc1t0aGlzLnNldHRpbmdzLm9yaWdpbl09XCItXCIrdGhpcy5zZXR0aW5ncy5jb3ZlcmFnZSxzLndpZHRoPXRoaXMuc2V0dGluZ3MuY292ZXJhZ2UsdGhpcy4kZWxlbWVudC5jc3MocyksdGhpcy5lZmZlY3RzPXtwdXNoOnskZWw6dGhpcy4kaW5uZXJXcmFwcGVyLGZyb206MCx0bzp0aGlzLnNldHRpbmdzLmNvdmVyYWdlfSxcInNsaWRlLWluLW92ZXJcIjp7JGVsOnRoaXMuJGVsZW1lbnQsZnJvbTpcIi1cIit0aGlzLnNldHRpbmdzLmNvdmVyYWdlLHRvOjB9fSx0aGlzLmFuaW1hdGlvbk9wdGlvbnM9e2Vhc2luZzp0aGlzLnNldHRpbmdzLmVhc2luZyxkdXJhdGlvbjp0aGlzLnNldHRpbmdzLmR1cmF0aW9ufSx0aGlzLiR3aW4ub24oXCJyZXNpemUuXCIrdGhpcy5uYW1lLGUodGhpcy5zZXRIZWlnaHRzLDMwMCkuYmluZCh0aGlzKSksdGhpcy5zZXRIZWlnaHRzKCksdGhpcy4kZWwudHJpZ2dlcihcImluaXQuXCIrdGhpcy5uYW1lKX19KSx0LmZuW2ldPWZ1bmN0aW9uKGUpe3ZhciBuLG89YXJndW1lbnRzO3JldHVybiB2b2lkIDA9PT1lfHxcIm9iamVjdFwiPT10eXBlb2YgZT90aGlzLmVhY2goZnVuY3Rpb24oKXt0LmRhdGEodGhpcyxcInBsdWdpbl9cIitpKXx8dC5kYXRhKHRoaXMsXCJwbHVnaW5fXCIraSxuZXcgcyh0aGlzLGUpKX0pOlwic3RyaW5nXCI9PXR5cGVvZiBlJiZcIl9cIiE9PWVbMF0mJlwiaW5pdFwiIT09ZSYmKHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBoPXQuZGF0YSh0aGlzLFwicGx1Z2luX1wiK2kpO2ggaW5zdGFuY2VvZiBzJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBoW2VdJiYobj1oW2VdLmFwcGx5KGgsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobywxKSkpLFwiZGVzdHJveVwiPT09ZSYmdC5kYXRhKHRoaXMsXCJwbHVnaW5fXCIraSxudWxsKX0pLHZvaWQgMCE9PW4/bjp0aGlzKX0sdC5mbltpXS5kZWZhdWx0cz17Y2xhc3Nlczp7Y29udGFpbmVyOmksZWxlbWVudDppK1wiLWVsZW1lbnRcIixpbm5lcjppK1wiLWlubmVyXCIsb3BlbjppK1wiLW9wZW5cIixvdXRlcjppK1wiLW91dGVyXCIsb3ZlcmxheTppK1wiLW92ZXJsYXlcIn0sY29udGFpbmVyOlwiYm9keVwiLGNvdmVyYWdlOlwiMjIwcHhcIixvcmlnaW46XCJsZWZ0XCIsZHVyYXRpb246MzAwLGVhc2luZzpcImVhc2UtaW4tb3V0XCIsZWZmZWN0OlwicHVzaFwiLG92ZXJsYXk6ITEsb3ZlcmxheUNvbG9yOlwicmdiYSgwLCAwLCAwLCAwLjcpXCJ9fSk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gaW1wb3J0ICdib290c3RyYXAvZGlzdC9qcy9ib290c3RyYXAubWluJztcbmltcG9ydCBcImpxdWVyeS1tb2RhbFwiO1xuLy8gaW1wb3J0IFwianF1ZXJ5LW9mZmNhbnZhcy9kaXN0L2pxdWVyeS5vZmZjYW52YXMubWluLmNzc1wiO1xuaW1wb3J0IFwidG9vbHRpcHN0ZXJcIjtcbmltcG9ydCBcInRvb2x0aXBzdGVyL2Rpc3QvY3NzL3Rvb2x0aXBzdGVyLmJ1bmRsZS5taW4uY3NzXCI7XG5pbXBvcnQgXCJ0b29sdGlwc3Rlci9kaXN0L2Nzcy9wbHVnaW5zL3Rvb2x0aXBzdGVyL3NpZGVUaXAvdGhlbWVzL3Rvb2x0aXBzdGVyLXNpZGVUaXAtc2hhZG93Lm1pbi5jc3NcIjtcbmltcG9ydCB0b3VjaHNwaW4gZnJvbSBcImJvb3RzdHJhcC10b3VjaHNwaW5cIjtcbmltcG9ydCBcImpxdWVyeS10b3VjaHN3aXBlXCI7XG5pbXBvcnQgXCIuL3NlbGVjdG9yc1wiO1xuaW1wb3J0IFwiLi90YWJzLmpzXCI7XG5pbXBvcnQgXCIuL2Vhc3l6b29tXCI7XG5cbmltcG9ydCBcIi4vcmVzcG9uc2l2ZVwiO1xuaW1wb3J0IFwiLi9jaGVja291dFwiO1xuaW1wb3J0IFwiLi9jdXN0b21lclwiO1xuaW1wb3J0IFwiLi9saXN0aW5nXCI7XG5pbXBvcnQgXCIuL3Byb2R1Y3RcIjtcbmltcG9ydCBcIi4vY2FydFwiO1xuaW1wb3J0IFwiLi9mYWNldHNcIjtcblxuaW1wb3J0IHByZXN0YXNob3AgZnJvbSBcInByZXN0YXNob3BcIjtcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiO1xuaW1wb3J0IERyb3BEb3duIGZyb20gXCIuL2NvbXBvbmVudHMvZHJvcC1kb3duXCI7XG5pbXBvcnQgRm9ybSBmcm9tIFwiLi9jb21wb25lbnRzL2Zvcm1cIjtcbmltcG9ydCB1c2VQYXNzd29yZFBvbGljeSBmcm9tIFwiLi9jb21wb25lbnRzL3VzZVBhc3N3b3JkUG9saWN5XCI7XG5pbXBvcnQgUHJvZHVjdE1pbml0YXR1cmUgZnJvbSBcIi4vY29tcG9uZW50cy9wcm9kdWN0LW1pbmlhdHVyZVwiO1xuaW1wb3J0IFByb2R1Y3RTZWxlY3QgZnJvbSBcIi4vY29tcG9uZW50cy9wcm9kdWN0LXNlbGVjdFwiO1xuaW1wb3J0IFRvcE1lbnUgZnJvbSBcIi4vY29tcG9uZW50cy90b3AtbWVudVwiO1xuXG5pbXBvcnQgXCIuL2NvbXBvbmVudHMvYmxvY2stY2FydFwiO1xuaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiO1xuaW1wb3J0IGpvIGZyb20gXCJqcXVlcnktb2ZmY2FudmFzXCI7XG5qbyh3aW5kb3csICQpO1xudG91Y2hzcGluKHdpbmRvdywgJCk7XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbi8vIFwiaW5oZXJpdFwiIEV2ZW50RW1pdHRlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5mb3IgKGNvbnN0IGkgaW4gRXZlbnRFbWl0dGVyLnByb3RvdHlwZSkge1xuICBwcmVzdGFzaG9wW2ldID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZVtpXTtcbn1cblxuJCgoKSA9PiB7XG4gIGNvbnN0IGRyb3BEb3duRWwgPSAkKCcuanMtZHJvcGRvd24nKTtcbiAgY29uc3QgZm9ybSA9IG5ldyBGb3JtKCk7XG4gIGNvbnN0IHRvcE1lbnVFbCA9ICQoJy5qcy10b3AtbWVudSB1bFtkYXRhLWRlcHRoPVwiMFwiXScpO1xuICBjb25zdCBkcm9wRG93biA9IG5ldyBEcm9wRG93bihkcm9wRG93bkVsKTtcbiAgY29uc3QgdG9wTWVudSA9IG5ldyBUb3BNZW51KHRvcE1lbnVFbCk7XG4gIGNvbnN0IHByb2R1Y3RNaW5pdGF0dXJlID0gbmV3IFByb2R1Y3RNaW5pdGF0dXJlKCk7XG4gIGNvbnN0IHByb2R1Y3RTZWxlY3QgPSBuZXcgUHJvZHVjdFNlbGVjdCgpO1xuICBkcm9wRG93bi5pbml0KCk7XG4gIGZvcm0uaW5pdCgpO1xuICB0b3BNZW51LmluaXQoKTtcbiAgcHJvZHVjdE1pbml0YXR1cmUuaW5pdCgpO1xuICBwcm9kdWN0U2VsZWN0LmluaXQoKTtcbiAgdXNlUGFzc3dvcmRQb2xpY3koJy5maWVsZC1wYXNzd29yZC1wb2xpY3knKTtcblxuXG4gICQoJy5lYXN5em9vbScpLmVhc3lab29tKHtcbiAgfSk7XG5cbiAgJCgnLmNhcm91c2VsW2RhdGEtdG91Y2g9XCJ0cnVlXCJdJykuc3dpcGUoe1xuICAgIHN3aXBlKGV2ZW50LCBkaXJlY3Rpb24pIHtcbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAkKHRoaXMpLmNhcm91c2VsKCduZXh0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICQodGhpcykuY2Fyb3VzZWwoJ3ByZXYnKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFsbG93UGFnZVNjcm9sbDogJ3ZlcnRpY2FsJyxcbiAgfSk7XG5cbiAgJCgnI3Byb2R1Y3QtbGlzdC10b3AtZmlsdGVycycpLm9mZmNhbnZhcyh7XG4gICAgZHVyYXRpb246IDEwMCxcbiAgICBlZmZlY3Q6ICdzbGlkZS1pbi1vdmVyJyxcbiAgICBjbGFzc2VzOiB7XG4gICAgICBlbGVtZW50OiAnYWJzb2x1dGUgdG9wLTAgei01MCcsXG4gICAgfSxcbiAgfSk7XG5cbiAgJCgnI3Nob3ctZmlsdGVycycpLm9uKCdjbGljay5vZmZjYW52YXMnLCAoKSA9PiB7XG4gICAgJCgnI292ZXJsYXknKS5zaG93KCk7ICBcbiAgICAkKCcjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzJykuc2hvdygpOyAgXG4gIH0pO1xuICBcbiAgJCgnI2hpZGUtZmlsdGVycycpLm9uKCdjbGljay5vZmZjYW52YXMnLCAoKSA9PiB7XG4gICAgJCgnI3Byb2R1Y3QtbGlzdC10b3AtZmlsdGVycycpLmhpZGUoKTsgXG4gICAgJCgnI292ZXJsYXknKS5oaWRlKCk7XG4gIH0pO1xuICBcbiAgJCgnI292ZXJsYXknKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAkKCcjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzJykuaGlkZSgpOyAgXG4gICAgJCgnI292ZXJsYXknKS5oaWRlKCk7ICBcbiAgfSk7XG5cbiAgZnVuY3Rpb24gVGhBY2NvcmRpb24oKSB7fVxuXG4gICQuZXh0ZW5kKFRoQWNjb3JkaW9uLnByb3RvdHlwZSwge1xuICAgIGluaXQoKSB7fSxcbiAgfSk7XG5cbiAgJC5mbi50aGFjY29yZGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzZWxlY3RvcnMgPSB7XG4gICAgICByb290OiAnLnRoLWFjY29yZGlvbicsXG4gICAgICBpdGVtOiAnLnRoLWFjY29yZGlvbi1pdGVtJyxcbiAgICAgIHRyaWdnZXI6ICcudGgtYWNjb3JkaW9uLWl0ZW0tdHJpZ2dlcicsXG4gICAgICBzdmc6ICcudGgtYWNjb3JkaW9uLWl0ZW0tdHJpZ2dlci1zdmcnLFxuICAgICAgY29udGVudDogJy50aC1hY2NvcmRpb24taXRlbS1jb250ZW50JyxcbiAgICB9O1xuICAgIGxldCBzZWxlY3Rpb24gPSBudWxsO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5maW5kKHNlbGVjdG9ycy5pdGVtKTtcbiAgICBjb25zdCByb3RhdGVDbGFzcyA9ICdyb3RhdGUtOTAgZHVyYXRpb24tNTAwJztcblxuICAgIGZ1bmN0aW9uIGNvbGxhcHNlQWxsKCkge1xuICAgICAgaXRlbXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICQodGhpcykuZmluZChzZWxlY3RvcnMuY29udGVudCkuaGlkZSg1MDApO1xuICAgICAgICAkKHRoaXMpLmZpbmQoc2VsZWN0b3JzLnN2ZykucmVtb3ZlQ2xhc3Mocm90YXRlQ2xhc3MpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgJChzZWxlY3Rpb24pLmZpbmQoc2VsZWN0b3JzLmNvbnRlbnQpLmhpZGUoNTAwKTtcbiAgICAgICQoc2VsZWN0aW9uKS5maW5kKHNlbGVjdG9ycy5zdmcpLnJlbW92ZUNsYXNzKCdyb3RhdGUtOTAnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvcGVuKCkge1xuICAgICAgY29sbGFwc2VBbGwoKTtcbiAgICAgICQoc2VsZWN0aW9uKS5maW5kKHNlbGVjdG9ycy5jb250ZW50KS5zaG93KDUwMCk7XG4gICAgICAkKHNlbGVjdGlvbikuZmluZChzZWxlY3RvcnMuc3ZnKS5hZGRDbGFzcyhyb3RhdGVDbGFzcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPcGVuKGl0ZW0pIHtcbiAgICAgIHJldHVybiAkKGl0ZW0pLmZpbmQoc2VsZWN0b3JzLmNvbnRlbnQpLmlzKCc6dmlzaWJsZScpO1xuICAgIH1cblxuICAgIGNvbGxhcHNlQWxsKCk7XG5cbiAgICBpdGVtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgJCh0aGlzKVxuICAgICAgICAuZmluZChzZWxlY3RvcnMudHJpZ2dlcilcbiAgICAgICAgLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uID09PSBzZWxmKSB7XG4gICAgICAgICAgICBpZiAoaXNPcGVuKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZjtcbiAgICAgICAgICAgIGlmICghaXNPcGVuKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgb3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgJCgnLnRoLWFjY29yZGlvbicpLnRoYWNjb3JkaW9uKCk7XG4gICQoJy50b29sdGlwJykudG9vbHRpcHN0ZXIoe1xuICAgIHRoZW1lOiAndG9vbHRpcHN0ZXItc2hhZG93JyxcbiAgICB0cmlnZ2VyT3Blbjoge1xuICAgICAgY2xpY2s6IHRydWUsXG4gICAgICBtb3VzZWVudGVyOiB0cnVlLFxuICAgICAgdG91Y2hzdGFydDogdHJ1ZSxcbiAgICB9LFxuICAgIGRlbGF5VG91Y2g6IFswLCAyMDAwXSxcbiAgfSk7XG5cbiAgJCgnLnRvZ2dsZS1tYWluLW1lbnUnKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgJCgnLm1vYmlsZS1tYWluLW1lbnUnKS50b2dnbGUoKTtcbiAgfSk7XG5cdFxufSk7XG5cbiJdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwiJCIsIndpbmRvdyIsImRvY3VtZW50IiwidW5kZWZpbmVkIiwibW9kdWxlIiwidGhpcyIsImEiLCJiIiwiYyIsImQiLCJlIiwiZyIsImkiLCJmIiwiaiIsImsiLCJoIiwibCIsIm0iLCJuIiwibyIsInAiLCJvYmoiLCJqUXVlcnkiLCJ2YWx1ZSIsInBoYXNlIiwiZGlyZWN0aW9uIiwiZGlzdGFuY2UiLCJwcmVzdGFzaG9wIiwic2VsZiIsImVsZW0iLCJvZmZzZXRQYXJlbnQiLCJnbG9iYWwiLCIkMiIsImVsZW1lbnQiLCJwcm9wZXJ0eSIsIm9wdHMiLCJjYWxsSW5kZXgiLCJkZWxheUNvbXBsZXRlIiwidmFsdWVEYXRhIiwiZW5kVmFsdWUiLCJlYXNpbmciLCJzdGFydFZhbHVlIiwidHdlZW5EZWx0YSIsIlJlZmxlY3RBcHBseSIsIlJlZmxlY3RPd25LZXlzIiwiTnVtYmVySXNOYU4iLCJldmVudHNNb2R1bGUiLCJldmVudHMiLCJvbmNlIiwic3ByaW50ZiIsInMiLCJ0IiwiRXZlbnRFbWl0dGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBS0EsS0FBQyxTQUFVLFNBQVM7QUFHbUQ7QUFDbkUsZ0JBQVFBLEtBQW1CLFFBQVEsUUFBUTtBQUFBLE1BSTVDO0FBQUEsSUFDRixHQUFDLFNBQVNDLElBQUdDLFNBQVFDLFdBQVVDLGFBQVc7QUFFekMsVUFBSSxTQUFTLENBQUUsR0FDWCxhQUFhLFdBQVc7QUFDdEIsZUFBTyxPQUFPLFNBQVMsT0FBTyxPQUFPLFNBQVMsQ0FBQyxJQUFJO0FBQUEsTUFDcEQsR0FDRCxnQkFBZ0IsV0FBVztBQUN6QixZQUFJLEdBQ0EsV0FBVztBQUNmLGFBQUssSUFBRSxPQUFPLFNBQU8sR0FBRyxLQUFHLEdBQUcsS0FBSztBQUNqQyxjQUFJLE9BQU8sQ0FBQyxFQUFFLFVBQVU7QUFDdEIsbUJBQU8sQ0FBQyxFQUFFLFNBQVMsWUFBWSxXQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksVUFBUyxRQUFRO0FBQ2pGLHVCQUFXO0FBQUEsVUFDWjtBQUFBLFFBQ0Y7QUFBQSxNQUNUO0FBRUUsTUFBQUgsR0FBRSxRQUFRLFNBQVMsSUFBSSxTQUFTO0FBQzlCLFlBQUksUUFBUTtBQUNaLGFBQUssUUFBUUEsR0FBRSxNQUFNO0FBQ3JCLGFBQUssVUFBVUEsR0FBRSxPQUFPLENBQUEsR0FBSUEsR0FBRSxNQUFNLFVBQVUsT0FBTztBQUNyRCxhQUFLLFFBQVEsU0FBUyxDQUFDLE1BQU0sU0FBUyxLQUFLLFFBQVEsY0FBYyxFQUFFLENBQUM7QUFDcEUsYUFBSyxXQUFXO0FBQ2hCLFlBQUksS0FBSyxRQUFRO0FBQ2YsaUJBQU9BLEdBQUUsTUFBTSxTQUFVO0FBQ3ZCLFlBQUFBLEdBQUUsTUFBTTtBQUNaLGVBQU8sS0FBSyxJQUFJO0FBQ2hCLFlBQUksR0FBRyxHQUFHLEdBQUcsR0FBRztBQUNkLG1CQUFTLEdBQUcsS0FBSyxNQUFNO0FBQ3ZCLGVBQUssU0FBUztBQUVkLGNBQUksS0FBSyxLQUFLLE1BQU0sR0FBRztBQUNyQixpQkFBSyxPQUFPQSxHQUFFLE1BQU07QUFDcEIsZ0JBQUksS0FBSyxLQUFLLFdBQVc7QUFBRyxxQkFBTztBQUNuQyxpQkFBSyxNQUFNLE9BQU8sS0FBSyxJQUFJO0FBQzNCLGlCQUFLLEtBQUk7QUFBQSxVQUVqQixPQUFhO0FBQ0wsaUJBQUssT0FBT0EsR0FBRSxPQUFPO0FBQ3JCLGlCQUFLLE1BQU0sT0FBTyxLQUFLLElBQUk7QUFDM0IscUJBQVMsU0FBUyxPQUFPLE9BQU87QUFBRSxvQkFBTSxJQUFJLE9BQVE7QUFBQTtBQUNwRCxpQkFBSyxZQUFXO0FBQ2hCLGVBQUcsUUFBUUEsR0FBRSxNQUFNLFNBQVM7QUFDNUIsWUFBQUEsR0FBRSxJQUFJLE1BQU0sRUFBRSxLQUFLLFNBQVMsTUFBTTtBQUNoQyxrQkFBSSxDQUFDQSxHQUFFLE1BQU0sU0FBVTtBQUFFO0FBQ3pCLGlCQUFHLFFBQVFBLEdBQUUsTUFBTSxZQUFZO0FBQy9CLGtCQUFJLFVBQVU7QUFDZCxzQkFBUSxLQUFLLE1BQU8sRUFBQyxPQUFPLElBQUksRUFBRSxHQUFHQSxHQUFFLE1BQU0sT0FBTyxNQUFNO0FBQzFELHNCQUFRLFlBQVc7QUFDbkIsc0JBQVEsS0FBSTtBQUNaLGlCQUFHLFFBQVFBLEdBQUUsTUFBTSxhQUFhO0FBQUEsWUFDMUMsQ0FBUyxFQUFFLEtBQUssV0FBVztBQUNqQixpQkFBRyxRQUFRQSxHQUFFLE1BQU0sU0FBUztBQUM1QixrQkFBSSxVQUFVO0FBQ2Qsc0JBQVEsWUFBVztBQUNuQixxQkFBTyxJQUFHO0FBQ1YsaUJBQUcsUUFBUUEsR0FBRSxNQUFNLGFBQWE7QUFBQSxZQUMxQyxDQUFTO0FBQUEsVUFDRjtBQUFBLFFBQ1AsT0FBVztBQUNMLGVBQUssT0FBTztBQUNaLGVBQUssU0FBUztBQUNkLGVBQUssTUFBTSxPQUFPLEtBQUssSUFBSTtBQUMzQixlQUFLLEtBQUk7QUFBQSxRQUNWO0FBQUEsTUFDTDtBQUVFLE1BQUFBLEdBQUUsTUFBTSxZQUFZO0FBQUEsUUFDbEIsYUFBYUEsR0FBRTtBQUFBLFFBRWYsTUFBTSxXQUFXO0FBQ2YsY0FBSSxJQUFJO0FBQ1IsZUFBSyxNQUFLO0FBQ1YsZUFBSyxPQUFPO0FBQ1osY0FBRyxLQUFLLFFBQVEsUUFBUTtBQUN0Qix1QkFBVyxXQUFXO0FBQ3BCLGdCQUFFLEtBQUk7QUFBQSxZQUNoQixHQUFXLEtBQUssUUFBUSxlQUFlLEtBQUssUUFBUSxTQUFTO0FBQUEsVUFDN0QsT0FBYTtBQUNMLGlCQUFLLEtBQUk7QUFBQSxVQUNWO0FBQ0QsVUFBQUEsR0FBRUUsU0FBUSxFQUFFLElBQUksZUFBZSxFQUFFLEdBQUcsaUJBQWlCLFNBQVMsT0FBTztBQUNuRSxnQkFBSSxVQUFVO0FBQ2QsZ0JBQUksTUFBTSxVQUFVLE1BQU0sUUFBUSxRQUFRO0FBQWEsc0JBQVE7VUFDdkUsQ0FBTztBQUNELGNBQUksS0FBSyxRQUFRO0FBQ2YsaUJBQUssU0FBUyxNQUFNLFNBQVMsR0FBRztBQUM5QixrQkFBSSxFQUFFLFdBQVc7QUFDZixnQkFBQUYsR0FBRSxNQUFNO1lBQ3BCLENBQVM7QUFBQSxRQUNKO0FBQUEsUUFFRCxPQUFPLFdBQVc7QUFDaEIsaUJBQU8sSUFBRztBQUNWLGVBQUssUUFBTztBQUNaLGVBQUssS0FBSTtBQUNULGNBQUksQ0FBQ0EsR0FBRSxNQUFNLFNBQVU7QUFDckIsWUFBQUEsR0FBRUUsU0FBUSxFQUFFLElBQUksZUFBZTtBQUFBLFFBQ2xDO0FBQUEsUUFFRCxPQUFPLFdBQVc7QUFDaEIsZUFBSyxLQUFLLFFBQVFGLEdBQUUsTUFBTSxjQUFjLENBQUMsS0FBSyxLQUFNLENBQUEsQ0FBQztBQUNyRCxlQUFLLE1BQU0sSUFBSSxZQUFXLFFBQVE7QUFDbEMsZUFBSyxXQUFXQSxHQUFFLGlCQUFpQixLQUFLLFFBQVEsZUFBZSwwQkFBMEIsRUFBRSxTQUFTLEtBQUssS0FBSztBQUM5RztBQUNBLGNBQUcsS0FBSyxRQUFRLFFBQVE7QUFDdEIsaUJBQUssU0FBUyxJQUFJLFdBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBQyxTQUFTLEVBQUMsR0FBRyxLQUFLLFFBQVEsWUFBWTtBQUFBLFVBQy9FO0FBQ0QsZUFBSyxLQUFLLFFBQVFBLEdBQUUsTUFBTSxPQUFPLENBQUMsS0FBSyxLQUFNLENBQUEsQ0FBQztBQUFBLFFBQy9DO0FBQUEsUUFFRCxTQUFTLFNBQVMsS0FBSztBQUNyQixjQUFJLENBQUMsT0FBTyxLQUFLLFFBQVE7QUFDdkIsaUJBQUssU0FBUyxRQUFRLEtBQUssUUFBUSxjQUFjLEtBQUssUUFBUSxLQUFLLE1BQUssSUFBSSxDQUFDO0FBQUEsZUFDMUU7QUFDSCxpQkFBSyxTQUFTLFNBQVEsRUFBRyxTQUFTLEtBQUssS0FBSztBQUM1QyxpQkFBSyxTQUFTO0FBQ2QsaUJBQUssV0FBVztBQUNoQjtBQUNBLGdCQUFJLENBQUNBLEdBQUUsTUFBTSxTQUFVO0FBQ3JCLG1CQUFLLE1BQU0sSUFBSSxZQUFXLEVBQUU7QUFBQSxVQUMvQjtBQUFBLFFBQ0Y7QUFBQSxRQUVELE1BQU0sV0FBVztBQUNmLGVBQUssS0FBSyxRQUFRQSxHQUFFLE1BQU0sYUFBYSxDQUFDLEtBQUssS0FBTSxDQUFBLENBQUM7QUFDcEQsY0FBSSxLQUFLLFFBQVEsV0FBVztBQUMxQixpQkFBSyxjQUFjQSxHQUFFLGlFQUFpRSxLQUFLLFFBQVEsYUFBYSxPQUFPLEtBQUssUUFBUSxZQUFZLE1BQU07QUFDdEosaUJBQUssS0FBSyxPQUFPLEtBQUssV0FBVztBQUFBLFVBQ2xDO0FBQ0QsZUFBSyxLQUFLLFNBQVMsS0FBSyxRQUFRLFVBQVUsRUFBRSxTQUFTLEtBQUssUUFBUTtBQUNsRSxjQUFHLEtBQUssUUFBUSxRQUFRO0FBQ3RCLGlCQUFLLEtBQUssSUFBSSxFQUFDLFNBQVMsR0FBRyxTQUFTLGVBQWMsQ0FBQyxFQUFFLFFBQVEsRUFBQyxTQUFTLEVBQUMsR0FBRyxLQUFLLFFBQVEsWUFBWTtBQUFBLFVBQzVHLE9BQWE7QUFDTCxpQkFBSyxLQUFLLElBQUksV0FBVyxjQUFjO0FBQUEsVUFDeEM7QUFDRCxlQUFLLEtBQUssUUFBUUEsR0FBRSxNQUFNLE1BQU0sQ0FBQyxLQUFLLEtBQU0sQ0FBQSxDQUFDO0FBQUEsUUFDOUM7QUFBQSxRQUVELE1BQU0sV0FBVztBQUNmLGVBQUssS0FBSyxRQUFRQSxHQUFFLE1BQU0sY0FBYyxDQUFDLEtBQUssS0FBTSxDQUFBLENBQUM7QUFDckQsY0FBSSxLQUFLO0FBQWEsaUJBQUssWUFBWSxPQUFNO0FBQzdDLGNBQUksUUFBUTtBQUNaLGNBQUcsS0FBSyxRQUFRLFFBQVE7QUFDdEIsaUJBQUssS0FBSyxRQUFRLEtBQUssUUFBUSxjQUFjLFdBQVk7QUFDdkQsb0JBQU0sS0FBSyxRQUFRQSxHQUFFLE1BQU0sYUFBYSxDQUFDLE1BQU0sS0FBTSxDQUFBLENBQUM7QUFBQSxZQUNoRSxDQUFTO0FBQUEsVUFDVCxPQUFhO0FBQ0wsaUJBQUssS0FBSyxLQUFLLEdBQUcsV0FBWTtBQUM1QixvQkFBTSxLQUFLLFFBQVFBLEdBQUUsTUFBTSxhQUFhLENBQUMsTUFBTSxLQUFNLENBQUEsQ0FBQztBQUFBLFlBQ2hFLENBQVM7QUFBQSxVQUNGO0FBQ0QsZUFBSyxLQUFLLFFBQVFBLEdBQUUsTUFBTSxPQUFPLENBQUMsS0FBSyxLQUFNLENBQUEsQ0FBQztBQUFBLFFBQy9DO0FBQUEsUUFFRCxhQUFhLFdBQVc7QUFDdEIsY0FBSSxDQUFDLEtBQUssUUFBUTtBQUFhO0FBQy9CLGVBQUssVUFBVSxLQUFLLFdBQVdBLEdBQUUsaUJBQWlCLEtBQUssUUFBUSxhQUFhLGtCQUFrQixFQUMzRixPQUFPLEtBQUssUUFBUSxXQUFXO0FBQ2xDLGVBQUssTUFBTSxPQUFPLEtBQUssT0FBTztBQUM5QixlQUFLLFFBQVE7UUFDZDtBQUFBLFFBRUQsYUFBYSxXQUFXO0FBQ3RCLGNBQUksS0FBSztBQUFTLGlCQUFLLFFBQVEsT0FBTTtBQUFBLFFBQ3RDO0FBQUE7QUFBQSxRQUdELE1BQU0sV0FBVztBQUNmLGlCQUFPLEVBQUUsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sVUFBVSxLQUFLLFVBQVUsU0FBUyxLQUFLLFNBQVMsU0FBUyxLQUFLO1FBQ3pHO0FBQUEsTUFDTDtBQUVFLE1BQUFBLEdBQUUsTUFBTSxRQUFRLFNBQVMsT0FBTztBQUM5QixZQUFJLENBQUNBLEdBQUUsTUFBTSxTQUFVO0FBQUU7QUFDekIsWUFBSTtBQUFPLGdCQUFNO0FBQ2pCLFlBQUksVUFBVTtBQUNkLGdCQUFRLE1BQUs7QUFDYixlQUFPLFFBQVE7QUFBQSxNQUNuQjtBQUdFLE1BQUFBLEdBQUUsTUFBTSxXQUFXLFdBQVk7QUFDN0IsZUFBTyxPQUFPLFNBQVM7QUFBQSxNQUMzQjtBQUVFLE1BQUFBLEdBQUUsTUFBTSxhQUFhO0FBRXJCLE1BQUFBLEdBQUUsTUFBTSxXQUFXO0FBQUEsUUFDakIsZUFBZTtBQUFBLFFBQ2YsYUFBYTtBQUFBLFFBQ2IsWUFBWTtBQUFBLFFBQ1osV0FBVztBQUFBLFFBQ1gsWUFBWTtBQUFBLFFBQ1osWUFBWTtBQUFBLFFBQ1osY0FBYztBQUFBLFFBQ2QsYUFBYTtBQUFBLFFBQ2IsYUFBYTtBQUFBLFFBQ2IsV0FBVztBQUFBLFFBQ1gsY0FBYztBQUFBO0FBQUEsUUFDZCxXQUFXO0FBQUE7QUFBQSxNQUNmO0FBR0UsTUFBQUEsR0FBRSxNQUFNLGVBQWU7QUFDdkIsTUFBQUEsR0FBRSxNQUFNLFFBQVE7QUFDaEIsTUFBQUEsR0FBRSxNQUFNLGNBQWM7QUFDdEIsTUFBQUEsR0FBRSxNQUFNLE9BQU87QUFDZixNQUFBQSxHQUFFLE1BQU0sZUFBZTtBQUN2QixNQUFBQSxHQUFFLE1BQU0sUUFBUTtBQUNoQixNQUFBQSxHQUFFLE1BQU0sY0FBYztBQUN0QixNQUFBQSxHQUFFLE1BQU0sWUFBWTtBQUNwQixNQUFBQSxHQUFFLE1BQU0sZUFBZTtBQUN2QixNQUFBQSxHQUFFLE1BQU0sWUFBWTtBQUNwQixNQUFBQSxHQUFFLE1BQU0sZ0JBQWdCO0FBRXhCLE1BQUFBLEdBQUUsR0FBRyxRQUFRLFNBQVMsU0FBUTtBQUM1QixZQUFJLEtBQUssV0FBVyxHQUFHO0FBQ3JCLGNBQUlBLEdBQUUsTUFBTSxNQUFNLE9BQU87QUFBQSxRQUMxQjtBQUNELGVBQU87QUFBQSxNQUNYO0FBR0UsTUFBQUEsR0FBRUUsU0FBUSxFQUFFLEdBQUcsZUFBZSx5QkFBeUJGLEdBQUUsTUFBTSxLQUFLO0FBQ3BFLE1BQUFBLEdBQUVFLFNBQVEsRUFBRSxHQUFHLGVBQWUsd0JBQXdCLFNBQVMsT0FBTztBQUNwRSxjQUFNLGVBQWM7QUFDcEIsUUFBQUYsR0FBRSxJQUFJLEVBQUU7TUFDWixDQUFHO0FBQUEsSUFDSCxDQUFDO0FBQUE7Ozs7QUNuUHdCLEtBQUMsU0FBUyxHQUFFLEdBQUU7QUFBNEcsTUFBQUksUUFBQSxVQUFlLEVBQUVMLEdBQWlCO0FBQUEsSUFBVyxFQUFFTSxnQkFBSyxTQUFTLEdBQUU7QUFBQyxlQUFTLEVBQUVDLElBQUU7QUFBQyxhQUFLLFlBQVcsS0FBSyxjQUFZLE1BQUssS0FBSyxZQUFXLEtBQUssT0FBT0EsRUFBQztBQUFBLE1BQUM7QUFBQyxlQUFTLEVBQUVDLElBQUVDLElBQUU7QUFBQyxZQUFJQyxLQUFFO0FBQUcsZUFBTyxFQUFFLEtBQUtGLElBQUUsU0FBU0QsSUFBRUksSUFBRTtBQUFDLGlCQUFPLFdBQVNGLEdBQUVGLEVBQUMsS0FBR0MsR0FBRUQsRUFBQyxNQUFJRSxHQUFFRixFQUFDLEtBQUdHLEtBQUUsT0FBRyxTQUFJO0FBQUEsUUFBTSxDQUFDLEdBQUVBO0FBQUEsTUFBQztBQUFDLGVBQVMsRUFBRUYsSUFBRTtBQUFDLFlBQUlDLEtBQUVELEdBQUUsS0FBSyxJQUFJLEdBQUVFLEtBQUVELEtBQUUsRUFBRSxPQUFPLFNBQVMsZUFBZUEsRUFBQyxJQUFFO0FBQUssZUFBT0MsS0FBRUEsT0FBSUYsR0FBRSxDQUFDLElBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxTQUFTLE1BQUtBLEdBQUUsQ0FBQyxDQUFDO0FBQUEsTUFBQztBQUFDLGVBQVMsSUFBRztBQUFDLFlBQUcsQ0FBQztBQUFFLGlCQUFNO0FBQUcsWUFBSUQsS0FBRSxFQUFFLFNBQVMsUUFBTSxFQUFFLFNBQVMsaUJBQWdCQyxLQUFFRCxHQUFFLE9BQU1FLEtBQUUsY0FBYUMsS0FBRSxDQUFDLE9BQU0sVUFBUyxTQUFRLEtBQUksSUFBSTtBQUFFLFlBQUcsWUFBVSxPQUFPRixHQUFFQyxFQUFDO0FBQUUsaUJBQU07QUFBRyxRQUFBQSxLQUFFQSxHQUFFLE9BQU8sQ0FBQyxFQUFFLFlBQWEsSUFBQ0EsR0FBRSxPQUFPLENBQUM7QUFBRSxpQkFBUUUsS0FBRSxHQUFFQSxLQUFFRCxHQUFFLFFBQU9DO0FBQUksY0FBRyxZQUFVLE9BQU9ILEdBQUVFLEdBQUVDLEVBQUMsSUFBRUYsRUFBQztBQUFFLG1CQUFNO0FBQUcsZUFBTTtBQUFBLE1BQUU7QUFBQyxVQUFJLElBQUUsRUFBQyxXQUFVLFFBQU8sbUJBQWtCLEtBQUksU0FBUSxNQUFLLGVBQWMsT0FBRyxnQkFBZSxPQUFHLE9BQU0sTUFBRyxPQUFNLEtBQUksWUFBVyxDQUFDLEtBQUksR0FBRyxHQUFFLGNBQWEsTUFBSyxnQkFBZSxNQUFLLGVBQWMsTUFBSyxlQUFjLE1BQUssZ0JBQWUsTUFBSyxPQUFNLEdBQUUsYUFBWSxPQUFHLFVBQVMsT0FBRyxRQUFPLE1BQUssU0FBUSxDQUFDLFNBQVMsR0FBRSxvQkFBbUIsT0FBRyxhQUFZLFFBQU8saUJBQWdCLE1BQUcsT0FBTSxJQUFHLE9BQU0sR0FBRSxpQkFBZ0IsS0FBSSxhQUFZLE9BQUcsY0FBYSxPQUFHLFNBQVEsU0FBUSxjQUFhLEVBQUMsT0FBTSxPQUFHLFlBQVcsT0FBRyxhQUFZLE9BQUcsUUFBTyxPQUFHLEtBQUksT0FBRyxZQUFXLE1BQUUsR0FBRSxhQUFZLEVBQUMsT0FBTSxPQUFHLFlBQVcsT0FBRyxLQUFJLE9BQUcsWUFBVyxNQUFFLEdBQUUsaUJBQWdCLFVBQVMsUUFBTyxRQUFPLEdBQUUsSUFBRSxlQUFhLE9BQU8sU0FBTyxTQUFPLE1BQUssSUFBRSxFQUFDLG9CQUFtQixFQUFFLENBQUMsS0FBRyxFQUFFLGtCQUFpQixLQUFHLEVBQUUsaUJBQWUsRUFBRSxvQkFBb0IsRUFBRSxpQkFBZSxFQUFFLFVBQVUsa0JBQWlCLGdCQUFlLEVBQUMsR0FBRyxJQUFHLE9BQUcsUUFBTyxTQUFRLFFBQU8sRUFBQyxHQUFFLElBQUUsV0FBVTtBQUFDLGFBQUssb0JBQWtCLEVBQUUsRUFBRSxHQUFFLEtBQUssbUJBQWlCLEVBQUUsQ0FBRSxDQUFBLEdBQUUsS0FBSyx1QkFBcUIsQ0FBRSxHQUFDLEtBQUssWUFBVSxDQUFBLEdBQUcsS0FBSyxPQUFLO0FBQUEsTUFBQztBQUFFLFFBQUUsWUFBVSxFQUFDLFVBQVMsU0FBU0QsSUFBRUMsSUFBRUMsSUFBRTtBQUFDLFlBQUcsQ0FBQ0QsR0FBRUMsRUFBQyxHQUFFO0FBQUMsY0FBSUMsS0FBRSxXQUFVO0FBQUEsVUFBQTtBQUFHLFVBQUFBLEdBQUUsWUFBVUg7QUFBRSxjQUFJSSxLQUFFLElBQUlEO0FBQUUsVUFBQUMsR0FBRSxVQUFRQSxHQUFFLE9BQU9ILEVBQUMsR0FBRSxFQUFFLEtBQUtELElBQUUsU0FBU0QsSUFBRUMsSUFBRTtBQUFDLGlCQUFHRCxHQUFFLFFBQVEsSUFBSSxNQUFJRSxHQUFFRixFQUFDLElBQUUsRUFBRSxTQUFPLFFBQVEsSUFBSSxTQUFPQSxLQUFFLG9CQUFrQkcsS0FBRSx5REFBeUQsS0FBR0QsR0FBRUYsRUFBQyxJQUFFLFdBQVU7QUFBQyxxQkFBT0ssR0FBRUwsRUFBQyxFQUFFLE1BQU1LLElBQUUsTUFBTSxVQUFVLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFBQSxZQUFDLEdBQUVILEdBQUVGLEVBQUMsRUFBRSxVQUFRSztBQUFBLFVBQUcsQ0FBQyxHQUFFSCxHQUFFQyxFQUFDLElBQUVFO0FBQUEsUUFBQztBQUFDLGVBQU87QUFBQSxNQUFJLEdBQUUsYUFBWSxTQUFTTCxJQUFFO0FBQUMsZUFBTyxFQUFFLFNBQU9BLElBQUU7QUFBQSxNQUFJLEdBQUUsV0FBVSxTQUFTQSxJQUFFO0FBQUMsZUFBTyxJQUFJLEVBQUVBLEVBQUM7QUFBQSxNQUFDLEdBQUUsTUFBSyxXQUFVO0FBQUMsZUFBTyxLQUFLLGtCQUFrQixJQUFJLE1BQU0sS0FBSyxtQkFBa0IsTUFBTSxVQUFVLE1BQU0sTUFBTSxTQUFTLENBQUMsR0FBRTtBQUFBLE1BQUksR0FBRSxLQUFJLFdBQVU7QUFBQyxlQUFPLEtBQUssa0JBQWtCLEdBQUcsTUFBTSxLQUFLLG1CQUFrQixNQUFNLFVBQVUsTUFBTSxNQUFNLFNBQVMsQ0FBQyxHQUFFO0FBQUEsTUFBSSxHQUFFLE1BQUssV0FBVTtBQUFDLGVBQU8sS0FBSyxrQkFBa0IsSUFBSSxNQUFNLEtBQUssbUJBQWtCLE1BQU0sVUFBVSxNQUFNLE1BQU0sU0FBUyxDQUFDLEdBQUU7QUFBQSxNQUFJLEdBQUUsU0FBUSxTQUFTQyxJQUFFO0FBQUMsWUFBSUMsS0FBRTtBQUFLLFlBQUcsWUFBVSxPQUFPRCxJQUFFO0FBQUMsY0FBSUUsS0FBRUYsSUFBRUcsS0FBRTtBQUFLLGlCQUFPRCxHQUFFLFFBQVEsR0FBRyxJQUFFLElBQUVDLEtBQUVGLEdBQUUsVUFBVUMsRUFBQyxJQUFFLEVBQUUsS0FBS0QsR0FBRSxXQUFVLFNBQVNGLElBQUVDLElBQUU7QUFBQyxtQkFBT0EsR0FBRSxLQUFLLFVBQVVBLEdBQUUsS0FBSyxTQUFPRSxHQUFFLFNBQU8sQ0FBQyxLQUFHLE1BQUlBLE1BQUdDLEtBQUVILElBQUUsU0FBSTtBQUFBLFVBQU0sQ0FBQyxHQUFFRztBQUFBLFFBQUM7QUFBQyxZQUFHSCxHQUFFLEtBQUssUUFBUSxHQUFHLElBQUU7QUFBRSxnQkFBTSxJQUFJLE1BQU0sNEJBQTRCO0FBQUUsZUFBT0MsR0FBRSxVQUFVRCxHQUFFLElBQUksSUFBRUEsSUFBRUEsR0FBRSxRQUFNQyxHQUFFLFNBQVNELEdBQUUsTUFBS0MsSUFBRUQsR0FBRSxJQUFJLEdBQUU7QUFBQSxNQUFJLEdBQUUsVUFBUyxXQUFVO0FBQUMsWUFBSUQsS0FBRSxNQUFNLFVBQVUsTUFBTSxNQUFNLFNBQVM7QUFBRSxlQUFNLFlBQVUsT0FBT0EsR0FBRSxDQUFDLE1BQUlBLEdBQUUsQ0FBQyxJQUFFLEVBQUMsTUFBS0EsR0FBRSxDQUFDLEVBQUMsSUFBRyxLQUFLLGtCQUFrQixRQUFRLE1BQU0sS0FBSyxtQkFBa0JBLEVBQUMsR0FBRSxLQUFLLGlCQUFpQixRQUFRLE1BQU0sS0FBSyxrQkFBaUJBLEVBQUMsR0FBRTtBQUFBLE1BQUksR0FBRSxXQUFVLFNBQVNDLElBQUU7QUFBQyxZQUFJQyxLQUFFLENBQUUsR0FBQ0MsS0FBRUYsTUFBRztBQUFpQixlQUFPLEVBQUVFLEVBQUMsRUFBRSxLQUFLLFdBQVU7QUFBQyxjQUFJRixLQUFFLEVBQUUsSUFBSSxHQUFFRSxLQUFFRixHQUFFLEtBQUssZ0JBQWdCO0FBQUUsVUFBQUUsTUFBRyxFQUFFLEtBQUtBLElBQUUsU0FBU0gsSUFBRUcsSUFBRTtBQUFDLFlBQUFELEdBQUUsS0FBS0QsR0FBRSxLQUFLRSxFQUFDLENBQUM7QUFBQSxVQUFDLENBQUM7QUFBQSxRQUFDLENBQUMsR0FBRUQ7QUFBQSxNQUFDLEdBQUUsaUJBQWdCLFdBQVU7QUFBQyxlQUFPLEtBQUs7QUFBQSxNQUFvQixHQUFFLEtBQUksV0FBVTtBQUFDLGVBQU8sS0FBSyxpQkFBaUIsSUFBSSxNQUFNLEtBQUssa0JBQWlCLE1BQU0sVUFBVSxNQUFNLE1BQU0sU0FBUyxDQUFDLEdBQUU7QUFBQSxNQUFJLEdBQUUsSUFBRyxXQUFVO0FBQUMsZUFBTyxLQUFLLGlCQUFpQixHQUFHLE1BQU0sS0FBSyxrQkFBaUIsTUFBTSxVQUFVLE1BQU0sTUFBTSxTQUFTLENBQUMsR0FBRTtBQUFBLE1BQUksR0FBRSxLQUFJLFdBQVU7QUFBQyxlQUFPLEtBQUssaUJBQWlCLElBQUksTUFBTSxLQUFLLGtCQUFpQixNQUFNLFVBQVUsTUFBTSxNQUFNLFNBQVMsQ0FBQyxHQUFFO0FBQUEsTUFBSSxHQUFFLFNBQVEsU0FBU0QsSUFBRTtBQUFDLFlBQUlDLEtBQUVELEtBQUVBLEtBQUUsTUFBSTtBQUFHLGVBQU8sRUFBRUMsS0FBRSxnQkFBZ0IsRUFBRSxRQUFPO0FBQUEsTUFBRSxHQUFFLGFBQVksU0FBU0QsSUFBRTtBQUFDLGVBQU8sRUFBRSxPQUFPLEdBQUVBLEVBQUMsR0FBRTtBQUFBLE1BQUksR0FBRSxnQkFBZSxXQUFVO0FBQUMsZUFBTyxLQUFLLGlCQUFpQixlQUFlLE1BQU0sS0FBSyxrQkFBaUIsTUFBTSxVQUFVLE1BQU0sTUFBTSxTQUFTLENBQUMsR0FBRTtBQUFBLE1BQUksRUFBQyxHQUFFLEVBQUUsY0FBWSxJQUFJLEtBQUUsRUFBRSxjQUFZLFNBQVNBLElBQUVDLElBQUU7QUFBQyxhQUFLLGNBQVksRUFBQyxPQUFNLElBQUcsTUFBSyxDQUFBLEVBQUUsR0FBRSxLQUFLLGVBQWMsS0FBSyxXQUFVLEtBQUssY0FBYSxLQUFLLGNBQVksT0FBRyxLQUFLLG9CQUFrQixFQUFFLENBQUEsQ0FBRSxHQUFFLEtBQUssbUJBQWlCLEVBQUUsQ0FBRSxDQUFBLEdBQUUsS0FBSyxZQUFVLE1BQUcsS0FBSyxvQkFBbUIsS0FBSyxZQUFXLEtBQUssZ0JBQWUsS0FBSyxjQUFZLGlCQUFlLEtBQUssTUFBTSxNQUFJLEtBQUssT0FBTSxDQUFFLEdBQUUsS0FBSyxXQUFVLEtBQUssa0JBQWlCLEtBQUssd0JBQXNCLE9BQUcsS0FBSyxtQkFBaUIsQ0FBQSxHQUFHLEtBQUssVUFBUSxVQUFTLEtBQUssYUFBVyxFQUFDLE9BQU0sQ0FBQSxHQUFHLE1BQUssS0FBSSxHQUFFLEtBQUssZ0JBQWMsSUFBRyxLQUFLLFlBQVUsTUFBSyxLQUFLLFVBQVMsS0FBSyxXQUFVLEtBQUssT0FBT0QsSUFBRUMsRUFBQztBQUFBLE1BQUMsR0FBRSxFQUFFLFlBQVksWUFBVSxFQUFDLFFBQU8sU0FBU0QsSUFBRUMsSUFBRTtBQUFDLFlBQUlDLEtBQUU7QUFBSyxZQUFHQSxHQUFFLFdBQVMsRUFBRUYsRUFBQyxHQUFFRSxHQUFFLFlBQVUsRUFBRSxPQUFPLE1BQUcsQ0FBRSxHQUFDLEdBQUVELEVBQUMsR0FBRUMsR0FBRSxtQkFBa0IsQ0FBQyxFQUFFLE1BQUksRUFBRSxNQUFJQSxHQUFFLFVBQVUsT0FBTTtBQUFDLGNBQUlDLEtBQUU7QUFBSyxjQUFHLFdBQVNELEdBQUUsU0FBUyxLQUFLLDBCQUEwQixNQUFJQyxLQUFFRCxHQUFFLFNBQVMsS0FBSyxPQUFPLEdBQUUsV0FBU0MsT0FBSUEsS0FBRSxPQUFNRCxHQUFFLFNBQVMsS0FBSyw0QkFBMkJDLEVBQUMsSUFBRyxTQUFPRCxHQUFFLFVBQVU7QUFBUSxZQUFBQSxHQUFFLGFBQWFBLEdBQUUsVUFBVSxPQUFPO0FBQUEsZUFBTTtBQUFDLGdCQUFJRSxJQUFFQyxLQUFFSCxHQUFFLFNBQVMsS0FBSyxzQkFBc0I7QUFBRSxZQUFBRyxPQUFJRCxLQUFFLEVBQUVDLEVBQUMsSUFBR0QsTUFBR0EsR0FBRSxDQUFDLElBQUVGLEdBQUUsYUFBYUUsR0FBRSxNQUFPLENBQUEsSUFBRUYsR0FBRSxhQUFhQyxFQUFDO0FBQUEsVUFBQztBQUFDLFVBQUFELEdBQUUsU0FBUyxXQUFXLE9BQU8sRUFBRSxTQUFTLGVBQWUsR0FBRUEsR0FBRSxtQkFBa0JBLEdBQUUsWUFBVyxHQUFHLEVBQUUsS0FBS0EsR0FBRSxVQUFVLFNBQVEsU0FBU0gsSUFBRUMsSUFBRTtBQUFDLFlBQUFFLEdBQUUsTUFBTUYsRUFBQztBQUFBLFVBQUMsQ0FBQyxHQUFFLEVBQUUsc0JBQW9CLEVBQUUsRUFBRSxPQUFPLFNBQVMsSUFBSSxFQUFFLEdBQUcsZUFBYUUsR0FBRSxjQUFZLGdCQUFlLFNBQVNILElBQUU7QUFBQyxZQUFBRyxHQUFFLGtCQUFrQkgsRUFBQztBQUFBLFVBQUMsQ0FBQyxHQUFFRyxHQUFFLElBQUksV0FBVSxXQUFVO0FBQUMsWUFBQUEsR0FBRSxpQkFBZ0I7QUFBQSxVQUFFLENBQUMsRUFBRSxJQUFJLGdCQUFlLFNBQVNILElBQUU7QUFBQyxZQUFBRyxHQUFFLGlCQUFlSCxHQUFFO0FBQUEsVUFBUSxDQUFDO0FBQUEsUUFBQztBQUFNLFVBQUFHLEdBQUUsVUFBVSxXQUFTO0FBQUEsTUFBRSxHQUFFLGlCQUFnQixXQUFVO0FBQUMsWUFBSUgsS0FBRSxNQUFLQyxLQUFFRCxHQUFFLFVBQVUsS0FBSyxzQkFBc0IsR0FBRUUsS0FBRUYsR0FBRSxXQUFVRyxLQUFFLFNBQVNILElBQUU7QUFBQyxVQUFBRSxLQUFFRjtBQUFBLFFBQUM7QUFBRSxlQUFPQSxHQUFFLFNBQVMsRUFBQyxNQUFLLFVBQVMsU0FBUUEsR0FBRSxXQUFVLFFBQU9HLEdBQUMsQ0FBQyxHQUFFSCxHQUFFLFVBQVUsbUJBQWlCRSxLQUFFRixHQUFFLFVBQVUsZUFBZSxLQUFLQSxJQUFFQSxJQUFFLEVBQUMsUUFBT0EsR0FBRSxTQUFTLENBQUMsRUFBQyxHQUFFQSxHQUFFLFNBQVMsSUFBRyxZQUFVLE9BQU9FLE1BQUdGLEdBQUUsVUFBVSxnQkFBY0MsR0FBRSxNQUFLLEVBQUcsT0FBT0MsRUFBQyxJQUFFRCxHQUFFLEtBQUtDLEVBQUMsR0FBRUY7QUFBQSxNQUFDLEdBQUUsY0FBYSxTQUFTQyxJQUFFO0FBQUMsZUFBT0EsY0FBYSxLQUFHLEtBQUssVUFBVSxtQkFBaUJBLEtBQUVBLEdBQUUsTUFBTSxJQUFFLElBQUcsS0FBSyxZQUFVQSxJQUFFLEtBQUssU0FBUyxFQUFDLE1BQUssV0FBVSxTQUFRQSxHQUFDLENBQUMsR0FBRTtBQUFBLE1BQUksR0FBRSxnQkFBZSxXQUFVO0FBQUMsY0FBTSxJQUFJLE1BQU0sc0VBQXNFO0FBQUEsTUFBQyxHQUFFLFlBQVcsV0FBVTtBQUFDLFlBQUlBLEtBQUUsTUFBS0MsS0FBRUQsR0FBRSxVQUFTRSxLQUFFRixHQUFFLFNBQVMsR0FBRyxNQUFNO0FBQUUsWUFBR0UsSUFBRTtBQUFDLGNBQUlDLEtBQUVILEdBQUUsU0FBUyxTQUFTLEtBQUssTUFBTTtBQUFFLFVBQUFDLEtBQUUsRUFBRSxrQkFBZ0JFLEtBQUUsSUFBSTtBQUFBLFFBQUM7QUFBQyxZQUFJRyxLQUFFTCxHQUFFLENBQUMsRUFBRSxzQkFBdUIsR0FBQ0csS0FBRSxFQUFFLEVBQUUsT0FBTyxRQUFRLEdBQUVDLEtBQUUsRUFBRSxFQUFFLE1BQU0sR0FBRUUsS0FBRU4sSUFBRU8sS0FBRSxFQUFDLFdBQVUsRUFBQyxVQUFTLE1BQUssUUFBTyxLQUFJLEdBQUUsVUFBUyxFQUFDLE1BQUssRUFBQyxRQUFPSixHQUFFLE9BQVEsR0FBQyxPQUFNQSxHQUFFLFFBQU8sRUFBQyxHQUFFLFFBQU8sRUFBQyxRQUFPLEVBQUMsTUFBSyxFQUFFLE9BQU8sV0FBUyxFQUFFLE9BQU8sU0FBUyxnQkFBZ0IsWUFBVyxLQUFJLEVBQUUsT0FBTyxXQUFTLEVBQUUsT0FBTyxTQUFTLGdCQUFnQixVQUFTLEdBQUUsTUFBSyxFQUFDLFFBQU9DLEdBQUUsT0FBTSxHQUFHLE9BQU1BLEdBQUUsUUFBTyxFQUFDLEdBQUUsUUFBTyxFQUFDLGNBQWEsT0FBRyxRQUFPLENBQUEsR0FBRyxNQUFLLEVBQUMsUUFBT0MsR0FBRSxTQUFPQSxHQUFFLEtBQUksT0FBTUEsR0FBRSxRQUFNQSxHQUFFLEtBQUksR0FBRSxhQUFZSixLQUFFRCxHQUFFLENBQUMsSUFBRSxNQUFLLGNBQWEsRUFBQyxRQUFPSyxHQUFFLFFBQU8sTUFBS0EsR0FBRSxNQUFLLE9BQU1BLEdBQUUsT0FBTSxLQUFJQSxHQUFFLElBQUcsRUFBQyxFQUFDO0FBQUUsWUFBR0osSUFBRTtBQUFDLGNBQUksSUFBRUYsR0FBRSxTQUFTLEtBQUssT0FBTyxHQUFFLElBQUVBLEdBQUUsU0FBUyxLQUFLLFFBQVE7QUFBRSxjQUFHLE1BQUksSUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsSUFBSSxHQUFFLFNBQVNELElBQUVDLElBQUU7QUFBQyxjQUFFQSxFQUFDLElBQUUsU0FBU0QsRUFBQztBQUFBLFVBQUMsQ0FBQyxJQUFHLGFBQVc7QUFBRSxvQkFBTyxHQUFDO0FBQUEsY0FBRSxLQUFJO0FBQVMsb0JBQUksSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxJQUFFLEdBQUUsSUFBRSxJQUFFO0FBQUUsZ0JBQUFTLEdBQUUsT0FBTyxLQUFLLFNBQU8sSUFBRSxHQUFFQSxHQUFFLE9BQU8sS0FBSyxRQUFNQSxHQUFFLE9BQU8sS0FBSyxRQUFPQSxHQUFFLE9BQU8sYUFBYSxRQUFNLEdBQUVBLEdBQUUsT0FBTyxhQUFhLE9BQUs7QUFBRTtBQUFBLGNBQU0sS0FBSTtBQUFPLG9CQUFJLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDO0FBQUUsZ0JBQUFBLEdBQUUsT0FBTyxLQUFLLFNBQU8sSUFBRSxHQUFFQSxHQUFFLE9BQU8sS0FBSyxRQUFNLElBQUUsR0FBRUEsR0FBRSxPQUFPLGFBQWEsUUFBTSxHQUFFQSxHQUFFLE9BQU8sYUFBYSxPQUFLO0FBQUU7QUFBQSxjQUFNLEtBQUk7QUFBTyx5QkFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxRQUFPLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxLQUFJO0FBQUMsc0JBQUksSUFBRSxFQUFFLENBQUM7QUFBRSw0QkFBUSxLQUFHLElBQUUsTUFBSSxJQUFFLEdBQUUsTUFBSSxNQUFJLElBQUUsS0FBSSxJQUFFLE1BQUksSUFBRSxJQUFHLElBQUUsVUFBUSxJQUFFLE1BQUksSUFBRSxHQUFFLEtBQUcsTUFBSSxJQUFFLEtBQUksSUFBRSxNQUFJLElBQUUsSUFBRyxJQUFFO0FBQUEsZ0JBQU87QUFBQyxnQkFBQUEsR0FBRSxPQUFPLEtBQUssU0FBTyxJQUFFLEdBQUVBLEdBQUUsT0FBTyxLQUFLLFFBQU0sSUFBRSxHQUFFQSxHQUFFLE9BQU8sYUFBYSxRQUFNLEdBQUVBLEdBQUUsT0FBTyxhQUFhLE9BQUs7QUFBQSxZQUFDO0FBQUEsUUFBQztBQUFDLFlBQUksSUFBRSxTQUFTVCxJQUFFO0FBQUMsVUFBQVMsR0FBRSxPQUFPLEtBQUssU0FBT1QsR0FBRSxRQUFPUyxHQUFFLE9BQU8sYUFBYSxPQUFLVCxHQUFFLE1BQUtTLEdBQUUsT0FBTyxhQUFhLE1BQUlULEdBQUUsS0FBSVMsR0FBRSxPQUFPLEtBQUssUUFBTVQsR0FBRTtBQUFBLFFBQUs7QUFBRSxhQUFJQyxHQUFFLFNBQVMsRUFBQyxNQUFLLFlBQVcsTUFBSyxHQUFFLFVBQVMsRUFBQyxRQUFPUSxHQUFFLE9BQU8sS0FBSyxRQUFPLE1BQUtBLEdBQUUsT0FBTyxhQUFhLE1BQUssS0FBSUEsR0FBRSxPQUFPLGFBQWEsS0FBSSxPQUFNQSxHQUFFLE9BQU8sS0FBSyxNQUFLLEVBQUMsQ0FBQyxHQUFFQSxHQUFFLE9BQU8sYUFBYSxRQUFNQSxHQUFFLE9BQU8sYUFBYSxPQUFLQSxHQUFFLE9BQU8sS0FBSyxPQUFNQSxHQUFFLE9BQU8sYUFBYSxTQUFPQSxHQUFFLE9BQU8sYUFBYSxNQUFJQSxHQUFFLE9BQU8sS0FBSyxRQUFPQSxHQUFFLE9BQU8sT0FBTyxPQUFLQSxHQUFFLE9BQU8sYUFBYSxPQUFLQSxHQUFFLE9BQU8sT0FBTyxNQUFLQSxHQUFFLE9BQU8sT0FBTyxNQUFJQSxHQUFFLE9BQU8sYUFBYSxNQUFJQSxHQUFFLE9BQU8sT0FBTyxLQUFJQSxHQUFFLE9BQU8sT0FBTyxTQUFPQSxHQUFFLE9BQU8sT0FBTyxNQUFJQSxHQUFFLE9BQU8sS0FBSyxRQUFPQSxHQUFFLE9BQU8sT0FBTyxRQUFNQSxHQUFFLE9BQU8sT0FBTyxPQUFLQSxHQUFFLE9BQU8sS0FBSyxPQUFNQSxHQUFFLFVBQVUsV0FBUyxFQUFDLFFBQU8sRUFBQyxRQUFPQSxHQUFFLFNBQVMsS0FBSyxTQUFPQSxHQUFFLE9BQU8sT0FBTyxRQUFPLE9BQU1BLEdBQUUsU0FBUyxLQUFLLE1BQUssR0FBRSxNQUFLLEVBQUMsUUFBT0EsR0FBRSxTQUFTLEtBQUssUUFBTyxPQUFNQSxHQUFFLE9BQU8sT0FBTyxLQUFJLEdBQUUsT0FBTSxFQUFDLFFBQU9BLEdBQUUsU0FBUyxLQUFLLFFBQU8sT0FBTUEsR0FBRSxTQUFTLEtBQUssUUFBTUEsR0FBRSxPQUFPLE9BQU8sTUFBSyxHQUFFLEtBQUksRUFBQyxRQUFPQSxHQUFFLE9BQU8sT0FBTyxLQUFJLE9BQU1BLEdBQUUsU0FBUyxLQUFLLE1BQUssRUFBQyxHQUFFQSxHQUFFLFVBQVUsU0FBTyxFQUFDLFFBQU8sRUFBQyxRQUFPLEtBQUssSUFBSUEsR0FBRSxPQUFPLEtBQUssU0FBTyxLQUFLLElBQUlBLEdBQUUsT0FBTyxhQUFhLFFBQU8sQ0FBQyxHQUFFLENBQUMsR0FBRSxPQUFNQSxHQUFFLE9BQU8sS0FBSyxNQUFLLEdBQUUsTUFBSyxFQUFDLFFBQU9BLEdBQUUsT0FBTyxLQUFLLFFBQU8sT0FBTSxLQUFLLElBQUlBLEdBQUUsT0FBTyxhQUFhLE1BQUssQ0FBQyxFQUFDLEdBQUUsT0FBTSxFQUFDLFFBQU9BLEdBQUUsT0FBTyxLQUFLLFFBQU8sT0FBTSxLQUFLLElBQUlBLEdBQUUsT0FBTyxLQUFLLFFBQU0sS0FBSyxJQUFJQSxHQUFFLE9BQU8sYUFBYSxPQUFNLENBQUMsR0FBRSxDQUFDLEVBQUMsR0FBRSxLQUFJLEVBQUMsUUFBTyxLQUFLLElBQUlBLEdBQUUsT0FBTyxhQUFhLEtBQUksQ0FBQyxHQUFFLE9BQU1BLEdBQUUsT0FBTyxLQUFLLE1BQUssRUFBQyxHQUFFLFVBQVFELEdBQUUsQ0FBQyxFQUFFLFFBQVEsWUFB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QSxHQUFFLE1BQU07QUFBQSxVQUFBLEtBQUk7QUFBQSxVQUFPLEtBQUk7QUFBUSxZQUFBQSxHQUFFLE1BQU0sTUFBSSxLQUFLLE1BQU1BLEdBQUUsU0FBT0EsR0FBRSxLQUFLLFNBQU8sQ0FBQztBQUFFO0FBQUEsVUFBTSxLQUFJO0FBQUEsVUFBUyxLQUFJO0FBQU0sWUFBQUEsR0FBRSxNQUFNLE9BQUssS0FBSyxNQUFNQSxHQUFFLFNBQU9BLEdBQUUsS0FBSyxRQUFNLENBQUM7QUFBQSxRQUFDO0FBQUMsZ0JBQU9BLEdBQUU7VUFBTSxLQUFJO0FBQU8sWUFBQUEsR0FBRSxNQUFNLE9BQUtELEdBQUUsSUFBSSxPQUFPLGFBQWEsT0FBS0MsR0FBRSxVQUFVO0FBQU07QUFBQSxVQUFNLEtBQUk7QUFBUSxZQUFBQSxHQUFFLE1BQU0sT0FBS0QsR0FBRSxJQUFJLE9BQU8sYUFBYSxRQUFNQyxHQUFFLFNBQVM7QUFBVztBQUFBLFVBQU0sS0FBSTtBQUFNLFlBQUFBLEdBQUUsTUFBTSxNQUFJRCxHQUFFLElBQUksT0FBTyxhQUFhLE1BQUlDLEdBQUUsVUFBVTtBQUFPO0FBQUEsVUFBTSxLQUFJO0FBQVMsWUFBQUEsR0FBRSxNQUFNLE1BQUlELEdBQUUsSUFBSSxPQUFPLGFBQWEsU0FBT0MsR0FBRSxTQUFTO0FBQUEsUUFBUTtBQUFDLG9CQUFVQSxHQUFFLFlBQVUsU0FBT0EsR0FBRSxRQUFNLFlBQVVBLEdBQUUsT0FBS0EsR0FBRSxNQUFNLE9BQUssSUFBRUQsR0FBRSxJQUFJLE9BQU8sYUFBYSxRQUFNLEtBQUssVUFBVSxtQkFBaUIsSUFBRUMsR0FBRSxNQUFNLE9BQUssSUFBRUEsR0FBRSxNQUFNLE9BQUtELEdBQUUsSUFBSSxPQUFPLGFBQWEsUUFBTSxLQUFLLFVBQVUsa0JBQWdCLElBQUVDLEdBQUUsTUFBTSxPQUFLRCxHQUFFLElBQUksT0FBTyxLQUFLLFFBQU1DLEdBQUUsS0FBSyxVQUFRRCxHQUFFLElBQUksT0FBTyxhQUFhLE9BQUssS0FBSyxVQUFVLG1CQUFpQkEsR0FBRSxJQUFJLE9BQU8sS0FB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QUFFO0FBQUMsYUFBSyxZQUFVLEtBQUssTUFBTSxTQUFTLEtBQUssU0FBUyxRQUFRLElBQUksR0FBRSxLQUFLLFVBQVEsTUFBRyxLQUFLLElBQUksUUFBUSxVQUFRLEtBQUssSUFBSSxHQUFFLEtBQUssSUFBSSxRQUFRLFlBQVUsS0FBSyxNQUFLLEtBQUssT0FBTyxHQUFFLEtBQUssV0FBWSxHQUFDQSxHQUFFLEtBQUssU0FBUyxNQUFNLElBQUUsS0FBSyxRQUFRLEtBQUssU0FBUyxNQUFNLEVBQUUsSUFBRyxLQUFLLFFBQVEsS0FBSyxTQUFTLE1BQU0sRUFBRSxJQUFJLFNBQVNBLElBQUUsRUFBRSxPQUFPLEVBQUMsV0FBUyxXQUFVO0FBQUMsZUFBSyxJQUFJLFFBQVEsV0FBUyxLQUFLLElBQUksR0FBRSxLQUFLLFNBQVMsV0FBUyxLQUFLLFNBQVMsSUFBSSxXQUFTLEtBQUssT0FBSyxXQUFVO0FBQUMsaUJBQUssS0FBSTtBQUFBLFVBQUUsR0FBRSxLQUFLLElBQUksQ0FBQztBQUFBLFFBQUMsR0FBRSxLQUFLLElBQUksRUFBQyxHQUFFLEtBQUssZ0JBQWdCLENBQUMsR0FBRSxLQUFLLFNBQVMsV0FBUyxLQUFLLFNBQVMsU0FBUyxFQUFDLFNBQVEsRUFBQyxHQUFFLEVBQUUsT0FBTyxFQUFDLFNBQVEsUUFBTyxHQUFFLEtBQUssZ0JBQWdCLENBQUM7QUFBQSxNQUFFLEdBQUUsTUFBSyxXQUFVO0FBQUMsYUFBSyxZQUFVLEtBQUssTUFBTSxZQUFZLEtBQUssU0FBUyxRQUFRLElBQUksR0FBRSxLQUFLLFVBQVEsT0FBRyxLQUFLLElBQUksUUFBUSxVQUFRLEtBQUssSUFBSSxHQUFFLEtBQUssSUFBSSxRQUFRLFlBQVUsS0FBSyxNQUFLLEtBQUssT0FBTyxHQUFFLEtBQUssUUFBUSxLQUFLLFNBQVMsTUFBTSxFQUFFLElBQUksU0FBUyxNQUFNLEVBQUUsU0FBUyxXQUFVLEVBQUUsT0FBTyxFQUFDLFdBQVMsV0FBVTtBQUFDLGVBQUssSUFBSSxRQUFRLFlBQVUsS0FBSyxJQUFJO0FBQUEsUUFBQyxHQUFF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LFNBQVMsTUFBTTtBQUNqQixjQUFJLGNBQWM2QixPQUFNO0FBQ3RCLGdCQUFJLE9BQU8sU0FBUyxHQUFHO0FBQ3JCO1lBQ2QsT0FBbUI7QUFDTDtZQUNEO0FBQUEsVUFDYixPQUFpQjtBQUNMLHdCQUFZQTtBQUNaLGdCQUFJLENBQUMsT0FBTyxTQUFTLEdBQUc7QUFDdEI7WUFDRDtBQUFBLFVBQ0Y7QUFBQSxRQUNYLENBQVM7QUFBQSxNQUNULENBQUs7QUFBQSxJQUNMO0FBRUU3QixRQUFFLGVBQWUsRUFBRTtBQUNuQkEsUUFBRSxVQUFVLEVBQUUsWUFBWTtBQUFBLE1BQ3hCLE9BQU87QUFBQSxNQUNQLGFBQWE7QUFBQSxRQUNYLE9BQU87QUFBQSxRQUNQLFlBQVk7QUFBQSxRQUNaLFlBQVk7QUFBQSxNQUNiO0FBQUEsTUFDRCxZQUFZLENBQUMsR0FBRyxHQUFJO0FBQUEsSUFDeEIsQ0FBRztBQUVEQSxRQUFFLG1CQUFtQixFQUFFLEdBQUcsU0FBUyxNQUFNO0FBQ3ZDQSxVQUFFLG1CQUFtQixFQUFFO0lBQzNCLENBQUc7QUFBQSxFQUVILENBQUM7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDEwLDE4LDIxLDI0LDI2XX0=