/* release date : 2015-08-05 */
(function(a) {
var b = document.getElementsByTagName("script"),
c = b[b.length - 1];
c && /[\?&]jindo=([^&]+)/.test(c.src) && (a = RegExp.$1);
var d = window[a];
d.Timer = d.$Class({
$init: function() {
this._nTimer = null, this._nLatest = null, this._nRemained = 0, this._nDelay = null, this._fRun = null, this._bIsRunning = !1
},
start: function(a, b) {
return this.abort(), this._nRemained = 0, this._nDelay = b, this._fRun = a, this._bIsRunning = !0, this._nLatest = this._getTime(), this.fireEvent("wait"), this._excute(this._nDelay, !1), !0
},
isRunning: function() {
return this._bIsRunning
},
_getTime: function() {
return (new Date).getTime()
},
_clearTimer: function() {
var a = !1;
return this._nTimer && (clearTimeout(this._nTimer), this._bIsRunning = !1, a = !0), this._nTimer = null, a
},
abort: function() {
return this._clearTimer(), this._fRun ? (this.fireEvent("abort"), this._fRun = null, !0) : !1
},
pause: function() {
var a = this._getTime() - this._nLatest;
return this._nRemained = Math.max(this._nDelay - a, 0), this._clearTimer()
},
_excute: function(a, b) {
var c = this;
this._clearTimer(), this._bIsRunning = !0;
var d = function(a) {
if (!c._fRun) return;
if (c._nTimer || a) {
c.fireEvent("run");
var b = c._fRun();
c._nLatest = c._getTime();
if (!b) {
a || clearTimeout(c._nTimer), c._nTimer = null, c._bIsRunning = !1, c.fireEvent("end");
return
}
c.fireEvent("wait"), c._excute(c._nDelay, !1)
}
};
a > -1 ? this._nTimer = setTimeout(d, a) : d(!0)
},
resume: function() {
return !this._fRun || this.isRunning() ? !1 : (this._bIsRunning = !0, this.fireEvent("wait"), this._excute(this._nRemained, !0), this._nRemained = 0, !0)
}
}).extend(d.Component), d.LayerManager = d.$Class({
_bIsActivating: !1,
_bIsHiding: !1,
_bIsShowing: !1,
_aLink: null,
$init: function(a, b) {
this.option({
sCheckEvent: "click",
nCheckDelay: 100,
nShowDelay: 0,
nHideDelay: 100
}), this.option(b || {}), this.setLayer(a), this._aLink = [], this._oShowTimer = new d.Timer, this._oHideTimer = new d.Timer, this._oEventTimer = new d.Timer, this._wfOnEvent = d.$Fn(this._onEvent, this), this.getVisible(), this.activate()
},
_onActivate: function() {
this._wfOnEvent.attach(document, this.option("sCheckEvent"))
},
_onDeactivate: function() {
this._wfOnEvent.detach(document, this.option("sCheckEvent"))
},
getVisible: function() {
return this._wel.visible()
},
_check: function(a) {
var b = d.$Element(a);
for (var c = 0, e, f; e = this._aLink[c]; c++) {
f = d.$Element(e);
if (f) {
e = f.$value();
if (e && (a == e || b.isChildOf(e))) return !0
}
}
return !1
},
_find: function(a) {
for (var b = 0, c; c = this._aLink[b]; b++)
if (c == a) return b;
return -1
},
getLayer: function() {
return this._el
},
setLayer: function(a) {
return this._el = d.$(a), this._wel = d.$Element(a), this
},
getLinks: function() {
return this._aLink
},
setLinks: function(a) {
return this._aLink = d.$A(a).unique().$value(), this
},
link: function(a) {
if (arguments.length > 1) {
for (var b = 0, c = arguments.length; b < c; b++) this.link(arguments[b]);
return this
}
return this._find(a) != -1 ? this : (this._aLink.push(a), this)
},
unlink: function(a) {
if (arguments.length > 1) {
for (var b = 0, c = arguments.length; b < c; b++) this.unlink(arguments[b]);
return this
}
var d = this._find(a);
return d > -1 && this._aLink.splice(d, 1), this
},
_fireEventBeforeShow: function() {
return this.fireEvent("beforeShow", {
elLayer: this.getLayer(),
aLinkedElement: this.getLinks()
})
},
_fireEventShow: function() {
this._bIsShowing = !1, this.fireEvent("show", {
elLayer: this.getLayer(),
aLinkedElement: this.getLinks()
})
},
_fireEventBeforeHide: function() {
var a = this.fireEvent("beforeHide", {
elLayer: this.getLayer(),
aLinkedElement: this.getLinks()
});
return a || (this._bIsHiding = !1), a
},
_fireEventHide: function() {
this._bIsHiding = !1, this.fireEvent("hide", {
elLayer: this.getLayer(),
aLinkedElement: this.getLinks()
})
},
_show: function(a, b) {
var c = this;
this._oEventTimer.abort(), this._bIsShowing = !0, this._bIsHiding = !1, b <= 0 && c._oHideTimer.abort(), this._oShowTimer.start(function() {
a()
}, b)
},
_hide: function(a, b) {
var c = this;
this._bIsShowing = !1, this._bIsHiding = !0, b <= 0 && c._oShowTimer.abort(), this._oHideTimer.start(function() {
a()
}, b)
},
show: function(a) {
typeof a == "undefined" && (a = this.option("nShowDelay"));
var b = this;
return this._show(function() {
b.getVisible() || b._fireEventBeforeShow() && (b._wel.show(), b._fireEventShow())
}, a), this
},
hide: function(a) {
typeof a == "undefined" && (a = this.option("nHideDelay"));
var b = this;
return this._hide(function() {
b.getVisible() && b._fireEventBeforeHide() && (b._wel.hide(), b._fireEventHide())
}, a), this
},
toggle: function(a) {
return !this.getVisible() || this._bIsHiding ? this.show(a || this.option("nShowDelay")) : this.hide(a || this.option("nHideDelay")), this
},
_onEvent: function(a) {
var b = a.element,
c = this;
this._oEventTimer.start(function() {
!c._bIsHiding && c.getVisible() && (c._check(b) ? c._bIsShowing || (c.fireEvent("ignore", {
sCheckEvent: c.option("sCheckEvent")
}), c._oHideTimer.abort(), c._bIsHiding = !1) : typeof b.tagName != "undefined" && c.hide())
}, this.option("nCheckDelay"))
}
}).extend(d.UIComponent)
})("jindo"), typeof nhn == "undefined" && (nhn = {}), nhn.search = nhn.search || {}, nhn.search.spellingCheck = nhn.search.spellingcheck || {}, nhn.search.spellingCheck.SpellingCheck = jindo.$Class({
$init: function(a) {
a && this.initalize(a)
},
initalize: function(a) {
this.option({
containerID: "_content",
selecter: {
original: "div.check_area > textarea",
result: "div.check_area > p",
btnCheck: "div.check_area > div.btn_section > a.check",
btnReset: "div.check_area > div.btn_section > a.delete",
cntOriginal: "div.txt_area > span.txt_info > em",
btnShare: "div.txt_area > input:nth-child(2)",
layerShare: "spi_layer_spellingcheck"
}
}), this.option(a || {}), this._assignElement(), this._configure(), this._attachEvent()
},
_assignElement: function() {
var a = this.option("selecter");
this._elCtn = jindo.$(this.option("containerID")), this._htElement = {}, this._htElement.original = jindo.$$.getSingle(a.original, this._elCtn), this._htElement.wResult = jindo.$Element(jindo.$$.getSingle(a.result, this._elCtn)), this._htElement.btnCheck = jindo.$$.getSingle(a.btnCheck, this._elCtn), this._htElement.btnReset = jindo.$$.getSingle(a.btnReset, this._elCtn), this._htElement.wCntOriginal = jindo.$Element(jindo.$$.getSingle(a.cntOriginal, this._elCtn)), this._htElement.btnShare = jindo.$$.getSingle(a.btnShare, this._elCtn)
},
_configure: function() {
var a = this.option("selecter");
this._msg = {
placeholder: "맞춤법 검사를 원하는 단어나 문장을 직접 입력 또는 붙여 넣기 해주세요.",
ready: "<span class='check_none2'>맞춤법 검사가 실행중입니다. 잠시만 기다려주세요</span>",
same: "<span class='check_none'>※ 교정된 내용이 없습니다.</span>",
timeout: "<span class='check_none2'>검사를 수행할 수 없습니다. 입력하신 문장의 길이를 줄이거나, 단어와 단어 사이에 스페이스를 추가하여 다시 시도해주세요.</span>",
fail: "<span class='check_none2'>검사를 수행할 수 없습니다. 입력하신 문장의 길이를 줄이거나, 단어와 단어 사이에 스페이스를 추가하여 다시 시도해주세요.</span>"
}, this._sOriginal = "", this._sResult = "", this._nMaxlength = 500, jindo.$Element(this._htElement.original).addClass("txt_gray")
},
_attachEvent: function() {
var a = jindo.$Fn(this._onInputOriginalHandler, this);
a.attach(this._htElement.original, "keydown");
var b = jindo.$Fn(this._onInputOriginalHandler, this);
b.attach(this._htElement.original, "input");
var c = jindo.$Fn(this._onFocusOriginalHandler, this);
c.attach(this._htElement.original, "focus");
var d = jindo.$Fn(this._onFocusOriginalHandler, this);
d.attach(this._htElement.original, "blur");
var e = jindo.$Fn(this._onClickBtnCheckHandler, this);
e.attach(this._htElement.btnCheck, "click");
var f = jindo.$Fn(this._onClickBtnResetHandler, this);
f.attach(this._htElement.btnReset, "click")
},
_onFocusOriginalHandler: function(a) {
var b = jindo.$Element(this._htElement.original);
a.type == "focus" ? b.text() == this._msg.placeholder && (b.text(""), b.removeClass("txt_gray")) : a.type == "blur" && b.text() == "" && (b.text(this._msg.placeholder), this._countInput(), b.addClass("txt_gray"))
},
_onInputOriginalHandler: function(a) {
this._countInput()
},
_onClickBtnCheckHandler: function(a) {
this._countInput();
var b = jindo.$Element(this._htElement.btnCheck);
if (!b.hasClass("dimd")) {
var c = jindo.$Element(this._htElement.original),
d = c.text();
if (d != this._msg.placeholder)
if (d == "") c.text(this._msg.placeholder);
else {
this._htElement.wResult.html(this._msg.ready), this._sOriginal = d, this._sResult = "";
var e = {
q: this._sOriginal
};
this._requestData(this.option("API").checker, e, this._onLoadResult, this._onTimeOut), b.addClass("dimd")
}
}
},
_onClickBtnResetHandler: function(a) {
var b = jindo.$Element(this._htElement.original),
c = jindo.$Element(this._htElement.btnCheck);
b.text(this._msg.placeholder), this._countInput(), this._htElement.wResult.text(""), b.addClass("txt_gray"), c.hasClass("dimd") && c.removeClass("dimd")
},
_countInput: function() {
var a = jindo.$Element(this._htElement.original),
b = a.text(),
c = b == this._msg.placeholder ? 0 : b.length;
c > this._nMaxlength && (a.text(b.substring(0, this._nMaxlength)), c = this._nMaxlength), this._htElement.wCntOriginal.text(c)
},
_requestData: function(a, b, c, d) {
jindo.$Ajax(a, {
type: "jsonp",
method: "get",
callbackid: "spellingCheck",
timeout: 3,
onload: jindo.$Fn(c, this).bind(),
ontimeout: jindo.$Fn(d, this).bind()
}).request(b)
},
_onLoadResult: function(a) {
var b, c = a.json();
jindo.$Element(this._htElement.btnCheck).removeClass("dimd");
try {
b = c.message.result.html, b == "" ? b = this._msg.fail : c.message.result.errata_count === 0 && (b += this._msg.same)
} catch (d) {
b = this._msg.fail
}
this._htElement.wResult.html(b)
},
_onTimeOut: function() {
jindo.$Element(this._htElement.btnCheck).removeClass("dimd"), this._htElement.wResult.html(this._msg.timeout)
}
}).extend(jindo.Component)
LyogcmVsZWFzZSBkYXRlIDogMjAxNS0wOC0wNSAqLwooZnVuY3Rpb24oYSkgewogICAgdmFyIGIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksCiAgICAgICAgYyA9IGJbYi5sZW5ndGggLSAxXTsKICAgIGMgJiYgL1tcPyZdamluZG89KFteJl0rKS8udGVzdChjLnNyYykgJiYgKGEgPSBSZWdFeHAuJDEpOwogICAgdmFyIGQgPSB3aW5kb3dbYV07CiAgICBkLlRpbWVyID0gZC4kQ2xhc3MoewogICAgICAgICRpbml0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5fblRpbWVyID0gbnVsbCwgdGhpcy5fbkxhdGVzdCA9IG51bGwsIHRoaXMuX25SZW1haW5lZCA9IDAsIHRoaXMuX25EZWxheSA9IG51bGwsIHRoaXMuX2ZSdW4gPSBudWxsLCB0aGlzLl9iSXNSdW5uaW5nID0gITEKICAgICAgICB9LAogICAgICAgIHN0YXJ0OiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFib3J0KCksIHRoaXMuX25SZW1haW5lZCA9IDAsIHRoaXMuX25EZWxheSA9IGIsIHRoaXMuX2ZSdW4gPSBhLCB0aGlzLl9iSXNSdW5uaW5nID0gITAsIHRoaXMuX25MYXRlc3QgPSB0aGlzLl9nZXRUaW1lKCksIHRoaXMuZmlyZUV2ZW50KCJ3YWl0IiksIHRoaXMuX2V4Y3V0ZSh0aGlzLl9uRGVsYXksICExKSwgITAKICAgICAgICB9LAogICAgICAgIGlzUnVubmluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iSXNSdW5uaW5nCiAgICAgICAgfSwKICAgICAgICBfZ2V0VGltZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAobmV3IERhdGUpLmdldFRpbWUoKQogICAgICAgIH0sCiAgICAgICAgX2NsZWFyVGltZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYSA9ICExOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fblRpbWVyICYmIChjbGVhclRpbWVvdXQodGhpcy5fblRpbWVyKSwgdGhpcy5fYklzUnVubmluZyA9ICExLCBhID0gITApLCB0aGlzLl9uVGltZXIgPSBudWxsLCBhCiAgICAgICAgfSwKICAgICAgICBhYm9ydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbGVhclRpbWVyKCksIHRoaXMuX2ZSdW4gPyAodGhpcy5maXJlRXZlbnQoImFib3J0IiksIHRoaXMuX2ZSdW4gPSBudWxsLCAhMCkgOiAhMQogICAgICAgIH0sCiAgICAgICAgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYSA9IHRoaXMuX2dldFRpbWUoKSAtIHRoaXMuX25MYXRlc3Q7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uUmVtYWluZWQgPSBNYXRoLm1heCh0aGlzLl9uRGVsYXkgLSBhLCAwKSwgdGhpcy5fY2xlYXJUaW1lcigpCiAgICAgICAgfSwKICAgICAgICBfZXhjdXRlOiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgIHZhciBjID0gdGhpczsKICAgICAgICAgICAgdGhpcy5fY2xlYXJUaW1lcigpLCB0aGlzLl9iSXNSdW5uaW5nID0gITA7CiAgICAgICAgICAgIHZhciBkID0gZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgaWYgKCFjLl9mUnVuKSByZXR1cm47CiAgICAgICAgICAgICAgICBpZiAoYy5fblRpbWVyIHx8IGEpIHsKICAgICAgICAgICAgICAgICAgICBjLmZpcmVFdmVudCgicnVuIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBjLl9mUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgYy5fbkxhdGVzdCA9IGMuX2dldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSB8fCBjbGVhclRpbWVvdXQoYy5fblRpbWVyKSwgYy5fblRpbWVyID0gbnVsbCwgYy5fYklzUnVubmluZyA9ICExLCBjLmZpcmVFdmVudCgiZW5kIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjLmZpcmVFdmVudCgid2FpdCIpLCBjLl9leGN1dGUoYy5fbkRlbGF5LCAhMSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgYSA+IC0xID8gdGhpcy5fblRpbWVyID0gc2V0VGltZW91dChkLCBhKSA6IGQoITApCiAgICAgICAgfSwKICAgICAgICByZXN1bWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuX2ZSdW4gfHwgdGhpcy5pc1J1bm5pbmcoKSA/ICExIDogKHRoaXMuX2JJc1J1bm5pbmcgPSAhMCwgdGhpcy5maXJlRXZlbnQoIndhaXQiKSwgdGhpcy5fZXhjdXRlKHRoaXMuX25SZW1haW5lZCwgITApLCB0aGlzLl9uUmVtYWluZWQgPSAwLCAhMCkKICAgICAgICB9CiAgICB9KS5leHRlbmQoZC5Db21wb25lbnQpLCBkLkxheWVyTWFuYWdlciA9IGQuJENsYXNzKHsKICAgICAgICBfYklzQWN0aXZhdGluZzogITEsCiAgICAgICAgX2JJc0hpZGluZzogITEsCiAgICAgICAgX2JJc1Nob3dpbmc6ICExLAogICAgICAgIF9hTGluazogbnVsbCwKICAgICAgICAkaW5pdDogZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICB0aGlzLm9wdGlvbih7CiAgICAgICAgICAgICAgICBzQ2hlY2tFdmVudDogImNsaWNrIiwKICAgICAgICAgICAgICAgIG5DaGVja0RlbGF5OiAxMDAsCiAgICAgICAgICAgICAgICBuU2hvd0RlbGF5OiAwLAogICAgICAgICAgICAgICAgbkhpZGVEZWxheTogMTAwCiAgICAgICAgICAgIH0pLCB0aGlzLm9wdGlvbihiIHx8IHt9KSwgdGhpcy5zZXRMYXllcihhKSwgdGhpcy5fYUxpbmsgPSBbXSwgdGhpcy5fb1Nob3dUaW1lciA9IG5ldyBkLlRpbWVyLCB0aGlzLl9vSGlkZVRpbWVyID0gbmV3IGQuVGltZXIsIHRoaXMuX29FdmVudFRpbWVyID0gbmV3IGQuVGltZXIsIHRoaXMuX3dmT25FdmVudCA9IGQuJEZuKHRoaXMuX29uRXZlbnQsIHRoaXMpLCB0aGlzLmdldFZpc2libGUoKSwgdGhpcy5hY3RpdmF0ZSgpCiAgICAgICAgfSwKICAgICAgICBfb25BY3RpdmF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX3dmT25FdmVudC5hdHRhY2goZG9jdW1lbnQsIHRoaXMub3B0aW9uKCJzQ2hlY2tFdmVudCIpKQogICAgICAgIH0sCiAgICAgICAgX29uRGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX3dmT25FdmVudC5kZXRhY2goZG9jdW1lbnQsIHRoaXMub3B0aW9uKCJzQ2hlY2tFdmVudCIpKQogICAgICAgIH0sCiAgICAgICAgZ2V0VmlzaWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWwudmlzaWJsZSgpCiAgICAgICAgfSwKICAgICAgICBfY2hlY2s6IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgdmFyIGIgPSBkLiRFbGVtZW50KGEpOwogICAgICAgICAgICBmb3IgKHZhciBjID0gMCwgZSwgZjsgZSA9IHRoaXMuX2FMaW5rW2NdOyBjKyspIHsKICAgICAgICAgICAgICAgIGYgPSBkLiRFbGVtZW50KGUpOwogICAgICAgICAgICAgICAgaWYgKGYpIHsKICAgICAgICAgICAgICAgICAgICBlID0gZi4kdmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiAoYSA9PSBlIHx8IGIuaXNDaGlsZE9mKGUpKSkgcmV0dXJuICEwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICExCiAgICAgICAgfSwKICAgICAgICBfZmluZDogZnVuY3Rpb24oYSkgewogICAgICAgICAgICBmb3IgKHZhciBiID0gMCwgYzsgYyA9IHRoaXMuX2FMaW5rW2JdOyBiKyspCiAgICAgICAgICAgICAgICBpZiAoYyA9PSBhKSByZXR1cm4gYjsKICAgICAgICAgICAgcmV0dXJuIC0xCiAgICAgICAgfSwKICAgICAgICBnZXRMYXllcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbAogICAgICAgIH0sCiAgICAgICAgc2V0TGF5ZXI6IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsID0gZC4kKGEpLCB0aGlzLl93ZWwgPSBkLiRFbGVtZW50KGEpLCB0aGlzCiAgICAgICAgfSwKICAgICAgICBnZXRMaW5rczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hTGluawogICAgICAgIH0sCiAgICAgICAgc2V0TGlua3M6IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FMaW5rID0gZC4kQShhKS51bmlxdWUoKS4kdmFsdWUoKSwgdGhpcwogICAgICAgIH0sCiAgICAgICAgbGluazogZnVuY3Rpb24oYSkgewogICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGIgPSAwLCBjID0gYXJndW1lbnRzLmxlbmd0aDsgYiA8IGM7IGIrKykgdGhpcy5saW5rKGFyZ3VtZW50c1tiXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maW5kKGEpICE9IC0xID8gdGhpcyA6ICh0aGlzLl9hTGluay5wdXNoKGEpLCB0aGlzKQogICAgICAgIH0sCiAgICAgICAgdW5saW5rOiBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgYiA9IDAsIGMgPSBhcmd1bWVudHMubGVuZ3RoOyBiIDwgYzsgYisrKSB0aGlzLnVubGluayhhcmd1bWVudHNbYl0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZCA9IHRoaXMuX2ZpbmQoYSk7CiAgICAgICAgICAgIHJldHVybiBkID4gLTEgJiYgdGhpcy5fYUxpbmsuc3BsaWNlKGQsIDEpLCB0aGlzCiAgICAgICAgfSwKICAgICAgICBfZmlyZUV2ZW50QmVmb3JlU2hvdzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmVFdmVudCgiYmVmb3JlU2hvdyIsIHsKICAgICAgICAgICAgICAgIGVsTGF5ZXI6IHRoaXMuZ2V0TGF5ZXIoKSwKICAgICAgICAgICAgICAgIGFMaW5rZWRFbGVtZW50OiB0aGlzLmdldExpbmtzKCkKICAgICAgICAgICAgfSkKICAgICAgICB9LAogICAgICAgIF9maXJlRXZlbnRTaG93OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5fYklzU2hvd2luZyA9ICExLCB0aGlzLmZpcmVFdmVudCgic2hvdyIsIHsKICAgICAgICAgICAgICAgIGVsTGF5ZXI6IHRoaXMuZ2V0TGF5ZXIoKSwKICAgICAgICAgICAgICAgIGFMaW5rZWRFbGVtZW50OiB0aGlzLmdldExpbmtzKCkKICAgICAgICAgICAgfSkKICAgICAgICB9LAogICAgICAgIF9maXJlRXZlbnRCZWZvcmVIaWRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGEgPSB0aGlzLmZpcmVFdmVudCgiYmVmb3JlSGlkZSIsIHsKICAgICAgICAgICAgICAgIGVsTGF5ZXI6IHRoaXMuZ2V0TGF5ZXIoKSwKICAgICAgICAgICAgICAgIGFMaW5rZWRFbGVtZW50OiB0aGlzLmdldExpbmtzKCkKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBhIHx8ICh0aGlzLl9iSXNIaWRpbmcgPSAhMSksIGEKICAgICAgICB9LAogICAgICAgIF9maXJlRXZlbnRIaWRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5fYklzSGlkaW5nID0gITEsIHRoaXMuZmlyZUV2ZW50KCJoaWRlIiwgewogICAgICAgICAgICAgICAgZWxMYXllcjogdGhpcy5nZXRMYXllcigpLAogICAgICAgICAgICAgICAgYUxpbmtlZEVsZW1lbnQ6IHRoaXMuZ2V0TGlua3MoKQogICAgICAgICAgICB9KQogICAgICAgIH0sCiAgICAgICAgX3Nob3c6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLl9vRXZlbnRUaW1lci5hYm9ydCgpLCB0aGlzLl9iSXNTaG93aW5nID0gITAsIHRoaXMuX2JJc0hpZGluZyA9ICExLCBiIDw9IDAgJiYgYy5fb0hpZGVUaW1lci5hYm9ydCgpLCB0aGlzLl9vU2hvd1RpbWVyLnN0YXJ0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgYSgpCiAgICAgICAgICAgIH0sIGIpCiAgICAgICAgfSwKICAgICAgICBfaGlkZTogZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICB2YXIgYyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuX2JJc1Nob3dpbmcgPSAhMSwgdGhpcy5fYklzSGlkaW5nID0gITAsIGIgPD0gMCAmJiBjLl9vU2hvd1RpbWVyLmFib3J0KCksIHRoaXMuX29IaWRlVGltZXIuc3RhcnQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBhKCkKICAgICAgICAgICAgfSwgYikKICAgICAgICB9LAogICAgICAgIHNob3c6IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgdHlwZW9mIGEgPT0gInVuZGVmaW5lZCIgJiYgKGEgPSB0aGlzLm9wdGlvbigiblNob3dEZWxheSIpKTsKICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2hvdyhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGIuZ2V0VmlzaWJsZSgpIHx8IGIuX2ZpcmVFdmVudEJlZm9yZVNob3coKSAmJiAoYi5fd2VsLnNob3coKSwgYi5fZmlyZUV2ZW50U2hvdygpKQogICAgICAgICAgICB9LCBhKSwgdGhpcwogICAgICAgIH0sCiAgICAgICAgaGlkZTogZnVuY3Rpb24oYSkgewogICAgICAgICAgICB0eXBlb2YgYSA9PSAidW5kZWZpbmVkIiAmJiAoYSA9IHRoaXMub3B0aW9uKCJuSGlkZURlbGF5IikpOwogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oaWRlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgYi5nZXRWaXNpYmxlKCkgJiYgYi5fZmlyZUV2ZW50QmVmb3JlSGlkZSgpICYmIChiLl93ZWwuaGlkZSgpLCBiLl9maXJlRXZlbnRIaWRlKCkpCiAgICAgICAgICAgIH0sIGEpLCB0aGlzCiAgICAgICAgfSwKICAgICAgICB0b2dnbGU6IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmdldFZpc2libGUoKSB8fCB0aGlzLl9iSXNIaWRpbmcgPyB0aGlzLnNob3coYSB8fCB0aGlzLm9wdGlvbigiblNob3dEZWxheSIpKSA6IHRoaXMuaGlkZShhIHx8IHRoaXMub3B0aW9uKCJuSGlkZURlbGF5IikpLCB0aGlzCiAgICAgICAgfSwKICAgICAgICBfb25FdmVudDogZnVuY3Rpb24oYSkgewogICAgICAgICAgICB2YXIgYiA9IGEuZWxlbWVudCwKICAgICAgICAgICAgICAgIGMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLl9vRXZlbnRUaW1lci5zdGFydChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICFjLl9iSXNIaWRpbmcgJiYgYy5nZXRWaXNpYmxlKCkgJiYgKGMuX2NoZWNrKGIpID8gYy5fYklzU2hvd2luZyB8fCAoYy5maXJlRXZlbnQoImlnbm9yZSIsIHsKICAgICAgICAgICAgICAgICAgICBzQ2hlY2tFdmVudDogYy5vcHRpb24oInNDaGVja0V2ZW50IikKICAgICAgICAgICAgICAgIH0pLCBjLl9vSGlkZVRpbWVyLmFib3J0KCksIGMuX2JJc0hpZGluZyA9ICExKSA6IHR5cGVvZiBiLnRhZ05hbWUgIT0gInVuZGVmaW5lZCIgJiYgYy5oaWRlKCkpCiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9uKCJuQ2hlY2tEZWxheSIpKQogICAgICAgIH0KICAgIH0pLmV4dGVuZChkLlVJQ29tcG9uZW50KQp9KSgiamluZG8iKSwgdHlwZW9mIG5obiA9PSAidW5kZWZpbmVkIiAmJiAobmhuID0ge30pLCBuaG4uc2VhcmNoID0gbmhuLnNlYXJjaCB8fCB7fSwgbmhuLnNlYXJjaC5zcGVsbGluZ0NoZWNrID0gbmhuLnNlYXJjaC5zcGVsbGluZ2NoZWNrIHx8IHt9LCBuaG4uc2VhcmNoLnNwZWxsaW5nQ2hlY2suU3BlbGxpbmdDaGVjayA9IGppbmRvLiRDbGFzcyh7CiAgICAkaW5pdDogZnVuY3Rpb24oYSkgewogICAgICAgIGEgJiYgdGhpcy5pbml0YWxpemUoYSkKICAgIH0sCiAgICBpbml0YWxpemU6IGZ1bmN0aW9uKGEpIHsKICAgICAgICB0aGlzLm9wdGlvbih7CiAgICAgICAgICAgIGNvbnRhaW5lcklEOiAiX2NvbnRlbnQiLAogICAgICAgICAgICBzZWxlY3RlcjogewogICAgICAgICAgICAgICAgb3JpZ2luYWw6ICJkaXYuY2hlY2tfYXJlYSA+IHRleHRhcmVhIiwKICAgICAgICAgICAgICAgIHJlc3VsdDogImRpdi5jaGVja19hcmVhID4gcCIsCiAgICAgICAgICAgICAgICBidG5DaGVjazogImRpdi5jaGVja19hcmVhID4gZGl2LmJ0bl9zZWN0aW9uID4gYS5jaGVjayIsCiAgICAgICAgICAgICAgICBidG5SZXNldDogImRpdi5jaGVja19hcmVhID4gZGl2LmJ0bl9zZWN0aW9uID4gYS5kZWxldGUiLAogICAgICAgICAgICAgICAgY250T3JpZ2luYWw6ICJkaXYudHh0X2FyZWEgPiBzcGFuLnR4dF9pbmZvID4gZW0iLAogICAgICAgICAgICAgICAgYnRuU2hhcmU6ICJkaXYudHh0X2FyZWEgPiBpbnB1dDpudGgtY2hpbGQoMikiLAogICAgICAgICAgICAgICAgbGF5ZXJTaGFyZTogInNwaV9sYXllcl9zcGVsbGluZ2NoZWNrIgogICAgICAgICAgICB9CiAgICAgICAgfSksIHRoaXMub3B0aW9uKGEgfHwge30pLCB0aGlzLl9hc3NpZ25FbGVtZW50KCksIHRoaXMuX2NvbmZpZ3VyZSgpLCB0aGlzLl9hdHRhY2hFdmVudCgpCiAgICB9LAogICAgX2Fzc2lnbkVsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gdGhpcy5vcHRpb24oInNlbGVjdGVyIik7CiAgICAgICAgdGhpcy5fZWxDdG4gPSBqaW5kby4kKHRoaXMub3B0aW9uKCJjb250YWluZXJJRCIpKSwgdGhpcy5faHRFbGVtZW50ID0ge30sIHRoaXMuX2h0RWxlbWVudC5vcmlnaW5hbCA9IGppbmRvLiQkLmdldFNpbmdsZShhLm9yaWdpbmFsLCB0aGlzLl9lbEN0biksIHRoaXMuX2h0RWxlbWVudC53UmVzdWx0ID0gamluZG8uJEVsZW1lbnQoamluZG8uJCQuZ2V0U2luZ2xlKGEucmVzdWx0LCB0aGlzLl9lbEN0bikpLCB0aGlzLl9odEVsZW1lbnQuYnRuQ2hlY2sgPSBqaW5kby4kJC5nZXRTaW5nbGUoYS5idG5DaGVjaywgdGhpcy5fZWxDdG4pLCB0aGlzLl9odEVsZW1lbnQuYnRuUmVzZXQgPSBqaW5kby4kJC5nZXRTaW5nbGUoYS5idG5SZXNldCwgdGhpcy5fZWxDdG4pLCB0aGlzLl9odEVsZW1lbnQud0NudE9yaWdpbmFsID0gamluZG8uJEVsZW1lbnQoamluZG8uJCQuZ2V0U2luZ2xlKGEuY250T3JpZ2luYWwsIHRoaXMuX2VsQ3RuKSksIHRoaXMuX2h0RWxlbWVudC5idG5TaGFyZSA9IGppbmRvLiQkLmdldFNpbmdsZShhLmJ0blNoYXJlLCB0aGlzLl9lbEN0bikKICAgIH0sCiAgICBfY29uZmlndXJlOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHRoaXMub3B0aW9uKCJzZWxlY3RlciIpOwogICAgICAgIHRoaXMuX21zZyA9IHsKICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICLrp57stqTrspUg6rKA7IKs66W8IOybkO2VmOuKlCDri6jslrTrgpgg66y47J6l7J2EIOyngeygkSDsnoXroKUg65iQ64qUIOu2meyXrCDrhKPquLAg7ZW07KO87IS47JqULiIsCiAgICAgICAgICAgIHJlYWR5OiAiPHNwYW4gY2xhc3M9J2NoZWNrX25vbmUyJz7rp57stqTrspUg6rKA7IKs6rCAIOyLpO2WieykkeyeheuLiOuLpC4g7J6g7Iuc66eMIOq4sOuLpOugpOyjvOyEuOyalDwvc3Bhbj4iLAogICAgICAgICAgICBzYW1lOiAiPHNwYW4gY2xhc3M9J2NoZWNrX25vbmUnPuKAuyDqtZDsoJXrkJwg64K07Jqp7J20IOyXhuyKteuLiOuLpC48L3NwYW4+IiwKICAgICAgICAgICAgdGltZW91dDogIjxzcGFuIGNsYXNzPSdjaGVja19ub25lMic+6rKA7IKs66W8IOyImO2Wie2VoCDsiJgg7JeG7Iq164uI64ukLiDsnoXroKXtlZjsi6Ag66y47J6l7J2YIOq4uOydtOulvCDspITsnbTqsbDrgpgsIOuLqOyWtOyZgCDri6jslrQg7IKs7J207JeQIOyKpO2OmOydtOyKpOulvCDstpTqsIDtlZjsl6wg64uk7IucIOyLnOuPhO2VtOyjvOyEuOyalC48L3NwYW4+IiwKICAgICAgICAgICAgZmFpbDogIjxzcGFuIGNsYXNzPSdjaGVja19ub25lMic+6rKA7IKs66W8IOyImO2Wie2VoCDsiJgg7JeG7Iq164uI64ukLiDsnoXroKXtlZjsi6Ag66y47J6l7J2YIOq4uOydtOulvCDspITsnbTqsbDrgpgsIOuLqOyWtOyZgCDri6jslrQg7IKs7J207JeQIOyKpO2OmOydtOyKpOulvCDstpTqsIDtlZjsl6wg64uk7IucIOyLnOuPhO2VtOyjvOyEuOyalC48L3NwYW4+IgogICAgICAgIH0sIHRoaXMuX3NPcmlnaW5hbCA9ICIiLCB0aGlzLl9zUmVzdWx0ID0gIiIsIHRoaXMuX25NYXhsZW5ndGggPSA1MDAsIGppbmRvLiRFbGVtZW50KHRoaXMuX2h0RWxlbWVudC5vcmlnaW5hbCkuYWRkQ2xhc3MoInR4dF9ncmF5IikKICAgIH0sCiAgICBfYXR0YWNoRXZlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gamluZG8uJEZuKHRoaXMuX29uSW5wdXRPcmlnaW5hbEhhbmRsZXIsIHRoaXMpOwogICAgICAgIGEuYXR0YWNoKHRoaXMuX2h0RWxlbWVudC5vcmlnaW5hbCwgImtleWRvd24iKTsKICAgICAgICB2YXIgYiA9IGppbmRvLiRGbih0aGlzLl9vbklucHV0T3JpZ2luYWxIYW5kbGVyLCB0aGlzKTsKICAgICAgICBiLmF0dGFjaCh0aGlzLl9odEVsZW1lbnQub3JpZ2luYWwsICJpbnB1dCIpOwogICAgICAgIHZhciBjID0gamluZG8uJEZuKHRoaXMuX29uRm9jdXNPcmlnaW5hbEhhbmRsZXIsIHRoaXMpOwogICAgICAgIGMuYXR0YWNoKHRoaXMuX2h0RWxlbWVudC5vcmlnaW5hbCwgImZvY3VzIik7CiAgICAgICAgdmFyIGQgPSBqaW5kby4kRm4odGhpcy5fb25Gb2N1c09yaWdpbmFsSGFuZGxlciwgdGhpcyk7CiAgICAgICAgZC5hdHRhY2godGhpcy5faHRFbGVtZW50Lm9yaWdpbmFsLCAiYmx1ciIpOwogICAgICAgIHZhciBlID0gamluZG8uJEZuKHRoaXMuX29uQ2xpY2tCdG5DaGVja0hhbmRsZXIsIHRoaXMpOwogICAgICAgIGUuYXR0YWNoKHRoaXMuX2h0RWxlbWVudC5idG5DaGVjaywgImNsaWNrIik7CiAgICAgICAgdmFyIGYgPSBqaW5kby4kRm4odGhpcy5fb25DbGlja0J0blJlc2V0SGFuZGxlciwgdGhpcyk7CiAgICAgICAgZi5hdHRhY2godGhpcy5faHRFbGVtZW50LmJ0blJlc2V0LCAiY2xpY2siKQogICAgfSwKICAgIF9vbkZvY3VzT3JpZ2luYWxIYW5kbGVyOiBmdW5jdGlvbihhKSB7CiAgICAgICAgdmFyIGIgPSBqaW5kby4kRWxlbWVudCh0aGlzLl9odEVsZW1lbnQub3JpZ2luYWwpOwogICAgICAgIGEudHlwZSA9PSAiZm9jdXMiID8gYi50ZXh0KCkgPT0gdGhpcy5fbXNnLnBsYWNlaG9sZGVyICYmIChiLnRleHQoIiIpLCBiLnJlbW92ZUNsYXNzKCJ0eHRfZ3JheSIpKSA6IGEudHlwZSA9PSAiYmx1ciIgJiYgYi50ZXh0KCkgPT0gIiIgJiYgKGIudGV4dCh0aGlzLl9tc2cucGxhY2Vob2xkZXIpLCB0aGlzLl9jb3VudElucHV0KCksIGIuYWRkQ2xhc3MoInR4dF9ncmF5IikpCiAgICB9LAogICAgX29uSW5wdXRPcmlnaW5hbEhhbmRsZXI6IGZ1bmN0aW9uKGEpIHsKICAgICAgICB0aGlzLl9jb3VudElucHV0KCkKICAgIH0sCiAgICBfb25DbGlja0J0bkNoZWNrSGFuZGxlcjogZnVuY3Rpb24oYSkgewogICAgICAgIHRoaXMuX2NvdW50SW5wdXQoKTsKICAgICAgICB2YXIgYiA9IGppbmRvLiRFbGVtZW50KHRoaXMuX2h0RWxlbWVudC5idG5DaGVjayk7CiAgICAgICAgaWYgKCFiLmhhc0NsYXNzKCJkaW1kIikpIHsKICAgICAgICAgICAgdmFyIGMgPSBqaW5kby4kRWxlbWVudCh0aGlzLl9odEVsZW1lbnQub3JpZ2luYWwpLAogICAgICAgICAgICAgICAgZCA9IGMudGV4dCgpOwogICAgICAgICAgICBpZiAoZCAhPSB0aGlzLl9tc2cucGxhY2Vob2xkZXIpCiAgICAgICAgICAgICAgICBpZiAoZCA9PSAiIikgYy50ZXh0KHRoaXMuX21zZy5wbGFjZWhvbGRlcik7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9odEVsZW1lbnQud1Jlc3VsdC5odG1sKHRoaXMuX21zZy5yZWFkeSksIHRoaXMuX3NPcmlnaW5hbCA9IGQsIHRoaXMuX3NSZXN1bHQgPSAiIjsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcTogdGhpcy5fc09yaWdpbmFsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0RGF0YSh0aGlzLm9wdGlvbigiQVBJIikuY2hlY2tlciwgZSwgdGhpcy5fb25Mb2FkUmVzdWx0LCB0aGlzLl9vblRpbWVPdXQpLCBiLmFkZENsYXNzKCJkaW1kIikKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAogICAgX29uQ2xpY2tCdG5SZXNldEhhbmRsZXI6IGZ1bmN0aW9uKGEpIHsKICAgICAgICB2YXIgYiA9IGppbmRvLiRFbGVtZW50KHRoaXMuX2h0RWxlbWVudC5vcmlnaW5hbCksCiAgICAgICAgICAgIGMgPSBqaW5kby4kRWxlbWVudCh0aGlzLl9odEVsZW1lbnQuYnRuQ2hlY2spOwogICAgICAgIGIudGV4dCh0aGlzLl9tc2cucGxhY2Vob2xkZXIpLCB0aGlzLl9jb3VudElucHV0KCksIHRoaXMuX2h0RWxlbWVudC53UmVzdWx0LnRleHQoIiIpLCBiLmFkZENsYXNzKCJ0eHRfZ3JheSIpLCBjLmhhc0NsYXNzKCJkaW1kIikgJiYgYy5yZW1vdmVDbGFzcygiZGltZCIpCiAgICB9LAogICAgX2NvdW50SW5wdXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gamluZG8uJEVsZW1lbnQodGhpcy5faHRFbGVtZW50Lm9yaWdpbmFsKSwKICAgICAgICAgICAgYiA9IGEudGV4dCgpLAogICAgICAgICAgICBjID0gYiA9PSB0aGlzLl9tc2cucGxhY2Vob2xkZXIgPyAwIDogYi5sZW5ndGg7CiAgICAgICAgYyA+IHRoaXMuX25NYXhsZW5ndGggJiYgKGEudGV4dChiLnN1YnN0cmluZygwLCB0aGlzLl9uTWF4bGVuZ3RoKSksIGMgPSB0aGlzLl9uTWF4bGVuZ3RoKSwgdGhpcy5faHRFbGVtZW50LndDbnRPcmlnaW5hbC50ZXh0KGMpCiAgICB9LAogICAgX3JlcXVlc3REYXRhOiBmdW5jdGlvbihhLCBiLCBjLCBkKSB7CiAgICAgICAgamluZG8uJEFqYXgoYSwgewogICAgICAgICAgICB0eXBlOiAianNvbnAiLAogICAgICAgICAgICBtZXRob2Q6ICJnZXQiLAogICAgICAgICAgICBjYWxsYmFja2lkOiAic3BlbGxpbmdDaGVjayIsCiAgICAgICAgICAgIHRpbWVvdXQ6IDMsCiAgICAgICAgICAgIG9ubG9hZDogamluZG8uJEZuKGMsIHRoaXMpLmJpbmQoKSwKICAgICAgICAgICAgb250aW1lb3V0OiBqaW5kby4kRm4oZCwgdGhpcykuYmluZCgpCiAgICAgICAgfSkucmVxdWVzdChiKQogICAgfSwKICAgIF9vbkxvYWRSZXN1bHQ6IGZ1bmN0aW9uKGEpIHsKICAgICAgICB2YXIgYiwgYyA9IGEuanNvbigpOwogICAgICAgIGppbmRvLiRFbGVtZW50KHRoaXMuX2h0RWxlbWVudC5idG5DaGVjaykucmVtb3ZlQ2xhc3MoImRpbWQiKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBiID0gYy5tZXNzYWdlLnJlc3VsdC5odG1sLCBiID09ICIiID8gYiA9IHRoaXMuX21zZy5mYWlsIDogYy5tZXNzYWdlLnJlc3VsdC5lcnJhdGFfY291bnQgPT09IDAgJiYgKGIgKz0gdGhpcy5fbXNnLnNhbWUpCiAgICAgICAgfSBjYXRjaCAoZCkgewogICAgICAgICAgICBiID0gdGhpcy5fbXNnLmZhaWwKICAgICAgICB9CiAgICAgICAgdGhpcy5faHRFbGVtZW50LndSZXN1bHQuaHRtbChiKQogICAgfSwKICAgIF9vblRpbWVPdXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGppbmRvLiRFbGVtZW50KHRoaXMuX2h0RWxlbWVudC5idG5DaGVjaykucmVtb3ZlQ2xhc3MoImRpbWQiKSwgdGhpcy5faHRFbGVtZW50LndSZXN1bHQuaHRtbCh0aGlzLl9tc2cudGltZW91dCkKICAgIH0KfSkuZXh0ZW5kKGppbmRvLkNvbXBvbmVudCk=