diff --git a/a_wails-packr.go b/a_wails-packr.go index 646cd8cbc..6526e6400 100644 --- a/a_wails-packr.go +++ b/a_wails-packr.go @@ -9,12 +9,12 @@ import "github.com/gobuffalo/packr" func init() { packr.PackJSONBytes("./assets/default", "default.html", "\"PGRpdiBpZD0iYXBwIj48L2Rpdj4=\"") packr.PackJSONBytes("./assets/default", "jquery.3.3.1.min.js", "\"LyohIGpRdWVyeSB2My4zLjEgLWFqYXgsLWFqYXgvanNvbnAsLWFqYXgvbG9hZCwtYWpheC9wYXJzZVhNTCwtYWpheC9zY3JpcHQsLWFqYXgvdmFyL2xvY2F0aW9uLC1hamF4L3Zhci9ub25jZSwtYWpheC92YXIvcnF1ZXJ5LC1hamF4L3hociwtbWFuaXB1bGF0aW9uL19ldmFsVXJsLC1ldmVudC9hamF4LC1lZmZlY3RzLC1lZmZlY3RzL1R3ZWVuLC1lZmZlY3RzL2FuaW1hdGVkU2VsZWN0b3IgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbiAoZSwgdCkgeyAidXNlIHN0cmljdCI7ICJvYmplY3QiID09IHR5cGVvZiBtb2R1bGUgJiYgIm9iamVjdCIgPT0gdHlwZW9mIG1vZHVsZS5leHBvcnRzID8gbW9kdWxlLmV4cG9ydHMgPSBlLmRvY3VtZW50ID8gdChlLCAhMCkgOiBmdW5jdGlvbiAoZSkgeyBpZiAoIWUuZG9jdW1lbnQpIHRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpOyByZXR1cm4gdChlKSB9IDogdChlKSB9KCJ1bmRlZmluZWQiICE9IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiAoZSwgdCkgeyAidXNlIHN0cmljdCI7IHZhciBuID0gW10sIHIgPSBlLmRvY3VtZW50LCBpID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLCBvID0gbi5zbGljZSwgYSA9IG4uY29uY2F0LCB1ID0gbi5wdXNoLCBzID0gbi5pbmRleE9mLCBsID0ge30sIGMgPSBsLnRvU3RyaW5nLCBmID0gbC5oYXNPd25Qcm9wZXJ0eSwgZCA9IGYudG9TdHJpbmcsIHAgPSBkLmNhbGwoT2JqZWN0KSwgaCA9IHt9LCBnID0gZnVuY3Rpb24gZSh0KSB7IHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmICJudW1iZXIiICE9IHR5cGVvZiB0Lm5vZGVUeXBlIH0sIHYgPSBmdW5jdGlvbiBlKHQpIHsgcmV0dXJuIG51bGwgIT0gdCAmJiB0ID09PSB0LndpbmRvdyB9LCB5ID0geyB0eXBlOiAhMCwgc3JjOiAhMCwgbm9Nb2R1bGU6ICEwIH07IGZ1bmN0aW9uIG0oZSwgdCwgbikgeyB2YXIgaSwgbyA9ICh0ID0gdCB8fCByKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsgaWYgKG8udGV4dCA9IGUsIG4pIGZvciAoaSBpbiB5KSBuW2ldICYmIChvW2ldID0gbltpXSk7IHQuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pIH0gZnVuY3Rpb24gYihlKSB7IHJldHVybiBudWxsID09IGUgPyBlICsgIiIgOiAib2JqZWN0IiA9PSB0eXBlb2YgZSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiBlID8gbFtjLmNhbGwoZSldIHx8ICJvYmplY3QiIDogdHlwZW9mIGUgfSB2YXIgeCA9ICIzLjMuMSAtYWpheCwtYWpheC9qc29ucCwtYWpheC9sb2FkLC1hamF4L3BhcnNlWE1MLC1hamF4L3NjcmlwdCwtYWpheC92YXIvbG9jYXRpb24sLWFqYXgvdmFyL25vbmNlLC1hamF4L3Zhci9ycXVlcnksLWFqYXgveGhyLC1tYW5pcHVsYXRpb24vX2V2YWxVcmwsLWV2ZW50L2FqYXgsLWVmZmVjdHMsLWVmZmVjdHMvVHdlZW4sLWVmZmVjdHMvYW5pbWF0ZWRTZWxlY3RvciIsIHcgPSBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gbmV3IHcuZm4uaW5pdChlLCB0KSB9LCBDID0gL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nOyB3LmZuID0gdy5wcm90b3R5cGUgPSB7IGpxdWVyeTogeCwgY29uc3RydWN0b3I6IHcsIGxlbmd0aDogMCwgdG9BcnJheTogZnVuY3Rpb24gKCkgeyByZXR1cm4gby5jYWxsKHRoaXMpIH0sIGdldDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG51bGwgPT0gZSA/IG8uY2FsbCh0aGlzKSA6IGUgPCAwID8gdGhpc1tlICsgdGhpcy5sZW5ndGhdIDogdGhpc1tlXSB9LCBwdXNoU3RhY2s6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gdy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksIGUpOyByZXR1cm4gdC5wcmV2T2JqZWN0ID0gdGhpcywgdCB9LCBlYWNoOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdy5lYWNoKHRoaXMsIGUpIH0sIG1hcDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsIGZ1bmN0aW9uICh0LCBuKSB7IHJldHVybiBlLmNhbGwodCwgbiwgdCkgfSkpIH0sIHNsaWNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnB1c2hTdGFjayhvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIH0sIGZpcnN0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVxKDApIH0sIGxhc3Q6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZXEoLTEpIH0sIGVxOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHRoaXMubGVuZ3RoLCBuID0gK2UgKyAoZSA8IDAgPyB0IDogMCk7IHJldHVybiB0aGlzLnB1c2hTdGFjayhuID49IDAgJiYgbiA8IHQgPyBbdGhpc1tuXV0gOiBbXSkgfSwgZW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpIH0sIHB1c2g6IHUsIHNvcnQ6IG4uc29ydCwgc3BsaWNlOiBuLnNwbGljZSB9LCB3LmV4dGVuZCA9IHcuZm4uZXh0ZW5kID0gZnVuY3Rpb24gKCkgeyB2YXIgZSwgdCwgbiwgciwgaSwgbywgYSA9IGFyZ3VtZW50c1swXSB8fCB7fSwgdSA9IDEsIHMgPSBhcmd1bWVudHMubGVuZ3RoLCBsID0gITE7IGZvciAoImJvb2xlYW4iID09IHR5cGVvZiBhICYmIChsID0gYSwgYSA9IGFyZ3VtZW50c1t1XSB8fCB7fSwgdSsrKSwgIm9iamVjdCIgPT0gdHlwZW9mIGEgfHwgZyhhKSB8fCAoYSA9IHt9KSwgdSA9PT0gcyAmJiAoYSA9IHRoaXMsIHUtLSk7IHUgPCBzOyB1KyspaWYgKG51bGwgIT0gKGUgPSBhcmd1bWVudHNbdV0pKSBmb3IgKHQgaW4gZSkgbiA9IGFbdF0sIGEgIT09IChyID0gZVt0XSkgJiYgKGwgJiYgciAmJiAody5pc1BsYWluT2JqZWN0KHIpIHx8IChpID0gQXJyYXkuaXNBcnJheShyKSkpID8gKGkgPyAoaSA9ICExLCBvID0gbiAmJiBBcnJheS5pc0FycmF5KG4pID8gbiA6IFtdKSA6IG8gPSBuICYmIHcuaXNQbGFpbk9iamVjdChuKSA/IG4gOiB7fSwgYVt0XSA9IHcuZXh0ZW5kKGwsIG8sIHIpKSA6IHZvaWQgMCAhPT0gciAmJiAoYVt0XSA9IHIpKTsgcmV0dXJuIGEgfSwgdy5leHRlbmQoeyBleHBhbmRvOiAialF1ZXJ5IiArICh4ICsgTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywgIiIpLCBpc1JlYWR5OiAhMCwgZXJyb3I6IGZ1bmN0aW9uIChlKSB7IHRocm93IG5ldyBFcnJvcihlKSB9LCBub29wOiBmdW5jdGlvbiAoKSB7IH0sIGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uIChlKSB7IHZhciB0LCBuOyByZXR1cm4gISghZSB8fCAiW29iamVjdCBPYmplY3RdIiAhPT0gYy5jYWxsKGUpKSAmJiAoISh0ID0gaShlKSkgfHwgImZ1bmN0aW9uIiA9PSB0eXBlb2YgKG4gPSBmLmNhbGwodCwgImNvbnN0cnVjdG9yIikgJiYgdC5jb25zdHJ1Y3RvcikgJiYgZC5jYWxsKG4pID09PSBwKSB9LCBpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdDsgZm9yICh0IGluIGUpIHJldHVybiAhMTsgcmV0dXJuICEwIH0sIGdsb2JhbEV2YWw6IGZ1bmN0aW9uIChlKSB7IG0oZSkgfSwgZWFjaDogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIgPSAwOyBpZiAoVChlKSkgeyBmb3IgKG4gPSBlLmxlbmd0aDsgciA8IG47IHIrKylpZiAoITEgPT09IHQuY2FsbChlW3JdLCByLCBlW3JdKSkgYnJlYWsgfSBlbHNlIGZvciAociBpbiBlKSBpZiAoITEgPT09IHQuY2FsbChlW3JdLCByLCBlW3JdKSkgYnJlYWs7IHJldHVybiBlIH0sIHRyaW06IGZ1bmN0aW9uIChlKSB7IHJldHVybiBudWxsID09IGUgPyAiIiA6IChlICsgIiIpLnJlcGxhY2UoQywgIiIpIH0sIG1ha2VBcnJheTogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSB0IHx8IFtdOyByZXR1cm4gbnVsbCAhPSBlICYmIChUKE9iamVjdChlKSkgPyB3Lm1lcmdlKG4sICJzdHJpbmciID09IHR5cGVvZiBlID8gW2VdIDogZSkgOiB1LmNhbGwobiwgZSkpLCBuIH0sIGluQXJyYXk6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBudWxsID09IHQgPyAtMSA6IHMuY2FsbCh0LCBlLCBuKSB9LCBtZXJnZTogZnVuY3Rpb24gKGUsIHQpIHsgZm9yICh2YXIgbiA9ICt0Lmxlbmd0aCwgciA9IDAsIGkgPSBlLmxlbmd0aDsgciA8IG47IHIrKyllW2krK10gPSB0W3JdOyByZXR1cm4gZS5sZW5ndGggPSBpLCBlIH0sIGdyZXA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IGZvciAodmFyIHIsIGkgPSBbXSwgbyA9IDAsIGEgPSBlLmxlbmd0aCwgdSA9ICFuOyBvIDwgYTsgbysrKShyID0gIXQoZVtvXSwgbykpICE9PSB1ICYmIGkucHVzaChlW29dKTsgcmV0dXJuIGkgfSwgbWFwOiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaSwgbyA9IDAsIHUgPSBbXTsgaWYgKFQoZSkpIGZvciAociA9IGUubGVuZ3RoOyBvIDwgcjsgbysrKW51bGwgIT0gKGkgPSB0KGVbb10sIG8sIG4pKSAmJiB1LnB1c2goaSk7IGVsc2UgZm9yIChvIGluIGUpIG51bGwgIT0gKGkgPSB0KGVbb10sIG8sIG4pKSAmJiB1LnB1c2goaSk7IHJldHVybiBhLmFwcGx5KFtdLCB1KSB9LCBndWlkOiAxLCBzdXBwb3J0OiBoIH0pLCAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgKHcuZm5bU3ltYm9sLml0ZXJhdG9yXSA9IG5bU3ltYm9sLml0ZXJhdG9yXSksIHcuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksIGZ1bmN0aW9uIChlLCB0KSB7IGxbIltvYmplY3QgIiArIHQgKyAiXSJdID0gdC50b0xvd2VyQ2FzZSgpIH0pOyBmdW5jdGlvbiBUKGUpIHsgdmFyIHQgPSAhIWUgJiYgImxlbmd0aCIgaW4gZSAmJiBlLmxlbmd0aCwgbiA9IGIoZSk7IHJldHVybiAhZyhlKSAmJiAhdihlKSAmJiAoImFycmF5IiA9PT0gbiB8fCAwID09PSB0IHx8ICJudW1iZXIiID09IHR5cGVvZiB0ICYmIHQgPiAwICYmIHQgLSAxIGluIGUpIH0gdmFyIEUgPSBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiwgciwgaSwgbywgYSwgdSwgcywgbCwgYywgZiwgZCwgcCwgaCwgZywgdiwgeSwgbSwgYiwgeCA9ICJzaXp6bGUiICsgMSAqIG5ldyBEYXRlLCB3ID0gZS5kb2N1bWVudCwgQyA9IDAsIFQgPSAwLCBFID0gYWUoKSwgTiA9IGFlKCksIGsgPSBhZSgpLCBBID0gZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuIGUgPT09IHQgJiYgKGYgPSAhMCksIDAgfSwgRCA9IHt9Lmhhc093blByb3BlcnR5LCBTID0gW10sIEwgPSBTLnBvcCwgaiA9IFMucHVzaCwgcSA9IFMucHVzaCwgTyA9IFMuc2xpY2UsIFAgPSBmdW5jdGlvbiAoZSwgdCkgeyBmb3IgKHZhciBuID0gMCwgciA9IGUubGVuZ3RoOyBuIDwgcjsgbisrKWlmIChlW25dID09PSB0KSByZXR1cm4gbjsgcmV0dXJuIC0xIH0sIEggPSAiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLCBJID0gIltcXHgyMFxcdFxcclxcblxcZl0iLCBSID0gIig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIiwgQiA9ICJcXFsiICsgSSArICIqKCIgKyBSICsgIikoPzoiICsgSSArICIqKFsqXiR8IX5dPz0pIiArIEkgKyAiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiICsgUiArICIpKXwpIiArIEkgKyAiKlxcXSIsIE0gPSAiOigiICsgUiArICIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IiArIEIgKyAiKSopfC4qKVxcKXwpIiwgVyA9IG5ldyBSZWdFeHAoSSArICIrIiwgImciKSwgJCA9IG5ldyBSZWdFeHAoIl4iICsgSSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgSSArICIrJCIsICJnIiksIEYgPSBuZXcgUmVnRXhwKCJeIiArIEkgKyAiKiwiICsgSSArICIqIiksIHogPSBuZXcgUmVnRXhwKCJeIiArIEkgKyAiKihbPit+XXwiICsgSSArICIpIiArIEkgKyAiKiIpLCBfID0gbmV3IFJlZ0V4cCgiPSIgKyBJICsgIiooW15cXF0nXCJdKj8pIiArIEkgKyAiKlxcXSIsICJnIiksIFUgPSBuZXcgUmVnRXhwKE0pLCBWID0gbmV3IFJlZ0V4cCgiXiIgKyBSICsgIiQiKSwgWCA9IHsgSUQ6IG5ldyBSZWdFeHAoIl4jKCIgKyBSICsgIikiKSwgQ0xBU1M6IG5ldyBSZWdFeHAoIl5cXC4oIiArIFIgKyAiKSIpLCBUQUc6IG5ldyBSZWdFeHAoIl4oIiArIFIgKyAifFsqXSkiKSwgQVRUUjogbmV3IFJlZ0V4cCgiXiIgKyBCKSwgUFNFVURPOiBuZXcgUmVnRXhwKCJeIiArIE0pLCBDSElMRDogbmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIEkgKyAiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyBJICsgIiooPzooWystXXwpIiArIEkgKyAiKihcXGQrKXwpKSIgKyBJICsgIipcXCl8KSIsICJpIiksIGJvb2w6IG5ldyBSZWdFeHAoIl4oPzoiICsgSCArICIpJCIsICJpIiksIG5lZWRzQ29udGV4dDogbmV3IFJlZ0V4cCgiXiIgKyBJICsgIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIgKyBJICsgIiooKD86LVxcZCk/XFxkKikiICsgSSArICIqXFwpfCkoPz1bXi1dfCQpIiwgImkiKSB9LCBRID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwgWSA9IC9eaFxkJC9pLCBHID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLCBLID0gL14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLywgSiA9IC9bK35dLywgWiA9IG5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIgKyBJICsgIj98KCIgKyBJICsgIil8LikiLCAiaWciKSwgZWUgPSBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciA9ICIweCIgKyB0IC0gNjU1MzY7IHJldHVybiByICE9PSByIHx8IG4gPyB0IDogciA8IDAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKHIgKyA2NTUzNikgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKHIgPj4gMTAgfCA1NTI5NiwgMTAyMyAmIHIgfCA1NjMyMCkgfSwgdGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywgbmUgPSBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gdCA/ICJcMCIgPT09IGUgPyAiXHVmZmZkIiA6IGUuc2xpY2UoMCwgLTEpICsgIlxcIiArIGUuY2hhckNvZGVBdChlLmxlbmd0aCAtIDEpLnRvU3RyaW5nKDE2KSArICIgIiA6ICJcXCIgKyBlIH0sIHJlID0gZnVuY3Rpb24gKCkgeyBkKCkgfSwgaWUgPSBtZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gITAgPT09IGUuZGlzYWJsZWQgJiYgKCJmb3JtIiBpbiBlIHx8ICJsYWJlbCIgaW4gZSkgfSwgeyBkaXI6ICJwYXJlbnROb2RlIiwgbmV4dDogImxlZ2VuZCIgfSk7IHRyeSB7IHEuYXBwbHkoUyA9IE8uY2FsbCh3LmNoaWxkTm9kZXMpLCB3LmNoaWxkTm9kZXMpLCBTW3cuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlIH0gY2F0Y2ggKGUpIHsgcSA9IHsgYXBwbHk6IFMubGVuZ3RoID8gZnVuY3Rpb24gKGUsIHQpIHsgai5hcHBseShlLCBPLmNhbGwodCkpIH0gOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IGUubGVuZ3RoLCByID0gMDsgd2hpbGUgKGVbbisrXSA9IHRbcisrXSk7IGUubGVuZ3RoID0gbiAtIDEgfSB9IH0gZnVuY3Rpb24gb2UoZSwgdCwgciwgaSkgeyB2YXIgbywgdSwgbCwgYywgZiwgaCwgeSwgbSA9IHQgJiYgdC5vd25lckRvY3VtZW50LCBDID0gdCA/IHQubm9kZVR5cGUgOiA5OyBpZiAociA9IHIgfHwgW10sICJzdHJpbmciICE9IHR5cGVvZiBlIHx8ICFlIHx8IDEgIT09IEMgJiYgOSAhPT0gQyAmJiAxMSAhPT0gQykgcmV0dXJuIHI7IGlmICghaSAmJiAoKHQgPyB0Lm93bmVyRG9jdW1lbnQgfHwgdCA6IHcpICE9PSBwICYmIGQodCksIHQgPSB0IHx8IHAsIGcpKSB7IGlmICgxMSAhPT0gQyAmJiAoZiA9IEsuZXhlYyhlKSkpIGlmIChvID0gZlsxXSkgeyBpZiAoOSA9PT0gQykgeyBpZiAoIShsID0gdC5nZXRFbGVtZW50QnlJZChvKSkpIHJldHVybiByOyBpZiAobC5pZCA9PT0gbykgcmV0dXJuIHIucHVzaChsKSwgciB9IGVsc2UgaWYgKG0gJiYgKGwgPSBtLmdldEVsZW1lbnRCeUlkKG8pKSAmJiBiKHQsIGwpICYmIGwuaWQgPT09IG8pIHJldHVybiByLnB1c2gobCksIHIgfSBlbHNlIHsgaWYgKGZbMl0pIHJldHVybiBxLmFwcGx5KHIsIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLCByOyBpZiAoKG8gPSBmWzNdKSAmJiBuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSByZXR1cm4gcS5hcHBseShyLCB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLCByIH0gaWYgKG4ucXNhICYmICFrW2UgKyAiICJdICYmICghdiB8fCAhdi50ZXN0KGUpKSkgeyBpZiAoMSAhPT0gQykgbSA9IHQsIHkgPSBlOyBlbHNlIGlmICgib2JqZWN0IiAhPT0gdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7IChjID0gdC5nZXRBdHRyaWJ1dGUoImlkIikpID8gYyA9IGMucmVwbGFjZSh0ZSwgbmUpIDogdC5zZXRBdHRyaWJ1dGUoImlkIiwgYyA9IHgpLCB1ID0gKGggPSBhKGUpKS5sZW5ndGg7IHdoaWxlICh1LS0pIGhbdV0gPSAiIyIgKyBjICsgIiAiICsgeWUoaFt1XSk7IHkgPSBoLmpvaW4oIiwiKSwgbSA9IEoudGVzdChlKSAmJiBnZSh0LnBhcmVudE5vZGUpIHx8IHQgfSBpZiAoeSkgdHJ5IHsgcmV0dXJuIHEuYXBwbHkociwgbS5xdWVyeVNlbGVjdG9yQWxsKHkpKSwgciB9IGNhdGNoIChlKSB7IH0gZmluYWxseSB7IGMgPT09IHggJiYgdC5yZW1vdmVBdHRyaWJ1dGUoImlkIikgfSB9IH0gcmV0dXJuIHMoZS5yZXBsYWNlKCQsICIkMSIpLCB0LCByLCBpKSB9IGZ1bmN0aW9uIGFlKCkgeyB2YXIgZSA9IFtdOyBmdW5jdGlvbiB0KG4sIGkpIHsgcmV0dXJuIGUucHVzaChuICsgIiAiKSA+IHIuY2FjaGVMZW5ndGggJiYgZGVsZXRlIHRbZS5zaGlmdCgpXSwgdFtuICsgIiAiXSA9IGkgfSByZXR1cm4gdCB9IGZ1bmN0aW9uIHVlKGUpIHsgcmV0dXJuIGVbeF0gPSAhMCwgZSB9IGZ1bmN0aW9uIHNlKGUpIHsgdmFyIHQgPSBwLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7IHRyeSB7IHJldHVybiAhIWUodCkgfSBjYXRjaCAoZSkgeyByZXR1cm4gITEgfSBmaW5hbGx5IHsgdC5wYXJlbnROb2RlICYmIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSwgdCA9IG51bGwgfSB9IGZ1bmN0aW9uIGxlKGUsIHQpIHsgdmFyIG4gPSBlLnNwbGl0KCJ8IiksIGkgPSBuLmxlbmd0aDsgd2hpbGUgKGktLSkgci5hdHRySGFuZGxlW25baV1dID0gdCB9IGZ1bmN0aW9uIGNlKGUsIHQpIHsgdmFyIG4gPSB0ICYmIGUsIHIgPSBuICYmIDEgPT09IGUubm9kZVR5cGUgJiYgMSA9PT0gdC5ub2RlVHlwZSAmJiBlLnNvdXJjZUluZGV4IC0gdC5zb3VyY2VJbmRleDsgaWYgKHIpIHJldHVybiByOyBpZiAobikgd2hpbGUgKG4gPSBuLm5leHRTaWJsaW5nKSBpZiAobiA9PT0gdCkgcmV0dXJuIC0xOyByZXR1cm4gZSA/IDEgOiAtMSB9IGZ1bmN0aW9uIGZlKGUpIHsgcmV0dXJuIGZ1bmN0aW9uICh0KSB7IHJldHVybiAiaW5wdXQiID09PSB0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgJiYgdC50eXBlID09PSBlIH0gfSBmdW5jdGlvbiBkZShlKSB7IHJldHVybiBmdW5jdGlvbiAodCkgeyB2YXIgbiA9IHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsgcmV0dXJuICgiaW5wdXQiID09PSBuIHx8ICJidXR0b24iID09PSBuKSAmJiB0LnR5cGUgPT09IGUgfSB9IGZ1bmN0aW9uIHBlKGUpIHsgcmV0dXJuIGZ1bmN0aW9uICh0KSB7IHJldHVybiAiZm9ybSIgaW4gdCA/IHQucGFyZW50Tm9kZSAmJiAhMSA9PT0gdC5kaXNhYmxlZCA/ICJsYWJlbCIgaW4gdCA/ICJsYWJlbCIgaW4gdC5wYXJlbnROb2RlID8gdC5wYXJlbnROb2RlLmRpc2FibGVkID09PSBlIDogdC5kaXNhYmxlZCA9PT0gZSA6IHQuaXNEaXNhYmxlZCA9PT0gZSB8fCB0LmlzRGlzYWJsZWQgIT09ICFlICYmIGllKHQpID09PSBlIDogdC5kaXNhYmxlZCA9PT0gZSA6ICJsYWJlbCIgaW4gdCAmJiB0LmRpc2FibGVkID09PSBlIH0gfSBmdW5jdGlvbiBoZShlKSB7IHJldHVybiB1ZShmdW5jdGlvbiAodCkgeyByZXR1cm4gdCA9ICt0LCB1ZShmdW5jdGlvbiAobiwgcikgeyB2YXIgaSwgbyA9IGUoW10sIG4ubGVuZ3RoLCB0KSwgYSA9IG8ubGVuZ3RoOyB3aGlsZSAoYS0tKSBuW2kgPSBvW2FdXSAmJiAobltpXSA9ICEocltpXSA9IG5baV0pKSB9KSB9KSB9IGZ1bmN0aW9uIGdlKGUpIHsgcmV0dXJuIGUgJiYgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgJiYgZSB9IG4gPSBvZS5zdXBwb3J0ID0ge30sIG8gPSBvZS5pc1hNTCA9IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZSAmJiAoZS5vd25lckRvY3VtZW50IHx8IGUpLmRvY3VtZW50RWxlbWVudDsgcmV0dXJuICEhdCAmJiAiSFRNTCIgIT09IHQubm9kZU5hbWUgfSwgZCA9IG9lLnNldERvY3VtZW50ID0gZnVuY3Rpb24gKGUpIHsgdmFyIHQsIGksIGEgPSBlID8gZS5vd25lckRvY3VtZW50IHx8IGUgOiB3OyByZXR1cm4gYSAhPT0gcCAmJiA5ID09PSBhLm5vZGVUeXBlICYmIGEuZG9jdW1lbnRFbGVtZW50ID8gKHAgPSBhLCBoID0gcC5kb2N1bWVudEVsZW1lbnQsIGcgPSAhbyhwKSwgdyAhPT0gcCAmJiAoaSA9IHAuZGVmYXVsdFZpZXcpICYmIGkudG9wICE9PSBpICYmIChpLmFkZEV2ZW50TGlzdGVuZXIgPyBpLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsIHJlLCAhMSkgOiBpLmF0dGFjaEV2ZW50ICYmIGkuYXR0YWNoRXZlbnQoIm9udW5sb2FkIiwgcmUpKSwgbi5hdHRyaWJ1dGVzID0gc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuY2xhc3NOYW1lID0gImkiLCAhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpIH0pLCBuLmdldEVsZW1lbnRzQnlUYWdOYW1lID0gc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuYXBwZW5kQ2hpbGQocC5jcmVhdGVDb21tZW50KCIiKSksICFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoIH0pLCBuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBHLnRlc3QocC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSwgbi5nZXRCeUlkID0gc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGguYXBwZW5kQ2hpbGQoZSkuaWQgPSB4LCAhcC5nZXRFbGVtZW50c0J5TmFtZSB8fCAhcC5nZXRFbGVtZW50c0J5TmFtZSh4KS5sZW5ndGggfSksIG4uZ2V0QnlJZCA/IChyLmZpbHRlci5JRCA9IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5yZXBsYWNlKFosIGVlKTsgcmV0dXJuIGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gdCB9IH0sIHIuZmluZC5JRCA9IGZ1bmN0aW9uIChlLCB0KSB7IGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCAmJiBnKSB7IHZhciBuID0gdC5nZXRFbGVtZW50QnlJZChlKTsgcmV0dXJuIG4gPyBbbl0gOiBbXSB9IH0pIDogKHIuZmlsdGVyLklEID0gZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBlLnJlcGxhY2UoWiwgZWUpOyByZXR1cm4gZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlICYmIGUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsgcmV0dXJuIG4gJiYgbi52YWx1ZSA9PT0gdCB9IH0sIHIuZmluZC5JRCA9IGZ1bmN0aW9uIChlLCB0KSB7IGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCAmJiBnKSB7IHZhciBuLCByLCBpLCBvID0gdC5nZXRFbGVtZW50QnlJZChlKTsgaWYgKG8pIHsgaWYgKChuID0gby5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSAmJiBuLnZhbHVlID09PSBlKSByZXR1cm4gW29dOyBpID0gdC5nZXRFbGVtZW50c0J5TmFtZShlKSwgciA9IDA7IHdoaWxlIChvID0gaVtyKytdKSBpZiAoKG4gPSBvLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpICYmIG4udmFsdWUgPT09IGUpIHJldHVybiBbb10gfSByZXR1cm4gW10gfSB9KSwgci5maW5kLlRBRyA9IG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gInVuZGVmaW5lZCIgIT0gdHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyB0LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpIDogbi5xc2EgPyB0LnF1ZXJ5U2VsZWN0b3JBbGwoZSkgOiB2b2lkIDAgfSA6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gW10sIGkgPSAwLCBvID0gdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTsgaWYgKCIqIiA9PT0gZSkgeyB3aGlsZSAobiA9IG9baSsrXSkgMSA9PT0gbi5ub2RlVHlwZSAmJiByLnB1c2gobik7IHJldHVybiByIH0gcmV0dXJuIG8gfSwgci5maW5kLkNMQVNTID0gbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uIChlLCB0KSB7IGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGcpIHJldHVybiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSkgfSwgeSA9IFtdLCB2ID0gW10sIChuLnFzYSA9IEcudGVzdChwLnF1ZXJ5U2VsZWN0b3JBbGwpKSAmJiAoc2UoZnVuY3Rpb24gKGUpIHsgaC5hcHBlbmRDaGlsZChlKS5pbm5lckhUTUwgPSAiPGEgaWQ9JyIgKyB4ICsgIic+PC9hPjxzZWxlY3QgaWQ9JyIgKyB4ICsgIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsIGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGggJiYgdi5wdXNoKCJbKl4kXT0iICsgSSArICIqKD86Jyd8XCJcIikiKSwgZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoIHx8IHYucHVzaCgiXFxbIiArIEkgKyAiKig/OnZhbHVlfCIgKyBIICsgIikiKSwgZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIgKyB4ICsgIi1dIikubGVuZ3RoIHx8IHYucHVzaCgifj0iKSwgZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aCB8fCB2LnB1c2goIjpjaGVja2VkIiksIGUucXVlcnlTZWxlY3RvckFsbCgiYSMiICsgeCArICIrKiIpLmxlbmd0aCB8fCB2LnB1c2goIi4jLitbK35dIikgfSksIHNlKGZ1bmN0aW9uIChlKSB7IGUuaW5uZXJIVE1MID0gIjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7IHZhciB0ID0gcC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOyB0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJoaWRkZW4iKSwgZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiRCIpLCBlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICYmIHYucHVzaCgibmFtZSIgKyBJICsgIipbKl4kfCF+XT89IiksIDIgIT09IGUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggJiYgdi5wdXNoKCI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiKSwgaC5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZCA9ICEwLCAyICE9PSBlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCAmJiB2LnB1c2goIjplbmFibGVkIiwgIjpkaXNhYmxlZCIpLCBlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSwgdi5wdXNoKCIsLio6IikgfSkpLCAobi5tYXRjaGVzU2VsZWN0b3IgPSBHLnRlc3QobSA9IGgubWF0Y2hlcyB8fCBoLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBoLm1vek1hdGNoZXNTZWxlY3RvciB8fCBoLm9NYXRjaGVzU2VsZWN0b3IgfHwgaC5tc01hdGNoZXNTZWxlY3RvcikpICYmIHNlKGZ1bmN0aW9uIChlKSB7IG4uZGlzY29ubmVjdGVkTWF0Y2ggPSBtLmNhbGwoZSwgIioiKSwgbS5jYWxsKGUsICJbcyE9JyddOngiKSwgeS5wdXNoKCIhPSIsIE0pIH0pLCB2ID0gdi5sZW5ndGggJiYgbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksIHkgPSB5Lmxlbmd0aCAmJiBuZXcgUmVnRXhwKHkuam9pbigifCIpKSwgdCA9IEcudGVzdChoLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSwgYiA9IHQgfHwgRy50ZXN0KGguY29udGFpbnMpID8gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSA5ID09PSBlLm5vZGVUeXBlID8gZS5kb2N1bWVudEVsZW1lbnQgOiBlLCByID0gdCAmJiB0LnBhcmVudE5vZGU7IHJldHVybiBlID09PSByIHx8ICEoIXIgfHwgMSAhPT0gci5ub2RlVHlwZSB8fCAhKG4uY29udGFpbnMgPyBuLmNvbnRhaW5zKHIpIDogZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiAxNiAmIGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKSB9IDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKHQpIHdoaWxlICh0ID0gdC5wYXJlbnROb2RlKSBpZiAodCA9PT0gZSkgcmV0dXJuICEwOyByZXR1cm4gITEgfSwgQSA9IHQgPyBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoZSA9PT0gdCkgcmV0dXJuIGYgPSAhMCwgMDsgdmFyIHIgPSAhZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uOyByZXR1cm4gciB8fCAoMSAmIChyID0gKGUub3duZXJEb2N1bWVudCB8fCBlKSA9PT0gKHQub3duZXJEb2N1bWVudCB8fCB0KSA/IGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkgOiAxKSB8fCAhbi5zb3J0RGV0YWNoZWQgJiYgdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKSA9PT0gciA/IGUgPT09IHAgfHwgZS5vd25lckRvY3VtZW50ID09PSB3ICYmIGIodywgZSkgPyAtMSA6IHQgPT09IHAgfHwgdC5vd25lckRvY3VtZW50ID09PSB3ICYmIGIodywgdCkgPyAxIDogYyA/IFAoYywgZSkgLSBQKGMsIHQpIDogMCA6IDQgJiByID8gLTEgOiAxKSB9IDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKGUgPT09IHQpIHJldHVybiBmID0gITAsIDA7IHZhciBuLCByID0gMCwgaSA9IGUucGFyZW50Tm9kZSwgbyA9IHQucGFyZW50Tm9kZSwgYSA9IFtlXSwgdSA9IFt0XTsgaWYgKCFpIHx8ICFvKSByZXR1cm4gZSA9PT0gcCA/IC0xIDogdCA9PT0gcCA/IDEgOiBpID8gLTEgOiBvID8gMSA6IGMgPyBQKGMsIGUpIC0gUChjLCB0KSA6IDA7IGlmIChpID09PSBvKSByZXR1cm4gY2UoZSwgdCk7IG4gPSBlOyB3aGlsZSAobiA9IG4ucGFyZW50Tm9kZSkgYS51bnNoaWZ0KG4pOyBuID0gdDsgd2hpbGUgKG4gPSBuLnBhcmVudE5vZGUpIHUudW5zaGlmdChuKTsgd2hpbGUgKGFbcl0gPT09IHVbcl0pIHIrKzsgcmV0dXJuIHIgPyBjZShhW3JdLCB1W3JdKSA6IGFbcl0gPT09IHcgPyAtMSA6IHVbcl0gPT09IHcgPyAxIDogMCB9LCBwKSA6IHAgfSwgb2UubWF0Y2hlcyA9IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiBvZShlLCBudWxsLCBudWxsLCB0KSB9LCBvZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoKGUub3duZXJEb2N1bWVudCB8fCBlKSAhPT0gcCAmJiBkKGUpLCB0ID0gdC5yZXBsYWNlKF8sICI9JyQxJ10iKSwgbi5tYXRjaGVzU2VsZWN0b3IgJiYgZyAmJiAha1t0ICsgIiAiXSAmJiAoIXkgfHwgIXkudGVzdCh0KSkgJiYgKCF2IHx8ICF2LnRlc3QodCkpKSB0cnkgeyB2YXIgciA9IG0uY2FsbChlLCB0KTsgaWYgKHIgfHwgbi5kaXNjb25uZWN0ZWRNYXRjaCB8fCBlLmRvY3VtZW50ICYmIDExICE9PSBlLmRvY3VtZW50Lm5vZGVUeXBlKSByZXR1cm4gciB9IGNhdGNoIChlKSB7IH0gcmV0dXJuIG9lKHQsIHAsIG51bGwsIFtlXSkubGVuZ3RoID4gMCB9LCBvZS5jb250YWlucyA9IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiAoZS5vd25lckRvY3VtZW50IHx8IGUpICE9PSBwICYmIGQoZSksIGIoZSwgdCkgfSwgb2UuYXR0ciA9IGZ1bmN0aW9uIChlLCB0KSB7IChlLm93bmVyRG9jdW1lbnQgfHwgZSkgIT09IHAgJiYgZChlKTsgdmFyIGkgPSByLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSwgbyA9IGkgJiYgRC5jYWxsKHIuYXR0ckhhbmRsZSwgdC50b0xvd2VyQ2FzZSgpKSA/IGkoZSwgdCwgIWcpIDogdm9pZCAwOyByZXR1cm4gdm9pZCAwICE9PSBvID8gbyA6IG4uYXR0cmlidXRlcyB8fCAhZyA/IGUuZ2V0QXR0cmlidXRlKHQpIDogKG8gPSBlLmdldEF0dHJpYnV0ZU5vZGUodCkpICYmIG8uc3BlY2lmaWVkID8gby52YWx1ZSA6IG51bGwgfSwgb2UuZXNjYXBlID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIChlICsgIiIpLnJlcGxhY2UodGUsIG5lKSB9LCBvZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIGUpIH0sIG9lLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgciA9IFtdLCBpID0gMCwgbyA9IDA7IGlmIChmID0gIW4uZGV0ZWN0RHVwbGljYXRlcywgYyA9ICFuLnNvcnRTdGFibGUgJiYgZS5zbGljZSgwKSwgZS5zb3J0KEEpLCBmKSB7IHdoaWxlICh0ID0gZVtvKytdKSB0ID09PSBlW29dICYmIChpID0gci5wdXNoKG8pKTsgd2hpbGUgKGktLSkgZS5zcGxpY2UocltpXSwgMSkgfSByZXR1cm4gYyA9IG51bGwsIGUgfSwgaSA9IG9lLmdldFRleHQgPSBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiA9ICIiLCByID0gMCwgbyA9IGUubm9kZVR5cGU7IGlmIChvKSB7IGlmICgxID09PSBvIHx8IDkgPT09IG8gfHwgMTEgPT09IG8pIHsgaWYgKCJzdHJpbmciID09IHR5cGVvZiBlLnRleHRDb250ZW50KSByZXR1cm4gZS50ZXh0Q29udGVudDsgZm9yIChlID0gZS5maXJzdENoaWxkOyBlOyBlID0gZS5uZXh0U2libGluZyluICs9IGkoZSkgfSBlbHNlIGlmICgzID09PSBvIHx8IDQgPT09IG8pIHJldHVybiBlLm5vZGVWYWx1ZSB9IGVsc2Ugd2hpbGUgKHQgPSBlW3IrK10pIG4gKz0gaSh0KTsgcmV0dXJuIG4gfSwgKHIgPSBvZS5zZWxlY3RvcnMgPSB7IGNhY2hlTGVuZ3RoOiA1MCwgY3JlYXRlUHNldWRvOiB1ZSwgbWF0Y2g6IFgsIGF0dHJIYW5kbGU6IHt9LCBmaW5kOiB7fSwgcmVsYXRpdmU6IHsgIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogITAgfSwgIiAiOiB7IGRpcjogInBhcmVudE5vZGUiIH0sICIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogITAgfSwgIn4iOiB7IGRpcjogInByZXZpb3VzU2libGluZyIgfSB9LCBwcmVGaWx0ZXI6IHsgQVRUUjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGVbMV0gPSBlWzFdLnJlcGxhY2UoWiwgZWUpLCBlWzNdID0gKGVbM10gfHwgZVs0XSB8fCBlWzVdIHx8ICIiKS5yZXBsYWNlKFosIGVlKSwgIn49IiA9PT0gZVsyXSAmJiAoZVszXSA9ICIgIiArIGVbM10gKyAiICIpLCBlLnNsaWNlKDAsIDQpIH0sIENISUxEOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZVsxXSA9IGVbMV0udG9Mb3dlckNhc2UoKSwgIm50aCIgPT09IGVbMV0uc2xpY2UoMCwgMykgPyAoZVszXSB8fCBvZS5lcnJvcihlWzBdKSwgZVs0XSA9ICsoZVs0XSA/IGVbNV0gKyAoZVs2XSB8fCAxKSA6IDIgKiAoImV2ZW4iID09PSBlWzNdIHx8ICJvZGQiID09PSBlWzNdKSksIGVbNV0gPSArKGVbN10gKyBlWzhdIHx8ICJvZGQiID09PSBlWzNdKSkgOiBlWzNdICYmIG9lLmVycm9yKGVbMF0pLCBlIH0sIFBTRVVETzogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4gPSAhZVs2XSAmJiBlWzJdOyByZXR1cm4gWC5DSElMRC50ZXN0KGVbMF0pID8gbnVsbCA6IChlWzNdID8gZVsyXSA9IGVbNF0gfHwgZVs1XSB8fCAiIiA6IG4gJiYgVS50ZXN0KG4pICYmICh0ID0gYShuLCAhMCkpICYmICh0ID0gbi5pbmRleE9mKCIpIiwgbi5sZW5ndGggLSB0KSAtIG4ubGVuZ3RoKSAmJiAoZVswXSA9IGVbMF0uc2xpY2UoMCwgdCksIGVbMl0gPSBuLnNsaWNlKDAsIHQpKSwgZS5zbGljZSgwLCAzKSkgfSB9LCBmaWx0ZXI6IHsgVEFHOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGUucmVwbGFjZShaLCBlZSkudG9Mb3dlckNhc2UoKTsgcmV0dXJuICIqIiA9PT0gZSA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuICEwIH0gOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5ub2RlTmFtZSAmJiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHQgfSB9LCBDTEFTUzogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBFW2UgKyAiICJdOyByZXR1cm4gdCB8fCAodCA9IG5ldyBSZWdFeHAoIihefCIgKyBJICsgIikiICsgZSArICIoIiArIEkgKyAifCQpIikpICYmIEUoZSwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHQudGVzdCgic3RyaW5nIiA9PSB0eXBlb2YgZS5jbGFzc05hbWUgJiYgZS5jbGFzc05hbWUgfHwgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGUuZ2V0QXR0cmlidXRlICYmIGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKSB9KSB9LCBBVFRSOiBmdW5jdGlvbiAoZSwgdCwgbikgeyByZXR1cm4gZnVuY3Rpb24gKHIpIHsgdmFyIGkgPSBvZS5hdHRyKHIsIGUpOyByZXR1cm4gbnVsbCA9PSBpID8gIiE9IiA9PT0gdCA6ICF0IHx8IChpICs9ICIiLCAiPSIgPT09IHQgPyBpID09PSBuIDogIiE9IiA9PT0gdCA/IGkgIT09IG4gOiAiXj0iID09PSB0ID8gbiAmJiAwID09PSBpLmluZGV4T2YobikgOiAiKj0iID09PSB0ID8gbiAmJiBpLmluZGV4T2YobikgPiAtMSA6ICIkPSIgPT09IHQgPyBuICYmIGkuc2xpY2UoLW4ubGVuZ3RoKSA9PT0gbiA6ICJ+PSIgPT09IHQgPyAoIiAiICsgaS5yZXBsYWNlKFcsICIgIikgKyAiICIpLmluZGV4T2YobikgPiAtMSA6ICJ8PSIgPT09IHQgJiYgKGkgPT09IG4gfHwgaS5zbGljZSgwLCBuLmxlbmd0aCArIDEpID09PSBuICsgIi0iKSkgfSB9LCBDSElMRDogZnVuY3Rpb24gKGUsIHQsIG4sIHIsIGkpIHsgdmFyIG8gPSAibnRoIiAhPT0gZS5zbGljZSgwLCAzKSwgYSA9ICJsYXN0IiAhPT0gZS5zbGljZSgtNCksIHUgPSAib2YtdHlwZSIgPT09IHQ7IHJldHVybiAxID09PSByICYmIDAgPT09IGkgPyBmdW5jdGlvbiAoZSkgeyByZXR1cm4gISFlLnBhcmVudE5vZGUgfSA6IGZ1bmN0aW9uICh0LCBuLCBzKSB7IHZhciBsLCBjLCBmLCBkLCBwLCBoLCBnID0gbyAhPT0gYSA/ICJuZXh0U2libGluZyIgOiAicHJldmlvdXNTaWJsaW5nIiwgdiA9IHQucGFyZW50Tm9kZSwgeSA9IHUgJiYgdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBtID0gIXMgJiYgIXUsIGIgPSAhMTsgaWYgKHYpIHsgaWYgKG8pIHsgd2hpbGUgKGcpIHsgZCA9IHQ7IHdoaWxlIChkID0gZFtnXSkgaWYgKHUgPyBkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHkgOiAxID09PSBkLm5vZGVUeXBlKSByZXR1cm4gITE7IGggPSBnID0gIm9ubHkiID09PSBlICYmICFoICYmICJuZXh0U2libGluZyIgfSByZXR1cm4gITAgfSBpZiAoaCA9IFthID8gdi5maXJzdENoaWxkIDogdi5sYXN0Q2hpbGRdLCBhICYmIG0pIHsgYiA9IChwID0gKGwgPSAoYyA9IChmID0gKGQgPSB2KVt4XSB8fCAoZFt4XSA9IHt9KSlbZC51bmlxdWVJRF0gfHwgKGZbZC51bmlxdWVJRF0gPSB7fSkpW2VdIHx8IFtdKVswXSA9PT0gQyAmJiBsWzFdKSAmJiBsWzJdLCBkID0gcCAmJiB2LmNoaWxkTm9kZXNbcF07IHdoaWxlIChkID0gKytwICYmIGQgJiYgZFtnXSB8fCAoYiA9IHAgPSAwKSB8fCBoLnBvcCgpKSBpZiAoMSA9PT0gZC5ub2RlVHlwZSAmJiArK2IgJiYgZCA9PT0gdCkgeyBjW2VdID0gW0MsIHAsIGJdOyBicmVhayB9IH0gZWxzZSBpZiAobSAmJiAoYiA9IHAgPSAobCA9IChjID0gKGYgPSAoZCA9IHQpW3hdIHx8IChkW3hdID0ge30pKVtkLnVuaXF1ZUlEXSB8fCAoZltkLnVuaXF1ZUlEXSA9IHt9KSlbZV0gfHwgW10pWzBdID09PSBDICYmIGxbMV0pLCAhMSA9PT0gYikgd2hpbGUgKGQgPSArK3AgJiYgZCAmJiBkW2ddIHx8IChiID0gcCA9IDApIHx8IGgucG9wKCkpIGlmICgodSA/IGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0geSA6IDEgPT09IGQubm9kZVR5cGUpICYmICsrYiAmJiAobSAmJiAoKGMgPSAoZiA9IGRbeF0gfHwgKGRbeF0gPSB7fSkpW2QudW5pcXVlSURdIHx8IChmW2QudW5pcXVlSURdID0ge30pKVtlXSA9IFtDLCBiXSksIGQgPT09IHQpKSBicmVhazsgcmV0dXJuIChiIC09IGkpID09PSByIHx8IGIgJSByID09IDAgJiYgYiAvIHIgPj0gMCB9IH0gfSwgUFNFVURPOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiwgaSA9IHIucHNldWRvc1tlXSB8fCByLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXSB8fCBvZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgZSk7IHJldHVybiBpW3hdID8gaSh0KSA6IGkubGVuZ3RoID4gMSA/IChuID0gW2UsIGUsICIiLCB0XSwgci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSkgPyB1ZShmdW5jdGlvbiAoZSwgbikgeyB2YXIgciwgbyA9IGkoZSwgdCksIGEgPSBvLmxlbmd0aDsgd2hpbGUgKGEtLSkgZVtyID0gUChlLCBvW2FdKV0gPSAhKG5bcl0gPSBvW2FdKSB9KSA6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBpKGUsIDAsIG4pIH0pIDogaSB9IH0sIHBzZXVkb3M6IHsgbm90OiB1ZShmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IFtdLCBuID0gW10sIHIgPSB1KGUucmVwbGFjZSgkLCAiJDEiKSk7IHJldHVybiByW3hdID8gdWUoZnVuY3Rpb24gKGUsIHQsIG4sIGkpIHsgdmFyIG8sIGEgPSByKGUsIG51bGwsIGksIFtdKSwgdSA9IGUubGVuZ3RoOyB3aGlsZSAodS0tKSAobyA9IGFbdV0pICYmIChlW3VdID0gISh0W3VdID0gbykpIH0pIDogZnVuY3Rpb24gKGUsIGksIG8pIHsgcmV0dXJuIHRbMF0gPSBlLCByKHQsIG51bGwsIG8sIG4pLCB0WzBdID0gbnVsbCwgIW4ucG9wKCkgfSB9KSwgaGFzOiB1ZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIG9lKGUsIHQpLmxlbmd0aCA+IDAgfSB9KSwgY29udGFpbnM6IHVlKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID0gZS5yZXBsYWNlKFosIGVlKSwgZnVuY3Rpb24gKHQpIHsgcmV0dXJuICh0LnRleHRDb250ZW50IHx8IHQuaW5uZXJUZXh0IHx8IGkodCkpLmluZGV4T2YoZSkgPiAtMSB9IH0pLCBsYW5nOiB1ZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gVi50ZXN0KGUgfHwgIiIpIHx8IG9lLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiICsgZSksIGUgPSBlLnJlcGxhY2UoWiwgZWUpLnRvTG93ZXJDYXNlKCksIGZ1bmN0aW9uICh0KSB7IHZhciBuOyBkbyB7IGlmIChuID0gZyA/IHQubGFuZyA6IHQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IHQuZ2V0QXR0cmlidXRlKCJsYW5nIikpIHJldHVybiAobiA9IG4udG9Mb3dlckNhc2UoKSkgPT09IGUgfHwgMCA9PT0gbi5pbmRleE9mKGUgKyAiLSIpIH0gd2hpbGUgKCh0ID0gdC5wYXJlbnROb2RlKSAmJiAxID09PSB0Lm5vZGVUeXBlKTsgcmV0dXJuICExIH0gfSksIHRhcmdldDogZnVuY3Rpb24gKHQpIHsgdmFyIG4gPSBlLmxvY2F0aW9uICYmIGUubG9jYXRpb24uaGFzaDsgcmV0dXJuIG4gJiYgbi5zbGljZSgxKSA9PT0gdC5pZCB9LCByb290OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSA9PT0gaCB9LCBmb2N1czogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUgPT09IHAuYWN0aXZlRWxlbWVudCAmJiAoIXAuaGFzRm9jdXMgfHwgcC5oYXNGb2N1cygpKSAmJiAhIShlLnR5cGUgfHwgZS5ocmVmIHx8IH5lLnRhYkluZGV4KSB9LCBlbmFibGVkOiBwZSghMSksIGRpc2FibGVkOiBwZSghMCksIGNoZWNrZWQ6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyByZXR1cm4gImlucHV0IiA9PT0gdCAmJiAhIWUuY2hlY2tlZCB8fCAib3B0aW9uIiA9PT0gdCAmJiAhIWUuc2VsZWN0ZWQgfSwgc2VsZWN0ZWQ6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLnBhcmVudE5vZGUgJiYgZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsICEwID09PSBlLnNlbGVjdGVkIH0sIGVtcHR5OiBmdW5jdGlvbiAoZSkgeyBmb3IgKGUgPSBlLmZpcnN0Q2hpbGQ7IGU7IGUgPSBlLm5leHRTaWJsaW5nKWlmIChlLm5vZGVUeXBlIDwgNikgcmV0dXJuICExOyByZXR1cm4gITAgfSwgcGFyZW50OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gIXIucHNldWRvcy5lbXB0eShlKSB9LCBoZWFkZXI6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBZLnRlc3QoZS5ub2RlTmFtZSkgfSwgaW5wdXQ6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBRLnRlc3QoZS5ub2RlTmFtZSkgfSwgYnV0dG9uOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsgcmV0dXJuICJpbnB1dCIgPT09IHQgJiYgImJ1dHRvbiIgPT09IGUudHlwZSB8fCAiYnV0dG9uIiA9PT0gdCB9LCB0ZXh0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdDsgcmV0dXJuICJpbnB1dCIgPT09IGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAmJiAidGV4dCIgPT09IGUudHlwZSAmJiAobnVsbCA9PSAodCA9IGUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpIHx8ICJ0ZXh0IiA9PT0gdC50b0xvd2VyQ2FzZSgpKSB9LCBmaXJzdDogaGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gWzBdIH0pLCBsYXN0OiBoZShmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gW3QgLSAxXSB9KSwgZXE6IGhlKGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBbbiA8IDAgPyBuICsgdCA6IG5dIH0pLCBldmVuOiBoZShmdW5jdGlvbiAoZSwgdCkgeyBmb3IgKHZhciBuID0gMDsgbiA8IHQ7IG4gKz0gMillLnB1c2gobik7IHJldHVybiBlIH0pLCBvZGQ6IGhlKGZ1bmN0aW9uIChlLCB0KSB7IGZvciAodmFyIG4gPSAxOyBuIDwgdDsgbiArPSAyKWUucHVzaChuKTsgcmV0dXJuIGUgfSksIGx0OiBoZShmdW5jdGlvbiAoZSwgdCwgbikgeyBmb3IgKHZhciByID0gbiA8IDAgPyBuICsgdCA6IG47IC0tciA+PSAwOyllLnB1c2gocik7IHJldHVybiBlIH0pLCBndDogaGUoZnVuY3Rpb24gKGUsIHQsIG4pIHsgZm9yICh2YXIgciA9IG4gPCAwID8gbiArIHQgOiBuOyArK3IgPCB0OyllLnB1c2gocik7IHJldHVybiBlIH0pIH0gfSkucHNldWRvcy5udGggPSByLnBzZXVkb3MuZXE7IGZvciAodCBpbiB7IHJhZGlvOiAhMCwgY2hlY2tib3g6ICEwLCBmaWxlOiAhMCwgcGFzc3dvcmQ6ICEwLCBpbWFnZTogITAgfSkgci5wc2V1ZG9zW3RdID0gZmUodCk7IGZvciAodCBpbiB7IHN1Ym1pdDogITAsIHJlc2V0OiAhMCB9KSByLnBzZXVkb3NbdF0gPSBkZSh0KTsgZnVuY3Rpb24gdmUoKSB7IH0gdmUucHJvdG90eXBlID0gci5maWx0ZXJzID0gci5wc2V1ZG9zLCByLnNldEZpbHRlcnMgPSBuZXcgdmUsIGEgPSBvZS50b2tlbml6ZSA9IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCBpLCBvLCBhLCB1LCBzLCBsLCBjID0gTltlICsgIiAiXTsgaWYgKGMpIHJldHVybiB0ID8gMCA6IGMuc2xpY2UoMCk7IHUgPSBlLCBzID0gW10sIGwgPSByLnByZUZpbHRlcjsgd2hpbGUgKHUpIHsgbiAmJiAhKGkgPSBGLmV4ZWModSkpIHx8IChpICYmICh1ID0gdS5zbGljZShpWzBdLmxlbmd0aCkgfHwgdSksIHMucHVzaChvID0gW10pKSwgbiA9ICExLCAoaSA9IHouZXhlYyh1KSkgJiYgKG4gPSBpLnNoaWZ0KCksIG8ucHVzaCh7IHZhbHVlOiBuLCB0eXBlOiBpWzBdLnJlcGxhY2UoJCwgIiAiKSB9KSwgdSA9IHUuc2xpY2Uobi5sZW5ndGgpKTsgZm9yIChhIGluIHIuZmlsdGVyKSAhKGkgPSBYW2FdLmV4ZWModSkpIHx8IGxbYV0gJiYgIShpID0gbFthXShpKSkgfHwgKG4gPSBpLnNoaWZ0KCksIG8ucHVzaCh7IHZhbHVlOiBuLCB0eXBlOiBhLCBtYXRjaGVzOiBpIH0pLCB1ID0gdS5zbGljZShuLmxlbmd0aCkpOyBpZiAoIW4pIGJyZWFrIH0gcmV0dXJuIHQgPyB1Lmxlbmd0aCA6IHUgPyBvZS5lcnJvcihlKSA6IE4oZSwgcykuc2xpY2UoMCkgfTsgZnVuY3Rpb24geWUoZSkgeyBmb3IgKHZhciB0ID0gMCwgbiA9IGUubGVuZ3RoLCByID0gIiI7IHQgPCBuOyB0KyspciArPSBlW3RdLnZhbHVlOyByZXR1cm4gciB9IGZ1bmN0aW9uIG1lKGUsIHQsIG4pIHsgdmFyIHIgPSB0LmRpciwgaSA9IHQubmV4dCwgbyA9IGkgfHwgciwgYSA9IG4gJiYgInBhcmVudE5vZGUiID09PSBvLCB1ID0gVCsrOyByZXR1cm4gdC5maXJzdCA/IGZ1bmN0aW9uICh0LCBuLCBpKSB7IHdoaWxlICh0ID0gdFtyXSkgaWYgKDEgPT09IHQubm9kZVR5cGUgfHwgYSkgcmV0dXJuIGUodCwgbiwgaSk7IHJldHVybiAhMSB9IDogZnVuY3Rpb24gKHQsIG4sIHMpIHsgdmFyIGwsIGMsIGYsIGQgPSBbQywgdV07IGlmIChzKSB7IHdoaWxlICh0ID0gdFtyXSkgaWYgKCgxID09PSB0Lm5vZGVUeXBlIHx8IGEpICYmIGUodCwgbiwgcykpIHJldHVybiAhMCB9IGVsc2Ugd2hpbGUgKHQgPSB0W3JdKSBpZiAoMSA9PT0gdC5ub2RlVHlwZSB8fCBhKSBpZiAoZiA9IHRbeF0gfHwgKHRbeF0gPSB7fSksIGMgPSBmW3QudW5pcXVlSURdIHx8IChmW3QudW5pcXVlSURdID0ge30pLCBpICYmIGkgPT09IHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgdCA9IHRbcl0gfHwgdDsgZWxzZSB7IGlmICgobCA9IGNbb10pICYmIGxbMF0gPT09IEMgJiYgbFsxXSA9PT0gdSkgcmV0dXJuIGRbMl0gPSBsWzJdOyBpZiAoY1tvXSA9IGQsIGRbMl0gPSBlKHQsIG4sIHMpKSByZXR1cm4gITAgfSByZXR1cm4gITEgfSB9IGZ1bmN0aW9uIGJlKGUpIHsgcmV0dXJuIGUubGVuZ3RoID4gMSA/IGZ1bmN0aW9uICh0LCBuLCByKSB7IHZhciBpID0gZS5sZW5ndGg7IHdoaWxlIChpLS0pIGlmICghZVtpXSh0LCBuLCByKSkgcmV0dXJuICExOyByZXR1cm4gITAgfSA6IGVbMF0gfSBmdW5jdGlvbiB4ZShlLCB0LCBuKSB7IGZvciAodmFyIHIgPSAwLCBpID0gdC5sZW5ndGg7IHIgPCBpOyByKyspb2UoZSwgdFtyXSwgbik7IHJldHVybiBuIH0gZnVuY3Rpb24gd2UoZSwgdCwgbiwgciwgaSkgeyBmb3IgKHZhciBvLCBhID0gW10sIHUgPSAwLCBzID0gZS5sZW5ndGgsIGwgPSBudWxsICE9IHQ7IHUgPCBzOyB1KyspKG8gPSBlW3VdKSAmJiAobiAmJiAhbihvLCByLCBpKSB8fCAoYS5wdXNoKG8pLCBsICYmIHQucHVzaCh1KSkpOyByZXR1cm4gYSB9IGZ1bmN0aW9uIENlKGUsIHQsIG4sIHIsIGksIG8pIHsgcmV0dXJuIHIgJiYgIXJbeF0gJiYgKHIgPSBDZShyKSksIGkgJiYgIWlbeF0gJiYgKGkgPSBDZShpLCBvKSksIHVlKGZ1bmN0aW9uIChvLCBhLCB1LCBzKSB7IHZhciBsLCBjLCBmLCBkID0gW10sIHAgPSBbXSwgaCA9IGEubGVuZ3RoLCBnID0gbyB8fCB4ZSh0IHx8ICIqIiwgdS5ub2RlVHlwZSA/IFt1XSA6IHUsIFtdKSwgdiA9ICFlIHx8ICFvICYmIHQgPyBnIDogd2UoZywgZCwgZSwgdSwgcyksIHkgPSBuID8gaSB8fCAobyA/IGUgOiBoIHx8IHIpID8gW10gOiBhIDogdjsgaWYgKG4gJiYgbih2LCB5LCB1LCBzKSwgcikgeyBsID0gd2UoeSwgcCksIHIobCwgW10sIHUsIHMpLCBjID0gbC5sZW5ndGg7IHdoaWxlIChjLS0pIChmID0gbFtjXSkgJiYgKHlbcFtjXV0gPSAhKHZbcFtjXV0gPSBmKSkgfSBpZiAobykgeyBpZiAoaSB8fCBlKSB7IGlmIChpKSB7IGwgPSBbXSwgYyA9IHkubGVuZ3RoOyB3aGlsZSAoYy0tKSAoZiA9IHlbY10pICYmIGwucHVzaCh2W2NdID0gZik7IGkobnVsbCwgeSA9IFtdLCBsLCBzKSB9IGMgPSB5Lmxlbmd0aDsgd2hpbGUgKGMtLSkgKGYgPSB5W2NdKSAmJiAobCA9IGkgPyBQKG8sIGYpIDogZFtjXSkgPiAtMSAmJiAob1tsXSA9ICEoYVtsXSA9IGYpKSB9IH0gZWxzZSB5ID0gd2UoeSA9PT0gYSA/IHkuc3BsaWNlKGgsIHkubGVuZ3RoKSA6IHkpLCBpID8gaShudWxsLCBhLCB5LCBzKSA6IHEuYXBwbHkoYSwgeSkgfSkgfSBmdW5jdGlvbiBUZShlKSB7IGZvciAodmFyIHQsIG4sIGksIG8gPSBlLmxlbmd0aCwgYSA9IHIucmVsYXRpdmVbZVswXS50eXBlXSwgdSA9IGEgfHwgci5yZWxhdGl2ZVsiICJdLCBzID0gYSA/IDEgOiAwLCBjID0gbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUgPT09IHQgfSwgdSwgITApLCBmID0gbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIFAodCwgZSkgPiAtMSB9LCB1LCAhMCksIGQgPSBbZnVuY3Rpb24gKGUsIG4sIHIpIHsgdmFyIGkgPSAhYSAmJiAociB8fCBuICE9PSBsKSB8fCAoKHQgPSBuKS5ub2RlVHlwZSA/IGMoZSwgbiwgcikgOiBmKGUsIG4sIHIpKTsgcmV0dXJuIHQgPSBudWxsLCBpIH1dOyBzIDwgbzsgcysrKWlmIChuID0gci5yZWxhdGl2ZVtlW3NdLnR5cGVdKSBkID0gW21lKGJlKGQpLCBuKV07IGVsc2UgeyBpZiAoKG4gPSByLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsIGVbc10ubWF0Y2hlcykpW3hdKSB7IGZvciAoaSA9ICsrczsgaSA8IG87IGkrKylpZiAoci5yZWxhdGl2ZVtlW2ldLnR5cGVdKSBicmVhazsgcmV0dXJuIENlKHMgPiAxICYmIGJlKGQpLCBzID4gMSAmJiB5ZShlLnNsaWNlKDAsIHMgLSAxKS5jb25jYXQoeyB2YWx1ZTogIiAiID09PSBlW3MgLSAyXS50eXBlID8gIioiIDogIiIgfSkpLnJlcGxhY2UoJCwgIiQxIiksIG4sIHMgPCBpICYmIFRlKGUuc2xpY2UocywgaSkpLCBpIDwgbyAmJiBUZShlID0gZS5zbGljZShpKSksIGkgPCBvICYmIHllKGUpKSB9IGQucHVzaChuKSB9IHJldHVybiBiZShkKSB9IGZ1bmN0aW9uIEVlKGUsIHQpIHsgdmFyIG4gPSB0Lmxlbmd0aCA+IDAsIGkgPSBlLmxlbmd0aCA+IDAsIG8gPSBmdW5jdGlvbiAobywgYSwgdSwgcywgYykgeyB2YXIgZiwgaCwgdiwgeSA9IDAsIG0gPSAiMCIsIGIgPSBvICYmIFtdLCB4ID0gW10sIHcgPSBsLCBUID0gbyB8fCBpICYmIHIuZmluZC5UQUcoIioiLCBjKSwgRSA9IEMgKz0gbnVsbCA9PSB3ID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgLjEsIE4gPSBULmxlbmd0aDsgZm9yIChjICYmIChsID0gYSA9PT0gcCB8fCBhIHx8IGMpOyBtICE9PSBOICYmIG51bGwgIT0gKGYgPSBUW21dKTsgbSsrKSB7IGlmIChpICYmIGYpIHsgaCA9IDAsIGEgfHwgZi5vd25lckRvY3VtZW50ID09PSBwIHx8IChkKGYpLCB1ID0gIWcpOyB3aGlsZSAodiA9IGVbaCsrXSkgaWYgKHYoZiwgYSB8fCBwLCB1KSkgeyBzLnB1c2goZik7IGJyZWFrIH0gYyAmJiAoQyA9IEUpIH0gbiAmJiAoKGYgPSAhdiAmJiBmKSAmJiB5LS0gLCBvICYmIGIucHVzaChmKSkgfSBpZiAoeSArPSBtLCBuICYmIG0gIT09IHkpIHsgaCA9IDA7IHdoaWxlICh2ID0gdFtoKytdKSB2KGIsIHgsIGEsIHUpOyBpZiAobykgeyBpZiAoeSA+IDApIHdoaWxlIChtLS0pIGJbbV0gfHwgeFttXSB8fCAoeFttXSA9IEwuY2FsbChzKSk7IHggPSB3ZSh4KSB9IHEuYXBwbHkocywgeCksIGMgJiYgIW8gJiYgeC5sZW5ndGggPiAwICYmIHkgKyB0Lmxlbmd0aCA+IDEgJiYgb2UudW5pcXVlU29ydChzKSB9IHJldHVybiBjICYmIChDID0gRSwgbCA9IHcpLCBiIH07IHJldHVybiBuID8gdWUobykgOiBvIH0gcmV0dXJuIHUgPSBvZS5jb21waWxlID0gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIgPSBbXSwgaSA9IFtdLCBvID0ga1tlICsgIiAiXTsgaWYgKCFvKSB7IHQgfHwgKHQgPSBhKGUpKSwgbiA9IHQubGVuZ3RoOyB3aGlsZSAobi0tKSAobyA9IFRlKHRbbl0pKVt4XSA/IHIucHVzaChvKSA6IGkucHVzaChvKTsgKG8gPSBrKGUsIEVlKGksIHIpKSkuc2VsZWN0b3IgPSBlIH0gcmV0dXJuIG8gfSwgcyA9IG9lLnNlbGVjdCA9IGZ1bmN0aW9uIChlLCB0LCBuLCBpKSB7IHZhciBvLCBzLCBsLCBjLCBmLCBkID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgZSAmJiBlLCBwID0gIWkgJiYgYShlID0gZC5zZWxlY3RvciB8fCBlKTsgaWYgKG4gPSBuIHx8IFtdLCAxID09PSBwLmxlbmd0aCkgeyBpZiAoKHMgPSBwWzBdID0gcFswXS5zbGljZSgwKSkubGVuZ3RoID4gMiAmJiAiSUQiID09PSAobCA9IHNbMF0pLnR5cGUgJiYgOSA9PT0gdC5ub2RlVHlwZSAmJiBnICYmIHIucmVsYXRpdmVbc1sxXS50eXBlXSkgeyBpZiAoISh0ID0gKHIuZmluZC5JRChsLm1hdGNoZXNbMF0ucmVwbGFjZShaLCBlZSksIHQpIHx8IFtdKVswXSkpIHJldHVybiBuOyBkICYmICh0ID0gdC5wYXJlbnROb2RlKSwgZSA9IGUuc2xpY2Uocy5zaGlmdCgpLnZhbHVlLmxlbmd0aCkgfSBvID0gWC5uZWVkc0NvbnRleHQudGVzdChlKSA/IDAgOiBzLmxlbmd0aDsgd2hpbGUgKG8tLSkgeyBpZiAobCA9IHNbb10sIHIucmVsYXRpdmVbYyA9IGwudHlwZV0pIGJyZWFrOyBpZiAoKGYgPSByLmZpbmRbY10pICYmIChpID0gZihsLm1hdGNoZXNbMF0ucmVwbGFjZShaLCBlZSksIEoudGVzdChzWzBdLnR5cGUpICYmIGdlKHQucGFyZW50Tm9kZSkgfHwgdCkpKSB7IGlmIChzLnNwbGljZShvLCAxKSwgIShlID0gaS5sZW5ndGggJiYgeWUocykpKSByZXR1cm4gcS5hcHBseShuLCBpKSwgbjsgYnJlYWsgfSB9IH0gcmV0dXJuIChkIHx8IHUoZSwgcCkpKGksIHQsICFnLCBuLCAhdCB8fCBKLnRlc3QoZSkgJiYgZ2UodC5wYXJlbnROb2RlKSB8fCB0KSwgbiB9LCBuLnNvcnRTdGFibGUgPSB4LnNwbGl0KCIiKS5zb3J0KEEpLmpvaW4oIiIpID09PSB4LCBuLmRldGVjdER1cGxpY2F0ZXMgPSAhIWYsIGQoKSwgbi5zb3J0RGV0YWNoZWQgPSBzZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gMSAmIGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKSB9KSwgc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iLCAiIyIgPT09IGUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSB9KSB8fCBsZSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uIChlLCB0LCBuKSB7IGlmICghbikgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsICJ0eXBlIiA9PT0gdC50b0xvd2VyQ2FzZSgpID8gMSA6IDIpIH0pLCBuLmF0dHJpYnV0ZXMgJiYgc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaW5uZXJIVE1MID0gIjxpbnB1dC8+IiwgZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCAiIiksICIiID09PSBlLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpIH0pIHx8IGxlKCJ2YWx1ZSIsIGZ1bmN0aW9uIChlLCB0LCBuKSB7IGlmICghbiAmJiAiaW5wdXQiID09PSBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHJldHVybiBlLmRlZmF1bHRWYWx1ZSB9KSwgc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG51bGwgPT0gZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgfSkgfHwgbGUoSCwgZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHI7IGlmICghbikgcmV0dXJuICEwID09PSBlW3RdID8gdC50b0xvd2VyQ2FzZSgpIDogKHIgPSBlLmdldEF0dHJpYnV0ZU5vZGUodCkpICYmIHIuc3BlY2lmaWVkID8gci52YWx1ZSA6IG51bGwgfSksIG9lIH0oZSk7IHcuZmluZCA9IEUsIHcuZXhwciA9IEUuc2VsZWN0b3JzLCB3LmV4cHJbIjoiXSA9IHcuZXhwci5wc2V1ZG9zLCB3LnVuaXF1ZVNvcnQgPSB3LnVuaXF1ZSA9IEUudW5pcXVlU29ydCwgdy50ZXh0ID0gRS5nZXRUZXh0LCB3LmlzWE1MRG9jID0gRS5pc1hNTCwgdy5jb250YWlucyA9IEUuY29udGFpbnMsIHcuZXNjYXBlU2VsZWN0b3IgPSBFLmVzY2FwZTsgdmFyIE4gPSBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciA9IFtdLCBpID0gdm9pZCAwICE9PSBuOyB3aGlsZSAoKGUgPSBlW3RdKSAmJiA5ICE9PSBlLm5vZGVUeXBlKSBpZiAoMSA9PT0gZS5ub2RlVHlwZSkgeyBpZiAoaSAmJiB3KGUpLmlzKG4pKSBicmVhazsgci5wdXNoKGUpIH0gcmV0dXJuIHIgfSwgayA9IGZ1bmN0aW9uIChlLCB0KSB7IGZvciAodmFyIG4gPSBbXTsgZTsgZSA9IGUubmV4dFNpYmxpbmcpMSA9PT0gZS5ub2RlVHlwZSAmJiBlICE9PSB0ICYmIG4ucHVzaChlKTsgcmV0dXJuIG4gfSwgQSA9IHcuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7IGZ1bmN0aW9uIEQoZSwgdCkgeyByZXR1cm4gZS5ub2RlTmFtZSAmJiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHQudG9Mb3dlckNhc2UoKSB9IHZhciBTID0gL148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7IGZ1bmN0aW9uIEwoZSwgdCwgbikgeyByZXR1cm4gZyh0KSA/IHcuZ3JlcChlLCBmdW5jdGlvbiAoZSwgcikgeyByZXR1cm4gISF0LmNhbGwoZSwgciwgZSkgIT09IG4gfSkgOiB0Lm5vZGVUeXBlID8gdy5ncmVwKGUsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID09PSB0ICE9PSBuIH0pIDogInN0cmluZyIgIT0gdHlwZW9mIHQgPyB3LmdyZXAoZSwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHMuY2FsbCh0LCBlKSA+IC0xICE9PSBuIH0pIDogdy5maWx0ZXIodCwgZSwgbikgfSB3LmZpbHRlciA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHZhciByID0gdFswXTsgcmV0dXJuIG4gJiYgKGUgPSAiOm5vdCgiICsgZSArICIpIiksIDEgPT09IHQubGVuZ3RoICYmIDEgPT09IHIubm9kZVR5cGUgPyB3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsIGUpID8gW3JdIDogW10gOiB3LmZpbmQubWF0Y2hlcyhlLCB3LmdyZXAodCwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIDEgPT09IGUubm9kZVR5cGUgfSkpIH0sIHcuZm4uZXh0ZW5kKHsgZmluZDogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4sIHIgPSB0aGlzLmxlbmd0aCwgaSA9IHRoaXM7IGlmICgic3RyaW5nIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHRoaXMucHVzaFN0YWNrKHcoZSkuZmlsdGVyKGZ1bmN0aW9uICgpIHsgZm9yICh0ID0gMDsgdCA8IHI7IHQrKylpZiAody5jb250YWlucyhpW3RdLCB0aGlzKSkgcmV0dXJuICEwIH0pKTsgZm9yIChuID0gdGhpcy5wdXNoU3RhY2soW10pLCB0ID0gMDsgdCA8IHI7IHQrKyl3LmZpbmQoZSwgaVt0XSwgbik7IHJldHVybiByID4gMSA/IHcudW5pcXVlU29ydChuKSA6IG4gfSwgZmlsdGVyOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5wdXNoU3RhY2soTCh0aGlzLCBlIHx8IFtdLCAhMSkpIH0sIG5vdDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRoaXMucHVzaFN0YWNrKEwodGhpcywgZSB8fCBbXSwgITApKSB9LCBpczogZnVuY3Rpb24gKGUpIHsgcmV0dXJuICEhTCh0aGlzLCAic3RyaW5nIiA9PSB0eXBlb2YgZSAmJiBBLnRlc3QoZSkgPyB3KGUpIDogZSB8fCBbXSwgITEpLmxlbmd0aCB9IH0pOyB2YXIgaiwgcSA9IC9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87ICh3LmZuLmluaXQgPSBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgaSwgbzsgaWYgKCFlKSByZXR1cm4gdGhpczsgaWYgKG4gPSBuIHx8IGosICJzdHJpbmciID09IHR5cGVvZiBlKSB7IGlmICghKGkgPSAiPCIgPT09IGVbMF0gJiYgIj4iID09PSBlW2UubGVuZ3RoIC0gMV0gJiYgZS5sZW5ndGggPj0gMyA/IFtudWxsLCBlLCBudWxsXSA6IHEuZXhlYyhlKSkgfHwgIWlbMV0gJiYgdCkgcmV0dXJuICF0IHx8IHQuanF1ZXJ5ID8gKHQgfHwgbikuZmluZChlKSA6IHRoaXMuY29uc3RydWN0b3IodCkuZmluZChlKTsgaWYgKGlbMV0pIHsgaWYgKHQgPSB0IGluc3RhbmNlb2YgdyA/IHRbMF0gOiB0LCB3Lm1lcmdlKHRoaXMsIHcucGFyc2VIVE1MKGlbMV0sIHQgJiYgdC5ub2RlVHlwZSA/IHQub3duZXJEb2N1bWVudCB8fCB0IDogciwgITApKSwgUy50ZXN0KGlbMV0pICYmIHcuaXNQbGFpbk9iamVjdCh0KSkgZm9yIChpIGluIHQpIGcodGhpc1tpXSkgPyB0aGlzW2ldKHRbaV0pIDogdGhpcy5hdHRyKGksIHRbaV0pOyByZXR1cm4gdGhpcyB9IHJldHVybiAobyA9IHIuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpICYmICh0aGlzWzBdID0gbywgdGhpcy5sZW5ndGggPSAxKSwgdGhpcyB9IHJldHVybiBlLm5vZGVUeXBlID8gKHRoaXNbMF0gPSBlLCB0aGlzLmxlbmd0aCA9IDEsIHRoaXMpIDogZyhlKSA/IHZvaWQgMCAhPT0gbi5yZWFkeSA/IG4ucmVhZHkoZSkgOiBlKHcpIDogdy5tYWtlQXJyYXkoZSwgdGhpcykgfSkucHJvdG90eXBlID0gdy5mbiwgaiA9IHcocik7IHZhciBPID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sIFAgPSB7IGNoaWxkcmVuOiAhMCwgY29udGVudHM6ICEwLCBuZXh0OiAhMCwgcHJldjogITAgfTsgdy5mbi5leHRlbmQoeyBoYXM6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gdyhlLCB0aGlzKSwgbiA9IHQubGVuZ3RoOyByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKCkgeyBmb3IgKHZhciBlID0gMDsgZSA8IG47IGUrKylpZiAody5jb250YWlucyh0aGlzLCB0W2VdKSkgcmV0dXJuICEwIH0pIH0sIGNsb3Nlc3Q6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gMCwgaSA9IHRoaXMubGVuZ3RoLCBvID0gW10sIGEgPSAic3RyaW5nIiAhPSB0eXBlb2YgZSAmJiB3KGUpOyBpZiAoIUEudGVzdChlKSkgZm9yICg7IHIgPCBpOyByKyspZm9yIChuID0gdGhpc1tyXTsgbiAmJiBuICE9PSB0OyBuID0gbi5wYXJlbnROb2RlKWlmIChuLm5vZGVUeXBlIDwgMTEgJiYgKGEgPyBhLmluZGV4KG4pID4gLTEgOiAxID09PSBuLm5vZGVUeXBlICYmIHcuZmluZC5tYXRjaGVzU2VsZWN0b3IobiwgZSkpKSB7IG8ucHVzaChuKTsgYnJlYWsgfSByZXR1cm4gdGhpcy5wdXNoU3RhY2soby5sZW5ndGggPiAxID8gdy51bmlxdWVTb3J0KG8pIDogbykgfSwgaW5kZXg6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID8gInN0cmluZyIgPT0gdHlwZW9mIGUgPyBzLmNhbGwodyhlKSwgdGhpc1swXSkgOiBzLmNhbGwodGhpcywgZS5qcXVlcnkgPyBlWzBdIDogZSkgOiB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTEgfSwgYWRkOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gdGhpcy5wdXNoU3RhY2sody51bmlxdWVTb3J0KHcubWVyZ2UodGhpcy5nZXQoKSwgdyhlLCB0KSkpKSB9LCBhZGRCYWNrOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5hZGQobnVsbCA9PSBlID8gdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSkgfSB9KTsgZnVuY3Rpb24gSChlLCB0KSB7IHdoaWxlICgoZSA9IGVbdF0pICYmIDEgIT09IGUubm9kZVR5cGUpOyByZXR1cm4gZSB9IHcuZWFjaCh7IHBhcmVudDogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBlLnBhcmVudE5vZGU7IHJldHVybiB0ICYmIDExICE9PSB0Lm5vZGVUeXBlID8gdCA6IG51bGwgfSwgcGFyZW50czogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIE4oZSwgInBhcmVudE5vZGUiKSB9LCBwYXJlbnRzVW50aWw6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBOKGUsICJwYXJlbnROb2RlIiwgbikgfSwgbmV4dDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEgoZSwgIm5leHRTaWJsaW5nIikgfSwgcHJldjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEgoZSwgInByZXZpb3VzU2libGluZyIpIH0sIG5leHRBbGw6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBOKGUsICJuZXh0U2libGluZyIpIH0sIHByZXZBbGw6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBOKGUsICJwcmV2aW91c1NpYmxpbmciKSB9LCBuZXh0VW50aWw6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBOKGUsICJuZXh0U2libGluZyIsIG4pIH0sIHByZXZVbnRpbDogZnVuY3Rpb24gKGUsIHQsIG4pIHsgcmV0dXJuIE4oZSwgInByZXZpb3VzU2libGluZyIsIG4pIH0sIHNpYmxpbmdzOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gaygoZS5wYXJlbnROb2RlIHx8IHt9KS5maXJzdENoaWxkLCBlKSB9LCBjaGlsZHJlbjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGsoZS5maXJzdENoaWxkKSB9LCBjb250ZW50czogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEQoZSwgImlmcmFtZSIpID8gZS5jb250ZW50RG9jdW1lbnQgOiAoRChlLCAidGVtcGxhdGUiKSAmJiAoZSA9IGUuY29udGVudCB8fCBlKSwgdy5tZXJnZShbXSwgZS5jaGlsZE5vZGVzKSkgfSB9LCBmdW5jdGlvbiAoZSwgdCkgeyB3LmZuW2VdID0gZnVuY3Rpb24gKG4sIHIpIHsgdmFyIGkgPSB3Lm1hcCh0aGlzLCB0LCBuKTsgcmV0dXJuICJVbnRpbCIgIT09IGUuc2xpY2UoLTUpICYmIChyID0gbiksIHIgJiYgInN0cmluZyIgPT0gdHlwZW9mIHIgJiYgKGkgPSB3LmZpbHRlcihyLCBpKSksIHRoaXMubGVuZ3RoID4gMSAmJiAoUFtlXSB8fCB3LnVuaXF1ZVNvcnQoaSksIE8udGVzdChlKSAmJiBpLnJldmVyc2UoKSksIHRoaXMucHVzaFN0YWNrKGkpIH0gfSk7IHZhciBJID0gL1teXHgyMFx0XHJcblxmXSsvZzsgZnVuY3Rpb24gUihlKSB7IHZhciB0ID0ge307IHJldHVybiB3LmVhY2goZS5tYXRjaChJKSB8fCBbXSwgZnVuY3Rpb24gKGUsIG4pIHsgdFtuXSA9ICEwIH0pLCB0IH0gdy5DYWxsYmFja3MgPSBmdW5jdGlvbiAoZSkgeyBlID0gInN0cmluZyIgPT0gdHlwZW9mIGUgPyBSKGUpIDogdy5leHRlbmQoe30sIGUpOyB2YXIgdCwgbiwgciwgaSwgbyA9IFtdLCBhID0gW10sIHUgPSAtMSwgcyA9IGZ1bmN0aW9uICgpIHsgZm9yIChpID0gaSB8fCBlLm9uY2UsIHIgPSB0ID0gITA7IGEubGVuZ3RoOyB1ID0gLTEpIHsgbiA9IGEuc2hpZnQoKTsgd2hpbGUgKCsrdSA8IG8ubGVuZ3RoKSAhMSA9PT0gb1t1XS5hcHBseShuWzBdLCBuWzFdKSAmJiBlLnN0b3BPbkZhbHNlICYmICh1ID0gby5sZW5ndGgsIG4gPSAhMSkgfSBlLm1lbW9yeSB8fCAobiA9ICExKSwgdCA9ICExLCBpICYmIChvID0gbiA/IFtdIDogIiIpIH0sIGwgPSB7IGFkZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbyAmJiAobiAmJiAhdCAmJiAodSA9IG8ubGVuZ3RoIC0gMSwgYS5wdXNoKG4pKSwgZnVuY3Rpb24gdChuKSB7IHcuZWFjaChuLCBmdW5jdGlvbiAobiwgcikgeyBnKHIpID8gZS51bmlxdWUgJiYgbC5oYXMocikgfHwgby5wdXNoKHIpIDogciAmJiByLmxlbmd0aCAmJiAic3RyaW5nIiAhPT0gYihyKSAmJiB0KHIpIH0pIH0oYXJndW1lbnRzKSwgbiAmJiAhdCAmJiBzKCkpLCB0aGlzIH0sIHJlbW92ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdy5lYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG47IHdoaWxlICgobiA9IHcuaW5BcnJheSh0LCBvLCBuKSkgPiAtMSkgby5zcGxpY2UobiwgMSksIG4gPD0gdSAmJiB1LS0gfSksIHRoaXMgfSwgaGFzOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSA/IHcuaW5BcnJheShlLCBvKSA+IC0xIDogby5sZW5ndGggPiAwIH0sIGVtcHR5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBvICYmIChvID0gW10pLCB0aGlzIH0sIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGkgPSBhID0gW10sIG8gPSBuID0gIiIsIHRoaXMgfSwgZGlzYWJsZWQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICFvIH0sIGxvY2s6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGkgPSBhID0gW10sIG4gfHwgdCB8fCAobyA9IG4gPSAiIiksIHRoaXMgfSwgbG9ja2VkOiBmdW5jdGlvbiAoKSB7IHJldHVybiAhIWkgfSwgZmlyZVdpdGg6IGZ1bmN0aW9uIChlLCBuKSB7IHJldHVybiBpIHx8IChuID0gW2UsIChuID0gbiB8fCBbXSkuc2xpY2UgPyBuLnNsaWNlKCkgOiBuXSwgYS5wdXNoKG4pLCB0IHx8IHMoKSksIHRoaXMgfSwgZmlyZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbC5maXJlV2l0aCh0aGlzLCBhcmd1bWVudHMpLCB0aGlzIH0sIGZpcmVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiAhIXIgfSB9OyByZXR1cm4gbCB9OyBmdW5jdGlvbiBCKGUpIHsgcmV0dXJuIGUgfSBmdW5jdGlvbiBNKGUpIHsgdGhyb3cgZSB9IGZ1bmN0aW9uIFcoZSwgdCwgbiwgcikgeyB2YXIgaTsgdHJ5IHsgZSAmJiBnKGkgPSBlLnByb21pc2UpID8gaS5jYWxsKGUpLmRvbmUodCkuZmFpbChuKSA6IGUgJiYgZyhpID0gZS50aGVuKSA/IGkuY2FsbChlLCB0LCBuKSA6IHQuYXBwbHkodm9pZCAwLCBbZV0uc2xpY2UocikpIH0gY2F0Y2ggKGUpIHsgbi5hcHBseSh2b2lkIDAsIFtlXSkgfSB9IHcuZXh0ZW5kKHsgRGVmZXJyZWQ6IGZ1bmN0aW9uICh0KSB7IHZhciBuID0gW1sibm90aWZ5IiwgInByb2dyZXNzIiwgdy5DYWxsYmFja3MoIm1lbW9yeSIpLCB3LkNhbGxiYWNrcygibWVtb3J5IiksIDJdLCBbInJlc29sdmUiLCAiZG9uZSIsIHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCB3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwgMCwgInJlc29sdmVkIl0sIFsicmVqZWN0IiwgImZhaWwiLCB3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwgdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksIDEsICJyZWplY3RlZCJdXSwgciA9ICJwZW5kaW5nIiwgaSA9IHsgc3RhdGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHIgfSwgYWx3YXlzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksIHRoaXMgfSwgImNhdGNoIjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGkudGhlbihudWxsLCBlKSB9LCBwaXBlOiBmdW5jdGlvbiAoKSB7IHZhciBlID0gYXJndW1lbnRzOyByZXR1cm4gdy5EZWZlcnJlZChmdW5jdGlvbiAodCkgeyB3LmVhY2gobiwgZnVuY3Rpb24gKG4sIHIpIHsgdmFyIGkgPSBnKGVbcls0XV0pICYmIGVbcls0XV07IG9bclsxXV0oZnVuY3Rpb24gKCkgeyB2YXIgZSA9IGkgJiYgaS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyBlICYmIGcoZS5wcm9taXNlKSA/IGUucHJvbWlzZSgpLnByb2dyZXNzKHQubm90aWZ5KS5kb25lKHQucmVzb2x2ZSkuZmFpbCh0LnJlamVjdCkgOiB0W3JbMF0gKyAiV2l0aCJdKHRoaXMsIGkgPyBbZV0gOiBhcmd1bWVudHMpIH0pIH0pLCBlID0gbnVsbCB9KS5wcm9taXNlKCkgfSwgdGhlbjogZnVuY3Rpb24gKHQsIHIsIGkpIHsgdmFyIG8gPSAwOyBmdW5jdGlvbiBhKHQsIG4sIHIsIGkpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHUgPSB0aGlzLCBzID0gYXJndW1lbnRzLCBsID0gZnVuY3Rpb24gKCkgeyB2YXIgZSwgbDsgaWYgKCEodCA8IG8pKSB7IGlmICgoZSA9IHIuYXBwbHkodSwgcykpID09PSBuLnByb21pc2UoKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7IGwgPSBlICYmICgib2JqZWN0IiA9PSB0eXBlb2YgZSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiBlKSAmJiBlLnRoZW4sIGcobCkgPyBpID8gbC5jYWxsKGUsIGEobywgbiwgQiwgaSksIGEobywgbiwgTSwgaSkpIDogKG8rKyAsIGwuY2FsbChlLCBhKG8sIG4sIEIsIGkpLCBhKG8sIG4sIE0sIGkpLCBhKG8sIG4sIEIsIG4ubm90aWZ5V2l0aCkpKSA6IChyICE9PSBCICYmICh1ID0gdm9pZCAwLCBzID0gW2VdKSwgKGkgfHwgbi5yZXNvbHZlV2l0aCkodSwgcykpIH0gfSwgYyA9IGkgPyBsIDogZnVuY3Rpb24gKCkgeyB0cnkgeyBsKCkgfSBjYXRjaCAoZSkgeyB3LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgJiYgdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsIGMuc3RhY2tUcmFjZSksIHQgKyAxID49IG8gJiYgKHIgIT09IE0gJiYgKHUgPSB2b2lkIDAsIHMgPSBbZV0pLCBuLnJlamVjdFdpdGgodSwgcykpIH0gfTsgdCA/IGMoKSA6ICh3LkRlZmVycmVkLmdldFN0YWNrSG9vayAmJiAoYy5zdGFja1RyYWNlID0gdy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksIGUuc2V0VGltZW91dChjKSkgfSB9IHJldHVybiB3LkRlZmVycmVkKGZ1bmN0aW9uIChlKSB7IG5bMF1bM10uYWRkKGEoMCwgZSwgZyhpKSA/IGkgOiBCLCBlLm5vdGlmeVdpdGgpKSwgblsxXVszXS5hZGQoYSgwLCBlLCBnKHQpID8gdCA6IEIpKSwgblsyXVszXS5hZGQoYSgwLCBlLCBnKHIpID8gciA6IE0pKSB9KS5wcm9taXNlKCkgfSwgcHJvbWlzZTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG51bGwgIT0gZSA/IHcuZXh0ZW5kKGUsIGkpIDogaSB9IH0sIG8gPSB7fTsgcmV0dXJuIHcuZWFjaChuLCBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgYSA9IHRbMl0sIHUgPSB0WzVdOyBpW3RbMV1dID0gYS5hZGQsIHUgJiYgYS5hZGQoZnVuY3Rpb24gKCkgeyByID0gdSB9LCBuWzMgLSBlXVsyXS5kaXNhYmxlLCBuWzMgLSBlXVszXS5kaXNhYmxlLCBuWzBdWzJdLmxvY2ssIG5bMF1bM10ubG9jayksIGEuYWRkKHRbM10uZmlyZSksIG9bdFswXV0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvW3RbMF0gKyAiV2l0aCJdKHRoaXMgPT09IG8gPyB2b2lkIDAgOiB0aGlzLCBhcmd1bWVudHMpLCB0aGlzIH0sIG9bdFswXSArICJXaXRoIl0gPSBhLmZpcmVXaXRoIH0pLCBpLnByb21pc2UobyksIHQgJiYgdC5jYWxsKG8sIG8pLCBvIH0sIHdoZW46IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IHQsIHIgPSBBcnJheShuKSwgaSA9IG8uY2FsbChhcmd1bWVudHMpLCBhID0gdy5EZWZlcnJlZCgpLCB1ID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGZ1bmN0aW9uIChuKSB7IHJbZV0gPSB0aGlzLCBpW2VdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBvLmNhbGwoYXJndW1lbnRzKSA6IG4sIC0tdCB8fCBhLnJlc29sdmVXaXRoKHIsIGkpIH0gfTsgaWYgKHQgPD0gMSAmJiAoVyhlLCBhLmRvbmUodShuKSkucmVzb2x2ZSwgYS5yZWplY3QsICF0KSwgInBlbmRpbmciID09PSBhLnN0YXRlKCkgfHwgZyhpW25dICYmIGlbbl0udGhlbikpKSByZXR1cm4gYS50aGVuKCk7IHdoaWxlIChuLS0pIFcoaVtuXSwgdShuKSwgYS5yZWplY3QpOyByZXR1cm4gYS5wcm9taXNlKCkgfSB9KTsgdmFyICQgPSAvXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLzsgdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24gKHQsIG4pIHsgZS5jb25zb2xlICYmIGUuY29uc29sZS53YXJuICYmIHQgJiYgJC50ZXN0KHQubmFtZSkgJiYgZS5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyB0Lm1lc3NhZ2UsIHQuc3RhY2ssIG4pIH0sIHcucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiAodCkgeyBlLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aHJvdyB0IH0pIH07IHZhciBGID0gdy5EZWZlcnJlZCgpOyB3LmZuLnJlYWR5ID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbiAoZSkgeyB3LnJlYWR5RXhjZXB0aW9uKGUpIH0pLCB0aGlzIH0sIHcuZXh0ZW5kKHsgaXNSZWFkeTogITEsIHJlYWR5V2FpdDogMSwgcmVhZHk6IGZ1bmN0aW9uIChlKSB7ICghMCA9PT0gZSA/IC0tdy5yZWFkeVdhaXQgOiB3LmlzUmVhZHkpIHx8ICh3LmlzUmVhZHkgPSAhMCwgITAgIT09IGUgJiYgLS13LnJlYWR5V2FpdCA+IDAgfHwgRi5yZXNvbHZlV2l0aChyLCBbd10pKSB9IH0pLCB3LnJlYWR5LnRoZW4gPSBGLnRoZW47IGZ1bmN0aW9uIHooKSB7IHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIHopLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLCB6KSwgdy5yZWFkeSgpIH0gImNvbXBsZXRlIiA9PT0gci5yZWFkeVN0YXRlIHx8ICJsb2FkaW5nIiAhPT0gci5yZWFkeVN0YXRlICYmICFyLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCA/IGUuc2V0VGltZW91dCh3LnJlYWR5KSA6IChyLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCB6KSwgZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgeikpOyB2YXIgXyA9IGZ1bmN0aW9uIChlLCB0LCBuLCByLCBpLCBvLCBhKSB7IHZhciB1ID0gMCwgcyA9IGUubGVuZ3RoLCBsID0gbnVsbCA9PSBuOyBpZiAoIm9iamVjdCIgPT09IGIobikpIHsgaSA9ICEwOyBmb3IgKHUgaW4gbikgXyhlLCB0LCB1LCBuW3VdLCAhMCwgbywgYSkgfSBlbHNlIGlmICh2b2lkIDAgIT09IHIgJiYgKGkgPSAhMCwgZyhyKSB8fCAoYSA9ICEwKSwgbCAmJiAoYSA/ICh0LmNhbGwoZSwgciksIHQgPSBudWxsKSA6IChsID0gdCwgdCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBsLmNhbGwodyhlKSwgbikgfSkpLCB0KSkgZm9yICg7IHUgPCBzOyB1KyspdChlW3VdLCBuLCBhID8gciA6IHIuY2FsbChlW3VdLCB1LCB0KGVbdV0sIG4pKSk7IHJldHVybiBpID8gZSA6IGwgPyB0LmNhbGwoZSkgOiBzID8gdChlWzBdLCBuKSA6IG8gfSwgVSA9IC9eLW1zLS8sIFYgPSAvLShbYS16XSkvZzsgZnVuY3Rpb24gWChlLCB0KSB7IHJldHVybiB0LnRvVXBwZXJDYXNlKCkgfSBmdW5jdGlvbiBRKGUpIHsgcmV0dXJuIGUucmVwbGFjZShVLCAibXMtIikucmVwbGFjZShWLCBYKSB9IHZhciBZID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIDEgPT09IGUubm9kZVR5cGUgfHwgOSA9PT0gZS5ub2RlVHlwZSB8fCAhK2Uubm9kZVR5cGUgfTsgZnVuY3Rpb24gRygpIHsgdGhpcy5leHBhbmRvID0gdy5leHBhbmRvICsgRy51aWQrKyB9IEcudWlkID0gMSwgRy5wcm90b3R5cGUgPSB7IGNhY2hlOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGVbdGhpcy5leHBhbmRvXTsgcmV0dXJuIHQgfHwgKHQgPSB7fSwgWShlKSAmJiAoZS5ub2RlVHlwZSA/IGVbdGhpcy5leHBhbmRvXSA9IHQgOiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdGhpcy5leHBhbmRvLCB7IHZhbHVlOiB0LCBjb25maWd1cmFibGU6ICEwIH0pKSksIHQgfSwgc2V0OiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaSA9IHRoaXMuY2FjaGUoZSk7IGlmICgic3RyaW5nIiA9PSB0eXBlb2YgdCkgaVtRKHQpXSA9IG47IGVsc2UgZm9yIChyIGluIHQpIGlbUShyKV0gPSB0W3JdOyByZXR1cm4gaSB9LCBnZXQ6IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiB2b2lkIDAgPT09IHQgPyB0aGlzLmNhY2hlKGUpIDogZVt0aGlzLmV4cGFuZG9dICYmIGVbdGhpcy5leHBhbmRvXVtRKHQpXSB9LCBhY2Nlc3M6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiB2b2lkIDAgPT09IHQgfHwgdCAmJiAic3RyaW5nIiA9PSB0eXBlb2YgdCAmJiB2b2lkIDAgPT09IG4gPyB0aGlzLmdldChlLCB0KSA6ICh0aGlzLnNldChlLCB0LCBuKSwgdm9pZCAwICE9PSBuID8gbiA6IHQpIH0sIHJlbW92ZTogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIgPSBlW3RoaXMuZXhwYW5kb107IGlmICh2b2lkIDAgIT09IHIpIHsgaWYgKHZvaWQgMCAhPT0gdCkgeyBuID0gKHQgPSBBcnJheS5pc0FycmF5KHQpID8gdC5tYXAoUSkgOiAodCA9IFEodCkpIGluIHIgPyBbdF0gOiB0Lm1hdGNoKEkpIHx8IFtdKS5sZW5ndGg7IHdoaWxlIChuLS0pIGRlbGV0ZSByW3Rbbl1dIH0gKHZvaWQgMCA9PT0gdCB8fCB3LmlzRW1wdHlPYmplY3QocikpICYmIChlLm5vZGVUeXBlID8gZVt0aGlzLmV4cGFuZG9dID0gdm9pZCAwIDogZGVsZXRlIGVbdGhpcy5leHBhbmRvXSkgfSB9LCBoYXNEYXRhOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGVbdGhpcy5leHBhbmRvXTsgcmV0dXJuIHZvaWQgMCAhPT0gdCAmJiAhdy5pc0VtcHR5T2JqZWN0KHQpIH0gfTsgdmFyIEsgPSBuZXcgRywgSiA9IG5ldyBHLCBaID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywgZWUgPSAvW0EtWl0vZzsgZnVuY3Rpb24gdGUoZSkgeyByZXR1cm4gInRydWUiID09PSBlIHx8ICJmYWxzZSIgIT09IGUgJiYgKCJudWxsIiA9PT0gZSA/IG51bGwgOiBlID09PSArZSArICIiID8gK2UgOiBaLnRlc3QoZSkgPyBKU09OLnBhcnNlKGUpIDogZSkgfSBmdW5jdGlvbiBuZShlLCB0LCBuKSB7IHZhciByOyBpZiAodm9pZCAwID09PSBuICYmIDEgPT09IGUubm9kZVR5cGUpIGlmIChyID0gImRhdGEtIiArIHQucmVwbGFjZShlZSwgIi0kJiIpLnRvTG93ZXJDYXNlKCksICJzdHJpbmciID09IHR5cGVvZiAobiA9IGUuZ2V0QXR0cmlidXRlKHIpKSkgeyB0cnkgeyBuID0gdGUobikgfSBjYXRjaCAoZSkgeyB9IEouc2V0KGUsIHQsIG4pIH0gZWxzZSBuID0gdm9pZCAwOyByZXR1cm4gbiB9IHcuZXh0ZW5kKHsgaGFzRGF0YTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEouaGFzRGF0YShlKSB8fCBLLmhhc0RhdGEoZSkgfSwgZGF0YTogZnVuY3Rpb24gKGUsIHQsIG4pIHsgcmV0dXJuIEouYWNjZXNzKGUsIHQsIG4pIH0sIHJlbW92ZURhdGE6IGZ1bmN0aW9uIChlLCB0KSB7IEoucmVtb3ZlKGUsIHQpIH0sIF9kYXRhOiBmdW5jdGlvbiAoZSwgdCwgbikgeyByZXR1cm4gSy5hY2Nlc3MoZSwgdCwgbikgfSwgX3JlbW92ZURhdGE6IGZ1bmN0aW9uIChlLCB0KSB7IEsucmVtb3ZlKGUsIHQpIH0gfSksIHcuZm4uZXh0ZW5kKHsgZGF0YTogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIsIGksIG8gPSB0aGlzWzBdLCBhID0gbyAmJiBvLmF0dHJpYnV0ZXM7IGlmICh2b2lkIDAgPT09IGUpIHsgaWYgKHRoaXMubGVuZ3RoICYmIChpID0gSi5nZXQobyksIDEgPT09IG8ubm9kZVR5cGUgJiYgIUsuZ2V0KG8sICJoYXNEYXRhQXR0cnMiKSkpIHsgbiA9IGEubGVuZ3RoOyB3aGlsZSAobi0tKSBhW25dICYmIDAgPT09IChyID0gYVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpICYmIChyID0gUShyLnNsaWNlKDUpKSwgbmUobywgciwgaVtyXSkpOyBLLnNldChvLCAiaGFzRGF0YUF0dHJzIiwgITApIH0gcmV0dXJuIGkgfSByZXR1cm4gIm9iamVjdCIgPT0gdHlwZW9mIGUgPyB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeyBKLnNldCh0aGlzLCBlKSB9KSA6IF8odGhpcywgZnVuY3Rpb24gKHQpIHsgdmFyIG47IGlmIChvICYmIHZvaWQgMCA9PT0gdCkgeyBpZiAodm9pZCAwICE9PSAobiA9IEouZ2V0KG8sIGUpKSkgcmV0dXJuIG47IGlmICh2b2lkIDAgIT09IChuID0gbmUobywgZSkpKSByZXR1cm4gbiB9IGVsc2UgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgSi5zZXQodGhpcywgZSwgdCkgfSkgfSwgbnVsbCwgdCwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsICEwKSB9LCByZW1vdmVEYXRhOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgSi5yZW1vdmUodGhpcywgZSkgfSkgfSB9KSwgdy5leHRlbmQoeyBxdWV1ZTogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHI7IGlmIChlKSByZXR1cm4gdCA9ICh0IHx8ICJmeCIpICsgInF1ZXVlIiwgciA9IEsuZ2V0KGUsIHQpLCBuICYmICghciB8fCBBcnJheS5pc0FycmF5KG4pID8gciA9IEsuYWNjZXNzKGUsIHQsIHcubWFrZUFycmF5KG4pKSA6IHIucHVzaChuKSksIHIgfHwgW10gfSwgZGVxdWV1ZTogZnVuY3Rpb24gKGUsIHQpIHsgdCA9IHQgfHwgImZ4IjsgdmFyIG4gPSB3LnF1ZXVlKGUsIHQpLCByID0gbi5sZW5ndGgsIGkgPSBuLnNoaWZ0KCksIG8gPSB3Ll9xdWV1ZUhvb2tzKGUsIHQpLCBhID0gZnVuY3Rpb24gKCkgeyB3LmRlcXVldWUoZSwgdCkgfTsgImlucHJvZ3Jlc3MiID09PSBpICYmIChpID0gbi5zaGlmdCgpLCByLS0pLCBpICYmICgiZngiID09PSB0ICYmIG4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLCBkZWxldGUgby5zdG9wLCBpLmNhbGwoZSwgYSwgbykpLCAhciAmJiBvICYmIG8uZW1wdHkuZmlyZSgpIH0sIF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IHQgKyAicXVldWVIb29rcyI7IHJldHVybiBLLmdldChlLCBuKSB8fCBLLmFjY2VzcyhlLCBuLCB7IGVtcHR5OiB3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24gKCkgeyBLLnJlbW92ZShlLCBbdCArICJxdWV1ZSIsIG5dKSB9KSB9KSB9IH0pLCB3LmZuLmV4dGVuZCh7IHF1ZXVlOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IDI7IHJldHVybiAic3RyaW5nIiAhPSB0eXBlb2YgZSAmJiAodCA9IGUsIGUgPSAiZngiLCBuLS0pLCBhcmd1bWVudHMubGVuZ3RoIDwgbiA/IHcucXVldWUodGhpc1swXSwgZSkgOiB2b2lkIDAgPT09IHQgPyB0aGlzIDogdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgdmFyIG4gPSB3LnF1ZXVlKHRoaXMsIGUsIHQpOyB3Ll9xdWV1ZUhvb2tzKHRoaXMsIGUpLCAiZngiID09PSBlICYmICJpbnByb2dyZXNzIiAhPT0gblswXSAmJiB3LmRlcXVldWUodGhpcywgZSkgfSkgfSwgZGVxdWV1ZTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7IHcuZGVxdWV1ZSh0aGlzLCBlKSB9KSB9LCBjbGVhclF1ZXVlOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5xdWV1ZShlIHx8ICJmeCIsIFtdKSB9LCBwcm9taXNlOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiwgciA9IDEsIGkgPSB3LkRlZmVycmVkKCksIG8gPSB0aGlzLCBhID0gdGhpcy5sZW5ndGgsIHUgPSBmdW5jdGlvbiAoKSB7IC0tciB8fCBpLnJlc29sdmVXaXRoKG8sIFtvXSkgfTsgInN0cmluZyIgIT0gdHlwZW9mIGUgJiYgKHQgPSBlLCBlID0gdm9pZCAwKSwgZSA9IGUgfHwgImZ4Ijsgd2hpbGUgKGEtLSkgKG4gPSBLLmdldChvW2FdLCBlICsgInF1ZXVlSG9va3MiKSkgJiYgbi5lbXB0eSAmJiAocisrICwgbi5lbXB0eS5hZGQodSkpOyByZXR1cm4gdSgpLCBpLnByb21pc2UodCkgfSB9KTsgdmFyIHJlID0gL1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsIGllID0gbmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiICsgcmUgKyAiKShbYS16JV0qKSQiLCAiaSIpLCBvZSA9IFsiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0Il0sIGFlID0gZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuICJub25lIiA9PT0gKGUgPSB0IHx8IGUpLnN0eWxlLmRpc3BsYXkgfHwgIiIgPT09IGUuc3R5bGUuZGlzcGxheSAmJiB3LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCwgZSkgJiYgIm5vbmUiID09PSB3LmNzcyhlLCAiZGlzcGxheSIpIH0sIHVlID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsgdmFyIGksIG8sIGEgPSB7fTsgZm9yIChvIGluIHQpIGFbb10gPSBlLnN0eWxlW29dLCBlLnN0eWxlW29dID0gdFtvXTsgaSA9IG4uYXBwbHkoZSwgciB8fCBbXSk7IGZvciAobyBpbiB0KSBlLnN0eWxlW29dID0gYVtvXTsgcmV0dXJuIGkgfTsgZnVuY3Rpb24gc2UoZSwgdCwgbiwgcikgeyB2YXIgaSwgbywgYSA9IDIwLCB1ID0gciA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHIuY3VyKCkgfSA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHcuY3NzKGUsIHQsICIiKSB9LCBzID0gdSgpLCBsID0gbiAmJiBuWzNdIHx8ICh3LmNzc051bWJlclt0XSA/ICIiIDogInB4IiksIGMgPSAody5jc3NOdW1iZXJbdF0gfHwgInB4IiAhPT0gbCAmJiArcykgJiYgaWUuZXhlYyh3LmNzcyhlLCB0KSk7IGlmIChjICYmIGNbM10gIT09IGwpIHsgcyAvPSAyLCBsID0gbCB8fCBjWzNdLCBjID0gK3MgfHwgMTsgd2hpbGUgKGEtLSkgdy5zdHlsZShlLCB0LCBjICsgbCksICgxIC0gbykgKiAoMSAtIChvID0gdSgpIC8gcyB8fCAuNSkpIDw9IDAgJiYgKGEgPSAwKSwgYyAvPSBvOyBjICo9IDIsIHcuc3R5bGUoZSwgdCwgYyArIGwpLCBuID0gbiB8fCBbXSB9IHJldHVybiBuICYmIChjID0gK2MgfHwgK3MgfHwgMCwgaSA9IG5bMV0gPyBjICsgKG5bMV0gKyAxKSAqIG5bMl0gOiArblsyXSwgciAmJiAoci51bml0ID0gbCwgci5zdGFydCA9IGMsIHIuZW5kID0gaSkpLCBpIH0gdmFyIGxlID0ge307IGZ1bmN0aW9uIGNlKGUpIHsgdmFyIHQsIG4gPSBlLm93bmVyRG9jdW1lbnQsIHIgPSBlLm5vZGVOYW1lLCBpID0gbGVbcl07IHJldHVybiBpIHx8ICh0ID0gbi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksIGkgPSB3LmNzcyh0LCAiZGlzcGxheSIpLCB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksICJub25lIiA9PT0gaSAmJiAoaSA9ICJibG9jayIpLCBsZVtyXSA9IGksIGkpIH0gZnVuY3Rpb24gZmUoZSwgdCkgeyBmb3IgKHZhciBuLCByLCBpID0gW10sIG8gPSAwLCBhID0gZS5sZW5ndGg7IG8gPCBhOyBvKyspKHIgPSBlW29dKS5zdHlsZSAmJiAobiA9IHIuc3R5bGUuZGlzcGxheSwgdCA/ICgibm9uZSIgPT09IG4gJiYgKGlbb10gPSBLLmdldChyLCAiZGlzcGxheSIpIHx8IG51bGwsIGlbb10gfHwgKHIuc3R5bGUuZGlzcGxheSA9ICIiKSksICIiID09PSByLnN0eWxlLmRpc3BsYXkgJiYgYWUocikgJiYgKGlbb10gPSBjZShyKSkpIDogIm5vbmUiICE9PSBuICYmIChpW29dID0gIm5vbmUiLCBLLnNldChyLCAiZGlzcGxheSIsIG4pKSk7IGZvciAobyA9IDA7IG8gPCBhOyBvKyspbnVsbCAhPSBpW29dICYmIChlW29dLnN0eWxlLmRpc3BsYXkgPSBpW29dKTsgcmV0dXJuIGUgfSB3LmZuLmV4dGVuZCh7IHNob3c6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZlKHRoaXMsICEwKSB9LCBoaWRlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmZSh0aGlzKSB9LCB0b2dnbGU6IGZ1bmN0aW9uIChlKSB7IHJldHVybiAiYm9vbGVhbiIgPT0gdHlwZW9mIGUgPyBlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKSA6IHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7IGFlKHRoaXMpID8gdyh0aGlzKS5zaG93KCkgOiB3KHRoaXMpLmhpZGUoKSB9KSB9IH0pOyB2YXIgZGUgPSAvXig/OmNoZWNrYm94fHJhZGlvKSQvaSwgcGUgPSAvPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKykvaSwgaGUgPSAvXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksIGdlID0geyBvcHRpb246IFsxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iXSwgdGhlYWQ6IFsxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiJdLCBjb2w6IFsyLCAiPHRhYmxlPjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiJdLCB0cjogWzIsICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+Il0sIHRkOiBbMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSwgX2RlZmF1bHQ6IFswLCAiIiwgIiJdIH07IGdlLm9wdGdyb3VwID0gZ2Uub3B0aW9uLCBnZS50Ym9keSA9IGdlLnRmb290ID0gZ2UuY29sZ3JvdXAgPSBnZS5jYXB0aW9uID0gZ2UudGhlYWQsIGdlLnRoID0gZ2UudGQ7IGZ1bmN0aW9uIHZlKGUsIHQpIHsgdmFyIG47IHJldHVybiBuID0gInVuZGVmaW5lZCIgIT0gdHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQgfHwgIioiKSA6ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGwgPyBlLnF1ZXJ5U2VsZWN0b3JBbGwodCB8fCAiKiIpIDogW10sIHZvaWQgMCA9PT0gdCB8fCB0ICYmIEQoZSwgdCkgPyB3Lm1lcmdlKFtlXSwgbikgOiBuIH0gZnVuY3Rpb24geWUoZSwgdCkgeyBmb3IgKHZhciBuID0gMCwgciA9IGUubGVuZ3RoOyBuIDwgcjsgbisrKUsuc2V0KGVbbl0sICJnbG9iYWxFdmFsIiwgIXQgfHwgSy5nZXQodFtuXSwgImdsb2JhbEV2YWwiKSkgfSB2YXIgbWUgPSAvPHwmIz9cdys7LzsgZnVuY3Rpb24gYmUoZSwgdCwgbiwgciwgaSkgeyBmb3IgKHZhciBvLCBhLCB1LCBzLCBsLCBjLCBmID0gdC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksIGQgPSBbXSwgcCA9IDAsIGggPSBlLmxlbmd0aDsgcCA8IGg7IHArKylpZiAoKG8gPSBlW3BdKSB8fCAwID09PSBvKSBpZiAoIm9iamVjdCIgPT09IGIobykpIHcubWVyZ2UoZCwgby5ub2RlVHlwZSA/IFtvXSA6IG8pOyBlbHNlIGlmIChtZS50ZXN0KG8pKSB7IGEgPSBhIHx8IGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSksIHUgPSAocGUuZXhlYyhvKSB8fCBbIiIsICIiXSlbMV0udG9Mb3dlckNhc2UoKSwgcyA9IGdlW3VdIHx8IGdlLl9kZWZhdWx0LCBhLmlubmVySFRNTCA9IHNbMV0gKyB3Lmh0bWxQcmVmaWx0ZXIobykgKyBzWzJdLCBjID0gc1swXTsgd2hpbGUgKGMtLSkgYSA9IGEubGFzdENoaWxkOyB3Lm1lcmdlKGQsIGEuY2hpbGROb2RlcyksIChhID0gZi5maXJzdENoaWxkKS50ZXh0Q29udGVudCA9ICIiIH0gZWxzZSBkLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7IGYudGV4dENvbnRlbnQgPSAiIiwgcCA9IDA7IHdoaWxlIChvID0gZFtwKytdKSBpZiAociAmJiB3LmluQXJyYXkobywgcikgPiAtMSkgaSAmJiBpLnB1c2gobyk7IGVsc2UgaWYgKGwgPSB3LmNvbnRhaW5zKG8ub3duZXJEb2N1bWVudCwgbyksIGEgPSB2ZShmLmFwcGVuZENoaWxkKG8pLCAic2NyaXB0IiksIGwgJiYgeWUoYSksIG4pIHsgYyA9IDA7IHdoaWxlIChvID0gYVtjKytdKSBoZS50ZXN0KG8udHlwZSB8fCAiIikgJiYgbi5wdXNoKG8pIH0gcmV0dXJuIGYgfSAhZnVuY3Rpb24gKCkgeyB2YXIgZSA9IHIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudCgiZGl2IikpLCB0ID0gci5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOyB0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJyYWRpbyIpLCB0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsICJjaGVja2VkIiksIHQuc2V0QXR0cmlidXRlKCJuYW1lIiwgInQiKSwgZS5hcHBlbmRDaGlsZCh0KSwgaC5jaGVja0Nsb25lID0gZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsIGUuaW5uZXJIVE1MID0gIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLCBoLm5vQ2xvbmVDaGVja2VkID0gISFlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSB9KCk7IHZhciB4ZSA9IHIuZG9jdW1lbnRFbGVtZW50LCB3ZSA9IC9ea2V5LywgQ2UgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sIFRlID0gL14oW14uXSopKD86XC4oLispfCkvOyBmdW5jdGlvbiBFZSgpIHsgcmV0dXJuICEwIH0gZnVuY3Rpb24gTmUoKSB7IHJldHVybiAhMSB9IGZ1bmN0aW9uIGtlKCkgeyB0cnkgeyByZXR1cm4gci5hY3RpdmVFbGVtZW50IH0gY2F0Y2ggKGUpIHsgfSB9IGZ1bmN0aW9uIEFlKGUsIHQsIG4sIHIsIGksIG8pIHsgdmFyIGEsIHU7IGlmICgib2JqZWN0IiA9PSB0eXBlb2YgdCkgeyAic3RyaW5nIiAhPSB0eXBlb2YgbiAmJiAociA9IHIgfHwgbiwgbiA9IHZvaWQgMCk7IGZvciAodSBpbiB0KSBBZShlLCB1LCBuLCByLCB0W3VdLCBvKTsgcmV0dXJuIGUgfSBpZiAobnVsbCA9PSByICYmIG51bGwgPT0gaSA/IChpID0gbiwgciA9IG4gPSB2b2lkIDApIDogbnVsbCA9PSBpICYmICgic3RyaW5nIiA9PSB0eXBlb2YgbiA/IChpID0gciwgciA9IHZvaWQgMCkgOiAoaSA9IHIsIHIgPSBuLCBuID0gdm9pZCAwKSksICExID09PSBpKSBpID0gTmU7IGVsc2UgaWYgKCFpKSByZXR1cm4gZTsgcmV0dXJuIDEgPT09IG8gJiYgKGEgPSBpLCAoaSA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiB3KCkub2ZmKGUpLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfSkuZ3VpZCA9IGEuZ3VpZCB8fCAoYS5ndWlkID0gdy5ndWlkKyspKSwgZS5lYWNoKGZ1bmN0aW9uICgpIHsgdy5ldmVudC5hZGQodGhpcywgdCwgaSwgciwgbikgfSkgfSB3LmV2ZW50ID0geyBnbG9iYWw6IHt9LCBhZGQ6IGZ1bmN0aW9uIChlLCB0LCBuLCByLCBpKSB7IHZhciBvLCBhLCB1LCBzLCBsLCBjLCBmLCBkLCBwLCBoLCBnLCB2ID0gSy5nZXQoZSk7IGlmICh2KSB7IG4uaGFuZGxlciAmJiAobiA9IChvID0gbikuaGFuZGxlciwgaSA9IG8uc2VsZWN0b3IpLCBpICYmIHcuZmluZC5tYXRjaGVzU2VsZWN0b3IoeGUsIGkpLCBuLmd1aWQgfHwgKG4uZ3VpZCA9IHcuZ3VpZCsrKSwgKHMgPSB2LmV2ZW50cykgfHwgKHMgPSB2LmV2ZW50cyA9IHt9KSwgKGEgPSB2LmhhbmRsZSkgfHwgKGEgPSB2LmhhbmRsZSA9IGZ1bmN0aW9uICh0KSB7IHJldHVybiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgdyAmJiB3LmV2ZW50LnRyaWdnZXJlZCAhPT0gdC50eXBlID8gdy5ldmVudC5kaXNwYXRjaC5hcHBseShlLCBhcmd1bWVudHMpIDogdm9pZCAwIH0pLCBsID0gKHQgPSAodCB8fCAiIikubWF0Y2goSSkgfHwgWyIiXSkubGVuZ3RoOyB3aGlsZSAobC0tKSBwID0gZyA9ICh1ID0gVGUuZXhlYyh0W2xdKSB8fCBbXSlbMV0sIGggPSAodVsyXSB8fCAiIikuc3BsaXQoIi4iKS5zb3J0KCksIHAgJiYgKGYgPSB3LmV2ZW50LnNwZWNpYWxbcF0gfHwge30sIHAgPSAoaSA/IGYuZGVsZWdhdGVUeXBlIDogZi5iaW5kVHlwZSkgfHwgcCwgZiA9IHcuZXZlbnQuc3BlY2lhbFtwXSB8fCB7fSwgYyA9IHcuZXh0ZW5kKHsgdHlwZTogcCwgb3JpZ1R5cGU6IGcsIGRhdGE6IHIsIGhhbmRsZXI6IG4sIGd1aWQ6IG4uZ3VpZCwgc2VsZWN0b3I6IGksIG5lZWRzQ29udGV4dDogaSAmJiB3LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksIG5hbWVzcGFjZTogaC5qb2luKCIuIikgfSwgbyksIChkID0gc1twXSkgfHwgKChkID0gc1twXSA9IFtdKS5kZWxlZ2F0ZUNvdW50ID0gMCwgZi5zZXR1cCAmJiAhMSAhPT0gZi5zZXR1cC5jYWxsKGUsIHIsIGgsIGEpIHx8IGUuYWRkRXZlbnRMaXN0ZW5lciAmJiBlLmFkZEV2ZW50TGlzdGVuZXIocCwgYSkpLCBmLmFkZCAmJiAoZi5hZGQuY2FsbChlLCBjKSwgYy5oYW5kbGVyLmd1aWQgfHwgKGMuaGFuZGxlci5ndWlkID0gbi5ndWlkKSksIGkgPyBkLnNwbGljZShkLmRlbGVnYXRlQ291bnQrKywgMCwgYykgOiBkLnB1c2goYyksIHcuZXZlbnQuZ2xvYmFsW3BdID0gITApIH0gfSwgcmVtb3ZlOiBmdW5jdGlvbiAoZSwgdCwgbiwgciwgaSkgeyB2YXIgbywgYSwgdSwgcywgbCwgYywgZiwgZCwgcCwgaCwgZywgdiA9IEsuaGFzRGF0YShlKSAmJiBLLmdldChlKTsgaWYgKHYgJiYgKHMgPSB2LmV2ZW50cykpIHsgbCA9ICh0ID0gKHQgfHwgIiIpLm1hdGNoKEkpIHx8IFsiIl0pLmxlbmd0aDsgd2hpbGUgKGwtLSkgaWYgKHUgPSBUZS5leGVjKHRbbF0pIHx8IFtdLCBwID0gZyA9IHVbMV0sIGggPSAodVsyXSB8fCAiIikuc3BsaXQoIi4iKS5zb3J0KCksIHApIHsgZiA9IHcuZXZlbnQuc3BlY2lhbFtwXSB8fCB7fSwgZCA9IHNbcCA9IChyID8gZi5kZWxlZ2F0ZVR5cGUgOiBmLmJpbmRUeXBlKSB8fCBwXSB8fCBbXSwgdSA9IHVbMl0gJiYgbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIiksIGEgPSBvID0gZC5sZW5ndGg7IHdoaWxlIChvLS0pIGMgPSBkW29dLCAhaSAmJiBnICE9PSBjLm9yaWdUeXBlIHx8IG4gJiYgbi5ndWlkICE9PSBjLmd1aWQgfHwgdSAmJiAhdS50ZXN0KGMubmFtZXNwYWNlKSB8fCByICYmIHIgIT09IGMuc2VsZWN0b3IgJiYgKCIqKiIgIT09IHIgfHwgIWMuc2VsZWN0b3IpIHx8IChkLnNwbGljZShvLCAxKSwgYy5zZWxlY3RvciAmJiBkLmRlbGVnYXRlQ291bnQtLSAsIGYucmVtb3ZlICYmIGYucmVtb3ZlLmNhbGwoZSwgYykpOyBhICYmICFkLmxlbmd0aCAmJiAoZi50ZWFyZG93biAmJiAhMSAhPT0gZi50ZWFyZG93bi5jYWxsKGUsIGgsIHYuaGFuZGxlKSB8fCB3LnJlbW92ZUV2ZW50KGUsIHAsIHYuaGFuZGxlKSwgZGVsZXRlIHNbcF0pIH0gZWxzZSBmb3IgKHAgaW4gcykgdy5ldmVudC5yZW1vdmUoZSwgcCArIHRbbF0sIG4sIHIsICEwKTsgdy5pc0VtcHR5T2JqZWN0KHMpICYmIEsucmVtb3ZlKGUsICJoYW5kbGUgZXZlbnRzIikgfSB9LCBkaXNwYXRjaDogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSB3LmV2ZW50LmZpeChlKSwgbiwgciwgaSwgbywgYSwgdSwgcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSwgbCA9IChLLmdldCh0aGlzLCAiZXZlbnRzIikgfHwge30pW3QudHlwZV0gfHwgW10sIGMgPSB3LmV2ZW50LnNwZWNpYWxbdC50eXBlXSB8fCB7fTsgZm9yIChzWzBdID0gdCwgbiA9IDE7IG4gPCBhcmd1bWVudHMubGVuZ3RoOyBuKyspc1tuXSA9IGFyZ3VtZW50c1tuXTsgaWYgKHQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzLCAhYy5wcmVEaXNwYXRjaCB8fCAhMSAhPT0gYy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsIHQpKSB7IHUgPSB3LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcywgdCwgbCksIG4gPSAwOyB3aGlsZSAoKG8gPSB1W24rK10pICYmICF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHsgdC5jdXJyZW50VGFyZ2V0ID0gby5lbGVtLCByID0gMDsgd2hpbGUgKChhID0gby5oYW5kbGVyc1tyKytdKSAmJiAhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSB0LnJuYW1lc3BhY2UgJiYgIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKSB8fCAodC5oYW5kbGVPYmogPSBhLCB0LmRhdGEgPSBhLmRhdGEsIHZvaWQgMCAhPT0gKGkgPSAoKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXSB8fCB7fSkuaGFuZGxlIHx8IGEuaGFuZGxlcikuYXBwbHkoby5lbGVtLCBzKSkgJiYgITEgPT09ICh0LnJlc3VsdCA9IGkpICYmICh0LnByZXZlbnREZWZhdWx0KCksIHQuc3RvcFByb3BhZ2F0aW9uKCkpKSB9IHJldHVybiBjLnBvc3REaXNwYXRjaCAmJiBjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsIHQpLCB0LnJlc3VsdCB9IH0sIGhhbmRsZXJzOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiwgciwgaSwgbywgYSwgdSA9IFtdLCBzID0gdC5kZWxlZ2F0ZUNvdW50LCBsID0gZS50YXJnZXQ7IGlmIChzICYmIGwubm9kZVR5cGUgJiYgISgiY2xpY2siID09PSBlLnR5cGUgJiYgZS5idXR0b24gPj0gMSkpIGZvciAoOyBsICE9PSB0aGlzOyBsID0gbC5wYXJlbnROb2RlIHx8IHRoaXMpaWYgKDEgPT09IGwubm9kZVR5cGUgJiYgKCJjbGljayIgIT09IGUudHlwZSB8fCAhMCAhPT0gbC5kaXNhYmxlZCkpIHsgZm9yIChvID0gW10sIGEgPSB7fSwgbiA9IDA7IG4gPCBzOyBuKyspdm9pZCAwID09PSBhW2kgPSAociA9IHRbbl0pLnNlbGVjdG9yICsgIiAiXSAmJiAoYVtpXSA9IHIubmVlZHNDb250ZXh0ID8gdyhpLCB0aGlzKS5pbmRleChsKSA+IC0xIDogdy5maW5kKGksIHRoaXMsIG51bGwsIFtsXSkubGVuZ3RoKSwgYVtpXSAmJiBvLnB1c2gocik7IG8ubGVuZ3RoICYmIHUucHVzaCh7IGVsZW06IGwsIGhhbmRsZXJzOiBvIH0pIH0gcmV0dXJuIGwgPSB0aGlzLCBzIDwgdC5sZW5ndGggJiYgdS5wdXNoKHsgZWxlbTogbCwgaGFuZGxlcnM6IHQuc2xpY2UocykgfSksIHUgfSwgYWRkUHJvcDogZnVuY3Rpb24gKGUsIHQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLCBlLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCBnZXQ6IGcodCkgPyBmdW5jdGlvbiAoKSB7IGlmICh0aGlzLm9yaWdpbmFsRXZlbnQpIHJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCkgfSA6IGZ1bmN0aW9uICgpIHsgaWYgKHRoaXMub3JpZ2luYWxFdmVudCkgcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFtlXSB9LCBzZXQ6IGZ1bmN0aW9uICh0KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBlLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAsIHZhbHVlOiB0IH0pIH0gfSkgfSwgZml4OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZVt3LmV4cGFuZG9dID8gZSA6IG5ldyB3LkV2ZW50KGUpIH0sIHNwZWNpYWw6IHsgbG9hZDogeyBub0J1YmJsZTogITAgfSwgZm9jdXM6IHsgdHJpZ2dlcjogZnVuY3Rpb24gKCkgeyBpZiAodGhpcyAhPT0ga2UoKSAmJiB0aGlzLmZvY3VzKSByZXR1cm4gdGhpcy5mb2N1cygpLCAhMSB9LCBkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIiB9LCBibHVyOiB7IHRyaWdnZXI6IGZ1bmN0aW9uICgpIHsgaWYgKHRoaXMgPT09IGtlKCkgJiYgdGhpcy5ibHVyKSByZXR1cm4gdGhpcy5ibHVyKCksICExIH0sIGRlbGVnYXRlVHlwZTogImZvY3Vzb3V0IiB9LCBjbGljazogeyB0cmlnZ2VyOiBmdW5jdGlvbiAoKSB7IGlmICgiY2hlY2tib3giID09PSB0aGlzLnR5cGUgJiYgdGhpcy5jbGljayAmJiBEKHRoaXMsICJpbnB1dCIpKSByZXR1cm4gdGhpcy5jbGljaygpLCAhMSB9LCBfZGVmYXVsdDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEQoZS50YXJnZXQsICJhIikgfSB9LCBiZWZvcmV1bmxvYWQ6IHsgcG9zdERpc3BhdGNoOiBmdW5jdGlvbiAoZSkgeyB2b2lkIDAgIT09IGUucmVzdWx0ICYmIGUub3JpZ2luYWxFdmVudCAmJiAoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZS5yZXN1bHQpIH0gfSB9IH0sIHcucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiAoZSwgdCwgbikgeyBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsIG4pIH0sIHcuRXZlbnQgPSBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoISh0aGlzIGluc3RhbmNlb2Ygdy5FdmVudCkpIHJldHVybiBuZXcgdy5FdmVudChlLCB0KTsgZSAmJiBlLnR5cGUgPyAodGhpcy5vcmlnaW5hbEV2ZW50ID0gZSwgdGhpcy50eXBlID0gZS50eXBlLCB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGUuZGVmYXVsdFByZXZlbnRlZCB8fCB2b2lkIDAgPT09IGUuZGVmYXVsdFByZXZlbnRlZCAmJiAhMSA9PT0gZS5yZXR1cm5WYWx1ZSA/IEVlIDogTmUsIHRoaXMudGFyZ2V0ID0gZS50YXJnZXQgJiYgMyA9PT0gZS50YXJnZXQubm9kZVR5cGUgPyBlLnRhcmdldC5wYXJlbnROb2RlIDogZS50YXJnZXQsIHRoaXMuY3VycmVudFRhcmdldCA9IGUuY3VycmVudFRhcmdldCwgdGhpcy5yZWxhdGVkVGFyZ2V0ID0gZS5yZWxhdGVkVGFyZ2V0KSA6IHRoaXMudHlwZSA9IGUsIHQgJiYgdy5leHRlbmQodGhpcywgdCksIHRoaXMudGltZVN0YW1wID0gZSAmJiBlLnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpLCB0aGlzW3cuZXhwYW5kb10gPSAhMCB9LCB3LkV2ZW50LnByb3RvdHlwZSA9IHsgY29uc3RydWN0b3I6IHcuRXZlbnQsIGlzRGVmYXVsdFByZXZlbnRlZDogTmUsIGlzUHJvcGFnYXRpb25TdG9wcGVkOiBOZSwgaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IE5lLCBpc1NpbXVsYXRlZDogITEsIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7IHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OyB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IEVlLCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICYmIGUucHJldmVudERlZmF1bHQoKSB9LCBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHsgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7IHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBFZSwgZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCAmJiBlLnN0b3BQcm9wYWdhdGlvbigpIH0sIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkgeyB2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IEVlLCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICYmIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksIHRoaXMuc3RvcFByb3BhZ2F0aW9uKCkgfSB9LCB3LmVhY2goeyBhbHRLZXk6ICEwLCBidWJibGVzOiAhMCwgY2FuY2VsYWJsZTogITAsIGNoYW5nZWRUb3VjaGVzOiAhMCwgY3RybEtleTogITAsIGRldGFpbDogITAsIGV2ZW50UGhhc2U6ICEwLCBtZXRhS2V5OiAhMCwgcGFnZVg6ICEwLCBwYWdlWTogITAsIHNoaWZ0S2V5OiAhMCwgdmlldzogITAsICJjaGFyIjogITAsIGNoYXJDb2RlOiAhMCwga2V5OiAhMCwga2V5Q29kZTogITAsIGJ1dHRvbjogITAsIGJ1dHRvbnM6ICEwLCBjbGllbnRYOiAhMCwgY2xpZW50WTogITAsIG9mZnNldFg6ICEwLCBvZmZzZXRZOiAhMCwgcG9pbnRlcklkOiAhMCwgcG9pbnRlclR5cGU6ICEwLCBzY3JlZW5YOiAhMCwgc2NyZWVuWTogITAsIHRhcmdldFRvdWNoZXM6ICEwLCB0b0VsZW1lbnQ6ICEwLCB0b3VjaGVzOiAhMCwgd2hpY2g6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5idXR0b247IHJldHVybiBudWxsID09IGUud2hpY2ggJiYgd2UudGVzdChlLnR5cGUpID8gbnVsbCAhPSBlLmNoYXJDb2RlID8gZS5jaGFyQ29kZSA6IGUua2V5Q29kZSA6ICFlLndoaWNoICYmIHZvaWQgMCAhPT0gdCAmJiBDZS50ZXN0KGUudHlwZSkgPyAxICYgdCA/IDEgOiAyICYgdCA/IDMgOiA0ICYgdCA/IDIgOiAwIDogZS53aGljaCB9IH0sIHcuZXZlbnQuYWRkUHJvcCksIHcuZWFjaCh7IG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAibW91c2VvdXQiLCBwb2ludGVyZW50ZXI6ICJwb2ludGVyb3ZlciIsIHBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiIH0sIGZ1bmN0aW9uIChlLCB0KSB7IHcuZXZlbnQuc3BlY2lhbFtlXSA9IHsgZGVsZWdhdGVUeXBlOiB0LCBiaW5kVHlwZTogdCwgaGFuZGxlOiBmdW5jdGlvbiAoZSkgeyB2YXIgbiwgciA9IHRoaXMsIGkgPSBlLnJlbGF0ZWRUYXJnZXQsIG8gPSBlLmhhbmRsZU9iajsgcmV0dXJuIGkgJiYgKGkgPT09IHIgfHwgdy5jb250YWlucyhyLCBpKSkgfHwgKGUudHlwZSA9IG8ub3JpZ1R5cGUsIG4gPSBvLmhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgZS50eXBlID0gdCksIG4gfSB9IH0pLCB3LmZuLmV4dGVuZCh7IG9uOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyByZXR1cm4gQWUodGhpcywgZSwgdCwgbiwgcikgfSwgb25lOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyByZXR1cm4gQWUodGhpcywgZSwgdCwgbiwgciwgMSkgfSwgb2ZmOiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaTsgaWYgKGUgJiYgZS5wcmV2ZW50RGVmYXVsdCAmJiBlLmhhbmRsZU9iaikgcmV0dXJuIHIgPSBlLmhhbmRsZU9iaiwgdyhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2UgPyByLm9yaWdUeXBlICsgIi4iICsgci5uYW1lc3BhY2UgOiByLm9yaWdUeXBlLCByLnNlbGVjdG9yLCByLmhhbmRsZXIpLCB0aGlzOyBpZiAoIm9iamVjdCIgPT0gdHlwZW9mIGUpIHsgZm9yIChpIGluIGUpIHRoaXMub2ZmKGksIHQsIGVbaV0pOyByZXR1cm4gdGhpcyB9IHJldHVybiAhMSAhPT0gdCAmJiAiZnVuY3Rpb24iICE9IHR5cGVvZiB0IHx8IChuID0gdCwgdCA9IHZvaWQgMCksICExID09PSBuICYmIChuID0gTmUpLCB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeyB3LmV2ZW50LnJlbW92ZSh0aGlzLCBlLCBuLCB0KSB9KSB9IH0pOyB2YXIgRGUgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksIFNlID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksIExlID0gL2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksIGplID0gL15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nOyBmdW5jdGlvbiBxZShlLCB0KSB7IHJldHVybiBEKGUsICJ0YWJsZSIpICYmIEQoMTEgIT09IHQubm9kZVR5cGUgPyB0IDogdC5maXJzdENoaWxkLCAidHIiKSA/IHcoZSkuY2hpbGRyZW4oInRib2R5IilbMF0gfHwgZSA6IGUgfSBmdW5jdGlvbiBPZShlKSB7IHJldHVybiBlLnR5cGUgPSAobnVsbCAhPT0gZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkgKyAiLyIgKyBlLnR5cGUsIGUgfSBmdW5jdGlvbiBQZShlKSB7IHJldHVybiAidHJ1ZS8iID09PSAoZS50eXBlIHx8ICIiKS5zbGljZSgwLCA1KSA/IGUudHlwZSA9IGUudHlwZS5zbGljZSg1KSA6IGUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksIGUgfSBmdW5jdGlvbiBIZShlLCB0KSB7IHZhciBuLCByLCBpLCBvLCBhLCB1LCBzLCBsOyBpZiAoMSA9PT0gdC5ub2RlVHlwZSkgeyBpZiAoSy5oYXNEYXRhKGUpICYmIChvID0gSy5hY2Nlc3MoZSksIGEgPSBLLnNldCh0LCBvKSwgbCA9IG8uZXZlbnRzKSkgeyBkZWxldGUgYS5oYW5kbGUsIGEuZXZlbnRzID0ge307IGZvciAoaSBpbiBsKSBmb3IgKG4gPSAwLCByID0gbFtpXS5sZW5ndGg7IG4gPCByOyBuKyspdy5ldmVudC5hZGQodCwgaSwgbFtpXVtuXSkgfSBKLmhhc0RhdGEoZSkgJiYgKHUgPSBKLmFjY2VzcyhlKSwgcyA9IHcuZXh0ZW5kKHt9LCB1KSwgSi5zZXQodCwgcykpIH0gfSBmdW5jdGlvbiBJZShlLCB0KSB7IHZhciBuID0gdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyAiaW5wdXQiID09PSBuICYmIGRlLnRlc3QoZS50eXBlKSA/IHQuY2hlY2tlZCA9IGUuY2hlY2tlZCA6ICJpbnB1dCIgIT09IG4gJiYgInRleHRhcmVhIiAhPT0gbiB8fCAodC5kZWZhdWx0VmFsdWUgPSBlLmRlZmF1bHRWYWx1ZSkgfSBmdW5jdGlvbiBSZShlLCB0LCBuLCByKSB7IHQgPSBhLmFwcGx5KFtdLCB0KTsgdmFyIGksIG8sIHUsIHMsIGwsIGMsIGYgPSAwLCBkID0gZS5sZW5ndGgsIHAgPSBkIC0gMSwgdiA9IHRbMF0sIHkgPSBnKHYpOyBpZiAoeSB8fCBkID4gMSAmJiAic3RyaW5nIiA9PSB0eXBlb2YgdiAmJiAhaC5jaGVja0Nsb25lICYmIExlLnRlc3QodikpIHJldHVybiBlLmVhY2goZnVuY3Rpb24gKGkpIHsgdmFyIG8gPSBlLmVxKGkpOyB5ICYmICh0WzBdID0gdi5jYWxsKHRoaXMsIGksIG8uaHRtbCgpKSksIFJlKG8sIHQsIG4sIHIpIH0pOyBpZiAoZCAmJiAoaSA9IGJlKHQsIGVbMF0ub3duZXJEb2N1bWVudCwgITEsIGUsIHIpLCBvID0gaS5maXJzdENoaWxkLCAxID09PSBpLmNoaWxkTm9kZXMubGVuZ3RoICYmIChpID0gbyksIG8gfHwgcikpIHsgZm9yIChzID0gKHUgPSB3Lm1hcCh2ZShpLCAic2NyaXB0IiksIE9lKSkubGVuZ3RoOyBmIDwgZDsgZisrKWwgPSBpLCBmICE9PSBwICYmIChsID0gdy5jbG9uZShsLCAhMCwgITApLCBzICYmIHcubWVyZ2UodSwgdmUobCwgInNjcmlwdCIpKSksIG4uY2FsbChlW2ZdLCBsLCBmKTsgaWYgKHMpIGZvciAoYyA9IHVbdS5sZW5ndGggLSAxXS5vd25lckRvY3VtZW50LCB3Lm1hcCh1LCBQZSksIGYgPSAwOyBmIDwgczsgZisrKWwgPSB1W2ZdLCBoZS50ZXN0KGwudHlwZSB8fCAiIikgJiYgIUsuYWNjZXNzKGwsICJnbG9iYWxFdmFsIikgJiYgdy5jb250YWlucyhjLCBsKSAmJiAobC5zcmMgJiYgIm1vZHVsZSIgIT09IChsLnR5cGUgfHwgIiIpLnRvTG93ZXJDYXNlKCkgPyB3Ll9ldmFsVXJsICYmIHcuX2V2YWxVcmwobC5zcmMpIDogbShsLnRleHRDb250ZW50LnJlcGxhY2UoamUsICIiKSwgYywgbCkpIH0gcmV0dXJuIGUgfSBmdW5jdGlvbiBCZShlLCB0LCBuKSB7IGZvciAodmFyIHIsIGkgPSB0ID8gdy5maWx0ZXIodCwgZSkgOiBlLCBvID0gMDsgbnVsbCAhPSAociA9IGlbb10pOyBvKyspbiB8fCAxICE9PSByLm5vZGVUeXBlIHx8IHcuY2xlYW5EYXRhKHZlKHIpKSwgci5wYXJlbnROb2RlICYmIChuICYmIHcuY29udGFpbnMoci5vd25lckRvY3VtZW50LCByKSAmJiB5ZSh2ZShyLCAic2NyaXB0IikpLCByLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpOyByZXR1cm4gZSB9IHcuZXh0ZW5kKHsgaHRtbFByZWZpbHRlcjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUucmVwbGFjZShEZSwgIjwkMT48LyQyPiIpIH0sIGNsb25lOiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaSwgbywgYSwgdSA9IGUuY2xvbmVOb2RlKCEwKSwgcyA9IHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LCBlKTsgaWYgKCEoaC5ub0Nsb25lQ2hlY2tlZCB8fCAxICE9PSBlLm5vZGVUeXBlICYmIDExICE9PSBlLm5vZGVUeXBlIHx8IHcuaXNYTUxEb2MoZSkpKSBmb3IgKGEgPSB2ZSh1KSwgciA9IDAsIGkgPSAobyA9IHZlKGUpKS5sZW5ndGg7IHIgPCBpOyByKyspSWUob1tyXSwgYVtyXSk7IGlmICh0KSBpZiAobikgZm9yIChvID0gbyB8fCB2ZShlKSwgYSA9IGEgfHwgdmUodSksIHIgPSAwLCBpID0gby5sZW5ndGg7IHIgPCBpOyByKyspSGUob1tyXSwgYVtyXSk7IGVsc2UgSGUoZSwgdSk7IHJldHVybiAoYSA9IHZlKHUsICJzY3JpcHQiKSkubGVuZ3RoID4gMCAmJiB5ZShhLCAhcyAmJiB2ZShlLCAic2NyaXB0IikpLCB1IH0sIGNsZWFuRGF0YTogZnVuY3Rpb24gKGUpIHsgZm9yICh2YXIgdCwgbiwgciwgaSA9IHcuZXZlbnQuc3BlY2lhbCwgbyA9IDA7IHZvaWQgMCAhPT0gKG4gPSBlW29dKTsgbysrKWlmIChZKG4pKSB7IGlmICh0ID0gbltLLmV4cGFuZG9dKSB7IGlmICh0LmV2ZW50cykgZm9yIChyIGluIHQuZXZlbnRzKSBpW3JdID8gdy5ldmVudC5yZW1vdmUobiwgcikgOiB3LnJlbW92ZUV2ZW50KG4sIHIsIHQuaGFuZGxlKTsgbltLLmV4cGFuZG9dID0gdm9pZCAwIH0gbltKLmV4cGFuZG9dICYmIChuW0ouZXhwYW5kb10gPSB2b2lkIDApIH0gfSB9KSwgdy5mbi5leHRlbmQoeyBkZXRhY2g6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBCZSh0aGlzLCBlLCAhMCkgfSwgcmVtb3ZlOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gQmUodGhpcywgZSkgfSwgdGV4dDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIF8odGhpcywgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHZvaWQgMCA9PT0gZSA/IHcudGV4dCh0aGlzKSA6IHRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uICgpIHsgMSAhPT0gdGhpcy5ub2RlVHlwZSAmJiAxMSAhPT0gdGhpcy5ub2RlVHlwZSAmJiA5ICE9PSB0aGlzLm5vZGVUeXBlIHx8ICh0aGlzLnRleHRDb250ZW50ID0gZSkgfSkgfSwgbnVsbCwgZSwgYXJndW1lbnRzLmxlbmd0aCkgfSwgYXBwZW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiBSZSh0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uIChlKSB7IDEgIT09IHRoaXMubm9kZVR5cGUgJiYgMTEgIT09IHRoaXMubm9kZVR5cGUgJiYgOSAhPT0gdGhpcy5ub2RlVHlwZSB8fCBxZSh0aGlzLCBlKS5hcHBlbmRDaGlsZChlKSB9KSB9LCBwcmVwZW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiBSZSh0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uIChlKSB7IGlmICgxID09PSB0aGlzLm5vZGVUeXBlIHx8IDExID09PSB0aGlzLm5vZGVUeXBlIHx8IDkgPT09IHRoaXMubm9kZVR5cGUpIHsgdmFyIHQgPSBxZSh0aGlzLCBlKTsgdC5pbnNlcnRCZWZvcmUoZSwgdC5maXJzdENoaWxkKSB9IH0pIH0sIGJlZm9yZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gUmUodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiAoZSkgeyB0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLCB0aGlzKSB9KSB9LCBhZnRlcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gUmUodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiAoZSkgeyB0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLCB0aGlzLm5leHRTaWJsaW5nKSB9KSB9LCBlbXB0eTogZnVuY3Rpb24gKCkgeyBmb3IgKHZhciBlLCB0ID0gMDsgbnVsbCAhPSAoZSA9IHRoaXNbdF0pOyB0KyspMSA9PT0gZS5ub2RlVHlwZSAmJiAody5jbGVhbkRhdGEodmUoZSwgITEpKSwgZS50ZXh0Q29udGVudCA9ICIiKTsgcmV0dXJuIHRoaXMgfSwgY2xvbmU6IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiBlID0gbnVsbCAhPSBlICYmIGUsIHQgPSBudWxsID09IHQgPyBlIDogdCwgdGhpcy5tYXAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdy5jbG9uZSh0aGlzLCBlLCB0KSB9KSB9LCBodG1sOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gXyh0aGlzLCBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHRoaXNbMF0gfHwge30sIG4gPSAwLCByID0gdGhpcy5sZW5ndGg7IGlmICh2b2lkIDAgPT09IGUgJiYgMSA9PT0gdC5ub2RlVHlwZSkgcmV0dXJuIHQuaW5uZXJIVE1MOyBpZiAoInN0cmluZyIgPT0gdHlwZW9mIGUgJiYgIVNlLnRlc3QoZSkgJiYgIWdlWyhwZS5leGVjKGUpIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkgeyBlID0gdy5odG1sUHJlZmlsdGVyKGUpOyB0cnkgeyBmb3IgKDsgbiA8IHI7IG4rKykxID09PSAodCA9IHRoaXNbbl0gfHwge30pLm5vZGVUeXBlICYmICh3LmNsZWFuRGF0YSh2ZSh0LCAhMSkpLCB0LmlubmVySFRNTCA9IGUpOyB0ID0gMCB9IGNhdGNoIChlKSB7IH0gfSB0ICYmIHRoaXMuZW1wdHkoKS5hcHBlbmQoZSkgfSwgbnVsbCwgZSwgYXJndW1lbnRzLmxlbmd0aCkgfSwgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uICgpIHsgdmFyIGUgPSBbXTsgcmV0dXJuIFJlKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24gKHQpIHsgdmFyIG4gPSB0aGlzLnBhcmVudE5vZGU7IHcuaW5BcnJheSh0aGlzLCBlKSA8IDAgJiYgKHcuY2xlYW5EYXRhKHZlKHRoaXMpKSwgbiAmJiBuLnJlcGxhY2VDaGlsZCh0LCB0aGlzKSkgfSwgZSkgfSB9KSwgdy5lYWNoKHsgYXBwZW5kVG86ICJhcHBlbmQiLCBwcmVwZW5kVG86ICJwcmVwZW5kIiwgaW5zZXJ0QmVmb3JlOiAiYmVmb3JlIiwgaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsIHJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIgfSwgZnVuY3Rpb24gKGUsIHQpIHsgdy5mbltlXSA9IGZ1bmN0aW9uIChlKSB7IGZvciAodmFyIG4sIHIgPSBbXSwgaSA9IHcoZSksIG8gPSBpLmxlbmd0aCAtIDEsIGEgPSAwOyBhIDw9IG87IGErKyluID0gYSA9PT0gbyA/IHRoaXMgOiB0aGlzLmNsb25lKCEwKSwgdyhpW2FdKVt0XShuKSwgdS5hcHBseShyLCBuLmdldCgpKTsgcmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpIH0gfSk7IHZhciBNZSA9IG5ldyBSZWdFeHAoIl4oIiArIHJlICsgIikoPyFweClbYS16JV0rJCIsICJpIiksIFdlID0gZnVuY3Rpb24gKHQpIHsgdmFyIG4gPSB0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7IHJldHVybiBuICYmIG4ub3BlbmVyIHx8IChuID0gZSksIG4uZ2V0Q29tcHV0ZWRTdHlsZSh0KSB9LCAkZSA9IG5ldyBSZWdFeHAob2Uuam9pbigifCIpLCAiaSIpOyAhZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiB0KCkgeyBpZiAoYykgeyBsLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsIGMuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIiwgeGUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7IHZhciB0ID0gZS5nZXRDb21wdXRlZFN0eWxlKGMpOyBpID0gIjElIiAhPT0gdC50b3AsIHMgPSAxMiA9PT0gbih0Lm1hcmdpbkxlZnQpLCBjLnN0eWxlLnJpZ2h0ID0gIjYwJSIsIHUgPSAzNiA9PT0gbih0LnJpZ2h0KSwgbyA9IDM2ID09PSBuKHQud2lkdGgpLCBjLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIiwgYSA9IDM2ID09PSBjLm9mZnNldFdpZHRoIHx8ICJhYnNvbHV0ZSIsIHhlLnJlbW92ZUNoaWxkKGwpLCBjID0gbnVsbCB9IH0gZnVuY3Rpb24gbihlKSB7IHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpIH0gdmFyIGksIG8sIGEsIHUsIHMsIGwgPSByLmNyZWF0ZUVsZW1lbnQoImRpdiIpLCBjID0gci5jcmVhdGVFbGVtZW50KCJkaXYiKTsgYy5zdHlsZSAmJiAoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCIsIGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICIiLCBoLmNsZWFyQ2xvbmVTdHlsZSA9ICJjb250ZW50LWJveCIgPT09IGMuc3R5bGUuYmFja2dyb3VuZENsaXAsIHcuZXh0ZW5kKGgsIHsgYm94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHQoKSwgbyB9LCBwaXhlbEJveFN0eWxlczogZnVuY3Rpb24gKCkgeyByZXR1cm4gdCgpLCB1IH0sIHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHQoKSwgaSB9LCByZWxpYWJsZU1hcmdpbkxlZnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHQoKSwgcyB9LCBzY3JvbGxib3hTaXplOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0KCksIGEgfSB9KSkgfSgpOyBmdW5jdGlvbiBGZShlLCB0LCBuKSB7IHZhciByLCBpLCBvLCBhLCB1ID0gZS5zdHlsZTsgcmV0dXJuIChuID0gbiB8fCBXZShlKSkgJiYgKCIiICE9PSAoYSA9IG4uZ2V0UHJvcGVydHlWYWx1ZSh0KSB8fCBuW3RdKSB8fCB3LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCwgZSkgfHwgKGEgPSB3LnN0eWxlKGUsIHQpKSwgIWgucGl4ZWxCb3hTdHlsZXMoKSAmJiBNZS50ZXN0KGEpICYmICRlLnRlc3QodCkgJiYgKHIgPSB1LndpZHRoLCBpID0gdS5taW5XaWR0aCwgbyA9IHUubWF4V2lkdGgsIHUubWluV2lkdGggPSB1Lm1heFdpZHRoID0gdS53aWR0aCA9IGEsIGEgPSBuLndpZHRoLCB1LndpZHRoID0gciwgdS5taW5XaWR0aCA9IGksIHUubWF4V2lkdGggPSBvKSksIHZvaWQgMCAhPT0gYSA/IGEgKyAiIiA6IGEgfSBmdW5jdGlvbiB6ZShlLCB0KSB7IHJldHVybiB7IGdldDogZnVuY3Rpb24gKCkgeyBpZiAoIWUoKSkgcmV0dXJuICh0aGlzLmdldCA9IHQpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IGRlbGV0ZSB0aGlzLmdldCB9IH0gfSB2YXIgX2UgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sIFVlID0gL14tLS8sIFZlID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwgWGUgPSB7IGxldHRlclNwYWNpbmc6ICIwIiwgZm9udFdlaWdodDogIjQwMCIgfSwgUWUgPSBbIldlYmtpdCIsICJNb3oiLCAibXMiXSwgWWUgPSByLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlOyBmdW5jdGlvbiBHZShlKSB7IGlmIChlIGluIFllKSByZXR1cm4gZTsgdmFyIHQgPSBlWzBdLnRvVXBwZXJDYXNlKCkgKyBlLnNsaWNlKDEpLCBuID0gUWUubGVuZ3RoOyB3aGlsZSAobi0tKSBpZiAoKGUgPSBRZVtuXSArIHQpIGluIFllKSByZXR1cm4gZSB9IGZ1bmN0aW9uIEtlKGUpIHsgdmFyIHQgPSB3LmNzc1Byb3BzW2VdOyByZXR1cm4gdCB8fCAodCA9IHcuY3NzUHJvcHNbZV0gPSBHZShlKSB8fCBlKSwgdCB9IGZ1bmN0aW9uIEplKGUsIHQsIG4pIHsgdmFyIHIgPSBpZS5leGVjKHQpOyByZXR1cm4gciA/IE1hdGgubWF4KDAsIHJbMl0gLSAobiB8fCAwKSkgKyAoclszXSB8fCAicHgiKSA6IHQgfSBmdW5jdGlvbiBaZShlLCB0LCBuLCByLCBpLCBvKSB7IHZhciBhID0gIndpZHRoIiA9PT0gdCA/IDEgOiAwLCB1ID0gMCwgcyA9IDA7IGlmIChuID09PSAociA/ICJib3JkZXIiIDogImNvbnRlbnQiKSkgcmV0dXJuIDA7IGZvciAoOyBhIDwgNDsgYSArPSAyKSJtYXJnaW4iID09PSBuICYmIChzICs9IHcuY3NzKGUsIG4gKyBvZVthXSwgITAsIGkpKSwgciA/ICgiY29udGVudCIgPT09IG4gJiYgKHMgLT0gdy5jc3MoZSwgInBhZGRpbmciICsgb2VbYV0sICEwLCBpKSksICJtYXJnaW4iICE9PSBuICYmIChzIC09IHcuY3NzKGUsICJib3JkZXIiICsgb2VbYV0gKyAiV2lkdGgiLCAhMCwgaSkpKSA6IChzICs9IHcuY3NzKGUsICJwYWRkaW5nIiArIG9lW2FdLCAhMCwgaSksICJwYWRkaW5nIiAhPT0gbiA/IHMgKz0gdy5jc3MoZSwgImJvcmRlciIgKyBvZVthXSArICJXaWR0aCIsICEwLCBpKSA6IHUgKz0gdy5jc3MoZSwgImJvcmRlciIgKyBvZVthXSArICJXaWR0aCIsICEwLCBpKSk7IHJldHVybiAhciAmJiBvID49IDAgJiYgKHMgKz0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGVbIm9mZnNldCIgKyB0WzBdLnRvVXBwZXJDYXNlKCkgKyB0LnNsaWNlKDEpXSAtIG8gLSBzIC0gdSAtIC41KSkpLCBzIH0gZnVuY3Rpb24gZXQoZSwgdCwgbikgeyB2YXIgciA9IFdlKGUpLCBpID0gRmUoZSwgdCwgciksIG8gPSAiYm9yZGVyLWJveCIgPT09IHcuY3NzKGUsICJib3hTaXppbmciLCAhMSwgciksIGEgPSBvOyBpZiAoTWUudGVzdChpKSkgeyBpZiAoIW4pIHJldHVybiBpOyBpID0gImF1dG8iIH0gcmV0dXJuIGEgPSBhICYmIChoLmJveFNpemluZ1JlbGlhYmxlKCkgfHwgaSA9PT0gZS5zdHlsZVt0XSksICgiYXV0byIgPT09IGkgfHwgIXBhcnNlRmxvYXQoaSkgJiYgImlubGluZSIgPT09IHcuY3NzKGUsICJkaXNwbGF5IiwgITEsIHIpKSAmJiAoaSA9IGVbIm9mZnNldCIgKyB0WzBdLnRvVXBwZXJDYXNlKCkgKyB0LnNsaWNlKDEpXSwgYSA9ICEwKSwgKGkgPSBwYXJzZUZsb2F0KGkpIHx8IDApICsgWmUoZSwgdCwgbiB8fCAobyA/ICJib3JkZXIiIDogImNvbnRlbnQiKSwgYSwgciwgaSkgKyAicHgiIH0gdy5leHRlbmQoeyBjc3NIb29rczogeyBvcGFjaXR5OiB7IGdldDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKHQpIHsgdmFyIG4gPSBGZShlLCAib3BhY2l0eSIpOyByZXR1cm4gIiIgPT09IG4gPyAiMSIgOiBuIH0gfSB9IH0sIGNzc051bWJlcjogeyBhbmltYXRpb25JdGVyYXRpb25Db3VudDogITAsIGNvbHVtbkNvdW50OiAhMCwgZmlsbE9wYWNpdHk6ICEwLCBmbGV4R3JvdzogITAsIGZsZXhTaHJpbms6ICEwLCBmb250V2VpZ2h0OiAhMCwgbGluZUhlaWdodDogITAsIG9wYWNpdHk6ICEwLCBvcmRlcjogITAsIG9ycGhhbnM6ICEwLCB3aWRvd3M6ICEwLCB6SW5kZXg6ICEwLCB6b29tOiAhMCB9LCBjc3NQcm9wczoge30sIHN0eWxlOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyBpZiAoZSAmJiAzICE9PSBlLm5vZGVUeXBlICYmIDggIT09IGUubm9kZVR5cGUgJiYgZS5zdHlsZSkgeyB2YXIgaSwgbywgYSwgdSA9IFEodCksIHMgPSBVZS50ZXN0KHQpLCBsID0gZS5zdHlsZTsgaWYgKHMgfHwgKHQgPSBLZSh1KSksIGEgPSB3LmNzc0hvb2tzW3RdIHx8IHcuY3NzSG9va3NbdV0sIHZvaWQgMCA9PT0gbikgcmV0dXJuIGEgJiYgImdldCIgaW4gYSAmJiB2b2lkIDAgIT09IChpID0gYS5nZXQoZSwgITEsIHIpKSA/IGkgOiBsW3RdOyAic3RyaW5nIiA9PSAobyA9IHR5cGVvZiBuKSAmJiAoaSA9IGllLmV4ZWMobikpICYmIGlbMV0gJiYgKG4gPSBzZShlLCB0LCBpKSwgbyA9ICJudW1iZXIiKSwgbnVsbCAhPSBuICYmIG4gPT09IG4gJiYgKCJudW1iZXIiID09PSBvICYmIChuICs9IGkgJiYgaVszXSB8fCAody5jc3NOdW1iZXJbdV0gPyAiIiA6ICJweCIpKSwgaC5jbGVhckNsb25lU3R5bGUgfHwgIiIgIT09IG4gfHwgMCAhPT0gdC5pbmRleE9mKCJiYWNrZ3JvdW5kIikgfHwgKGxbdF0gPSAiaW5oZXJpdCIpLCBhICYmICJzZXQiIGluIGEgJiYgdm9pZCAwID09PSAobiA9IGEuc2V0KGUsIG4sIHIpKSB8fCAocyA/IGwuc2V0UHJvcGVydHkodCwgbikgOiBsW3RdID0gbikpIH0gfSwgY3NzOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyB2YXIgaSwgbywgYSwgdSA9IFEodCk7IHJldHVybiBVZS50ZXN0KHQpIHx8ICh0ID0gS2UodSkpLCAoYSA9IHcuY3NzSG9va3NbdF0gfHwgdy5jc3NIb29rc1t1XSkgJiYgImdldCIgaW4gYSAmJiAoaSA9IGEuZ2V0KGUsICEwLCBuKSksIHZvaWQgMCA9PT0gaSAmJiAoaSA9IEZlKGUsIHQsIHIpKSwgIm5vcm1hbCIgPT09IGkgJiYgdCBpbiBYZSAmJiAoaSA9IFhlW3RdKSwgIiIgPT09IG4gfHwgbiA/IChvID0gcGFyc2VGbG9hdChpKSwgITAgPT09IG4gfHwgaXNGaW5pdGUobykgPyBvIHx8IDAgOiBpKSA6IGkgfSB9KSwgdy5lYWNoKFsiaGVpZ2h0IiwgIndpZHRoIl0sIGZ1bmN0aW9uIChlLCB0KSB7IHcuY3NzSG9va3NbdF0gPSB7IGdldDogZnVuY3Rpb24gKGUsIG4sIHIpIHsgaWYgKG4pIHJldHVybiAhX2UudGVzdCh3LmNzcyhlLCAiZGlzcGxheSIpKSB8fCBlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICYmIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPyBldChlLCB0LCByKSA6IHVlKGUsIFZlLCBmdW5jdGlvbiAoKSB7IHJldHVybiBldChlLCB0LCByKSB9KSB9LCBzZXQ6IGZ1bmN0aW9uIChlLCBuLCByKSB7IHZhciBpLCBvID0gV2UoZSksIGEgPSAiYm9yZGVyLWJveCIgPT09IHcuY3NzKGUsICJib3hTaXppbmciLCAhMSwgbyksIHUgPSByICYmIFplKGUsIHQsIHIsIGEsIG8pOyByZXR1cm4gYSAmJiBoLnNjcm9sbGJveFNpemUoKSA9PT0gby5wb3NpdGlvbiAmJiAodSAtPSBNYXRoLmNlaWwoZVsib2Zmc2V0IiArIHRbMF0udG9VcHBlckNhc2UoKSArIHQuc2xpY2UoMSldIC0gcGFyc2VGbG9hdChvW3RdKSAtIFplKGUsIHQsICJib3JkZXIiLCAhMSwgbykgLSAuNSkpLCB1ICYmIChpID0gaWUuZXhlYyhuKSkgJiYgInB4IiAhPT0gKGlbM10gfHwgInB4IikgJiYgKGUuc3R5bGVbdF0gPSBuLCBuID0gdy5jc3MoZSwgdCkpLCBKZShlLCBuLCB1KSB9IH0gfSksIHcuY3NzSG9va3MubWFyZ2luTGVmdCA9IHplKGgucmVsaWFibGVNYXJnaW5MZWZ0LCBmdW5jdGlvbiAoZSwgdCkgeyBpZiAodCkgcmV0dXJuIChwYXJzZUZsb2F0KEZlKGUsICJtYXJnaW5MZWZ0IikpIHx8IGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHVlKGUsIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbiAoKSB7IHJldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgfSkpICsgInB4IiB9KSwgdy5lYWNoKHsgbWFyZ2luOiAiIiwgcGFkZGluZzogIiIsIGJvcmRlcjogIldpZHRoIiB9LCBmdW5jdGlvbiAoZSwgdCkgeyB3LmNzc0hvb2tzW2UgKyB0XSA9IHsgZXhwYW5kOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciByID0gMCwgaSA9IHt9LCBvID0gInN0cmluZyIgPT0gdHlwZW9mIG4gPyBuLnNwbGl0KCIgIikgOiBbbl07IHIgPCA0OyByKyspaVtlICsgb2Vbcl0gKyB0XSA9IG9bcl0gfHwgb1tyIC0gMl0gfHwgb1swXTsgcmV0dXJuIGkgfSB9LCAibWFyZ2luIiAhPT0gZSAmJiAody5jc3NIb29rc1tlICsgdF0uc2V0ID0gSmUpIH0pLCB3LmZuLmV4dGVuZCh7IGNzczogZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuIF8odGhpcywgZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8gPSB7fSwgYSA9IDA7IGlmIChBcnJheS5pc0FycmF5KHQpKSB7IGZvciAociA9IFdlKGUpLCBpID0gdC5sZW5ndGg7IGEgPCBpOyBhKyspb1t0W2FdXSA9IHcuY3NzKGUsIHRbYV0sICExLCByKTsgcmV0dXJuIG8gfSByZXR1cm4gdm9pZCAwICE9PSBuID8gdy5zdHlsZShlLCB0LCBuKSA6IHcuY3NzKGUsIHQpIH0sIGUsIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB9IH0pLCB3LmZuLmRlbGF5ID0gZnVuY3Rpb24gKHQsIG4pIHsgcmV0dXJuIHQgPSB3LmZ4ID8gdy5meC5zcGVlZHNbdF0gfHwgdCA6IHQsIG4gPSBuIHx8ICJmeCIsIHRoaXMucXVldWUobiwgZnVuY3Rpb24gKG4sIHIpIHsgdmFyIGkgPSBlLnNldFRpbWVvdXQobiwgdCk7IHIuc3RvcCA9IGZ1bmN0aW9uICgpIHsgZS5jbGVhclRpbWVvdXQoaSkgfSB9KSB9LCBmdW5jdGlvbiAoKSB7IHZhciBlID0gci5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLCB0ID0gci5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTsgZS50eXBlID0gImNoZWNrYm94IiwgaC5jaGVja09uID0gIiIgIT09IGUudmFsdWUsIGgub3B0U2VsZWN0ZWQgPSB0LnNlbGVjdGVkLCAoZSA9IHIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWUgPSAidCIsIGUudHlwZSA9ICJyYWRpbyIsIGgucmFkaW9WYWx1ZSA9ICJ0IiA9PT0gZS52YWx1ZSB9KCk7IHZhciB0dCwgbnQgPSB3LmV4cHIuYXR0ckhhbmRsZTsgdy5mbi5leHRlbmQoeyBhdHRyOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gXyh0aGlzLCB3LmF0dHIsIGUsIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB9LCByZW1vdmVBdHRyOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgdy5yZW1vdmVBdHRyKHRoaXMsIGUpIH0pIH0gfSksIHcuZXh0ZW5kKHsgYXR0cjogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8gPSBlLm5vZGVUeXBlOyBpZiAoMyAhPT0gbyAmJiA4ICE9PSBvICYmIDIgIT09IG8pIHJldHVybiAidW5kZWZpbmVkIiA9PSB0eXBlb2YgZS5nZXRBdHRyaWJ1dGUgPyB3LnByb3AoZSwgdCwgbikgOiAoMSA9PT0gbyAmJiB3LmlzWE1MRG9jKGUpIHx8IChpID0gdy5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXSB8fCAody5leHByLm1hdGNoLmJvb2wudGVzdCh0KSA/IHR0IDogdm9pZCAwKSksIHZvaWQgMCAhPT0gbiA/IG51bGwgPT09IG4gPyB2b2lkIHcucmVtb3ZlQXR0cihlLCB0KSA6IGkgJiYgInNldCIgaW4gaSAmJiB2b2lkIDAgIT09IChyID0gaS5zZXQoZSwgbiwgdCkpID8gciA6IChlLnNldEF0dHJpYnV0ZSh0LCBuICsgIiIpLCBuKSA6IGkgJiYgImdldCIgaW4gaSAmJiBudWxsICE9PSAociA9IGkuZ2V0KGUsIHQpKSA/IHIgOiBudWxsID09IChyID0gdy5maW5kLmF0dHIoZSwgdCkpID8gdm9pZCAwIDogcikgfSwgYXR0ckhvb2tzOiB7IHR5cGU6IHsgc2V0OiBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoIWgucmFkaW9WYWx1ZSAmJiAicmFkaW8iID09PSB0ICYmIEQoZSwgImlucHV0IikpIHsgdmFyIG4gPSBlLnZhbHVlOyByZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCB0KSwgbiAmJiAoZS52YWx1ZSA9IG4pLCB0IH0gfSB9IH0sIHJlbW92ZUF0dHI6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gMCwgaSA9IHQgJiYgdC5tYXRjaChJKTsgaWYgKGkgJiYgMSA9PT0gZS5ub2RlVHlwZSkgd2hpbGUgKG4gPSBpW3IrK10pIGUucmVtb3ZlQXR0cmlidXRlKG4pIH0gfSksIHR0ID0geyBzZXQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiAhMSA9PT0gdCA/IHcucmVtb3ZlQXR0cihlLCBuKSA6IGUuc2V0QXR0cmlidXRlKG4sIG4pLCBuIH0gfSwgdy5lYWNoKHcuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLCBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IG50W3RdIHx8IHcuZmluZC5hdHRyOyBudFt0XSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7IHZhciBpLCBvLCBhID0gdC50b0xvd2VyQ2FzZSgpOyByZXR1cm4gciB8fCAobyA9IG50W2FdLCBudFthXSA9IGksIGkgPSBudWxsICE9IG4oZSwgdCwgcikgPyBhIDogbnVsbCwgbnRbYV0gPSBvKSwgaSB9IH0pOyB2YXIgcnQgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLCBpdCA9IC9eKD86YXxhcmVhKSQvaTsgdy5mbi5leHRlbmQoeyBwcm9wOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gXyh0aGlzLCB3LnByb3AsIGUsIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB9LCByZW1vdmVQcm9wOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgZGVsZXRlIHRoaXNbdy5wcm9wRml4W2VdIHx8IGVdIH0pIH0gfSksIHcuZXh0ZW5kKHsgcHJvcDogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8gPSBlLm5vZGVUeXBlOyBpZiAoMyAhPT0gbyAmJiA4ICE9PSBvICYmIDIgIT09IG8pIHJldHVybiAxID09PSBvICYmIHcuaXNYTUxEb2MoZSkgfHwgKHQgPSB3LnByb3BGaXhbdF0gfHwgdCwgaSA9IHcucHJvcEhvb2tzW3RdKSwgdm9pZCAwICE9PSBuID8gaSAmJiAic2V0IiBpbiBpICYmIHZvaWQgMCAhPT0gKHIgPSBpLnNldChlLCBuLCB0KSkgPyByIDogZVt0XSA9IG4gOiBpICYmICJnZXQiIGluIGkgJiYgbnVsbCAhPT0gKHIgPSBpLmdldChlLCB0KSkgPyByIDogZVt0XSB9LCBwcm9wSG9va3M6IHsgdGFiSW5kZXg6IHsgZ2V0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHcuZmluZC5hdHRyKGUsICJ0YWJpbmRleCIpOyByZXR1cm4gdCA/IHBhcnNlSW50KHQsIDEwKSA6IHJ0LnRlc3QoZS5ub2RlTmFtZSkgfHwgaXQudGVzdChlLm5vZGVOYW1lKSAmJiBlLmhyZWYgPyAwIDogLTEgfSB9IH0sIHByb3BGaXg6IHsgImZvciI6ICJodG1sRm9yIiwgImNsYXNzIjogImNsYXNzTmFtZSIgfSB9KSwgaC5vcHRTZWxlY3RlZCB8fCAody5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7IGdldDogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBlLnBhcmVudE5vZGU7IHJldHVybiB0ICYmIHQucGFyZW50Tm9kZSAmJiB0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwgbnVsbCB9LCBzZXQ6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5wYXJlbnROb2RlOyB0ICYmICh0LnNlbGVjdGVkSW5kZXgsIHQucGFyZW50Tm9kZSAmJiB0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCkgfSB9KSwgdy5lYWNoKFsidGFiSW5kZXgiLCAicmVhZE9ubHkiLCAibWF4TGVuZ3RoIiwgImNlbGxTcGFjaW5nIiwgImNlbGxQYWRkaW5nIiwgInJvd1NwYW4iLCAiY29sU3BhbiIsICJ1c2VNYXAiLCAiZnJhbWVCb3JkZXIiLCAiY29udGVudEVkaXRhYmxlIl0sIGZ1bmN0aW9uICgpIHsgdy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV0gPSB0aGlzIH0pOyBmdW5jdGlvbiBvdChlKSB7IHJldHVybiAoZS5tYXRjaChJKSB8fCBbXSkuam9pbigiICIpIH0gZnVuY3Rpb24gYXQoZSkgeyByZXR1cm4gZS5nZXRBdHRyaWJ1dGUgJiYgZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgfSBmdW5jdGlvbiB1dChlKSB7IHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZSA6ICJzdHJpbmciID09IHR5cGVvZiBlID8gZS5tYXRjaChJKSB8fCBbXSA6IFtdIH0gdy5mbi5leHRlbmQoeyBhZGRDbGFzczogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4sIHIsIGksIG8sIGEsIHUsIHMgPSAwOyBpZiAoZyhlKSkgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAodCkgeyB3KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLCB0LCBhdCh0aGlzKSkpIH0pOyBpZiAoKHQgPSB1dChlKSkubGVuZ3RoKSB3aGlsZSAobiA9IHRoaXNbcysrXSkgaWYgKGkgPSBhdChuKSwgciA9IDEgPT09IG4ubm9kZVR5cGUgJiYgIiAiICsgb3QoaSkgKyAiICIpIHsgYSA9IDA7IHdoaWxlIChvID0gdFthKytdKSByLmluZGV4T2YoIiAiICsgbyArICIgIikgPCAwICYmIChyICs9IG8gKyAiICIpOyBpICE9PSAodSA9IG90KHIpKSAmJiBuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB1KSB9IHJldHVybiB0aGlzIH0sIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiwgciwgaSwgbywgYSwgdSwgcyA9IDA7IGlmIChnKGUpKSByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICh0KSB7IHcodGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsIHQsIGF0KHRoaXMpKSkgfSk7IGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCAiIik7IGlmICgodCA9IHV0KGUpKS5sZW5ndGgpIHdoaWxlIChuID0gdGhpc1tzKytdKSBpZiAoaSA9IGF0KG4pLCByID0gMSA9PT0gbi5ub2RlVHlwZSAmJiAiICIgKyBvdChpKSArICIgIikgeyBhID0gMDsgd2hpbGUgKG8gPSB0W2ErK10pIHdoaWxlIChyLmluZGV4T2YoIiAiICsgbyArICIgIikgPiAtMSkgciA9IHIucmVwbGFjZSgiICIgKyBvICsgIiAiLCAiICIpOyBpICE9PSAodSA9IG90KHIpKSAmJiBuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB1KSB9IHJldHVybiB0aGlzIH0sIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IHR5cGVvZiBlLCByID0gInN0cmluZyIgPT09IG4gfHwgQXJyYXkuaXNBcnJheShlKTsgcmV0dXJuICJib29sZWFuIiA9PSB0eXBlb2YgdCAmJiByID8gdCA/IHRoaXMuYWRkQ2xhc3MoZSkgOiB0aGlzLnJlbW92ZUNsYXNzKGUpIDogZyhlKSA/IHRoaXMuZWFjaChmdW5jdGlvbiAobikgeyB3KHRoaXMpLnRvZ2dsZUNsYXNzKGUuY2FsbCh0aGlzLCBuLCBhdCh0aGlzKSwgdCksIHQpIH0pIDogdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgdmFyIHQsIGksIG8sIGE7IGlmIChyKSB7IGkgPSAwLCBvID0gdyh0aGlzKSwgYSA9IHV0KGUpOyB3aGlsZSAodCA9IGFbaSsrXSkgby5oYXNDbGFzcyh0KSA/IG8ucmVtb3ZlQ2xhc3ModCkgOiBvLmFkZENsYXNzKHQpIH0gZWxzZSB2b2lkIDAgIT09IGUgJiYgImJvb2xlYW4iICE9PSBuIHx8ICgodCA9IGF0KHRoaXMpKSAmJiBLLnNldCh0aGlzLCAiX19jbGFzc05hbWVfXyIsIHQpLCB0aGlzLnNldEF0dHJpYnV0ZSAmJiB0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0IHx8ICExID09PSBlID8gIiIgOiBLLmdldCh0aGlzLCAiX19jbGFzc05hbWVfXyIpIHx8ICIiKSkgfSkgfSwgaGFzQ2xhc3M6IGZ1bmN0aW9uIChlKSB7IHZhciB0LCBuLCByID0gMDsgdCA9ICIgIiArIGUgKyAiICI7IHdoaWxlIChuID0gdGhpc1tyKytdKSBpZiAoMSA9PT0gbi5ub2RlVHlwZSAmJiAoIiAiICsgb3QoYXQobikpICsgIiAiKS5pbmRleE9mKHQpID4gLTEpIHJldHVybiAhMDsgcmV0dXJuICExIH0gfSk7IHZhciBzdCA9IC9cci9nOyB3LmZuLmV4dGVuZCh7IHZhbDogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4sIHIsIGkgPSB0aGlzWzBdOyB7IGlmIChhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gciA9IGcoZSksIHRoaXMuZWFjaChmdW5jdGlvbiAobikgeyB2YXIgaTsgMSA9PT0gdGhpcy5ub2RlVHlwZSAmJiAobnVsbCA9PSAoaSA9IHIgPyBlLmNhbGwodGhpcywgbiwgdyh0aGlzKS52YWwoKSkgOiBlKSA/IGkgPSAiIiA6ICJudW1iZXIiID09IHR5cGVvZiBpID8gaSArPSAiIiA6IEFycmF5LmlzQXJyYXkoaSkgJiYgKGkgPSB3Lm1hcChpLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gbnVsbCA9PSBlID8gIiIgOiBlICsgIiIgfSkpLCAodCA9IHcudmFsSG9va3NbdGhpcy50eXBlXSB8fCB3LnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pICYmICJzZXQiIGluIHQgJiYgdm9pZCAwICE9PSB0LnNldCh0aGlzLCBpLCAidmFsdWUiKSB8fCAodGhpcy52YWx1ZSA9IGkpKSB9KTsgaWYgKGkpIHJldHVybiAodCA9IHcudmFsSG9va3NbaS50eXBlXSB8fCB3LnZhbEhvb2tzW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pICYmICJnZXQiIGluIHQgJiYgdm9pZCAwICE9PSAobiA9IHQuZ2V0KGksICJ2YWx1ZSIpKSA/IG4gOiAic3RyaW5nIiA9PSB0eXBlb2YgKG4gPSBpLnZhbHVlKSA/IG4ucmVwbGFjZShzdCwgIiIpIDogbnVsbCA9PSBuID8gIiIgOiBuIH0gfSB9KSwgdy5leHRlbmQoeyB2YWxIb29rczogeyBvcHRpb246IHsgZ2V0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHcuZmluZC5hdHRyKGUsICJ2YWx1ZSIpOyByZXR1cm4gbnVsbCAhPSB0ID8gdCA6IG90KHcudGV4dChlKSkgfSB9LCBzZWxlY3Q6IHsgZ2V0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiwgciwgaSA9IGUub3B0aW9ucywgbyA9IGUuc2VsZWN0ZWRJbmRleCwgYSA9ICJzZWxlY3Qtb25lIiA9PT0gZS50eXBlLCB1ID0gYSA/IG51bGwgOiBbXSwgcyA9IGEgPyBvICsgMSA6IGkubGVuZ3RoOyBmb3IgKHIgPSBvIDwgMCA/IHMgOiBhID8gbyA6IDA7IHIgPCBzOyByKyspaWYgKCgobiA9IGlbcl0pLnNlbGVjdGVkIHx8IHIgPT09IG8pICYmICFuLmRpc2FibGVkICYmICghbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFEKG4ucGFyZW50Tm9kZSwgIm9wdGdyb3VwIikpKSB7IGlmICh0ID0gdyhuKS52YWwoKSwgYSkgcmV0dXJuIHQ7IHUucHVzaCh0KSB9IHJldHVybiB1IH0sIHNldDogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIsIGkgPSBlLm9wdGlvbnMsIG8gPSB3Lm1ha2VBcnJheSh0KSwgYSA9IGkubGVuZ3RoOyB3aGlsZSAoYS0tKSAoKHIgPSBpW2FdKS5zZWxlY3RlZCA9IHcuaW5BcnJheSh3LnZhbEhvb2tzLm9wdGlvbi5nZXQociksIG8pID4gLTEpICYmIChuID0gITApOyByZXR1cm4gbiB8fCAoZS5zZWxlY3RlZEluZGV4ID0gLTEpLCBvIH0gfSB9IH0pLCB3LmVhY2goWyJyYWRpbyIsICJjaGVja2JveCJdLCBmdW5jdGlvbiAoKSB7IHcudmFsSG9va3NbdGhpc10gPSB7IHNldDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKEFycmF5LmlzQXJyYXkodCkpIHJldHVybiBlLmNoZWNrZWQgPSB3LmluQXJyYXkodyhlKS52YWwoKSwgdCkgPiAtMSB9IH0sIGguY2hlY2tPbiB8fCAody52YWxIb29rc1t0aGlzXS5nZXQgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gbnVsbCA9PT0gZS5nZXRBdHRyaWJ1dGUoInZhbHVlIikgPyAib24iIDogZS52YWx1ZSB9KSB9KSwgaC5mb2N1c2luID0gIm9uZm9jdXNpbiIgaW4gZTsgdmFyIGx0ID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLCBjdCA9IGZ1bmN0aW9uIChlKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCkgfTsgdy5leHRlbmQody5ldmVudCwgeyB0cmlnZ2VyOiBmdW5jdGlvbiAodCwgbiwgaSwgbykgeyB2YXIgYSwgdSwgcywgbCwgYywgZCwgcCwgaCwgeSA9IFtpIHx8IHJdLCBtID0gZi5jYWxsKHQsICJ0eXBlIikgPyB0LnR5cGUgOiB0LCBiID0gZi5jYWxsKHQsICJuYW1lc3BhY2UiKSA/IHQubmFtZXNwYWNlLnNwbGl0KCIuIikgOiBbXTsgaWYgKHUgPSBoID0gcyA9IGkgPSBpIHx8IHIsIDMgIT09IGkubm9kZVR5cGUgJiYgOCAhPT0gaS5ub2RlVHlwZSAmJiAhbHQudGVzdChtICsgdy5ldmVudC50cmlnZ2VyZWQpICYmIChtLmluZGV4T2YoIi4iKSA+IC0xICYmIChtID0gKGIgPSBtLnNwbGl0KCIuIikpLnNoaWZ0KCksIGIuc29ydCgpKSwgYyA9IG0uaW5kZXhPZigiOiIpIDwgMCAmJiAib24iICsgbSwgdCA9IHRbdy5leHBhbmRvXSA/IHQgOiBuZXcgdy5FdmVudChtLCAib2JqZWN0IiA9PSB0eXBlb2YgdCAmJiB0KSwgdC5pc1RyaWdnZXIgPSBvID8gMiA6IDMsIHQubmFtZXNwYWNlID0gYi5qb2luKCIuIiksIHQucm5hbWVzcGFjZSA9IHQubmFtZXNwYWNlID8gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBiLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIikgOiBudWxsLCB0LnJlc3VsdCA9IHZvaWQgMCwgdC50YXJnZXQgfHwgKHQudGFyZ2V0ID0gaSksIG4gPSBudWxsID09IG4gPyBbdF0gOiB3Lm1ha2VBcnJheShuLCBbdF0pLCBwID0gdy5ldmVudC5zcGVjaWFsW21dIHx8IHt9LCBvIHx8ICFwLnRyaWdnZXIgfHwgITEgIT09IHAudHJpZ2dlci5hcHBseShpLCBuKSkpIHsgaWYgKCFvICYmICFwLm5vQnViYmxlICYmICF2KGkpKSB7IGZvciAobCA9IHAuZGVsZWdhdGVUeXBlIHx8IG0sIGx0LnRlc3QobCArIG0pIHx8ICh1ID0gdS5wYXJlbnROb2RlKTsgdTsgdSA9IHUucGFyZW50Tm9kZSl5LnB1c2godSksIHMgPSB1OyBzID09PSAoaS5vd25lckRvY3VtZW50IHx8IHIpICYmIHkucHVzaChzLmRlZmF1bHRWaWV3IHx8IHMucGFyZW50V2luZG93IHx8IGUpIH0gYSA9IDA7IHdoaWxlICgodSA9IHlbYSsrXSkgJiYgIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkgaCA9IHUsIHQudHlwZSA9IGEgPiAxID8gbCA6IHAuYmluZFR5cGUgfHwgbSwgKGQgPSAoSy5nZXQodSwgImV2ZW50cyIpIHx8IHt9KVt0LnR5cGVdICYmIEsuZ2V0KHUsICJoYW5kbGUiKSkgJiYgZC5hcHBseSh1LCBuKSwgKGQgPSBjICYmIHVbY10pICYmIGQuYXBwbHkgJiYgWSh1KSAmJiAodC5yZXN1bHQgPSBkLmFwcGx5KHUsIG4pLCAhMSA9PT0gdC5yZXN1bHQgJiYgdC5wcmV2ZW50RGVmYXVsdCgpKTsgcmV0dXJuIHQudHlwZSA9IG0sIG8gfHwgdC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSB8fCBwLl9kZWZhdWx0ICYmICExICE9PSBwLl9kZWZhdWx0LmFwcGx5KHkucG9wKCksIG4pIHx8ICFZKGkpIHx8IGMgJiYgZyhpW21dKSAmJiAhdihpKSAmJiAoKHMgPSBpW2NdKSAmJiAoaVtjXSA9IG51bGwpLCB3LmV2ZW50LnRyaWdnZXJlZCA9IG0sIHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAmJiBoLmFkZEV2ZW50TGlzdGVuZXIobSwgY3QpLCBpW21dKCksIHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAmJiBoLnJlbW92ZUV2ZW50TGlzdGVuZXIobSwgY3QpLCB3LmV2ZW50LnRyaWdnZXJlZCA9IHZvaWQgMCwgcyAmJiAoaVtjXSA9IHMpKSwgdC5yZXN1bHQgfSB9LCBzaW11bGF0ZTogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIgPSB3LmV4dGVuZChuZXcgdy5FdmVudCwgbiwgeyB0eXBlOiBlLCBpc1NpbXVsYXRlZDogITAgfSk7IHcuZXZlbnQudHJpZ2dlcihyLCBudWxsLCB0KSB9IH0pLCB3LmZuLmV4dGVuZCh7IHRyaWdnZXI6IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeyB3LmV2ZW50LnRyaWdnZXIoZSwgdCwgdGhpcykgfSkgfSwgdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuID0gdGhpc1swXTsgaWYgKG4pIHJldHVybiB3LmV2ZW50LnRyaWdnZXIoZSwgdCwgbiwgITApIH0gfSksIGguZm9jdXNpbiB8fCB3LmVhY2goeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuID0gZnVuY3Rpb24gKGUpIHsgdy5ldmVudC5zaW11bGF0ZSh0LCBlLnRhcmdldCwgdy5ldmVudC5maXgoZSkpIH07IHcuZXZlbnQuc3BlY2lhbFt0XSA9IHsgc2V0dXA6IGZ1bmN0aW9uICgpIHsgdmFyIHIgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywgaSA9IEsuYWNjZXNzKHIsIHQpOyBpIHx8IHIuYWRkRXZlbnRMaXN0ZW5lcihlLCBuLCAhMCksIEsuYWNjZXNzKHIsIHQsIChpIHx8IDApICsgMSkgfSwgdGVhcmRvd246IGZ1bmN0aW9uICgpIHsgdmFyIHIgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywgaSA9IEsuYWNjZXNzKHIsIHQpIC0gMTsgaSA/IEsuYWNjZXNzKHIsIHQsIGkpIDogKHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCBuLCAhMCksIEsucmVtb3ZlKHIsIHQpKSB9IH0gfSk7IHZhciBmdCA9IC9cW1xdJC8sIGR0ID0gL1xyP1xuL2csIHB0ID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLCBodCA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTsgZnVuY3Rpb24gZ3QoZSwgdCwgbiwgcikgeyB2YXIgaTsgaWYgKEFycmF5LmlzQXJyYXkodCkpIHcuZWFjaCh0LCBmdW5jdGlvbiAodCwgaSkgeyBuIHx8IGZ0LnRlc3QoZSkgPyByKGUsIGkpIDogZ3QoZSArICJbIiArICgib2JqZWN0IiA9PSB0eXBlb2YgaSAmJiBudWxsICE9IGkgPyB0IDogIiIpICsgIl0iLCBpLCBuLCByKSB9KTsgZWxzZSBpZiAobiB8fCAib2JqZWN0IiAhPT0gYih0KSkgcihlLCB0KTsgZWxzZSBmb3IgKGkgaW4gdCkgZ3QoZSArICJbIiArIGkgKyAiXSIsIHRbaV0sIG4sIHIpIH0gdy5wYXJhbSA9IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gW10sIGkgPSBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IGcodCkgPyB0KCkgOiB0OyByW3IubGVuZ3RoXSA9IGVuY29kZVVSSUNvbXBvbmVudChlKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudChudWxsID09IG4gPyAiIiA6IG4pIH07IGlmIChBcnJheS5pc0FycmF5KGUpIHx8IGUuanF1ZXJ5ICYmICF3LmlzUGxhaW5PYmplY3QoZSkpIHcuZWFjaChlLCBmdW5jdGlvbiAoKSB7IGkodGhpcy5uYW1lLCB0aGlzLnZhbHVlKSB9KTsgZWxzZSBmb3IgKG4gaW4gZSkgZ3QobiwgZVtuXSwgdCwgaSk7IHJldHVybiByLmpvaW4oIiYiKSB9LCB3LmZuLmV4dGVuZCh7IHNlcmlhbGl6ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpIH0sIHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoKSB7IHZhciBlID0gdy5wcm9wKHRoaXMsICJlbGVtZW50cyIpOyByZXR1cm4gZSA/IHcubWFrZUFycmF5KGUpIDogdGhpcyB9KS5maWx0ZXIoZnVuY3Rpb24gKCkgeyB2YXIgZSA9IHRoaXMudHlwZTsgcmV0dXJuIHRoaXMubmFtZSAmJiAhdyh0aGlzKS5pcygiOmRpc2FibGVkIikgJiYgaHQudGVzdCh0aGlzLm5vZGVOYW1lKSAmJiAhcHQudGVzdChlKSAmJiAodGhpcy5jaGVja2VkIHx8ICFkZS50ZXN0KGUpKSB9KS5tYXAoZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSB3KHRoaXMpLnZhbCgpOyByZXR1cm4gbnVsbCA9PSBuID8gbnVsbCA6IEFycmF5LmlzQXJyYXkobikgPyB3Lm1hcChuLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4geyBuYW1lOiB0Lm5hbWUsIHZhbHVlOiBlLnJlcGxhY2UoZHQsICJcclxuIikgfSB9KSA6IHsgbmFtZTogdC5uYW1lLCB2YWx1ZTogbi5yZXBsYWNlKGR0LCAiXHJcbiIpIH0gfSkuZ2V0KCkgfSB9KSwgdy5mbi5leHRlbmQoeyB3cmFwQWxsOiBmdW5jdGlvbiAoZSkgeyB2YXIgdDsgcmV0dXJuIHRoaXNbMF0gJiYgKGcoZSkgJiYgKGUgPSBlLmNhbGwodGhpc1swXSkpLCB0ID0gdyhlLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSwgdGhpc1swXS5wYXJlbnROb2RlICYmIHQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLCB0Lm1hcChmdW5jdGlvbiAoKSB7IHZhciBlID0gdGhpczsgd2hpbGUgKGUuZmlyc3RFbGVtZW50Q2hpbGQpIGUgPSBlLmZpcnN0RWxlbWVudENoaWxkOyByZXR1cm4gZSB9KS5hcHBlbmQodGhpcykpLCB0aGlzIH0sIHdyYXBJbm5lcjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGcoZSkgPyB0aGlzLmVhY2goZnVuY3Rpb24gKHQpIHsgdyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsIHQpKSB9KSA6IHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7IHZhciB0ID0gdyh0aGlzKSwgbiA9IHQuY29udGVudHMoKTsgbi5sZW5ndGggPyBuLndyYXBBbGwoZSkgOiB0LmFwcGVuZChlKSB9KSB9LCB3cmFwOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGcoZSk7IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKG4pIHsgdyh0aGlzKS53cmFwQWxsKHQgPyBlLmNhbGwodGhpcywgbikgOiBlKSB9KSB9LCB1bndyYXA6IGZ1bmN0aW9uIChlKSB7IHJldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uICgpIHsgdyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpIH0pLCB0aGlzIH0gfSksIHcuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiAhdy5leHByLnBzZXVkb3MudmlzaWJsZShlKSB9LCB3LmV4cHIucHNldWRvcy52aXNpYmxlID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuICEhKGUub2Zmc2V0V2lkdGggfHwgZS5vZmZzZXRIZWlnaHQgfHwgZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkgfSwgaC5jcmVhdGVIVE1MRG9jdW1lbnQgPSBmdW5jdGlvbiAoKSB7IHZhciBlID0gci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHk7IHJldHVybiBlLmlubmVySFRNTCA9ICI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsIDIgPT09IGUuY2hpbGROb2Rlcy5sZW5ndGggfSgpLCB3LnBhcnNlSFRNTCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7IGlmICgic3RyaW5nIiAhPSB0eXBlb2YgZSkgcmV0dXJuIFtdOyAiYm9vbGVhbiIgPT0gdHlwZW9mIHQgJiYgKG4gPSB0LCB0ID0gITEpOyB2YXIgaSwgbywgYTsgcmV0dXJuIHQgfHwgKGguY3JlYXRlSFRNTERvY3VtZW50ID8gKChpID0gKHQgPSByLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZiA9IHIubG9jYXRpb24uaHJlZiwgdC5oZWFkLmFwcGVuZENoaWxkKGkpKSA6IHQgPSByKSwgbyA9IFMuZXhlYyhlKSwgYSA9ICFuICYmIFtdLCBvID8gW3QuY3JlYXRlRWxlbWVudChvWzFdKV0gOiAobyA9IGJlKFtlXSwgdCwgYSksIGEgJiYgYS5sZW5ndGggJiYgdyhhKS5yZW1vdmUoKSwgdy5tZXJnZShbXSwgby5jaGlsZE5vZGVzKSkgfSwgdy5vZmZzZXQgPSB7IHNldE9mZnNldDogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8sIGEsIHUsIHMsIGwsIGMgPSB3LmNzcyhlLCAicG9zaXRpb24iKSwgZiA9IHcoZSksIGQgPSB7fTsgInN0YXRpYyIgPT09IGMgJiYgKGUuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiKSwgdSA9IGYub2Zmc2V0KCksIG8gPSB3LmNzcyhlLCAidG9wIiksIHMgPSB3LmNzcyhlLCAibGVmdCIpLCAobCA9ICgiYWJzb2x1dGUiID09PSBjIHx8ICJmaXhlZCIgPT09IGMpICYmIChvICsgcykuaW5kZXhPZigiYXV0byIpID4gLTEpID8gKGEgPSAociA9IGYucG9zaXRpb24oKSkudG9wLCBpID0gci5sZWZ0KSA6IChhID0gcGFyc2VGbG9hdChvKSB8fCAwLCBpID0gcGFyc2VGbG9hdChzKSB8fCAwKSwgZyh0KSAmJiAodCA9IHQuY2FsbChlLCBuLCB3LmV4dGVuZCh7fSwgdSkpKSwgbnVsbCAhPSB0LnRvcCAmJiAoZC50b3AgPSB0LnRvcCAtIHUudG9wICsgYSksIG51bGwgIT0gdC5sZWZ0ICYmIChkLmxlZnQgPSB0LmxlZnQgLSB1LmxlZnQgKyBpKSwgInVzaW5nIiBpbiB0ID8gdC51c2luZy5jYWxsKGUsIGQpIDogZi5jc3MoZCkgfSB9LCB3LmZuLmV4dGVuZCh7IG9mZnNldDogZnVuY3Rpb24gKGUpIHsgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2b2lkIDAgPT09IGUgPyB0aGlzIDogdGhpcy5lYWNoKGZ1bmN0aW9uICh0KSB7IHcub2Zmc2V0LnNldE9mZnNldCh0aGlzLCBlLCB0KSB9KTsgdmFyIHQsIG4sIHIgPSB0aGlzWzBdOyBpZiAocikgcmV0dXJuIHIuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPyAodCA9IHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIG4gPSByLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcsIHsgdG9wOiB0LnRvcCArIG4ucGFnZVlPZmZzZXQsIGxlZnQ6IHQubGVmdCArIG4ucGFnZVhPZmZzZXQgfSkgOiB7IHRvcDogMCwgbGVmdDogMCB9IH0sIHBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7IGlmICh0aGlzWzBdKSB7IHZhciBlLCB0LCBuLCByID0gdGhpc1swXSwgaSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07IGlmICgiZml4ZWQiID09PSB3LmNzcyhyLCAicG9zaXRpb24iKSkgdCA9IHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IGVsc2UgeyB0ID0gdGhpcy5vZmZzZXQoKSwgbiA9IHIub3duZXJEb2N1bWVudCwgZSA9IHIub2Zmc2V0UGFyZW50IHx8IG4uZG9jdW1lbnRFbGVtZW50OyB3aGlsZSAoZSAmJiAoZSA9PT0gbi5ib2R5IHx8IGUgPT09IG4uZG9jdW1lbnRFbGVtZW50KSAmJiAic3RhdGljIiA9PT0gdy5jc3MoZSwgInBvc2l0aW9uIikpIGUgPSBlLnBhcmVudE5vZGU7IGUgJiYgZSAhPT0gciAmJiAxID09PSBlLm5vZGVUeXBlICYmICgoaSA9IHcoZSkub2Zmc2V0KCkpLnRvcCArPSB3LmNzcyhlLCAiYm9yZGVyVG9wV2lkdGgiLCAhMCksIGkubGVmdCArPSB3LmNzcyhlLCAiYm9yZGVyTGVmdFdpZHRoIiwgITApKSB9IHJldHVybiB7IHRvcDogdC50b3AgLSBpLnRvcCAtIHcuY3NzKHIsICJtYXJnaW5Ub3AiLCAhMCksIGxlZnQ6IHQubGVmdCAtIGkubGVmdCAtIHcuY3NzKHIsICJtYXJnaW5MZWZ0IiwgITApIH0gfSB9LCBvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uICgpIHsgdmFyIGUgPSB0aGlzLm9mZnNldFBhcmVudDsgd2hpbGUgKGUgJiYgInN0YXRpYyIgPT09IHcuY3NzKGUsICJwb3NpdGlvbiIpKSBlID0gZS5vZmZzZXRQYXJlbnQ7IHJldHVybiBlIHx8IHhlIH0pIH0gfSksIHcuZWFjaCh7IHNjcm9sbExlZnQ6ICJwYWdlWE9mZnNldCIsIHNjcm9sbFRvcDogInBhZ2VZT2Zmc2V0IiB9LCBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9ICJwYWdlWU9mZnNldCIgPT09IHQ7IHcuZm5bZV0gPSBmdW5jdGlvbiAocikgeyByZXR1cm4gXyh0aGlzLCBmdW5jdGlvbiAoZSwgciwgaSkgeyB2YXIgbzsgaWYgKHYoZSkgPyBvID0gZSA6IDkgPT09IGUubm9kZVR5cGUgJiYgKG8gPSBlLmRlZmF1bHRWaWV3KSwgdm9pZCAwID09PSBpKSByZXR1cm4gbyA/IG9bdF0gOiBlW3JdOyBvID8gby5zY3JvbGxUbyhuID8gby5wYWdlWE9mZnNldCA6IGksIG4gPyBpIDogby5wYWdlWU9mZnNldCkgOiBlW3JdID0gaSB9LCBlLCByLCBhcmd1bWVudHMubGVuZ3RoKSB9IH0pLCB3LmVhY2goWyJ0b3AiLCAibGVmdCJdLCBmdW5jdGlvbiAoZSwgdCkgeyB3LmNzc0hvb2tzW3RdID0gemUoaC5waXhlbFBvc2l0aW9uLCBmdW5jdGlvbiAoZSwgbikgeyBpZiAobikgcmV0dXJuIG4gPSBGZShlLCB0KSwgTWUudGVzdChuKSA/IHcoZSkucG9zaXRpb24oKVt0XSArICJweCIgOiBuIH0pIH0pLCB3LmVhY2goeyBIZWlnaHQ6ICJoZWlnaHQiLCBXaWR0aDogIndpZHRoIiB9LCBmdW5jdGlvbiAoZSwgdCkgeyB3LmVhY2goeyBwYWRkaW5nOiAiaW5uZXIiICsgZSwgY29udGVudDogdCwgIiI6ICJvdXRlciIgKyBlIH0sIGZ1bmN0aW9uIChuLCByKSB7IHcuZm5bcl0gPSBmdW5jdGlvbiAoaSwgbykgeyB2YXIgYSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKG4gfHwgImJvb2xlYW4iICE9IHR5cGVvZiBpKSwgdSA9IG4gfHwgKCEwID09PSBpIHx8ICEwID09PSBvID8gIm1hcmdpbiIgOiAiYm9yZGVyIik7IHJldHVybiBfKHRoaXMsIGZ1bmN0aW9uICh0LCBuLCBpKSB7IHZhciBvOyByZXR1cm4gdih0KSA/IDAgPT09IHIuaW5kZXhPZigib3V0ZXIiKSA/IHRbImlubmVyIiArIGVdIDogdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBlXSA6IDkgPT09IHQubm9kZVR5cGUgPyAobyA9IHQuZG9jdW1lbnRFbGVtZW50LCBNYXRoLm1heCh0LmJvZHlbInNjcm9sbCIgKyBlXSwgb1sic2Nyb2xsIiArIGVdLCB0LmJvZHlbIm9mZnNldCIgKyBlXSwgb1sib2Zmc2V0IiArIGVdLCBvWyJjbGllbnQiICsgZV0pKSA6IHZvaWQgMCA9PT0gaSA/IHcuY3NzKHQsIG4sIHUpIDogdy5zdHlsZSh0LCBuLCBpLCB1KSB9LCB0LCBhID8gaSA6IHZvaWQgMCwgYSkgfSB9KSB9KSwgdy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLCBmdW5jdGlvbiAoZSwgdCkgeyB3LmZuW3RdID0gZnVuY3Rpb24gKGUsIG4pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gdGhpcy5vbih0LCBudWxsLCBlLCBuKSA6IHRoaXMudHJpZ2dlcih0KSB9IH0pLCB3LmZuLmV4dGVuZCh7IGhvdmVyOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodCB8fCBlKSB9IH0pLCB3LmZuLmV4dGVuZCh7IGJpbmQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiB0aGlzLm9uKGUsIG51bGwsIHQsIG4pIH0sIHVuYmluZDogZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuIHRoaXMub2ZmKGUsIG51bGwsIHQpIH0sIGRlbGVnYXRlOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyByZXR1cm4gdGhpcy5vbih0LCBlLCBuLCByKSB9LCB1bmRlbGVnYXRlOiBmdW5jdGlvbiAoZSwgdCwgbikgeyByZXR1cm4gMSA9PT0gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMub2ZmKGUsICIqKiIpIDogdGhpcy5vZmYodCwgZSB8fCAiKioiLCBuKSB9IH0pLCB3LnByb3h5ID0gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIsIGk7IGlmICgic3RyaW5nIiA9PSB0eXBlb2YgdCAmJiAobiA9IGVbdF0sIHQgPSBlLCBlID0gbiksIGcoZSkpIHJldHVybiByID0gby5jYWxsKGFyZ3VtZW50cywgMiksIGkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBlLmFwcGx5KHQgfHwgdGhpcywgci5jb25jYXQoby5jYWxsKGFyZ3VtZW50cykpKSB9LCBpLmd1aWQgPSBlLmd1aWQgPSBlLmd1aWQgfHwgdy5ndWlkKysgLCBpIH0sIHcuaG9sZFJlYWR5ID0gZnVuY3Rpb24gKGUpIHsgZSA/IHcucmVhZHlXYWl0KysgOiB3LnJlYWR5KCEwKSB9LCB3LmlzQXJyYXkgPSBBcnJheS5pc0FycmF5LCB3LnBhcnNlSlNPTiA9IEpTT04ucGFyc2UsIHcubm9kZU5hbWUgPSBELCB3LmlzRnVuY3Rpb24gPSBnLCB3LmlzV2luZG93ID0gdiwgdy5jYW1lbENhc2UgPSBRLCB3LnR5cGUgPSBiLCB3Lm5vdyA9IERhdGUubm93LCB3LmlzTnVtZXJpYyA9IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gdy50eXBlKGUpOyByZXR1cm4gKCJudW1iZXIiID09PSB0IHx8ICJzdHJpbmciID09PSB0KSAmJiAhaXNOYU4oZSAtIHBhcnNlRmxvYXQoZSkpIH0sICJmdW5jdGlvbiIgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kICYmIGRlZmluZSgianF1ZXJ5IiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHcgfSk7IHZhciB2dCA9IGUualF1ZXJ5LCB5dCA9IGUuJDsgcmV0dXJuIHcubm9Db25mbGljdCA9IGZ1bmN0aW9uICh0KSB7IHJldHVybiBlLiQgPT09IHcgJiYgKGUuJCA9IHl0KSwgdCAmJiBlLmpRdWVyeSA9PT0gdyAmJiAoZS5qUXVlcnkgPSB2dCksIHcgfSwgdCB8fCAoZS5qUXVlcnkgPSBlLiQgPSB3KSwgdyB9KTs=\"") - packr.PackJSONBytes("./assets/default", "wails.js", "\"Ly8gV2FpbHMgcnVudGltZSBKUwoKKGZ1bmN0aW9uICgpIHsKCXdpbmRvdy53YWlscyA9IHdpbmRvdy53YWlscyB8fCB7CgkJJDoge30KCX07CgoJLyoqKioqKioqKioqKioqKioqKiBVdGlsaXR5IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLy8gLS0tLS0tLS0tLS0tLS0gUmFuZG9tIC0tLS0tLS0tLS0tLS0tCgkvLyBBd2Vzb21lUmFuZG9tCglmdW5jdGlvbiBjcnlwdG9SYW5kb20oKSB7CgkJdmFyIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpOwoJCXJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSlbMF07Cgl9CgoJLy8gTE9MUmFuZG9tCglmdW5jdGlvbiBiYXNpY1JhbmRvbSgpIHsKCQlyZXR1cm4gTWF0aC5yYW5kb20oKSAqIDkwMDcxOTkyNTQ3NDA5OTE7Cgl9CgoJLy8gUGljayBvbmUgYmFzZWQgb24gYnJvd3NlciBjYXBhYmlsaXR5Cgl2YXIgcmFuZG9tRnVuYzsKCWlmICh3aW5kb3cuY3J5cHRvKSB7CgkJcmFuZG9tRnVuYyA9IGNyeXB0b1JhbmRvbTsKCX0gZWxzZSB7CgkJcmFuZG9tRnVuYyA9IGJhc2ljUmFuZG9tOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIElkZW50aWZpZXJzIC0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0aW9uIGlzVmFsaWRJZGVudGlmaWVyKG5hbWUpIHsKCQkvLyBEb24ndCB4c3MgeW91cnNlbGYgOi0pCgkJdHJ5IHsKCQkJbmV3IEZ1bmN0aW9uKCJ2YXIgIiArIG5hbWUpOwoJCQlyZXR1cm4gdHJ1ZQoJCX0gY2F0Y2ggKGUpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIEpTIC0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGFkZFNjcmlwdChqcywgY2FsbGJhY2tJRCkgewoJCWNvbnNvbGUubG9nKCJBZGRpbmcgc2NyaXB0OiAiICsganMpCgkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoJCXNjcmlwdC50ZXh0ID0ganM7CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpOwoJCWNvbnNvbGUubG9nKCJDYWxsaW5nIGJhY2sgd2l0aDoiICsgY2FsbGJhY2tJRCk7CgkJd2luZG93LndhaWxzLmV2ZW50cy5lbWl0KGNhbGxiYWNrSUQpOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIEhUTUwgLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIHNldERvY3VtZW50KGh0bWwpIHsKCQlkb2N1bWVudC5vcGVuKCk7CgkJZG9jdW1lbnQud3JpdGUoaHRtbCk7CgkJZG9jdW1lbnQuY2xvc2UoKTsKCX0KCgkvLyAtLS0tLS0tLS0tLS0tLSBDU1MgLS0tLS0tLS0tLS0tLS0tCgkvLyBBZGFwdGVkIGZyb20gd2VidmlldyAtIHRoYW5rcyB6c2VyZ2UhCglmdW5jdGlvbiBpbmplY3RDU1MoY3NzKSB7CgkJdmFyIGVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwoJCWVsZW0uc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7CgkJaWYgKGVsZW0uc3R5bGVTaGVldCkgewoJCQllbGVtLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzczsKCQl9IGVsc2UgewoJCQllbGVtLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpOwoJCX0KCQl2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKCQloZWFkLmFwcGVuZENoaWxkKGVsZW0pCgl9CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKiogQmluZGluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgl2YXIgYmluZGluZ3NCYXNlUGF0aCA9IHdpbmRvdy53YWlscy4kOwoKCS8vIENyZWF0ZXMgdGhlIHBhdGggZ2l2ZW4gaW4gdGhlIGJpbmRpbmdzIHBhdGgKCWZ1bmN0aW9uIGFkZEJpbmRpbmdQYXRoKHBhdGhTZWN0aW9ucykgewoJCS8vIFN0YXJ0IGF0IHRoZSBiYXNlIHBhdGgKCQl2YXIgY3VycmVudFBhdGggPSBiaW5kaW5nc0Jhc2VQYXRoCgkJLy8gZm9yIGVhY2ggc2VjdGlvbiBvZiB0aGUgZ2l2ZW4gcGF0aAoJCWZvciAodmFyIHNlY3Rpb24gb2YgcGF0aFNlY3Rpb25zKSB7CgoJCQkvLyBJcyBzZWN0aW9uIGEgdmFsaWQgamF2YXNjcmlwdCBpZGVudGlmaWVyPwoJCQlpZiAoIWlzVmFsaWRJZGVudGlmaWVyKHNlY3Rpb24pKSB7CgkJCQl2YXIgZXJyTWVzc2FnZSA9IHNlY3Rpb24gKyAiIGlzIG5vdCBhIHZhbGlkIGphdmFzY3JpcHQgaWRlbnRpZmllci4iCgkJCQl2YXIgZXJyID0gbmV3IEVycm9yKGVyck1lc3NhZ2UpCgkJCQlyZXR1cm4gW251bGwsIGVycl0KCQkJfQoKCQkJLy8gQWRkIGlmIGRvZXNuJ3QgZXhpc3QKCQkJaWYgKCFjdXJyZW50UGF0aFtzZWN0aW9uXSkgewoJCQkJY3VycmVudFBhdGhbc2VjdGlvbl0gPSB7fQoJCQl9CgkJCS8vIHVwZGF0ZSBjdXJyZW50IHBhdGggdG8gbmV3IHBhdGgKCQkJY3VycmVudFBhdGggPSBjdXJyZW50UGF0aFtzZWN0aW9uXQoJCX0KCQlyZXR1cm4gW2N1cnJlbnRQYXRoLCBudWxsXQoJfQoKCWZ1bmN0aW9uIG5ld0JpbmRpbmcoYmluZGluZ05hbWUpIHsKCgkJLy8gR2V0IGFsbCB0aGUgc2VjdGlvbnMgb2YgdGhlIGJpbmRpbmcKCQl2YXIgYmluZGluZ1NlY3Rpb25zID0gYmluZGluZ05hbWUuc3BsaXQoJy4nKTsKCgkJLy8gR2V0IHRoZSBhY3R1YWwgZnVuY3Rpb24vbWV0aG9kIGNhbGwgbmFtZQoJCXZhciBjYWxsTmFtZSA9IGJpbmRpbmdTZWN0aW9ucy5wb3AoKTsKCgkJLy8gQWRkIHBhdGggdG8gYmluZGluZwoJCVtwYXRoVG9CaW5kaW5nLCBlcnJdID0gYWRkQmluZGluZ1BhdGgoYmluZGluZ1NlY3Rpb25zKQoKCQlpZiAoZXJyICE9IG51bGwpIHsKCQkJLy8gV2UgbmVlZCB0byByZXR1cm4gYW4gZXJyb3IKCQkJLy8gd2luZG93LndhaWxzLmxvZy5FcnJvcigiIikKCQkJcmV0dXJuCgkJfQoKCQkvLyBBZGQgYmluZGluZyBjYWxsCgkJcGF0aFRvQmluZGluZ1tjYWxsTmFtZV0gPSBmdW5jdGlvbiAoKSB7CgoJCQkvLyBObyB0aW1lb3V0IGJ5IGRlZmF1bHQKCQkJdmFyIHRpbWVvdXQgPSAwOwoKCQkJLy8gQWN0dWFsIGZ1bmN0aW9uCgkJCWZ1bmN0aW9uIGR5bmFtaWMoKSB7CgkJCQl2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKQoJCQkJcmV0dXJuIGNhbGwoYmluZGluZ05hbWUsIGFyZ3MsIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBBbGxvdyBzZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKG5ld1RpbWVvdXQpIHsKCQkJCXRpbWVvdXQgPSBuZXdUaW1lb3V0OwoJCQl9CgoJCQkvLyBBbGxvdyBnZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5nZXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkgewoJCQkJcmV0dXJuIHRpbWVvdXQ7CgkJCX0KCgkJCXJldHVybiBkeW5hbWljOwoJCX0oKTsKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQ2FsbHMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJdmFyIGNhbGxiYWNrcyA9IHt9OwoKCS8vIENhbGwgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHRvIGNhbGwgdGhlIGJpbmRpbmcgd2l0aCB0aGUKCS8vIGdpdmVuIGRhdGEuIEEgcHJvbWlzZSBpcyByZXR1cm5lZCBhbmQgd2lsbCBiZSBjb21wbGV0ZWQgd2hlbiB0aGUKCS8vIGJhY2tlbmQgcmVzcG9uZHMuIFRoaXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsCgkvLyBvciByZWplY3RlZCBpZiBhbiBlcnJvciBpcyBwYXNzZWQgYmFjay4KCS8vIFRoZXJlIGlzIGEgdGltZW91dCBtZWNoYW5pc20uIElmIHRoZSBjYWxsIGRvZXNuJ3QgcmVzcG9uZCBpbiB0aGUgZ2l2ZW4KCS8vIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlbiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC4KCglmdW5jdGlvbiBjYWxsKGJpbmRpbmdOYW1lLCBkYXRhLCB0aW1lb3V0KSB7CgoJCS8vIFRpbWVvdXQgaW5maW5pdGUgYnkgZGVmYXVsdAoJCWlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dCA9PSB1bmRlZmluZWQpIHsKCQkJdGltZW91dCA9IDA7CgkJfQoKCQkvLyBDcmVhdGUgYSBwcm9taXNlCgkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKCgkJCS8vIENyZWF0ZSBhIHVuaXF1ZSBjYWxsYmFja0lECgkJCXZhciBjYWxsYmFja0lEOwoJCQlkbyB7CgkJCQljYWxsYmFja0lEID0gYmluZGluZ05hbWUgKyAiLSIgKyByYW5kb21GdW5jKCk7CgkJCX0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSkKCgkJCS8vIFNldCB0aW1lb3V0CgkJCWlmICh0aW1lb3V0ID4gMCkgewoJCQkJdmFyIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCQlyZWplY3QoRXJyb3IoIkNhbGwgdG8gIiArIGJpbmRpbmdOYW1lICsgIiB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICIgKyBjYWxsYmFja0lEKSkKCQkJCX0sIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBTdG9yZSBjYWxsYmFjawoJCQljYWxsYmFja3NbY2FsbGJhY2tJRF0gPSB7CgkJCQl0aW1lb3V0SGFuZGxlOiB0aW1lb3V0SGFuZGxlLAoJCQkJcmVqZWN0OiByZWplY3QsCgkJCQlyZXNvbHZlOiByZXNvbHZlCgkJCX0KCQkJdHJ5IHsKCQkJCXZhciBwYXlsb2FkZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpCgkJCQkvLyBDcmVhdGUgdGhlIG1lc3NhZ2UKCQkJCW1lc3NhZ2UgPSB7CgkJCQkJdHlwZTogImNhbGwiLAoJCQkJCWNhbGxiYWNraWQ6IGNhbGxiYWNrSUQsCgkJCQkJcGF5bG9hZDogewoJCQkJCQliaW5kaW5nTmFtZTogYmluZGluZ05hbWUsCgkJCQkJCWRhdGE6IHBheWxvYWRkYXRhLAoJCQkJCX0KCQkJCX0KCgkJCQkvLyBNYWtlIHRoZSBjYWxsCgkJCQl2YXIgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpCgkJCQlleHRlcm5hbC5pbnZva2UocGF5bG9hZCk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWNvbnNvbGUuZXJyb3IoZSkKCQkJfQoJCX0pCgl9CgoKCS8vIENhbGxlZCBieSB0aGUgYmFja2VuZCB0byByZXR1cm4gZGF0YSB0byBhIHByZXZpb3VzbHkgY2FsbGVkCgkvLyBiaW5kaW5nIGludm9jYXRpb24KCWZ1bmN0aW9uIGNhbGxiYWNrKGluY29taW5nTWVzc2FnZSkgewoJCS8vIHdhaWxzLmxvZy5kZWJ1ZygiY2FsbGJhY2sgY2FsbGVkIHdpdGg6ICIgKyBpbmNvbWluZ01lc3NhZ2UpCgkJLy8gUGFyc2UgdGhlIG1lc3NhZ2UKCQl2YXIgbWVzc2FnZQoJCS8vIHdhaWxzLmxvZy5kZWJ1ZyhpbmNvbWluZ01lc3NhZ2UpCgkJdHJ5IHsKCQkJbWVzc2FnZSA9IEpTT04ucGFyc2UoaW5jb21pbmdNZXNzYWdlKQoJCX0gY2F0Y2ggKGUpIHsKCQkJd2FpbHMubG9nLmRlYnVnKCJJbnZhbGlkIEpTT04gcGFzc2VkIHRvIGNhbGxiYWNrOiAiICsgZS5tZXNzYWdlKQoJCQl3YWlscy5sb2cuZGVidWcoIk1lc3NhZ2U6ICIgKyBpbmNvbWluZ01lc3NhZ2UpCgkJCXJldHVybgoJCX0KCQljYWxsYmFja0lEID0gbWVzc2FnZS5jYWxsYmFja2lkCgkJY2FsbGJhY2tEYXRhID0gY2FsbGJhY2tzW2NhbGxiYWNrSURdCgkJaWYgKCFjYWxsYmFja0RhdGEpIHsKCQkJY29uc29sZS5lcnJvcigiQ2FsbGJhY2sgJyIgKyBjYWxsYmFja0lEICsgIicgbm90IHJlZ2lzdGVkISEhIikKCQkJcmV0dXJuCgkJfQoJCWNsZWFyVGltZW91dChjYWxsYmFja0RhdGEudGltZW91dEhhbmRsZSkKCQlkZWxldGUgY2FsbGJhY2tzW2NhbGxiYWNrSURdCgkJaWYgKG1lc3NhZ2UuZXJyb3IpIHsKCQkJcmV0dXJuIGNhbGxiYWNrRGF0YS5yZWplY3QobWVzc2FnZS5lcnJvcikKCQl9CgkJcmV0dXJuIGNhbGxiYWNrRGF0YS5yZXNvbHZlKG1lc3NhZ2UuZGF0YSkKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiogRXZlbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXZhciBldmVudExpc3RlbmVycyA9IHt9OwoKCS8vIFJlZ2lzdGVycyBldmVudCBsaXN0ZW5lcnMKCWZ1bmN0aW9uIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKCQlldmVudExpc3RlbmVyc1tldmVudE5hbWVdID0gZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSB8fCBbXTsKCQlldmVudExpc3RlbmVyc1tldmVudE5hbWVdLnB1c2goY2FsbGJhY2spOwoJfQoKCS8vIG5vdGlmeSBpbmZvcm1zIGZyb250ZW5kIGxpc3RlbmVycyB0aGF0IGFuIGV2ZW50IHdhcyBlbWl0dGVkIHdpdGggdGhlIGdpdmVuIGRhdGEKCWZ1bmN0aW9uIG5vdGlmeShldmVudE5hbWUsIGRhdGEpIHsKCQlpZiAoZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSkgewoJCQlldmVudExpc3RlbmVyc1tldmVudE5hbWVdLmZvckVhY2goZWxlbWVudCA9PiB7CgkJCQl2YXIgcGFyc2VkRGF0YSA9IFtdCgkJCQkvLyBQYXJzZSBkYXRhIGlmIHdlIGhhdmUgaXQKCQkJCWlmIChkYXRhKSB7CgkJCQkJdHJ5IHsKCQkJCQkJcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7CgkJCQkJfSBjYXRjaCAoZSkgewoJCQkJCQl3YWlscy5sb2cuZXJyb3IoIkludmFsaWQgSlNPTiBkYXRhIHNlbnQgdG8gbm90aWZ5LiBFdmVudCBuYW1lID0gIiArIGV2ZW50TmFtZSkKCQkJCQl9CgkJCQl9CgkJCQllbGVtZW50LmFwcGx5KG51bGwsIHBhcnNlZERhdGEpOwoJCQl9KTsKCQl9Cgl9CgoJLy8gZW1pdCBhbiBldmVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBkYXRhCglmdW5jdGlvbiBlbWl0KGV2ZW50TmFtZSkgewoKCQkvLyBDYWxjdWxhdGUgdGhlIGRhdGEKCQl2YXIgZGF0YSA9IEpTT04uc3RyaW5naWZ5KFtdLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykuc2xpY2UoMSkpOwoKCQkvLyBOb3RpZnkgYmFja2VuZAoJCW1lc3NhZ2UgPSB7CgkJCXR5cGU6ICJldmVudCIsCgkJCXBheWxvYWQ6IHsKCQkJCW5hbWU6IGV2ZW50TmFtZSwKCQkJCWRhdGE6IGRhdGEsCgkJCX0KCQl9CgkJZXh0ZXJuYWwuaW52b2tlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTsKCX0KCgkvLyBFdmVudHMgY2FsbHMKCXdpbmRvdy53YWlscy5ldmVudHMgPSB7IGVtaXQ6IGVtaXQsIG9uOiBvbiB9OwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLyoqKioqKioqKioqKioqKioqKioqKioqKiogTG9nZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgkvLyBTZW5kcyBhIGxvZyBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHdpdGggdGhlIGdpdmVuCgkvLyBsZXZlbCArIG1lc3NhZ2UKCWZ1bmN0aW9uIHNlbmRMb2dNZXNzYWdlKGxldmVsLCBtZXNzYWdlKSB7CgoJCS8vIExvZyBNZXNzYWdlCgkJbWVzc2FnZSA9IHsKCQkJdHlwZTogImxvZyIsCgkJCXBheWxvYWQ6IHsKCQkJCWxldmVsOiBsZXZlbCwKCQkJCW1lc3NhZ2U6IG1lc3NhZ2UsCgkJCX0KCQl9CgkJZXh0ZXJuYWwuaW52b2tlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTsKCX0KCglmdW5jdGlvbiBsb2dEZWJ1ZyhtZXNzYWdlKSB7CgkJc2VuZExvZ01lc3NhZ2UoImRlYnVnIiwgbWVzc2FnZSk7Cgl9CglmdW5jdGlvbiBsb2dJbmZvKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiaW5mbyIsIG1lc3NhZ2UpOwoJfQoJZnVuY3Rpb24gbG9nV2FybmluZyhtZXNzYWdlKSB7CgkJc2VuZExvZ01lc3NhZ2UoIndhcm5pbmciLCBtZXNzYWdlKTsKCX0KCWZ1bmN0aW9uIGxvZ0Vycm9yKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiZXJyb3IiLCBtZXNzYWdlKTsKCX0KCWZ1bmN0aW9uIGxvZ0ZhdGFsKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiZmF0YWwiLCBtZXNzYWdlKTsKCX0KCgl3aW5kb3cud2FpbHMubG9nID0gewoJCWRlYnVnOiBsb2dEZWJ1ZywKCQlpbmZvOiBsb2dJbmZvLAoJCXdhcm5pbmc6IGxvZ1dhcm5pbmcsCgkJZXJyb3I6IGxvZ0Vycm9yLAoJCWZhdGFsOiBsb2dGYXRhbCwKCX07CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEV4cG9ydHMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgl3aW5kb3cud2FpbHMuXyA9IHsKCQluZXdCaW5kaW5nOiBuZXdCaW5kaW5nLAoJCWNhbGxiYWNrOiBjYWxsYmFjaywKCQlub3RpZnk6IG5vdGlmeSwKCQlzZW5kTG9nTWVzc2FnZTogc2VuZExvZ01lc3NhZ2UsCgkJY2FsbGJhY2tzOiBjYWxsYmFja3MsCgkJaW5qZWN0Q1NTOiBpbmplY3RDU1MsCgkJYWRkU2NyaXB0OiBhZGRTY3JpcHQsCgkJc2V0RG9jdW1lbnQ6IHNldERvY3VtZW50LAoJfQoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLy8gTm90aWZ5IGJhY2tlbmQgdGhhdCB0aGUgcnVudGltZSBoYXMgZmluaXNoZWQgbG9hZGluZwoJd2luZG93LndhaWxzLmV2ZW50cy5lbWl0KCJ3YWlsczpsb2FkZWQiKTsKCn0pKCk=\"") + packr.PackJSONBytes("./assets/default", "wails.js", "\"Ly8gV2FpbHMgcnVudGltZSBKUwoKKGZ1bmN0aW9uICgpIHsKCXdpbmRvdy53YWlscyA9IHdpbmRvdy53YWlscyB8fCB7CgkJJDoge30KCX07CgoJLyoqKioqKioqKioqKioqKioqKiBVdGlsaXR5IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLy8gLS0tLS0tLS0tLS0tLS0gUmFuZG9tIC0tLS0tLS0tLS0tLS0tCgkvLyBBd2Vzb21lUmFuZG9tCglmdW5jdGlvbiBjcnlwdG9SYW5kb20oKSB7CgkJdmFyIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpOwoJCXJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSlbMF07Cgl9CgoJLy8gTE9MUmFuZG9tCglmdW5jdGlvbiBiYXNpY1JhbmRvbSgpIHsKCQlyZXR1cm4gTWF0aC5yYW5kb20oKSAqIDkwMDcxOTkyNTQ3NDA5OTE7Cgl9CgoJLy8gUGljayBvbmUgYmFzZWQgb24gYnJvd3NlciBjYXBhYmlsaXR5Cgl2YXIgcmFuZG9tRnVuYzsKCWlmICh3aW5kb3cuY3J5cHRvKSB7CgkJcmFuZG9tRnVuYyA9IGNyeXB0b1JhbmRvbTsKCX0gZWxzZSB7CgkJcmFuZG9tRnVuYyA9IGJhc2ljUmFuZG9tOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIElkZW50aWZpZXJzIC0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0aW9uIGlzVmFsaWRJZGVudGlmaWVyKG5hbWUpIHsKCQkvLyBEb24ndCB4c3MgeW91cnNlbGYgOi0pCgkJdHJ5IHsKCQkJbmV3IEZ1bmN0aW9uKCJ2YXIgIiArIG5hbWUpOwoJCQlyZXR1cm4gdHJ1ZQoJCX0gY2F0Y2ggKGUpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIEpTIC0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGFkZFNjcmlwdChqcywgY2FsbGJhY2tJRCkgewoJCWNvbnNvbGUubG9nKCJBZGRpbmcgc2NyaXB0OiAiICsganMpCgkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoJCXNjcmlwdC50ZXh0ID0ganM7CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpOwoJCWNvbnNvbGUubG9nKCJDYWxsaW5nIGJhY2sgd2l0aDoiICsgY2FsbGJhY2tJRCk7CgkJd2luZG93LndhaWxzLmV2ZW50cy5lbWl0KGNhbGxiYWNrSUQpOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIENTUyAtLS0tLS0tLS0tLS0tLS0KCS8vIEFkYXB0ZWQgZnJvbSB3ZWJ2aWV3IC0gdGhhbmtzIHpzZXJnZSEKCWZ1bmN0aW9uIGluamVjdENTUyhjc3MpIHsKCQl2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgkJZWxlbS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTsKCQlpZiAoZWxlbS5zdHlsZVNoZWV0KSB7CgkJCWVsZW0uc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzOwoJCX0gZWxzZSB7CgkJCWVsZW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7CgkJfQoJCXZhciBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwoJCWhlYWQuYXBwZW5kQ2hpbGQoZWxlbSkKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiBCaW5kaW5ncyAqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXZhciBiaW5kaW5nc0Jhc2VQYXRoID0gd2luZG93LndhaWxzLiQ7CgoJLy8gQ3JlYXRlcyB0aGUgcGF0aCBnaXZlbiBpbiB0aGUgYmluZGluZ3MgcGF0aAoJZnVuY3Rpb24gYWRkQmluZGluZ1BhdGgocGF0aFNlY3Rpb25zKSB7CgkJLy8gU3RhcnQgYXQgdGhlIGJhc2UgcGF0aAoJCXZhciBjdXJyZW50UGF0aCA9IGJpbmRpbmdzQmFzZVBhdGgKCQkvLyBmb3IgZWFjaCBzZWN0aW9uIG9mIHRoZSBnaXZlbiBwYXRoCgkJZm9yICh2YXIgc2VjdGlvbiBvZiBwYXRoU2VjdGlvbnMpIHsKCgkJCS8vIElzIHNlY3Rpb24gYSB2YWxpZCBqYXZhc2NyaXB0IGlkZW50aWZpZXI/CgkJCWlmICghaXNWYWxpZElkZW50aWZpZXIoc2VjdGlvbikpIHsKCQkJCXZhciBlcnJNZXNzYWdlID0gc2VjdGlvbiArICIgaXMgbm90IGEgdmFsaWQgamF2YXNjcmlwdCBpZGVudGlmaWVyLiIKCQkJCXZhciBlcnIgPSBuZXcgRXJyb3IoZXJyTWVzc2FnZSkKCQkJCXJldHVybiBbbnVsbCwgZXJyXQoJCQl9CgoJCQkvLyBBZGQgaWYgZG9lc24ndCBleGlzdAoJCQlpZiAoIWN1cnJlbnRQYXRoW3NlY3Rpb25dKSB7CgkJCQljdXJyZW50UGF0aFtzZWN0aW9uXSA9IHt9CgkJCX0KCQkJLy8gdXBkYXRlIGN1cnJlbnQgcGF0aCB0byBuZXcgcGF0aAoJCQljdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoW3NlY3Rpb25dCgkJfQoJCXJldHVybiBbY3VycmVudFBhdGgsIG51bGxdCgl9CgoJZnVuY3Rpb24gbmV3QmluZGluZyhiaW5kaW5nTmFtZSkgewoKCQkvLyBHZXQgYWxsIHRoZSBzZWN0aW9ucyBvZiB0aGUgYmluZGluZwoJCXZhciBiaW5kaW5nU2VjdGlvbnMgPSBiaW5kaW5nTmFtZS5zcGxpdCgnLicpOwoKCQkvLyBHZXQgdGhlIGFjdHVhbCBmdW5jdGlvbi9tZXRob2QgY2FsbCBuYW1lCgkJdmFyIGNhbGxOYW1lID0gYmluZGluZ1NlY3Rpb25zLnBvcCgpOwoKCQkvLyBBZGQgcGF0aCB0byBiaW5kaW5nCgkJW3BhdGhUb0JpbmRpbmcsIGVycl0gPSBhZGRCaW5kaW5nUGF0aChiaW5kaW5nU2VjdGlvbnMpCgoJCWlmIChlcnIgIT0gbnVsbCkgewoJCQkvLyBXZSBuZWVkIHRvIHJldHVybiBhbiBlcnJvcgoJCQlyZXR1cm4gZXJyCgkJfQoKCQkvLyBBZGQgYmluZGluZyBjYWxsCgkJcGF0aFRvQmluZGluZ1tjYWxsTmFtZV0gPSBmdW5jdGlvbiAoKSB7CgoJCQkvLyBObyB0aW1lb3V0IGJ5IGRlZmF1bHQKCQkJdmFyIHRpbWVvdXQgPSAwOwoKCQkJLy8gQWN0dWFsIGZ1bmN0aW9uCgkJCWZ1bmN0aW9uIGR5bmFtaWMoKSB7CgkJCQl2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKQoJCQkJcmV0dXJuIGNhbGwoYmluZGluZ05hbWUsIGFyZ3MsIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBBbGxvdyBzZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKG5ld1RpbWVvdXQpIHsKCQkJCXRpbWVvdXQgPSBuZXdUaW1lb3V0OwoJCQl9CgoJCQkvLyBBbGxvdyBnZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5nZXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkgewoJCQkJcmV0dXJuIHRpbWVvdXQ7CgkJCX0KCgkJCXJldHVybiBkeW5hbWljOwoJCX0oKTsKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQ2FsbHMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJdmFyIGNhbGxiYWNrcyA9IHt9OwoKCS8vIENhbGwgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHRvIGNhbGwgdGhlIGJpbmRpbmcgd2l0aCB0aGUKCS8vIGdpdmVuIGRhdGEuIEEgcHJvbWlzZSBpcyByZXR1cm5lZCBhbmQgd2lsbCBiZSBjb21wbGV0ZWQgd2hlbiB0aGUKCS8vIGJhY2tlbmQgcmVzcG9uZHMuIFRoaXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsCgkvLyBvciByZWplY3RlZCBpZiBhbiBlcnJvciBpcyBwYXNzZWQgYmFjay4KCS8vIFRoZXJlIGlzIGEgdGltZW91dCBtZWNoYW5pc20uIElmIHRoZSBjYWxsIGRvZXNuJ3QgcmVzcG9uZCBpbiB0aGUgZ2l2ZW4KCS8vIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlbiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC4KCglmdW5jdGlvbiBjYWxsKGJpbmRpbmdOYW1lLCBkYXRhLCB0aW1lb3V0KSB7CgoJCS8vIFRpbWVvdXQgaW5maW5pdGUgYnkgZGVmYXVsdAoJCWlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dCA9PSB1bmRlZmluZWQpIHsKCQkJdGltZW91dCA9IDA7CgkJfQoKCQkvLyBDcmVhdGUgYSBwcm9taXNlCgkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKCgkJCS8vIENyZWF0ZSBhIHVuaXF1ZSBjYWxsYmFja0lECgkJCXZhciBjYWxsYmFja0lEOwoJCQlkbyB7CgkJCQljYWxsYmFja0lEID0gYmluZGluZ05hbWUgKyAiLSIgKyByYW5kb21GdW5jKCk7CgkJCX0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSkKCgkJCS8vIFNldCB0aW1lb3V0CgkJCWlmICh0aW1lb3V0ID4gMCkgewoJCQkJdmFyIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCQlyZWplY3QoRXJyb3IoIkNhbGwgdG8gIiArIGJpbmRpbmdOYW1lICsgIiB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICIgKyBjYWxsYmFja0lEKSkKCQkJCX0sIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBTdG9yZSBjYWxsYmFjawoJCQljYWxsYmFja3NbY2FsbGJhY2tJRF0gPSB7CgkJCQl0aW1lb3V0SGFuZGxlOiB0aW1lb3V0SGFuZGxlLAoJCQkJcmVqZWN0OiByZWplY3QsCgkJCQlyZXNvbHZlOiByZXNvbHZlCgkJCX0KCQkJdHJ5IHsKCQkJCXZhciBwYXlsb2FkZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpCgkJCQkvLyBDcmVhdGUgdGhlIG1lc3NhZ2UKCQkJCW1lc3NhZ2UgPSB7CgkJCQkJdHlwZTogImNhbGwiLAoJCQkJCWNhbGxiYWNraWQ6IGNhbGxiYWNrSUQsCgkJCQkJcGF5bG9hZDogewoJCQkJCQliaW5kaW5nTmFtZTogYmluZGluZ05hbWUsCgkJCQkJCWRhdGE6IHBheWxvYWRkYXRhLAoJCQkJCX0KCQkJCX0KCgkJCQkvLyBNYWtlIHRoZSBjYWxsCgkJCQl2YXIgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpCgkJCQlleHRlcm5hbC5pbnZva2UocGF5bG9hZCk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWNvbnNvbGUuZXJyb3IoZSkKCQkJfQoJCX0pCgl9CgoKCS8vIENhbGxlZCBieSB0aGUgYmFja2VuZCB0byByZXR1cm4gZGF0YSB0byBhIHByZXZpb3VzbHkgY2FsbGVkCgkvLyBiaW5kaW5nIGludm9jYXRpb24KCWZ1bmN0aW9uIGNhbGxiYWNrKGluY29taW5nTWVzc2FnZSkgewoJCS8vIFBhcnNlIHRoZSBtZXNzYWdlCgkJdmFyIG1lc3NhZ2UKCQl0cnkgewoJCQltZXNzYWdlID0gSlNPTi5wYXJzZShpbmNvbWluZ01lc3NhZ2UpCgkJfSBjYXRjaCAoZSkgewoJCQl3YWlscy5sb2cuZGVidWcoIkludmFsaWQgSlNPTiBwYXNzZWQgdG8gY2FsbGJhY2s6ICIgKyBlLm1lc3NhZ2UpCgkJCXdhaWxzLmxvZy5kZWJ1ZygiTWVzc2FnZTogIiArIGluY29taW5nTWVzc2FnZSkKCQkJcmV0dXJuCgkJfQoJCWNhbGxiYWNrSUQgPSBtZXNzYWdlLmNhbGxiYWNraWQKCQljYWxsYmFja0RhdGEgPSBjYWxsYmFja3NbY2FsbGJhY2tJRF0KCQlpZiAoIWNhbGxiYWNrRGF0YSkgewoJCQljb25zb2xlLmVycm9yKCJDYWxsYmFjayAnIiArIGNhbGxiYWNrSUQgKyAiJyBub3QgcmVnaXN0ZWQhISEiKQoJCQlyZXR1cm4KCQl9CgkJY2xlYXJUaW1lb3V0KGNhbGxiYWNrRGF0YS50aW1lb3V0SGFuZGxlKQoJCWRlbGV0ZSBjYWxsYmFja3NbY2FsbGJhY2tJRF0KCQlpZiAobWVzc2FnZS5lcnJvcikgewoJCQlyZXR1cm4gY2FsbGJhY2tEYXRhLnJlamVjdChtZXNzYWdlLmVycm9yKQoJCX0KCQlyZXR1cm4gY2FsbGJhY2tEYXRhLnJlc29sdmUobWVzc2FnZS5kYXRhKQoJfQoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBFdmVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJdmFyIGV2ZW50TGlzdGVuZXJzID0ge307CgoJLy8gUmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycwoJZnVuY3Rpb24gb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewoJCWV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdIHx8IFtdOwoJCWV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaChjYWxsYmFjayk7Cgl9CgoJLy8gbm90aWZ5IGluZm9ybXMgZnJvbnRlbmQgbGlzdGVuZXJzIHRoYXQgYW4gZXZlbnQgd2FzIGVtaXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGF0YQoJZnVuY3Rpb24gbm90aWZ5KGV2ZW50TmFtZSwgZGF0YSkgewoJCWlmIChldmVudExpc3RlbmVyc1tldmVudE5hbWVdKSB7CgkJCWV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0uZm9yRWFjaChlbGVtZW50ID0+IHsKCQkJCXZhciBwYXJzZWREYXRhID0gW10KCQkJCS8vIFBhcnNlIGRhdGEgaWYgd2UgaGF2ZSBpdAoJCQkJaWYgKGRhdGEpIHsKCQkJCQl0cnkgewoJCQkJCQlwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkYXRhKTsKCQkJCQl9IGNhdGNoIChlKSB7CgkJCQkJCXdhaWxzLmxvZy5lcnJvcigiSW52YWxpZCBKU09OIGRhdGEgc2VudCB0byBub3RpZnkuIEV2ZW50IG5hbWUgPSAiICsgZXZlbnROYW1lKQoJCQkJCX0KCQkJCX0KCQkJCWVsZW1lbnQuYXBwbHkobnVsbCwgcGFyc2VkRGF0YSk7CgkJCX0pOwoJCX0KCX0KCgkvLyBlbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGRhdGEKCWZ1bmN0aW9uIGVtaXQoZXZlbnROYW1lKSB7CgoJCS8vIENhbGN1bGF0ZSB0aGUgZGF0YQoJCXZhciBkYXRhID0gSlNPTi5zdHJpbmdpZnkoW10uc2xpY2UuYXBwbHkoYXJndW1lbnRzKS5zbGljZSgxKSk7CgoJCS8vIE5vdGlmeSBiYWNrZW5kCgkJbWVzc2FnZSA9IHsKCQkJdHlwZTogImV2ZW50IiwKCQkJcGF5bG9hZDogewoJCQkJbmFtZTogZXZlbnROYW1lLAoJCQkJZGF0YTogZGF0YSwKCQkJfQoJCX0KCQlleHRlcm5hbC5pbnZva2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpOwoJfQoKCS8vIEV2ZW50cyBjYWxscwoJd2luZG93LndhaWxzLmV2ZW50cyA9IHsgZW1pdDogZW1pdCwgb246IG9uIH07CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2dnaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8vIFNlbmRzIGEgbG9nIG1lc3NhZ2UgdG8gdGhlIGJhY2tlbmQgd2l0aCB0aGUgZ2l2ZW4KCS8vIGxldmVsICsgbWVzc2FnZQoJZnVuY3Rpb24gc2VuZExvZ01lc3NhZ2UobGV2ZWwsIG1lc3NhZ2UpIHsKCgkJLy8gTG9nIE1lc3NhZ2UKCQltZXNzYWdlID0gewoJCQl0eXBlOiAibG9nIiwKCQkJcGF5bG9hZDogewoJCQkJbGV2ZWw6IGxldmVsLAoJCQkJbWVzc2FnZTogbWVzc2FnZSwKCQkJfQoJCX0KCQlleHRlcm5hbC5pbnZva2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpOwoJfQoKCWZ1bmN0aW9uIGxvZ0RlYnVnKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiZGVidWciLCBtZXNzYWdlKTsKCX0KCWZ1bmN0aW9uIGxvZ0luZm8obWVzc2FnZSkgewoJCXNlbmRMb2dNZXNzYWdlKCJpbmZvIiwgbWVzc2FnZSk7Cgl9CglmdW5jdGlvbiBsb2dXYXJuaW5nKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgid2FybmluZyIsIG1lc3NhZ2UpOwoJfQoJZnVuY3Rpb24gbG9nRXJyb3IobWVzc2FnZSkgewoJCXNlbmRMb2dNZXNzYWdlKCJlcnJvciIsIG1lc3NhZ2UpOwoJfQoJZnVuY3Rpb24gbG9nRmF0YWwobWVzc2FnZSkgewoJCXNlbmRMb2dNZXNzYWdlKCJmYXRhbCIsIG1lc3NhZ2UpOwoJfQoKCXdpbmRvdy53YWlscy5sb2cgPSB7CgkJZGVidWc6IGxvZ0RlYnVnLAoJCWluZm86IGxvZ0luZm8sCgkJd2FybmluZzogbG9nV2FybmluZywKCQllcnJvcjogbG9nRXJyb3IsCgkJZmF0YWw6IGxvZ0ZhdGFsLAoJfTsKCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiogRXhwb3J0cyAqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXdpbmRvdy53YWlscy5fID0gewoJCW5ld0JpbmRpbmc6IG5ld0JpbmRpbmcsCgkJY2FsbGJhY2s6IGNhbGxiYWNrLAoJCW5vdGlmeTogbm90aWZ5LAoJCXNlbmRMb2dNZXNzYWdlOiBzZW5kTG9nTWVzc2FnZSwKCQljYWxsYmFja3M6IGNhbGxiYWNrcywKCQlpbmplY3RDU1M6IGluamVjdENTUywKCQlhZGRTY3JpcHQ6IGFkZFNjcmlwdCwKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8vIE5vdGlmeSBiYWNrZW5kIHRoYXQgdGhlIHJ1bnRpbWUgaGFzIGZpbmlzaGVkIGxvYWRpbmcKCXdpbmRvdy53YWlscy5ldmVudHMuZW1pdCgid2FpbHM6bG9hZGVkIik7Cgp9KSgp\"") packr.PackJSONBytes("./assets/default", "default.html", "\"PGRpdiBpZD0iYXBwIj48L2Rpdj4=\"") packr.PackJSONBytes("./assets/default", "jquery.3.3.1.min.js", "\"LyohIGpRdWVyeSB2My4zLjEgLWFqYXgsLWFqYXgvanNvbnAsLWFqYXgvbG9hZCwtYWpheC9wYXJzZVhNTCwtYWpheC9zY3JpcHQsLWFqYXgvdmFyL2xvY2F0aW9uLC1hamF4L3Zhci9ub25jZSwtYWpheC92YXIvcnF1ZXJ5LC1hamF4L3hociwtbWFuaXB1bGF0aW9uL19ldmFsVXJsLC1ldmVudC9hamF4LC1lZmZlY3RzLC1lZmZlY3RzL1R3ZWVuLC1lZmZlY3RzL2FuaW1hdGVkU2VsZWN0b3IgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbiAoZSwgdCkgeyAidXNlIHN0cmljdCI7ICJvYmplY3QiID09IHR5cGVvZiBtb2R1bGUgJiYgIm9iamVjdCIgPT0gdHlwZW9mIG1vZHVsZS5leHBvcnRzID8gbW9kdWxlLmV4cG9ydHMgPSBlLmRvY3VtZW50ID8gdChlLCAhMCkgOiBmdW5jdGlvbiAoZSkgeyBpZiAoIWUuZG9jdW1lbnQpIHRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpOyByZXR1cm4gdChlKSB9IDogdChlKSB9KCJ1bmRlZmluZWQiICE9IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiAoZSwgdCkgeyAidXNlIHN0cmljdCI7IHZhciBuID0gW10sIHIgPSBlLmRvY3VtZW50LCBpID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLCBvID0gbi5zbGljZSwgYSA9IG4uY29uY2F0LCB1ID0gbi5wdXNoLCBzID0gbi5pbmRleE9mLCBsID0ge30sIGMgPSBsLnRvU3RyaW5nLCBmID0gbC5oYXNPd25Qcm9wZXJ0eSwgZCA9IGYudG9TdHJpbmcsIHAgPSBkLmNhbGwoT2JqZWN0KSwgaCA9IHt9LCBnID0gZnVuY3Rpb24gZSh0KSB7IHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmICJudW1iZXIiICE9IHR5cGVvZiB0Lm5vZGVUeXBlIH0sIHYgPSBmdW5jdGlvbiBlKHQpIHsgcmV0dXJuIG51bGwgIT0gdCAmJiB0ID09PSB0LndpbmRvdyB9LCB5ID0geyB0eXBlOiAhMCwgc3JjOiAhMCwgbm9Nb2R1bGU6ICEwIH07IGZ1bmN0aW9uIG0oZSwgdCwgbikgeyB2YXIgaSwgbyA9ICh0ID0gdCB8fCByKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsgaWYgKG8udGV4dCA9IGUsIG4pIGZvciAoaSBpbiB5KSBuW2ldICYmIChvW2ldID0gbltpXSk7IHQuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pIH0gZnVuY3Rpb24gYihlKSB7IHJldHVybiBudWxsID09IGUgPyBlICsgIiIgOiAib2JqZWN0IiA9PSB0eXBlb2YgZSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiBlID8gbFtjLmNhbGwoZSldIHx8ICJvYmplY3QiIDogdHlwZW9mIGUgfSB2YXIgeCA9ICIzLjMuMSAtYWpheCwtYWpheC9qc29ucCwtYWpheC9sb2FkLC1hamF4L3BhcnNlWE1MLC1hamF4L3NjcmlwdCwtYWpheC92YXIvbG9jYXRpb24sLWFqYXgvdmFyL25vbmNlLC1hamF4L3Zhci9ycXVlcnksLWFqYXgveGhyLC1tYW5pcHVsYXRpb24vX2V2YWxVcmwsLWV2ZW50L2FqYXgsLWVmZmVjdHMsLWVmZmVjdHMvVHdlZW4sLWVmZmVjdHMvYW5pbWF0ZWRTZWxlY3RvciIsIHcgPSBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gbmV3IHcuZm4uaW5pdChlLCB0KSB9LCBDID0gL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nOyB3LmZuID0gdy5wcm90b3R5cGUgPSB7IGpxdWVyeTogeCwgY29uc3RydWN0b3I6IHcsIGxlbmd0aDogMCwgdG9BcnJheTogZnVuY3Rpb24gKCkgeyByZXR1cm4gby5jYWxsKHRoaXMpIH0sIGdldDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG51bGwgPT0gZSA/IG8uY2FsbCh0aGlzKSA6IGUgPCAwID8gdGhpc1tlICsgdGhpcy5sZW5ndGhdIDogdGhpc1tlXSB9LCBwdXNoU3RhY2s6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gdy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksIGUpOyByZXR1cm4gdC5wcmV2T2JqZWN0ID0gdGhpcywgdCB9LCBlYWNoOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdy5lYWNoKHRoaXMsIGUpIH0sIG1hcDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsIGZ1bmN0aW9uICh0LCBuKSB7IHJldHVybiBlLmNhbGwodCwgbiwgdCkgfSkpIH0sIHNsaWNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnB1c2hTdGFjayhvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIH0sIGZpcnN0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVxKDApIH0sIGxhc3Q6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZXEoLTEpIH0sIGVxOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHRoaXMubGVuZ3RoLCBuID0gK2UgKyAoZSA8IDAgPyB0IDogMCk7IHJldHVybiB0aGlzLnB1c2hTdGFjayhuID49IDAgJiYgbiA8IHQgPyBbdGhpc1tuXV0gOiBbXSkgfSwgZW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpIH0sIHB1c2g6IHUsIHNvcnQ6IG4uc29ydCwgc3BsaWNlOiBuLnNwbGljZSB9LCB3LmV4dGVuZCA9IHcuZm4uZXh0ZW5kID0gZnVuY3Rpb24gKCkgeyB2YXIgZSwgdCwgbiwgciwgaSwgbywgYSA9IGFyZ3VtZW50c1swXSB8fCB7fSwgdSA9IDEsIHMgPSBhcmd1bWVudHMubGVuZ3RoLCBsID0gITE7IGZvciAoImJvb2xlYW4iID09IHR5cGVvZiBhICYmIChsID0gYSwgYSA9IGFyZ3VtZW50c1t1XSB8fCB7fSwgdSsrKSwgIm9iamVjdCIgPT0gdHlwZW9mIGEgfHwgZyhhKSB8fCAoYSA9IHt9KSwgdSA9PT0gcyAmJiAoYSA9IHRoaXMsIHUtLSk7IHUgPCBzOyB1KyspaWYgKG51bGwgIT0gKGUgPSBhcmd1bWVudHNbdV0pKSBmb3IgKHQgaW4gZSkgbiA9IGFbdF0sIGEgIT09IChyID0gZVt0XSkgJiYgKGwgJiYgciAmJiAody5pc1BsYWluT2JqZWN0KHIpIHx8IChpID0gQXJyYXkuaXNBcnJheShyKSkpID8gKGkgPyAoaSA9ICExLCBvID0gbiAmJiBBcnJheS5pc0FycmF5KG4pID8gbiA6IFtdKSA6IG8gPSBuICYmIHcuaXNQbGFpbk9iamVjdChuKSA/IG4gOiB7fSwgYVt0XSA9IHcuZXh0ZW5kKGwsIG8sIHIpKSA6IHZvaWQgMCAhPT0gciAmJiAoYVt0XSA9IHIpKTsgcmV0dXJuIGEgfSwgdy5leHRlbmQoeyBleHBhbmRvOiAialF1ZXJ5IiArICh4ICsgTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywgIiIpLCBpc1JlYWR5OiAhMCwgZXJyb3I6IGZ1bmN0aW9uIChlKSB7IHRocm93IG5ldyBFcnJvcihlKSB9LCBub29wOiBmdW5jdGlvbiAoKSB7IH0sIGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uIChlKSB7IHZhciB0LCBuOyByZXR1cm4gISghZSB8fCAiW29iamVjdCBPYmplY3RdIiAhPT0gYy5jYWxsKGUpKSAmJiAoISh0ID0gaShlKSkgfHwgImZ1bmN0aW9uIiA9PSB0eXBlb2YgKG4gPSBmLmNhbGwodCwgImNvbnN0cnVjdG9yIikgJiYgdC5jb25zdHJ1Y3RvcikgJiYgZC5jYWxsKG4pID09PSBwKSB9LCBpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdDsgZm9yICh0IGluIGUpIHJldHVybiAhMTsgcmV0dXJuICEwIH0sIGdsb2JhbEV2YWw6IGZ1bmN0aW9uIChlKSB7IG0oZSkgfSwgZWFjaDogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIgPSAwOyBpZiAoVChlKSkgeyBmb3IgKG4gPSBlLmxlbmd0aDsgciA8IG47IHIrKylpZiAoITEgPT09IHQuY2FsbChlW3JdLCByLCBlW3JdKSkgYnJlYWsgfSBlbHNlIGZvciAociBpbiBlKSBpZiAoITEgPT09IHQuY2FsbChlW3JdLCByLCBlW3JdKSkgYnJlYWs7IHJldHVybiBlIH0sIHRyaW06IGZ1bmN0aW9uIChlKSB7IHJldHVybiBudWxsID09IGUgPyAiIiA6IChlICsgIiIpLnJlcGxhY2UoQywgIiIpIH0sIG1ha2VBcnJheTogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSB0IHx8IFtdOyByZXR1cm4gbnVsbCAhPSBlICYmIChUKE9iamVjdChlKSkgPyB3Lm1lcmdlKG4sICJzdHJpbmciID09IHR5cGVvZiBlID8gW2VdIDogZSkgOiB1LmNhbGwobiwgZSkpLCBuIH0sIGluQXJyYXk6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBudWxsID09IHQgPyAtMSA6IHMuY2FsbCh0LCBlLCBuKSB9LCBtZXJnZTogZnVuY3Rpb24gKGUsIHQpIHsgZm9yICh2YXIgbiA9ICt0Lmxlbmd0aCwgciA9IDAsIGkgPSBlLmxlbmd0aDsgciA8IG47IHIrKyllW2krK10gPSB0W3JdOyByZXR1cm4gZS5sZW5ndGggPSBpLCBlIH0sIGdyZXA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IGZvciAodmFyIHIsIGkgPSBbXSwgbyA9IDAsIGEgPSBlLmxlbmd0aCwgdSA9ICFuOyBvIDwgYTsgbysrKShyID0gIXQoZVtvXSwgbykpICE9PSB1ICYmIGkucHVzaChlW29dKTsgcmV0dXJuIGkgfSwgbWFwOiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaSwgbyA9IDAsIHUgPSBbXTsgaWYgKFQoZSkpIGZvciAociA9IGUubGVuZ3RoOyBvIDwgcjsgbysrKW51bGwgIT0gKGkgPSB0KGVbb10sIG8sIG4pKSAmJiB1LnB1c2goaSk7IGVsc2UgZm9yIChvIGluIGUpIG51bGwgIT0gKGkgPSB0KGVbb10sIG8sIG4pKSAmJiB1LnB1c2goaSk7IHJldHVybiBhLmFwcGx5KFtdLCB1KSB9LCBndWlkOiAxLCBzdXBwb3J0OiBoIH0pLCAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgKHcuZm5bU3ltYm9sLml0ZXJhdG9yXSA9IG5bU3ltYm9sLml0ZXJhdG9yXSksIHcuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksIGZ1bmN0aW9uIChlLCB0KSB7IGxbIltvYmplY3QgIiArIHQgKyAiXSJdID0gdC50b0xvd2VyQ2FzZSgpIH0pOyBmdW5jdGlvbiBUKGUpIHsgdmFyIHQgPSAhIWUgJiYgImxlbmd0aCIgaW4gZSAmJiBlLmxlbmd0aCwgbiA9IGIoZSk7IHJldHVybiAhZyhlKSAmJiAhdihlKSAmJiAoImFycmF5IiA9PT0gbiB8fCAwID09PSB0IHx8ICJudW1iZXIiID09IHR5cGVvZiB0ICYmIHQgPiAwICYmIHQgLSAxIGluIGUpIH0gdmFyIEUgPSBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiwgciwgaSwgbywgYSwgdSwgcywgbCwgYywgZiwgZCwgcCwgaCwgZywgdiwgeSwgbSwgYiwgeCA9ICJzaXp6bGUiICsgMSAqIG5ldyBEYXRlLCB3ID0gZS5kb2N1bWVudCwgQyA9IDAsIFQgPSAwLCBFID0gYWUoKSwgTiA9IGFlKCksIGsgPSBhZSgpLCBBID0gZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuIGUgPT09IHQgJiYgKGYgPSAhMCksIDAgfSwgRCA9IHt9Lmhhc093blByb3BlcnR5LCBTID0gW10sIEwgPSBTLnBvcCwgaiA9IFMucHVzaCwgcSA9IFMucHVzaCwgTyA9IFMuc2xpY2UsIFAgPSBmdW5jdGlvbiAoZSwgdCkgeyBmb3IgKHZhciBuID0gMCwgciA9IGUubGVuZ3RoOyBuIDwgcjsgbisrKWlmIChlW25dID09PSB0KSByZXR1cm4gbjsgcmV0dXJuIC0xIH0sIEggPSAiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLCBJID0gIltcXHgyMFxcdFxcclxcblxcZl0iLCBSID0gIig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIiwgQiA9ICJcXFsiICsgSSArICIqKCIgKyBSICsgIikoPzoiICsgSSArICIqKFsqXiR8IX5dPz0pIiArIEkgKyAiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiICsgUiArICIpKXwpIiArIEkgKyAiKlxcXSIsIE0gPSAiOigiICsgUiArICIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IiArIEIgKyAiKSopfC4qKVxcKXwpIiwgVyA9IG5ldyBSZWdFeHAoSSArICIrIiwgImciKSwgJCA9IG5ldyBSZWdFeHAoIl4iICsgSSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgSSArICIrJCIsICJnIiksIEYgPSBuZXcgUmVnRXhwKCJeIiArIEkgKyAiKiwiICsgSSArICIqIiksIHogPSBuZXcgUmVnRXhwKCJeIiArIEkgKyAiKihbPit+XXwiICsgSSArICIpIiArIEkgKyAiKiIpLCBfID0gbmV3IFJlZ0V4cCgiPSIgKyBJICsgIiooW15cXF0nXCJdKj8pIiArIEkgKyAiKlxcXSIsICJnIiksIFUgPSBuZXcgUmVnRXhwKE0pLCBWID0gbmV3IFJlZ0V4cCgiXiIgKyBSICsgIiQiKSwgWCA9IHsgSUQ6IG5ldyBSZWdFeHAoIl4jKCIgKyBSICsgIikiKSwgQ0xBU1M6IG5ldyBSZWdFeHAoIl5cXC4oIiArIFIgKyAiKSIpLCBUQUc6IG5ldyBSZWdFeHAoIl4oIiArIFIgKyAifFsqXSkiKSwgQVRUUjogbmV3IFJlZ0V4cCgiXiIgKyBCKSwgUFNFVURPOiBuZXcgUmVnRXhwKCJeIiArIE0pLCBDSElMRDogbmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIEkgKyAiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyBJICsgIiooPzooWystXXwpIiArIEkgKyAiKihcXGQrKXwpKSIgKyBJICsgIipcXCl8KSIsICJpIiksIGJvb2w6IG5ldyBSZWdFeHAoIl4oPzoiICsgSCArICIpJCIsICJpIiksIG5lZWRzQ29udGV4dDogbmV3IFJlZ0V4cCgiXiIgKyBJICsgIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIgKyBJICsgIiooKD86LVxcZCk/XFxkKikiICsgSSArICIqXFwpfCkoPz1bXi1dfCQpIiwgImkiKSB9LCBRID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwgWSA9IC9eaFxkJC9pLCBHID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLCBLID0gL14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLywgSiA9IC9bK35dLywgWiA9IG5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIgKyBJICsgIj98KCIgKyBJICsgIil8LikiLCAiaWciKSwgZWUgPSBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciA9ICIweCIgKyB0IC0gNjU1MzY7IHJldHVybiByICE9PSByIHx8IG4gPyB0IDogciA8IDAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKHIgKyA2NTUzNikgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKHIgPj4gMTAgfCA1NTI5NiwgMTAyMyAmIHIgfCA1NjMyMCkgfSwgdGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywgbmUgPSBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gdCA/ICJcMCIgPT09IGUgPyAiXHVmZmZkIiA6IGUuc2xpY2UoMCwgLTEpICsgIlxcIiArIGUuY2hhckNvZGVBdChlLmxlbmd0aCAtIDEpLnRvU3RyaW5nKDE2KSArICIgIiA6ICJcXCIgKyBlIH0sIHJlID0gZnVuY3Rpb24gKCkgeyBkKCkgfSwgaWUgPSBtZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gITAgPT09IGUuZGlzYWJsZWQgJiYgKCJmb3JtIiBpbiBlIHx8ICJsYWJlbCIgaW4gZSkgfSwgeyBkaXI6ICJwYXJlbnROb2RlIiwgbmV4dDogImxlZ2VuZCIgfSk7IHRyeSB7IHEuYXBwbHkoUyA9IE8uY2FsbCh3LmNoaWxkTm9kZXMpLCB3LmNoaWxkTm9kZXMpLCBTW3cuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlIH0gY2F0Y2ggKGUpIHsgcSA9IHsgYXBwbHk6IFMubGVuZ3RoID8gZnVuY3Rpb24gKGUsIHQpIHsgai5hcHBseShlLCBPLmNhbGwodCkpIH0gOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IGUubGVuZ3RoLCByID0gMDsgd2hpbGUgKGVbbisrXSA9IHRbcisrXSk7IGUubGVuZ3RoID0gbiAtIDEgfSB9IH0gZnVuY3Rpb24gb2UoZSwgdCwgciwgaSkgeyB2YXIgbywgdSwgbCwgYywgZiwgaCwgeSwgbSA9IHQgJiYgdC5vd25lckRvY3VtZW50LCBDID0gdCA/IHQubm9kZVR5cGUgOiA5OyBpZiAociA9IHIgfHwgW10sICJzdHJpbmciICE9IHR5cGVvZiBlIHx8ICFlIHx8IDEgIT09IEMgJiYgOSAhPT0gQyAmJiAxMSAhPT0gQykgcmV0dXJuIHI7IGlmICghaSAmJiAoKHQgPyB0Lm93bmVyRG9jdW1lbnQgfHwgdCA6IHcpICE9PSBwICYmIGQodCksIHQgPSB0IHx8IHAsIGcpKSB7IGlmICgxMSAhPT0gQyAmJiAoZiA9IEsuZXhlYyhlKSkpIGlmIChvID0gZlsxXSkgeyBpZiAoOSA9PT0gQykgeyBpZiAoIShsID0gdC5nZXRFbGVtZW50QnlJZChvKSkpIHJldHVybiByOyBpZiAobC5pZCA9PT0gbykgcmV0dXJuIHIucHVzaChsKSwgciB9IGVsc2UgaWYgKG0gJiYgKGwgPSBtLmdldEVsZW1lbnRCeUlkKG8pKSAmJiBiKHQsIGwpICYmIGwuaWQgPT09IG8pIHJldHVybiByLnB1c2gobCksIHIgfSBlbHNlIHsgaWYgKGZbMl0pIHJldHVybiBxLmFwcGx5KHIsIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLCByOyBpZiAoKG8gPSBmWzNdKSAmJiBuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSByZXR1cm4gcS5hcHBseShyLCB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLCByIH0gaWYgKG4ucXNhICYmICFrW2UgKyAiICJdICYmICghdiB8fCAhdi50ZXN0KGUpKSkgeyBpZiAoMSAhPT0gQykgbSA9IHQsIHkgPSBlOyBlbHNlIGlmICgib2JqZWN0IiAhPT0gdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7IChjID0gdC5nZXRBdHRyaWJ1dGUoImlkIikpID8gYyA9IGMucmVwbGFjZSh0ZSwgbmUpIDogdC5zZXRBdHRyaWJ1dGUoImlkIiwgYyA9IHgpLCB1ID0gKGggPSBhKGUpKS5sZW5ndGg7IHdoaWxlICh1LS0pIGhbdV0gPSAiIyIgKyBjICsgIiAiICsgeWUoaFt1XSk7IHkgPSBoLmpvaW4oIiwiKSwgbSA9IEoudGVzdChlKSAmJiBnZSh0LnBhcmVudE5vZGUpIHx8IHQgfSBpZiAoeSkgdHJ5IHsgcmV0dXJuIHEuYXBwbHkociwgbS5xdWVyeVNlbGVjdG9yQWxsKHkpKSwgciB9IGNhdGNoIChlKSB7IH0gZmluYWxseSB7IGMgPT09IHggJiYgdC5yZW1vdmVBdHRyaWJ1dGUoImlkIikgfSB9IH0gcmV0dXJuIHMoZS5yZXBsYWNlKCQsICIkMSIpLCB0LCByLCBpKSB9IGZ1bmN0aW9uIGFlKCkgeyB2YXIgZSA9IFtdOyBmdW5jdGlvbiB0KG4sIGkpIHsgcmV0dXJuIGUucHVzaChuICsgIiAiKSA+IHIuY2FjaGVMZW5ndGggJiYgZGVsZXRlIHRbZS5zaGlmdCgpXSwgdFtuICsgIiAiXSA9IGkgfSByZXR1cm4gdCB9IGZ1bmN0aW9uIHVlKGUpIHsgcmV0dXJuIGVbeF0gPSAhMCwgZSB9IGZ1bmN0aW9uIHNlKGUpIHsgdmFyIHQgPSBwLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7IHRyeSB7IHJldHVybiAhIWUodCkgfSBjYXRjaCAoZSkgeyByZXR1cm4gITEgfSBmaW5hbGx5IHsgdC5wYXJlbnROb2RlICYmIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSwgdCA9IG51bGwgfSB9IGZ1bmN0aW9uIGxlKGUsIHQpIHsgdmFyIG4gPSBlLnNwbGl0KCJ8IiksIGkgPSBuLmxlbmd0aDsgd2hpbGUgKGktLSkgci5hdHRySGFuZGxlW25baV1dID0gdCB9IGZ1bmN0aW9uIGNlKGUsIHQpIHsgdmFyIG4gPSB0ICYmIGUsIHIgPSBuICYmIDEgPT09IGUubm9kZVR5cGUgJiYgMSA9PT0gdC5ub2RlVHlwZSAmJiBlLnNvdXJjZUluZGV4IC0gdC5zb3VyY2VJbmRleDsgaWYgKHIpIHJldHVybiByOyBpZiAobikgd2hpbGUgKG4gPSBuLm5leHRTaWJsaW5nKSBpZiAobiA9PT0gdCkgcmV0dXJuIC0xOyByZXR1cm4gZSA/IDEgOiAtMSB9IGZ1bmN0aW9uIGZlKGUpIHsgcmV0dXJuIGZ1bmN0aW9uICh0KSB7IHJldHVybiAiaW5wdXQiID09PSB0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgJiYgdC50eXBlID09PSBlIH0gfSBmdW5jdGlvbiBkZShlKSB7IHJldHVybiBmdW5jdGlvbiAodCkgeyB2YXIgbiA9IHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsgcmV0dXJuICgiaW5wdXQiID09PSBuIHx8ICJidXR0b24iID09PSBuKSAmJiB0LnR5cGUgPT09IGUgfSB9IGZ1bmN0aW9uIHBlKGUpIHsgcmV0dXJuIGZ1bmN0aW9uICh0KSB7IHJldHVybiAiZm9ybSIgaW4gdCA/IHQucGFyZW50Tm9kZSAmJiAhMSA9PT0gdC5kaXNhYmxlZCA/ICJsYWJlbCIgaW4gdCA/ICJsYWJlbCIgaW4gdC5wYXJlbnROb2RlID8gdC5wYXJlbnROb2RlLmRpc2FibGVkID09PSBlIDogdC5kaXNhYmxlZCA9PT0gZSA6IHQuaXNEaXNhYmxlZCA9PT0gZSB8fCB0LmlzRGlzYWJsZWQgIT09ICFlICYmIGllKHQpID09PSBlIDogdC5kaXNhYmxlZCA9PT0gZSA6ICJsYWJlbCIgaW4gdCAmJiB0LmRpc2FibGVkID09PSBlIH0gfSBmdW5jdGlvbiBoZShlKSB7IHJldHVybiB1ZShmdW5jdGlvbiAodCkgeyByZXR1cm4gdCA9ICt0LCB1ZShmdW5jdGlvbiAobiwgcikgeyB2YXIgaSwgbyA9IGUoW10sIG4ubGVuZ3RoLCB0KSwgYSA9IG8ubGVuZ3RoOyB3aGlsZSAoYS0tKSBuW2kgPSBvW2FdXSAmJiAobltpXSA9ICEocltpXSA9IG5baV0pKSB9KSB9KSB9IGZ1bmN0aW9uIGdlKGUpIHsgcmV0dXJuIGUgJiYgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgJiYgZSB9IG4gPSBvZS5zdXBwb3J0ID0ge30sIG8gPSBvZS5pc1hNTCA9IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZSAmJiAoZS5vd25lckRvY3VtZW50IHx8IGUpLmRvY3VtZW50RWxlbWVudDsgcmV0dXJuICEhdCAmJiAiSFRNTCIgIT09IHQubm9kZU5hbWUgfSwgZCA9IG9lLnNldERvY3VtZW50ID0gZnVuY3Rpb24gKGUpIHsgdmFyIHQsIGksIGEgPSBlID8gZS5vd25lckRvY3VtZW50IHx8IGUgOiB3OyByZXR1cm4gYSAhPT0gcCAmJiA5ID09PSBhLm5vZGVUeXBlICYmIGEuZG9jdW1lbnRFbGVtZW50ID8gKHAgPSBhLCBoID0gcC5kb2N1bWVudEVsZW1lbnQsIGcgPSAhbyhwKSwgdyAhPT0gcCAmJiAoaSA9IHAuZGVmYXVsdFZpZXcpICYmIGkudG9wICE9PSBpICYmIChpLmFkZEV2ZW50TGlzdGVuZXIgPyBpLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsIHJlLCAhMSkgOiBpLmF0dGFjaEV2ZW50ICYmIGkuYXR0YWNoRXZlbnQoIm9udW5sb2FkIiwgcmUpKSwgbi5hdHRyaWJ1dGVzID0gc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuY2xhc3NOYW1lID0gImkiLCAhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpIH0pLCBuLmdldEVsZW1lbnRzQnlUYWdOYW1lID0gc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuYXBwZW5kQ2hpbGQocC5jcmVhdGVDb21tZW50KCIiKSksICFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoIH0pLCBuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBHLnRlc3QocC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSwgbi5nZXRCeUlkID0gc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGguYXBwZW5kQ2hpbGQoZSkuaWQgPSB4LCAhcC5nZXRFbGVtZW50c0J5TmFtZSB8fCAhcC5nZXRFbGVtZW50c0J5TmFtZSh4KS5sZW5ndGggfSksIG4uZ2V0QnlJZCA/IChyLmZpbHRlci5JRCA9IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5yZXBsYWNlKFosIGVlKTsgcmV0dXJuIGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gdCB9IH0sIHIuZmluZC5JRCA9IGZ1bmN0aW9uIChlLCB0KSB7IGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCAmJiBnKSB7IHZhciBuID0gdC5nZXRFbGVtZW50QnlJZChlKTsgcmV0dXJuIG4gPyBbbl0gOiBbXSB9IH0pIDogKHIuZmlsdGVyLklEID0gZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBlLnJlcGxhY2UoWiwgZWUpOyByZXR1cm4gZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlICYmIGUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsgcmV0dXJuIG4gJiYgbi52YWx1ZSA9PT0gdCB9IH0sIHIuZmluZC5JRCA9IGZ1bmN0aW9uIChlLCB0KSB7IGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCAmJiBnKSB7IHZhciBuLCByLCBpLCBvID0gdC5nZXRFbGVtZW50QnlJZChlKTsgaWYgKG8pIHsgaWYgKChuID0gby5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSAmJiBuLnZhbHVlID09PSBlKSByZXR1cm4gW29dOyBpID0gdC5nZXRFbGVtZW50c0J5TmFtZShlKSwgciA9IDA7IHdoaWxlIChvID0gaVtyKytdKSBpZiAoKG4gPSBvLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpICYmIG4udmFsdWUgPT09IGUpIHJldHVybiBbb10gfSByZXR1cm4gW10gfSB9KSwgci5maW5kLlRBRyA9IG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gInVuZGVmaW5lZCIgIT0gdHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyB0LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpIDogbi5xc2EgPyB0LnF1ZXJ5U2VsZWN0b3JBbGwoZSkgOiB2b2lkIDAgfSA6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gW10sIGkgPSAwLCBvID0gdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTsgaWYgKCIqIiA9PT0gZSkgeyB3aGlsZSAobiA9IG9baSsrXSkgMSA9PT0gbi5ub2RlVHlwZSAmJiByLnB1c2gobik7IHJldHVybiByIH0gcmV0dXJuIG8gfSwgci5maW5kLkNMQVNTID0gbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uIChlLCB0KSB7IGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGcpIHJldHVybiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSkgfSwgeSA9IFtdLCB2ID0gW10sIChuLnFzYSA9IEcudGVzdChwLnF1ZXJ5U2VsZWN0b3JBbGwpKSAmJiAoc2UoZnVuY3Rpb24gKGUpIHsgaC5hcHBlbmRDaGlsZChlKS5pbm5lckhUTUwgPSAiPGEgaWQ9JyIgKyB4ICsgIic+PC9hPjxzZWxlY3QgaWQ9JyIgKyB4ICsgIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsIGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGggJiYgdi5wdXNoKCJbKl4kXT0iICsgSSArICIqKD86Jyd8XCJcIikiKSwgZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoIHx8IHYucHVzaCgiXFxbIiArIEkgKyAiKig/OnZhbHVlfCIgKyBIICsgIikiKSwgZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIgKyB4ICsgIi1dIikubGVuZ3RoIHx8IHYucHVzaCgifj0iKSwgZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aCB8fCB2LnB1c2goIjpjaGVja2VkIiksIGUucXVlcnlTZWxlY3RvckFsbCgiYSMiICsgeCArICIrKiIpLmxlbmd0aCB8fCB2LnB1c2goIi4jLitbK35dIikgfSksIHNlKGZ1bmN0aW9uIChlKSB7IGUuaW5uZXJIVE1MID0gIjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7IHZhciB0ID0gcC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOyB0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJoaWRkZW4iKSwgZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiRCIpLCBlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICYmIHYucHVzaCgibmFtZSIgKyBJICsgIipbKl4kfCF+XT89IiksIDIgIT09IGUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggJiYgdi5wdXNoKCI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiKSwgaC5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZCA9ICEwLCAyICE9PSBlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCAmJiB2LnB1c2goIjplbmFibGVkIiwgIjpkaXNhYmxlZCIpLCBlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSwgdi5wdXNoKCIsLio6IikgfSkpLCAobi5tYXRjaGVzU2VsZWN0b3IgPSBHLnRlc3QobSA9IGgubWF0Y2hlcyB8fCBoLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBoLm1vek1hdGNoZXNTZWxlY3RvciB8fCBoLm9NYXRjaGVzU2VsZWN0b3IgfHwgaC5tc01hdGNoZXNTZWxlY3RvcikpICYmIHNlKGZ1bmN0aW9uIChlKSB7IG4uZGlzY29ubmVjdGVkTWF0Y2ggPSBtLmNhbGwoZSwgIioiKSwgbS5jYWxsKGUsICJbcyE9JyddOngiKSwgeS5wdXNoKCIhPSIsIE0pIH0pLCB2ID0gdi5sZW5ndGggJiYgbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksIHkgPSB5Lmxlbmd0aCAmJiBuZXcgUmVnRXhwKHkuam9pbigifCIpKSwgdCA9IEcudGVzdChoLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSwgYiA9IHQgfHwgRy50ZXN0KGguY29udGFpbnMpID8gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSA5ID09PSBlLm5vZGVUeXBlID8gZS5kb2N1bWVudEVsZW1lbnQgOiBlLCByID0gdCAmJiB0LnBhcmVudE5vZGU7IHJldHVybiBlID09PSByIHx8ICEoIXIgfHwgMSAhPT0gci5ub2RlVHlwZSB8fCAhKG4uY29udGFpbnMgPyBuLmNvbnRhaW5zKHIpIDogZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiAxNiAmIGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKSB9IDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKHQpIHdoaWxlICh0ID0gdC5wYXJlbnROb2RlKSBpZiAodCA9PT0gZSkgcmV0dXJuICEwOyByZXR1cm4gITEgfSwgQSA9IHQgPyBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoZSA9PT0gdCkgcmV0dXJuIGYgPSAhMCwgMDsgdmFyIHIgPSAhZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uOyByZXR1cm4gciB8fCAoMSAmIChyID0gKGUub3duZXJEb2N1bWVudCB8fCBlKSA9PT0gKHQub3duZXJEb2N1bWVudCB8fCB0KSA/IGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkgOiAxKSB8fCAhbi5zb3J0RGV0YWNoZWQgJiYgdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKSA9PT0gciA/IGUgPT09IHAgfHwgZS5vd25lckRvY3VtZW50ID09PSB3ICYmIGIodywgZSkgPyAtMSA6IHQgPT09IHAgfHwgdC5vd25lckRvY3VtZW50ID09PSB3ICYmIGIodywgdCkgPyAxIDogYyA/IFAoYywgZSkgLSBQKGMsIHQpIDogMCA6IDQgJiByID8gLTEgOiAxKSB9IDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKGUgPT09IHQpIHJldHVybiBmID0gITAsIDA7IHZhciBuLCByID0gMCwgaSA9IGUucGFyZW50Tm9kZSwgbyA9IHQucGFyZW50Tm9kZSwgYSA9IFtlXSwgdSA9IFt0XTsgaWYgKCFpIHx8ICFvKSByZXR1cm4gZSA9PT0gcCA/IC0xIDogdCA9PT0gcCA/IDEgOiBpID8gLTEgOiBvID8gMSA6IGMgPyBQKGMsIGUpIC0gUChjLCB0KSA6IDA7IGlmIChpID09PSBvKSByZXR1cm4gY2UoZSwgdCk7IG4gPSBlOyB3aGlsZSAobiA9IG4ucGFyZW50Tm9kZSkgYS51bnNoaWZ0KG4pOyBuID0gdDsgd2hpbGUgKG4gPSBuLnBhcmVudE5vZGUpIHUudW5zaGlmdChuKTsgd2hpbGUgKGFbcl0gPT09IHVbcl0pIHIrKzsgcmV0dXJuIHIgPyBjZShhW3JdLCB1W3JdKSA6IGFbcl0gPT09IHcgPyAtMSA6IHVbcl0gPT09IHcgPyAxIDogMCB9LCBwKSA6IHAgfSwgb2UubWF0Y2hlcyA9IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiBvZShlLCBudWxsLCBudWxsLCB0KSB9LCBvZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoKGUub3duZXJEb2N1bWVudCB8fCBlKSAhPT0gcCAmJiBkKGUpLCB0ID0gdC5yZXBsYWNlKF8sICI9JyQxJ10iKSwgbi5tYXRjaGVzU2VsZWN0b3IgJiYgZyAmJiAha1t0ICsgIiAiXSAmJiAoIXkgfHwgIXkudGVzdCh0KSkgJiYgKCF2IHx8ICF2LnRlc3QodCkpKSB0cnkgeyB2YXIgciA9IG0uY2FsbChlLCB0KTsgaWYgKHIgfHwgbi5kaXNjb25uZWN0ZWRNYXRjaCB8fCBlLmRvY3VtZW50ICYmIDExICE9PSBlLmRvY3VtZW50Lm5vZGVUeXBlKSByZXR1cm4gciB9IGNhdGNoIChlKSB7IH0gcmV0dXJuIG9lKHQsIHAsIG51bGwsIFtlXSkubGVuZ3RoID4gMCB9LCBvZS5jb250YWlucyA9IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiAoZS5vd25lckRvY3VtZW50IHx8IGUpICE9PSBwICYmIGQoZSksIGIoZSwgdCkgfSwgb2UuYXR0ciA9IGZ1bmN0aW9uIChlLCB0KSB7IChlLm93bmVyRG9jdW1lbnQgfHwgZSkgIT09IHAgJiYgZChlKTsgdmFyIGkgPSByLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSwgbyA9IGkgJiYgRC5jYWxsKHIuYXR0ckhhbmRsZSwgdC50b0xvd2VyQ2FzZSgpKSA/IGkoZSwgdCwgIWcpIDogdm9pZCAwOyByZXR1cm4gdm9pZCAwICE9PSBvID8gbyA6IG4uYXR0cmlidXRlcyB8fCAhZyA/IGUuZ2V0QXR0cmlidXRlKHQpIDogKG8gPSBlLmdldEF0dHJpYnV0ZU5vZGUodCkpICYmIG8uc3BlY2lmaWVkID8gby52YWx1ZSA6IG51bGwgfSwgb2UuZXNjYXBlID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIChlICsgIiIpLnJlcGxhY2UodGUsIG5lKSB9LCBvZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIGUpIH0sIG9lLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgciA9IFtdLCBpID0gMCwgbyA9IDA7IGlmIChmID0gIW4uZGV0ZWN0RHVwbGljYXRlcywgYyA9ICFuLnNvcnRTdGFibGUgJiYgZS5zbGljZSgwKSwgZS5zb3J0KEEpLCBmKSB7IHdoaWxlICh0ID0gZVtvKytdKSB0ID09PSBlW29dICYmIChpID0gci5wdXNoKG8pKTsgd2hpbGUgKGktLSkgZS5zcGxpY2UocltpXSwgMSkgfSByZXR1cm4gYyA9IG51bGwsIGUgfSwgaSA9IG9lLmdldFRleHQgPSBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiA9ICIiLCByID0gMCwgbyA9IGUubm9kZVR5cGU7IGlmIChvKSB7IGlmICgxID09PSBvIHx8IDkgPT09IG8gfHwgMTEgPT09IG8pIHsgaWYgKCJzdHJpbmciID09IHR5cGVvZiBlLnRleHRDb250ZW50KSByZXR1cm4gZS50ZXh0Q29udGVudDsgZm9yIChlID0gZS5maXJzdENoaWxkOyBlOyBlID0gZS5uZXh0U2libGluZyluICs9IGkoZSkgfSBlbHNlIGlmICgzID09PSBvIHx8IDQgPT09IG8pIHJldHVybiBlLm5vZGVWYWx1ZSB9IGVsc2Ugd2hpbGUgKHQgPSBlW3IrK10pIG4gKz0gaSh0KTsgcmV0dXJuIG4gfSwgKHIgPSBvZS5zZWxlY3RvcnMgPSB7IGNhY2hlTGVuZ3RoOiA1MCwgY3JlYXRlUHNldWRvOiB1ZSwgbWF0Y2g6IFgsIGF0dHJIYW5kbGU6IHt9LCBmaW5kOiB7fSwgcmVsYXRpdmU6IHsgIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogITAgfSwgIiAiOiB7IGRpcjogInBhcmVudE5vZGUiIH0sICIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogITAgfSwgIn4iOiB7IGRpcjogInByZXZpb3VzU2libGluZyIgfSB9LCBwcmVGaWx0ZXI6IHsgQVRUUjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGVbMV0gPSBlWzFdLnJlcGxhY2UoWiwgZWUpLCBlWzNdID0gKGVbM10gfHwgZVs0XSB8fCBlWzVdIHx8ICIiKS5yZXBsYWNlKFosIGVlKSwgIn49IiA9PT0gZVsyXSAmJiAoZVszXSA9ICIgIiArIGVbM10gKyAiICIpLCBlLnNsaWNlKDAsIDQpIH0sIENISUxEOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZVsxXSA9IGVbMV0udG9Mb3dlckNhc2UoKSwgIm50aCIgPT09IGVbMV0uc2xpY2UoMCwgMykgPyAoZVszXSB8fCBvZS5lcnJvcihlWzBdKSwgZVs0XSA9ICsoZVs0XSA/IGVbNV0gKyAoZVs2XSB8fCAxKSA6IDIgKiAoImV2ZW4iID09PSBlWzNdIHx8ICJvZGQiID09PSBlWzNdKSksIGVbNV0gPSArKGVbN10gKyBlWzhdIHx8ICJvZGQiID09PSBlWzNdKSkgOiBlWzNdICYmIG9lLmVycm9yKGVbMF0pLCBlIH0sIFBTRVVETzogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4gPSAhZVs2XSAmJiBlWzJdOyByZXR1cm4gWC5DSElMRC50ZXN0KGVbMF0pID8gbnVsbCA6IChlWzNdID8gZVsyXSA9IGVbNF0gfHwgZVs1XSB8fCAiIiA6IG4gJiYgVS50ZXN0KG4pICYmICh0ID0gYShuLCAhMCkpICYmICh0ID0gbi5pbmRleE9mKCIpIiwgbi5sZW5ndGggLSB0KSAtIG4ubGVuZ3RoKSAmJiAoZVswXSA9IGVbMF0uc2xpY2UoMCwgdCksIGVbMl0gPSBuLnNsaWNlKDAsIHQpKSwgZS5zbGljZSgwLCAzKSkgfSB9LCBmaWx0ZXI6IHsgVEFHOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGUucmVwbGFjZShaLCBlZSkudG9Mb3dlckNhc2UoKTsgcmV0dXJuICIqIiA9PT0gZSA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuICEwIH0gOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5ub2RlTmFtZSAmJiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHQgfSB9LCBDTEFTUzogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBFW2UgKyAiICJdOyByZXR1cm4gdCB8fCAodCA9IG5ldyBSZWdFeHAoIihefCIgKyBJICsgIikiICsgZSArICIoIiArIEkgKyAifCQpIikpICYmIEUoZSwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHQudGVzdCgic3RyaW5nIiA9PSB0eXBlb2YgZS5jbGFzc05hbWUgJiYgZS5jbGFzc05hbWUgfHwgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGUuZ2V0QXR0cmlidXRlICYmIGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKSB9KSB9LCBBVFRSOiBmdW5jdGlvbiAoZSwgdCwgbikgeyByZXR1cm4gZnVuY3Rpb24gKHIpIHsgdmFyIGkgPSBvZS5hdHRyKHIsIGUpOyByZXR1cm4gbnVsbCA9PSBpID8gIiE9IiA9PT0gdCA6ICF0IHx8IChpICs9ICIiLCAiPSIgPT09IHQgPyBpID09PSBuIDogIiE9IiA9PT0gdCA/IGkgIT09IG4gOiAiXj0iID09PSB0ID8gbiAmJiAwID09PSBpLmluZGV4T2YobikgOiAiKj0iID09PSB0ID8gbiAmJiBpLmluZGV4T2YobikgPiAtMSA6ICIkPSIgPT09IHQgPyBuICYmIGkuc2xpY2UoLW4ubGVuZ3RoKSA9PT0gbiA6ICJ+PSIgPT09IHQgPyAoIiAiICsgaS5yZXBsYWNlKFcsICIgIikgKyAiICIpLmluZGV4T2YobikgPiAtMSA6ICJ8PSIgPT09IHQgJiYgKGkgPT09IG4gfHwgaS5zbGljZSgwLCBuLmxlbmd0aCArIDEpID09PSBuICsgIi0iKSkgfSB9LCBDSElMRDogZnVuY3Rpb24gKGUsIHQsIG4sIHIsIGkpIHsgdmFyIG8gPSAibnRoIiAhPT0gZS5zbGljZSgwLCAzKSwgYSA9ICJsYXN0IiAhPT0gZS5zbGljZSgtNCksIHUgPSAib2YtdHlwZSIgPT09IHQ7IHJldHVybiAxID09PSByICYmIDAgPT09IGkgPyBmdW5jdGlvbiAoZSkgeyByZXR1cm4gISFlLnBhcmVudE5vZGUgfSA6IGZ1bmN0aW9uICh0LCBuLCBzKSB7IHZhciBsLCBjLCBmLCBkLCBwLCBoLCBnID0gbyAhPT0gYSA/ICJuZXh0U2libGluZyIgOiAicHJldmlvdXNTaWJsaW5nIiwgdiA9IHQucGFyZW50Tm9kZSwgeSA9IHUgJiYgdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBtID0gIXMgJiYgIXUsIGIgPSAhMTsgaWYgKHYpIHsgaWYgKG8pIHsgd2hpbGUgKGcpIHsgZCA9IHQ7IHdoaWxlIChkID0gZFtnXSkgaWYgKHUgPyBkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHkgOiAxID09PSBkLm5vZGVUeXBlKSByZXR1cm4gITE7IGggPSBnID0gIm9ubHkiID09PSBlICYmICFoICYmICJuZXh0U2libGluZyIgfSByZXR1cm4gITAgfSBpZiAoaCA9IFthID8gdi5maXJzdENoaWxkIDogdi5sYXN0Q2hpbGRdLCBhICYmIG0pIHsgYiA9IChwID0gKGwgPSAoYyA9IChmID0gKGQgPSB2KVt4XSB8fCAoZFt4XSA9IHt9KSlbZC51bmlxdWVJRF0gfHwgKGZbZC51bmlxdWVJRF0gPSB7fSkpW2VdIHx8IFtdKVswXSA9PT0gQyAmJiBsWzFdKSAmJiBsWzJdLCBkID0gcCAmJiB2LmNoaWxkTm9kZXNbcF07IHdoaWxlIChkID0gKytwICYmIGQgJiYgZFtnXSB8fCAoYiA9IHAgPSAwKSB8fCBoLnBvcCgpKSBpZiAoMSA9PT0gZC5ub2RlVHlwZSAmJiArK2IgJiYgZCA9PT0gdCkgeyBjW2VdID0gW0MsIHAsIGJdOyBicmVhayB9IH0gZWxzZSBpZiAobSAmJiAoYiA9IHAgPSAobCA9IChjID0gKGYgPSAoZCA9IHQpW3hdIHx8IChkW3hdID0ge30pKVtkLnVuaXF1ZUlEXSB8fCAoZltkLnVuaXF1ZUlEXSA9IHt9KSlbZV0gfHwgW10pWzBdID09PSBDICYmIGxbMV0pLCAhMSA9PT0gYikgd2hpbGUgKGQgPSArK3AgJiYgZCAmJiBkW2ddIHx8IChiID0gcCA9IDApIHx8IGgucG9wKCkpIGlmICgodSA/IGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0geSA6IDEgPT09IGQubm9kZVR5cGUpICYmICsrYiAmJiAobSAmJiAoKGMgPSAoZiA9IGRbeF0gfHwgKGRbeF0gPSB7fSkpW2QudW5pcXVlSURdIHx8IChmW2QudW5pcXVlSURdID0ge30pKVtlXSA9IFtDLCBiXSksIGQgPT09IHQpKSBicmVhazsgcmV0dXJuIChiIC09IGkpID09PSByIHx8IGIgJSByID09IDAgJiYgYiAvIHIgPj0gMCB9IH0gfSwgUFNFVURPOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiwgaSA9IHIucHNldWRvc1tlXSB8fCByLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXSB8fCBvZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgZSk7IHJldHVybiBpW3hdID8gaSh0KSA6IGkubGVuZ3RoID4gMSA/IChuID0gW2UsIGUsICIiLCB0XSwgci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSkgPyB1ZShmdW5jdGlvbiAoZSwgbikgeyB2YXIgciwgbyA9IGkoZSwgdCksIGEgPSBvLmxlbmd0aDsgd2hpbGUgKGEtLSkgZVtyID0gUChlLCBvW2FdKV0gPSAhKG5bcl0gPSBvW2FdKSB9KSA6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBpKGUsIDAsIG4pIH0pIDogaSB9IH0sIHBzZXVkb3M6IHsgbm90OiB1ZShmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IFtdLCBuID0gW10sIHIgPSB1KGUucmVwbGFjZSgkLCAiJDEiKSk7IHJldHVybiByW3hdID8gdWUoZnVuY3Rpb24gKGUsIHQsIG4sIGkpIHsgdmFyIG8sIGEgPSByKGUsIG51bGwsIGksIFtdKSwgdSA9IGUubGVuZ3RoOyB3aGlsZSAodS0tKSAobyA9IGFbdV0pICYmIChlW3VdID0gISh0W3VdID0gbykpIH0pIDogZnVuY3Rpb24gKGUsIGksIG8pIHsgcmV0dXJuIHRbMF0gPSBlLCByKHQsIG51bGwsIG8sIG4pLCB0WzBdID0gbnVsbCwgIW4ucG9wKCkgfSB9KSwgaGFzOiB1ZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIG9lKGUsIHQpLmxlbmd0aCA+IDAgfSB9KSwgY29udGFpbnM6IHVlKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID0gZS5yZXBsYWNlKFosIGVlKSwgZnVuY3Rpb24gKHQpIHsgcmV0dXJuICh0LnRleHRDb250ZW50IHx8IHQuaW5uZXJUZXh0IHx8IGkodCkpLmluZGV4T2YoZSkgPiAtMSB9IH0pLCBsYW5nOiB1ZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gVi50ZXN0KGUgfHwgIiIpIHx8IG9lLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiICsgZSksIGUgPSBlLnJlcGxhY2UoWiwgZWUpLnRvTG93ZXJDYXNlKCksIGZ1bmN0aW9uICh0KSB7IHZhciBuOyBkbyB7IGlmIChuID0gZyA/IHQubGFuZyA6IHQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IHQuZ2V0QXR0cmlidXRlKCJsYW5nIikpIHJldHVybiAobiA9IG4udG9Mb3dlckNhc2UoKSkgPT09IGUgfHwgMCA9PT0gbi5pbmRleE9mKGUgKyAiLSIpIH0gd2hpbGUgKCh0ID0gdC5wYXJlbnROb2RlKSAmJiAxID09PSB0Lm5vZGVUeXBlKTsgcmV0dXJuICExIH0gfSksIHRhcmdldDogZnVuY3Rpb24gKHQpIHsgdmFyIG4gPSBlLmxvY2F0aW9uICYmIGUubG9jYXRpb24uaGFzaDsgcmV0dXJuIG4gJiYgbi5zbGljZSgxKSA9PT0gdC5pZCB9LCByb290OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSA9PT0gaCB9LCBmb2N1czogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUgPT09IHAuYWN0aXZlRWxlbWVudCAmJiAoIXAuaGFzRm9jdXMgfHwgcC5oYXNGb2N1cygpKSAmJiAhIShlLnR5cGUgfHwgZS5ocmVmIHx8IH5lLnRhYkluZGV4KSB9LCBlbmFibGVkOiBwZSghMSksIGRpc2FibGVkOiBwZSghMCksIGNoZWNrZWQ6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyByZXR1cm4gImlucHV0IiA9PT0gdCAmJiAhIWUuY2hlY2tlZCB8fCAib3B0aW9uIiA9PT0gdCAmJiAhIWUuc2VsZWN0ZWQgfSwgc2VsZWN0ZWQ6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLnBhcmVudE5vZGUgJiYgZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsICEwID09PSBlLnNlbGVjdGVkIH0sIGVtcHR5OiBmdW5jdGlvbiAoZSkgeyBmb3IgKGUgPSBlLmZpcnN0Q2hpbGQ7IGU7IGUgPSBlLm5leHRTaWJsaW5nKWlmIChlLm5vZGVUeXBlIDwgNikgcmV0dXJuICExOyByZXR1cm4gITAgfSwgcGFyZW50OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gIXIucHNldWRvcy5lbXB0eShlKSB9LCBoZWFkZXI6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBZLnRlc3QoZS5ub2RlTmFtZSkgfSwgaW5wdXQ6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBRLnRlc3QoZS5ub2RlTmFtZSkgfSwgYnV0dG9uOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsgcmV0dXJuICJpbnB1dCIgPT09IHQgJiYgImJ1dHRvbiIgPT09IGUudHlwZSB8fCAiYnV0dG9uIiA9PT0gdCB9LCB0ZXh0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdDsgcmV0dXJuICJpbnB1dCIgPT09IGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAmJiAidGV4dCIgPT09IGUudHlwZSAmJiAobnVsbCA9PSAodCA9IGUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpIHx8ICJ0ZXh0IiA9PT0gdC50b0xvd2VyQ2FzZSgpKSB9LCBmaXJzdDogaGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gWzBdIH0pLCBsYXN0OiBoZShmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gW3QgLSAxXSB9KSwgZXE6IGhlKGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBbbiA8IDAgPyBuICsgdCA6IG5dIH0pLCBldmVuOiBoZShmdW5jdGlvbiAoZSwgdCkgeyBmb3IgKHZhciBuID0gMDsgbiA8IHQ7IG4gKz0gMillLnB1c2gobik7IHJldHVybiBlIH0pLCBvZGQ6IGhlKGZ1bmN0aW9uIChlLCB0KSB7IGZvciAodmFyIG4gPSAxOyBuIDwgdDsgbiArPSAyKWUucHVzaChuKTsgcmV0dXJuIGUgfSksIGx0OiBoZShmdW5jdGlvbiAoZSwgdCwgbikgeyBmb3IgKHZhciByID0gbiA8IDAgPyBuICsgdCA6IG47IC0tciA+PSAwOyllLnB1c2gocik7IHJldHVybiBlIH0pLCBndDogaGUoZnVuY3Rpb24gKGUsIHQsIG4pIHsgZm9yICh2YXIgciA9IG4gPCAwID8gbiArIHQgOiBuOyArK3IgPCB0OyllLnB1c2gocik7IHJldHVybiBlIH0pIH0gfSkucHNldWRvcy5udGggPSByLnBzZXVkb3MuZXE7IGZvciAodCBpbiB7IHJhZGlvOiAhMCwgY2hlY2tib3g6ICEwLCBmaWxlOiAhMCwgcGFzc3dvcmQ6ICEwLCBpbWFnZTogITAgfSkgci5wc2V1ZG9zW3RdID0gZmUodCk7IGZvciAodCBpbiB7IHN1Ym1pdDogITAsIHJlc2V0OiAhMCB9KSByLnBzZXVkb3NbdF0gPSBkZSh0KTsgZnVuY3Rpb24gdmUoKSB7IH0gdmUucHJvdG90eXBlID0gci5maWx0ZXJzID0gci5wc2V1ZG9zLCByLnNldEZpbHRlcnMgPSBuZXcgdmUsIGEgPSBvZS50b2tlbml6ZSA9IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCBpLCBvLCBhLCB1LCBzLCBsLCBjID0gTltlICsgIiAiXTsgaWYgKGMpIHJldHVybiB0ID8gMCA6IGMuc2xpY2UoMCk7IHUgPSBlLCBzID0gW10sIGwgPSByLnByZUZpbHRlcjsgd2hpbGUgKHUpIHsgbiAmJiAhKGkgPSBGLmV4ZWModSkpIHx8IChpICYmICh1ID0gdS5zbGljZShpWzBdLmxlbmd0aCkgfHwgdSksIHMucHVzaChvID0gW10pKSwgbiA9ICExLCAoaSA9IHouZXhlYyh1KSkgJiYgKG4gPSBpLnNoaWZ0KCksIG8ucHVzaCh7IHZhbHVlOiBuLCB0eXBlOiBpWzBdLnJlcGxhY2UoJCwgIiAiKSB9KSwgdSA9IHUuc2xpY2Uobi5sZW5ndGgpKTsgZm9yIChhIGluIHIuZmlsdGVyKSAhKGkgPSBYW2FdLmV4ZWModSkpIHx8IGxbYV0gJiYgIShpID0gbFthXShpKSkgfHwgKG4gPSBpLnNoaWZ0KCksIG8ucHVzaCh7IHZhbHVlOiBuLCB0eXBlOiBhLCBtYXRjaGVzOiBpIH0pLCB1ID0gdS5zbGljZShuLmxlbmd0aCkpOyBpZiAoIW4pIGJyZWFrIH0gcmV0dXJuIHQgPyB1Lmxlbmd0aCA6IHUgPyBvZS5lcnJvcihlKSA6IE4oZSwgcykuc2xpY2UoMCkgfTsgZnVuY3Rpb24geWUoZSkgeyBmb3IgKHZhciB0ID0gMCwgbiA9IGUubGVuZ3RoLCByID0gIiI7IHQgPCBuOyB0KyspciArPSBlW3RdLnZhbHVlOyByZXR1cm4gciB9IGZ1bmN0aW9uIG1lKGUsIHQsIG4pIHsgdmFyIHIgPSB0LmRpciwgaSA9IHQubmV4dCwgbyA9IGkgfHwgciwgYSA9IG4gJiYgInBhcmVudE5vZGUiID09PSBvLCB1ID0gVCsrOyByZXR1cm4gdC5maXJzdCA/IGZ1bmN0aW9uICh0LCBuLCBpKSB7IHdoaWxlICh0ID0gdFtyXSkgaWYgKDEgPT09IHQubm9kZVR5cGUgfHwgYSkgcmV0dXJuIGUodCwgbiwgaSk7IHJldHVybiAhMSB9IDogZnVuY3Rpb24gKHQsIG4sIHMpIHsgdmFyIGwsIGMsIGYsIGQgPSBbQywgdV07IGlmIChzKSB7IHdoaWxlICh0ID0gdFtyXSkgaWYgKCgxID09PSB0Lm5vZGVUeXBlIHx8IGEpICYmIGUodCwgbiwgcykpIHJldHVybiAhMCB9IGVsc2Ugd2hpbGUgKHQgPSB0W3JdKSBpZiAoMSA9PT0gdC5ub2RlVHlwZSB8fCBhKSBpZiAoZiA9IHRbeF0gfHwgKHRbeF0gPSB7fSksIGMgPSBmW3QudW5pcXVlSURdIHx8IChmW3QudW5pcXVlSURdID0ge30pLCBpICYmIGkgPT09IHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgdCA9IHRbcl0gfHwgdDsgZWxzZSB7IGlmICgobCA9IGNbb10pICYmIGxbMF0gPT09IEMgJiYgbFsxXSA9PT0gdSkgcmV0dXJuIGRbMl0gPSBsWzJdOyBpZiAoY1tvXSA9IGQsIGRbMl0gPSBlKHQsIG4sIHMpKSByZXR1cm4gITAgfSByZXR1cm4gITEgfSB9IGZ1bmN0aW9uIGJlKGUpIHsgcmV0dXJuIGUubGVuZ3RoID4gMSA/IGZ1bmN0aW9uICh0LCBuLCByKSB7IHZhciBpID0gZS5sZW5ndGg7IHdoaWxlIChpLS0pIGlmICghZVtpXSh0LCBuLCByKSkgcmV0dXJuICExOyByZXR1cm4gITAgfSA6IGVbMF0gfSBmdW5jdGlvbiB4ZShlLCB0LCBuKSB7IGZvciAodmFyIHIgPSAwLCBpID0gdC5sZW5ndGg7IHIgPCBpOyByKyspb2UoZSwgdFtyXSwgbik7IHJldHVybiBuIH0gZnVuY3Rpb24gd2UoZSwgdCwgbiwgciwgaSkgeyBmb3IgKHZhciBvLCBhID0gW10sIHUgPSAwLCBzID0gZS5sZW5ndGgsIGwgPSBudWxsICE9IHQ7IHUgPCBzOyB1KyspKG8gPSBlW3VdKSAmJiAobiAmJiAhbihvLCByLCBpKSB8fCAoYS5wdXNoKG8pLCBsICYmIHQucHVzaCh1KSkpOyByZXR1cm4gYSB9IGZ1bmN0aW9uIENlKGUsIHQsIG4sIHIsIGksIG8pIHsgcmV0dXJuIHIgJiYgIXJbeF0gJiYgKHIgPSBDZShyKSksIGkgJiYgIWlbeF0gJiYgKGkgPSBDZShpLCBvKSksIHVlKGZ1bmN0aW9uIChvLCBhLCB1LCBzKSB7IHZhciBsLCBjLCBmLCBkID0gW10sIHAgPSBbXSwgaCA9IGEubGVuZ3RoLCBnID0gbyB8fCB4ZSh0IHx8ICIqIiwgdS5ub2RlVHlwZSA/IFt1XSA6IHUsIFtdKSwgdiA9ICFlIHx8ICFvICYmIHQgPyBnIDogd2UoZywgZCwgZSwgdSwgcyksIHkgPSBuID8gaSB8fCAobyA/IGUgOiBoIHx8IHIpID8gW10gOiBhIDogdjsgaWYgKG4gJiYgbih2LCB5LCB1LCBzKSwgcikgeyBsID0gd2UoeSwgcCksIHIobCwgW10sIHUsIHMpLCBjID0gbC5sZW5ndGg7IHdoaWxlIChjLS0pIChmID0gbFtjXSkgJiYgKHlbcFtjXV0gPSAhKHZbcFtjXV0gPSBmKSkgfSBpZiAobykgeyBpZiAoaSB8fCBlKSB7IGlmIChpKSB7IGwgPSBbXSwgYyA9IHkubGVuZ3RoOyB3aGlsZSAoYy0tKSAoZiA9IHlbY10pICYmIGwucHVzaCh2W2NdID0gZik7IGkobnVsbCwgeSA9IFtdLCBsLCBzKSB9IGMgPSB5Lmxlbmd0aDsgd2hpbGUgKGMtLSkgKGYgPSB5W2NdKSAmJiAobCA9IGkgPyBQKG8sIGYpIDogZFtjXSkgPiAtMSAmJiAob1tsXSA9ICEoYVtsXSA9IGYpKSB9IH0gZWxzZSB5ID0gd2UoeSA9PT0gYSA/IHkuc3BsaWNlKGgsIHkubGVuZ3RoKSA6IHkpLCBpID8gaShudWxsLCBhLCB5LCBzKSA6IHEuYXBwbHkoYSwgeSkgfSkgfSBmdW5jdGlvbiBUZShlKSB7IGZvciAodmFyIHQsIG4sIGksIG8gPSBlLmxlbmd0aCwgYSA9IHIucmVsYXRpdmVbZVswXS50eXBlXSwgdSA9IGEgfHwgci5yZWxhdGl2ZVsiICJdLCBzID0gYSA/IDEgOiAwLCBjID0gbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUgPT09IHQgfSwgdSwgITApLCBmID0gbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIFAodCwgZSkgPiAtMSB9LCB1LCAhMCksIGQgPSBbZnVuY3Rpb24gKGUsIG4sIHIpIHsgdmFyIGkgPSAhYSAmJiAociB8fCBuICE9PSBsKSB8fCAoKHQgPSBuKS5ub2RlVHlwZSA/IGMoZSwgbiwgcikgOiBmKGUsIG4sIHIpKTsgcmV0dXJuIHQgPSBudWxsLCBpIH1dOyBzIDwgbzsgcysrKWlmIChuID0gci5yZWxhdGl2ZVtlW3NdLnR5cGVdKSBkID0gW21lKGJlKGQpLCBuKV07IGVsc2UgeyBpZiAoKG4gPSByLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsIGVbc10ubWF0Y2hlcykpW3hdKSB7IGZvciAoaSA9ICsrczsgaSA8IG87IGkrKylpZiAoci5yZWxhdGl2ZVtlW2ldLnR5cGVdKSBicmVhazsgcmV0dXJuIENlKHMgPiAxICYmIGJlKGQpLCBzID4gMSAmJiB5ZShlLnNsaWNlKDAsIHMgLSAxKS5jb25jYXQoeyB2YWx1ZTogIiAiID09PSBlW3MgLSAyXS50eXBlID8gIioiIDogIiIgfSkpLnJlcGxhY2UoJCwgIiQxIiksIG4sIHMgPCBpICYmIFRlKGUuc2xpY2UocywgaSkpLCBpIDwgbyAmJiBUZShlID0gZS5zbGljZShpKSksIGkgPCBvICYmIHllKGUpKSB9IGQucHVzaChuKSB9IHJldHVybiBiZShkKSB9IGZ1bmN0aW9uIEVlKGUsIHQpIHsgdmFyIG4gPSB0Lmxlbmd0aCA+IDAsIGkgPSBlLmxlbmd0aCA+IDAsIG8gPSBmdW5jdGlvbiAobywgYSwgdSwgcywgYykgeyB2YXIgZiwgaCwgdiwgeSA9IDAsIG0gPSAiMCIsIGIgPSBvICYmIFtdLCB4ID0gW10sIHcgPSBsLCBUID0gbyB8fCBpICYmIHIuZmluZC5UQUcoIioiLCBjKSwgRSA9IEMgKz0gbnVsbCA9PSB3ID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgLjEsIE4gPSBULmxlbmd0aDsgZm9yIChjICYmIChsID0gYSA9PT0gcCB8fCBhIHx8IGMpOyBtICE9PSBOICYmIG51bGwgIT0gKGYgPSBUW21dKTsgbSsrKSB7IGlmIChpICYmIGYpIHsgaCA9IDAsIGEgfHwgZi5vd25lckRvY3VtZW50ID09PSBwIHx8IChkKGYpLCB1ID0gIWcpOyB3aGlsZSAodiA9IGVbaCsrXSkgaWYgKHYoZiwgYSB8fCBwLCB1KSkgeyBzLnB1c2goZik7IGJyZWFrIH0gYyAmJiAoQyA9IEUpIH0gbiAmJiAoKGYgPSAhdiAmJiBmKSAmJiB5LS0gLCBvICYmIGIucHVzaChmKSkgfSBpZiAoeSArPSBtLCBuICYmIG0gIT09IHkpIHsgaCA9IDA7IHdoaWxlICh2ID0gdFtoKytdKSB2KGIsIHgsIGEsIHUpOyBpZiAobykgeyBpZiAoeSA+IDApIHdoaWxlIChtLS0pIGJbbV0gfHwgeFttXSB8fCAoeFttXSA9IEwuY2FsbChzKSk7IHggPSB3ZSh4KSB9IHEuYXBwbHkocywgeCksIGMgJiYgIW8gJiYgeC5sZW5ndGggPiAwICYmIHkgKyB0Lmxlbmd0aCA+IDEgJiYgb2UudW5pcXVlU29ydChzKSB9IHJldHVybiBjICYmIChDID0gRSwgbCA9IHcpLCBiIH07IHJldHVybiBuID8gdWUobykgOiBvIH0gcmV0dXJuIHUgPSBvZS5jb21waWxlID0gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIgPSBbXSwgaSA9IFtdLCBvID0ga1tlICsgIiAiXTsgaWYgKCFvKSB7IHQgfHwgKHQgPSBhKGUpKSwgbiA9IHQubGVuZ3RoOyB3aGlsZSAobi0tKSAobyA9IFRlKHRbbl0pKVt4XSA/IHIucHVzaChvKSA6IGkucHVzaChvKTsgKG8gPSBrKGUsIEVlKGksIHIpKSkuc2VsZWN0b3IgPSBlIH0gcmV0dXJuIG8gfSwgcyA9IG9lLnNlbGVjdCA9IGZ1bmN0aW9uIChlLCB0LCBuLCBpKSB7IHZhciBvLCBzLCBsLCBjLCBmLCBkID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgZSAmJiBlLCBwID0gIWkgJiYgYShlID0gZC5zZWxlY3RvciB8fCBlKTsgaWYgKG4gPSBuIHx8IFtdLCAxID09PSBwLmxlbmd0aCkgeyBpZiAoKHMgPSBwWzBdID0gcFswXS5zbGljZSgwKSkubGVuZ3RoID4gMiAmJiAiSUQiID09PSAobCA9IHNbMF0pLnR5cGUgJiYgOSA9PT0gdC5ub2RlVHlwZSAmJiBnICYmIHIucmVsYXRpdmVbc1sxXS50eXBlXSkgeyBpZiAoISh0ID0gKHIuZmluZC5JRChsLm1hdGNoZXNbMF0ucmVwbGFjZShaLCBlZSksIHQpIHx8IFtdKVswXSkpIHJldHVybiBuOyBkICYmICh0ID0gdC5wYXJlbnROb2RlKSwgZSA9IGUuc2xpY2Uocy5zaGlmdCgpLnZhbHVlLmxlbmd0aCkgfSBvID0gWC5uZWVkc0NvbnRleHQudGVzdChlKSA/IDAgOiBzLmxlbmd0aDsgd2hpbGUgKG8tLSkgeyBpZiAobCA9IHNbb10sIHIucmVsYXRpdmVbYyA9IGwudHlwZV0pIGJyZWFrOyBpZiAoKGYgPSByLmZpbmRbY10pICYmIChpID0gZihsLm1hdGNoZXNbMF0ucmVwbGFjZShaLCBlZSksIEoudGVzdChzWzBdLnR5cGUpICYmIGdlKHQucGFyZW50Tm9kZSkgfHwgdCkpKSB7IGlmIChzLnNwbGljZShvLCAxKSwgIShlID0gaS5sZW5ndGggJiYgeWUocykpKSByZXR1cm4gcS5hcHBseShuLCBpKSwgbjsgYnJlYWsgfSB9IH0gcmV0dXJuIChkIHx8IHUoZSwgcCkpKGksIHQsICFnLCBuLCAhdCB8fCBKLnRlc3QoZSkgJiYgZ2UodC5wYXJlbnROb2RlKSB8fCB0KSwgbiB9LCBuLnNvcnRTdGFibGUgPSB4LnNwbGl0KCIiKS5zb3J0KEEpLmpvaW4oIiIpID09PSB4LCBuLmRldGVjdER1cGxpY2F0ZXMgPSAhIWYsIGQoKSwgbi5zb3J0RGV0YWNoZWQgPSBzZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gMSAmIGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKSB9KSwgc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iLCAiIyIgPT09IGUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSB9KSB8fCBsZSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uIChlLCB0LCBuKSB7IGlmICghbikgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsICJ0eXBlIiA9PT0gdC50b0xvd2VyQ2FzZSgpID8gMSA6IDIpIH0pLCBuLmF0dHJpYnV0ZXMgJiYgc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaW5uZXJIVE1MID0gIjxpbnB1dC8+IiwgZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCAiIiksICIiID09PSBlLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpIH0pIHx8IGxlKCJ2YWx1ZSIsIGZ1bmN0aW9uIChlLCB0LCBuKSB7IGlmICghbiAmJiAiaW5wdXQiID09PSBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHJldHVybiBlLmRlZmF1bHRWYWx1ZSB9KSwgc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG51bGwgPT0gZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgfSkgfHwgbGUoSCwgZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHI7IGlmICghbikgcmV0dXJuICEwID09PSBlW3RdID8gdC50b0xvd2VyQ2FzZSgpIDogKHIgPSBlLmdldEF0dHJpYnV0ZU5vZGUodCkpICYmIHIuc3BlY2lmaWVkID8gci52YWx1ZSA6IG51bGwgfSksIG9lIH0oZSk7IHcuZmluZCA9IEUsIHcuZXhwciA9IEUuc2VsZWN0b3JzLCB3LmV4cHJbIjoiXSA9IHcuZXhwci5wc2V1ZG9zLCB3LnVuaXF1ZVNvcnQgPSB3LnVuaXF1ZSA9IEUudW5pcXVlU29ydCwgdy50ZXh0ID0gRS5nZXRUZXh0LCB3LmlzWE1MRG9jID0gRS5pc1hNTCwgdy5jb250YWlucyA9IEUuY29udGFpbnMsIHcuZXNjYXBlU2VsZWN0b3IgPSBFLmVzY2FwZTsgdmFyIE4gPSBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciA9IFtdLCBpID0gdm9pZCAwICE9PSBuOyB3aGlsZSAoKGUgPSBlW3RdKSAmJiA5ICE9PSBlLm5vZGVUeXBlKSBpZiAoMSA9PT0gZS5ub2RlVHlwZSkgeyBpZiAoaSAmJiB3KGUpLmlzKG4pKSBicmVhazsgci5wdXNoKGUpIH0gcmV0dXJuIHIgfSwgayA9IGZ1bmN0aW9uIChlLCB0KSB7IGZvciAodmFyIG4gPSBbXTsgZTsgZSA9IGUubmV4dFNpYmxpbmcpMSA9PT0gZS5ub2RlVHlwZSAmJiBlICE9PSB0ICYmIG4ucHVzaChlKTsgcmV0dXJuIG4gfSwgQSA9IHcuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7IGZ1bmN0aW9uIEQoZSwgdCkgeyByZXR1cm4gZS5ub2RlTmFtZSAmJiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHQudG9Mb3dlckNhc2UoKSB9IHZhciBTID0gL148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7IGZ1bmN0aW9uIEwoZSwgdCwgbikgeyByZXR1cm4gZyh0KSA/IHcuZ3JlcChlLCBmdW5jdGlvbiAoZSwgcikgeyByZXR1cm4gISF0LmNhbGwoZSwgciwgZSkgIT09IG4gfSkgOiB0Lm5vZGVUeXBlID8gdy5ncmVwKGUsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID09PSB0ICE9PSBuIH0pIDogInN0cmluZyIgIT0gdHlwZW9mIHQgPyB3LmdyZXAoZSwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHMuY2FsbCh0LCBlKSA+IC0xICE9PSBuIH0pIDogdy5maWx0ZXIodCwgZSwgbikgfSB3LmZpbHRlciA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHZhciByID0gdFswXTsgcmV0dXJuIG4gJiYgKGUgPSAiOm5vdCgiICsgZSArICIpIiksIDEgPT09IHQubGVuZ3RoICYmIDEgPT09IHIubm9kZVR5cGUgPyB3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsIGUpID8gW3JdIDogW10gOiB3LmZpbmQubWF0Y2hlcyhlLCB3LmdyZXAodCwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIDEgPT09IGUubm9kZVR5cGUgfSkpIH0sIHcuZm4uZXh0ZW5kKHsgZmluZDogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4sIHIgPSB0aGlzLmxlbmd0aCwgaSA9IHRoaXM7IGlmICgic3RyaW5nIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHRoaXMucHVzaFN0YWNrKHcoZSkuZmlsdGVyKGZ1bmN0aW9uICgpIHsgZm9yICh0ID0gMDsgdCA8IHI7IHQrKylpZiAody5jb250YWlucyhpW3RdLCB0aGlzKSkgcmV0dXJuICEwIH0pKTsgZm9yIChuID0gdGhpcy5wdXNoU3RhY2soW10pLCB0ID0gMDsgdCA8IHI7IHQrKyl3LmZpbmQoZSwgaVt0XSwgbik7IHJldHVybiByID4gMSA/IHcudW5pcXVlU29ydChuKSA6IG4gfSwgZmlsdGVyOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5wdXNoU3RhY2soTCh0aGlzLCBlIHx8IFtdLCAhMSkpIH0sIG5vdDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRoaXMucHVzaFN0YWNrKEwodGhpcywgZSB8fCBbXSwgITApKSB9LCBpczogZnVuY3Rpb24gKGUpIHsgcmV0dXJuICEhTCh0aGlzLCAic3RyaW5nIiA9PSB0eXBlb2YgZSAmJiBBLnRlc3QoZSkgPyB3KGUpIDogZSB8fCBbXSwgITEpLmxlbmd0aCB9IH0pOyB2YXIgaiwgcSA9IC9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87ICh3LmZuLmluaXQgPSBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgaSwgbzsgaWYgKCFlKSByZXR1cm4gdGhpczsgaWYgKG4gPSBuIHx8IGosICJzdHJpbmciID09IHR5cGVvZiBlKSB7IGlmICghKGkgPSAiPCIgPT09IGVbMF0gJiYgIj4iID09PSBlW2UubGVuZ3RoIC0gMV0gJiYgZS5sZW5ndGggPj0gMyA/IFtudWxsLCBlLCBudWxsXSA6IHEuZXhlYyhlKSkgfHwgIWlbMV0gJiYgdCkgcmV0dXJuICF0IHx8IHQuanF1ZXJ5ID8gKHQgfHwgbikuZmluZChlKSA6IHRoaXMuY29uc3RydWN0b3IodCkuZmluZChlKTsgaWYgKGlbMV0pIHsgaWYgKHQgPSB0IGluc3RhbmNlb2YgdyA/IHRbMF0gOiB0LCB3Lm1lcmdlKHRoaXMsIHcucGFyc2VIVE1MKGlbMV0sIHQgJiYgdC5ub2RlVHlwZSA/IHQub3duZXJEb2N1bWVudCB8fCB0IDogciwgITApKSwgUy50ZXN0KGlbMV0pICYmIHcuaXNQbGFpbk9iamVjdCh0KSkgZm9yIChpIGluIHQpIGcodGhpc1tpXSkgPyB0aGlzW2ldKHRbaV0pIDogdGhpcy5hdHRyKGksIHRbaV0pOyByZXR1cm4gdGhpcyB9IHJldHVybiAobyA9IHIuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpICYmICh0aGlzWzBdID0gbywgdGhpcy5sZW5ndGggPSAxKSwgdGhpcyB9IHJldHVybiBlLm5vZGVUeXBlID8gKHRoaXNbMF0gPSBlLCB0aGlzLmxlbmd0aCA9IDEsIHRoaXMpIDogZyhlKSA/IHZvaWQgMCAhPT0gbi5yZWFkeSA/IG4ucmVhZHkoZSkgOiBlKHcpIDogdy5tYWtlQXJyYXkoZSwgdGhpcykgfSkucHJvdG90eXBlID0gdy5mbiwgaiA9IHcocik7IHZhciBPID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sIFAgPSB7IGNoaWxkcmVuOiAhMCwgY29udGVudHM6ICEwLCBuZXh0OiAhMCwgcHJldjogITAgfTsgdy5mbi5leHRlbmQoeyBoYXM6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gdyhlLCB0aGlzKSwgbiA9IHQubGVuZ3RoOyByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKCkgeyBmb3IgKHZhciBlID0gMDsgZSA8IG47IGUrKylpZiAody5jb250YWlucyh0aGlzLCB0W2VdKSkgcmV0dXJuICEwIH0pIH0sIGNsb3Nlc3Q6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gMCwgaSA9IHRoaXMubGVuZ3RoLCBvID0gW10sIGEgPSAic3RyaW5nIiAhPSB0eXBlb2YgZSAmJiB3KGUpOyBpZiAoIUEudGVzdChlKSkgZm9yICg7IHIgPCBpOyByKyspZm9yIChuID0gdGhpc1tyXTsgbiAmJiBuICE9PSB0OyBuID0gbi5wYXJlbnROb2RlKWlmIChuLm5vZGVUeXBlIDwgMTEgJiYgKGEgPyBhLmluZGV4KG4pID4gLTEgOiAxID09PSBuLm5vZGVUeXBlICYmIHcuZmluZC5tYXRjaGVzU2VsZWN0b3IobiwgZSkpKSB7IG8ucHVzaChuKTsgYnJlYWsgfSByZXR1cm4gdGhpcy5wdXNoU3RhY2soby5sZW5ndGggPiAxID8gdy51bmlxdWVTb3J0KG8pIDogbykgfSwgaW5kZXg6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID8gInN0cmluZyIgPT0gdHlwZW9mIGUgPyBzLmNhbGwodyhlKSwgdGhpc1swXSkgOiBzLmNhbGwodGhpcywgZS5qcXVlcnkgPyBlWzBdIDogZSkgOiB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTEgfSwgYWRkOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gdGhpcy5wdXNoU3RhY2sody51bmlxdWVTb3J0KHcubWVyZ2UodGhpcy5nZXQoKSwgdyhlLCB0KSkpKSB9LCBhZGRCYWNrOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5hZGQobnVsbCA9PSBlID8gdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSkgfSB9KTsgZnVuY3Rpb24gSChlLCB0KSB7IHdoaWxlICgoZSA9IGVbdF0pICYmIDEgIT09IGUubm9kZVR5cGUpOyByZXR1cm4gZSB9IHcuZWFjaCh7IHBhcmVudDogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBlLnBhcmVudE5vZGU7IHJldHVybiB0ICYmIDExICE9PSB0Lm5vZGVUeXBlID8gdCA6IG51bGwgfSwgcGFyZW50czogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIE4oZSwgInBhcmVudE5vZGUiKSB9LCBwYXJlbnRzVW50aWw6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBOKGUsICJwYXJlbnROb2RlIiwgbikgfSwgbmV4dDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEgoZSwgIm5leHRTaWJsaW5nIikgfSwgcHJldjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEgoZSwgInByZXZpb3VzU2libGluZyIpIH0sIG5leHRBbGw6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBOKGUsICJuZXh0U2libGluZyIpIH0sIHByZXZBbGw6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBOKGUsICJwcmV2aW91c1NpYmxpbmciKSB9LCBuZXh0VW50aWw6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBOKGUsICJuZXh0U2libGluZyIsIG4pIH0sIHByZXZVbnRpbDogZnVuY3Rpb24gKGUsIHQsIG4pIHsgcmV0dXJuIE4oZSwgInByZXZpb3VzU2libGluZyIsIG4pIH0sIHNpYmxpbmdzOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gaygoZS5wYXJlbnROb2RlIHx8IHt9KS5maXJzdENoaWxkLCBlKSB9LCBjaGlsZHJlbjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGsoZS5maXJzdENoaWxkKSB9LCBjb250ZW50czogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEQoZSwgImlmcmFtZSIpID8gZS5jb250ZW50RG9jdW1lbnQgOiAoRChlLCAidGVtcGxhdGUiKSAmJiAoZSA9IGUuY29udGVudCB8fCBlKSwgdy5tZXJnZShbXSwgZS5jaGlsZE5vZGVzKSkgfSB9LCBmdW5jdGlvbiAoZSwgdCkgeyB3LmZuW2VdID0gZnVuY3Rpb24gKG4sIHIpIHsgdmFyIGkgPSB3Lm1hcCh0aGlzLCB0LCBuKTsgcmV0dXJuICJVbnRpbCIgIT09IGUuc2xpY2UoLTUpICYmIChyID0gbiksIHIgJiYgInN0cmluZyIgPT0gdHlwZW9mIHIgJiYgKGkgPSB3LmZpbHRlcihyLCBpKSksIHRoaXMubGVuZ3RoID4gMSAmJiAoUFtlXSB8fCB3LnVuaXF1ZVNvcnQoaSksIE8udGVzdChlKSAmJiBpLnJldmVyc2UoKSksIHRoaXMucHVzaFN0YWNrKGkpIH0gfSk7IHZhciBJID0gL1teXHgyMFx0XHJcblxmXSsvZzsgZnVuY3Rpb24gUihlKSB7IHZhciB0ID0ge307IHJldHVybiB3LmVhY2goZS5tYXRjaChJKSB8fCBbXSwgZnVuY3Rpb24gKGUsIG4pIHsgdFtuXSA9ICEwIH0pLCB0IH0gdy5DYWxsYmFja3MgPSBmdW5jdGlvbiAoZSkgeyBlID0gInN0cmluZyIgPT0gdHlwZW9mIGUgPyBSKGUpIDogdy5leHRlbmQoe30sIGUpOyB2YXIgdCwgbiwgciwgaSwgbyA9IFtdLCBhID0gW10sIHUgPSAtMSwgcyA9IGZ1bmN0aW9uICgpIHsgZm9yIChpID0gaSB8fCBlLm9uY2UsIHIgPSB0ID0gITA7IGEubGVuZ3RoOyB1ID0gLTEpIHsgbiA9IGEuc2hpZnQoKTsgd2hpbGUgKCsrdSA8IG8ubGVuZ3RoKSAhMSA9PT0gb1t1XS5hcHBseShuWzBdLCBuWzFdKSAmJiBlLnN0b3BPbkZhbHNlICYmICh1ID0gby5sZW5ndGgsIG4gPSAhMSkgfSBlLm1lbW9yeSB8fCAobiA9ICExKSwgdCA9ICExLCBpICYmIChvID0gbiA/IFtdIDogIiIpIH0sIGwgPSB7IGFkZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbyAmJiAobiAmJiAhdCAmJiAodSA9IG8ubGVuZ3RoIC0gMSwgYS5wdXNoKG4pKSwgZnVuY3Rpb24gdChuKSB7IHcuZWFjaChuLCBmdW5jdGlvbiAobiwgcikgeyBnKHIpID8gZS51bmlxdWUgJiYgbC5oYXMocikgfHwgby5wdXNoKHIpIDogciAmJiByLmxlbmd0aCAmJiAic3RyaW5nIiAhPT0gYihyKSAmJiB0KHIpIH0pIH0oYXJndW1lbnRzKSwgbiAmJiAhdCAmJiBzKCkpLCB0aGlzIH0sIHJlbW92ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdy5lYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG47IHdoaWxlICgobiA9IHcuaW5BcnJheSh0LCBvLCBuKSkgPiAtMSkgby5zcGxpY2UobiwgMSksIG4gPD0gdSAmJiB1LS0gfSksIHRoaXMgfSwgaGFzOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSA/IHcuaW5BcnJheShlLCBvKSA+IC0xIDogby5sZW5ndGggPiAwIH0sIGVtcHR5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBvICYmIChvID0gW10pLCB0aGlzIH0sIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGkgPSBhID0gW10sIG8gPSBuID0gIiIsIHRoaXMgfSwgZGlzYWJsZWQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICFvIH0sIGxvY2s6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGkgPSBhID0gW10sIG4gfHwgdCB8fCAobyA9IG4gPSAiIiksIHRoaXMgfSwgbG9ja2VkOiBmdW5jdGlvbiAoKSB7IHJldHVybiAhIWkgfSwgZmlyZVdpdGg6IGZ1bmN0aW9uIChlLCBuKSB7IHJldHVybiBpIHx8IChuID0gW2UsIChuID0gbiB8fCBbXSkuc2xpY2UgPyBuLnNsaWNlKCkgOiBuXSwgYS5wdXNoKG4pLCB0IHx8IHMoKSksIHRoaXMgfSwgZmlyZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbC5maXJlV2l0aCh0aGlzLCBhcmd1bWVudHMpLCB0aGlzIH0sIGZpcmVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiAhIXIgfSB9OyByZXR1cm4gbCB9OyBmdW5jdGlvbiBCKGUpIHsgcmV0dXJuIGUgfSBmdW5jdGlvbiBNKGUpIHsgdGhyb3cgZSB9IGZ1bmN0aW9uIFcoZSwgdCwgbiwgcikgeyB2YXIgaTsgdHJ5IHsgZSAmJiBnKGkgPSBlLnByb21pc2UpID8gaS5jYWxsKGUpLmRvbmUodCkuZmFpbChuKSA6IGUgJiYgZyhpID0gZS50aGVuKSA/IGkuY2FsbChlLCB0LCBuKSA6IHQuYXBwbHkodm9pZCAwLCBbZV0uc2xpY2UocikpIH0gY2F0Y2ggKGUpIHsgbi5hcHBseSh2b2lkIDAsIFtlXSkgfSB9IHcuZXh0ZW5kKHsgRGVmZXJyZWQ6IGZ1bmN0aW9uICh0KSB7IHZhciBuID0gW1sibm90aWZ5IiwgInByb2dyZXNzIiwgdy5DYWxsYmFja3MoIm1lbW9yeSIpLCB3LkNhbGxiYWNrcygibWVtb3J5IiksIDJdLCBbInJlc29sdmUiLCAiZG9uZSIsIHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCB3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwgMCwgInJlc29sdmVkIl0sIFsicmVqZWN0IiwgImZhaWwiLCB3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwgdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksIDEsICJyZWplY3RlZCJdXSwgciA9ICJwZW5kaW5nIiwgaSA9IHsgc3RhdGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHIgfSwgYWx3YXlzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksIHRoaXMgfSwgImNhdGNoIjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGkudGhlbihudWxsLCBlKSB9LCBwaXBlOiBmdW5jdGlvbiAoKSB7IHZhciBlID0gYXJndW1lbnRzOyByZXR1cm4gdy5EZWZlcnJlZChmdW5jdGlvbiAodCkgeyB3LmVhY2gobiwgZnVuY3Rpb24gKG4sIHIpIHsgdmFyIGkgPSBnKGVbcls0XV0pICYmIGVbcls0XV07IG9bclsxXV0oZnVuY3Rpb24gKCkgeyB2YXIgZSA9IGkgJiYgaS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyBlICYmIGcoZS5wcm9taXNlKSA/IGUucHJvbWlzZSgpLnByb2dyZXNzKHQubm90aWZ5KS5kb25lKHQucmVzb2x2ZSkuZmFpbCh0LnJlamVjdCkgOiB0W3JbMF0gKyAiV2l0aCJdKHRoaXMsIGkgPyBbZV0gOiBhcmd1bWVudHMpIH0pIH0pLCBlID0gbnVsbCB9KS5wcm9taXNlKCkgfSwgdGhlbjogZnVuY3Rpb24gKHQsIHIsIGkpIHsgdmFyIG8gPSAwOyBmdW5jdGlvbiBhKHQsIG4sIHIsIGkpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHUgPSB0aGlzLCBzID0gYXJndW1lbnRzLCBsID0gZnVuY3Rpb24gKCkgeyB2YXIgZSwgbDsgaWYgKCEodCA8IG8pKSB7IGlmICgoZSA9IHIuYXBwbHkodSwgcykpID09PSBuLnByb21pc2UoKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7IGwgPSBlICYmICgib2JqZWN0IiA9PSB0eXBlb2YgZSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiBlKSAmJiBlLnRoZW4sIGcobCkgPyBpID8gbC5jYWxsKGUsIGEobywgbiwgQiwgaSksIGEobywgbiwgTSwgaSkpIDogKG8rKyAsIGwuY2FsbChlLCBhKG8sIG4sIEIsIGkpLCBhKG8sIG4sIE0sIGkpLCBhKG8sIG4sIEIsIG4ubm90aWZ5V2l0aCkpKSA6IChyICE9PSBCICYmICh1ID0gdm9pZCAwLCBzID0gW2VdKSwgKGkgfHwgbi5yZXNvbHZlV2l0aCkodSwgcykpIH0gfSwgYyA9IGkgPyBsIDogZnVuY3Rpb24gKCkgeyB0cnkgeyBsKCkgfSBjYXRjaCAoZSkgeyB3LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgJiYgdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsIGMuc3RhY2tUcmFjZSksIHQgKyAxID49IG8gJiYgKHIgIT09IE0gJiYgKHUgPSB2b2lkIDAsIHMgPSBbZV0pLCBuLnJlamVjdFdpdGgodSwgcykpIH0gfTsgdCA/IGMoKSA6ICh3LkRlZmVycmVkLmdldFN0YWNrSG9vayAmJiAoYy5zdGFja1RyYWNlID0gdy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksIGUuc2V0VGltZW91dChjKSkgfSB9IHJldHVybiB3LkRlZmVycmVkKGZ1bmN0aW9uIChlKSB7IG5bMF1bM10uYWRkKGEoMCwgZSwgZyhpKSA/IGkgOiBCLCBlLm5vdGlmeVdpdGgpKSwgblsxXVszXS5hZGQoYSgwLCBlLCBnKHQpID8gdCA6IEIpKSwgblsyXVszXS5hZGQoYSgwLCBlLCBnKHIpID8gciA6IE0pKSB9KS5wcm9taXNlKCkgfSwgcHJvbWlzZTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG51bGwgIT0gZSA/IHcuZXh0ZW5kKGUsIGkpIDogaSB9IH0sIG8gPSB7fTsgcmV0dXJuIHcuZWFjaChuLCBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgYSA9IHRbMl0sIHUgPSB0WzVdOyBpW3RbMV1dID0gYS5hZGQsIHUgJiYgYS5hZGQoZnVuY3Rpb24gKCkgeyByID0gdSB9LCBuWzMgLSBlXVsyXS5kaXNhYmxlLCBuWzMgLSBlXVszXS5kaXNhYmxlLCBuWzBdWzJdLmxvY2ssIG5bMF1bM10ubG9jayksIGEuYWRkKHRbM10uZmlyZSksIG9bdFswXV0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvW3RbMF0gKyAiV2l0aCJdKHRoaXMgPT09IG8gPyB2b2lkIDAgOiB0aGlzLCBhcmd1bWVudHMpLCB0aGlzIH0sIG9bdFswXSArICJXaXRoIl0gPSBhLmZpcmVXaXRoIH0pLCBpLnByb21pc2UobyksIHQgJiYgdC5jYWxsKG8sIG8pLCBvIH0sIHdoZW46IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IHQsIHIgPSBBcnJheShuKSwgaSA9IG8uY2FsbChhcmd1bWVudHMpLCBhID0gdy5EZWZlcnJlZCgpLCB1ID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGZ1bmN0aW9uIChuKSB7IHJbZV0gPSB0aGlzLCBpW2VdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBvLmNhbGwoYXJndW1lbnRzKSA6IG4sIC0tdCB8fCBhLnJlc29sdmVXaXRoKHIsIGkpIH0gfTsgaWYgKHQgPD0gMSAmJiAoVyhlLCBhLmRvbmUodShuKSkucmVzb2x2ZSwgYS5yZWplY3QsICF0KSwgInBlbmRpbmciID09PSBhLnN0YXRlKCkgfHwgZyhpW25dICYmIGlbbl0udGhlbikpKSByZXR1cm4gYS50aGVuKCk7IHdoaWxlIChuLS0pIFcoaVtuXSwgdShuKSwgYS5yZWplY3QpOyByZXR1cm4gYS5wcm9taXNlKCkgfSB9KTsgdmFyICQgPSAvXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLzsgdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24gKHQsIG4pIHsgZS5jb25zb2xlICYmIGUuY29uc29sZS53YXJuICYmIHQgJiYgJC50ZXN0KHQubmFtZSkgJiYgZS5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyB0Lm1lc3NhZ2UsIHQuc3RhY2ssIG4pIH0sIHcucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiAodCkgeyBlLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aHJvdyB0IH0pIH07IHZhciBGID0gdy5EZWZlcnJlZCgpOyB3LmZuLnJlYWR5ID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbiAoZSkgeyB3LnJlYWR5RXhjZXB0aW9uKGUpIH0pLCB0aGlzIH0sIHcuZXh0ZW5kKHsgaXNSZWFkeTogITEsIHJlYWR5V2FpdDogMSwgcmVhZHk6IGZ1bmN0aW9uIChlKSB7ICghMCA9PT0gZSA/IC0tdy5yZWFkeVdhaXQgOiB3LmlzUmVhZHkpIHx8ICh3LmlzUmVhZHkgPSAhMCwgITAgIT09IGUgJiYgLS13LnJlYWR5V2FpdCA+IDAgfHwgRi5yZXNvbHZlV2l0aChyLCBbd10pKSB9IH0pLCB3LnJlYWR5LnRoZW4gPSBGLnRoZW47IGZ1bmN0aW9uIHooKSB7IHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIHopLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLCB6KSwgdy5yZWFkeSgpIH0gImNvbXBsZXRlIiA9PT0gci5yZWFkeVN0YXRlIHx8ICJsb2FkaW5nIiAhPT0gci5yZWFkeVN0YXRlICYmICFyLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCA/IGUuc2V0VGltZW91dCh3LnJlYWR5KSA6IChyLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCB6KSwgZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgeikpOyB2YXIgXyA9IGZ1bmN0aW9uIChlLCB0LCBuLCByLCBpLCBvLCBhKSB7IHZhciB1ID0gMCwgcyA9IGUubGVuZ3RoLCBsID0gbnVsbCA9PSBuOyBpZiAoIm9iamVjdCIgPT09IGIobikpIHsgaSA9ICEwOyBmb3IgKHUgaW4gbikgXyhlLCB0LCB1LCBuW3VdLCAhMCwgbywgYSkgfSBlbHNlIGlmICh2b2lkIDAgIT09IHIgJiYgKGkgPSAhMCwgZyhyKSB8fCAoYSA9ICEwKSwgbCAmJiAoYSA/ICh0LmNhbGwoZSwgciksIHQgPSBudWxsKSA6IChsID0gdCwgdCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBsLmNhbGwodyhlKSwgbikgfSkpLCB0KSkgZm9yICg7IHUgPCBzOyB1KyspdChlW3VdLCBuLCBhID8gciA6IHIuY2FsbChlW3VdLCB1LCB0KGVbdV0sIG4pKSk7IHJldHVybiBpID8gZSA6IGwgPyB0LmNhbGwoZSkgOiBzID8gdChlWzBdLCBuKSA6IG8gfSwgVSA9IC9eLW1zLS8sIFYgPSAvLShbYS16XSkvZzsgZnVuY3Rpb24gWChlLCB0KSB7IHJldHVybiB0LnRvVXBwZXJDYXNlKCkgfSBmdW5jdGlvbiBRKGUpIHsgcmV0dXJuIGUucmVwbGFjZShVLCAibXMtIikucmVwbGFjZShWLCBYKSB9IHZhciBZID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIDEgPT09IGUubm9kZVR5cGUgfHwgOSA9PT0gZS5ub2RlVHlwZSB8fCAhK2Uubm9kZVR5cGUgfTsgZnVuY3Rpb24gRygpIHsgdGhpcy5leHBhbmRvID0gdy5leHBhbmRvICsgRy51aWQrKyB9IEcudWlkID0gMSwgRy5wcm90b3R5cGUgPSB7IGNhY2hlOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGVbdGhpcy5leHBhbmRvXTsgcmV0dXJuIHQgfHwgKHQgPSB7fSwgWShlKSAmJiAoZS5ub2RlVHlwZSA/IGVbdGhpcy5leHBhbmRvXSA9IHQgOiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdGhpcy5leHBhbmRvLCB7IHZhbHVlOiB0LCBjb25maWd1cmFibGU6ICEwIH0pKSksIHQgfSwgc2V0OiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaSA9IHRoaXMuY2FjaGUoZSk7IGlmICgic3RyaW5nIiA9PSB0eXBlb2YgdCkgaVtRKHQpXSA9IG47IGVsc2UgZm9yIChyIGluIHQpIGlbUShyKV0gPSB0W3JdOyByZXR1cm4gaSB9LCBnZXQ6IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiB2b2lkIDAgPT09IHQgPyB0aGlzLmNhY2hlKGUpIDogZVt0aGlzLmV4cGFuZG9dICYmIGVbdGhpcy5leHBhbmRvXVtRKHQpXSB9LCBhY2Nlc3M6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiB2b2lkIDAgPT09IHQgfHwgdCAmJiAic3RyaW5nIiA9PSB0eXBlb2YgdCAmJiB2b2lkIDAgPT09IG4gPyB0aGlzLmdldChlLCB0KSA6ICh0aGlzLnNldChlLCB0LCBuKSwgdm9pZCAwICE9PSBuID8gbiA6IHQpIH0sIHJlbW92ZTogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIgPSBlW3RoaXMuZXhwYW5kb107IGlmICh2b2lkIDAgIT09IHIpIHsgaWYgKHZvaWQgMCAhPT0gdCkgeyBuID0gKHQgPSBBcnJheS5pc0FycmF5KHQpID8gdC5tYXAoUSkgOiAodCA9IFEodCkpIGluIHIgPyBbdF0gOiB0Lm1hdGNoKEkpIHx8IFtdKS5sZW5ndGg7IHdoaWxlIChuLS0pIGRlbGV0ZSByW3Rbbl1dIH0gKHZvaWQgMCA9PT0gdCB8fCB3LmlzRW1wdHlPYmplY3QocikpICYmIChlLm5vZGVUeXBlID8gZVt0aGlzLmV4cGFuZG9dID0gdm9pZCAwIDogZGVsZXRlIGVbdGhpcy5leHBhbmRvXSkgfSB9LCBoYXNEYXRhOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGVbdGhpcy5leHBhbmRvXTsgcmV0dXJuIHZvaWQgMCAhPT0gdCAmJiAhdy5pc0VtcHR5T2JqZWN0KHQpIH0gfTsgdmFyIEsgPSBuZXcgRywgSiA9IG5ldyBHLCBaID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywgZWUgPSAvW0EtWl0vZzsgZnVuY3Rpb24gdGUoZSkgeyByZXR1cm4gInRydWUiID09PSBlIHx8ICJmYWxzZSIgIT09IGUgJiYgKCJudWxsIiA9PT0gZSA/IG51bGwgOiBlID09PSArZSArICIiID8gK2UgOiBaLnRlc3QoZSkgPyBKU09OLnBhcnNlKGUpIDogZSkgfSBmdW5jdGlvbiBuZShlLCB0LCBuKSB7IHZhciByOyBpZiAodm9pZCAwID09PSBuICYmIDEgPT09IGUubm9kZVR5cGUpIGlmIChyID0gImRhdGEtIiArIHQucmVwbGFjZShlZSwgIi0kJiIpLnRvTG93ZXJDYXNlKCksICJzdHJpbmciID09IHR5cGVvZiAobiA9IGUuZ2V0QXR0cmlidXRlKHIpKSkgeyB0cnkgeyBuID0gdGUobikgfSBjYXRjaCAoZSkgeyB9IEouc2V0KGUsIHQsIG4pIH0gZWxzZSBuID0gdm9pZCAwOyByZXR1cm4gbiB9IHcuZXh0ZW5kKHsgaGFzRGF0YTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEouaGFzRGF0YShlKSB8fCBLLmhhc0RhdGEoZSkgfSwgZGF0YTogZnVuY3Rpb24gKGUsIHQsIG4pIHsgcmV0dXJuIEouYWNjZXNzKGUsIHQsIG4pIH0sIHJlbW92ZURhdGE6IGZ1bmN0aW9uIChlLCB0KSB7IEoucmVtb3ZlKGUsIHQpIH0sIF9kYXRhOiBmdW5jdGlvbiAoZSwgdCwgbikgeyByZXR1cm4gSy5hY2Nlc3MoZSwgdCwgbikgfSwgX3JlbW92ZURhdGE6IGZ1bmN0aW9uIChlLCB0KSB7IEsucmVtb3ZlKGUsIHQpIH0gfSksIHcuZm4uZXh0ZW5kKHsgZGF0YTogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIsIGksIG8gPSB0aGlzWzBdLCBhID0gbyAmJiBvLmF0dHJpYnV0ZXM7IGlmICh2b2lkIDAgPT09IGUpIHsgaWYgKHRoaXMubGVuZ3RoICYmIChpID0gSi5nZXQobyksIDEgPT09IG8ubm9kZVR5cGUgJiYgIUsuZ2V0KG8sICJoYXNEYXRhQXR0cnMiKSkpIHsgbiA9IGEubGVuZ3RoOyB3aGlsZSAobi0tKSBhW25dICYmIDAgPT09IChyID0gYVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpICYmIChyID0gUShyLnNsaWNlKDUpKSwgbmUobywgciwgaVtyXSkpOyBLLnNldChvLCAiaGFzRGF0YUF0dHJzIiwgITApIH0gcmV0dXJuIGkgfSByZXR1cm4gIm9iamVjdCIgPT0gdHlwZW9mIGUgPyB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeyBKLnNldCh0aGlzLCBlKSB9KSA6IF8odGhpcywgZnVuY3Rpb24gKHQpIHsgdmFyIG47IGlmIChvICYmIHZvaWQgMCA9PT0gdCkgeyBpZiAodm9pZCAwICE9PSAobiA9IEouZ2V0KG8sIGUpKSkgcmV0dXJuIG47IGlmICh2b2lkIDAgIT09IChuID0gbmUobywgZSkpKSByZXR1cm4gbiB9IGVsc2UgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgSi5zZXQodGhpcywgZSwgdCkgfSkgfSwgbnVsbCwgdCwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsICEwKSB9LCByZW1vdmVEYXRhOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgSi5yZW1vdmUodGhpcywgZSkgfSkgfSB9KSwgdy5leHRlbmQoeyBxdWV1ZTogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHI7IGlmIChlKSByZXR1cm4gdCA9ICh0IHx8ICJmeCIpICsgInF1ZXVlIiwgciA9IEsuZ2V0KGUsIHQpLCBuICYmICghciB8fCBBcnJheS5pc0FycmF5KG4pID8gciA9IEsuYWNjZXNzKGUsIHQsIHcubWFrZUFycmF5KG4pKSA6IHIucHVzaChuKSksIHIgfHwgW10gfSwgZGVxdWV1ZTogZnVuY3Rpb24gKGUsIHQpIHsgdCA9IHQgfHwgImZ4IjsgdmFyIG4gPSB3LnF1ZXVlKGUsIHQpLCByID0gbi5sZW5ndGgsIGkgPSBuLnNoaWZ0KCksIG8gPSB3Ll9xdWV1ZUhvb2tzKGUsIHQpLCBhID0gZnVuY3Rpb24gKCkgeyB3LmRlcXVldWUoZSwgdCkgfTsgImlucHJvZ3Jlc3MiID09PSBpICYmIChpID0gbi5zaGlmdCgpLCByLS0pLCBpICYmICgiZngiID09PSB0ICYmIG4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLCBkZWxldGUgby5zdG9wLCBpLmNhbGwoZSwgYSwgbykpLCAhciAmJiBvICYmIG8uZW1wdHkuZmlyZSgpIH0sIF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IHQgKyAicXVldWVIb29rcyI7IHJldHVybiBLLmdldChlLCBuKSB8fCBLLmFjY2VzcyhlLCBuLCB7IGVtcHR5OiB3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24gKCkgeyBLLnJlbW92ZShlLCBbdCArICJxdWV1ZSIsIG5dKSB9KSB9KSB9IH0pLCB3LmZuLmV4dGVuZCh7IHF1ZXVlOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IDI7IHJldHVybiAic3RyaW5nIiAhPSB0eXBlb2YgZSAmJiAodCA9IGUsIGUgPSAiZngiLCBuLS0pLCBhcmd1bWVudHMubGVuZ3RoIDwgbiA/IHcucXVldWUodGhpc1swXSwgZSkgOiB2b2lkIDAgPT09IHQgPyB0aGlzIDogdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgdmFyIG4gPSB3LnF1ZXVlKHRoaXMsIGUsIHQpOyB3Ll9xdWV1ZUhvb2tzKHRoaXMsIGUpLCAiZngiID09PSBlICYmICJpbnByb2dyZXNzIiAhPT0gblswXSAmJiB3LmRlcXVldWUodGhpcywgZSkgfSkgfSwgZGVxdWV1ZTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7IHcuZGVxdWV1ZSh0aGlzLCBlKSB9KSB9LCBjbGVhclF1ZXVlOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5xdWV1ZShlIHx8ICJmeCIsIFtdKSB9LCBwcm9taXNlOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiwgciA9IDEsIGkgPSB3LkRlZmVycmVkKCksIG8gPSB0aGlzLCBhID0gdGhpcy5sZW5ndGgsIHUgPSBmdW5jdGlvbiAoKSB7IC0tciB8fCBpLnJlc29sdmVXaXRoKG8sIFtvXSkgfTsgInN0cmluZyIgIT0gdHlwZW9mIGUgJiYgKHQgPSBlLCBlID0gdm9pZCAwKSwgZSA9IGUgfHwgImZ4Ijsgd2hpbGUgKGEtLSkgKG4gPSBLLmdldChvW2FdLCBlICsgInF1ZXVlSG9va3MiKSkgJiYgbi5lbXB0eSAmJiAocisrICwgbi5lbXB0eS5hZGQodSkpOyByZXR1cm4gdSgpLCBpLnByb21pc2UodCkgfSB9KTsgdmFyIHJlID0gL1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsIGllID0gbmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiICsgcmUgKyAiKShbYS16JV0qKSQiLCAiaSIpLCBvZSA9IFsiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0Il0sIGFlID0gZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuICJub25lIiA9PT0gKGUgPSB0IHx8IGUpLnN0eWxlLmRpc3BsYXkgfHwgIiIgPT09IGUuc3R5bGUuZGlzcGxheSAmJiB3LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCwgZSkgJiYgIm5vbmUiID09PSB3LmNzcyhlLCAiZGlzcGxheSIpIH0sIHVlID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsgdmFyIGksIG8sIGEgPSB7fTsgZm9yIChvIGluIHQpIGFbb10gPSBlLnN0eWxlW29dLCBlLnN0eWxlW29dID0gdFtvXTsgaSA9IG4uYXBwbHkoZSwgciB8fCBbXSk7IGZvciAobyBpbiB0KSBlLnN0eWxlW29dID0gYVtvXTsgcmV0dXJuIGkgfTsgZnVuY3Rpb24gc2UoZSwgdCwgbiwgcikgeyB2YXIgaSwgbywgYSA9IDIwLCB1ID0gciA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHIuY3VyKCkgfSA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHcuY3NzKGUsIHQsICIiKSB9LCBzID0gdSgpLCBsID0gbiAmJiBuWzNdIHx8ICh3LmNzc051bWJlclt0XSA/ICIiIDogInB4IiksIGMgPSAody5jc3NOdW1iZXJbdF0gfHwgInB4IiAhPT0gbCAmJiArcykgJiYgaWUuZXhlYyh3LmNzcyhlLCB0KSk7IGlmIChjICYmIGNbM10gIT09IGwpIHsgcyAvPSAyLCBsID0gbCB8fCBjWzNdLCBjID0gK3MgfHwgMTsgd2hpbGUgKGEtLSkgdy5zdHlsZShlLCB0LCBjICsgbCksICgxIC0gbykgKiAoMSAtIChvID0gdSgpIC8gcyB8fCAuNSkpIDw9IDAgJiYgKGEgPSAwKSwgYyAvPSBvOyBjICo9IDIsIHcuc3R5bGUoZSwgdCwgYyArIGwpLCBuID0gbiB8fCBbXSB9IHJldHVybiBuICYmIChjID0gK2MgfHwgK3MgfHwgMCwgaSA9IG5bMV0gPyBjICsgKG5bMV0gKyAxKSAqIG5bMl0gOiArblsyXSwgciAmJiAoci51bml0ID0gbCwgci5zdGFydCA9IGMsIHIuZW5kID0gaSkpLCBpIH0gdmFyIGxlID0ge307IGZ1bmN0aW9uIGNlKGUpIHsgdmFyIHQsIG4gPSBlLm93bmVyRG9jdW1lbnQsIHIgPSBlLm5vZGVOYW1lLCBpID0gbGVbcl07IHJldHVybiBpIHx8ICh0ID0gbi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksIGkgPSB3LmNzcyh0LCAiZGlzcGxheSIpLCB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksICJub25lIiA9PT0gaSAmJiAoaSA9ICJibG9jayIpLCBsZVtyXSA9IGksIGkpIH0gZnVuY3Rpb24gZmUoZSwgdCkgeyBmb3IgKHZhciBuLCByLCBpID0gW10sIG8gPSAwLCBhID0gZS5sZW5ndGg7IG8gPCBhOyBvKyspKHIgPSBlW29dKS5zdHlsZSAmJiAobiA9IHIuc3R5bGUuZGlzcGxheSwgdCA/ICgibm9uZSIgPT09IG4gJiYgKGlbb10gPSBLLmdldChyLCAiZGlzcGxheSIpIHx8IG51bGwsIGlbb10gfHwgKHIuc3R5bGUuZGlzcGxheSA9ICIiKSksICIiID09PSByLnN0eWxlLmRpc3BsYXkgJiYgYWUocikgJiYgKGlbb10gPSBjZShyKSkpIDogIm5vbmUiICE9PSBuICYmIChpW29dID0gIm5vbmUiLCBLLnNldChyLCAiZGlzcGxheSIsIG4pKSk7IGZvciAobyA9IDA7IG8gPCBhOyBvKyspbnVsbCAhPSBpW29dICYmIChlW29dLnN0eWxlLmRpc3BsYXkgPSBpW29dKTsgcmV0dXJuIGUgfSB3LmZuLmV4dGVuZCh7IHNob3c6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZlKHRoaXMsICEwKSB9LCBoaWRlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmZSh0aGlzKSB9LCB0b2dnbGU6IGZ1bmN0aW9uIChlKSB7IHJldHVybiAiYm9vbGVhbiIgPT0gdHlwZW9mIGUgPyBlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKSA6IHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7IGFlKHRoaXMpID8gdyh0aGlzKS5zaG93KCkgOiB3KHRoaXMpLmhpZGUoKSB9KSB9IH0pOyB2YXIgZGUgPSAvXig/OmNoZWNrYm94fHJhZGlvKSQvaSwgcGUgPSAvPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKykvaSwgaGUgPSAvXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksIGdlID0geyBvcHRpb246IFsxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iXSwgdGhlYWQ6IFsxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiJdLCBjb2w6IFsyLCAiPHRhYmxlPjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiJdLCB0cjogWzIsICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+Il0sIHRkOiBbMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSwgX2RlZmF1bHQ6IFswLCAiIiwgIiJdIH07IGdlLm9wdGdyb3VwID0gZ2Uub3B0aW9uLCBnZS50Ym9keSA9IGdlLnRmb290ID0gZ2UuY29sZ3JvdXAgPSBnZS5jYXB0aW9uID0gZ2UudGhlYWQsIGdlLnRoID0gZ2UudGQ7IGZ1bmN0aW9uIHZlKGUsIHQpIHsgdmFyIG47IHJldHVybiBuID0gInVuZGVmaW5lZCIgIT0gdHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQgfHwgIioiKSA6ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGwgPyBlLnF1ZXJ5U2VsZWN0b3JBbGwodCB8fCAiKiIpIDogW10sIHZvaWQgMCA9PT0gdCB8fCB0ICYmIEQoZSwgdCkgPyB3Lm1lcmdlKFtlXSwgbikgOiBuIH0gZnVuY3Rpb24geWUoZSwgdCkgeyBmb3IgKHZhciBuID0gMCwgciA9IGUubGVuZ3RoOyBuIDwgcjsgbisrKUsuc2V0KGVbbl0sICJnbG9iYWxFdmFsIiwgIXQgfHwgSy5nZXQodFtuXSwgImdsb2JhbEV2YWwiKSkgfSB2YXIgbWUgPSAvPHwmIz9cdys7LzsgZnVuY3Rpb24gYmUoZSwgdCwgbiwgciwgaSkgeyBmb3IgKHZhciBvLCBhLCB1LCBzLCBsLCBjLCBmID0gdC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksIGQgPSBbXSwgcCA9IDAsIGggPSBlLmxlbmd0aDsgcCA8IGg7IHArKylpZiAoKG8gPSBlW3BdKSB8fCAwID09PSBvKSBpZiAoIm9iamVjdCIgPT09IGIobykpIHcubWVyZ2UoZCwgby5ub2RlVHlwZSA/IFtvXSA6IG8pOyBlbHNlIGlmIChtZS50ZXN0KG8pKSB7IGEgPSBhIHx8IGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSksIHUgPSAocGUuZXhlYyhvKSB8fCBbIiIsICIiXSlbMV0udG9Mb3dlckNhc2UoKSwgcyA9IGdlW3VdIHx8IGdlLl9kZWZhdWx0LCBhLmlubmVySFRNTCA9IHNbMV0gKyB3Lmh0bWxQcmVmaWx0ZXIobykgKyBzWzJdLCBjID0gc1swXTsgd2hpbGUgKGMtLSkgYSA9IGEubGFzdENoaWxkOyB3Lm1lcmdlKGQsIGEuY2hpbGROb2RlcyksIChhID0gZi5maXJzdENoaWxkKS50ZXh0Q29udGVudCA9ICIiIH0gZWxzZSBkLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7IGYudGV4dENvbnRlbnQgPSAiIiwgcCA9IDA7IHdoaWxlIChvID0gZFtwKytdKSBpZiAociAmJiB3LmluQXJyYXkobywgcikgPiAtMSkgaSAmJiBpLnB1c2gobyk7IGVsc2UgaWYgKGwgPSB3LmNvbnRhaW5zKG8ub3duZXJEb2N1bWVudCwgbyksIGEgPSB2ZShmLmFwcGVuZENoaWxkKG8pLCAic2NyaXB0IiksIGwgJiYgeWUoYSksIG4pIHsgYyA9IDA7IHdoaWxlIChvID0gYVtjKytdKSBoZS50ZXN0KG8udHlwZSB8fCAiIikgJiYgbi5wdXNoKG8pIH0gcmV0dXJuIGYgfSAhZnVuY3Rpb24gKCkgeyB2YXIgZSA9IHIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudCgiZGl2IikpLCB0ID0gci5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOyB0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJyYWRpbyIpLCB0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsICJjaGVja2VkIiksIHQuc2V0QXR0cmlidXRlKCJuYW1lIiwgInQiKSwgZS5hcHBlbmRDaGlsZCh0KSwgaC5jaGVja0Nsb25lID0gZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsIGUuaW5uZXJIVE1MID0gIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLCBoLm5vQ2xvbmVDaGVja2VkID0gISFlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSB9KCk7IHZhciB4ZSA9IHIuZG9jdW1lbnRFbGVtZW50LCB3ZSA9IC9ea2V5LywgQ2UgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sIFRlID0gL14oW14uXSopKD86XC4oLispfCkvOyBmdW5jdGlvbiBFZSgpIHsgcmV0dXJuICEwIH0gZnVuY3Rpb24gTmUoKSB7IHJldHVybiAhMSB9IGZ1bmN0aW9uIGtlKCkgeyB0cnkgeyByZXR1cm4gci5hY3RpdmVFbGVtZW50IH0gY2F0Y2ggKGUpIHsgfSB9IGZ1bmN0aW9uIEFlKGUsIHQsIG4sIHIsIGksIG8pIHsgdmFyIGEsIHU7IGlmICgib2JqZWN0IiA9PSB0eXBlb2YgdCkgeyAic3RyaW5nIiAhPSB0eXBlb2YgbiAmJiAociA9IHIgfHwgbiwgbiA9IHZvaWQgMCk7IGZvciAodSBpbiB0KSBBZShlLCB1LCBuLCByLCB0W3VdLCBvKTsgcmV0dXJuIGUgfSBpZiAobnVsbCA9PSByICYmIG51bGwgPT0gaSA/IChpID0gbiwgciA9IG4gPSB2b2lkIDApIDogbnVsbCA9PSBpICYmICgic3RyaW5nIiA9PSB0eXBlb2YgbiA/IChpID0gciwgciA9IHZvaWQgMCkgOiAoaSA9IHIsIHIgPSBuLCBuID0gdm9pZCAwKSksICExID09PSBpKSBpID0gTmU7IGVsc2UgaWYgKCFpKSByZXR1cm4gZTsgcmV0dXJuIDEgPT09IG8gJiYgKGEgPSBpLCAoaSA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiB3KCkub2ZmKGUpLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfSkuZ3VpZCA9IGEuZ3VpZCB8fCAoYS5ndWlkID0gdy5ndWlkKyspKSwgZS5lYWNoKGZ1bmN0aW9uICgpIHsgdy5ldmVudC5hZGQodGhpcywgdCwgaSwgciwgbikgfSkgfSB3LmV2ZW50ID0geyBnbG9iYWw6IHt9LCBhZGQ6IGZ1bmN0aW9uIChlLCB0LCBuLCByLCBpKSB7IHZhciBvLCBhLCB1LCBzLCBsLCBjLCBmLCBkLCBwLCBoLCBnLCB2ID0gSy5nZXQoZSk7IGlmICh2KSB7IG4uaGFuZGxlciAmJiAobiA9IChvID0gbikuaGFuZGxlciwgaSA9IG8uc2VsZWN0b3IpLCBpICYmIHcuZmluZC5tYXRjaGVzU2VsZWN0b3IoeGUsIGkpLCBuLmd1aWQgfHwgKG4uZ3VpZCA9IHcuZ3VpZCsrKSwgKHMgPSB2LmV2ZW50cykgfHwgKHMgPSB2LmV2ZW50cyA9IHt9KSwgKGEgPSB2LmhhbmRsZSkgfHwgKGEgPSB2LmhhbmRsZSA9IGZ1bmN0aW9uICh0KSB7IHJldHVybiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgdyAmJiB3LmV2ZW50LnRyaWdnZXJlZCAhPT0gdC50eXBlID8gdy5ldmVudC5kaXNwYXRjaC5hcHBseShlLCBhcmd1bWVudHMpIDogdm9pZCAwIH0pLCBsID0gKHQgPSAodCB8fCAiIikubWF0Y2goSSkgfHwgWyIiXSkubGVuZ3RoOyB3aGlsZSAobC0tKSBwID0gZyA9ICh1ID0gVGUuZXhlYyh0W2xdKSB8fCBbXSlbMV0sIGggPSAodVsyXSB8fCAiIikuc3BsaXQoIi4iKS5zb3J0KCksIHAgJiYgKGYgPSB3LmV2ZW50LnNwZWNpYWxbcF0gfHwge30sIHAgPSAoaSA/IGYuZGVsZWdhdGVUeXBlIDogZi5iaW5kVHlwZSkgfHwgcCwgZiA9IHcuZXZlbnQuc3BlY2lhbFtwXSB8fCB7fSwgYyA9IHcuZXh0ZW5kKHsgdHlwZTogcCwgb3JpZ1R5cGU6IGcsIGRhdGE6IHIsIGhhbmRsZXI6IG4sIGd1aWQ6IG4uZ3VpZCwgc2VsZWN0b3I6IGksIG5lZWRzQ29udGV4dDogaSAmJiB3LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksIG5hbWVzcGFjZTogaC5qb2luKCIuIikgfSwgbyksIChkID0gc1twXSkgfHwgKChkID0gc1twXSA9IFtdKS5kZWxlZ2F0ZUNvdW50ID0gMCwgZi5zZXR1cCAmJiAhMSAhPT0gZi5zZXR1cC5jYWxsKGUsIHIsIGgsIGEpIHx8IGUuYWRkRXZlbnRMaXN0ZW5lciAmJiBlLmFkZEV2ZW50TGlzdGVuZXIocCwgYSkpLCBmLmFkZCAmJiAoZi5hZGQuY2FsbChlLCBjKSwgYy5oYW5kbGVyLmd1aWQgfHwgKGMuaGFuZGxlci5ndWlkID0gbi5ndWlkKSksIGkgPyBkLnNwbGljZShkLmRlbGVnYXRlQ291bnQrKywgMCwgYykgOiBkLnB1c2goYyksIHcuZXZlbnQuZ2xvYmFsW3BdID0gITApIH0gfSwgcmVtb3ZlOiBmdW5jdGlvbiAoZSwgdCwgbiwgciwgaSkgeyB2YXIgbywgYSwgdSwgcywgbCwgYywgZiwgZCwgcCwgaCwgZywgdiA9IEsuaGFzRGF0YShlKSAmJiBLLmdldChlKTsgaWYgKHYgJiYgKHMgPSB2LmV2ZW50cykpIHsgbCA9ICh0ID0gKHQgfHwgIiIpLm1hdGNoKEkpIHx8IFsiIl0pLmxlbmd0aDsgd2hpbGUgKGwtLSkgaWYgKHUgPSBUZS5leGVjKHRbbF0pIHx8IFtdLCBwID0gZyA9IHVbMV0sIGggPSAodVsyXSB8fCAiIikuc3BsaXQoIi4iKS5zb3J0KCksIHApIHsgZiA9IHcuZXZlbnQuc3BlY2lhbFtwXSB8fCB7fSwgZCA9IHNbcCA9IChyID8gZi5kZWxlZ2F0ZVR5cGUgOiBmLmJpbmRUeXBlKSB8fCBwXSB8fCBbXSwgdSA9IHVbMl0gJiYgbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIiksIGEgPSBvID0gZC5sZW5ndGg7IHdoaWxlIChvLS0pIGMgPSBkW29dLCAhaSAmJiBnICE9PSBjLm9yaWdUeXBlIHx8IG4gJiYgbi5ndWlkICE9PSBjLmd1aWQgfHwgdSAmJiAhdS50ZXN0KGMubmFtZXNwYWNlKSB8fCByICYmIHIgIT09IGMuc2VsZWN0b3IgJiYgKCIqKiIgIT09IHIgfHwgIWMuc2VsZWN0b3IpIHx8IChkLnNwbGljZShvLCAxKSwgYy5zZWxlY3RvciAmJiBkLmRlbGVnYXRlQ291bnQtLSAsIGYucmVtb3ZlICYmIGYucmVtb3ZlLmNhbGwoZSwgYykpOyBhICYmICFkLmxlbmd0aCAmJiAoZi50ZWFyZG93biAmJiAhMSAhPT0gZi50ZWFyZG93bi5jYWxsKGUsIGgsIHYuaGFuZGxlKSB8fCB3LnJlbW92ZUV2ZW50KGUsIHAsIHYuaGFuZGxlKSwgZGVsZXRlIHNbcF0pIH0gZWxzZSBmb3IgKHAgaW4gcykgdy5ldmVudC5yZW1vdmUoZSwgcCArIHRbbF0sIG4sIHIsICEwKTsgdy5pc0VtcHR5T2JqZWN0KHMpICYmIEsucmVtb3ZlKGUsICJoYW5kbGUgZXZlbnRzIikgfSB9LCBkaXNwYXRjaDogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSB3LmV2ZW50LmZpeChlKSwgbiwgciwgaSwgbywgYSwgdSwgcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSwgbCA9IChLLmdldCh0aGlzLCAiZXZlbnRzIikgfHwge30pW3QudHlwZV0gfHwgW10sIGMgPSB3LmV2ZW50LnNwZWNpYWxbdC50eXBlXSB8fCB7fTsgZm9yIChzWzBdID0gdCwgbiA9IDE7IG4gPCBhcmd1bWVudHMubGVuZ3RoOyBuKyspc1tuXSA9IGFyZ3VtZW50c1tuXTsgaWYgKHQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzLCAhYy5wcmVEaXNwYXRjaCB8fCAhMSAhPT0gYy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsIHQpKSB7IHUgPSB3LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcywgdCwgbCksIG4gPSAwOyB3aGlsZSAoKG8gPSB1W24rK10pICYmICF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHsgdC5jdXJyZW50VGFyZ2V0ID0gby5lbGVtLCByID0gMDsgd2hpbGUgKChhID0gby5oYW5kbGVyc1tyKytdKSAmJiAhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSB0LnJuYW1lc3BhY2UgJiYgIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKSB8fCAodC5oYW5kbGVPYmogPSBhLCB0LmRhdGEgPSBhLmRhdGEsIHZvaWQgMCAhPT0gKGkgPSAoKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXSB8fCB7fSkuaGFuZGxlIHx8IGEuaGFuZGxlcikuYXBwbHkoby5lbGVtLCBzKSkgJiYgITEgPT09ICh0LnJlc3VsdCA9IGkpICYmICh0LnByZXZlbnREZWZhdWx0KCksIHQuc3RvcFByb3BhZ2F0aW9uKCkpKSB9IHJldHVybiBjLnBvc3REaXNwYXRjaCAmJiBjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsIHQpLCB0LnJlc3VsdCB9IH0sIGhhbmRsZXJzOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiwgciwgaSwgbywgYSwgdSA9IFtdLCBzID0gdC5kZWxlZ2F0ZUNvdW50LCBsID0gZS50YXJnZXQ7IGlmIChzICYmIGwubm9kZVR5cGUgJiYgISgiY2xpY2siID09PSBlLnR5cGUgJiYgZS5idXR0b24gPj0gMSkpIGZvciAoOyBsICE9PSB0aGlzOyBsID0gbC5wYXJlbnROb2RlIHx8IHRoaXMpaWYgKDEgPT09IGwubm9kZVR5cGUgJiYgKCJjbGljayIgIT09IGUudHlwZSB8fCAhMCAhPT0gbC5kaXNhYmxlZCkpIHsgZm9yIChvID0gW10sIGEgPSB7fSwgbiA9IDA7IG4gPCBzOyBuKyspdm9pZCAwID09PSBhW2kgPSAociA9IHRbbl0pLnNlbGVjdG9yICsgIiAiXSAmJiAoYVtpXSA9IHIubmVlZHNDb250ZXh0ID8gdyhpLCB0aGlzKS5pbmRleChsKSA+IC0xIDogdy5maW5kKGksIHRoaXMsIG51bGwsIFtsXSkubGVuZ3RoKSwgYVtpXSAmJiBvLnB1c2gocik7IG8ubGVuZ3RoICYmIHUucHVzaCh7IGVsZW06IGwsIGhhbmRsZXJzOiBvIH0pIH0gcmV0dXJuIGwgPSB0aGlzLCBzIDwgdC5sZW5ndGggJiYgdS5wdXNoKHsgZWxlbTogbCwgaGFuZGxlcnM6IHQuc2xpY2UocykgfSksIHUgfSwgYWRkUHJvcDogZnVuY3Rpb24gKGUsIHQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLCBlLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCBnZXQ6IGcodCkgPyBmdW5jdGlvbiAoKSB7IGlmICh0aGlzLm9yaWdpbmFsRXZlbnQpIHJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCkgfSA6IGZ1bmN0aW9uICgpIHsgaWYgKHRoaXMub3JpZ2luYWxFdmVudCkgcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFtlXSB9LCBzZXQ6IGZ1bmN0aW9uICh0KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBlLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAsIHZhbHVlOiB0IH0pIH0gfSkgfSwgZml4OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZVt3LmV4cGFuZG9dID8gZSA6IG5ldyB3LkV2ZW50KGUpIH0sIHNwZWNpYWw6IHsgbG9hZDogeyBub0J1YmJsZTogITAgfSwgZm9jdXM6IHsgdHJpZ2dlcjogZnVuY3Rpb24gKCkgeyBpZiAodGhpcyAhPT0ga2UoKSAmJiB0aGlzLmZvY3VzKSByZXR1cm4gdGhpcy5mb2N1cygpLCAhMSB9LCBkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIiB9LCBibHVyOiB7IHRyaWdnZXI6IGZ1bmN0aW9uICgpIHsgaWYgKHRoaXMgPT09IGtlKCkgJiYgdGhpcy5ibHVyKSByZXR1cm4gdGhpcy5ibHVyKCksICExIH0sIGRlbGVnYXRlVHlwZTogImZvY3Vzb3V0IiB9LCBjbGljazogeyB0cmlnZ2VyOiBmdW5jdGlvbiAoKSB7IGlmICgiY2hlY2tib3giID09PSB0aGlzLnR5cGUgJiYgdGhpcy5jbGljayAmJiBEKHRoaXMsICJpbnB1dCIpKSByZXR1cm4gdGhpcy5jbGljaygpLCAhMSB9LCBfZGVmYXVsdDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEQoZS50YXJnZXQsICJhIikgfSB9LCBiZWZvcmV1bmxvYWQ6IHsgcG9zdERpc3BhdGNoOiBmdW5jdGlvbiAoZSkgeyB2b2lkIDAgIT09IGUucmVzdWx0ICYmIGUub3JpZ2luYWxFdmVudCAmJiAoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZS5yZXN1bHQpIH0gfSB9IH0sIHcucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiAoZSwgdCwgbikgeyBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsIG4pIH0sIHcuRXZlbnQgPSBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoISh0aGlzIGluc3RhbmNlb2Ygdy5FdmVudCkpIHJldHVybiBuZXcgdy5FdmVudChlLCB0KTsgZSAmJiBlLnR5cGUgPyAodGhpcy5vcmlnaW5hbEV2ZW50ID0gZSwgdGhpcy50eXBlID0gZS50eXBlLCB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGUuZGVmYXVsdFByZXZlbnRlZCB8fCB2b2lkIDAgPT09IGUuZGVmYXVsdFByZXZlbnRlZCAmJiAhMSA9PT0gZS5yZXR1cm5WYWx1ZSA/IEVlIDogTmUsIHRoaXMudGFyZ2V0ID0gZS50YXJnZXQgJiYgMyA9PT0gZS50YXJnZXQubm9kZVR5cGUgPyBlLnRhcmdldC5wYXJlbnROb2RlIDogZS50YXJnZXQsIHRoaXMuY3VycmVudFRhcmdldCA9IGUuY3VycmVudFRhcmdldCwgdGhpcy5yZWxhdGVkVGFyZ2V0ID0gZS5yZWxhdGVkVGFyZ2V0KSA6IHRoaXMudHlwZSA9IGUsIHQgJiYgdy5leHRlbmQodGhpcywgdCksIHRoaXMudGltZVN0YW1wID0gZSAmJiBlLnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpLCB0aGlzW3cuZXhwYW5kb10gPSAhMCB9LCB3LkV2ZW50LnByb3RvdHlwZSA9IHsgY29uc3RydWN0b3I6IHcuRXZlbnQsIGlzRGVmYXVsdFByZXZlbnRlZDogTmUsIGlzUHJvcGFnYXRpb25TdG9wcGVkOiBOZSwgaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IE5lLCBpc1NpbXVsYXRlZDogITEsIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7IHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OyB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IEVlLCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICYmIGUucHJldmVudERlZmF1bHQoKSB9LCBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHsgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7IHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBFZSwgZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCAmJiBlLnN0b3BQcm9wYWdhdGlvbigpIH0sIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkgeyB2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IEVlLCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICYmIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksIHRoaXMuc3RvcFByb3BhZ2F0aW9uKCkgfSB9LCB3LmVhY2goeyBhbHRLZXk6ICEwLCBidWJibGVzOiAhMCwgY2FuY2VsYWJsZTogITAsIGNoYW5nZWRUb3VjaGVzOiAhMCwgY3RybEtleTogITAsIGRldGFpbDogITAsIGV2ZW50UGhhc2U6ICEwLCBtZXRhS2V5OiAhMCwgcGFnZVg6ICEwLCBwYWdlWTogITAsIHNoaWZ0S2V5OiAhMCwgdmlldzogITAsICJjaGFyIjogITAsIGNoYXJDb2RlOiAhMCwga2V5OiAhMCwga2V5Q29kZTogITAsIGJ1dHRvbjogITAsIGJ1dHRvbnM6ICEwLCBjbGllbnRYOiAhMCwgY2xpZW50WTogITAsIG9mZnNldFg6ICEwLCBvZmZzZXRZOiAhMCwgcG9pbnRlcklkOiAhMCwgcG9pbnRlclR5cGU6ICEwLCBzY3JlZW5YOiAhMCwgc2NyZWVuWTogITAsIHRhcmdldFRvdWNoZXM6ICEwLCB0b0VsZW1lbnQ6ICEwLCB0b3VjaGVzOiAhMCwgd2hpY2g6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5idXR0b247IHJldHVybiBudWxsID09IGUud2hpY2ggJiYgd2UudGVzdChlLnR5cGUpID8gbnVsbCAhPSBlLmNoYXJDb2RlID8gZS5jaGFyQ29kZSA6IGUua2V5Q29kZSA6ICFlLndoaWNoICYmIHZvaWQgMCAhPT0gdCAmJiBDZS50ZXN0KGUudHlwZSkgPyAxICYgdCA/IDEgOiAyICYgdCA/IDMgOiA0ICYgdCA/IDIgOiAwIDogZS53aGljaCB9IH0sIHcuZXZlbnQuYWRkUHJvcCksIHcuZWFjaCh7IG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAibW91c2VvdXQiLCBwb2ludGVyZW50ZXI6ICJwb2ludGVyb3ZlciIsIHBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiIH0sIGZ1bmN0aW9uIChlLCB0KSB7IHcuZXZlbnQuc3BlY2lhbFtlXSA9IHsgZGVsZWdhdGVUeXBlOiB0LCBiaW5kVHlwZTogdCwgaGFuZGxlOiBmdW5jdGlvbiAoZSkgeyB2YXIgbiwgciA9IHRoaXMsIGkgPSBlLnJlbGF0ZWRUYXJnZXQsIG8gPSBlLmhhbmRsZU9iajsgcmV0dXJuIGkgJiYgKGkgPT09IHIgfHwgdy5jb250YWlucyhyLCBpKSkgfHwgKGUudHlwZSA9IG8ub3JpZ1R5cGUsIG4gPSBvLmhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgZS50eXBlID0gdCksIG4gfSB9IH0pLCB3LmZuLmV4dGVuZCh7IG9uOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyByZXR1cm4gQWUodGhpcywgZSwgdCwgbiwgcikgfSwgb25lOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyByZXR1cm4gQWUodGhpcywgZSwgdCwgbiwgciwgMSkgfSwgb2ZmOiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaTsgaWYgKGUgJiYgZS5wcmV2ZW50RGVmYXVsdCAmJiBlLmhhbmRsZU9iaikgcmV0dXJuIHIgPSBlLmhhbmRsZU9iaiwgdyhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2UgPyByLm9yaWdUeXBlICsgIi4iICsgci5uYW1lc3BhY2UgOiByLm9yaWdUeXBlLCByLnNlbGVjdG9yLCByLmhhbmRsZXIpLCB0aGlzOyBpZiAoIm9iamVjdCIgPT0gdHlwZW9mIGUpIHsgZm9yIChpIGluIGUpIHRoaXMub2ZmKGksIHQsIGVbaV0pOyByZXR1cm4gdGhpcyB9IHJldHVybiAhMSAhPT0gdCAmJiAiZnVuY3Rpb24iICE9IHR5cGVvZiB0IHx8IChuID0gdCwgdCA9IHZvaWQgMCksICExID09PSBuICYmIChuID0gTmUpLCB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeyB3LmV2ZW50LnJlbW92ZSh0aGlzLCBlLCBuLCB0KSB9KSB9IH0pOyB2YXIgRGUgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksIFNlID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksIExlID0gL2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksIGplID0gL15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nOyBmdW5jdGlvbiBxZShlLCB0KSB7IHJldHVybiBEKGUsICJ0YWJsZSIpICYmIEQoMTEgIT09IHQubm9kZVR5cGUgPyB0IDogdC5maXJzdENoaWxkLCAidHIiKSA/IHcoZSkuY2hpbGRyZW4oInRib2R5IilbMF0gfHwgZSA6IGUgfSBmdW5jdGlvbiBPZShlKSB7IHJldHVybiBlLnR5cGUgPSAobnVsbCAhPT0gZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkgKyAiLyIgKyBlLnR5cGUsIGUgfSBmdW5jdGlvbiBQZShlKSB7IHJldHVybiAidHJ1ZS8iID09PSAoZS50eXBlIHx8ICIiKS5zbGljZSgwLCA1KSA/IGUudHlwZSA9IGUudHlwZS5zbGljZSg1KSA6IGUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksIGUgfSBmdW5jdGlvbiBIZShlLCB0KSB7IHZhciBuLCByLCBpLCBvLCBhLCB1LCBzLCBsOyBpZiAoMSA9PT0gdC5ub2RlVHlwZSkgeyBpZiAoSy5oYXNEYXRhKGUpICYmIChvID0gSy5hY2Nlc3MoZSksIGEgPSBLLnNldCh0LCBvKSwgbCA9IG8uZXZlbnRzKSkgeyBkZWxldGUgYS5oYW5kbGUsIGEuZXZlbnRzID0ge307IGZvciAoaSBpbiBsKSBmb3IgKG4gPSAwLCByID0gbFtpXS5sZW5ndGg7IG4gPCByOyBuKyspdy5ldmVudC5hZGQodCwgaSwgbFtpXVtuXSkgfSBKLmhhc0RhdGEoZSkgJiYgKHUgPSBKLmFjY2VzcyhlKSwgcyA9IHcuZXh0ZW5kKHt9LCB1KSwgSi5zZXQodCwgcykpIH0gfSBmdW5jdGlvbiBJZShlLCB0KSB7IHZhciBuID0gdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyAiaW5wdXQiID09PSBuICYmIGRlLnRlc3QoZS50eXBlKSA/IHQuY2hlY2tlZCA9IGUuY2hlY2tlZCA6ICJpbnB1dCIgIT09IG4gJiYgInRleHRhcmVhIiAhPT0gbiB8fCAodC5kZWZhdWx0VmFsdWUgPSBlLmRlZmF1bHRWYWx1ZSkgfSBmdW5jdGlvbiBSZShlLCB0LCBuLCByKSB7IHQgPSBhLmFwcGx5KFtdLCB0KTsgdmFyIGksIG8sIHUsIHMsIGwsIGMsIGYgPSAwLCBkID0gZS5sZW5ndGgsIHAgPSBkIC0gMSwgdiA9IHRbMF0sIHkgPSBnKHYpOyBpZiAoeSB8fCBkID4gMSAmJiAic3RyaW5nIiA9PSB0eXBlb2YgdiAmJiAhaC5jaGVja0Nsb25lICYmIExlLnRlc3QodikpIHJldHVybiBlLmVhY2goZnVuY3Rpb24gKGkpIHsgdmFyIG8gPSBlLmVxKGkpOyB5ICYmICh0WzBdID0gdi5jYWxsKHRoaXMsIGksIG8uaHRtbCgpKSksIFJlKG8sIHQsIG4sIHIpIH0pOyBpZiAoZCAmJiAoaSA9IGJlKHQsIGVbMF0ub3duZXJEb2N1bWVudCwgITEsIGUsIHIpLCBvID0gaS5maXJzdENoaWxkLCAxID09PSBpLmNoaWxkTm9kZXMubGVuZ3RoICYmIChpID0gbyksIG8gfHwgcikpIHsgZm9yIChzID0gKHUgPSB3Lm1hcCh2ZShpLCAic2NyaXB0IiksIE9lKSkubGVuZ3RoOyBmIDwgZDsgZisrKWwgPSBpLCBmICE9PSBwICYmIChsID0gdy5jbG9uZShsLCAhMCwgITApLCBzICYmIHcubWVyZ2UodSwgdmUobCwgInNjcmlwdCIpKSksIG4uY2FsbChlW2ZdLCBsLCBmKTsgaWYgKHMpIGZvciAoYyA9IHVbdS5sZW5ndGggLSAxXS5vd25lckRvY3VtZW50LCB3Lm1hcCh1LCBQZSksIGYgPSAwOyBmIDwgczsgZisrKWwgPSB1W2ZdLCBoZS50ZXN0KGwudHlwZSB8fCAiIikgJiYgIUsuYWNjZXNzKGwsICJnbG9iYWxFdmFsIikgJiYgdy5jb250YWlucyhjLCBsKSAmJiAobC5zcmMgJiYgIm1vZHVsZSIgIT09IChsLnR5cGUgfHwgIiIpLnRvTG93ZXJDYXNlKCkgPyB3Ll9ldmFsVXJsICYmIHcuX2V2YWxVcmwobC5zcmMpIDogbShsLnRleHRDb250ZW50LnJlcGxhY2UoamUsICIiKSwgYywgbCkpIH0gcmV0dXJuIGUgfSBmdW5jdGlvbiBCZShlLCB0LCBuKSB7IGZvciAodmFyIHIsIGkgPSB0ID8gdy5maWx0ZXIodCwgZSkgOiBlLCBvID0gMDsgbnVsbCAhPSAociA9IGlbb10pOyBvKyspbiB8fCAxICE9PSByLm5vZGVUeXBlIHx8IHcuY2xlYW5EYXRhKHZlKHIpKSwgci5wYXJlbnROb2RlICYmIChuICYmIHcuY29udGFpbnMoci5vd25lckRvY3VtZW50LCByKSAmJiB5ZSh2ZShyLCAic2NyaXB0IikpLCByLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpOyByZXR1cm4gZSB9IHcuZXh0ZW5kKHsgaHRtbFByZWZpbHRlcjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUucmVwbGFjZShEZSwgIjwkMT48LyQyPiIpIH0sIGNsb25lOiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaSwgbywgYSwgdSA9IGUuY2xvbmVOb2RlKCEwKSwgcyA9IHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LCBlKTsgaWYgKCEoaC5ub0Nsb25lQ2hlY2tlZCB8fCAxICE9PSBlLm5vZGVUeXBlICYmIDExICE9PSBlLm5vZGVUeXBlIHx8IHcuaXNYTUxEb2MoZSkpKSBmb3IgKGEgPSB2ZSh1KSwgciA9IDAsIGkgPSAobyA9IHZlKGUpKS5sZW5ndGg7IHIgPCBpOyByKyspSWUob1tyXSwgYVtyXSk7IGlmICh0KSBpZiAobikgZm9yIChvID0gbyB8fCB2ZShlKSwgYSA9IGEgfHwgdmUodSksIHIgPSAwLCBpID0gby5sZW5ndGg7IHIgPCBpOyByKyspSGUob1tyXSwgYVtyXSk7IGVsc2UgSGUoZSwgdSk7IHJldHVybiAoYSA9IHZlKHUsICJzY3JpcHQiKSkubGVuZ3RoID4gMCAmJiB5ZShhLCAhcyAmJiB2ZShlLCAic2NyaXB0IikpLCB1IH0sIGNsZWFuRGF0YTogZnVuY3Rpb24gKGUpIHsgZm9yICh2YXIgdCwgbiwgciwgaSA9IHcuZXZlbnQuc3BlY2lhbCwgbyA9IDA7IHZvaWQgMCAhPT0gKG4gPSBlW29dKTsgbysrKWlmIChZKG4pKSB7IGlmICh0ID0gbltLLmV4cGFuZG9dKSB7IGlmICh0LmV2ZW50cykgZm9yIChyIGluIHQuZXZlbnRzKSBpW3JdID8gdy5ldmVudC5yZW1vdmUobiwgcikgOiB3LnJlbW92ZUV2ZW50KG4sIHIsIHQuaGFuZGxlKTsgbltLLmV4cGFuZG9dID0gdm9pZCAwIH0gbltKLmV4cGFuZG9dICYmIChuW0ouZXhwYW5kb10gPSB2b2lkIDApIH0gfSB9KSwgdy5mbi5leHRlbmQoeyBkZXRhY2g6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBCZSh0aGlzLCBlLCAhMCkgfSwgcmVtb3ZlOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gQmUodGhpcywgZSkgfSwgdGV4dDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIF8odGhpcywgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHZvaWQgMCA9PT0gZSA/IHcudGV4dCh0aGlzKSA6IHRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uICgpIHsgMSAhPT0gdGhpcy5ub2RlVHlwZSAmJiAxMSAhPT0gdGhpcy5ub2RlVHlwZSAmJiA5ICE9PSB0aGlzLm5vZGVUeXBlIHx8ICh0aGlzLnRleHRDb250ZW50ID0gZSkgfSkgfSwgbnVsbCwgZSwgYXJndW1lbnRzLmxlbmd0aCkgfSwgYXBwZW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiBSZSh0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uIChlKSB7IDEgIT09IHRoaXMubm9kZVR5cGUgJiYgMTEgIT09IHRoaXMubm9kZVR5cGUgJiYgOSAhPT0gdGhpcy5ub2RlVHlwZSB8fCBxZSh0aGlzLCBlKS5hcHBlbmRDaGlsZChlKSB9KSB9LCBwcmVwZW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiBSZSh0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uIChlKSB7IGlmICgxID09PSB0aGlzLm5vZGVUeXBlIHx8IDExID09PSB0aGlzLm5vZGVUeXBlIHx8IDkgPT09IHRoaXMubm9kZVR5cGUpIHsgdmFyIHQgPSBxZSh0aGlzLCBlKTsgdC5pbnNlcnRCZWZvcmUoZSwgdC5maXJzdENoaWxkKSB9IH0pIH0sIGJlZm9yZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gUmUodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiAoZSkgeyB0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLCB0aGlzKSB9KSB9LCBhZnRlcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gUmUodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiAoZSkgeyB0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLCB0aGlzLm5leHRTaWJsaW5nKSB9KSB9LCBlbXB0eTogZnVuY3Rpb24gKCkgeyBmb3IgKHZhciBlLCB0ID0gMDsgbnVsbCAhPSAoZSA9IHRoaXNbdF0pOyB0KyspMSA9PT0gZS5ub2RlVHlwZSAmJiAody5jbGVhbkRhdGEodmUoZSwgITEpKSwgZS50ZXh0Q29udGVudCA9ICIiKTsgcmV0dXJuIHRoaXMgfSwgY2xvbmU6IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiBlID0gbnVsbCAhPSBlICYmIGUsIHQgPSBudWxsID09IHQgPyBlIDogdCwgdGhpcy5tYXAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdy5jbG9uZSh0aGlzLCBlLCB0KSB9KSB9LCBodG1sOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gXyh0aGlzLCBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHRoaXNbMF0gfHwge30sIG4gPSAwLCByID0gdGhpcy5sZW5ndGg7IGlmICh2b2lkIDAgPT09IGUgJiYgMSA9PT0gdC5ub2RlVHlwZSkgcmV0dXJuIHQuaW5uZXJIVE1MOyBpZiAoInN0cmluZyIgPT0gdHlwZW9mIGUgJiYgIVNlLnRlc3QoZSkgJiYgIWdlWyhwZS5leGVjKGUpIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkgeyBlID0gdy5odG1sUHJlZmlsdGVyKGUpOyB0cnkgeyBmb3IgKDsgbiA8IHI7IG4rKykxID09PSAodCA9IHRoaXNbbl0gfHwge30pLm5vZGVUeXBlICYmICh3LmNsZWFuRGF0YSh2ZSh0LCAhMSkpLCB0LmlubmVySFRNTCA9IGUpOyB0ID0gMCB9IGNhdGNoIChlKSB7IH0gfSB0ICYmIHRoaXMuZW1wdHkoKS5hcHBlbmQoZSkgfSwgbnVsbCwgZSwgYXJndW1lbnRzLmxlbmd0aCkgfSwgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uICgpIHsgdmFyIGUgPSBbXTsgcmV0dXJuIFJlKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24gKHQpIHsgdmFyIG4gPSB0aGlzLnBhcmVudE5vZGU7IHcuaW5BcnJheSh0aGlzLCBlKSA8IDAgJiYgKHcuY2xlYW5EYXRhKHZlKHRoaXMpKSwgbiAmJiBuLnJlcGxhY2VDaGlsZCh0LCB0aGlzKSkgfSwgZSkgfSB9KSwgdy5lYWNoKHsgYXBwZW5kVG86ICJhcHBlbmQiLCBwcmVwZW5kVG86ICJwcmVwZW5kIiwgaW5zZXJ0QmVmb3JlOiAiYmVmb3JlIiwgaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsIHJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIgfSwgZnVuY3Rpb24gKGUsIHQpIHsgdy5mbltlXSA9IGZ1bmN0aW9uIChlKSB7IGZvciAodmFyIG4sIHIgPSBbXSwgaSA9IHcoZSksIG8gPSBpLmxlbmd0aCAtIDEsIGEgPSAwOyBhIDw9IG87IGErKyluID0gYSA9PT0gbyA/IHRoaXMgOiB0aGlzLmNsb25lKCEwKSwgdyhpW2FdKVt0XShuKSwgdS5hcHBseShyLCBuLmdldCgpKTsgcmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpIH0gfSk7IHZhciBNZSA9IG5ldyBSZWdFeHAoIl4oIiArIHJlICsgIikoPyFweClbYS16JV0rJCIsICJpIiksIFdlID0gZnVuY3Rpb24gKHQpIHsgdmFyIG4gPSB0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7IHJldHVybiBuICYmIG4ub3BlbmVyIHx8IChuID0gZSksIG4uZ2V0Q29tcHV0ZWRTdHlsZSh0KSB9LCAkZSA9IG5ldyBSZWdFeHAob2Uuam9pbigifCIpLCAiaSIpOyAhZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiB0KCkgeyBpZiAoYykgeyBsLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsIGMuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIiwgeGUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7IHZhciB0ID0gZS5nZXRDb21wdXRlZFN0eWxlKGMpOyBpID0gIjElIiAhPT0gdC50b3AsIHMgPSAxMiA9PT0gbih0Lm1hcmdpbkxlZnQpLCBjLnN0eWxlLnJpZ2h0ID0gIjYwJSIsIHUgPSAzNiA9PT0gbih0LnJpZ2h0KSwgbyA9IDM2ID09PSBuKHQud2lkdGgpLCBjLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIiwgYSA9IDM2ID09PSBjLm9mZnNldFdpZHRoIHx8ICJhYnNvbHV0ZSIsIHhlLnJlbW92ZUNoaWxkKGwpLCBjID0gbnVsbCB9IH0gZnVuY3Rpb24gbihlKSB7IHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpIH0gdmFyIGksIG8sIGEsIHUsIHMsIGwgPSByLmNyZWF0ZUVsZW1lbnQoImRpdiIpLCBjID0gci5jcmVhdGVFbGVtZW50KCJkaXYiKTsgYy5zdHlsZSAmJiAoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCIsIGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICIiLCBoLmNsZWFyQ2xvbmVTdHlsZSA9ICJjb250ZW50LWJveCIgPT09IGMuc3R5bGUuYmFja2dyb3VuZENsaXAsIHcuZXh0ZW5kKGgsIHsgYm94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHQoKSwgbyB9LCBwaXhlbEJveFN0eWxlczogZnVuY3Rpb24gKCkgeyByZXR1cm4gdCgpLCB1IH0sIHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHQoKSwgaSB9LCByZWxpYWJsZU1hcmdpbkxlZnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHQoKSwgcyB9LCBzY3JvbGxib3hTaXplOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0KCksIGEgfSB9KSkgfSgpOyBmdW5jdGlvbiBGZShlLCB0LCBuKSB7IHZhciByLCBpLCBvLCBhLCB1ID0gZS5zdHlsZTsgcmV0dXJuIChuID0gbiB8fCBXZShlKSkgJiYgKCIiICE9PSAoYSA9IG4uZ2V0UHJvcGVydHlWYWx1ZSh0KSB8fCBuW3RdKSB8fCB3LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCwgZSkgfHwgKGEgPSB3LnN0eWxlKGUsIHQpKSwgIWgucGl4ZWxCb3hTdHlsZXMoKSAmJiBNZS50ZXN0KGEpICYmICRlLnRlc3QodCkgJiYgKHIgPSB1LndpZHRoLCBpID0gdS5taW5XaWR0aCwgbyA9IHUubWF4V2lkdGgsIHUubWluV2lkdGggPSB1Lm1heFdpZHRoID0gdS53aWR0aCA9IGEsIGEgPSBuLndpZHRoLCB1LndpZHRoID0gciwgdS5taW5XaWR0aCA9IGksIHUubWF4V2lkdGggPSBvKSksIHZvaWQgMCAhPT0gYSA/IGEgKyAiIiA6IGEgfSBmdW5jdGlvbiB6ZShlLCB0KSB7IHJldHVybiB7IGdldDogZnVuY3Rpb24gKCkgeyBpZiAoIWUoKSkgcmV0dXJuICh0aGlzLmdldCA9IHQpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IGRlbGV0ZSB0aGlzLmdldCB9IH0gfSB2YXIgX2UgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sIFVlID0gL14tLS8sIFZlID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwgWGUgPSB7IGxldHRlclNwYWNpbmc6ICIwIiwgZm9udFdlaWdodDogIjQwMCIgfSwgUWUgPSBbIldlYmtpdCIsICJNb3oiLCAibXMiXSwgWWUgPSByLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlOyBmdW5jdGlvbiBHZShlKSB7IGlmIChlIGluIFllKSByZXR1cm4gZTsgdmFyIHQgPSBlWzBdLnRvVXBwZXJDYXNlKCkgKyBlLnNsaWNlKDEpLCBuID0gUWUubGVuZ3RoOyB3aGlsZSAobi0tKSBpZiAoKGUgPSBRZVtuXSArIHQpIGluIFllKSByZXR1cm4gZSB9IGZ1bmN0aW9uIEtlKGUpIHsgdmFyIHQgPSB3LmNzc1Byb3BzW2VdOyByZXR1cm4gdCB8fCAodCA9IHcuY3NzUHJvcHNbZV0gPSBHZShlKSB8fCBlKSwgdCB9IGZ1bmN0aW9uIEplKGUsIHQsIG4pIHsgdmFyIHIgPSBpZS5leGVjKHQpOyByZXR1cm4gciA/IE1hdGgubWF4KDAsIHJbMl0gLSAobiB8fCAwKSkgKyAoclszXSB8fCAicHgiKSA6IHQgfSBmdW5jdGlvbiBaZShlLCB0LCBuLCByLCBpLCBvKSB7IHZhciBhID0gIndpZHRoIiA9PT0gdCA/IDEgOiAwLCB1ID0gMCwgcyA9IDA7IGlmIChuID09PSAociA/ICJib3JkZXIiIDogImNvbnRlbnQiKSkgcmV0dXJuIDA7IGZvciAoOyBhIDwgNDsgYSArPSAyKSJtYXJnaW4iID09PSBuICYmIChzICs9IHcuY3NzKGUsIG4gKyBvZVthXSwgITAsIGkpKSwgciA/ICgiY29udGVudCIgPT09IG4gJiYgKHMgLT0gdy5jc3MoZSwgInBhZGRpbmciICsgb2VbYV0sICEwLCBpKSksICJtYXJnaW4iICE9PSBuICYmIChzIC09IHcuY3NzKGUsICJib3JkZXIiICsgb2VbYV0gKyAiV2lkdGgiLCAhMCwgaSkpKSA6IChzICs9IHcuY3NzKGUsICJwYWRkaW5nIiArIG9lW2FdLCAhMCwgaSksICJwYWRkaW5nIiAhPT0gbiA/IHMgKz0gdy5jc3MoZSwgImJvcmRlciIgKyBvZVthXSArICJXaWR0aCIsICEwLCBpKSA6IHUgKz0gdy5jc3MoZSwgImJvcmRlciIgKyBvZVthXSArICJXaWR0aCIsICEwLCBpKSk7IHJldHVybiAhciAmJiBvID49IDAgJiYgKHMgKz0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGVbIm9mZnNldCIgKyB0WzBdLnRvVXBwZXJDYXNlKCkgKyB0LnNsaWNlKDEpXSAtIG8gLSBzIC0gdSAtIC41KSkpLCBzIH0gZnVuY3Rpb24gZXQoZSwgdCwgbikgeyB2YXIgciA9IFdlKGUpLCBpID0gRmUoZSwgdCwgciksIG8gPSAiYm9yZGVyLWJveCIgPT09IHcuY3NzKGUsICJib3hTaXppbmciLCAhMSwgciksIGEgPSBvOyBpZiAoTWUudGVzdChpKSkgeyBpZiAoIW4pIHJldHVybiBpOyBpID0gImF1dG8iIH0gcmV0dXJuIGEgPSBhICYmIChoLmJveFNpemluZ1JlbGlhYmxlKCkgfHwgaSA9PT0gZS5zdHlsZVt0XSksICgiYXV0byIgPT09IGkgfHwgIXBhcnNlRmxvYXQoaSkgJiYgImlubGluZSIgPT09IHcuY3NzKGUsICJkaXNwbGF5IiwgITEsIHIpKSAmJiAoaSA9IGVbIm9mZnNldCIgKyB0WzBdLnRvVXBwZXJDYXNlKCkgKyB0LnNsaWNlKDEpXSwgYSA9ICEwKSwgKGkgPSBwYXJzZUZsb2F0KGkpIHx8IDApICsgWmUoZSwgdCwgbiB8fCAobyA/ICJib3JkZXIiIDogImNvbnRlbnQiKSwgYSwgciwgaSkgKyAicHgiIH0gdy5leHRlbmQoeyBjc3NIb29rczogeyBvcGFjaXR5OiB7IGdldDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKHQpIHsgdmFyIG4gPSBGZShlLCAib3BhY2l0eSIpOyByZXR1cm4gIiIgPT09IG4gPyAiMSIgOiBuIH0gfSB9IH0sIGNzc051bWJlcjogeyBhbmltYXRpb25JdGVyYXRpb25Db3VudDogITAsIGNvbHVtbkNvdW50OiAhMCwgZmlsbE9wYWNpdHk6ICEwLCBmbGV4R3JvdzogITAsIGZsZXhTaHJpbms6ICEwLCBmb250V2VpZ2h0OiAhMCwgbGluZUhlaWdodDogITAsIG9wYWNpdHk6ICEwLCBvcmRlcjogITAsIG9ycGhhbnM6ICEwLCB3aWRvd3M6ICEwLCB6SW5kZXg6ICEwLCB6b29tOiAhMCB9LCBjc3NQcm9wczoge30sIHN0eWxlOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyBpZiAoZSAmJiAzICE9PSBlLm5vZGVUeXBlICYmIDggIT09IGUubm9kZVR5cGUgJiYgZS5zdHlsZSkgeyB2YXIgaSwgbywgYSwgdSA9IFEodCksIHMgPSBVZS50ZXN0KHQpLCBsID0gZS5zdHlsZTsgaWYgKHMgfHwgKHQgPSBLZSh1KSksIGEgPSB3LmNzc0hvb2tzW3RdIHx8IHcuY3NzSG9va3NbdV0sIHZvaWQgMCA9PT0gbikgcmV0dXJuIGEgJiYgImdldCIgaW4gYSAmJiB2b2lkIDAgIT09IChpID0gYS5nZXQoZSwgITEsIHIpKSA/IGkgOiBsW3RdOyAic3RyaW5nIiA9PSAobyA9IHR5cGVvZiBuKSAmJiAoaSA9IGllLmV4ZWMobikpICYmIGlbMV0gJiYgKG4gPSBzZShlLCB0LCBpKSwgbyA9ICJudW1iZXIiKSwgbnVsbCAhPSBuICYmIG4gPT09IG4gJiYgKCJudW1iZXIiID09PSBvICYmIChuICs9IGkgJiYgaVszXSB8fCAody5jc3NOdW1iZXJbdV0gPyAiIiA6ICJweCIpKSwgaC5jbGVhckNsb25lU3R5bGUgfHwgIiIgIT09IG4gfHwgMCAhPT0gdC5pbmRleE9mKCJiYWNrZ3JvdW5kIikgfHwgKGxbdF0gPSAiaW5oZXJpdCIpLCBhICYmICJzZXQiIGluIGEgJiYgdm9pZCAwID09PSAobiA9IGEuc2V0KGUsIG4sIHIpKSB8fCAocyA/IGwuc2V0UHJvcGVydHkodCwgbikgOiBsW3RdID0gbikpIH0gfSwgY3NzOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyB2YXIgaSwgbywgYSwgdSA9IFEodCk7IHJldHVybiBVZS50ZXN0KHQpIHx8ICh0ID0gS2UodSkpLCAoYSA9IHcuY3NzSG9va3NbdF0gfHwgdy5jc3NIb29rc1t1XSkgJiYgImdldCIgaW4gYSAmJiAoaSA9IGEuZ2V0KGUsICEwLCBuKSksIHZvaWQgMCA9PT0gaSAmJiAoaSA9IEZlKGUsIHQsIHIpKSwgIm5vcm1hbCIgPT09IGkgJiYgdCBpbiBYZSAmJiAoaSA9IFhlW3RdKSwgIiIgPT09IG4gfHwgbiA/IChvID0gcGFyc2VGbG9hdChpKSwgITAgPT09IG4gfHwgaXNGaW5pdGUobykgPyBvIHx8IDAgOiBpKSA6IGkgfSB9KSwgdy5lYWNoKFsiaGVpZ2h0IiwgIndpZHRoIl0sIGZ1bmN0aW9uIChlLCB0KSB7IHcuY3NzSG9va3NbdF0gPSB7IGdldDogZnVuY3Rpb24gKGUsIG4sIHIpIHsgaWYgKG4pIHJldHVybiAhX2UudGVzdCh3LmNzcyhlLCAiZGlzcGxheSIpKSB8fCBlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICYmIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPyBldChlLCB0LCByKSA6IHVlKGUsIFZlLCBmdW5jdGlvbiAoKSB7IHJldHVybiBldChlLCB0LCByKSB9KSB9LCBzZXQ6IGZ1bmN0aW9uIChlLCBuLCByKSB7IHZhciBpLCBvID0gV2UoZSksIGEgPSAiYm9yZGVyLWJveCIgPT09IHcuY3NzKGUsICJib3hTaXppbmciLCAhMSwgbyksIHUgPSByICYmIFplKGUsIHQsIHIsIGEsIG8pOyByZXR1cm4gYSAmJiBoLnNjcm9sbGJveFNpemUoKSA9PT0gby5wb3NpdGlvbiAmJiAodSAtPSBNYXRoLmNlaWwoZVsib2Zmc2V0IiArIHRbMF0udG9VcHBlckNhc2UoKSArIHQuc2xpY2UoMSldIC0gcGFyc2VGbG9hdChvW3RdKSAtIFplKGUsIHQsICJib3JkZXIiLCAhMSwgbykgLSAuNSkpLCB1ICYmIChpID0gaWUuZXhlYyhuKSkgJiYgInB4IiAhPT0gKGlbM10gfHwgInB4IikgJiYgKGUuc3R5bGVbdF0gPSBuLCBuID0gdy5jc3MoZSwgdCkpLCBKZShlLCBuLCB1KSB9IH0gfSksIHcuY3NzSG9va3MubWFyZ2luTGVmdCA9IHplKGgucmVsaWFibGVNYXJnaW5MZWZ0LCBmdW5jdGlvbiAoZSwgdCkgeyBpZiAodCkgcmV0dXJuIChwYXJzZUZsb2F0KEZlKGUsICJtYXJnaW5MZWZ0IikpIHx8IGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHVlKGUsIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbiAoKSB7IHJldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgfSkpICsgInB4IiB9KSwgdy5lYWNoKHsgbWFyZ2luOiAiIiwgcGFkZGluZzogIiIsIGJvcmRlcjogIldpZHRoIiB9LCBmdW5jdGlvbiAoZSwgdCkgeyB3LmNzc0hvb2tzW2UgKyB0XSA9IHsgZXhwYW5kOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciByID0gMCwgaSA9IHt9LCBvID0gInN0cmluZyIgPT0gdHlwZW9mIG4gPyBuLnNwbGl0KCIgIikgOiBbbl07IHIgPCA0OyByKyspaVtlICsgb2Vbcl0gKyB0XSA9IG9bcl0gfHwgb1tyIC0gMl0gfHwgb1swXTsgcmV0dXJuIGkgfSB9LCAibWFyZ2luIiAhPT0gZSAmJiAody5jc3NIb29rc1tlICsgdF0uc2V0ID0gSmUpIH0pLCB3LmZuLmV4dGVuZCh7IGNzczogZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuIF8odGhpcywgZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8gPSB7fSwgYSA9IDA7IGlmIChBcnJheS5pc0FycmF5KHQpKSB7IGZvciAociA9IFdlKGUpLCBpID0gdC5sZW5ndGg7IGEgPCBpOyBhKyspb1t0W2FdXSA9IHcuY3NzKGUsIHRbYV0sICExLCByKTsgcmV0dXJuIG8gfSByZXR1cm4gdm9pZCAwICE9PSBuID8gdy5zdHlsZShlLCB0LCBuKSA6IHcuY3NzKGUsIHQpIH0sIGUsIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB9IH0pLCB3LmZuLmRlbGF5ID0gZnVuY3Rpb24gKHQsIG4pIHsgcmV0dXJuIHQgPSB3LmZ4ID8gdy5meC5zcGVlZHNbdF0gfHwgdCA6IHQsIG4gPSBuIHx8ICJmeCIsIHRoaXMucXVldWUobiwgZnVuY3Rpb24gKG4sIHIpIHsgdmFyIGkgPSBlLnNldFRpbWVvdXQobiwgdCk7IHIuc3RvcCA9IGZ1bmN0aW9uICgpIHsgZS5jbGVhclRpbWVvdXQoaSkgfSB9KSB9LCBmdW5jdGlvbiAoKSB7IHZhciBlID0gci5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLCB0ID0gci5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTsgZS50eXBlID0gImNoZWNrYm94IiwgaC5jaGVja09uID0gIiIgIT09IGUudmFsdWUsIGgub3B0U2VsZWN0ZWQgPSB0LnNlbGVjdGVkLCAoZSA9IHIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWUgPSAidCIsIGUudHlwZSA9ICJyYWRpbyIsIGgucmFkaW9WYWx1ZSA9ICJ0IiA9PT0gZS52YWx1ZSB9KCk7IHZhciB0dCwgbnQgPSB3LmV4cHIuYXR0ckhhbmRsZTsgdy5mbi5leHRlbmQoeyBhdHRyOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gXyh0aGlzLCB3LmF0dHIsIGUsIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB9LCByZW1vdmVBdHRyOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgdy5yZW1vdmVBdHRyKHRoaXMsIGUpIH0pIH0gfSksIHcuZXh0ZW5kKHsgYXR0cjogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8gPSBlLm5vZGVUeXBlOyBpZiAoMyAhPT0gbyAmJiA4ICE9PSBvICYmIDIgIT09IG8pIHJldHVybiAidW5kZWZpbmVkIiA9PSB0eXBlb2YgZS5nZXRBdHRyaWJ1dGUgPyB3LnByb3AoZSwgdCwgbikgOiAoMSA9PT0gbyAmJiB3LmlzWE1MRG9jKGUpIHx8IChpID0gdy5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXSB8fCAody5leHByLm1hdGNoLmJvb2wudGVzdCh0KSA/IHR0IDogdm9pZCAwKSksIHZvaWQgMCAhPT0gbiA/IG51bGwgPT09IG4gPyB2b2lkIHcucmVtb3ZlQXR0cihlLCB0KSA6IGkgJiYgInNldCIgaW4gaSAmJiB2b2lkIDAgIT09IChyID0gaS5zZXQoZSwgbiwgdCkpID8gciA6IChlLnNldEF0dHJpYnV0ZSh0LCBuICsgIiIpLCBuKSA6IGkgJiYgImdldCIgaW4gaSAmJiBudWxsICE9PSAociA9IGkuZ2V0KGUsIHQpKSA/IHIgOiBudWxsID09IChyID0gdy5maW5kLmF0dHIoZSwgdCkpID8gdm9pZCAwIDogcikgfSwgYXR0ckhvb2tzOiB7IHR5cGU6IHsgc2V0OiBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoIWgucmFkaW9WYWx1ZSAmJiAicmFkaW8iID09PSB0ICYmIEQoZSwgImlucHV0IikpIHsgdmFyIG4gPSBlLnZhbHVlOyByZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCB0KSwgbiAmJiAoZS52YWx1ZSA9IG4pLCB0IH0gfSB9IH0sIHJlbW92ZUF0dHI6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gMCwgaSA9IHQgJiYgdC5tYXRjaChJKTsgaWYgKGkgJiYgMSA9PT0gZS5ub2RlVHlwZSkgd2hpbGUgKG4gPSBpW3IrK10pIGUucmVtb3ZlQXR0cmlidXRlKG4pIH0gfSksIHR0ID0geyBzZXQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiAhMSA9PT0gdCA/IHcucmVtb3ZlQXR0cihlLCBuKSA6IGUuc2V0QXR0cmlidXRlKG4sIG4pLCBuIH0gfSwgdy5lYWNoKHcuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLCBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IG50W3RdIHx8IHcuZmluZC5hdHRyOyBudFt0XSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7IHZhciBpLCBvLCBhID0gdC50b0xvd2VyQ2FzZSgpOyByZXR1cm4gciB8fCAobyA9IG50W2FdLCBudFthXSA9IGksIGkgPSBudWxsICE9IG4oZSwgdCwgcikgPyBhIDogbnVsbCwgbnRbYV0gPSBvKSwgaSB9IH0pOyB2YXIgcnQgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLCBpdCA9IC9eKD86YXxhcmVhKSQvaTsgdy5mbi5leHRlbmQoeyBwcm9wOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gXyh0aGlzLCB3LnByb3AsIGUsIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB9LCByZW1vdmVQcm9wOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgZGVsZXRlIHRoaXNbdy5wcm9wRml4W2VdIHx8IGVdIH0pIH0gfSksIHcuZXh0ZW5kKHsgcHJvcDogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8gPSBlLm5vZGVUeXBlOyBpZiAoMyAhPT0gbyAmJiA4ICE9PSBvICYmIDIgIT09IG8pIHJldHVybiAxID09PSBvICYmIHcuaXNYTUxEb2MoZSkgfHwgKHQgPSB3LnByb3BGaXhbdF0gfHwgdCwgaSA9IHcucHJvcEhvb2tzW3RdKSwgdm9pZCAwICE9PSBuID8gaSAmJiAic2V0IiBpbiBpICYmIHZvaWQgMCAhPT0gKHIgPSBpLnNldChlLCBuLCB0KSkgPyByIDogZVt0XSA9IG4gOiBpICYmICJnZXQiIGluIGkgJiYgbnVsbCAhPT0gKHIgPSBpLmdldChlLCB0KSkgPyByIDogZVt0XSB9LCBwcm9wSG9va3M6IHsgdGFiSW5kZXg6IHsgZ2V0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHcuZmluZC5hdHRyKGUsICJ0YWJpbmRleCIpOyByZXR1cm4gdCA/IHBhcnNlSW50KHQsIDEwKSA6IHJ0LnRlc3QoZS5ub2RlTmFtZSkgfHwgaXQudGVzdChlLm5vZGVOYW1lKSAmJiBlLmhyZWYgPyAwIDogLTEgfSB9IH0sIHByb3BGaXg6IHsgImZvciI6ICJodG1sRm9yIiwgImNsYXNzIjogImNsYXNzTmFtZSIgfSB9KSwgaC5vcHRTZWxlY3RlZCB8fCAody5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7IGdldDogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBlLnBhcmVudE5vZGU7IHJldHVybiB0ICYmIHQucGFyZW50Tm9kZSAmJiB0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwgbnVsbCB9LCBzZXQ6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5wYXJlbnROb2RlOyB0ICYmICh0LnNlbGVjdGVkSW5kZXgsIHQucGFyZW50Tm9kZSAmJiB0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCkgfSB9KSwgdy5lYWNoKFsidGFiSW5kZXgiLCAicmVhZE9ubHkiLCAibWF4TGVuZ3RoIiwgImNlbGxTcGFjaW5nIiwgImNlbGxQYWRkaW5nIiwgInJvd1NwYW4iLCAiY29sU3BhbiIsICJ1c2VNYXAiLCAiZnJhbWVCb3JkZXIiLCAiY29udGVudEVkaXRhYmxlIl0sIGZ1bmN0aW9uICgpIHsgdy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV0gPSB0aGlzIH0pOyBmdW5jdGlvbiBvdChlKSB7IHJldHVybiAoZS5tYXRjaChJKSB8fCBbXSkuam9pbigiICIpIH0gZnVuY3Rpb24gYXQoZSkgeyByZXR1cm4gZS5nZXRBdHRyaWJ1dGUgJiYgZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgfSBmdW5jdGlvbiB1dChlKSB7IHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZSA6ICJzdHJpbmciID09IHR5cGVvZiBlID8gZS5tYXRjaChJKSB8fCBbXSA6IFtdIH0gdy5mbi5leHRlbmQoeyBhZGRDbGFzczogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4sIHIsIGksIG8sIGEsIHUsIHMgPSAwOyBpZiAoZyhlKSkgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAodCkgeyB3KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLCB0LCBhdCh0aGlzKSkpIH0pOyBpZiAoKHQgPSB1dChlKSkubGVuZ3RoKSB3aGlsZSAobiA9IHRoaXNbcysrXSkgaWYgKGkgPSBhdChuKSwgciA9IDEgPT09IG4ubm9kZVR5cGUgJiYgIiAiICsgb3QoaSkgKyAiICIpIHsgYSA9IDA7IHdoaWxlIChvID0gdFthKytdKSByLmluZGV4T2YoIiAiICsgbyArICIgIikgPCAwICYmIChyICs9IG8gKyAiICIpOyBpICE9PSAodSA9IG90KHIpKSAmJiBuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB1KSB9IHJldHVybiB0aGlzIH0sIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiwgciwgaSwgbywgYSwgdSwgcyA9IDA7IGlmIChnKGUpKSByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICh0KSB7IHcodGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsIHQsIGF0KHRoaXMpKSkgfSk7IGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCAiIik7IGlmICgodCA9IHV0KGUpKS5sZW5ndGgpIHdoaWxlIChuID0gdGhpc1tzKytdKSBpZiAoaSA9IGF0KG4pLCByID0gMSA9PT0gbi5ub2RlVHlwZSAmJiAiICIgKyBvdChpKSArICIgIikgeyBhID0gMDsgd2hpbGUgKG8gPSB0W2ErK10pIHdoaWxlIChyLmluZGV4T2YoIiAiICsgbyArICIgIikgPiAtMSkgciA9IHIucmVwbGFjZSgiICIgKyBvICsgIiAiLCAiICIpOyBpICE9PSAodSA9IG90KHIpKSAmJiBuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB1KSB9IHJldHVybiB0aGlzIH0sIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IHR5cGVvZiBlLCByID0gInN0cmluZyIgPT09IG4gfHwgQXJyYXkuaXNBcnJheShlKTsgcmV0dXJuICJib29sZWFuIiA9PSB0eXBlb2YgdCAmJiByID8gdCA/IHRoaXMuYWRkQ2xhc3MoZSkgOiB0aGlzLnJlbW92ZUNsYXNzKGUpIDogZyhlKSA/IHRoaXMuZWFjaChmdW5jdGlvbiAobikgeyB3KHRoaXMpLnRvZ2dsZUNsYXNzKGUuY2FsbCh0aGlzLCBuLCBhdCh0aGlzKSwgdCksIHQpIH0pIDogdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgdmFyIHQsIGksIG8sIGE7IGlmIChyKSB7IGkgPSAwLCBvID0gdyh0aGlzKSwgYSA9IHV0KGUpOyB3aGlsZSAodCA9IGFbaSsrXSkgby5oYXNDbGFzcyh0KSA/IG8ucmVtb3ZlQ2xhc3ModCkgOiBvLmFkZENsYXNzKHQpIH0gZWxzZSB2b2lkIDAgIT09IGUgJiYgImJvb2xlYW4iICE9PSBuIHx8ICgodCA9IGF0KHRoaXMpKSAmJiBLLnNldCh0aGlzLCAiX19jbGFzc05hbWVfXyIsIHQpLCB0aGlzLnNldEF0dHJpYnV0ZSAmJiB0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0IHx8ICExID09PSBlID8gIiIgOiBLLmdldCh0aGlzLCAiX19jbGFzc05hbWVfXyIpIHx8ICIiKSkgfSkgfSwgaGFzQ2xhc3M6IGZ1bmN0aW9uIChlKSB7IHZhciB0LCBuLCByID0gMDsgdCA9ICIgIiArIGUgKyAiICI7IHdoaWxlIChuID0gdGhpc1tyKytdKSBpZiAoMSA9PT0gbi5ub2RlVHlwZSAmJiAoIiAiICsgb3QoYXQobikpICsgIiAiKS5pbmRleE9mKHQpID4gLTEpIHJldHVybiAhMDsgcmV0dXJuICExIH0gfSk7IHZhciBzdCA9IC9cci9nOyB3LmZuLmV4dGVuZCh7IHZhbDogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4sIHIsIGkgPSB0aGlzWzBdOyB7IGlmIChhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gciA9IGcoZSksIHRoaXMuZWFjaChmdW5jdGlvbiAobikgeyB2YXIgaTsgMSA9PT0gdGhpcy5ub2RlVHlwZSAmJiAobnVsbCA9PSAoaSA9IHIgPyBlLmNhbGwodGhpcywgbiwgdyh0aGlzKS52YWwoKSkgOiBlKSA/IGkgPSAiIiA6ICJudW1iZXIiID09IHR5cGVvZiBpID8gaSArPSAiIiA6IEFycmF5LmlzQXJyYXkoaSkgJiYgKGkgPSB3Lm1hcChpLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gbnVsbCA9PSBlID8gIiIgOiBlICsgIiIgfSkpLCAodCA9IHcudmFsSG9va3NbdGhpcy50eXBlXSB8fCB3LnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pICYmICJzZXQiIGluIHQgJiYgdm9pZCAwICE9PSB0LnNldCh0aGlzLCBpLCAidmFsdWUiKSB8fCAodGhpcy52YWx1ZSA9IGkpKSB9KTsgaWYgKGkpIHJldHVybiAodCA9IHcudmFsSG9va3NbaS50eXBlXSB8fCB3LnZhbEhvb2tzW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pICYmICJnZXQiIGluIHQgJiYgdm9pZCAwICE9PSAobiA9IHQuZ2V0KGksICJ2YWx1ZSIpKSA/IG4gOiAic3RyaW5nIiA9PSB0eXBlb2YgKG4gPSBpLnZhbHVlKSA/IG4ucmVwbGFjZShzdCwgIiIpIDogbnVsbCA9PSBuID8gIiIgOiBuIH0gfSB9KSwgdy5leHRlbmQoeyB2YWxIb29rczogeyBvcHRpb246IHsgZ2V0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHcuZmluZC5hdHRyKGUsICJ2YWx1ZSIpOyByZXR1cm4gbnVsbCAhPSB0ID8gdCA6IG90KHcudGV4dChlKSkgfSB9LCBzZWxlY3Q6IHsgZ2V0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiwgciwgaSA9IGUub3B0aW9ucywgbyA9IGUuc2VsZWN0ZWRJbmRleCwgYSA9ICJzZWxlY3Qtb25lIiA9PT0gZS50eXBlLCB1ID0gYSA/IG51bGwgOiBbXSwgcyA9IGEgPyBvICsgMSA6IGkubGVuZ3RoOyBmb3IgKHIgPSBvIDwgMCA/IHMgOiBhID8gbyA6IDA7IHIgPCBzOyByKyspaWYgKCgobiA9IGlbcl0pLnNlbGVjdGVkIHx8IHIgPT09IG8pICYmICFuLmRpc2FibGVkICYmICghbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFEKG4ucGFyZW50Tm9kZSwgIm9wdGdyb3VwIikpKSB7IGlmICh0ID0gdyhuKS52YWwoKSwgYSkgcmV0dXJuIHQ7IHUucHVzaCh0KSB9IHJldHVybiB1IH0sIHNldDogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIsIGkgPSBlLm9wdGlvbnMsIG8gPSB3Lm1ha2VBcnJheSh0KSwgYSA9IGkubGVuZ3RoOyB3aGlsZSAoYS0tKSAoKHIgPSBpW2FdKS5zZWxlY3RlZCA9IHcuaW5BcnJheSh3LnZhbEhvb2tzLm9wdGlvbi5nZXQociksIG8pID4gLTEpICYmIChuID0gITApOyByZXR1cm4gbiB8fCAoZS5zZWxlY3RlZEluZGV4ID0gLTEpLCBvIH0gfSB9IH0pLCB3LmVhY2goWyJyYWRpbyIsICJjaGVja2JveCJdLCBmdW5jdGlvbiAoKSB7IHcudmFsSG9va3NbdGhpc10gPSB7IHNldDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKEFycmF5LmlzQXJyYXkodCkpIHJldHVybiBlLmNoZWNrZWQgPSB3LmluQXJyYXkodyhlKS52YWwoKSwgdCkgPiAtMSB9IH0sIGguY2hlY2tPbiB8fCAody52YWxIb29rc1t0aGlzXS5nZXQgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gbnVsbCA9PT0gZS5nZXRBdHRyaWJ1dGUoInZhbHVlIikgPyAib24iIDogZS52YWx1ZSB9KSB9KSwgaC5mb2N1c2luID0gIm9uZm9jdXNpbiIgaW4gZTsgdmFyIGx0ID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLCBjdCA9IGZ1bmN0aW9uIChlKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCkgfTsgdy5leHRlbmQody5ldmVudCwgeyB0cmlnZ2VyOiBmdW5jdGlvbiAodCwgbiwgaSwgbykgeyB2YXIgYSwgdSwgcywgbCwgYywgZCwgcCwgaCwgeSA9IFtpIHx8IHJdLCBtID0gZi5jYWxsKHQsICJ0eXBlIikgPyB0LnR5cGUgOiB0LCBiID0gZi5jYWxsKHQsICJuYW1lc3BhY2UiKSA/IHQubmFtZXNwYWNlLnNwbGl0KCIuIikgOiBbXTsgaWYgKHUgPSBoID0gcyA9IGkgPSBpIHx8IHIsIDMgIT09IGkubm9kZVR5cGUgJiYgOCAhPT0gaS5ub2RlVHlwZSAmJiAhbHQudGVzdChtICsgdy5ldmVudC50cmlnZ2VyZWQpICYmIChtLmluZGV4T2YoIi4iKSA+IC0xICYmIChtID0gKGIgPSBtLnNwbGl0KCIuIikpLnNoaWZ0KCksIGIuc29ydCgpKSwgYyA9IG0uaW5kZXhPZigiOiIpIDwgMCAmJiAib24iICsgbSwgdCA9IHRbdy5leHBhbmRvXSA/IHQgOiBuZXcgdy5FdmVudChtLCAib2JqZWN0IiA9PSB0eXBlb2YgdCAmJiB0KSwgdC5pc1RyaWdnZXIgPSBvID8gMiA6IDMsIHQubmFtZXNwYWNlID0gYi5qb2luKCIuIiksIHQucm5hbWVzcGFjZSA9IHQubmFtZXNwYWNlID8gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBiLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIikgOiBudWxsLCB0LnJlc3VsdCA9IHZvaWQgMCwgdC50YXJnZXQgfHwgKHQudGFyZ2V0ID0gaSksIG4gPSBudWxsID09IG4gPyBbdF0gOiB3Lm1ha2VBcnJheShuLCBbdF0pLCBwID0gdy5ldmVudC5zcGVjaWFsW21dIHx8IHt9LCBvIHx8ICFwLnRyaWdnZXIgfHwgITEgIT09IHAudHJpZ2dlci5hcHBseShpLCBuKSkpIHsgaWYgKCFvICYmICFwLm5vQnViYmxlICYmICF2KGkpKSB7IGZvciAobCA9IHAuZGVsZWdhdGVUeXBlIHx8IG0sIGx0LnRlc3QobCArIG0pIHx8ICh1ID0gdS5wYXJlbnROb2RlKTsgdTsgdSA9IHUucGFyZW50Tm9kZSl5LnB1c2godSksIHMgPSB1OyBzID09PSAoaS5vd25lckRvY3VtZW50IHx8IHIpICYmIHkucHVzaChzLmRlZmF1bHRWaWV3IHx8IHMucGFyZW50V2luZG93IHx8IGUpIH0gYSA9IDA7IHdoaWxlICgodSA9IHlbYSsrXSkgJiYgIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkgaCA9IHUsIHQudHlwZSA9IGEgPiAxID8gbCA6IHAuYmluZFR5cGUgfHwgbSwgKGQgPSAoSy5nZXQodSwgImV2ZW50cyIpIHx8IHt9KVt0LnR5cGVdICYmIEsuZ2V0KHUsICJoYW5kbGUiKSkgJiYgZC5hcHBseSh1LCBuKSwgKGQgPSBjICYmIHVbY10pICYmIGQuYXBwbHkgJiYgWSh1KSAmJiAodC5yZXN1bHQgPSBkLmFwcGx5KHUsIG4pLCAhMSA9PT0gdC5yZXN1bHQgJiYgdC5wcmV2ZW50RGVmYXVsdCgpKTsgcmV0dXJuIHQudHlwZSA9IG0sIG8gfHwgdC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSB8fCBwLl9kZWZhdWx0ICYmICExICE9PSBwLl9kZWZhdWx0LmFwcGx5KHkucG9wKCksIG4pIHx8ICFZKGkpIHx8IGMgJiYgZyhpW21dKSAmJiAhdihpKSAmJiAoKHMgPSBpW2NdKSAmJiAoaVtjXSA9IG51bGwpLCB3LmV2ZW50LnRyaWdnZXJlZCA9IG0sIHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAmJiBoLmFkZEV2ZW50TGlzdGVuZXIobSwgY3QpLCBpW21dKCksIHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAmJiBoLnJlbW92ZUV2ZW50TGlzdGVuZXIobSwgY3QpLCB3LmV2ZW50LnRyaWdnZXJlZCA9IHZvaWQgMCwgcyAmJiAoaVtjXSA9IHMpKSwgdC5yZXN1bHQgfSB9LCBzaW11bGF0ZTogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIgPSB3LmV4dGVuZChuZXcgdy5FdmVudCwgbiwgeyB0eXBlOiBlLCBpc1NpbXVsYXRlZDogITAgfSk7IHcuZXZlbnQudHJpZ2dlcihyLCBudWxsLCB0KSB9IH0pLCB3LmZuLmV4dGVuZCh7IHRyaWdnZXI6IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeyB3LmV2ZW50LnRyaWdnZXIoZSwgdCwgdGhpcykgfSkgfSwgdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuID0gdGhpc1swXTsgaWYgKG4pIHJldHVybiB3LmV2ZW50LnRyaWdnZXIoZSwgdCwgbiwgITApIH0gfSksIGguZm9jdXNpbiB8fCB3LmVhY2goeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuID0gZnVuY3Rpb24gKGUpIHsgdy5ldmVudC5zaW11bGF0ZSh0LCBlLnRhcmdldCwgdy5ldmVudC5maXgoZSkpIH07IHcuZXZlbnQuc3BlY2lhbFt0XSA9IHsgc2V0dXA6IGZ1bmN0aW9uICgpIHsgdmFyIHIgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywgaSA9IEsuYWNjZXNzKHIsIHQpOyBpIHx8IHIuYWRkRXZlbnRMaXN0ZW5lcihlLCBuLCAhMCksIEsuYWNjZXNzKHIsIHQsIChpIHx8IDApICsgMSkgfSwgdGVhcmRvd246IGZ1bmN0aW9uICgpIHsgdmFyIHIgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywgaSA9IEsuYWNjZXNzKHIsIHQpIC0gMTsgaSA/IEsuYWNjZXNzKHIsIHQsIGkpIDogKHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCBuLCAhMCksIEsucmVtb3ZlKHIsIHQpKSB9IH0gfSk7IHZhciBmdCA9IC9cW1xdJC8sIGR0ID0gL1xyP1xuL2csIHB0ID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLCBodCA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTsgZnVuY3Rpb24gZ3QoZSwgdCwgbiwgcikgeyB2YXIgaTsgaWYgKEFycmF5LmlzQXJyYXkodCkpIHcuZWFjaCh0LCBmdW5jdGlvbiAodCwgaSkgeyBuIHx8IGZ0LnRlc3QoZSkgPyByKGUsIGkpIDogZ3QoZSArICJbIiArICgib2JqZWN0IiA9PSB0eXBlb2YgaSAmJiBudWxsICE9IGkgPyB0IDogIiIpICsgIl0iLCBpLCBuLCByKSB9KTsgZWxzZSBpZiAobiB8fCAib2JqZWN0IiAhPT0gYih0KSkgcihlLCB0KTsgZWxzZSBmb3IgKGkgaW4gdCkgZ3QoZSArICJbIiArIGkgKyAiXSIsIHRbaV0sIG4sIHIpIH0gdy5wYXJhbSA9IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gW10sIGkgPSBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IGcodCkgPyB0KCkgOiB0OyByW3IubGVuZ3RoXSA9IGVuY29kZVVSSUNvbXBvbmVudChlKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudChudWxsID09IG4gPyAiIiA6IG4pIH07IGlmIChBcnJheS5pc0FycmF5KGUpIHx8IGUuanF1ZXJ5ICYmICF3LmlzUGxhaW5PYmplY3QoZSkpIHcuZWFjaChlLCBmdW5jdGlvbiAoKSB7IGkodGhpcy5uYW1lLCB0aGlzLnZhbHVlKSB9KTsgZWxzZSBmb3IgKG4gaW4gZSkgZ3QobiwgZVtuXSwgdCwgaSk7IHJldHVybiByLmpvaW4oIiYiKSB9LCB3LmZuLmV4dGVuZCh7IHNlcmlhbGl6ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpIH0sIHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoKSB7IHZhciBlID0gdy5wcm9wKHRoaXMsICJlbGVtZW50cyIpOyByZXR1cm4gZSA/IHcubWFrZUFycmF5KGUpIDogdGhpcyB9KS5maWx0ZXIoZnVuY3Rpb24gKCkgeyB2YXIgZSA9IHRoaXMudHlwZTsgcmV0dXJuIHRoaXMubmFtZSAmJiAhdyh0aGlzKS5pcygiOmRpc2FibGVkIikgJiYgaHQudGVzdCh0aGlzLm5vZGVOYW1lKSAmJiAhcHQudGVzdChlKSAmJiAodGhpcy5jaGVja2VkIHx8ICFkZS50ZXN0KGUpKSB9KS5tYXAoZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSB3KHRoaXMpLnZhbCgpOyByZXR1cm4gbnVsbCA9PSBuID8gbnVsbCA6IEFycmF5LmlzQXJyYXkobikgPyB3Lm1hcChuLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4geyBuYW1lOiB0Lm5hbWUsIHZhbHVlOiBlLnJlcGxhY2UoZHQsICJcclxuIikgfSB9KSA6IHsgbmFtZTogdC5uYW1lLCB2YWx1ZTogbi5yZXBsYWNlKGR0LCAiXHJcbiIpIH0gfSkuZ2V0KCkgfSB9KSwgdy5mbi5leHRlbmQoeyB3cmFwQWxsOiBmdW5jdGlvbiAoZSkgeyB2YXIgdDsgcmV0dXJuIHRoaXNbMF0gJiYgKGcoZSkgJiYgKGUgPSBlLmNhbGwodGhpc1swXSkpLCB0ID0gdyhlLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSwgdGhpc1swXS5wYXJlbnROb2RlICYmIHQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLCB0Lm1hcChmdW5jdGlvbiAoKSB7IHZhciBlID0gdGhpczsgd2hpbGUgKGUuZmlyc3RFbGVtZW50Q2hpbGQpIGUgPSBlLmZpcnN0RWxlbWVudENoaWxkOyByZXR1cm4gZSB9KS5hcHBlbmQodGhpcykpLCB0aGlzIH0sIHdyYXBJbm5lcjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGcoZSkgPyB0aGlzLmVhY2goZnVuY3Rpb24gKHQpIHsgdyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsIHQpKSB9KSA6IHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7IHZhciB0ID0gdyh0aGlzKSwgbiA9IHQuY29udGVudHMoKTsgbi5sZW5ndGggPyBuLndyYXBBbGwoZSkgOiB0LmFwcGVuZChlKSB9KSB9LCB3cmFwOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGcoZSk7IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKG4pIHsgdyh0aGlzKS53cmFwQWxsKHQgPyBlLmNhbGwodGhpcywgbikgOiBlKSB9KSB9LCB1bndyYXA6IGZ1bmN0aW9uIChlKSB7IHJldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uICgpIHsgdyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpIH0pLCB0aGlzIH0gfSksIHcuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiAhdy5leHByLnBzZXVkb3MudmlzaWJsZShlKSB9LCB3LmV4cHIucHNldWRvcy52aXNpYmxlID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuICEhKGUub2Zmc2V0V2lkdGggfHwgZS5vZmZzZXRIZWlnaHQgfHwgZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkgfSwgaC5jcmVhdGVIVE1MRG9jdW1lbnQgPSBmdW5jdGlvbiAoKSB7IHZhciBlID0gci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHk7IHJldHVybiBlLmlubmVySFRNTCA9ICI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsIDIgPT09IGUuY2hpbGROb2Rlcy5sZW5ndGggfSgpLCB3LnBhcnNlSFRNTCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7IGlmICgic3RyaW5nIiAhPSB0eXBlb2YgZSkgcmV0dXJuIFtdOyAiYm9vbGVhbiIgPT0gdHlwZW9mIHQgJiYgKG4gPSB0LCB0ID0gITEpOyB2YXIgaSwgbywgYTsgcmV0dXJuIHQgfHwgKGguY3JlYXRlSFRNTERvY3VtZW50ID8gKChpID0gKHQgPSByLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZiA9IHIubG9jYXRpb24uaHJlZiwgdC5oZWFkLmFwcGVuZENoaWxkKGkpKSA6IHQgPSByKSwgbyA9IFMuZXhlYyhlKSwgYSA9ICFuICYmIFtdLCBvID8gW3QuY3JlYXRlRWxlbWVudChvWzFdKV0gOiAobyA9IGJlKFtlXSwgdCwgYSksIGEgJiYgYS5sZW5ndGggJiYgdyhhKS5yZW1vdmUoKSwgdy5tZXJnZShbXSwgby5jaGlsZE5vZGVzKSkgfSwgdy5vZmZzZXQgPSB7IHNldE9mZnNldDogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8sIGEsIHUsIHMsIGwsIGMgPSB3LmNzcyhlLCAicG9zaXRpb24iKSwgZiA9IHcoZSksIGQgPSB7fTsgInN0YXRpYyIgPT09IGMgJiYgKGUuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiKSwgdSA9IGYub2Zmc2V0KCksIG8gPSB3LmNzcyhlLCAidG9wIiksIHMgPSB3LmNzcyhlLCAibGVmdCIpLCAobCA9ICgiYWJzb2x1dGUiID09PSBjIHx8ICJmaXhlZCIgPT09IGMpICYmIChvICsgcykuaW5kZXhPZigiYXV0byIpID4gLTEpID8gKGEgPSAociA9IGYucG9zaXRpb24oKSkudG9wLCBpID0gci5sZWZ0KSA6IChhID0gcGFyc2VGbG9hdChvKSB8fCAwLCBpID0gcGFyc2VGbG9hdChzKSB8fCAwKSwgZyh0KSAmJiAodCA9IHQuY2FsbChlLCBuLCB3LmV4dGVuZCh7fSwgdSkpKSwgbnVsbCAhPSB0LnRvcCAmJiAoZC50b3AgPSB0LnRvcCAtIHUudG9wICsgYSksIG51bGwgIT0gdC5sZWZ0ICYmIChkLmxlZnQgPSB0LmxlZnQgLSB1LmxlZnQgKyBpKSwgInVzaW5nIiBpbiB0ID8gdC51c2luZy5jYWxsKGUsIGQpIDogZi5jc3MoZCkgfSB9LCB3LmZuLmV4dGVuZCh7IG9mZnNldDogZnVuY3Rpb24gKGUpIHsgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2b2lkIDAgPT09IGUgPyB0aGlzIDogdGhpcy5lYWNoKGZ1bmN0aW9uICh0KSB7IHcub2Zmc2V0LnNldE9mZnNldCh0aGlzLCBlLCB0KSB9KTsgdmFyIHQsIG4sIHIgPSB0aGlzWzBdOyBpZiAocikgcmV0dXJuIHIuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPyAodCA9IHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIG4gPSByLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcsIHsgdG9wOiB0LnRvcCArIG4ucGFnZVlPZmZzZXQsIGxlZnQ6IHQubGVmdCArIG4ucGFnZVhPZmZzZXQgfSkgOiB7IHRvcDogMCwgbGVmdDogMCB9IH0sIHBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7IGlmICh0aGlzWzBdKSB7IHZhciBlLCB0LCBuLCByID0gdGhpc1swXSwgaSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07IGlmICgiZml4ZWQiID09PSB3LmNzcyhyLCAicG9zaXRpb24iKSkgdCA9IHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IGVsc2UgeyB0ID0gdGhpcy5vZmZzZXQoKSwgbiA9IHIub3duZXJEb2N1bWVudCwgZSA9IHIub2Zmc2V0UGFyZW50IHx8IG4uZG9jdW1lbnRFbGVtZW50OyB3aGlsZSAoZSAmJiAoZSA9PT0gbi5ib2R5IHx8IGUgPT09IG4uZG9jdW1lbnRFbGVtZW50KSAmJiAic3RhdGljIiA9PT0gdy5jc3MoZSwgInBvc2l0aW9uIikpIGUgPSBlLnBhcmVudE5vZGU7IGUgJiYgZSAhPT0gciAmJiAxID09PSBlLm5vZGVUeXBlICYmICgoaSA9IHcoZSkub2Zmc2V0KCkpLnRvcCArPSB3LmNzcyhlLCAiYm9yZGVyVG9wV2lkdGgiLCAhMCksIGkubGVmdCArPSB3LmNzcyhlLCAiYm9yZGVyTGVmdFdpZHRoIiwgITApKSB9IHJldHVybiB7IHRvcDogdC50b3AgLSBpLnRvcCAtIHcuY3NzKHIsICJtYXJnaW5Ub3AiLCAhMCksIGxlZnQ6IHQubGVmdCAtIGkubGVmdCAtIHcuY3NzKHIsICJtYXJnaW5MZWZ0IiwgITApIH0gfSB9LCBvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uICgpIHsgdmFyIGUgPSB0aGlzLm9mZnNldFBhcmVudDsgd2hpbGUgKGUgJiYgInN0YXRpYyIgPT09IHcuY3NzKGUsICJwb3NpdGlvbiIpKSBlID0gZS5vZmZzZXRQYXJlbnQ7IHJldHVybiBlIHx8IHhlIH0pIH0gfSksIHcuZWFjaCh7IHNjcm9sbExlZnQ6ICJwYWdlWE9mZnNldCIsIHNjcm9sbFRvcDogInBhZ2VZT2Zmc2V0IiB9LCBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9ICJwYWdlWU9mZnNldCIgPT09IHQ7IHcuZm5bZV0gPSBmdW5jdGlvbiAocikgeyByZXR1cm4gXyh0aGlzLCBmdW5jdGlvbiAoZSwgciwgaSkgeyB2YXIgbzsgaWYgKHYoZSkgPyBvID0gZSA6IDkgPT09IGUubm9kZVR5cGUgJiYgKG8gPSBlLmRlZmF1bHRWaWV3KSwgdm9pZCAwID09PSBpKSByZXR1cm4gbyA/IG9bdF0gOiBlW3JdOyBvID8gby5zY3JvbGxUbyhuID8gby5wYWdlWE9mZnNldCA6IGksIG4gPyBpIDogby5wYWdlWU9mZnNldCkgOiBlW3JdID0gaSB9LCBlLCByLCBhcmd1bWVudHMubGVuZ3RoKSB9IH0pLCB3LmVhY2goWyJ0b3AiLCAibGVmdCJdLCBmdW5jdGlvbiAoZSwgdCkgeyB3LmNzc0hvb2tzW3RdID0gemUoaC5waXhlbFBvc2l0aW9uLCBmdW5jdGlvbiAoZSwgbikgeyBpZiAobikgcmV0dXJuIG4gPSBGZShlLCB0KSwgTWUudGVzdChuKSA/IHcoZSkucG9zaXRpb24oKVt0XSArICJweCIgOiBuIH0pIH0pLCB3LmVhY2goeyBIZWlnaHQ6ICJoZWlnaHQiLCBXaWR0aDogIndpZHRoIiB9LCBmdW5jdGlvbiAoZSwgdCkgeyB3LmVhY2goeyBwYWRkaW5nOiAiaW5uZXIiICsgZSwgY29udGVudDogdCwgIiI6ICJvdXRlciIgKyBlIH0sIGZ1bmN0aW9uIChuLCByKSB7IHcuZm5bcl0gPSBmdW5jdGlvbiAoaSwgbykgeyB2YXIgYSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKG4gfHwgImJvb2xlYW4iICE9IHR5cGVvZiBpKSwgdSA9IG4gfHwgKCEwID09PSBpIHx8ICEwID09PSBvID8gIm1hcmdpbiIgOiAiYm9yZGVyIik7IHJldHVybiBfKHRoaXMsIGZ1bmN0aW9uICh0LCBuLCBpKSB7IHZhciBvOyByZXR1cm4gdih0KSA/IDAgPT09IHIuaW5kZXhPZigib3V0ZXIiKSA/IHRbImlubmVyIiArIGVdIDogdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBlXSA6IDkgPT09IHQubm9kZVR5cGUgPyAobyA9IHQuZG9jdW1lbnRFbGVtZW50LCBNYXRoLm1heCh0LmJvZHlbInNjcm9sbCIgKyBlXSwgb1sic2Nyb2xsIiArIGVdLCB0LmJvZHlbIm9mZnNldCIgKyBlXSwgb1sib2Zmc2V0IiArIGVdLCBvWyJjbGllbnQiICsgZV0pKSA6IHZvaWQgMCA9PT0gaSA/IHcuY3NzKHQsIG4sIHUpIDogdy5zdHlsZSh0LCBuLCBpLCB1KSB9LCB0LCBhID8gaSA6IHZvaWQgMCwgYSkgfSB9KSB9KSwgdy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLCBmdW5jdGlvbiAoZSwgdCkgeyB3LmZuW3RdID0gZnVuY3Rpb24gKGUsIG4pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gdGhpcy5vbih0LCBudWxsLCBlLCBuKSA6IHRoaXMudHJpZ2dlcih0KSB9IH0pLCB3LmZuLmV4dGVuZCh7IGhvdmVyOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodCB8fCBlKSB9IH0pLCB3LmZuLmV4dGVuZCh7IGJpbmQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiB0aGlzLm9uKGUsIG51bGwsIHQsIG4pIH0sIHVuYmluZDogZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuIHRoaXMub2ZmKGUsIG51bGwsIHQpIH0sIGRlbGVnYXRlOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyByZXR1cm4gdGhpcy5vbih0LCBlLCBuLCByKSB9LCB1bmRlbGVnYXRlOiBmdW5jdGlvbiAoZSwgdCwgbikgeyByZXR1cm4gMSA9PT0gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMub2ZmKGUsICIqKiIpIDogdGhpcy5vZmYodCwgZSB8fCAiKioiLCBuKSB9IH0pLCB3LnByb3h5ID0gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIsIGk7IGlmICgic3RyaW5nIiA9PSB0eXBlb2YgdCAmJiAobiA9IGVbdF0sIHQgPSBlLCBlID0gbiksIGcoZSkpIHJldHVybiByID0gby5jYWxsKGFyZ3VtZW50cywgMiksIGkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBlLmFwcGx5KHQgfHwgdGhpcywgci5jb25jYXQoby5jYWxsKGFyZ3VtZW50cykpKSB9LCBpLmd1aWQgPSBlLmd1aWQgPSBlLmd1aWQgfHwgdy5ndWlkKysgLCBpIH0sIHcuaG9sZFJlYWR5ID0gZnVuY3Rpb24gKGUpIHsgZSA/IHcucmVhZHlXYWl0KysgOiB3LnJlYWR5KCEwKSB9LCB3LmlzQXJyYXkgPSBBcnJheS5pc0FycmF5LCB3LnBhcnNlSlNPTiA9IEpTT04ucGFyc2UsIHcubm9kZU5hbWUgPSBELCB3LmlzRnVuY3Rpb24gPSBnLCB3LmlzV2luZG93ID0gdiwgdy5jYW1lbENhc2UgPSBRLCB3LnR5cGUgPSBiLCB3Lm5vdyA9IERhdGUubm93LCB3LmlzTnVtZXJpYyA9IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gdy50eXBlKGUpOyByZXR1cm4gKCJudW1iZXIiID09PSB0IHx8ICJzdHJpbmciID09PSB0KSAmJiAhaXNOYU4oZSAtIHBhcnNlRmxvYXQoZSkpIH0sICJmdW5jdGlvbiIgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kICYmIGRlZmluZSgianF1ZXJ5IiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHcgfSk7IHZhciB2dCA9IGUualF1ZXJ5LCB5dCA9IGUuJDsgcmV0dXJuIHcubm9Db25mbGljdCA9IGZ1bmN0aW9uICh0KSB7IHJldHVybiBlLiQgPT09IHcgJiYgKGUuJCA9IHl0KSwgdCAmJiBlLmpRdWVyeSA9PT0gdyAmJiAoZS5qUXVlcnkgPSB2dCksIHcgfSwgdCB8fCAoZS5qUXVlcnkgPSBlLiQgPSB3KSwgdyB9KTs=\"") - packr.PackJSONBytes("./assets/default", "wails.js", "\"Ly8gV2FpbHMgcnVudGltZSBKUwoKKGZ1bmN0aW9uICgpIHsKCXdpbmRvdy53YWlscyA9IHdpbmRvdy53YWlscyB8fCB7CgkJJDoge30KCX07CgoJLyoqKioqKioqKioqKioqKioqKiBVdGlsaXR5IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLy8gLS0tLS0tLS0tLS0tLS0gUmFuZG9tIC0tLS0tLS0tLS0tLS0tCgkvLyBBd2Vzb21lUmFuZG9tCglmdW5jdGlvbiBjcnlwdG9SYW5kb20oKSB7CgkJdmFyIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpOwoJCXJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSlbMF07Cgl9CgoJLy8gTE9MUmFuZG9tCglmdW5jdGlvbiBiYXNpY1JhbmRvbSgpIHsKCQlyZXR1cm4gTWF0aC5yYW5kb20oKSAqIDkwMDcxOTkyNTQ3NDA5OTE7Cgl9CgoJLy8gUGljayBvbmUgYmFzZWQgb24gYnJvd3NlciBjYXBhYmlsaXR5Cgl2YXIgcmFuZG9tRnVuYzsKCWlmICh3aW5kb3cuY3J5cHRvKSB7CgkJcmFuZG9tRnVuYyA9IGNyeXB0b1JhbmRvbTsKCX0gZWxzZSB7CgkJcmFuZG9tRnVuYyA9IGJhc2ljUmFuZG9tOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIElkZW50aWZpZXJzIC0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0aW9uIGlzVmFsaWRJZGVudGlmaWVyKG5hbWUpIHsKCQkvLyBEb24ndCB4c3MgeW91cnNlbGYgOi0pCgkJdHJ5IHsKCQkJbmV3IEZ1bmN0aW9uKCJ2YXIgIiArIG5hbWUpOwoJCQlyZXR1cm4gdHJ1ZQoJCX0gY2F0Y2ggKGUpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIEpTIC0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGFkZFNjcmlwdChqcywgY2FsbGJhY2tJRCkgewoJCWNvbnNvbGUubG9nKCJBZGRpbmcgc2NyaXB0OiAiICsganMpCgkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoJCXNjcmlwdC50ZXh0ID0ganM7CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpOwoJCWNvbnNvbGUubG9nKCJDYWxsaW5nIGJhY2sgd2l0aDoiICsgY2FsbGJhY2tJRCk7CgkJd2luZG93LndhaWxzLmV2ZW50cy5lbWl0KGNhbGxiYWNrSUQpOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIEhUTUwgLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIHNldERvY3VtZW50KGh0bWwpIHsKCQlkb2N1bWVudC5vcGVuKCk7CgkJZG9jdW1lbnQud3JpdGUoaHRtbCk7CgkJZG9jdW1lbnQuY2xvc2UoKTsKCX0KCgkvLyAtLS0tLS0tLS0tLS0tLSBDU1MgLS0tLS0tLS0tLS0tLS0tCgkvLyBBZGFwdGVkIGZyb20gd2VidmlldyAtIHRoYW5rcyB6c2VyZ2UhCglmdW5jdGlvbiBpbmplY3RDU1MoY3NzKSB7CgkJdmFyIGVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwoJCWVsZW0uc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7CgkJaWYgKGVsZW0uc3R5bGVTaGVldCkgewoJCQllbGVtLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzczsKCQl9IGVsc2UgewoJCQllbGVtLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpOwoJCX0KCQl2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKCQloZWFkLmFwcGVuZENoaWxkKGVsZW0pCgl9CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKiogQmluZGluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgl2YXIgYmluZGluZ3NCYXNlUGF0aCA9IHdpbmRvdy53YWlscy4kOwoKCS8vIENyZWF0ZXMgdGhlIHBhdGggZ2l2ZW4gaW4gdGhlIGJpbmRpbmdzIHBhdGgKCWZ1bmN0aW9uIGFkZEJpbmRpbmdQYXRoKHBhdGhTZWN0aW9ucykgewoJCS8vIFN0YXJ0IGF0IHRoZSBiYXNlIHBhdGgKCQl2YXIgY3VycmVudFBhdGggPSBiaW5kaW5nc0Jhc2VQYXRoCgkJLy8gZm9yIGVhY2ggc2VjdGlvbiBvZiB0aGUgZ2l2ZW4gcGF0aAoJCWZvciAodmFyIHNlY3Rpb24gb2YgcGF0aFNlY3Rpb25zKSB7CgoJCQkvLyBJcyBzZWN0aW9uIGEgdmFsaWQgamF2YXNjcmlwdCBpZGVudGlmaWVyPwoJCQlpZiAoIWlzVmFsaWRJZGVudGlmaWVyKHNlY3Rpb24pKSB7CgkJCQl2YXIgZXJyTWVzc2FnZSA9IHNlY3Rpb24gKyAiIGlzIG5vdCBhIHZhbGlkIGphdmFzY3JpcHQgaWRlbnRpZmllci4iCgkJCQl2YXIgZXJyID0gbmV3IEVycm9yKGVyck1lc3NhZ2UpCgkJCQlyZXR1cm4gW251bGwsIGVycl0KCQkJfQoKCQkJLy8gQWRkIGlmIGRvZXNuJ3QgZXhpc3QKCQkJaWYgKCFjdXJyZW50UGF0aFtzZWN0aW9uXSkgewoJCQkJY3VycmVudFBhdGhbc2VjdGlvbl0gPSB7fQoJCQl9CgkJCS8vIHVwZGF0ZSBjdXJyZW50IHBhdGggdG8gbmV3IHBhdGgKCQkJY3VycmVudFBhdGggPSBjdXJyZW50UGF0aFtzZWN0aW9uXQoJCX0KCQlyZXR1cm4gW2N1cnJlbnRQYXRoLCBudWxsXQoJfQoKCWZ1bmN0aW9uIG5ld0JpbmRpbmcoYmluZGluZ05hbWUpIHsKCgkJLy8gR2V0IGFsbCB0aGUgc2VjdGlvbnMgb2YgdGhlIGJpbmRpbmcKCQl2YXIgYmluZGluZ1NlY3Rpb25zID0gYmluZGluZ05hbWUuc3BsaXQoJy4nKTsKCgkJLy8gR2V0IHRoZSBhY3R1YWwgZnVuY3Rpb24vbWV0aG9kIGNhbGwgbmFtZQoJCXZhciBjYWxsTmFtZSA9IGJpbmRpbmdTZWN0aW9ucy5wb3AoKTsKCgkJLy8gQWRkIHBhdGggdG8gYmluZGluZwoJCVtwYXRoVG9CaW5kaW5nLCBlcnJdID0gYWRkQmluZGluZ1BhdGgoYmluZGluZ1NlY3Rpb25zKQoKCQlpZiAoZXJyICE9IG51bGwpIHsKCQkJLy8gV2UgbmVlZCB0byByZXR1cm4gYW4gZXJyb3IKCQkJLy8gd2luZG93LndhaWxzLmxvZy5FcnJvcigiIikKCQkJcmV0dXJuCgkJfQoKCQkvLyBBZGQgYmluZGluZyBjYWxsCgkJcGF0aFRvQmluZGluZ1tjYWxsTmFtZV0gPSBmdW5jdGlvbiAoKSB7CgoJCQkvLyBObyB0aW1lb3V0IGJ5IGRlZmF1bHQKCQkJdmFyIHRpbWVvdXQgPSAwOwoKCQkJLy8gQWN0dWFsIGZ1bmN0aW9uCgkJCWZ1bmN0aW9uIGR5bmFtaWMoKSB7CgkJCQl2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKQoJCQkJcmV0dXJuIGNhbGwoYmluZGluZ05hbWUsIGFyZ3MsIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBBbGxvdyBzZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKG5ld1RpbWVvdXQpIHsKCQkJCXRpbWVvdXQgPSBuZXdUaW1lb3V0OwoJCQl9CgoJCQkvLyBBbGxvdyBnZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5nZXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkgewoJCQkJcmV0dXJuIHRpbWVvdXQ7CgkJCX0KCgkJCXJldHVybiBkeW5hbWljOwoJCX0oKTsKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQ2FsbHMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJdmFyIGNhbGxiYWNrcyA9IHt9OwoKCS8vIENhbGwgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHRvIGNhbGwgdGhlIGJpbmRpbmcgd2l0aCB0aGUKCS8vIGdpdmVuIGRhdGEuIEEgcHJvbWlzZSBpcyByZXR1cm5lZCBhbmQgd2lsbCBiZSBjb21wbGV0ZWQgd2hlbiB0aGUKCS8vIGJhY2tlbmQgcmVzcG9uZHMuIFRoaXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsCgkvLyBvciByZWplY3RlZCBpZiBhbiBlcnJvciBpcyBwYXNzZWQgYmFjay4KCS8vIFRoZXJlIGlzIGEgdGltZW91dCBtZWNoYW5pc20uIElmIHRoZSBjYWxsIGRvZXNuJ3QgcmVzcG9uZCBpbiB0aGUgZ2l2ZW4KCS8vIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlbiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC4KCglmdW5jdGlvbiBjYWxsKGJpbmRpbmdOYW1lLCBkYXRhLCB0aW1lb3V0KSB7CgoJCS8vIFRpbWVvdXQgaW5maW5pdGUgYnkgZGVmYXVsdAoJCWlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dCA9PSB1bmRlZmluZWQpIHsKCQkJdGltZW91dCA9IDA7CgkJfQoKCQkvLyBDcmVhdGUgYSBwcm9taXNlCgkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKCgkJCS8vIENyZWF0ZSBhIHVuaXF1ZSBjYWxsYmFja0lECgkJCXZhciBjYWxsYmFja0lEOwoJCQlkbyB7CgkJCQljYWxsYmFja0lEID0gYmluZGluZ05hbWUgKyAiLSIgKyByYW5kb21GdW5jKCk7CgkJCX0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSkKCgkJCS8vIFNldCB0aW1lb3V0CgkJCWlmICh0aW1lb3V0ID4gMCkgewoJCQkJdmFyIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCQlyZWplY3QoRXJyb3IoIkNhbGwgdG8gIiArIGJpbmRpbmdOYW1lICsgIiB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICIgKyBjYWxsYmFja0lEKSkKCQkJCX0sIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBTdG9yZSBjYWxsYmFjawoJCQljYWxsYmFja3NbY2FsbGJhY2tJRF0gPSB7CgkJCQl0aW1lb3V0SGFuZGxlOiB0aW1lb3V0SGFuZGxlLAoJCQkJcmVqZWN0OiByZWplY3QsCgkJCQlyZXNvbHZlOiByZXNvbHZlCgkJCX0KCQkJdHJ5IHsKCQkJCXZhciBwYXlsb2FkZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpCgkJCQkvLyBDcmVhdGUgdGhlIG1lc3NhZ2UKCQkJCW1lc3NhZ2UgPSB7CgkJCQkJdHlwZTogImNhbGwiLAoJCQkJCWNhbGxiYWNraWQ6IGNhbGxiYWNrSUQsCgkJCQkJcGF5bG9hZDogewoJCQkJCQliaW5kaW5nTmFtZTogYmluZGluZ05hbWUsCgkJCQkJCWRhdGE6IHBheWxvYWRkYXRhLAoJCQkJCX0KCQkJCX0KCgkJCQkvLyBNYWtlIHRoZSBjYWxsCgkJCQl2YXIgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpCgkJCQlleHRlcm5hbC5pbnZva2UocGF5bG9hZCk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWNvbnNvbGUuZXJyb3IoZSkKCQkJfQoJCX0pCgl9CgoKCS8vIENhbGxlZCBieSB0aGUgYmFja2VuZCB0byByZXR1cm4gZGF0YSB0byBhIHByZXZpb3VzbHkgY2FsbGVkCgkvLyBiaW5kaW5nIGludm9jYXRpb24KCWZ1bmN0aW9uIGNhbGxiYWNrKGluY29taW5nTWVzc2FnZSkgewoJCS8vIHdhaWxzLmxvZy5kZWJ1ZygiY2FsbGJhY2sgY2FsbGVkIHdpdGg6ICIgKyBpbmNvbWluZ01lc3NhZ2UpCgkJLy8gUGFyc2UgdGhlIG1lc3NhZ2UKCQl2YXIgbWVzc2FnZQoJCS8vIHdhaWxzLmxvZy5kZWJ1ZyhpbmNvbWluZ01lc3NhZ2UpCgkJdHJ5IHsKCQkJbWVzc2FnZSA9IEpTT04ucGFyc2UoaW5jb21pbmdNZXNzYWdlKQoJCX0gY2F0Y2ggKGUpIHsKCQkJd2FpbHMubG9nLmRlYnVnKCJJbnZhbGlkIEpTT04gcGFzc2VkIHRvIGNhbGxiYWNrOiAiICsgZS5tZXNzYWdlKQoJCQl3YWlscy5sb2cuZGVidWcoIk1lc3NhZ2U6ICIgKyBpbmNvbWluZ01lc3NhZ2UpCgkJCXJldHVybgoJCX0KCQljYWxsYmFja0lEID0gbWVzc2FnZS5jYWxsYmFja2lkCgkJY2FsbGJhY2tEYXRhID0gY2FsbGJhY2tzW2NhbGxiYWNrSURdCgkJaWYgKCFjYWxsYmFja0RhdGEpIHsKCQkJY29uc29sZS5lcnJvcigiQ2FsbGJhY2sgJyIgKyBjYWxsYmFja0lEICsgIicgbm90IHJlZ2lzdGVkISEhIikKCQkJcmV0dXJuCgkJfQoJCWNsZWFyVGltZW91dChjYWxsYmFja0RhdGEudGltZW91dEhhbmRsZSkKCQlkZWxldGUgY2FsbGJhY2tzW2NhbGxiYWNrSURdCgkJaWYgKG1lc3NhZ2UuZXJyb3IpIHsKCQkJcmV0dXJuIGNhbGxiYWNrRGF0YS5yZWplY3QobWVzc2FnZS5lcnJvcikKCQl9CgkJcmV0dXJuIGNhbGxiYWNrRGF0YS5yZXNvbHZlKG1lc3NhZ2UuZGF0YSkKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiogRXZlbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXZhciBldmVudExpc3RlbmVycyA9IHt9OwoKCS8vIFJlZ2lzdGVycyBldmVudCBsaXN0ZW5lcnMKCWZ1bmN0aW9uIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKCQlldmVudExpc3RlbmVyc1tldmVudE5hbWVdID0gZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSB8fCBbXTsKCQlldmVudExpc3RlbmVyc1tldmVudE5hbWVdLnB1c2goY2FsbGJhY2spOwoJfQoKCS8vIG5vdGlmeSBpbmZvcm1zIGZyb250ZW5kIGxpc3RlbmVycyB0aGF0IGFuIGV2ZW50IHdhcyBlbWl0dGVkIHdpdGggdGhlIGdpdmVuIGRhdGEKCWZ1bmN0aW9uIG5vdGlmeShldmVudE5hbWUsIGRhdGEpIHsKCQlpZiAoZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSkgewoJCQlldmVudExpc3RlbmVyc1tldmVudE5hbWVdLmZvckVhY2goZWxlbWVudCA9PiB7CgkJCQl2YXIgcGFyc2VkRGF0YSA9IFtdCgkJCQkvLyBQYXJzZSBkYXRhIGlmIHdlIGhhdmUgaXQKCQkJCWlmIChkYXRhKSB7CgkJCQkJdHJ5IHsKCQkJCQkJcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7CgkJCQkJfSBjYXRjaCAoZSkgewoJCQkJCQl3YWlscy5sb2cuZXJyb3IoIkludmFsaWQgSlNPTiBkYXRhIHNlbnQgdG8gbm90aWZ5LiBFdmVudCBuYW1lID0gIiArIGV2ZW50TmFtZSkKCQkJCQl9CgkJCQl9CgkJCQllbGVtZW50LmFwcGx5KG51bGwsIHBhcnNlZERhdGEpOwoJCQl9KTsKCQl9Cgl9CgoJLy8gZW1pdCBhbiBldmVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBkYXRhCglmdW5jdGlvbiBlbWl0KGV2ZW50TmFtZSkgewoKCQkvLyBDYWxjdWxhdGUgdGhlIGRhdGEKCQl2YXIgZGF0YSA9IEpTT04uc3RyaW5naWZ5KFtdLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykuc2xpY2UoMSkpOwoKCQkvLyBOb3RpZnkgYmFja2VuZAoJCW1lc3NhZ2UgPSB7CgkJCXR5cGU6ICJldmVudCIsCgkJCXBheWxvYWQ6IHsKCQkJCW5hbWU6IGV2ZW50TmFtZSwKCQkJCWRhdGE6IGRhdGEsCgkJCX0KCQl9CgkJZXh0ZXJuYWwuaW52b2tlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTsKCX0KCgkvLyBFdmVudHMgY2FsbHMKCXdpbmRvdy53YWlscy5ldmVudHMgPSB7IGVtaXQ6IGVtaXQsIG9uOiBvbiB9OwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLyoqKioqKioqKioqKioqKioqKioqKioqKiogTG9nZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgkvLyBTZW5kcyBhIGxvZyBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHdpdGggdGhlIGdpdmVuCgkvLyBsZXZlbCArIG1lc3NhZ2UKCWZ1bmN0aW9uIHNlbmRMb2dNZXNzYWdlKGxldmVsLCBtZXNzYWdlKSB7CgoJCS8vIExvZyBNZXNzYWdlCgkJbWVzc2FnZSA9IHsKCQkJdHlwZTogImxvZyIsCgkJCXBheWxvYWQ6IHsKCQkJCWxldmVsOiBsZXZlbCwKCQkJCW1lc3NhZ2U6IG1lc3NhZ2UsCgkJCX0KCQl9CgkJZXh0ZXJuYWwuaW52b2tlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTsKCX0KCglmdW5jdGlvbiBsb2dEZWJ1ZyhtZXNzYWdlKSB7CgkJc2VuZExvZ01lc3NhZ2UoImRlYnVnIiwgbWVzc2FnZSk7Cgl9CglmdW5jdGlvbiBsb2dJbmZvKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiaW5mbyIsIG1lc3NhZ2UpOwoJfQoJZnVuY3Rpb24gbG9nV2FybmluZyhtZXNzYWdlKSB7CgkJc2VuZExvZ01lc3NhZ2UoIndhcm5pbmciLCBtZXNzYWdlKTsKCX0KCWZ1bmN0aW9uIGxvZ0Vycm9yKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiZXJyb3IiLCBtZXNzYWdlKTsKCX0KCWZ1bmN0aW9uIGxvZ0ZhdGFsKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiZmF0YWwiLCBtZXNzYWdlKTsKCX0KCgl3aW5kb3cud2FpbHMubG9nID0gewoJCWRlYnVnOiBsb2dEZWJ1ZywKCQlpbmZvOiBsb2dJbmZvLAoJCXdhcm5pbmc6IGxvZ1dhcm5pbmcsCgkJZXJyb3I6IGxvZ0Vycm9yLAoJCWZhdGFsOiBsb2dGYXRhbCwKCX07CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEV4cG9ydHMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgl3aW5kb3cud2FpbHMuXyA9IHsKCQluZXdCaW5kaW5nOiBuZXdCaW5kaW5nLAoJCWNhbGxiYWNrOiBjYWxsYmFjaywKCQlub3RpZnk6IG5vdGlmeSwKCQlzZW5kTG9nTWVzc2FnZTogc2VuZExvZ01lc3NhZ2UsCgkJY2FsbGJhY2tzOiBjYWxsYmFja3MsCgkJaW5qZWN0Q1NTOiBpbmplY3RDU1MsCgkJYWRkU2NyaXB0OiBhZGRTY3JpcHQsCgkJc2V0RG9jdW1lbnQ6IHNldERvY3VtZW50LAoJfQoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLy8gTm90aWZ5IGJhY2tlbmQgdGhhdCB0aGUgcnVudGltZSBoYXMgZmluaXNoZWQgbG9hZGluZwoJd2luZG93LndhaWxzLmV2ZW50cy5lbWl0KCJ3YWlsczpsb2FkZWQiKTsKCn0pKCk=\"") + packr.PackJSONBytes("./assets/default", "wails.js", "\"Ly8gV2FpbHMgcnVudGltZSBKUwoKKGZ1bmN0aW9uICgpIHsKCXdpbmRvdy53YWlscyA9IHdpbmRvdy53YWlscyB8fCB7CgkJJDoge30KCX07CgoJLyoqKioqKioqKioqKioqKioqKiBVdGlsaXR5IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLy8gLS0tLS0tLS0tLS0tLS0gUmFuZG9tIC0tLS0tLS0tLS0tLS0tCgkvLyBBd2Vzb21lUmFuZG9tCglmdW5jdGlvbiBjcnlwdG9SYW5kb20oKSB7CgkJdmFyIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpOwoJCXJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSlbMF07Cgl9CgoJLy8gTE9MUmFuZG9tCglmdW5jdGlvbiBiYXNpY1JhbmRvbSgpIHsKCQlyZXR1cm4gTWF0aC5yYW5kb20oKSAqIDkwMDcxOTkyNTQ3NDA5OTE7Cgl9CgoJLy8gUGljayBvbmUgYmFzZWQgb24gYnJvd3NlciBjYXBhYmlsaXR5Cgl2YXIgcmFuZG9tRnVuYzsKCWlmICh3aW5kb3cuY3J5cHRvKSB7CgkJcmFuZG9tRnVuYyA9IGNyeXB0b1JhbmRvbTsKCX0gZWxzZSB7CgkJcmFuZG9tRnVuYyA9IGJhc2ljUmFuZG9tOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIElkZW50aWZpZXJzIC0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0aW9uIGlzVmFsaWRJZGVudGlmaWVyKG5hbWUpIHsKCQkvLyBEb24ndCB4c3MgeW91cnNlbGYgOi0pCgkJdHJ5IHsKCQkJbmV3IEZ1bmN0aW9uKCJ2YXIgIiArIG5hbWUpOwoJCQlyZXR1cm4gdHJ1ZQoJCX0gY2F0Y2ggKGUpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIEpTIC0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGFkZFNjcmlwdChqcywgY2FsbGJhY2tJRCkgewoJCWNvbnNvbGUubG9nKCJBZGRpbmcgc2NyaXB0OiAiICsganMpCgkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoJCXNjcmlwdC50ZXh0ID0ganM7CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpOwoJCWNvbnNvbGUubG9nKCJDYWxsaW5nIGJhY2sgd2l0aDoiICsgY2FsbGJhY2tJRCk7CgkJd2luZG93LndhaWxzLmV2ZW50cy5lbWl0KGNhbGxiYWNrSUQpOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIENTUyAtLS0tLS0tLS0tLS0tLS0KCS8vIEFkYXB0ZWQgZnJvbSB3ZWJ2aWV3IC0gdGhhbmtzIHpzZXJnZSEKCWZ1bmN0aW9uIGluamVjdENTUyhjc3MpIHsKCQl2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgkJZWxlbS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTsKCQlpZiAoZWxlbS5zdHlsZVNoZWV0KSB7CgkJCWVsZW0uc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzOwoJCX0gZWxzZSB7CgkJCWVsZW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7CgkJfQoJCXZhciBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwoJCWhlYWQuYXBwZW5kQ2hpbGQoZWxlbSkKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiBCaW5kaW5ncyAqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXZhciBiaW5kaW5nc0Jhc2VQYXRoID0gd2luZG93LndhaWxzLiQ7CgoJLy8gQ3JlYXRlcyB0aGUgcGF0aCBnaXZlbiBpbiB0aGUgYmluZGluZ3MgcGF0aAoJZnVuY3Rpb24gYWRkQmluZGluZ1BhdGgocGF0aFNlY3Rpb25zKSB7CgkJLy8gU3RhcnQgYXQgdGhlIGJhc2UgcGF0aAoJCXZhciBjdXJyZW50UGF0aCA9IGJpbmRpbmdzQmFzZVBhdGgKCQkvLyBmb3IgZWFjaCBzZWN0aW9uIG9mIHRoZSBnaXZlbiBwYXRoCgkJZm9yICh2YXIgc2VjdGlvbiBvZiBwYXRoU2VjdGlvbnMpIHsKCgkJCS8vIElzIHNlY3Rpb24gYSB2YWxpZCBqYXZhc2NyaXB0IGlkZW50aWZpZXI/CgkJCWlmICghaXNWYWxpZElkZW50aWZpZXIoc2VjdGlvbikpIHsKCQkJCXZhciBlcnJNZXNzYWdlID0gc2VjdGlvbiArICIgaXMgbm90IGEgdmFsaWQgamF2YXNjcmlwdCBpZGVudGlmaWVyLiIKCQkJCXZhciBlcnIgPSBuZXcgRXJyb3IoZXJyTWVzc2FnZSkKCQkJCXJldHVybiBbbnVsbCwgZXJyXQoJCQl9CgoJCQkvLyBBZGQgaWYgZG9lc24ndCBleGlzdAoJCQlpZiAoIWN1cnJlbnRQYXRoW3NlY3Rpb25dKSB7CgkJCQljdXJyZW50UGF0aFtzZWN0aW9uXSA9IHt9CgkJCX0KCQkJLy8gdXBkYXRlIGN1cnJlbnQgcGF0aCB0byBuZXcgcGF0aAoJCQljdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoW3NlY3Rpb25dCgkJfQoJCXJldHVybiBbY3VycmVudFBhdGgsIG51bGxdCgl9CgoJZnVuY3Rpb24gbmV3QmluZGluZyhiaW5kaW5nTmFtZSkgewoKCQkvLyBHZXQgYWxsIHRoZSBzZWN0aW9ucyBvZiB0aGUgYmluZGluZwoJCXZhciBiaW5kaW5nU2VjdGlvbnMgPSBiaW5kaW5nTmFtZS5zcGxpdCgnLicpOwoKCQkvLyBHZXQgdGhlIGFjdHVhbCBmdW5jdGlvbi9tZXRob2QgY2FsbCBuYW1lCgkJdmFyIGNhbGxOYW1lID0gYmluZGluZ1NlY3Rpb25zLnBvcCgpOwoKCQkvLyBBZGQgcGF0aCB0byBiaW5kaW5nCgkJW3BhdGhUb0JpbmRpbmcsIGVycl0gPSBhZGRCaW5kaW5nUGF0aChiaW5kaW5nU2VjdGlvbnMpCgoJCWlmIChlcnIgIT0gbnVsbCkgewoJCQkvLyBXZSBuZWVkIHRvIHJldHVybiBhbiBlcnJvcgoJCQlyZXR1cm4gZXJyCgkJfQoKCQkvLyBBZGQgYmluZGluZyBjYWxsCgkJcGF0aFRvQmluZGluZ1tjYWxsTmFtZV0gPSBmdW5jdGlvbiAoKSB7CgoJCQkvLyBObyB0aW1lb3V0IGJ5IGRlZmF1bHQKCQkJdmFyIHRpbWVvdXQgPSAwOwoKCQkJLy8gQWN0dWFsIGZ1bmN0aW9uCgkJCWZ1bmN0aW9uIGR5bmFtaWMoKSB7CgkJCQl2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKQoJCQkJcmV0dXJuIGNhbGwoYmluZGluZ05hbWUsIGFyZ3MsIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBBbGxvdyBzZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKG5ld1RpbWVvdXQpIHsKCQkJCXRpbWVvdXQgPSBuZXdUaW1lb3V0OwoJCQl9CgoJCQkvLyBBbGxvdyBnZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5nZXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkgewoJCQkJcmV0dXJuIHRpbWVvdXQ7CgkJCX0KCgkJCXJldHVybiBkeW5hbWljOwoJCX0oKTsKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQ2FsbHMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJdmFyIGNhbGxiYWNrcyA9IHt9OwoKCS8vIENhbGwgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHRvIGNhbGwgdGhlIGJpbmRpbmcgd2l0aCB0aGUKCS8vIGdpdmVuIGRhdGEuIEEgcHJvbWlzZSBpcyByZXR1cm5lZCBhbmQgd2lsbCBiZSBjb21wbGV0ZWQgd2hlbiB0aGUKCS8vIGJhY2tlbmQgcmVzcG9uZHMuIFRoaXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsCgkvLyBvciByZWplY3RlZCBpZiBhbiBlcnJvciBpcyBwYXNzZWQgYmFjay4KCS8vIFRoZXJlIGlzIGEgdGltZW91dCBtZWNoYW5pc20uIElmIHRoZSBjYWxsIGRvZXNuJ3QgcmVzcG9uZCBpbiB0aGUgZ2l2ZW4KCS8vIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlbiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC4KCglmdW5jdGlvbiBjYWxsKGJpbmRpbmdOYW1lLCBkYXRhLCB0aW1lb3V0KSB7CgoJCS8vIFRpbWVvdXQgaW5maW5pdGUgYnkgZGVmYXVsdAoJCWlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dCA9PSB1bmRlZmluZWQpIHsKCQkJdGltZW91dCA9IDA7CgkJfQoKCQkvLyBDcmVhdGUgYSBwcm9taXNlCgkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKCgkJCS8vIENyZWF0ZSBhIHVuaXF1ZSBjYWxsYmFja0lECgkJCXZhciBjYWxsYmFja0lEOwoJCQlkbyB7CgkJCQljYWxsYmFja0lEID0gYmluZGluZ05hbWUgKyAiLSIgKyByYW5kb21GdW5jKCk7CgkJCX0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSkKCgkJCS8vIFNldCB0aW1lb3V0CgkJCWlmICh0aW1lb3V0ID4gMCkgewoJCQkJdmFyIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCQlyZWplY3QoRXJyb3IoIkNhbGwgdG8gIiArIGJpbmRpbmdOYW1lICsgIiB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICIgKyBjYWxsYmFja0lEKSkKCQkJCX0sIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBTdG9yZSBjYWxsYmFjawoJCQljYWxsYmFja3NbY2FsbGJhY2tJRF0gPSB7CgkJCQl0aW1lb3V0SGFuZGxlOiB0aW1lb3V0SGFuZGxlLAoJCQkJcmVqZWN0OiByZWplY3QsCgkJCQlyZXNvbHZlOiByZXNvbHZlCgkJCX0KCQkJdHJ5IHsKCQkJCXZhciBwYXlsb2FkZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpCgkJCQkvLyBDcmVhdGUgdGhlIG1lc3NhZ2UKCQkJCW1lc3NhZ2UgPSB7CgkJCQkJdHlwZTogImNhbGwiLAoJCQkJCWNhbGxiYWNraWQ6IGNhbGxiYWNrSUQsCgkJCQkJcGF5bG9hZDogewoJCQkJCQliaW5kaW5nTmFtZTogYmluZGluZ05hbWUsCgkJCQkJCWRhdGE6IHBheWxvYWRkYXRhLAoJCQkJCX0KCQkJCX0KCgkJCQkvLyBNYWtlIHRoZSBjYWxsCgkJCQl2YXIgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpCgkJCQlleHRlcm5hbC5pbnZva2UocGF5bG9hZCk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWNvbnNvbGUuZXJyb3IoZSkKCQkJfQoJCX0pCgl9CgoKCS8vIENhbGxlZCBieSB0aGUgYmFja2VuZCB0byByZXR1cm4gZGF0YSB0byBhIHByZXZpb3VzbHkgY2FsbGVkCgkvLyBiaW5kaW5nIGludm9jYXRpb24KCWZ1bmN0aW9uIGNhbGxiYWNrKGluY29taW5nTWVzc2FnZSkgewoJCS8vIFBhcnNlIHRoZSBtZXNzYWdlCgkJdmFyIG1lc3NhZ2UKCQl0cnkgewoJCQltZXNzYWdlID0gSlNPTi5wYXJzZShpbmNvbWluZ01lc3NhZ2UpCgkJfSBjYXRjaCAoZSkgewoJCQl3YWlscy5sb2cuZGVidWcoIkludmFsaWQgSlNPTiBwYXNzZWQgdG8gY2FsbGJhY2s6ICIgKyBlLm1lc3NhZ2UpCgkJCXdhaWxzLmxvZy5kZWJ1ZygiTWVzc2FnZTogIiArIGluY29taW5nTWVzc2FnZSkKCQkJcmV0dXJuCgkJfQoJCWNhbGxiYWNrSUQgPSBtZXNzYWdlLmNhbGxiYWNraWQKCQljYWxsYmFja0RhdGEgPSBjYWxsYmFja3NbY2FsbGJhY2tJRF0KCQlpZiAoIWNhbGxiYWNrRGF0YSkgewoJCQljb25zb2xlLmVycm9yKCJDYWxsYmFjayAnIiArIGNhbGxiYWNrSUQgKyAiJyBub3QgcmVnaXN0ZWQhISEiKQoJCQlyZXR1cm4KCQl9CgkJY2xlYXJUaW1lb3V0KGNhbGxiYWNrRGF0YS50aW1lb3V0SGFuZGxlKQoJCWRlbGV0ZSBjYWxsYmFja3NbY2FsbGJhY2tJRF0KCQlpZiAobWVzc2FnZS5lcnJvcikgewoJCQlyZXR1cm4gY2FsbGJhY2tEYXRhLnJlamVjdChtZXNzYWdlLmVycm9yKQoJCX0KCQlyZXR1cm4gY2FsbGJhY2tEYXRhLnJlc29sdmUobWVzc2FnZS5kYXRhKQoJfQoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBFdmVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJdmFyIGV2ZW50TGlzdGVuZXJzID0ge307CgoJLy8gUmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycwoJZnVuY3Rpb24gb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewoJCWV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdIHx8IFtdOwoJCWV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaChjYWxsYmFjayk7Cgl9CgoJLy8gbm90aWZ5IGluZm9ybXMgZnJvbnRlbmQgbGlzdGVuZXJzIHRoYXQgYW4gZXZlbnQgd2FzIGVtaXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGF0YQoJZnVuY3Rpb24gbm90aWZ5KGV2ZW50TmFtZSwgZGF0YSkgewoJCWlmIChldmVudExpc3RlbmVyc1tldmVudE5hbWVdKSB7CgkJCWV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0uZm9yRWFjaChlbGVtZW50ID0+IHsKCQkJCXZhciBwYXJzZWREYXRhID0gW10KCQkJCS8vIFBhcnNlIGRhdGEgaWYgd2UgaGF2ZSBpdAoJCQkJaWYgKGRhdGEpIHsKCQkJCQl0cnkgewoJCQkJCQlwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkYXRhKTsKCQkJCQl9IGNhdGNoIChlKSB7CgkJCQkJCXdhaWxzLmxvZy5lcnJvcigiSW52YWxpZCBKU09OIGRhdGEgc2VudCB0byBub3RpZnkuIEV2ZW50IG5hbWUgPSAiICsgZXZlbnROYW1lKQoJCQkJCX0KCQkJCX0KCQkJCWVsZW1lbnQuYXBwbHkobnVsbCwgcGFyc2VkRGF0YSk7CgkJCX0pOwoJCX0KCX0KCgkvLyBlbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGRhdGEKCWZ1bmN0aW9uIGVtaXQoZXZlbnROYW1lKSB7CgoJCS8vIENhbGN1bGF0ZSB0aGUgZGF0YQoJCXZhciBkYXRhID0gSlNPTi5zdHJpbmdpZnkoW10uc2xpY2UuYXBwbHkoYXJndW1lbnRzKS5zbGljZSgxKSk7CgoJCS8vIE5vdGlmeSBiYWNrZW5kCgkJbWVzc2FnZSA9IHsKCQkJdHlwZTogImV2ZW50IiwKCQkJcGF5bG9hZDogewoJCQkJbmFtZTogZXZlbnROYW1lLAoJCQkJZGF0YTogZGF0YSwKCQkJfQoJCX0KCQlleHRlcm5hbC5pbnZva2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpOwoJfQoKCS8vIEV2ZW50cyBjYWxscwoJd2luZG93LndhaWxzLmV2ZW50cyA9IHsgZW1pdDogZW1pdCwgb246IG9uIH07CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2dnaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8vIFNlbmRzIGEgbG9nIG1lc3NhZ2UgdG8gdGhlIGJhY2tlbmQgd2l0aCB0aGUgZ2l2ZW4KCS8vIGxldmVsICsgbWVzc2FnZQoJZnVuY3Rpb24gc2VuZExvZ01lc3NhZ2UobGV2ZWwsIG1lc3NhZ2UpIHsKCgkJLy8gTG9nIE1lc3NhZ2UKCQltZXNzYWdlID0gewoJCQl0eXBlOiAibG9nIiwKCQkJcGF5bG9hZDogewoJCQkJbGV2ZWw6IGxldmVsLAoJCQkJbWVzc2FnZTogbWVzc2FnZSwKCQkJfQoJCX0KCQlleHRlcm5hbC5pbnZva2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpOwoJfQoKCWZ1bmN0aW9uIGxvZ0RlYnVnKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiZGVidWciLCBtZXNzYWdlKTsKCX0KCWZ1bmN0aW9uIGxvZ0luZm8obWVzc2FnZSkgewoJCXNlbmRMb2dNZXNzYWdlKCJpbmZvIiwgbWVzc2FnZSk7Cgl9CglmdW5jdGlvbiBsb2dXYXJuaW5nKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgid2FybmluZyIsIG1lc3NhZ2UpOwoJfQoJZnVuY3Rpb24gbG9nRXJyb3IobWVzc2FnZSkgewoJCXNlbmRMb2dNZXNzYWdlKCJlcnJvciIsIG1lc3NhZ2UpOwoJfQoJZnVuY3Rpb24gbG9nRmF0YWwobWVzc2FnZSkgewoJCXNlbmRMb2dNZXNzYWdlKCJmYXRhbCIsIG1lc3NhZ2UpOwoJfQoKCXdpbmRvdy53YWlscy5sb2cgPSB7CgkJZGVidWc6IGxvZ0RlYnVnLAoJCWluZm86IGxvZ0luZm8sCgkJd2FybmluZzogbG9nV2FybmluZywKCQllcnJvcjogbG9nRXJyb3IsCgkJZmF0YWw6IGxvZ0ZhdGFsLAoJfTsKCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiogRXhwb3J0cyAqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXdpbmRvdy53YWlscy5fID0gewoJCW5ld0JpbmRpbmc6IG5ld0JpbmRpbmcsCgkJY2FsbGJhY2s6IGNhbGxiYWNrLAoJCW5vdGlmeTogbm90aWZ5LAoJCXNlbmRMb2dNZXNzYWdlOiBzZW5kTG9nTWVzc2FnZSwKCQljYWxsYmFja3M6IGNhbGxiYWNrcywKCQlpbmplY3RDU1M6IGluamVjdENTUywKCQlhZGRTY3JpcHQ6IGFkZFNjcmlwdCwKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8vIE5vdGlmeSBiYWNrZW5kIHRoYXQgdGhlIHJ1bnRpbWUgaGFzIGZpbmlzaGVkIGxvYWRpbmcKCXdpbmRvdy53YWlscy5ldmVudHMuZW1pdCgid2FpbHM6bG9hZGVkIik7Cgp9KSgp\"") packr.PackJSONBytes("./assets/default", "default.html", "\"PGRpdiBpZD0iYXBwIj48L2Rpdj4=\"") packr.PackJSONBytes("./assets/default", "jquery.3.3.1.min.js", "\"LyohIGpRdWVyeSB2My4zLjEgLWFqYXgsLWFqYXgvanNvbnAsLWFqYXgvbG9hZCwtYWpheC9wYXJzZVhNTCwtYWpheC9zY3JpcHQsLWFqYXgvdmFyL2xvY2F0aW9uLC1hamF4L3Zhci9ub25jZSwtYWpheC92YXIvcnF1ZXJ5LC1hamF4L3hociwtbWFuaXB1bGF0aW9uL19ldmFsVXJsLC1ldmVudC9hamF4LC1lZmZlY3RzLC1lZmZlY3RzL1R3ZWVuLC1lZmZlY3RzL2FuaW1hdGVkU2VsZWN0b3IgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbiAoZSwgdCkgeyAidXNlIHN0cmljdCI7ICJvYmplY3QiID09IHR5cGVvZiBtb2R1bGUgJiYgIm9iamVjdCIgPT0gdHlwZW9mIG1vZHVsZS5leHBvcnRzID8gbW9kdWxlLmV4cG9ydHMgPSBlLmRvY3VtZW50ID8gdChlLCAhMCkgOiBmdW5jdGlvbiAoZSkgeyBpZiAoIWUuZG9jdW1lbnQpIHRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpOyByZXR1cm4gdChlKSB9IDogdChlKSB9KCJ1bmRlZmluZWQiICE9IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiAoZSwgdCkgeyAidXNlIHN0cmljdCI7IHZhciBuID0gW10sIHIgPSBlLmRvY3VtZW50LCBpID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLCBvID0gbi5zbGljZSwgYSA9IG4uY29uY2F0LCB1ID0gbi5wdXNoLCBzID0gbi5pbmRleE9mLCBsID0ge30sIGMgPSBsLnRvU3RyaW5nLCBmID0gbC5oYXNPd25Qcm9wZXJ0eSwgZCA9IGYudG9TdHJpbmcsIHAgPSBkLmNhbGwoT2JqZWN0KSwgaCA9IHt9LCBnID0gZnVuY3Rpb24gZSh0KSB7IHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmICJudW1iZXIiICE9IHR5cGVvZiB0Lm5vZGVUeXBlIH0sIHYgPSBmdW5jdGlvbiBlKHQpIHsgcmV0dXJuIG51bGwgIT0gdCAmJiB0ID09PSB0LndpbmRvdyB9LCB5ID0geyB0eXBlOiAhMCwgc3JjOiAhMCwgbm9Nb2R1bGU6ICEwIH07IGZ1bmN0aW9uIG0oZSwgdCwgbikgeyB2YXIgaSwgbyA9ICh0ID0gdCB8fCByKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsgaWYgKG8udGV4dCA9IGUsIG4pIGZvciAoaSBpbiB5KSBuW2ldICYmIChvW2ldID0gbltpXSk7IHQuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pIH0gZnVuY3Rpb24gYihlKSB7IHJldHVybiBudWxsID09IGUgPyBlICsgIiIgOiAib2JqZWN0IiA9PSB0eXBlb2YgZSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiBlID8gbFtjLmNhbGwoZSldIHx8ICJvYmplY3QiIDogdHlwZW9mIGUgfSB2YXIgeCA9ICIzLjMuMSAtYWpheCwtYWpheC9qc29ucCwtYWpheC9sb2FkLC1hamF4L3BhcnNlWE1MLC1hamF4L3NjcmlwdCwtYWpheC92YXIvbG9jYXRpb24sLWFqYXgvdmFyL25vbmNlLC1hamF4L3Zhci9ycXVlcnksLWFqYXgveGhyLC1tYW5pcHVsYXRpb24vX2V2YWxVcmwsLWV2ZW50L2FqYXgsLWVmZmVjdHMsLWVmZmVjdHMvVHdlZW4sLWVmZmVjdHMvYW5pbWF0ZWRTZWxlY3RvciIsIHcgPSBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gbmV3IHcuZm4uaW5pdChlLCB0KSB9LCBDID0gL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nOyB3LmZuID0gdy5wcm90b3R5cGUgPSB7IGpxdWVyeTogeCwgY29uc3RydWN0b3I6IHcsIGxlbmd0aDogMCwgdG9BcnJheTogZnVuY3Rpb24gKCkgeyByZXR1cm4gby5jYWxsKHRoaXMpIH0sIGdldDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG51bGwgPT0gZSA/IG8uY2FsbCh0aGlzKSA6IGUgPCAwID8gdGhpc1tlICsgdGhpcy5sZW5ndGhdIDogdGhpc1tlXSB9LCBwdXNoU3RhY2s6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gdy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksIGUpOyByZXR1cm4gdC5wcmV2T2JqZWN0ID0gdGhpcywgdCB9LCBlYWNoOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdy5lYWNoKHRoaXMsIGUpIH0sIG1hcDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsIGZ1bmN0aW9uICh0LCBuKSB7IHJldHVybiBlLmNhbGwodCwgbiwgdCkgfSkpIH0sIHNsaWNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnB1c2hTdGFjayhvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIH0sIGZpcnN0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVxKDApIH0sIGxhc3Q6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZXEoLTEpIH0sIGVxOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHRoaXMubGVuZ3RoLCBuID0gK2UgKyAoZSA8IDAgPyB0IDogMCk7IHJldHVybiB0aGlzLnB1c2hTdGFjayhuID49IDAgJiYgbiA8IHQgPyBbdGhpc1tuXV0gOiBbXSkgfSwgZW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpIH0sIHB1c2g6IHUsIHNvcnQ6IG4uc29ydCwgc3BsaWNlOiBuLnNwbGljZSB9LCB3LmV4dGVuZCA9IHcuZm4uZXh0ZW5kID0gZnVuY3Rpb24gKCkgeyB2YXIgZSwgdCwgbiwgciwgaSwgbywgYSA9IGFyZ3VtZW50c1swXSB8fCB7fSwgdSA9IDEsIHMgPSBhcmd1bWVudHMubGVuZ3RoLCBsID0gITE7IGZvciAoImJvb2xlYW4iID09IHR5cGVvZiBhICYmIChsID0gYSwgYSA9IGFyZ3VtZW50c1t1XSB8fCB7fSwgdSsrKSwgIm9iamVjdCIgPT0gdHlwZW9mIGEgfHwgZyhhKSB8fCAoYSA9IHt9KSwgdSA9PT0gcyAmJiAoYSA9IHRoaXMsIHUtLSk7IHUgPCBzOyB1KyspaWYgKG51bGwgIT0gKGUgPSBhcmd1bWVudHNbdV0pKSBmb3IgKHQgaW4gZSkgbiA9IGFbdF0sIGEgIT09IChyID0gZVt0XSkgJiYgKGwgJiYgciAmJiAody5pc1BsYWluT2JqZWN0KHIpIHx8IChpID0gQXJyYXkuaXNBcnJheShyKSkpID8gKGkgPyAoaSA9ICExLCBvID0gbiAmJiBBcnJheS5pc0FycmF5KG4pID8gbiA6IFtdKSA6IG8gPSBuICYmIHcuaXNQbGFpbk9iamVjdChuKSA/IG4gOiB7fSwgYVt0XSA9IHcuZXh0ZW5kKGwsIG8sIHIpKSA6IHZvaWQgMCAhPT0gciAmJiAoYVt0XSA9IHIpKTsgcmV0dXJuIGEgfSwgdy5leHRlbmQoeyBleHBhbmRvOiAialF1ZXJ5IiArICh4ICsgTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywgIiIpLCBpc1JlYWR5OiAhMCwgZXJyb3I6IGZ1bmN0aW9uIChlKSB7IHRocm93IG5ldyBFcnJvcihlKSB9LCBub29wOiBmdW5jdGlvbiAoKSB7IH0sIGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uIChlKSB7IHZhciB0LCBuOyByZXR1cm4gISghZSB8fCAiW29iamVjdCBPYmplY3RdIiAhPT0gYy5jYWxsKGUpKSAmJiAoISh0ID0gaShlKSkgfHwgImZ1bmN0aW9uIiA9PSB0eXBlb2YgKG4gPSBmLmNhbGwodCwgImNvbnN0cnVjdG9yIikgJiYgdC5jb25zdHJ1Y3RvcikgJiYgZC5jYWxsKG4pID09PSBwKSB9LCBpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdDsgZm9yICh0IGluIGUpIHJldHVybiAhMTsgcmV0dXJuICEwIH0sIGdsb2JhbEV2YWw6IGZ1bmN0aW9uIChlKSB7IG0oZSkgfSwgZWFjaDogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIgPSAwOyBpZiAoVChlKSkgeyBmb3IgKG4gPSBlLmxlbmd0aDsgciA8IG47IHIrKylpZiAoITEgPT09IHQuY2FsbChlW3JdLCByLCBlW3JdKSkgYnJlYWsgfSBlbHNlIGZvciAociBpbiBlKSBpZiAoITEgPT09IHQuY2FsbChlW3JdLCByLCBlW3JdKSkgYnJlYWs7IHJldHVybiBlIH0sIHRyaW06IGZ1bmN0aW9uIChlKSB7IHJldHVybiBudWxsID09IGUgPyAiIiA6IChlICsgIiIpLnJlcGxhY2UoQywgIiIpIH0sIG1ha2VBcnJheTogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSB0IHx8IFtdOyByZXR1cm4gbnVsbCAhPSBlICYmIChUKE9iamVjdChlKSkgPyB3Lm1lcmdlKG4sICJzdHJpbmciID09IHR5cGVvZiBlID8gW2VdIDogZSkgOiB1LmNhbGwobiwgZSkpLCBuIH0sIGluQXJyYXk6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBudWxsID09IHQgPyAtMSA6IHMuY2FsbCh0LCBlLCBuKSB9LCBtZXJnZTogZnVuY3Rpb24gKGUsIHQpIHsgZm9yICh2YXIgbiA9ICt0Lmxlbmd0aCwgciA9IDAsIGkgPSBlLmxlbmd0aDsgciA8IG47IHIrKyllW2krK10gPSB0W3JdOyByZXR1cm4gZS5sZW5ndGggPSBpLCBlIH0sIGdyZXA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IGZvciAodmFyIHIsIGkgPSBbXSwgbyA9IDAsIGEgPSBlLmxlbmd0aCwgdSA9ICFuOyBvIDwgYTsgbysrKShyID0gIXQoZVtvXSwgbykpICE9PSB1ICYmIGkucHVzaChlW29dKTsgcmV0dXJuIGkgfSwgbWFwOiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaSwgbyA9IDAsIHUgPSBbXTsgaWYgKFQoZSkpIGZvciAociA9IGUubGVuZ3RoOyBvIDwgcjsgbysrKW51bGwgIT0gKGkgPSB0KGVbb10sIG8sIG4pKSAmJiB1LnB1c2goaSk7IGVsc2UgZm9yIChvIGluIGUpIG51bGwgIT0gKGkgPSB0KGVbb10sIG8sIG4pKSAmJiB1LnB1c2goaSk7IHJldHVybiBhLmFwcGx5KFtdLCB1KSB9LCBndWlkOiAxLCBzdXBwb3J0OiBoIH0pLCAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgKHcuZm5bU3ltYm9sLml0ZXJhdG9yXSA9IG5bU3ltYm9sLml0ZXJhdG9yXSksIHcuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksIGZ1bmN0aW9uIChlLCB0KSB7IGxbIltvYmplY3QgIiArIHQgKyAiXSJdID0gdC50b0xvd2VyQ2FzZSgpIH0pOyBmdW5jdGlvbiBUKGUpIHsgdmFyIHQgPSAhIWUgJiYgImxlbmd0aCIgaW4gZSAmJiBlLmxlbmd0aCwgbiA9IGIoZSk7IHJldHVybiAhZyhlKSAmJiAhdihlKSAmJiAoImFycmF5IiA9PT0gbiB8fCAwID09PSB0IHx8ICJudW1iZXIiID09IHR5cGVvZiB0ICYmIHQgPiAwICYmIHQgLSAxIGluIGUpIH0gdmFyIEUgPSBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiwgciwgaSwgbywgYSwgdSwgcywgbCwgYywgZiwgZCwgcCwgaCwgZywgdiwgeSwgbSwgYiwgeCA9ICJzaXp6bGUiICsgMSAqIG5ldyBEYXRlLCB3ID0gZS5kb2N1bWVudCwgQyA9IDAsIFQgPSAwLCBFID0gYWUoKSwgTiA9IGFlKCksIGsgPSBhZSgpLCBBID0gZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuIGUgPT09IHQgJiYgKGYgPSAhMCksIDAgfSwgRCA9IHt9Lmhhc093blByb3BlcnR5LCBTID0gW10sIEwgPSBTLnBvcCwgaiA9IFMucHVzaCwgcSA9IFMucHVzaCwgTyA9IFMuc2xpY2UsIFAgPSBmdW5jdGlvbiAoZSwgdCkgeyBmb3IgKHZhciBuID0gMCwgciA9IGUubGVuZ3RoOyBuIDwgcjsgbisrKWlmIChlW25dID09PSB0KSByZXR1cm4gbjsgcmV0dXJuIC0xIH0sIEggPSAiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLCBJID0gIltcXHgyMFxcdFxcclxcblxcZl0iLCBSID0gIig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIiwgQiA9ICJcXFsiICsgSSArICIqKCIgKyBSICsgIikoPzoiICsgSSArICIqKFsqXiR8IX5dPz0pIiArIEkgKyAiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiICsgUiArICIpKXwpIiArIEkgKyAiKlxcXSIsIE0gPSAiOigiICsgUiArICIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IiArIEIgKyAiKSopfC4qKVxcKXwpIiwgVyA9IG5ldyBSZWdFeHAoSSArICIrIiwgImciKSwgJCA9IG5ldyBSZWdFeHAoIl4iICsgSSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgSSArICIrJCIsICJnIiksIEYgPSBuZXcgUmVnRXhwKCJeIiArIEkgKyAiKiwiICsgSSArICIqIiksIHogPSBuZXcgUmVnRXhwKCJeIiArIEkgKyAiKihbPit+XXwiICsgSSArICIpIiArIEkgKyAiKiIpLCBfID0gbmV3IFJlZ0V4cCgiPSIgKyBJICsgIiooW15cXF0nXCJdKj8pIiArIEkgKyAiKlxcXSIsICJnIiksIFUgPSBuZXcgUmVnRXhwKE0pLCBWID0gbmV3IFJlZ0V4cCgiXiIgKyBSICsgIiQiKSwgWCA9IHsgSUQ6IG5ldyBSZWdFeHAoIl4jKCIgKyBSICsgIikiKSwgQ0xBU1M6IG5ldyBSZWdFeHAoIl5cXC4oIiArIFIgKyAiKSIpLCBUQUc6IG5ldyBSZWdFeHAoIl4oIiArIFIgKyAifFsqXSkiKSwgQVRUUjogbmV3IFJlZ0V4cCgiXiIgKyBCKSwgUFNFVURPOiBuZXcgUmVnRXhwKCJeIiArIE0pLCBDSElMRDogbmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIEkgKyAiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyBJICsgIiooPzooWystXXwpIiArIEkgKyAiKihcXGQrKXwpKSIgKyBJICsgIipcXCl8KSIsICJpIiksIGJvb2w6IG5ldyBSZWdFeHAoIl4oPzoiICsgSCArICIpJCIsICJpIiksIG5lZWRzQ29udGV4dDogbmV3IFJlZ0V4cCgiXiIgKyBJICsgIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIgKyBJICsgIiooKD86LVxcZCk/XFxkKikiICsgSSArICIqXFwpfCkoPz1bXi1dfCQpIiwgImkiKSB9LCBRID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwgWSA9IC9eaFxkJC9pLCBHID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLCBLID0gL14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLywgSiA9IC9bK35dLywgWiA9IG5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIgKyBJICsgIj98KCIgKyBJICsgIil8LikiLCAiaWciKSwgZWUgPSBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciA9ICIweCIgKyB0IC0gNjU1MzY7IHJldHVybiByICE9PSByIHx8IG4gPyB0IDogciA8IDAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKHIgKyA2NTUzNikgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKHIgPj4gMTAgfCA1NTI5NiwgMTAyMyAmIHIgfCA1NjMyMCkgfSwgdGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywgbmUgPSBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gdCA/ICJcMCIgPT09IGUgPyAiXHVmZmZkIiA6IGUuc2xpY2UoMCwgLTEpICsgIlxcIiArIGUuY2hhckNvZGVBdChlLmxlbmd0aCAtIDEpLnRvU3RyaW5nKDE2KSArICIgIiA6ICJcXCIgKyBlIH0sIHJlID0gZnVuY3Rpb24gKCkgeyBkKCkgfSwgaWUgPSBtZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gITAgPT09IGUuZGlzYWJsZWQgJiYgKCJmb3JtIiBpbiBlIHx8ICJsYWJlbCIgaW4gZSkgfSwgeyBkaXI6ICJwYXJlbnROb2RlIiwgbmV4dDogImxlZ2VuZCIgfSk7IHRyeSB7IHEuYXBwbHkoUyA9IE8uY2FsbCh3LmNoaWxkTm9kZXMpLCB3LmNoaWxkTm9kZXMpLCBTW3cuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlIH0gY2F0Y2ggKGUpIHsgcSA9IHsgYXBwbHk6IFMubGVuZ3RoID8gZnVuY3Rpb24gKGUsIHQpIHsgai5hcHBseShlLCBPLmNhbGwodCkpIH0gOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IGUubGVuZ3RoLCByID0gMDsgd2hpbGUgKGVbbisrXSA9IHRbcisrXSk7IGUubGVuZ3RoID0gbiAtIDEgfSB9IH0gZnVuY3Rpb24gb2UoZSwgdCwgciwgaSkgeyB2YXIgbywgdSwgbCwgYywgZiwgaCwgeSwgbSA9IHQgJiYgdC5vd25lckRvY3VtZW50LCBDID0gdCA/IHQubm9kZVR5cGUgOiA5OyBpZiAociA9IHIgfHwgW10sICJzdHJpbmciICE9IHR5cGVvZiBlIHx8ICFlIHx8IDEgIT09IEMgJiYgOSAhPT0gQyAmJiAxMSAhPT0gQykgcmV0dXJuIHI7IGlmICghaSAmJiAoKHQgPyB0Lm93bmVyRG9jdW1lbnQgfHwgdCA6IHcpICE9PSBwICYmIGQodCksIHQgPSB0IHx8IHAsIGcpKSB7IGlmICgxMSAhPT0gQyAmJiAoZiA9IEsuZXhlYyhlKSkpIGlmIChvID0gZlsxXSkgeyBpZiAoOSA9PT0gQykgeyBpZiAoIShsID0gdC5nZXRFbGVtZW50QnlJZChvKSkpIHJldHVybiByOyBpZiAobC5pZCA9PT0gbykgcmV0dXJuIHIucHVzaChsKSwgciB9IGVsc2UgaWYgKG0gJiYgKGwgPSBtLmdldEVsZW1lbnRCeUlkKG8pKSAmJiBiKHQsIGwpICYmIGwuaWQgPT09IG8pIHJldHVybiByLnB1c2gobCksIHIgfSBlbHNlIHsgaWYgKGZbMl0pIHJldHVybiBxLmFwcGx5KHIsIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLCByOyBpZiAoKG8gPSBmWzNdKSAmJiBuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSByZXR1cm4gcS5hcHBseShyLCB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLCByIH0gaWYgKG4ucXNhICYmICFrW2UgKyAiICJdICYmICghdiB8fCAhdi50ZXN0KGUpKSkgeyBpZiAoMSAhPT0gQykgbSA9IHQsIHkgPSBlOyBlbHNlIGlmICgib2JqZWN0IiAhPT0gdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7IChjID0gdC5nZXRBdHRyaWJ1dGUoImlkIikpID8gYyA9IGMucmVwbGFjZSh0ZSwgbmUpIDogdC5zZXRBdHRyaWJ1dGUoImlkIiwgYyA9IHgpLCB1ID0gKGggPSBhKGUpKS5sZW5ndGg7IHdoaWxlICh1LS0pIGhbdV0gPSAiIyIgKyBjICsgIiAiICsgeWUoaFt1XSk7IHkgPSBoLmpvaW4oIiwiKSwgbSA9IEoudGVzdChlKSAmJiBnZSh0LnBhcmVudE5vZGUpIHx8IHQgfSBpZiAoeSkgdHJ5IHsgcmV0dXJuIHEuYXBwbHkociwgbS5xdWVyeVNlbGVjdG9yQWxsKHkpKSwgciB9IGNhdGNoIChlKSB7IH0gZmluYWxseSB7IGMgPT09IHggJiYgdC5yZW1vdmVBdHRyaWJ1dGUoImlkIikgfSB9IH0gcmV0dXJuIHMoZS5yZXBsYWNlKCQsICIkMSIpLCB0LCByLCBpKSB9IGZ1bmN0aW9uIGFlKCkgeyB2YXIgZSA9IFtdOyBmdW5jdGlvbiB0KG4sIGkpIHsgcmV0dXJuIGUucHVzaChuICsgIiAiKSA+IHIuY2FjaGVMZW5ndGggJiYgZGVsZXRlIHRbZS5zaGlmdCgpXSwgdFtuICsgIiAiXSA9IGkgfSByZXR1cm4gdCB9IGZ1bmN0aW9uIHVlKGUpIHsgcmV0dXJuIGVbeF0gPSAhMCwgZSB9IGZ1bmN0aW9uIHNlKGUpIHsgdmFyIHQgPSBwLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7IHRyeSB7IHJldHVybiAhIWUodCkgfSBjYXRjaCAoZSkgeyByZXR1cm4gITEgfSBmaW5hbGx5IHsgdC5wYXJlbnROb2RlICYmIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSwgdCA9IG51bGwgfSB9IGZ1bmN0aW9uIGxlKGUsIHQpIHsgdmFyIG4gPSBlLnNwbGl0KCJ8IiksIGkgPSBuLmxlbmd0aDsgd2hpbGUgKGktLSkgci5hdHRySGFuZGxlW25baV1dID0gdCB9IGZ1bmN0aW9uIGNlKGUsIHQpIHsgdmFyIG4gPSB0ICYmIGUsIHIgPSBuICYmIDEgPT09IGUubm9kZVR5cGUgJiYgMSA9PT0gdC5ub2RlVHlwZSAmJiBlLnNvdXJjZUluZGV4IC0gdC5zb3VyY2VJbmRleDsgaWYgKHIpIHJldHVybiByOyBpZiAobikgd2hpbGUgKG4gPSBuLm5leHRTaWJsaW5nKSBpZiAobiA9PT0gdCkgcmV0dXJuIC0xOyByZXR1cm4gZSA/IDEgOiAtMSB9IGZ1bmN0aW9uIGZlKGUpIHsgcmV0dXJuIGZ1bmN0aW9uICh0KSB7IHJldHVybiAiaW5wdXQiID09PSB0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgJiYgdC50eXBlID09PSBlIH0gfSBmdW5jdGlvbiBkZShlKSB7IHJldHVybiBmdW5jdGlvbiAodCkgeyB2YXIgbiA9IHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsgcmV0dXJuICgiaW5wdXQiID09PSBuIHx8ICJidXR0b24iID09PSBuKSAmJiB0LnR5cGUgPT09IGUgfSB9IGZ1bmN0aW9uIHBlKGUpIHsgcmV0dXJuIGZ1bmN0aW9uICh0KSB7IHJldHVybiAiZm9ybSIgaW4gdCA/IHQucGFyZW50Tm9kZSAmJiAhMSA9PT0gdC5kaXNhYmxlZCA/ICJsYWJlbCIgaW4gdCA/ICJsYWJlbCIgaW4gdC5wYXJlbnROb2RlID8gdC5wYXJlbnROb2RlLmRpc2FibGVkID09PSBlIDogdC5kaXNhYmxlZCA9PT0gZSA6IHQuaXNEaXNhYmxlZCA9PT0gZSB8fCB0LmlzRGlzYWJsZWQgIT09ICFlICYmIGllKHQpID09PSBlIDogdC5kaXNhYmxlZCA9PT0gZSA6ICJsYWJlbCIgaW4gdCAmJiB0LmRpc2FibGVkID09PSBlIH0gfSBmdW5jdGlvbiBoZShlKSB7IHJldHVybiB1ZShmdW5jdGlvbiAodCkgeyByZXR1cm4gdCA9ICt0LCB1ZShmdW5jdGlvbiAobiwgcikgeyB2YXIgaSwgbyA9IGUoW10sIG4ubGVuZ3RoLCB0KSwgYSA9IG8ubGVuZ3RoOyB3aGlsZSAoYS0tKSBuW2kgPSBvW2FdXSAmJiAobltpXSA9ICEocltpXSA9IG5baV0pKSB9KSB9KSB9IGZ1bmN0aW9uIGdlKGUpIHsgcmV0dXJuIGUgJiYgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgJiYgZSB9IG4gPSBvZS5zdXBwb3J0ID0ge30sIG8gPSBvZS5pc1hNTCA9IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZSAmJiAoZS5vd25lckRvY3VtZW50IHx8IGUpLmRvY3VtZW50RWxlbWVudDsgcmV0dXJuICEhdCAmJiAiSFRNTCIgIT09IHQubm9kZU5hbWUgfSwgZCA9IG9lLnNldERvY3VtZW50ID0gZnVuY3Rpb24gKGUpIHsgdmFyIHQsIGksIGEgPSBlID8gZS5vd25lckRvY3VtZW50IHx8IGUgOiB3OyByZXR1cm4gYSAhPT0gcCAmJiA5ID09PSBhLm5vZGVUeXBlICYmIGEuZG9jdW1lbnRFbGVtZW50ID8gKHAgPSBhLCBoID0gcC5kb2N1bWVudEVsZW1lbnQsIGcgPSAhbyhwKSwgdyAhPT0gcCAmJiAoaSA9IHAuZGVmYXVsdFZpZXcpICYmIGkudG9wICE9PSBpICYmIChpLmFkZEV2ZW50TGlzdGVuZXIgPyBpLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsIHJlLCAhMSkgOiBpLmF0dGFjaEV2ZW50ICYmIGkuYXR0YWNoRXZlbnQoIm9udW5sb2FkIiwgcmUpKSwgbi5hdHRyaWJ1dGVzID0gc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuY2xhc3NOYW1lID0gImkiLCAhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpIH0pLCBuLmdldEVsZW1lbnRzQnlUYWdOYW1lID0gc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuYXBwZW5kQ2hpbGQocC5jcmVhdGVDb21tZW50KCIiKSksICFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoIH0pLCBuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBHLnRlc3QocC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSwgbi5nZXRCeUlkID0gc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGguYXBwZW5kQ2hpbGQoZSkuaWQgPSB4LCAhcC5nZXRFbGVtZW50c0J5TmFtZSB8fCAhcC5nZXRFbGVtZW50c0J5TmFtZSh4KS5sZW5ndGggfSksIG4uZ2V0QnlJZCA/IChyLmZpbHRlci5JRCA9IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5yZXBsYWNlKFosIGVlKTsgcmV0dXJuIGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gdCB9IH0sIHIuZmluZC5JRCA9IGZ1bmN0aW9uIChlLCB0KSB7IGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCAmJiBnKSB7IHZhciBuID0gdC5nZXRFbGVtZW50QnlJZChlKTsgcmV0dXJuIG4gPyBbbl0gOiBbXSB9IH0pIDogKHIuZmlsdGVyLklEID0gZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBlLnJlcGxhY2UoWiwgZWUpOyByZXR1cm4gZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlICYmIGUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsgcmV0dXJuIG4gJiYgbi52YWx1ZSA9PT0gdCB9IH0sIHIuZmluZC5JRCA9IGZ1bmN0aW9uIChlLCB0KSB7IGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCAmJiBnKSB7IHZhciBuLCByLCBpLCBvID0gdC5nZXRFbGVtZW50QnlJZChlKTsgaWYgKG8pIHsgaWYgKChuID0gby5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSAmJiBuLnZhbHVlID09PSBlKSByZXR1cm4gW29dOyBpID0gdC5nZXRFbGVtZW50c0J5TmFtZShlKSwgciA9IDA7IHdoaWxlIChvID0gaVtyKytdKSBpZiAoKG4gPSBvLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpICYmIG4udmFsdWUgPT09IGUpIHJldHVybiBbb10gfSByZXR1cm4gW10gfSB9KSwgci5maW5kLlRBRyA9IG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gInVuZGVmaW5lZCIgIT0gdHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyB0LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpIDogbi5xc2EgPyB0LnF1ZXJ5U2VsZWN0b3JBbGwoZSkgOiB2b2lkIDAgfSA6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gW10sIGkgPSAwLCBvID0gdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTsgaWYgKCIqIiA9PT0gZSkgeyB3aGlsZSAobiA9IG9baSsrXSkgMSA9PT0gbi5ub2RlVHlwZSAmJiByLnB1c2gobik7IHJldHVybiByIH0gcmV0dXJuIG8gfSwgci5maW5kLkNMQVNTID0gbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uIChlLCB0KSB7IGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGcpIHJldHVybiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSkgfSwgeSA9IFtdLCB2ID0gW10sIChuLnFzYSA9IEcudGVzdChwLnF1ZXJ5U2VsZWN0b3JBbGwpKSAmJiAoc2UoZnVuY3Rpb24gKGUpIHsgaC5hcHBlbmRDaGlsZChlKS5pbm5lckhUTUwgPSAiPGEgaWQ9JyIgKyB4ICsgIic+PC9hPjxzZWxlY3QgaWQ9JyIgKyB4ICsgIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsIGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGggJiYgdi5wdXNoKCJbKl4kXT0iICsgSSArICIqKD86Jyd8XCJcIikiKSwgZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoIHx8IHYucHVzaCgiXFxbIiArIEkgKyAiKig/OnZhbHVlfCIgKyBIICsgIikiKSwgZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIgKyB4ICsgIi1dIikubGVuZ3RoIHx8IHYucHVzaCgifj0iKSwgZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aCB8fCB2LnB1c2goIjpjaGVja2VkIiksIGUucXVlcnlTZWxlY3RvckFsbCgiYSMiICsgeCArICIrKiIpLmxlbmd0aCB8fCB2LnB1c2goIi4jLitbK35dIikgfSksIHNlKGZ1bmN0aW9uIChlKSB7IGUuaW5uZXJIVE1MID0gIjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7IHZhciB0ID0gcC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOyB0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJoaWRkZW4iKSwgZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiRCIpLCBlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICYmIHYucHVzaCgibmFtZSIgKyBJICsgIipbKl4kfCF+XT89IiksIDIgIT09IGUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggJiYgdi5wdXNoKCI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiKSwgaC5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZCA9ICEwLCAyICE9PSBlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCAmJiB2LnB1c2goIjplbmFibGVkIiwgIjpkaXNhYmxlZCIpLCBlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSwgdi5wdXNoKCIsLio6IikgfSkpLCAobi5tYXRjaGVzU2VsZWN0b3IgPSBHLnRlc3QobSA9IGgubWF0Y2hlcyB8fCBoLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBoLm1vek1hdGNoZXNTZWxlY3RvciB8fCBoLm9NYXRjaGVzU2VsZWN0b3IgfHwgaC5tc01hdGNoZXNTZWxlY3RvcikpICYmIHNlKGZ1bmN0aW9uIChlKSB7IG4uZGlzY29ubmVjdGVkTWF0Y2ggPSBtLmNhbGwoZSwgIioiKSwgbS5jYWxsKGUsICJbcyE9JyddOngiKSwgeS5wdXNoKCIhPSIsIE0pIH0pLCB2ID0gdi5sZW5ndGggJiYgbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksIHkgPSB5Lmxlbmd0aCAmJiBuZXcgUmVnRXhwKHkuam9pbigifCIpKSwgdCA9IEcudGVzdChoLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSwgYiA9IHQgfHwgRy50ZXN0KGguY29udGFpbnMpID8gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSA5ID09PSBlLm5vZGVUeXBlID8gZS5kb2N1bWVudEVsZW1lbnQgOiBlLCByID0gdCAmJiB0LnBhcmVudE5vZGU7IHJldHVybiBlID09PSByIHx8ICEoIXIgfHwgMSAhPT0gci5ub2RlVHlwZSB8fCAhKG4uY29udGFpbnMgPyBuLmNvbnRhaW5zKHIpIDogZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiAxNiAmIGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKSB9IDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKHQpIHdoaWxlICh0ID0gdC5wYXJlbnROb2RlKSBpZiAodCA9PT0gZSkgcmV0dXJuICEwOyByZXR1cm4gITEgfSwgQSA9IHQgPyBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoZSA9PT0gdCkgcmV0dXJuIGYgPSAhMCwgMDsgdmFyIHIgPSAhZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uOyByZXR1cm4gciB8fCAoMSAmIChyID0gKGUub3duZXJEb2N1bWVudCB8fCBlKSA9PT0gKHQub3duZXJEb2N1bWVudCB8fCB0KSA/IGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkgOiAxKSB8fCAhbi5zb3J0RGV0YWNoZWQgJiYgdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKSA9PT0gciA/IGUgPT09IHAgfHwgZS5vd25lckRvY3VtZW50ID09PSB3ICYmIGIodywgZSkgPyAtMSA6IHQgPT09IHAgfHwgdC5vd25lckRvY3VtZW50ID09PSB3ICYmIGIodywgdCkgPyAxIDogYyA/IFAoYywgZSkgLSBQKGMsIHQpIDogMCA6IDQgJiByID8gLTEgOiAxKSB9IDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKGUgPT09IHQpIHJldHVybiBmID0gITAsIDA7IHZhciBuLCByID0gMCwgaSA9IGUucGFyZW50Tm9kZSwgbyA9IHQucGFyZW50Tm9kZSwgYSA9IFtlXSwgdSA9IFt0XTsgaWYgKCFpIHx8ICFvKSByZXR1cm4gZSA9PT0gcCA/IC0xIDogdCA9PT0gcCA/IDEgOiBpID8gLTEgOiBvID8gMSA6IGMgPyBQKGMsIGUpIC0gUChjLCB0KSA6IDA7IGlmIChpID09PSBvKSByZXR1cm4gY2UoZSwgdCk7IG4gPSBlOyB3aGlsZSAobiA9IG4ucGFyZW50Tm9kZSkgYS51bnNoaWZ0KG4pOyBuID0gdDsgd2hpbGUgKG4gPSBuLnBhcmVudE5vZGUpIHUudW5zaGlmdChuKTsgd2hpbGUgKGFbcl0gPT09IHVbcl0pIHIrKzsgcmV0dXJuIHIgPyBjZShhW3JdLCB1W3JdKSA6IGFbcl0gPT09IHcgPyAtMSA6IHVbcl0gPT09IHcgPyAxIDogMCB9LCBwKSA6IHAgfSwgb2UubWF0Y2hlcyA9IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiBvZShlLCBudWxsLCBudWxsLCB0KSB9LCBvZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoKGUub3duZXJEb2N1bWVudCB8fCBlKSAhPT0gcCAmJiBkKGUpLCB0ID0gdC5yZXBsYWNlKF8sICI9JyQxJ10iKSwgbi5tYXRjaGVzU2VsZWN0b3IgJiYgZyAmJiAha1t0ICsgIiAiXSAmJiAoIXkgfHwgIXkudGVzdCh0KSkgJiYgKCF2IHx8ICF2LnRlc3QodCkpKSB0cnkgeyB2YXIgciA9IG0uY2FsbChlLCB0KTsgaWYgKHIgfHwgbi5kaXNjb25uZWN0ZWRNYXRjaCB8fCBlLmRvY3VtZW50ICYmIDExICE9PSBlLmRvY3VtZW50Lm5vZGVUeXBlKSByZXR1cm4gciB9IGNhdGNoIChlKSB7IH0gcmV0dXJuIG9lKHQsIHAsIG51bGwsIFtlXSkubGVuZ3RoID4gMCB9LCBvZS5jb250YWlucyA9IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiAoZS5vd25lckRvY3VtZW50IHx8IGUpICE9PSBwICYmIGQoZSksIGIoZSwgdCkgfSwgb2UuYXR0ciA9IGZ1bmN0aW9uIChlLCB0KSB7IChlLm93bmVyRG9jdW1lbnQgfHwgZSkgIT09IHAgJiYgZChlKTsgdmFyIGkgPSByLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSwgbyA9IGkgJiYgRC5jYWxsKHIuYXR0ckhhbmRsZSwgdC50b0xvd2VyQ2FzZSgpKSA/IGkoZSwgdCwgIWcpIDogdm9pZCAwOyByZXR1cm4gdm9pZCAwICE9PSBvID8gbyA6IG4uYXR0cmlidXRlcyB8fCAhZyA/IGUuZ2V0QXR0cmlidXRlKHQpIDogKG8gPSBlLmdldEF0dHJpYnV0ZU5vZGUodCkpICYmIG8uc3BlY2lmaWVkID8gby52YWx1ZSA6IG51bGwgfSwgb2UuZXNjYXBlID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIChlICsgIiIpLnJlcGxhY2UodGUsIG5lKSB9LCBvZS5lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHRocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIGUpIH0sIG9lLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgciA9IFtdLCBpID0gMCwgbyA9IDA7IGlmIChmID0gIW4uZGV0ZWN0RHVwbGljYXRlcywgYyA9ICFuLnNvcnRTdGFibGUgJiYgZS5zbGljZSgwKSwgZS5zb3J0KEEpLCBmKSB7IHdoaWxlICh0ID0gZVtvKytdKSB0ID09PSBlW29dICYmIChpID0gci5wdXNoKG8pKTsgd2hpbGUgKGktLSkgZS5zcGxpY2UocltpXSwgMSkgfSByZXR1cm4gYyA9IG51bGwsIGUgfSwgaSA9IG9lLmdldFRleHQgPSBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiA9ICIiLCByID0gMCwgbyA9IGUubm9kZVR5cGU7IGlmIChvKSB7IGlmICgxID09PSBvIHx8IDkgPT09IG8gfHwgMTEgPT09IG8pIHsgaWYgKCJzdHJpbmciID09IHR5cGVvZiBlLnRleHRDb250ZW50KSByZXR1cm4gZS50ZXh0Q29udGVudDsgZm9yIChlID0gZS5maXJzdENoaWxkOyBlOyBlID0gZS5uZXh0U2libGluZyluICs9IGkoZSkgfSBlbHNlIGlmICgzID09PSBvIHx8IDQgPT09IG8pIHJldHVybiBlLm5vZGVWYWx1ZSB9IGVsc2Ugd2hpbGUgKHQgPSBlW3IrK10pIG4gKz0gaSh0KTsgcmV0dXJuIG4gfSwgKHIgPSBvZS5zZWxlY3RvcnMgPSB7IGNhY2hlTGVuZ3RoOiA1MCwgY3JlYXRlUHNldWRvOiB1ZSwgbWF0Y2g6IFgsIGF0dHJIYW5kbGU6IHt9LCBmaW5kOiB7fSwgcmVsYXRpdmU6IHsgIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogITAgfSwgIiAiOiB7IGRpcjogInBhcmVudE5vZGUiIH0sICIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogITAgfSwgIn4iOiB7IGRpcjogInByZXZpb3VzU2libGluZyIgfSB9LCBwcmVGaWx0ZXI6IHsgQVRUUjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGVbMV0gPSBlWzFdLnJlcGxhY2UoWiwgZWUpLCBlWzNdID0gKGVbM10gfHwgZVs0XSB8fCBlWzVdIHx8ICIiKS5yZXBsYWNlKFosIGVlKSwgIn49IiA9PT0gZVsyXSAmJiAoZVszXSA9ICIgIiArIGVbM10gKyAiICIpLCBlLnNsaWNlKDAsIDQpIH0sIENISUxEOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZVsxXSA9IGVbMV0udG9Mb3dlckNhc2UoKSwgIm50aCIgPT09IGVbMV0uc2xpY2UoMCwgMykgPyAoZVszXSB8fCBvZS5lcnJvcihlWzBdKSwgZVs0XSA9ICsoZVs0XSA/IGVbNV0gKyAoZVs2XSB8fCAxKSA6IDIgKiAoImV2ZW4iID09PSBlWzNdIHx8ICJvZGQiID09PSBlWzNdKSksIGVbNV0gPSArKGVbN10gKyBlWzhdIHx8ICJvZGQiID09PSBlWzNdKSkgOiBlWzNdICYmIG9lLmVycm9yKGVbMF0pLCBlIH0sIFBTRVVETzogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4gPSAhZVs2XSAmJiBlWzJdOyByZXR1cm4gWC5DSElMRC50ZXN0KGVbMF0pID8gbnVsbCA6IChlWzNdID8gZVsyXSA9IGVbNF0gfHwgZVs1XSB8fCAiIiA6IG4gJiYgVS50ZXN0KG4pICYmICh0ID0gYShuLCAhMCkpICYmICh0ID0gbi5pbmRleE9mKCIpIiwgbi5sZW5ndGggLSB0KSAtIG4ubGVuZ3RoKSAmJiAoZVswXSA9IGVbMF0uc2xpY2UoMCwgdCksIGVbMl0gPSBuLnNsaWNlKDAsIHQpKSwgZS5zbGljZSgwLCAzKSkgfSB9LCBmaWx0ZXI6IHsgVEFHOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGUucmVwbGFjZShaLCBlZSkudG9Mb3dlckNhc2UoKTsgcmV0dXJuICIqIiA9PT0gZSA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuICEwIH0gOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5ub2RlTmFtZSAmJiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHQgfSB9LCBDTEFTUzogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBFW2UgKyAiICJdOyByZXR1cm4gdCB8fCAodCA9IG5ldyBSZWdFeHAoIihefCIgKyBJICsgIikiICsgZSArICIoIiArIEkgKyAifCQpIikpICYmIEUoZSwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHQudGVzdCgic3RyaW5nIiA9PSB0eXBlb2YgZS5jbGFzc05hbWUgJiYgZS5jbGFzc05hbWUgfHwgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGUuZ2V0QXR0cmlidXRlICYmIGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKSB9KSB9LCBBVFRSOiBmdW5jdGlvbiAoZSwgdCwgbikgeyByZXR1cm4gZnVuY3Rpb24gKHIpIHsgdmFyIGkgPSBvZS5hdHRyKHIsIGUpOyByZXR1cm4gbnVsbCA9PSBpID8gIiE9IiA9PT0gdCA6ICF0IHx8IChpICs9ICIiLCAiPSIgPT09IHQgPyBpID09PSBuIDogIiE9IiA9PT0gdCA/IGkgIT09IG4gOiAiXj0iID09PSB0ID8gbiAmJiAwID09PSBpLmluZGV4T2YobikgOiAiKj0iID09PSB0ID8gbiAmJiBpLmluZGV4T2YobikgPiAtMSA6ICIkPSIgPT09IHQgPyBuICYmIGkuc2xpY2UoLW4ubGVuZ3RoKSA9PT0gbiA6ICJ+PSIgPT09IHQgPyAoIiAiICsgaS5yZXBsYWNlKFcsICIgIikgKyAiICIpLmluZGV4T2YobikgPiAtMSA6ICJ8PSIgPT09IHQgJiYgKGkgPT09IG4gfHwgaS5zbGljZSgwLCBuLmxlbmd0aCArIDEpID09PSBuICsgIi0iKSkgfSB9LCBDSElMRDogZnVuY3Rpb24gKGUsIHQsIG4sIHIsIGkpIHsgdmFyIG8gPSAibnRoIiAhPT0gZS5zbGljZSgwLCAzKSwgYSA9ICJsYXN0IiAhPT0gZS5zbGljZSgtNCksIHUgPSAib2YtdHlwZSIgPT09IHQ7IHJldHVybiAxID09PSByICYmIDAgPT09IGkgPyBmdW5jdGlvbiAoZSkgeyByZXR1cm4gISFlLnBhcmVudE5vZGUgfSA6IGZ1bmN0aW9uICh0LCBuLCBzKSB7IHZhciBsLCBjLCBmLCBkLCBwLCBoLCBnID0gbyAhPT0gYSA/ICJuZXh0U2libGluZyIgOiAicHJldmlvdXNTaWJsaW5nIiwgdiA9IHQucGFyZW50Tm9kZSwgeSA9IHUgJiYgdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBtID0gIXMgJiYgIXUsIGIgPSAhMTsgaWYgKHYpIHsgaWYgKG8pIHsgd2hpbGUgKGcpIHsgZCA9IHQ7IHdoaWxlIChkID0gZFtnXSkgaWYgKHUgPyBkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHkgOiAxID09PSBkLm5vZGVUeXBlKSByZXR1cm4gITE7IGggPSBnID0gIm9ubHkiID09PSBlICYmICFoICYmICJuZXh0U2libGluZyIgfSByZXR1cm4gITAgfSBpZiAoaCA9IFthID8gdi5maXJzdENoaWxkIDogdi5sYXN0Q2hpbGRdLCBhICYmIG0pIHsgYiA9IChwID0gKGwgPSAoYyA9IChmID0gKGQgPSB2KVt4XSB8fCAoZFt4XSA9IHt9KSlbZC51bmlxdWVJRF0gfHwgKGZbZC51bmlxdWVJRF0gPSB7fSkpW2VdIHx8IFtdKVswXSA9PT0gQyAmJiBsWzFdKSAmJiBsWzJdLCBkID0gcCAmJiB2LmNoaWxkTm9kZXNbcF07IHdoaWxlIChkID0gKytwICYmIGQgJiYgZFtnXSB8fCAoYiA9IHAgPSAwKSB8fCBoLnBvcCgpKSBpZiAoMSA9PT0gZC5ub2RlVHlwZSAmJiArK2IgJiYgZCA9PT0gdCkgeyBjW2VdID0gW0MsIHAsIGJdOyBicmVhayB9IH0gZWxzZSBpZiAobSAmJiAoYiA9IHAgPSAobCA9IChjID0gKGYgPSAoZCA9IHQpW3hdIHx8IChkW3hdID0ge30pKVtkLnVuaXF1ZUlEXSB8fCAoZltkLnVuaXF1ZUlEXSA9IHt9KSlbZV0gfHwgW10pWzBdID09PSBDICYmIGxbMV0pLCAhMSA9PT0gYikgd2hpbGUgKGQgPSArK3AgJiYgZCAmJiBkW2ddIHx8IChiID0gcCA9IDApIHx8IGgucG9wKCkpIGlmICgodSA/IGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0geSA6IDEgPT09IGQubm9kZVR5cGUpICYmICsrYiAmJiAobSAmJiAoKGMgPSAoZiA9IGRbeF0gfHwgKGRbeF0gPSB7fSkpW2QudW5pcXVlSURdIHx8IChmW2QudW5pcXVlSURdID0ge30pKVtlXSA9IFtDLCBiXSksIGQgPT09IHQpKSBicmVhazsgcmV0dXJuIChiIC09IGkpID09PSByIHx8IGIgJSByID09IDAgJiYgYiAvIHIgPj0gMCB9IH0gfSwgUFNFVURPOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiwgaSA9IHIucHNldWRvc1tlXSB8fCByLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXSB8fCBvZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgZSk7IHJldHVybiBpW3hdID8gaSh0KSA6IGkubGVuZ3RoID4gMSA/IChuID0gW2UsIGUsICIiLCB0XSwgci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSkgPyB1ZShmdW5jdGlvbiAoZSwgbikgeyB2YXIgciwgbyA9IGkoZSwgdCksIGEgPSBvLmxlbmd0aDsgd2hpbGUgKGEtLSkgZVtyID0gUChlLCBvW2FdKV0gPSAhKG5bcl0gPSBvW2FdKSB9KSA6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBpKGUsIDAsIG4pIH0pIDogaSB9IH0sIHBzZXVkb3M6IHsgbm90OiB1ZShmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IFtdLCBuID0gW10sIHIgPSB1KGUucmVwbGFjZSgkLCAiJDEiKSk7IHJldHVybiByW3hdID8gdWUoZnVuY3Rpb24gKGUsIHQsIG4sIGkpIHsgdmFyIG8sIGEgPSByKGUsIG51bGwsIGksIFtdKSwgdSA9IGUubGVuZ3RoOyB3aGlsZSAodS0tKSAobyA9IGFbdV0pICYmIChlW3VdID0gISh0W3VdID0gbykpIH0pIDogZnVuY3Rpb24gKGUsIGksIG8pIHsgcmV0dXJuIHRbMF0gPSBlLCByKHQsIG51bGwsIG8sIG4pLCB0WzBdID0gbnVsbCwgIW4ucG9wKCkgfSB9KSwgaGFzOiB1ZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIG9lKGUsIHQpLmxlbmd0aCA+IDAgfSB9KSwgY29udGFpbnM6IHVlKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID0gZS5yZXBsYWNlKFosIGVlKSwgZnVuY3Rpb24gKHQpIHsgcmV0dXJuICh0LnRleHRDb250ZW50IHx8IHQuaW5uZXJUZXh0IHx8IGkodCkpLmluZGV4T2YoZSkgPiAtMSB9IH0pLCBsYW5nOiB1ZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gVi50ZXN0KGUgfHwgIiIpIHx8IG9lLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiICsgZSksIGUgPSBlLnJlcGxhY2UoWiwgZWUpLnRvTG93ZXJDYXNlKCksIGZ1bmN0aW9uICh0KSB7IHZhciBuOyBkbyB7IGlmIChuID0gZyA/IHQubGFuZyA6IHQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IHQuZ2V0QXR0cmlidXRlKCJsYW5nIikpIHJldHVybiAobiA9IG4udG9Mb3dlckNhc2UoKSkgPT09IGUgfHwgMCA9PT0gbi5pbmRleE9mKGUgKyAiLSIpIH0gd2hpbGUgKCh0ID0gdC5wYXJlbnROb2RlKSAmJiAxID09PSB0Lm5vZGVUeXBlKTsgcmV0dXJuICExIH0gfSksIHRhcmdldDogZnVuY3Rpb24gKHQpIHsgdmFyIG4gPSBlLmxvY2F0aW9uICYmIGUubG9jYXRpb24uaGFzaDsgcmV0dXJuIG4gJiYgbi5zbGljZSgxKSA9PT0gdC5pZCB9LCByb290OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSA9PT0gaCB9LCBmb2N1czogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUgPT09IHAuYWN0aXZlRWxlbWVudCAmJiAoIXAuaGFzRm9jdXMgfHwgcC5oYXNGb2N1cygpKSAmJiAhIShlLnR5cGUgfHwgZS5ocmVmIHx8IH5lLnRhYkluZGV4KSB9LCBlbmFibGVkOiBwZSghMSksIGRpc2FibGVkOiBwZSghMCksIGNoZWNrZWQ6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyByZXR1cm4gImlucHV0IiA9PT0gdCAmJiAhIWUuY2hlY2tlZCB8fCAib3B0aW9uIiA9PT0gdCAmJiAhIWUuc2VsZWN0ZWQgfSwgc2VsZWN0ZWQ6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLnBhcmVudE5vZGUgJiYgZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsICEwID09PSBlLnNlbGVjdGVkIH0sIGVtcHR5OiBmdW5jdGlvbiAoZSkgeyBmb3IgKGUgPSBlLmZpcnN0Q2hpbGQ7IGU7IGUgPSBlLm5leHRTaWJsaW5nKWlmIChlLm5vZGVUeXBlIDwgNikgcmV0dXJuICExOyByZXR1cm4gITAgfSwgcGFyZW50OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gIXIucHNldWRvcy5lbXB0eShlKSB9LCBoZWFkZXI6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBZLnRlc3QoZS5ub2RlTmFtZSkgfSwgaW5wdXQ6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBRLnRlc3QoZS5ub2RlTmFtZSkgfSwgYnV0dG9uOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsgcmV0dXJuICJpbnB1dCIgPT09IHQgJiYgImJ1dHRvbiIgPT09IGUudHlwZSB8fCAiYnV0dG9uIiA9PT0gdCB9LCB0ZXh0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdDsgcmV0dXJuICJpbnB1dCIgPT09IGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAmJiAidGV4dCIgPT09IGUudHlwZSAmJiAobnVsbCA9PSAodCA9IGUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpIHx8ICJ0ZXh0IiA9PT0gdC50b0xvd2VyQ2FzZSgpKSB9LCBmaXJzdDogaGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gWzBdIH0pLCBsYXN0OiBoZShmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gW3QgLSAxXSB9KSwgZXE6IGhlKGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBbbiA8IDAgPyBuICsgdCA6IG5dIH0pLCBldmVuOiBoZShmdW5jdGlvbiAoZSwgdCkgeyBmb3IgKHZhciBuID0gMDsgbiA8IHQ7IG4gKz0gMillLnB1c2gobik7IHJldHVybiBlIH0pLCBvZGQ6IGhlKGZ1bmN0aW9uIChlLCB0KSB7IGZvciAodmFyIG4gPSAxOyBuIDwgdDsgbiArPSAyKWUucHVzaChuKTsgcmV0dXJuIGUgfSksIGx0OiBoZShmdW5jdGlvbiAoZSwgdCwgbikgeyBmb3IgKHZhciByID0gbiA8IDAgPyBuICsgdCA6IG47IC0tciA+PSAwOyllLnB1c2gocik7IHJldHVybiBlIH0pLCBndDogaGUoZnVuY3Rpb24gKGUsIHQsIG4pIHsgZm9yICh2YXIgciA9IG4gPCAwID8gbiArIHQgOiBuOyArK3IgPCB0OyllLnB1c2gocik7IHJldHVybiBlIH0pIH0gfSkucHNldWRvcy5udGggPSByLnBzZXVkb3MuZXE7IGZvciAodCBpbiB7IHJhZGlvOiAhMCwgY2hlY2tib3g6ICEwLCBmaWxlOiAhMCwgcGFzc3dvcmQ6ICEwLCBpbWFnZTogITAgfSkgci5wc2V1ZG9zW3RdID0gZmUodCk7IGZvciAodCBpbiB7IHN1Ym1pdDogITAsIHJlc2V0OiAhMCB9KSByLnBzZXVkb3NbdF0gPSBkZSh0KTsgZnVuY3Rpb24gdmUoKSB7IH0gdmUucHJvdG90eXBlID0gci5maWx0ZXJzID0gci5wc2V1ZG9zLCByLnNldEZpbHRlcnMgPSBuZXcgdmUsIGEgPSBvZS50b2tlbml6ZSA9IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCBpLCBvLCBhLCB1LCBzLCBsLCBjID0gTltlICsgIiAiXTsgaWYgKGMpIHJldHVybiB0ID8gMCA6IGMuc2xpY2UoMCk7IHUgPSBlLCBzID0gW10sIGwgPSByLnByZUZpbHRlcjsgd2hpbGUgKHUpIHsgbiAmJiAhKGkgPSBGLmV4ZWModSkpIHx8IChpICYmICh1ID0gdS5zbGljZShpWzBdLmxlbmd0aCkgfHwgdSksIHMucHVzaChvID0gW10pKSwgbiA9ICExLCAoaSA9IHouZXhlYyh1KSkgJiYgKG4gPSBpLnNoaWZ0KCksIG8ucHVzaCh7IHZhbHVlOiBuLCB0eXBlOiBpWzBdLnJlcGxhY2UoJCwgIiAiKSB9KSwgdSA9IHUuc2xpY2Uobi5sZW5ndGgpKTsgZm9yIChhIGluIHIuZmlsdGVyKSAhKGkgPSBYW2FdLmV4ZWModSkpIHx8IGxbYV0gJiYgIShpID0gbFthXShpKSkgfHwgKG4gPSBpLnNoaWZ0KCksIG8ucHVzaCh7IHZhbHVlOiBuLCB0eXBlOiBhLCBtYXRjaGVzOiBpIH0pLCB1ID0gdS5zbGljZShuLmxlbmd0aCkpOyBpZiAoIW4pIGJyZWFrIH0gcmV0dXJuIHQgPyB1Lmxlbmd0aCA6IHUgPyBvZS5lcnJvcihlKSA6IE4oZSwgcykuc2xpY2UoMCkgfTsgZnVuY3Rpb24geWUoZSkgeyBmb3IgKHZhciB0ID0gMCwgbiA9IGUubGVuZ3RoLCByID0gIiI7IHQgPCBuOyB0KyspciArPSBlW3RdLnZhbHVlOyByZXR1cm4gciB9IGZ1bmN0aW9uIG1lKGUsIHQsIG4pIHsgdmFyIHIgPSB0LmRpciwgaSA9IHQubmV4dCwgbyA9IGkgfHwgciwgYSA9IG4gJiYgInBhcmVudE5vZGUiID09PSBvLCB1ID0gVCsrOyByZXR1cm4gdC5maXJzdCA/IGZ1bmN0aW9uICh0LCBuLCBpKSB7IHdoaWxlICh0ID0gdFtyXSkgaWYgKDEgPT09IHQubm9kZVR5cGUgfHwgYSkgcmV0dXJuIGUodCwgbiwgaSk7IHJldHVybiAhMSB9IDogZnVuY3Rpb24gKHQsIG4sIHMpIHsgdmFyIGwsIGMsIGYsIGQgPSBbQywgdV07IGlmIChzKSB7IHdoaWxlICh0ID0gdFtyXSkgaWYgKCgxID09PSB0Lm5vZGVUeXBlIHx8IGEpICYmIGUodCwgbiwgcykpIHJldHVybiAhMCB9IGVsc2Ugd2hpbGUgKHQgPSB0W3JdKSBpZiAoMSA9PT0gdC5ub2RlVHlwZSB8fCBhKSBpZiAoZiA9IHRbeF0gfHwgKHRbeF0gPSB7fSksIGMgPSBmW3QudW5pcXVlSURdIHx8IChmW3QudW5pcXVlSURdID0ge30pLCBpICYmIGkgPT09IHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgdCA9IHRbcl0gfHwgdDsgZWxzZSB7IGlmICgobCA9IGNbb10pICYmIGxbMF0gPT09IEMgJiYgbFsxXSA9PT0gdSkgcmV0dXJuIGRbMl0gPSBsWzJdOyBpZiAoY1tvXSA9IGQsIGRbMl0gPSBlKHQsIG4sIHMpKSByZXR1cm4gITAgfSByZXR1cm4gITEgfSB9IGZ1bmN0aW9uIGJlKGUpIHsgcmV0dXJuIGUubGVuZ3RoID4gMSA/IGZ1bmN0aW9uICh0LCBuLCByKSB7IHZhciBpID0gZS5sZW5ndGg7IHdoaWxlIChpLS0pIGlmICghZVtpXSh0LCBuLCByKSkgcmV0dXJuICExOyByZXR1cm4gITAgfSA6IGVbMF0gfSBmdW5jdGlvbiB4ZShlLCB0LCBuKSB7IGZvciAodmFyIHIgPSAwLCBpID0gdC5sZW5ndGg7IHIgPCBpOyByKyspb2UoZSwgdFtyXSwgbik7IHJldHVybiBuIH0gZnVuY3Rpb24gd2UoZSwgdCwgbiwgciwgaSkgeyBmb3IgKHZhciBvLCBhID0gW10sIHUgPSAwLCBzID0gZS5sZW5ndGgsIGwgPSBudWxsICE9IHQ7IHUgPCBzOyB1KyspKG8gPSBlW3VdKSAmJiAobiAmJiAhbihvLCByLCBpKSB8fCAoYS5wdXNoKG8pLCBsICYmIHQucHVzaCh1KSkpOyByZXR1cm4gYSB9IGZ1bmN0aW9uIENlKGUsIHQsIG4sIHIsIGksIG8pIHsgcmV0dXJuIHIgJiYgIXJbeF0gJiYgKHIgPSBDZShyKSksIGkgJiYgIWlbeF0gJiYgKGkgPSBDZShpLCBvKSksIHVlKGZ1bmN0aW9uIChvLCBhLCB1LCBzKSB7IHZhciBsLCBjLCBmLCBkID0gW10sIHAgPSBbXSwgaCA9IGEubGVuZ3RoLCBnID0gbyB8fCB4ZSh0IHx8ICIqIiwgdS5ub2RlVHlwZSA/IFt1XSA6IHUsIFtdKSwgdiA9ICFlIHx8ICFvICYmIHQgPyBnIDogd2UoZywgZCwgZSwgdSwgcyksIHkgPSBuID8gaSB8fCAobyA/IGUgOiBoIHx8IHIpID8gW10gOiBhIDogdjsgaWYgKG4gJiYgbih2LCB5LCB1LCBzKSwgcikgeyBsID0gd2UoeSwgcCksIHIobCwgW10sIHUsIHMpLCBjID0gbC5sZW5ndGg7IHdoaWxlIChjLS0pIChmID0gbFtjXSkgJiYgKHlbcFtjXV0gPSAhKHZbcFtjXV0gPSBmKSkgfSBpZiAobykgeyBpZiAoaSB8fCBlKSB7IGlmIChpKSB7IGwgPSBbXSwgYyA9IHkubGVuZ3RoOyB3aGlsZSAoYy0tKSAoZiA9IHlbY10pICYmIGwucHVzaCh2W2NdID0gZik7IGkobnVsbCwgeSA9IFtdLCBsLCBzKSB9IGMgPSB5Lmxlbmd0aDsgd2hpbGUgKGMtLSkgKGYgPSB5W2NdKSAmJiAobCA9IGkgPyBQKG8sIGYpIDogZFtjXSkgPiAtMSAmJiAob1tsXSA9ICEoYVtsXSA9IGYpKSB9IH0gZWxzZSB5ID0gd2UoeSA9PT0gYSA/IHkuc3BsaWNlKGgsIHkubGVuZ3RoKSA6IHkpLCBpID8gaShudWxsLCBhLCB5LCBzKSA6IHEuYXBwbHkoYSwgeSkgfSkgfSBmdW5jdGlvbiBUZShlKSB7IGZvciAodmFyIHQsIG4sIGksIG8gPSBlLmxlbmd0aCwgYSA9IHIucmVsYXRpdmVbZVswXS50eXBlXSwgdSA9IGEgfHwgci5yZWxhdGl2ZVsiICJdLCBzID0gYSA/IDEgOiAwLCBjID0gbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUgPT09IHQgfSwgdSwgITApLCBmID0gbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIFAodCwgZSkgPiAtMSB9LCB1LCAhMCksIGQgPSBbZnVuY3Rpb24gKGUsIG4sIHIpIHsgdmFyIGkgPSAhYSAmJiAociB8fCBuICE9PSBsKSB8fCAoKHQgPSBuKS5ub2RlVHlwZSA/IGMoZSwgbiwgcikgOiBmKGUsIG4sIHIpKTsgcmV0dXJuIHQgPSBudWxsLCBpIH1dOyBzIDwgbzsgcysrKWlmIChuID0gci5yZWxhdGl2ZVtlW3NdLnR5cGVdKSBkID0gW21lKGJlKGQpLCBuKV07IGVsc2UgeyBpZiAoKG4gPSByLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsIGVbc10ubWF0Y2hlcykpW3hdKSB7IGZvciAoaSA9ICsrczsgaSA8IG87IGkrKylpZiAoci5yZWxhdGl2ZVtlW2ldLnR5cGVdKSBicmVhazsgcmV0dXJuIENlKHMgPiAxICYmIGJlKGQpLCBzID4gMSAmJiB5ZShlLnNsaWNlKDAsIHMgLSAxKS5jb25jYXQoeyB2YWx1ZTogIiAiID09PSBlW3MgLSAyXS50eXBlID8gIioiIDogIiIgfSkpLnJlcGxhY2UoJCwgIiQxIiksIG4sIHMgPCBpICYmIFRlKGUuc2xpY2UocywgaSkpLCBpIDwgbyAmJiBUZShlID0gZS5zbGljZShpKSksIGkgPCBvICYmIHllKGUpKSB9IGQucHVzaChuKSB9IHJldHVybiBiZShkKSB9IGZ1bmN0aW9uIEVlKGUsIHQpIHsgdmFyIG4gPSB0Lmxlbmd0aCA+IDAsIGkgPSBlLmxlbmd0aCA+IDAsIG8gPSBmdW5jdGlvbiAobywgYSwgdSwgcywgYykgeyB2YXIgZiwgaCwgdiwgeSA9IDAsIG0gPSAiMCIsIGIgPSBvICYmIFtdLCB4ID0gW10sIHcgPSBsLCBUID0gbyB8fCBpICYmIHIuZmluZC5UQUcoIioiLCBjKSwgRSA9IEMgKz0gbnVsbCA9PSB3ID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgLjEsIE4gPSBULmxlbmd0aDsgZm9yIChjICYmIChsID0gYSA9PT0gcCB8fCBhIHx8IGMpOyBtICE9PSBOICYmIG51bGwgIT0gKGYgPSBUW21dKTsgbSsrKSB7IGlmIChpICYmIGYpIHsgaCA9IDAsIGEgfHwgZi5vd25lckRvY3VtZW50ID09PSBwIHx8IChkKGYpLCB1ID0gIWcpOyB3aGlsZSAodiA9IGVbaCsrXSkgaWYgKHYoZiwgYSB8fCBwLCB1KSkgeyBzLnB1c2goZik7IGJyZWFrIH0gYyAmJiAoQyA9IEUpIH0gbiAmJiAoKGYgPSAhdiAmJiBmKSAmJiB5LS0gLCBvICYmIGIucHVzaChmKSkgfSBpZiAoeSArPSBtLCBuICYmIG0gIT09IHkpIHsgaCA9IDA7IHdoaWxlICh2ID0gdFtoKytdKSB2KGIsIHgsIGEsIHUpOyBpZiAobykgeyBpZiAoeSA+IDApIHdoaWxlIChtLS0pIGJbbV0gfHwgeFttXSB8fCAoeFttXSA9IEwuY2FsbChzKSk7IHggPSB3ZSh4KSB9IHEuYXBwbHkocywgeCksIGMgJiYgIW8gJiYgeC5sZW5ndGggPiAwICYmIHkgKyB0Lmxlbmd0aCA+IDEgJiYgb2UudW5pcXVlU29ydChzKSB9IHJldHVybiBjICYmIChDID0gRSwgbCA9IHcpLCBiIH07IHJldHVybiBuID8gdWUobykgOiBvIH0gcmV0dXJuIHUgPSBvZS5jb21waWxlID0gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIgPSBbXSwgaSA9IFtdLCBvID0ga1tlICsgIiAiXTsgaWYgKCFvKSB7IHQgfHwgKHQgPSBhKGUpKSwgbiA9IHQubGVuZ3RoOyB3aGlsZSAobi0tKSAobyA9IFRlKHRbbl0pKVt4XSA/IHIucHVzaChvKSA6IGkucHVzaChvKTsgKG8gPSBrKGUsIEVlKGksIHIpKSkuc2VsZWN0b3IgPSBlIH0gcmV0dXJuIG8gfSwgcyA9IG9lLnNlbGVjdCA9IGZ1bmN0aW9uIChlLCB0LCBuLCBpKSB7IHZhciBvLCBzLCBsLCBjLCBmLCBkID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgZSAmJiBlLCBwID0gIWkgJiYgYShlID0gZC5zZWxlY3RvciB8fCBlKTsgaWYgKG4gPSBuIHx8IFtdLCAxID09PSBwLmxlbmd0aCkgeyBpZiAoKHMgPSBwWzBdID0gcFswXS5zbGljZSgwKSkubGVuZ3RoID4gMiAmJiAiSUQiID09PSAobCA9IHNbMF0pLnR5cGUgJiYgOSA9PT0gdC5ub2RlVHlwZSAmJiBnICYmIHIucmVsYXRpdmVbc1sxXS50eXBlXSkgeyBpZiAoISh0ID0gKHIuZmluZC5JRChsLm1hdGNoZXNbMF0ucmVwbGFjZShaLCBlZSksIHQpIHx8IFtdKVswXSkpIHJldHVybiBuOyBkICYmICh0ID0gdC5wYXJlbnROb2RlKSwgZSA9IGUuc2xpY2Uocy5zaGlmdCgpLnZhbHVlLmxlbmd0aCkgfSBvID0gWC5uZWVkc0NvbnRleHQudGVzdChlKSA/IDAgOiBzLmxlbmd0aDsgd2hpbGUgKG8tLSkgeyBpZiAobCA9IHNbb10sIHIucmVsYXRpdmVbYyA9IGwudHlwZV0pIGJyZWFrOyBpZiAoKGYgPSByLmZpbmRbY10pICYmIChpID0gZihsLm1hdGNoZXNbMF0ucmVwbGFjZShaLCBlZSksIEoudGVzdChzWzBdLnR5cGUpICYmIGdlKHQucGFyZW50Tm9kZSkgfHwgdCkpKSB7IGlmIChzLnNwbGljZShvLCAxKSwgIShlID0gaS5sZW5ndGggJiYgeWUocykpKSByZXR1cm4gcS5hcHBseShuLCBpKSwgbjsgYnJlYWsgfSB9IH0gcmV0dXJuIChkIHx8IHUoZSwgcCkpKGksIHQsICFnLCBuLCAhdCB8fCBKLnRlc3QoZSkgJiYgZ2UodC5wYXJlbnROb2RlKSB8fCB0KSwgbiB9LCBuLnNvcnRTdGFibGUgPSB4LnNwbGl0KCIiKS5zb3J0KEEpLmpvaW4oIiIpID09PSB4LCBuLmRldGVjdER1cGxpY2F0ZXMgPSAhIWYsIGQoKSwgbi5zb3J0RGV0YWNoZWQgPSBzZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gMSAmIGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKSB9KSwgc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iLCAiIyIgPT09IGUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSB9KSB8fCBsZSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uIChlLCB0LCBuKSB7IGlmICghbikgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsICJ0eXBlIiA9PT0gdC50b0xvd2VyQ2FzZSgpID8gMSA6IDIpIH0pLCBuLmF0dHJpYnV0ZXMgJiYgc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaW5uZXJIVE1MID0gIjxpbnB1dC8+IiwgZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCAiIiksICIiID09PSBlLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpIH0pIHx8IGxlKCJ2YWx1ZSIsIGZ1bmN0aW9uIChlLCB0LCBuKSB7IGlmICghbiAmJiAiaW5wdXQiID09PSBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHJldHVybiBlLmRlZmF1bHRWYWx1ZSB9KSwgc2UoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG51bGwgPT0gZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgfSkgfHwgbGUoSCwgZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHI7IGlmICghbikgcmV0dXJuICEwID09PSBlW3RdID8gdC50b0xvd2VyQ2FzZSgpIDogKHIgPSBlLmdldEF0dHJpYnV0ZU5vZGUodCkpICYmIHIuc3BlY2lmaWVkID8gci52YWx1ZSA6IG51bGwgfSksIG9lIH0oZSk7IHcuZmluZCA9IEUsIHcuZXhwciA9IEUuc2VsZWN0b3JzLCB3LmV4cHJbIjoiXSA9IHcuZXhwci5wc2V1ZG9zLCB3LnVuaXF1ZVNvcnQgPSB3LnVuaXF1ZSA9IEUudW5pcXVlU29ydCwgdy50ZXh0ID0gRS5nZXRUZXh0LCB3LmlzWE1MRG9jID0gRS5pc1hNTCwgdy5jb250YWlucyA9IEUuY29udGFpbnMsIHcuZXNjYXBlU2VsZWN0b3IgPSBFLmVzY2FwZTsgdmFyIE4gPSBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciA9IFtdLCBpID0gdm9pZCAwICE9PSBuOyB3aGlsZSAoKGUgPSBlW3RdKSAmJiA5ICE9PSBlLm5vZGVUeXBlKSBpZiAoMSA9PT0gZS5ub2RlVHlwZSkgeyBpZiAoaSAmJiB3KGUpLmlzKG4pKSBicmVhazsgci5wdXNoKGUpIH0gcmV0dXJuIHIgfSwgayA9IGZ1bmN0aW9uIChlLCB0KSB7IGZvciAodmFyIG4gPSBbXTsgZTsgZSA9IGUubmV4dFNpYmxpbmcpMSA9PT0gZS5ub2RlVHlwZSAmJiBlICE9PSB0ICYmIG4ucHVzaChlKTsgcmV0dXJuIG4gfSwgQSA9IHcuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7IGZ1bmN0aW9uIEQoZSwgdCkgeyByZXR1cm4gZS5ub2RlTmFtZSAmJiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHQudG9Mb3dlckNhc2UoKSB9IHZhciBTID0gL148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7IGZ1bmN0aW9uIEwoZSwgdCwgbikgeyByZXR1cm4gZyh0KSA/IHcuZ3JlcChlLCBmdW5jdGlvbiAoZSwgcikgeyByZXR1cm4gISF0LmNhbGwoZSwgciwgZSkgIT09IG4gfSkgOiB0Lm5vZGVUeXBlID8gdy5ncmVwKGUsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID09PSB0ICE9PSBuIH0pIDogInN0cmluZyIgIT0gdHlwZW9mIHQgPyB3LmdyZXAoZSwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHMuY2FsbCh0LCBlKSA+IC0xICE9PSBuIH0pIDogdy5maWx0ZXIodCwgZSwgbikgfSB3LmZpbHRlciA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHZhciByID0gdFswXTsgcmV0dXJuIG4gJiYgKGUgPSAiOm5vdCgiICsgZSArICIpIiksIDEgPT09IHQubGVuZ3RoICYmIDEgPT09IHIubm9kZVR5cGUgPyB3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsIGUpID8gW3JdIDogW10gOiB3LmZpbmQubWF0Y2hlcyhlLCB3LmdyZXAodCwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIDEgPT09IGUubm9kZVR5cGUgfSkpIH0sIHcuZm4uZXh0ZW5kKHsgZmluZDogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4sIHIgPSB0aGlzLmxlbmd0aCwgaSA9IHRoaXM7IGlmICgic3RyaW5nIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHRoaXMucHVzaFN0YWNrKHcoZSkuZmlsdGVyKGZ1bmN0aW9uICgpIHsgZm9yICh0ID0gMDsgdCA8IHI7IHQrKylpZiAody5jb250YWlucyhpW3RdLCB0aGlzKSkgcmV0dXJuICEwIH0pKTsgZm9yIChuID0gdGhpcy5wdXNoU3RhY2soW10pLCB0ID0gMDsgdCA8IHI7IHQrKyl3LmZpbmQoZSwgaVt0XSwgbik7IHJldHVybiByID4gMSA/IHcudW5pcXVlU29ydChuKSA6IG4gfSwgZmlsdGVyOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5wdXNoU3RhY2soTCh0aGlzLCBlIHx8IFtdLCAhMSkpIH0sIG5vdDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRoaXMucHVzaFN0YWNrKEwodGhpcywgZSB8fCBbXSwgITApKSB9LCBpczogZnVuY3Rpb24gKGUpIHsgcmV0dXJuICEhTCh0aGlzLCAic3RyaW5nIiA9PSB0eXBlb2YgZSAmJiBBLnRlc3QoZSkgPyB3KGUpIDogZSB8fCBbXSwgITEpLmxlbmd0aCB9IH0pOyB2YXIgaiwgcSA9IC9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87ICh3LmZuLmluaXQgPSBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgaSwgbzsgaWYgKCFlKSByZXR1cm4gdGhpczsgaWYgKG4gPSBuIHx8IGosICJzdHJpbmciID09IHR5cGVvZiBlKSB7IGlmICghKGkgPSAiPCIgPT09IGVbMF0gJiYgIj4iID09PSBlW2UubGVuZ3RoIC0gMV0gJiYgZS5sZW5ndGggPj0gMyA/IFtudWxsLCBlLCBudWxsXSA6IHEuZXhlYyhlKSkgfHwgIWlbMV0gJiYgdCkgcmV0dXJuICF0IHx8IHQuanF1ZXJ5ID8gKHQgfHwgbikuZmluZChlKSA6IHRoaXMuY29uc3RydWN0b3IodCkuZmluZChlKTsgaWYgKGlbMV0pIHsgaWYgKHQgPSB0IGluc3RhbmNlb2YgdyA/IHRbMF0gOiB0LCB3Lm1lcmdlKHRoaXMsIHcucGFyc2VIVE1MKGlbMV0sIHQgJiYgdC5ub2RlVHlwZSA/IHQub3duZXJEb2N1bWVudCB8fCB0IDogciwgITApKSwgUy50ZXN0KGlbMV0pICYmIHcuaXNQbGFpbk9iamVjdCh0KSkgZm9yIChpIGluIHQpIGcodGhpc1tpXSkgPyB0aGlzW2ldKHRbaV0pIDogdGhpcy5hdHRyKGksIHRbaV0pOyByZXR1cm4gdGhpcyB9IHJldHVybiAobyA9IHIuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpICYmICh0aGlzWzBdID0gbywgdGhpcy5sZW5ndGggPSAxKSwgdGhpcyB9IHJldHVybiBlLm5vZGVUeXBlID8gKHRoaXNbMF0gPSBlLCB0aGlzLmxlbmd0aCA9IDEsIHRoaXMpIDogZyhlKSA/IHZvaWQgMCAhPT0gbi5yZWFkeSA/IG4ucmVhZHkoZSkgOiBlKHcpIDogdy5tYWtlQXJyYXkoZSwgdGhpcykgfSkucHJvdG90eXBlID0gdy5mbiwgaiA9IHcocik7IHZhciBPID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sIFAgPSB7IGNoaWxkcmVuOiAhMCwgY29udGVudHM6ICEwLCBuZXh0OiAhMCwgcHJldjogITAgfTsgdy5mbi5leHRlbmQoeyBoYXM6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gdyhlLCB0aGlzKSwgbiA9IHQubGVuZ3RoOyByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKCkgeyBmb3IgKHZhciBlID0gMDsgZSA8IG47IGUrKylpZiAody5jb250YWlucyh0aGlzLCB0W2VdKSkgcmV0dXJuICEwIH0pIH0sIGNsb3Nlc3Q6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gMCwgaSA9IHRoaXMubGVuZ3RoLCBvID0gW10sIGEgPSAic3RyaW5nIiAhPSB0eXBlb2YgZSAmJiB3KGUpOyBpZiAoIUEudGVzdChlKSkgZm9yICg7IHIgPCBpOyByKyspZm9yIChuID0gdGhpc1tyXTsgbiAmJiBuICE9PSB0OyBuID0gbi5wYXJlbnROb2RlKWlmIChuLm5vZGVUeXBlIDwgMTEgJiYgKGEgPyBhLmluZGV4KG4pID4gLTEgOiAxID09PSBuLm5vZGVUeXBlICYmIHcuZmluZC5tYXRjaGVzU2VsZWN0b3IobiwgZSkpKSB7IG8ucHVzaChuKTsgYnJlYWsgfSByZXR1cm4gdGhpcy5wdXNoU3RhY2soby5sZW5ndGggPiAxID8gdy51bmlxdWVTb3J0KG8pIDogbykgfSwgaW5kZXg6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID8gInN0cmluZyIgPT0gdHlwZW9mIGUgPyBzLmNhbGwodyhlKSwgdGhpc1swXSkgOiBzLmNhbGwodGhpcywgZS5qcXVlcnkgPyBlWzBdIDogZSkgOiB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTEgfSwgYWRkOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gdGhpcy5wdXNoU3RhY2sody51bmlxdWVTb3J0KHcubWVyZ2UodGhpcy5nZXQoKSwgdyhlLCB0KSkpKSB9LCBhZGRCYWNrOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5hZGQobnVsbCA9PSBlID8gdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSkgfSB9KTsgZnVuY3Rpb24gSChlLCB0KSB7IHdoaWxlICgoZSA9IGVbdF0pICYmIDEgIT09IGUubm9kZVR5cGUpOyByZXR1cm4gZSB9IHcuZWFjaCh7IHBhcmVudDogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBlLnBhcmVudE5vZGU7IHJldHVybiB0ICYmIDExICE9PSB0Lm5vZGVUeXBlID8gdCA6IG51bGwgfSwgcGFyZW50czogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIE4oZSwgInBhcmVudE5vZGUiKSB9LCBwYXJlbnRzVW50aWw6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBOKGUsICJwYXJlbnROb2RlIiwgbikgfSwgbmV4dDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEgoZSwgIm5leHRTaWJsaW5nIikgfSwgcHJldjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEgoZSwgInByZXZpb3VzU2libGluZyIpIH0sIG5leHRBbGw6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBOKGUsICJuZXh0U2libGluZyIpIH0sIHByZXZBbGw6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBOKGUsICJwcmV2aW91c1NpYmxpbmciKSB9LCBuZXh0VW50aWw6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBOKGUsICJuZXh0U2libGluZyIsIG4pIH0sIHByZXZVbnRpbDogZnVuY3Rpb24gKGUsIHQsIG4pIHsgcmV0dXJuIE4oZSwgInByZXZpb3VzU2libGluZyIsIG4pIH0sIHNpYmxpbmdzOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gaygoZS5wYXJlbnROb2RlIHx8IHt9KS5maXJzdENoaWxkLCBlKSB9LCBjaGlsZHJlbjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGsoZS5maXJzdENoaWxkKSB9LCBjb250ZW50czogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEQoZSwgImlmcmFtZSIpID8gZS5jb250ZW50RG9jdW1lbnQgOiAoRChlLCAidGVtcGxhdGUiKSAmJiAoZSA9IGUuY29udGVudCB8fCBlKSwgdy5tZXJnZShbXSwgZS5jaGlsZE5vZGVzKSkgfSB9LCBmdW5jdGlvbiAoZSwgdCkgeyB3LmZuW2VdID0gZnVuY3Rpb24gKG4sIHIpIHsgdmFyIGkgPSB3Lm1hcCh0aGlzLCB0LCBuKTsgcmV0dXJuICJVbnRpbCIgIT09IGUuc2xpY2UoLTUpICYmIChyID0gbiksIHIgJiYgInN0cmluZyIgPT0gdHlwZW9mIHIgJiYgKGkgPSB3LmZpbHRlcihyLCBpKSksIHRoaXMubGVuZ3RoID4gMSAmJiAoUFtlXSB8fCB3LnVuaXF1ZVNvcnQoaSksIE8udGVzdChlKSAmJiBpLnJldmVyc2UoKSksIHRoaXMucHVzaFN0YWNrKGkpIH0gfSk7IHZhciBJID0gL1teXHgyMFx0XHJcblxmXSsvZzsgZnVuY3Rpb24gUihlKSB7IHZhciB0ID0ge307IHJldHVybiB3LmVhY2goZS5tYXRjaChJKSB8fCBbXSwgZnVuY3Rpb24gKGUsIG4pIHsgdFtuXSA9ICEwIH0pLCB0IH0gdy5DYWxsYmFja3MgPSBmdW5jdGlvbiAoZSkgeyBlID0gInN0cmluZyIgPT0gdHlwZW9mIGUgPyBSKGUpIDogdy5leHRlbmQoe30sIGUpOyB2YXIgdCwgbiwgciwgaSwgbyA9IFtdLCBhID0gW10sIHUgPSAtMSwgcyA9IGZ1bmN0aW9uICgpIHsgZm9yIChpID0gaSB8fCBlLm9uY2UsIHIgPSB0ID0gITA7IGEubGVuZ3RoOyB1ID0gLTEpIHsgbiA9IGEuc2hpZnQoKTsgd2hpbGUgKCsrdSA8IG8ubGVuZ3RoKSAhMSA9PT0gb1t1XS5hcHBseShuWzBdLCBuWzFdKSAmJiBlLnN0b3BPbkZhbHNlICYmICh1ID0gby5sZW5ndGgsIG4gPSAhMSkgfSBlLm1lbW9yeSB8fCAobiA9ICExKSwgdCA9ICExLCBpICYmIChvID0gbiA/IFtdIDogIiIpIH0sIGwgPSB7IGFkZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbyAmJiAobiAmJiAhdCAmJiAodSA9IG8ubGVuZ3RoIC0gMSwgYS5wdXNoKG4pKSwgZnVuY3Rpb24gdChuKSB7IHcuZWFjaChuLCBmdW5jdGlvbiAobiwgcikgeyBnKHIpID8gZS51bmlxdWUgJiYgbC5oYXMocikgfHwgby5wdXNoKHIpIDogciAmJiByLmxlbmd0aCAmJiAic3RyaW5nIiAhPT0gYihyKSAmJiB0KHIpIH0pIH0oYXJndW1lbnRzKSwgbiAmJiAhdCAmJiBzKCkpLCB0aGlzIH0sIHJlbW92ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdy5lYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG47IHdoaWxlICgobiA9IHcuaW5BcnJheSh0LCBvLCBuKSkgPiAtMSkgby5zcGxpY2UobiwgMSksIG4gPD0gdSAmJiB1LS0gfSksIHRoaXMgfSwgaGFzOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSA/IHcuaW5BcnJheShlLCBvKSA+IC0xIDogby5sZW5ndGggPiAwIH0sIGVtcHR5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBvICYmIChvID0gW10pLCB0aGlzIH0sIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGkgPSBhID0gW10sIG8gPSBuID0gIiIsIHRoaXMgfSwgZGlzYWJsZWQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICFvIH0sIGxvY2s6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGkgPSBhID0gW10sIG4gfHwgdCB8fCAobyA9IG4gPSAiIiksIHRoaXMgfSwgbG9ja2VkOiBmdW5jdGlvbiAoKSB7IHJldHVybiAhIWkgfSwgZmlyZVdpdGg6IGZ1bmN0aW9uIChlLCBuKSB7IHJldHVybiBpIHx8IChuID0gW2UsIChuID0gbiB8fCBbXSkuc2xpY2UgPyBuLnNsaWNlKCkgOiBuXSwgYS5wdXNoKG4pLCB0IHx8IHMoKSksIHRoaXMgfSwgZmlyZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbC5maXJlV2l0aCh0aGlzLCBhcmd1bWVudHMpLCB0aGlzIH0sIGZpcmVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiAhIXIgfSB9OyByZXR1cm4gbCB9OyBmdW5jdGlvbiBCKGUpIHsgcmV0dXJuIGUgfSBmdW5jdGlvbiBNKGUpIHsgdGhyb3cgZSB9IGZ1bmN0aW9uIFcoZSwgdCwgbiwgcikgeyB2YXIgaTsgdHJ5IHsgZSAmJiBnKGkgPSBlLnByb21pc2UpID8gaS5jYWxsKGUpLmRvbmUodCkuZmFpbChuKSA6IGUgJiYgZyhpID0gZS50aGVuKSA/IGkuY2FsbChlLCB0LCBuKSA6IHQuYXBwbHkodm9pZCAwLCBbZV0uc2xpY2UocikpIH0gY2F0Y2ggKGUpIHsgbi5hcHBseSh2b2lkIDAsIFtlXSkgfSB9IHcuZXh0ZW5kKHsgRGVmZXJyZWQ6IGZ1bmN0aW9uICh0KSB7IHZhciBuID0gW1sibm90aWZ5IiwgInByb2dyZXNzIiwgdy5DYWxsYmFja3MoIm1lbW9yeSIpLCB3LkNhbGxiYWNrcygibWVtb3J5IiksIDJdLCBbInJlc29sdmUiLCAiZG9uZSIsIHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCB3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwgMCwgInJlc29sdmVkIl0sIFsicmVqZWN0IiwgImZhaWwiLCB3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwgdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksIDEsICJyZWplY3RlZCJdXSwgciA9ICJwZW5kaW5nIiwgaSA9IHsgc3RhdGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHIgfSwgYWx3YXlzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksIHRoaXMgfSwgImNhdGNoIjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGkudGhlbihudWxsLCBlKSB9LCBwaXBlOiBmdW5jdGlvbiAoKSB7IHZhciBlID0gYXJndW1lbnRzOyByZXR1cm4gdy5EZWZlcnJlZChmdW5jdGlvbiAodCkgeyB3LmVhY2gobiwgZnVuY3Rpb24gKG4sIHIpIHsgdmFyIGkgPSBnKGVbcls0XV0pICYmIGVbcls0XV07IG9bclsxXV0oZnVuY3Rpb24gKCkgeyB2YXIgZSA9IGkgJiYgaS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyBlICYmIGcoZS5wcm9taXNlKSA/IGUucHJvbWlzZSgpLnByb2dyZXNzKHQubm90aWZ5KS5kb25lKHQucmVzb2x2ZSkuZmFpbCh0LnJlamVjdCkgOiB0W3JbMF0gKyAiV2l0aCJdKHRoaXMsIGkgPyBbZV0gOiBhcmd1bWVudHMpIH0pIH0pLCBlID0gbnVsbCB9KS5wcm9taXNlKCkgfSwgdGhlbjogZnVuY3Rpb24gKHQsIHIsIGkpIHsgdmFyIG8gPSAwOyBmdW5jdGlvbiBhKHQsIG4sIHIsIGkpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHUgPSB0aGlzLCBzID0gYXJndW1lbnRzLCBsID0gZnVuY3Rpb24gKCkgeyB2YXIgZSwgbDsgaWYgKCEodCA8IG8pKSB7IGlmICgoZSA9IHIuYXBwbHkodSwgcykpID09PSBuLnByb21pc2UoKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7IGwgPSBlICYmICgib2JqZWN0IiA9PSB0eXBlb2YgZSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiBlKSAmJiBlLnRoZW4sIGcobCkgPyBpID8gbC5jYWxsKGUsIGEobywgbiwgQiwgaSksIGEobywgbiwgTSwgaSkpIDogKG8rKyAsIGwuY2FsbChlLCBhKG8sIG4sIEIsIGkpLCBhKG8sIG4sIE0sIGkpLCBhKG8sIG4sIEIsIG4ubm90aWZ5V2l0aCkpKSA6IChyICE9PSBCICYmICh1ID0gdm9pZCAwLCBzID0gW2VdKSwgKGkgfHwgbi5yZXNvbHZlV2l0aCkodSwgcykpIH0gfSwgYyA9IGkgPyBsIDogZnVuY3Rpb24gKCkgeyB0cnkgeyBsKCkgfSBjYXRjaCAoZSkgeyB3LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgJiYgdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsIGMuc3RhY2tUcmFjZSksIHQgKyAxID49IG8gJiYgKHIgIT09IE0gJiYgKHUgPSB2b2lkIDAsIHMgPSBbZV0pLCBuLnJlamVjdFdpdGgodSwgcykpIH0gfTsgdCA/IGMoKSA6ICh3LkRlZmVycmVkLmdldFN0YWNrSG9vayAmJiAoYy5zdGFja1RyYWNlID0gdy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksIGUuc2V0VGltZW91dChjKSkgfSB9IHJldHVybiB3LkRlZmVycmVkKGZ1bmN0aW9uIChlKSB7IG5bMF1bM10uYWRkKGEoMCwgZSwgZyhpKSA/IGkgOiBCLCBlLm5vdGlmeVdpdGgpKSwgblsxXVszXS5hZGQoYSgwLCBlLCBnKHQpID8gdCA6IEIpKSwgblsyXVszXS5hZGQoYSgwLCBlLCBnKHIpID8gciA6IE0pKSB9KS5wcm9taXNlKCkgfSwgcHJvbWlzZTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG51bGwgIT0gZSA/IHcuZXh0ZW5kKGUsIGkpIDogaSB9IH0sIG8gPSB7fTsgcmV0dXJuIHcuZWFjaChuLCBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgYSA9IHRbMl0sIHUgPSB0WzVdOyBpW3RbMV1dID0gYS5hZGQsIHUgJiYgYS5hZGQoZnVuY3Rpb24gKCkgeyByID0gdSB9LCBuWzMgLSBlXVsyXS5kaXNhYmxlLCBuWzMgLSBlXVszXS5kaXNhYmxlLCBuWzBdWzJdLmxvY2ssIG5bMF1bM10ubG9jayksIGEuYWRkKHRbM10uZmlyZSksIG9bdFswXV0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvW3RbMF0gKyAiV2l0aCJdKHRoaXMgPT09IG8gPyB2b2lkIDAgOiB0aGlzLCBhcmd1bWVudHMpLCB0aGlzIH0sIG9bdFswXSArICJXaXRoIl0gPSBhLmZpcmVXaXRoIH0pLCBpLnByb21pc2UobyksIHQgJiYgdC5jYWxsKG8sIG8pLCBvIH0sIHdoZW46IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IHQsIHIgPSBBcnJheShuKSwgaSA9IG8uY2FsbChhcmd1bWVudHMpLCBhID0gdy5EZWZlcnJlZCgpLCB1ID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGZ1bmN0aW9uIChuKSB7IHJbZV0gPSB0aGlzLCBpW2VdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBvLmNhbGwoYXJndW1lbnRzKSA6IG4sIC0tdCB8fCBhLnJlc29sdmVXaXRoKHIsIGkpIH0gfTsgaWYgKHQgPD0gMSAmJiAoVyhlLCBhLmRvbmUodShuKSkucmVzb2x2ZSwgYS5yZWplY3QsICF0KSwgInBlbmRpbmciID09PSBhLnN0YXRlKCkgfHwgZyhpW25dICYmIGlbbl0udGhlbikpKSByZXR1cm4gYS50aGVuKCk7IHdoaWxlIChuLS0pIFcoaVtuXSwgdShuKSwgYS5yZWplY3QpOyByZXR1cm4gYS5wcm9taXNlKCkgfSB9KTsgdmFyICQgPSAvXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLzsgdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24gKHQsIG4pIHsgZS5jb25zb2xlICYmIGUuY29uc29sZS53YXJuICYmIHQgJiYgJC50ZXN0KHQubmFtZSkgJiYgZS5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyB0Lm1lc3NhZ2UsIHQuc3RhY2ssIG4pIH0sIHcucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiAodCkgeyBlLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aHJvdyB0IH0pIH07IHZhciBGID0gdy5EZWZlcnJlZCgpOyB3LmZuLnJlYWR5ID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbiAoZSkgeyB3LnJlYWR5RXhjZXB0aW9uKGUpIH0pLCB0aGlzIH0sIHcuZXh0ZW5kKHsgaXNSZWFkeTogITEsIHJlYWR5V2FpdDogMSwgcmVhZHk6IGZ1bmN0aW9uIChlKSB7ICghMCA9PT0gZSA/IC0tdy5yZWFkeVdhaXQgOiB3LmlzUmVhZHkpIHx8ICh3LmlzUmVhZHkgPSAhMCwgITAgIT09IGUgJiYgLS13LnJlYWR5V2FpdCA+IDAgfHwgRi5yZXNvbHZlV2l0aChyLCBbd10pKSB9IH0pLCB3LnJlYWR5LnRoZW4gPSBGLnRoZW47IGZ1bmN0aW9uIHooKSB7IHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIHopLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLCB6KSwgdy5yZWFkeSgpIH0gImNvbXBsZXRlIiA9PT0gci5yZWFkeVN0YXRlIHx8ICJsb2FkaW5nIiAhPT0gci5yZWFkeVN0YXRlICYmICFyLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCA/IGUuc2V0VGltZW91dCh3LnJlYWR5KSA6IChyLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCB6KSwgZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgeikpOyB2YXIgXyA9IGZ1bmN0aW9uIChlLCB0LCBuLCByLCBpLCBvLCBhKSB7IHZhciB1ID0gMCwgcyA9IGUubGVuZ3RoLCBsID0gbnVsbCA9PSBuOyBpZiAoIm9iamVjdCIgPT09IGIobikpIHsgaSA9ICEwOyBmb3IgKHUgaW4gbikgXyhlLCB0LCB1LCBuW3VdLCAhMCwgbywgYSkgfSBlbHNlIGlmICh2b2lkIDAgIT09IHIgJiYgKGkgPSAhMCwgZyhyKSB8fCAoYSA9ICEwKSwgbCAmJiAoYSA/ICh0LmNhbGwoZSwgciksIHQgPSBudWxsKSA6IChsID0gdCwgdCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiBsLmNhbGwodyhlKSwgbikgfSkpLCB0KSkgZm9yICg7IHUgPCBzOyB1KyspdChlW3VdLCBuLCBhID8gciA6IHIuY2FsbChlW3VdLCB1LCB0KGVbdV0sIG4pKSk7IHJldHVybiBpID8gZSA6IGwgPyB0LmNhbGwoZSkgOiBzID8gdChlWzBdLCBuKSA6IG8gfSwgVSA9IC9eLW1zLS8sIFYgPSAvLShbYS16XSkvZzsgZnVuY3Rpb24gWChlLCB0KSB7IHJldHVybiB0LnRvVXBwZXJDYXNlKCkgfSBmdW5jdGlvbiBRKGUpIHsgcmV0dXJuIGUucmVwbGFjZShVLCAibXMtIikucmVwbGFjZShWLCBYKSB9IHZhciBZID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIDEgPT09IGUubm9kZVR5cGUgfHwgOSA9PT0gZS5ub2RlVHlwZSB8fCAhK2Uubm9kZVR5cGUgfTsgZnVuY3Rpb24gRygpIHsgdGhpcy5leHBhbmRvID0gdy5leHBhbmRvICsgRy51aWQrKyB9IEcudWlkID0gMSwgRy5wcm90b3R5cGUgPSB7IGNhY2hlOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGVbdGhpcy5leHBhbmRvXTsgcmV0dXJuIHQgfHwgKHQgPSB7fSwgWShlKSAmJiAoZS5ub2RlVHlwZSA/IGVbdGhpcy5leHBhbmRvXSA9IHQgOiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdGhpcy5leHBhbmRvLCB7IHZhbHVlOiB0LCBjb25maWd1cmFibGU6ICEwIH0pKSksIHQgfSwgc2V0OiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaSA9IHRoaXMuY2FjaGUoZSk7IGlmICgic3RyaW5nIiA9PSB0eXBlb2YgdCkgaVtRKHQpXSA9IG47IGVsc2UgZm9yIChyIGluIHQpIGlbUShyKV0gPSB0W3JdOyByZXR1cm4gaSB9LCBnZXQ6IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiB2b2lkIDAgPT09IHQgPyB0aGlzLmNhY2hlKGUpIDogZVt0aGlzLmV4cGFuZG9dICYmIGVbdGhpcy5leHBhbmRvXVtRKHQpXSB9LCBhY2Nlc3M6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiB2b2lkIDAgPT09IHQgfHwgdCAmJiAic3RyaW5nIiA9PSB0eXBlb2YgdCAmJiB2b2lkIDAgPT09IG4gPyB0aGlzLmdldChlLCB0KSA6ICh0aGlzLnNldChlLCB0LCBuKSwgdm9pZCAwICE9PSBuID8gbiA6IHQpIH0sIHJlbW92ZTogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIgPSBlW3RoaXMuZXhwYW5kb107IGlmICh2b2lkIDAgIT09IHIpIHsgaWYgKHZvaWQgMCAhPT0gdCkgeyBuID0gKHQgPSBBcnJheS5pc0FycmF5KHQpID8gdC5tYXAoUSkgOiAodCA9IFEodCkpIGluIHIgPyBbdF0gOiB0Lm1hdGNoKEkpIHx8IFtdKS5sZW5ndGg7IHdoaWxlIChuLS0pIGRlbGV0ZSByW3Rbbl1dIH0gKHZvaWQgMCA9PT0gdCB8fCB3LmlzRW1wdHlPYmplY3QocikpICYmIChlLm5vZGVUeXBlID8gZVt0aGlzLmV4cGFuZG9dID0gdm9pZCAwIDogZGVsZXRlIGVbdGhpcy5leHBhbmRvXSkgfSB9LCBoYXNEYXRhOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGVbdGhpcy5leHBhbmRvXTsgcmV0dXJuIHZvaWQgMCAhPT0gdCAmJiAhdy5pc0VtcHR5T2JqZWN0KHQpIH0gfTsgdmFyIEsgPSBuZXcgRywgSiA9IG5ldyBHLCBaID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywgZWUgPSAvW0EtWl0vZzsgZnVuY3Rpb24gdGUoZSkgeyByZXR1cm4gInRydWUiID09PSBlIHx8ICJmYWxzZSIgIT09IGUgJiYgKCJudWxsIiA9PT0gZSA/IG51bGwgOiBlID09PSArZSArICIiID8gK2UgOiBaLnRlc3QoZSkgPyBKU09OLnBhcnNlKGUpIDogZSkgfSBmdW5jdGlvbiBuZShlLCB0LCBuKSB7IHZhciByOyBpZiAodm9pZCAwID09PSBuICYmIDEgPT09IGUubm9kZVR5cGUpIGlmIChyID0gImRhdGEtIiArIHQucmVwbGFjZShlZSwgIi0kJiIpLnRvTG93ZXJDYXNlKCksICJzdHJpbmciID09IHR5cGVvZiAobiA9IGUuZ2V0QXR0cmlidXRlKHIpKSkgeyB0cnkgeyBuID0gdGUobikgfSBjYXRjaCAoZSkgeyB9IEouc2V0KGUsIHQsIG4pIH0gZWxzZSBuID0gdm9pZCAwOyByZXR1cm4gbiB9IHcuZXh0ZW5kKHsgaGFzRGF0YTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEouaGFzRGF0YShlKSB8fCBLLmhhc0RhdGEoZSkgfSwgZGF0YTogZnVuY3Rpb24gKGUsIHQsIG4pIHsgcmV0dXJuIEouYWNjZXNzKGUsIHQsIG4pIH0sIHJlbW92ZURhdGE6IGZ1bmN0aW9uIChlLCB0KSB7IEoucmVtb3ZlKGUsIHQpIH0sIF9kYXRhOiBmdW5jdGlvbiAoZSwgdCwgbikgeyByZXR1cm4gSy5hY2Nlc3MoZSwgdCwgbikgfSwgX3JlbW92ZURhdGE6IGZ1bmN0aW9uIChlLCB0KSB7IEsucmVtb3ZlKGUsIHQpIH0gfSksIHcuZm4uZXh0ZW5kKHsgZGF0YTogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIsIGksIG8gPSB0aGlzWzBdLCBhID0gbyAmJiBvLmF0dHJpYnV0ZXM7IGlmICh2b2lkIDAgPT09IGUpIHsgaWYgKHRoaXMubGVuZ3RoICYmIChpID0gSi5nZXQobyksIDEgPT09IG8ubm9kZVR5cGUgJiYgIUsuZ2V0KG8sICJoYXNEYXRhQXR0cnMiKSkpIHsgbiA9IGEubGVuZ3RoOyB3aGlsZSAobi0tKSBhW25dICYmIDAgPT09IChyID0gYVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpICYmIChyID0gUShyLnNsaWNlKDUpKSwgbmUobywgciwgaVtyXSkpOyBLLnNldChvLCAiaGFzRGF0YUF0dHJzIiwgITApIH0gcmV0dXJuIGkgfSByZXR1cm4gIm9iamVjdCIgPT0gdHlwZW9mIGUgPyB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeyBKLnNldCh0aGlzLCBlKSB9KSA6IF8odGhpcywgZnVuY3Rpb24gKHQpIHsgdmFyIG47IGlmIChvICYmIHZvaWQgMCA9PT0gdCkgeyBpZiAodm9pZCAwICE9PSAobiA9IEouZ2V0KG8sIGUpKSkgcmV0dXJuIG47IGlmICh2b2lkIDAgIT09IChuID0gbmUobywgZSkpKSByZXR1cm4gbiB9IGVsc2UgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgSi5zZXQodGhpcywgZSwgdCkgfSkgfSwgbnVsbCwgdCwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsICEwKSB9LCByZW1vdmVEYXRhOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgSi5yZW1vdmUodGhpcywgZSkgfSkgfSB9KSwgdy5leHRlbmQoeyBxdWV1ZTogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHI7IGlmIChlKSByZXR1cm4gdCA9ICh0IHx8ICJmeCIpICsgInF1ZXVlIiwgciA9IEsuZ2V0KGUsIHQpLCBuICYmICghciB8fCBBcnJheS5pc0FycmF5KG4pID8gciA9IEsuYWNjZXNzKGUsIHQsIHcubWFrZUFycmF5KG4pKSA6IHIucHVzaChuKSksIHIgfHwgW10gfSwgZGVxdWV1ZTogZnVuY3Rpb24gKGUsIHQpIHsgdCA9IHQgfHwgImZ4IjsgdmFyIG4gPSB3LnF1ZXVlKGUsIHQpLCByID0gbi5sZW5ndGgsIGkgPSBuLnNoaWZ0KCksIG8gPSB3Ll9xdWV1ZUhvb2tzKGUsIHQpLCBhID0gZnVuY3Rpb24gKCkgeyB3LmRlcXVldWUoZSwgdCkgfTsgImlucHJvZ3Jlc3MiID09PSBpICYmIChpID0gbi5zaGlmdCgpLCByLS0pLCBpICYmICgiZngiID09PSB0ICYmIG4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLCBkZWxldGUgby5zdG9wLCBpLmNhbGwoZSwgYSwgbykpLCAhciAmJiBvICYmIG8uZW1wdHkuZmlyZSgpIH0sIF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IHQgKyAicXVldWVIb29rcyI7IHJldHVybiBLLmdldChlLCBuKSB8fCBLLmFjY2VzcyhlLCBuLCB7IGVtcHR5OiB3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24gKCkgeyBLLnJlbW92ZShlLCBbdCArICJxdWV1ZSIsIG5dKSB9KSB9KSB9IH0pLCB3LmZuLmV4dGVuZCh7IHF1ZXVlOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IDI7IHJldHVybiAic3RyaW5nIiAhPSB0eXBlb2YgZSAmJiAodCA9IGUsIGUgPSAiZngiLCBuLS0pLCBhcmd1bWVudHMubGVuZ3RoIDwgbiA/IHcucXVldWUodGhpc1swXSwgZSkgOiB2b2lkIDAgPT09IHQgPyB0aGlzIDogdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgdmFyIG4gPSB3LnF1ZXVlKHRoaXMsIGUsIHQpOyB3Ll9xdWV1ZUhvb2tzKHRoaXMsIGUpLCAiZngiID09PSBlICYmICJpbnByb2dyZXNzIiAhPT0gblswXSAmJiB3LmRlcXVldWUodGhpcywgZSkgfSkgfSwgZGVxdWV1ZTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7IHcuZGVxdWV1ZSh0aGlzLCBlKSB9KSB9LCBjbGVhclF1ZXVlOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5xdWV1ZShlIHx8ICJmeCIsIFtdKSB9LCBwcm9taXNlOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiwgciA9IDEsIGkgPSB3LkRlZmVycmVkKCksIG8gPSB0aGlzLCBhID0gdGhpcy5sZW5ndGgsIHUgPSBmdW5jdGlvbiAoKSB7IC0tciB8fCBpLnJlc29sdmVXaXRoKG8sIFtvXSkgfTsgInN0cmluZyIgIT0gdHlwZW9mIGUgJiYgKHQgPSBlLCBlID0gdm9pZCAwKSwgZSA9IGUgfHwgImZ4Ijsgd2hpbGUgKGEtLSkgKG4gPSBLLmdldChvW2FdLCBlICsgInF1ZXVlSG9va3MiKSkgJiYgbi5lbXB0eSAmJiAocisrICwgbi5lbXB0eS5hZGQodSkpOyByZXR1cm4gdSgpLCBpLnByb21pc2UodCkgfSB9KTsgdmFyIHJlID0gL1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsIGllID0gbmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiICsgcmUgKyAiKShbYS16JV0qKSQiLCAiaSIpLCBvZSA9IFsiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0Il0sIGFlID0gZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuICJub25lIiA9PT0gKGUgPSB0IHx8IGUpLnN0eWxlLmRpc3BsYXkgfHwgIiIgPT09IGUuc3R5bGUuZGlzcGxheSAmJiB3LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCwgZSkgJiYgIm5vbmUiID09PSB3LmNzcyhlLCAiZGlzcGxheSIpIH0sIHVlID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsgdmFyIGksIG8sIGEgPSB7fTsgZm9yIChvIGluIHQpIGFbb10gPSBlLnN0eWxlW29dLCBlLnN0eWxlW29dID0gdFtvXTsgaSA9IG4uYXBwbHkoZSwgciB8fCBbXSk7IGZvciAobyBpbiB0KSBlLnN0eWxlW29dID0gYVtvXTsgcmV0dXJuIGkgfTsgZnVuY3Rpb24gc2UoZSwgdCwgbiwgcikgeyB2YXIgaSwgbywgYSA9IDIwLCB1ID0gciA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHIuY3VyKCkgfSA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHcuY3NzKGUsIHQsICIiKSB9LCBzID0gdSgpLCBsID0gbiAmJiBuWzNdIHx8ICh3LmNzc051bWJlclt0XSA/ICIiIDogInB4IiksIGMgPSAody5jc3NOdW1iZXJbdF0gfHwgInB4IiAhPT0gbCAmJiArcykgJiYgaWUuZXhlYyh3LmNzcyhlLCB0KSk7IGlmIChjICYmIGNbM10gIT09IGwpIHsgcyAvPSAyLCBsID0gbCB8fCBjWzNdLCBjID0gK3MgfHwgMTsgd2hpbGUgKGEtLSkgdy5zdHlsZShlLCB0LCBjICsgbCksICgxIC0gbykgKiAoMSAtIChvID0gdSgpIC8gcyB8fCAuNSkpIDw9IDAgJiYgKGEgPSAwKSwgYyAvPSBvOyBjICo9IDIsIHcuc3R5bGUoZSwgdCwgYyArIGwpLCBuID0gbiB8fCBbXSB9IHJldHVybiBuICYmIChjID0gK2MgfHwgK3MgfHwgMCwgaSA9IG5bMV0gPyBjICsgKG5bMV0gKyAxKSAqIG5bMl0gOiArblsyXSwgciAmJiAoci51bml0ID0gbCwgci5zdGFydCA9IGMsIHIuZW5kID0gaSkpLCBpIH0gdmFyIGxlID0ge307IGZ1bmN0aW9uIGNlKGUpIHsgdmFyIHQsIG4gPSBlLm93bmVyRG9jdW1lbnQsIHIgPSBlLm5vZGVOYW1lLCBpID0gbGVbcl07IHJldHVybiBpIHx8ICh0ID0gbi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksIGkgPSB3LmNzcyh0LCAiZGlzcGxheSIpLCB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksICJub25lIiA9PT0gaSAmJiAoaSA9ICJibG9jayIpLCBsZVtyXSA9IGksIGkpIH0gZnVuY3Rpb24gZmUoZSwgdCkgeyBmb3IgKHZhciBuLCByLCBpID0gW10sIG8gPSAwLCBhID0gZS5sZW5ndGg7IG8gPCBhOyBvKyspKHIgPSBlW29dKS5zdHlsZSAmJiAobiA9IHIuc3R5bGUuZGlzcGxheSwgdCA/ICgibm9uZSIgPT09IG4gJiYgKGlbb10gPSBLLmdldChyLCAiZGlzcGxheSIpIHx8IG51bGwsIGlbb10gfHwgKHIuc3R5bGUuZGlzcGxheSA9ICIiKSksICIiID09PSByLnN0eWxlLmRpc3BsYXkgJiYgYWUocikgJiYgKGlbb10gPSBjZShyKSkpIDogIm5vbmUiICE9PSBuICYmIChpW29dID0gIm5vbmUiLCBLLnNldChyLCAiZGlzcGxheSIsIG4pKSk7IGZvciAobyA9IDA7IG8gPCBhOyBvKyspbnVsbCAhPSBpW29dICYmIChlW29dLnN0eWxlLmRpc3BsYXkgPSBpW29dKTsgcmV0dXJuIGUgfSB3LmZuLmV4dGVuZCh7IHNob3c6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZlKHRoaXMsICEwKSB9LCBoaWRlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmZSh0aGlzKSB9LCB0b2dnbGU6IGZ1bmN0aW9uIChlKSB7IHJldHVybiAiYm9vbGVhbiIgPT0gdHlwZW9mIGUgPyBlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKSA6IHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7IGFlKHRoaXMpID8gdyh0aGlzKS5zaG93KCkgOiB3KHRoaXMpLmhpZGUoKSB9KSB9IH0pOyB2YXIgZGUgPSAvXig/OmNoZWNrYm94fHJhZGlvKSQvaSwgcGUgPSAvPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKykvaSwgaGUgPSAvXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksIGdlID0geyBvcHRpb246IFsxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iXSwgdGhlYWQ6IFsxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiJdLCBjb2w6IFsyLCAiPHRhYmxlPjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiJdLCB0cjogWzIsICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+Il0sIHRkOiBbMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSwgX2RlZmF1bHQ6IFswLCAiIiwgIiJdIH07IGdlLm9wdGdyb3VwID0gZ2Uub3B0aW9uLCBnZS50Ym9keSA9IGdlLnRmb290ID0gZ2UuY29sZ3JvdXAgPSBnZS5jYXB0aW9uID0gZ2UudGhlYWQsIGdlLnRoID0gZ2UudGQ7IGZ1bmN0aW9uIHZlKGUsIHQpIHsgdmFyIG47IHJldHVybiBuID0gInVuZGVmaW5lZCIgIT0gdHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQgfHwgIioiKSA6ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGwgPyBlLnF1ZXJ5U2VsZWN0b3JBbGwodCB8fCAiKiIpIDogW10sIHZvaWQgMCA9PT0gdCB8fCB0ICYmIEQoZSwgdCkgPyB3Lm1lcmdlKFtlXSwgbikgOiBuIH0gZnVuY3Rpb24geWUoZSwgdCkgeyBmb3IgKHZhciBuID0gMCwgciA9IGUubGVuZ3RoOyBuIDwgcjsgbisrKUsuc2V0KGVbbl0sICJnbG9iYWxFdmFsIiwgIXQgfHwgSy5nZXQodFtuXSwgImdsb2JhbEV2YWwiKSkgfSB2YXIgbWUgPSAvPHwmIz9cdys7LzsgZnVuY3Rpb24gYmUoZSwgdCwgbiwgciwgaSkgeyBmb3IgKHZhciBvLCBhLCB1LCBzLCBsLCBjLCBmID0gdC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksIGQgPSBbXSwgcCA9IDAsIGggPSBlLmxlbmd0aDsgcCA8IGg7IHArKylpZiAoKG8gPSBlW3BdKSB8fCAwID09PSBvKSBpZiAoIm9iamVjdCIgPT09IGIobykpIHcubWVyZ2UoZCwgby5ub2RlVHlwZSA/IFtvXSA6IG8pOyBlbHNlIGlmIChtZS50ZXN0KG8pKSB7IGEgPSBhIHx8IGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSksIHUgPSAocGUuZXhlYyhvKSB8fCBbIiIsICIiXSlbMV0udG9Mb3dlckNhc2UoKSwgcyA9IGdlW3VdIHx8IGdlLl9kZWZhdWx0LCBhLmlubmVySFRNTCA9IHNbMV0gKyB3Lmh0bWxQcmVmaWx0ZXIobykgKyBzWzJdLCBjID0gc1swXTsgd2hpbGUgKGMtLSkgYSA9IGEubGFzdENoaWxkOyB3Lm1lcmdlKGQsIGEuY2hpbGROb2RlcyksIChhID0gZi5maXJzdENoaWxkKS50ZXh0Q29udGVudCA9ICIiIH0gZWxzZSBkLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7IGYudGV4dENvbnRlbnQgPSAiIiwgcCA9IDA7IHdoaWxlIChvID0gZFtwKytdKSBpZiAociAmJiB3LmluQXJyYXkobywgcikgPiAtMSkgaSAmJiBpLnB1c2gobyk7IGVsc2UgaWYgKGwgPSB3LmNvbnRhaW5zKG8ub3duZXJEb2N1bWVudCwgbyksIGEgPSB2ZShmLmFwcGVuZENoaWxkKG8pLCAic2NyaXB0IiksIGwgJiYgeWUoYSksIG4pIHsgYyA9IDA7IHdoaWxlIChvID0gYVtjKytdKSBoZS50ZXN0KG8udHlwZSB8fCAiIikgJiYgbi5wdXNoKG8pIH0gcmV0dXJuIGYgfSAhZnVuY3Rpb24gKCkgeyB2YXIgZSA9IHIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudCgiZGl2IikpLCB0ID0gci5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOyB0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJyYWRpbyIpLCB0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsICJjaGVja2VkIiksIHQuc2V0QXR0cmlidXRlKCJuYW1lIiwgInQiKSwgZS5hcHBlbmRDaGlsZCh0KSwgaC5jaGVja0Nsb25lID0gZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsIGUuaW5uZXJIVE1MID0gIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLCBoLm5vQ2xvbmVDaGVja2VkID0gISFlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSB9KCk7IHZhciB4ZSA9IHIuZG9jdW1lbnRFbGVtZW50LCB3ZSA9IC9ea2V5LywgQ2UgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sIFRlID0gL14oW14uXSopKD86XC4oLispfCkvOyBmdW5jdGlvbiBFZSgpIHsgcmV0dXJuICEwIH0gZnVuY3Rpb24gTmUoKSB7IHJldHVybiAhMSB9IGZ1bmN0aW9uIGtlKCkgeyB0cnkgeyByZXR1cm4gci5hY3RpdmVFbGVtZW50IH0gY2F0Y2ggKGUpIHsgfSB9IGZ1bmN0aW9uIEFlKGUsIHQsIG4sIHIsIGksIG8pIHsgdmFyIGEsIHU7IGlmICgib2JqZWN0IiA9PSB0eXBlb2YgdCkgeyAic3RyaW5nIiAhPSB0eXBlb2YgbiAmJiAociA9IHIgfHwgbiwgbiA9IHZvaWQgMCk7IGZvciAodSBpbiB0KSBBZShlLCB1LCBuLCByLCB0W3VdLCBvKTsgcmV0dXJuIGUgfSBpZiAobnVsbCA9PSByICYmIG51bGwgPT0gaSA/IChpID0gbiwgciA9IG4gPSB2b2lkIDApIDogbnVsbCA9PSBpICYmICgic3RyaW5nIiA9PSB0eXBlb2YgbiA/IChpID0gciwgciA9IHZvaWQgMCkgOiAoaSA9IHIsIHIgPSBuLCBuID0gdm9pZCAwKSksICExID09PSBpKSBpID0gTmU7IGVsc2UgaWYgKCFpKSByZXR1cm4gZTsgcmV0dXJuIDEgPT09IG8gJiYgKGEgPSBpLCAoaSA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiB3KCkub2ZmKGUpLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfSkuZ3VpZCA9IGEuZ3VpZCB8fCAoYS5ndWlkID0gdy5ndWlkKyspKSwgZS5lYWNoKGZ1bmN0aW9uICgpIHsgdy5ldmVudC5hZGQodGhpcywgdCwgaSwgciwgbikgfSkgfSB3LmV2ZW50ID0geyBnbG9iYWw6IHt9LCBhZGQ6IGZ1bmN0aW9uIChlLCB0LCBuLCByLCBpKSB7IHZhciBvLCBhLCB1LCBzLCBsLCBjLCBmLCBkLCBwLCBoLCBnLCB2ID0gSy5nZXQoZSk7IGlmICh2KSB7IG4uaGFuZGxlciAmJiAobiA9IChvID0gbikuaGFuZGxlciwgaSA9IG8uc2VsZWN0b3IpLCBpICYmIHcuZmluZC5tYXRjaGVzU2VsZWN0b3IoeGUsIGkpLCBuLmd1aWQgfHwgKG4uZ3VpZCA9IHcuZ3VpZCsrKSwgKHMgPSB2LmV2ZW50cykgfHwgKHMgPSB2LmV2ZW50cyA9IHt9KSwgKGEgPSB2LmhhbmRsZSkgfHwgKGEgPSB2LmhhbmRsZSA9IGZ1bmN0aW9uICh0KSB7IHJldHVybiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgdyAmJiB3LmV2ZW50LnRyaWdnZXJlZCAhPT0gdC50eXBlID8gdy5ldmVudC5kaXNwYXRjaC5hcHBseShlLCBhcmd1bWVudHMpIDogdm9pZCAwIH0pLCBsID0gKHQgPSAodCB8fCAiIikubWF0Y2goSSkgfHwgWyIiXSkubGVuZ3RoOyB3aGlsZSAobC0tKSBwID0gZyA9ICh1ID0gVGUuZXhlYyh0W2xdKSB8fCBbXSlbMV0sIGggPSAodVsyXSB8fCAiIikuc3BsaXQoIi4iKS5zb3J0KCksIHAgJiYgKGYgPSB3LmV2ZW50LnNwZWNpYWxbcF0gfHwge30sIHAgPSAoaSA/IGYuZGVsZWdhdGVUeXBlIDogZi5iaW5kVHlwZSkgfHwgcCwgZiA9IHcuZXZlbnQuc3BlY2lhbFtwXSB8fCB7fSwgYyA9IHcuZXh0ZW5kKHsgdHlwZTogcCwgb3JpZ1R5cGU6IGcsIGRhdGE6IHIsIGhhbmRsZXI6IG4sIGd1aWQ6IG4uZ3VpZCwgc2VsZWN0b3I6IGksIG5lZWRzQ29udGV4dDogaSAmJiB3LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksIG5hbWVzcGFjZTogaC5qb2luKCIuIikgfSwgbyksIChkID0gc1twXSkgfHwgKChkID0gc1twXSA9IFtdKS5kZWxlZ2F0ZUNvdW50ID0gMCwgZi5zZXR1cCAmJiAhMSAhPT0gZi5zZXR1cC5jYWxsKGUsIHIsIGgsIGEpIHx8IGUuYWRkRXZlbnRMaXN0ZW5lciAmJiBlLmFkZEV2ZW50TGlzdGVuZXIocCwgYSkpLCBmLmFkZCAmJiAoZi5hZGQuY2FsbChlLCBjKSwgYy5oYW5kbGVyLmd1aWQgfHwgKGMuaGFuZGxlci5ndWlkID0gbi5ndWlkKSksIGkgPyBkLnNwbGljZShkLmRlbGVnYXRlQ291bnQrKywgMCwgYykgOiBkLnB1c2goYyksIHcuZXZlbnQuZ2xvYmFsW3BdID0gITApIH0gfSwgcmVtb3ZlOiBmdW5jdGlvbiAoZSwgdCwgbiwgciwgaSkgeyB2YXIgbywgYSwgdSwgcywgbCwgYywgZiwgZCwgcCwgaCwgZywgdiA9IEsuaGFzRGF0YShlKSAmJiBLLmdldChlKTsgaWYgKHYgJiYgKHMgPSB2LmV2ZW50cykpIHsgbCA9ICh0ID0gKHQgfHwgIiIpLm1hdGNoKEkpIHx8IFsiIl0pLmxlbmd0aDsgd2hpbGUgKGwtLSkgaWYgKHUgPSBUZS5leGVjKHRbbF0pIHx8IFtdLCBwID0gZyA9IHVbMV0sIGggPSAodVsyXSB8fCAiIikuc3BsaXQoIi4iKS5zb3J0KCksIHApIHsgZiA9IHcuZXZlbnQuc3BlY2lhbFtwXSB8fCB7fSwgZCA9IHNbcCA9IChyID8gZi5kZWxlZ2F0ZVR5cGUgOiBmLmJpbmRUeXBlKSB8fCBwXSB8fCBbXSwgdSA9IHVbMl0gJiYgbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIiksIGEgPSBvID0gZC5sZW5ndGg7IHdoaWxlIChvLS0pIGMgPSBkW29dLCAhaSAmJiBnICE9PSBjLm9yaWdUeXBlIHx8IG4gJiYgbi5ndWlkICE9PSBjLmd1aWQgfHwgdSAmJiAhdS50ZXN0KGMubmFtZXNwYWNlKSB8fCByICYmIHIgIT09IGMuc2VsZWN0b3IgJiYgKCIqKiIgIT09IHIgfHwgIWMuc2VsZWN0b3IpIHx8IChkLnNwbGljZShvLCAxKSwgYy5zZWxlY3RvciAmJiBkLmRlbGVnYXRlQ291bnQtLSAsIGYucmVtb3ZlICYmIGYucmVtb3ZlLmNhbGwoZSwgYykpOyBhICYmICFkLmxlbmd0aCAmJiAoZi50ZWFyZG93biAmJiAhMSAhPT0gZi50ZWFyZG93bi5jYWxsKGUsIGgsIHYuaGFuZGxlKSB8fCB3LnJlbW92ZUV2ZW50KGUsIHAsIHYuaGFuZGxlKSwgZGVsZXRlIHNbcF0pIH0gZWxzZSBmb3IgKHAgaW4gcykgdy5ldmVudC5yZW1vdmUoZSwgcCArIHRbbF0sIG4sIHIsICEwKTsgdy5pc0VtcHR5T2JqZWN0KHMpICYmIEsucmVtb3ZlKGUsICJoYW5kbGUgZXZlbnRzIikgfSB9LCBkaXNwYXRjaDogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSB3LmV2ZW50LmZpeChlKSwgbiwgciwgaSwgbywgYSwgdSwgcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSwgbCA9IChLLmdldCh0aGlzLCAiZXZlbnRzIikgfHwge30pW3QudHlwZV0gfHwgW10sIGMgPSB3LmV2ZW50LnNwZWNpYWxbdC50eXBlXSB8fCB7fTsgZm9yIChzWzBdID0gdCwgbiA9IDE7IG4gPCBhcmd1bWVudHMubGVuZ3RoOyBuKyspc1tuXSA9IGFyZ3VtZW50c1tuXTsgaWYgKHQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzLCAhYy5wcmVEaXNwYXRjaCB8fCAhMSAhPT0gYy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsIHQpKSB7IHUgPSB3LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcywgdCwgbCksIG4gPSAwOyB3aGlsZSAoKG8gPSB1W24rK10pICYmICF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHsgdC5jdXJyZW50VGFyZ2V0ID0gby5lbGVtLCByID0gMDsgd2hpbGUgKChhID0gby5oYW5kbGVyc1tyKytdKSAmJiAhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSB0LnJuYW1lc3BhY2UgJiYgIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKSB8fCAodC5oYW5kbGVPYmogPSBhLCB0LmRhdGEgPSBhLmRhdGEsIHZvaWQgMCAhPT0gKGkgPSAoKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXSB8fCB7fSkuaGFuZGxlIHx8IGEuaGFuZGxlcikuYXBwbHkoby5lbGVtLCBzKSkgJiYgITEgPT09ICh0LnJlc3VsdCA9IGkpICYmICh0LnByZXZlbnREZWZhdWx0KCksIHQuc3RvcFByb3BhZ2F0aW9uKCkpKSB9IHJldHVybiBjLnBvc3REaXNwYXRjaCAmJiBjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsIHQpLCB0LnJlc3VsdCB9IH0sIGhhbmRsZXJzOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiwgciwgaSwgbywgYSwgdSA9IFtdLCBzID0gdC5kZWxlZ2F0ZUNvdW50LCBsID0gZS50YXJnZXQ7IGlmIChzICYmIGwubm9kZVR5cGUgJiYgISgiY2xpY2siID09PSBlLnR5cGUgJiYgZS5idXR0b24gPj0gMSkpIGZvciAoOyBsICE9PSB0aGlzOyBsID0gbC5wYXJlbnROb2RlIHx8IHRoaXMpaWYgKDEgPT09IGwubm9kZVR5cGUgJiYgKCJjbGljayIgIT09IGUudHlwZSB8fCAhMCAhPT0gbC5kaXNhYmxlZCkpIHsgZm9yIChvID0gW10sIGEgPSB7fSwgbiA9IDA7IG4gPCBzOyBuKyspdm9pZCAwID09PSBhW2kgPSAociA9IHRbbl0pLnNlbGVjdG9yICsgIiAiXSAmJiAoYVtpXSA9IHIubmVlZHNDb250ZXh0ID8gdyhpLCB0aGlzKS5pbmRleChsKSA+IC0xIDogdy5maW5kKGksIHRoaXMsIG51bGwsIFtsXSkubGVuZ3RoKSwgYVtpXSAmJiBvLnB1c2gocik7IG8ubGVuZ3RoICYmIHUucHVzaCh7IGVsZW06IGwsIGhhbmRsZXJzOiBvIH0pIH0gcmV0dXJuIGwgPSB0aGlzLCBzIDwgdC5sZW5ndGggJiYgdS5wdXNoKHsgZWxlbTogbCwgaGFuZGxlcnM6IHQuc2xpY2UocykgfSksIHUgfSwgYWRkUHJvcDogZnVuY3Rpb24gKGUsIHQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLCBlLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCBnZXQ6IGcodCkgPyBmdW5jdGlvbiAoKSB7IGlmICh0aGlzLm9yaWdpbmFsRXZlbnQpIHJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCkgfSA6IGZ1bmN0aW9uICgpIHsgaWYgKHRoaXMub3JpZ2luYWxFdmVudCkgcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFtlXSB9LCBzZXQ6IGZ1bmN0aW9uICh0KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBlLCB7IGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAsIHZhbHVlOiB0IH0pIH0gfSkgfSwgZml4OiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZVt3LmV4cGFuZG9dID8gZSA6IG5ldyB3LkV2ZW50KGUpIH0sIHNwZWNpYWw6IHsgbG9hZDogeyBub0J1YmJsZTogITAgfSwgZm9jdXM6IHsgdHJpZ2dlcjogZnVuY3Rpb24gKCkgeyBpZiAodGhpcyAhPT0ga2UoKSAmJiB0aGlzLmZvY3VzKSByZXR1cm4gdGhpcy5mb2N1cygpLCAhMSB9LCBkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIiB9LCBibHVyOiB7IHRyaWdnZXI6IGZ1bmN0aW9uICgpIHsgaWYgKHRoaXMgPT09IGtlKCkgJiYgdGhpcy5ibHVyKSByZXR1cm4gdGhpcy5ibHVyKCksICExIH0sIGRlbGVnYXRlVHlwZTogImZvY3Vzb3V0IiB9LCBjbGljazogeyB0cmlnZ2VyOiBmdW5jdGlvbiAoKSB7IGlmICgiY2hlY2tib3giID09PSB0aGlzLnR5cGUgJiYgdGhpcy5jbGljayAmJiBEKHRoaXMsICJpbnB1dCIpKSByZXR1cm4gdGhpcy5jbGljaygpLCAhMSB9LCBfZGVmYXVsdDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIEQoZS50YXJnZXQsICJhIikgfSB9LCBiZWZvcmV1bmxvYWQ6IHsgcG9zdERpc3BhdGNoOiBmdW5jdGlvbiAoZSkgeyB2b2lkIDAgIT09IGUucmVzdWx0ICYmIGUub3JpZ2luYWxFdmVudCAmJiAoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZS5yZXN1bHQpIH0gfSB9IH0sIHcucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiAoZSwgdCwgbikgeyBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsIG4pIH0sIHcuRXZlbnQgPSBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoISh0aGlzIGluc3RhbmNlb2Ygdy5FdmVudCkpIHJldHVybiBuZXcgdy5FdmVudChlLCB0KTsgZSAmJiBlLnR5cGUgPyAodGhpcy5vcmlnaW5hbEV2ZW50ID0gZSwgdGhpcy50eXBlID0gZS50eXBlLCB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGUuZGVmYXVsdFByZXZlbnRlZCB8fCB2b2lkIDAgPT09IGUuZGVmYXVsdFByZXZlbnRlZCAmJiAhMSA9PT0gZS5yZXR1cm5WYWx1ZSA/IEVlIDogTmUsIHRoaXMudGFyZ2V0ID0gZS50YXJnZXQgJiYgMyA9PT0gZS50YXJnZXQubm9kZVR5cGUgPyBlLnRhcmdldC5wYXJlbnROb2RlIDogZS50YXJnZXQsIHRoaXMuY3VycmVudFRhcmdldCA9IGUuY3VycmVudFRhcmdldCwgdGhpcy5yZWxhdGVkVGFyZ2V0ID0gZS5yZWxhdGVkVGFyZ2V0KSA6IHRoaXMudHlwZSA9IGUsIHQgJiYgdy5leHRlbmQodGhpcywgdCksIHRoaXMudGltZVN0YW1wID0gZSAmJiBlLnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpLCB0aGlzW3cuZXhwYW5kb10gPSAhMCB9LCB3LkV2ZW50LnByb3RvdHlwZSA9IHsgY29uc3RydWN0b3I6IHcuRXZlbnQsIGlzRGVmYXVsdFByZXZlbnRlZDogTmUsIGlzUHJvcGFnYXRpb25TdG9wcGVkOiBOZSwgaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IE5lLCBpc1NpbXVsYXRlZDogITEsIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7IHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OyB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IEVlLCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICYmIGUucHJldmVudERlZmF1bHQoKSB9LCBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHsgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7IHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBFZSwgZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCAmJiBlLnN0b3BQcm9wYWdhdGlvbigpIH0sIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkgeyB2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IEVlLCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICYmIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksIHRoaXMuc3RvcFByb3BhZ2F0aW9uKCkgfSB9LCB3LmVhY2goeyBhbHRLZXk6ICEwLCBidWJibGVzOiAhMCwgY2FuY2VsYWJsZTogITAsIGNoYW5nZWRUb3VjaGVzOiAhMCwgY3RybEtleTogITAsIGRldGFpbDogITAsIGV2ZW50UGhhc2U6ICEwLCBtZXRhS2V5OiAhMCwgcGFnZVg6ICEwLCBwYWdlWTogITAsIHNoaWZ0S2V5OiAhMCwgdmlldzogITAsICJjaGFyIjogITAsIGNoYXJDb2RlOiAhMCwga2V5OiAhMCwga2V5Q29kZTogITAsIGJ1dHRvbjogITAsIGJ1dHRvbnM6ICEwLCBjbGllbnRYOiAhMCwgY2xpZW50WTogITAsIG9mZnNldFg6ICEwLCBvZmZzZXRZOiAhMCwgcG9pbnRlcklkOiAhMCwgcG9pbnRlclR5cGU6ICEwLCBzY3JlZW5YOiAhMCwgc2NyZWVuWTogITAsIHRhcmdldFRvdWNoZXM6ICEwLCB0b0VsZW1lbnQ6ICEwLCB0b3VjaGVzOiAhMCwgd2hpY2g6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5idXR0b247IHJldHVybiBudWxsID09IGUud2hpY2ggJiYgd2UudGVzdChlLnR5cGUpID8gbnVsbCAhPSBlLmNoYXJDb2RlID8gZS5jaGFyQ29kZSA6IGUua2V5Q29kZSA6ICFlLndoaWNoICYmIHZvaWQgMCAhPT0gdCAmJiBDZS50ZXN0KGUudHlwZSkgPyAxICYgdCA/IDEgOiAyICYgdCA/IDMgOiA0ICYgdCA/IDIgOiAwIDogZS53aGljaCB9IH0sIHcuZXZlbnQuYWRkUHJvcCksIHcuZWFjaCh7IG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAibW91c2VvdXQiLCBwb2ludGVyZW50ZXI6ICJwb2ludGVyb3ZlciIsIHBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiIH0sIGZ1bmN0aW9uIChlLCB0KSB7IHcuZXZlbnQuc3BlY2lhbFtlXSA9IHsgZGVsZWdhdGVUeXBlOiB0LCBiaW5kVHlwZTogdCwgaGFuZGxlOiBmdW5jdGlvbiAoZSkgeyB2YXIgbiwgciA9IHRoaXMsIGkgPSBlLnJlbGF0ZWRUYXJnZXQsIG8gPSBlLmhhbmRsZU9iajsgcmV0dXJuIGkgJiYgKGkgPT09IHIgfHwgdy5jb250YWlucyhyLCBpKSkgfHwgKGUudHlwZSA9IG8ub3JpZ1R5cGUsIG4gPSBvLmhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgZS50eXBlID0gdCksIG4gfSB9IH0pLCB3LmZuLmV4dGVuZCh7IG9uOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyByZXR1cm4gQWUodGhpcywgZSwgdCwgbiwgcikgfSwgb25lOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyByZXR1cm4gQWUodGhpcywgZSwgdCwgbiwgciwgMSkgfSwgb2ZmOiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaTsgaWYgKGUgJiYgZS5wcmV2ZW50RGVmYXVsdCAmJiBlLmhhbmRsZU9iaikgcmV0dXJuIHIgPSBlLmhhbmRsZU9iaiwgdyhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2UgPyByLm9yaWdUeXBlICsgIi4iICsgci5uYW1lc3BhY2UgOiByLm9yaWdUeXBlLCByLnNlbGVjdG9yLCByLmhhbmRsZXIpLCB0aGlzOyBpZiAoIm9iamVjdCIgPT0gdHlwZW9mIGUpIHsgZm9yIChpIGluIGUpIHRoaXMub2ZmKGksIHQsIGVbaV0pOyByZXR1cm4gdGhpcyB9IHJldHVybiAhMSAhPT0gdCAmJiAiZnVuY3Rpb24iICE9IHR5cGVvZiB0IHx8IChuID0gdCwgdCA9IHZvaWQgMCksICExID09PSBuICYmIChuID0gTmUpLCB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeyB3LmV2ZW50LnJlbW92ZSh0aGlzLCBlLCBuLCB0KSB9KSB9IH0pOyB2YXIgRGUgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksIFNlID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksIExlID0gL2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksIGplID0gL15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nOyBmdW5jdGlvbiBxZShlLCB0KSB7IHJldHVybiBEKGUsICJ0YWJsZSIpICYmIEQoMTEgIT09IHQubm9kZVR5cGUgPyB0IDogdC5maXJzdENoaWxkLCAidHIiKSA/IHcoZSkuY2hpbGRyZW4oInRib2R5IilbMF0gfHwgZSA6IGUgfSBmdW5jdGlvbiBPZShlKSB7IHJldHVybiBlLnR5cGUgPSAobnVsbCAhPT0gZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkgKyAiLyIgKyBlLnR5cGUsIGUgfSBmdW5jdGlvbiBQZShlKSB7IHJldHVybiAidHJ1ZS8iID09PSAoZS50eXBlIHx8ICIiKS5zbGljZSgwLCA1KSA/IGUudHlwZSA9IGUudHlwZS5zbGljZSg1KSA6IGUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksIGUgfSBmdW5jdGlvbiBIZShlLCB0KSB7IHZhciBuLCByLCBpLCBvLCBhLCB1LCBzLCBsOyBpZiAoMSA9PT0gdC5ub2RlVHlwZSkgeyBpZiAoSy5oYXNEYXRhKGUpICYmIChvID0gSy5hY2Nlc3MoZSksIGEgPSBLLnNldCh0LCBvKSwgbCA9IG8uZXZlbnRzKSkgeyBkZWxldGUgYS5oYW5kbGUsIGEuZXZlbnRzID0ge307IGZvciAoaSBpbiBsKSBmb3IgKG4gPSAwLCByID0gbFtpXS5sZW5ndGg7IG4gPCByOyBuKyspdy5ldmVudC5hZGQodCwgaSwgbFtpXVtuXSkgfSBKLmhhc0RhdGEoZSkgJiYgKHUgPSBKLmFjY2VzcyhlKSwgcyA9IHcuZXh0ZW5kKHt9LCB1KSwgSi5zZXQodCwgcykpIH0gfSBmdW5jdGlvbiBJZShlLCB0KSB7IHZhciBuID0gdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyAiaW5wdXQiID09PSBuICYmIGRlLnRlc3QoZS50eXBlKSA/IHQuY2hlY2tlZCA9IGUuY2hlY2tlZCA6ICJpbnB1dCIgIT09IG4gJiYgInRleHRhcmVhIiAhPT0gbiB8fCAodC5kZWZhdWx0VmFsdWUgPSBlLmRlZmF1bHRWYWx1ZSkgfSBmdW5jdGlvbiBSZShlLCB0LCBuLCByKSB7IHQgPSBhLmFwcGx5KFtdLCB0KTsgdmFyIGksIG8sIHUsIHMsIGwsIGMsIGYgPSAwLCBkID0gZS5sZW5ndGgsIHAgPSBkIC0gMSwgdiA9IHRbMF0sIHkgPSBnKHYpOyBpZiAoeSB8fCBkID4gMSAmJiAic3RyaW5nIiA9PSB0eXBlb2YgdiAmJiAhaC5jaGVja0Nsb25lICYmIExlLnRlc3QodikpIHJldHVybiBlLmVhY2goZnVuY3Rpb24gKGkpIHsgdmFyIG8gPSBlLmVxKGkpOyB5ICYmICh0WzBdID0gdi5jYWxsKHRoaXMsIGksIG8uaHRtbCgpKSksIFJlKG8sIHQsIG4sIHIpIH0pOyBpZiAoZCAmJiAoaSA9IGJlKHQsIGVbMF0ub3duZXJEb2N1bWVudCwgITEsIGUsIHIpLCBvID0gaS5maXJzdENoaWxkLCAxID09PSBpLmNoaWxkTm9kZXMubGVuZ3RoICYmIChpID0gbyksIG8gfHwgcikpIHsgZm9yIChzID0gKHUgPSB3Lm1hcCh2ZShpLCAic2NyaXB0IiksIE9lKSkubGVuZ3RoOyBmIDwgZDsgZisrKWwgPSBpLCBmICE9PSBwICYmIChsID0gdy5jbG9uZShsLCAhMCwgITApLCBzICYmIHcubWVyZ2UodSwgdmUobCwgInNjcmlwdCIpKSksIG4uY2FsbChlW2ZdLCBsLCBmKTsgaWYgKHMpIGZvciAoYyA9IHVbdS5sZW5ndGggLSAxXS5vd25lckRvY3VtZW50LCB3Lm1hcCh1LCBQZSksIGYgPSAwOyBmIDwgczsgZisrKWwgPSB1W2ZdLCBoZS50ZXN0KGwudHlwZSB8fCAiIikgJiYgIUsuYWNjZXNzKGwsICJnbG9iYWxFdmFsIikgJiYgdy5jb250YWlucyhjLCBsKSAmJiAobC5zcmMgJiYgIm1vZHVsZSIgIT09IChsLnR5cGUgfHwgIiIpLnRvTG93ZXJDYXNlKCkgPyB3Ll9ldmFsVXJsICYmIHcuX2V2YWxVcmwobC5zcmMpIDogbShsLnRleHRDb250ZW50LnJlcGxhY2UoamUsICIiKSwgYywgbCkpIH0gcmV0dXJuIGUgfSBmdW5jdGlvbiBCZShlLCB0LCBuKSB7IGZvciAodmFyIHIsIGkgPSB0ID8gdy5maWx0ZXIodCwgZSkgOiBlLCBvID0gMDsgbnVsbCAhPSAociA9IGlbb10pOyBvKyspbiB8fCAxICE9PSByLm5vZGVUeXBlIHx8IHcuY2xlYW5EYXRhKHZlKHIpKSwgci5wYXJlbnROb2RlICYmIChuICYmIHcuY29udGFpbnMoci5vd25lckRvY3VtZW50LCByKSAmJiB5ZSh2ZShyLCAic2NyaXB0IikpLCByLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpOyByZXR1cm4gZSB9IHcuZXh0ZW5kKHsgaHRtbFByZWZpbHRlcjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUucmVwbGFjZShEZSwgIjwkMT48LyQyPiIpIH0sIGNsb25lOiBmdW5jdGlvbiAoZSwgdCwgbikgeyB2YXIgciwgaSwgbywgYSwgdSA9IGUuY2xvbmVOb2RlKCEwKSwgcyA9IHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LCBlKTsgaWYgKCEoaC5ub0Nsb25lQ2hlY2tlZCB8fCAxICE9PSBlLm5vZGVUeXBlICYmIDExICE9PSBlLm5vZGVUeXBlIHx8IHcuaXNYTUxEb2MoZSkpKSBmb3IgKGEgPSB2ZSh1KSwgciA9IDAsIGkgPSAobyA9IHZlKGUpKS5sZW5ndGg7IHIgPCBpOyByKyspSWUob1tyXSwgYVtyXSk7IGlmICh0KSBpZiAobikgZm9yIChvID0gbyB8fCB2ZShlKSwgYSA9IGEgfHwgdmUodSksIHIgPSAwLCBpID0gby5sZW5ndGg7IHIgPCBpOyByKyspSGUob1tyXSwgYVtyXSk7IGVsc2UgSGUoZSwgdSk7IHJldHVybiAoYSA9IHZlKHUsICJzY3JpcHQiKSkubGVuZ3RoID4gMCAmJiB5ZShhLCAhcyAmJiB2ZShlLCAic2NyaXB0IikpLCB1IH0sIGNsZWFuRGF0YTogZnVuY3Rpb24gKGUpIHsgZm9yICh2YXIgdCwgbiwgciwgaSA9IHcuZXZlbnQuc3BlY2lhbCwgbyA9IDA7IHZvaWQgMCAhPT0gKG4gPSBlW29dKTsgbysrKWlmIChZKG4pKSB7IGlmICh0ID0gbltLLmV4cGFuZG9dKSB7IGlmICh0LmV2ZW50cykgZm9yIChyIGluIHQuZXZlbnRzKSBpW3JdID8gdy5ldmVudC5yZW1vdmUobiwgcikgOiB3LnJlbW92ZUV2ZW50KG4sIHIsIHQuaGFuZGxlKTsgbltLLmV4cGFuZG9dID0gdm9pZCAwIH0gbltKLmV4cGFuZG9dICYmIChuW0ouZXhwYW5kb10gPSB2b2lkIDApIH0gfSB9KSwgdy5mbi5leHRlbmQoeyBkZXRhY2g6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBCZSh0aGlzLCBlLCAhMCkgfSwgcmVtb3ZlOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gQmUodGhpcywgZSkgfSwgdGV4dDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIF8odGhpcywgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHZvaWQgMCA9PT0gZSA/IHcudGV4dCh0aGlzKSA6IHRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uICgpIHsgMSAhPT0gdGhpcy5ub2RlVHlwZSAmJiAxMSAhPT0gdGhpcy5ub2RlVHlwZSAmJiA5ICE9PSB0aGlzLm5vZGVUeXBlIHx8ICh0aGlzLnRleHRDb250ZW50ID0gZSkgfSkgfSwgbnVsbCwgZSwgYXJndW1lbnRzLmxlbmd0aCkgfSwgYXBwZW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiBSZSh0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uIChlKSB7IDEgIT09IHRoaXMubm9kZVR5cGUgJiYgMTEgIT09IHRoaXMubm9kZVR5cGUgJiYgOSAhPT0gdGhpcy5ub2RlVHlwZSB8fCBxZSh0aGlzLCBlKS5hcHBlbmRDaGlsZChlKSB9KSB9LCBwcmVwZW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiBSZSh0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uIChlKSB7IGlmICgxID09PSB0aGlzLm5vZGVUeXBlIHx8IDExID09PSB0aGlzLm5vZGVUeXBlIHx8IDkgPT09IHRoaXMubm9kZVR5cGUpIHsgdmFyIHQgPSBxZSh0aGlzLCBlKTsgdC5pbnNlcnRCZWZvcmUoZSwgdC5maXJzdENoaWxkKSB9IH0pIH0sIGJlZm9yZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gUmUodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiAoZSkgeyB0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLCB0aGlzKSB9KSB9LCBhZnRlcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gUmUodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiAoZSkgeyB0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLCB0aGlzLm5leHRTaWJsaW5nKSB9KSB9LCBlbXB0eTogZnVuY3Rpb24gKCkgeyBmb3IgKHZhciBlLCB0ID0gMDsgbnVsbCAhPSAoZSA9IHRoaXNbdF0pOyB0KyspMSA9PT0gZS5ub2RlVHlwZSAmJiAody5jbGVhbkRhdGEodmUoZSwgITEpKSwgZS50ZXh0Q29udGVudCA9ICIiKTsgcmV0dXJuIHRoaXMgfSwgY2xvbmU6IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiBlID0gbnVsbCAhPSBlICYmIGUsIHQgPSBudWxsID09IHQgPyBlIDogdCwgdGhpcy5tYXAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdy5jbG9uZSh0aGlzLCBlLCB0KSB9KSB9LCBodG1sOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gXyh0aGlzLCBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHRoaXNbMF0gfHwge30sIG4gPSAwLCByID0gdGhpcy5sZW5ndGg7IGlmICh2b2lkIDAgPT09IGUgJiYgMSA9PT0gdC5ub2RlVHlwZSkgcmV0dXJuIHQuaW5uZXJIVE1MOyBpZiAoInN0cmluZyIgPT0gdHlwZW9mIGUgJiYgIVNlLnRlc3QoZSkgJiYgIWdlWyhwZS5leGVjKGUpIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkgeyBlID0gdy5odG1sUHJlZmlsdGVyKGUpOyB0cnkgeyBmb3IgKDsgbiA8IHI7IG4rKykxID09PSAodCA9IHRoaXNbbl0gfHwge30pLm5vZGVUeXBlICYmICh3LmNsZWFuRGF0YSh2ZSh0LCAhMSkpLCB0LmlubmVySFRNTCA9IGUpOyB0ID0gMCB9IGNhdGNoIChlKSB7IH0gfSB0ICYmIHRoaXMuZW1wdHkoKS5hcHBlbmQoZSkgfSwgbnVsbCwgZSwgYXJndW1lbnRzLmxlbmd0aCkgfSwgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uICgpIHsgdmFyIGUgPSBbXTsgcmV0dXJuIFJlKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24gKHQpIHsgdmFyIG4gPSB0aGlzLnBhcmVudE5vZGU7IHcuaW5BcnJheSh0aGlzLCBlKSA8IDAgJiYgKHcuY2xlYW5EYXRhKHZlKHRoaXMpKSwgbiAmJiBuLnJlcGxhY2VDaGlsZCh0LCB0aGlzKSkgfSwgZSkgfSB9KSwgdy5lYWNoKHsgYXBwZW5kVG86ICJhcHBlbmQiLCBwcmVwZW5kVG86ICJwcmVwZW5kIiwgaW5zZXJ0QmVmb3JlOiAiYmVmb3JlIiwgaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsIHJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIgfSwgZnVuY3Rpb24gKGUsIHQpIHsgdy5mbltlXSA9IGZ1bmN0aW9uIChlKSB7IGZvciAodmFyIG4sIHIgPSBbXSwgaSA9IHcoZSksIG8gPSBpLmxlbmd0aCAtIDEsIGEgPSAwOyBhIDw9IG87IGErKyluID0gYSA9PT0gbyA/IHRoaXMgOiB0aGlzLmNsb25lKCEwKSwgdyhpW2FdKVt0XShuKSwgdS5hcHBseShyLCBuLmdldCgpKTsgcmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpIH0gfSk7IHZhciBNZSA9IG5ldyBSZWdFeHAoIl4oIiArIHJlICsgIikoPyFweClbYS16JV0rJCIsICJpIiksIFdlID0gZnVuY3Rpb24gKHQpIHsgdmFyIG4gPSB0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7IHJldHVybiBuICYmIG4ub3BlbmVyIHx8IChuID0gZSksIG4uZ2V0Q29tcHV0ZWRTdHlsZSh0KSB9LCAkZSA9IG5ldyBSZWdFeHAob2Uuam9pbigifCIpLCAiaSIpOyAhZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiB0KCkgeyBpZiAoYykgeyBsLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsIGMuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIiwgeGUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7IHZhciB0ID0gZS5nZXRDb21wdXRlZFN0eWxlKGMpOyBpID0gIjElIiAhPT0gdC50b3AsIHMgPSAxMiA9PT0gbih0Lm1hcmdpbkxlZnQpLCBjLnN0eWxlLnJpZ2h0ID0gIjYwJSIsIHUgPSAzNiA9PT0gbih0LnJpZ2h0KSwgbyA9IDM2ID09PSBuKHQud2lkdGgpLCBjLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIiwgYSA9IDM2ID09PSBjLm9mZnNldFdpZHRoIHx8ICJhYnNvbHV0ZSIsIHhlLnJlbW92ZUNoaWxkKGwpLCBjID0gbnVsbCB9IH0gZnVuY3Rpb24gbihlKSB7IHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpIH0gdmFyIGksIG8sIGEsIHUsIHMsIGwgPSByLmNyZWF0ZUVsZW1lbnQoImRpdiIpLCBjID0gci5jcmVhdGVFbGVtZW50KCJkaXYiKTsgYy5zdHlsZSAmJiAoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCIsIGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICIiLCBoLmNsZWFyQ2xvbmVTdHlsZSA9ICJjb250ZW50LWJveCIgPT09IGMuc3R5bGUuYmFja2dyb3VuZENsaXAsIHcuZXh0ZW5kKGgsIHsgYm94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHQoKSwgbyB9LCBwaXhlbEJveFN0eWxlczogZnVuY3Rpb24gKCkgeyByZXR1cm4gdCgpLCB1IH0sIHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHQoKSwgaSB9LCByZWxpYWJsZU1hcmdpbkxlZnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHQoKSwgcyB9LCBzY3JvbGxib3hTaXplOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0KCksIGEgfSB9KSkgfSgpOyBmdW5jdGlvbiBGZShlLCB0LCBuKSB7IHZhciByLCBpLCBvLCBhLCB1ID0gZS5zdHlsZTsgcmV0dXJuIChuID0gbiB8fCBXZShlKSkgJiYgKCIiICE9PSAoYSA9IG4uZ2V0UHJvcGVydHlWYWx1ZSh0KSB8fCBuW3RdKSB8fCB3LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCwgZSkgfHwgKGEgPSB3LnN0eWxlKGUsIHQpKSwgIWgucGl4ZWxCb3hTdHlsZXMoKSAmJiBNZS50ZXN0KGEpICYmICRlLnRlc3QodCkgJiYgKHIgPSB1LndpZHRoLCBpID0gdS5taW5XaWR0aCwgbyA9IHUubWF4V2lkdGgsIHUubWluV2lkdGggPSB1Lm1heFdpZHRoID0gdS53aWR0aCA9IGEsIGEgPSBuLndpZHRoLCB1LndpZHRoID0gciwgdS5taW5XaWR0aCA9IGksIHUubWF4V2lkdGggPSBvKSksIHZvaWQgMCAhPT0gYSA/IGEgKyAiIiA6IGEgfSBmdW5jdGlvbiB6ZShlLCB0KSB7IHJldHVybiB7IGdldDogZnVuY3Rpb24gKCkgeyBpZiAoIWUoKSkgcmV0dXJuICh0aGlzLmdldCA9IHQpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IGRlbGV0ZSB0aGlzLmdldCB9IH0gfSB2YXIgX2UgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sIFVlID0gL14tLS8sIFZlID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwgWGUgPSB7IGxldHRlclNwYWNpbmc6ICIwIiwgZm9udFdlaWdodDogIjQwMCIgfSwgUWUgPSBbIldlYmtpdCIsICJNb3oiLCAibXMiXSwgWWUgPSByLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlOyBmdW5jdGlvbiBHZShlKSB7IGlmIChlIGluIFllKSByZXR1cm4gZTsgdmFyIHQgPSBlWzBdLnRvVXBwZXJDYXNlKCkgKyBlLnNsaWNlKDEpLCBuID0gUWUubGVuZ3RoOyB3aGlsZSAobi0tKSBpZiAoKGUgPSBRZVtuXSArIHQpIGluIFllKSByZXR1cm4gZSB9IGZ1bmN0aW9uIEtlKGUpIHsgdmFyIHQgPSB3LmNzc1Byb3BzW2VdOyByZXR1cm4gdCB8fCAodCA9IHcuY3NzUHJvcHNbZV0gPSBHZShlKSB8fCBlKSwgdCB9IGZ1bmN0aW9uIEplKGUsIHQsIG4pIHsgdmFyIHIgPSBpZS5leGVjKHQpOyByZXR1cm4gciA/IE1hdGgubWF4KDAsIHJbMl0gLSAobiB8fCAwKSkgKyAoclszXSB8fCAicHgiKSA6IHQgfSBmdW5jdGlvbiBaZShlLCB0LCBuLCByLCBpLCBvKSB7IHZhciBhID0gIndpZHRoIiA9PT0gdCA/IDEgOiAwLCB1ID0gMCwgcyA9IDA7IGlmIChuID09PSAociA/ICJib3JkZXIiIDogImNvbnRlbnQiKSkgcmV0dXJuIDA7IGZvciAoOyBhIDwgNDsgYSArPSAyKSJtYXJnaW4iID09PSBuICYmIChzICs9IHcuY3NzKGUsIG4gKyBvZVthXSwgITAsIGkpKSwgciA/ICgiY29udGVudCIgPT09IG4gJiYgKHMgLT0gdy5jc3MoZSwgInBhZGRpbmciICsgb2VbYV0sICEwLCBpKSksICJtYXJnaW4iICE9PSBuICYmIChzIC09IHcuY3NzKGUsICJib3JkZXIiICsgb2VbYV0gKyAiV2lkdGgiLCAhMCwgaSkpKSA6IChzICs9IHcuY3NzKGUsICJwYWRkaW5nIiArIG9lW2FdLCAhMCwgaSksICJwYWRkaW5nIiAhPT0gbiA/IHMgKz0gdy5jc3MoZSwgImJvcmRlciIgKyBvZVthXSArICJXaWR0aCIsICEwLCBpKSA6IHUgKz0gdy5jc3MoZSwgImJvcmRlciIgKyBvZVthXSArICJXaWR0aCIsICEwLCBpKSk7IHJldHVybiAhciAmJiBvID49IDAgJiYgKHMgKz0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGVbIm9mZnNldCIgKyB0WzBdLnRvVXBwZXJDYXNlKCkgKyB0LnNsaWNlKDEpXSAtIG8gLSBzIC0gdSAtIC41KSkpLCBzIH0gZnVuY3Rpb24gZXQoZSwgdCwgbikgeyB2YXIgciA9IFdlKGUpLCBpID0gRmUoZSwgdCwgciksIG8gPSAiYm9yZGVyLWJveCIgPT09IHcuY3NzKGUsICJib3hTaXppbmciLCAhMSwgciksIGEgPSBvOyBpZiAoTWUudGVzdChpKSkgeyBpZiAoIW4pIHJldHVybiBpOyBpID0gImF1dG8iIH0gcmV0dXJuIGEgPSBhICYmIChoLmJveFNpemluZ1JlbGlhYmxlKCkgfHwgaSA9PT0gZS5zdHlsZVt0XSksICgiYXV0byIgPT09IGkgfHwgIXBhcnNlRmxvYXQoaSkgJiYgImlubGluZSIgPT09IHcuY3NzKGUsICJkaXNwbGF5IiwgITEsIHIpKSAmJiAoaSA9IGVbIm9mZnNldCIgKyB0WzBdLnRvVXBwZXJDYXNlKCkgKyB0LnNsaWNlKDEpXSwgYSA9ICEwKSwgKGkgPSBwYXJzZUZsb2F0KGkpIHx8IDApICsgWmUoZSwgdCwgbiB8fCAobyA/ICJib3JkZXIiIDogImNvbnRlbnQiKSwgYSwgciwgaSkgKyAicHgiIH0gdy5leHRlbmQoeyBjc3NIb29rczogeyBvcGFjaXR5OiB7IGdldDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKHQpIHsgdmFyIG4gPSBGZShlLCAib3BhY2l0eSIpOyByZXR1cm4gIiIgPT09IG4gPyAiMSIgOiBuIH0gfSB9IH0sIGNzc051bWJlcjogeyBhbmltYXRpb25JdGVyYXRpb25Db3VudDogITAsIGNvbHVtbkNvdW50OiAhMCwgZmlsbE9wYWNpdHk6ICEwLCBmbGV4R3JvdzogITAsIGZsZXhTaHJpbms6ICEwLCBmb250V2VpZ2h0OiAhMCwgbGluZUhlaWdodDogITAsIG9wYWNpdHk6ICEwLCBvcmRlcjogITAsIG9ycGhhbnM6ICEwLCB3aWRvd3M6ICEwLCB6SW5kZXg6ICEwLCB6b29tOiAhMCB9LCBjc3NQcm9wczoge30sIHN0eWxlOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyBpZiAoZSAmJiAzICE9PSBlLm5vZGVUeXBlICYmIDggIT09IGUubm9kZVR5cGUgJiYgZS5zdHlsZSkgeyB2YXIgaSwgbywgYSwgdSA9IFEodCksIHMgPSBVZS50ZXN0KHQpLCBsID0gZS5zdHlsZTsgaWYgKHMgfHwgKHQgPSBLZSh1KSksIGEgPSB3LmNzc0hvb2tzW3RdIHx8IHcuY3NzSG9va3NbdV0sIHZvaWQgMCA9PT0gbikgcmV0dXJuIGEgJiYgImdldCIgaW4gYSAmJiB2b2lkIDAgIT09IChpID0gYS5nZXQoZSwgITEsIHIpKSA/IGkgOiBsW3RdOyAic3RyaW5nIiA9PSAobyA9IHR5cGVvZiBuKSAmJiAoaSA9IGllLmV4ZWMobikpICYmIGlbMV0gJiYgKG4gPSBzZShlLCB0LCBpKSwgbyA9ICJudW1iZXIiKSwgbnVsbCAhPSBuICYmIG4gPT09IG4gJiYgKCJudW1iZXIiID09PSBvICYmIChuICs9IGkgJiYgaVszXSB8fCAody5jc3NOdW1iZXJbdV0gPyAiIiA6ICJweCIpKSwgaC5jbGVhckNsb25lU3R5bGUgfHwgIiIgIT09IG4gfHwgMCAhPT0gdC5pbmRleE9mKCJiYWNrZ3JvdW5kIikgfHwgKGxbdF0gPSAiaW5oZXJpdCIpLCBhICYmICJzZXQiIGluIGEgJiYgdm9pZCAwID09PSAobiA9IGEuc2V0KGUsIG4sIHIpKSB8fCAocyA/IGwuc2V0UHJvcGVydHkodCwgbikgOiBsW3RdID0gbikpIH0gfSwgY3NzOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyB2YXIgaSwgbywgYSwgdSA9IFEodCk7IHJldHVybiBVZS50ZXN0KHQpIHx8ICh0ID0gS2UodSkpLCAoYSA9IHcuY3NzSG9va3NbdF0gfHwgdy5jc3NIb29rc1t1XSkgJiYgImdldCIgaW4gYSAmJiAoaSA9IGEuZ2V0KGUsICEwLCBuKSksIHZvaWQgMCA9PT0gaSAmJiAoaSA9IEZlKGUsIHQsIHIpKSwgIm5vcm1hbCIgPT09IGkgJiYgdCBpbiBYZSAmJiAoaSA9IFhlW3RdKSwgIiIgPT09IG4gfHwgbiA/IChvID0gcGFyc2VGbG9hdChpKSwgITAgPT09IG4gfHwgaXNGaW5pdGUobykgPyBvIHx8IDAgOiBpKSA6IGkgfSB9KSwgdy5lYWNoKFsiaGVpZ2h0IiwgIndpZHRoIl0sIGZ1bmN0aW9uIChlLCB0KSB7IHcuY3NzSG9va3NbdF0gPSB7IGdldDogZnVuY3Rpb24gKGUsIG4sIHIpIHsgaWYgKG4pIHJldHVybiAhX2UudGVzdCh3LmNzcyhlLCAiZGlzcGxheSIpKSB8fCBlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICYmIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPyBldChlLCB0LCByKSA6IHVlKGUsIFZlLCBmdW5jdGlvbiAoKSB7IHJldHVybiBldChlLCB0LCByKSB9KSB9LCBzZXQ6IGZ1bmN0aW9uIChlLCBuLCByKSB7IHZhciBpLCBvID0gV2UoZSksIGEgPSAiYm9yZGVyLWJveCIgPT09IHcuY3NzKGUsICJib3hTaXppbmciLCAhMSwgbyksIHUgPSByICYmIFplKGUsIHQsIHIsIGEsIG8pOyByZXR1cm4gYSAmJiBoLnNjcm9sbGJveFNpemUoKSA9PT0gby5wb3NpdGlvbiAmJiAodSAtPSBNYXRoLmNlaWwoZVsib2Zmc2V0IiArIHRbMF0udG9VcHBlckNhc2UoKSArIHQuc2xpY2UoMSldIC0gcGFyc2VGbG9hdChvW3RdKSAtIFplKGUsIHQsICJib3JkZXIiLCAhMSwgbykgLSAuNSkpLCB1ICYmIChpID0gaWUuZXhlYyhuKSkgJiYgInB4IiAhPT0gKGlbM10gfHwgInB4IikgJiYgKGUuc3R5bGVbdF0gPSBuLCBuID0gdy5jc3MoZSwgdCkpLCBKZShlLCBuLCB1KSB9IH0gfSksIHcuY3NzSG9va3MubWFyZ2luTGVmdCA9IHplKGgucmVsaWFibGVNYXJnaW5MZWZ0LCBmdW5jdGlvbiAoZSwgdCkgeyBpZiAodCkgcmV0dXJuIChwYXJzZUZsb2F0KEZlKGUsICJtYXJnaW5MZWZ0IikpIHx8IGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHVlKGUsIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbiAoKSB7IHJldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgfSkpICsgInB4IiB9KSwgdy5lYWNoKHsgbWFyZ2luOiAiIiwgcGFkZGluZzogIiIsIGJvcmRlcjogIldpZHRoIiB9LCBmdW5jdGlvbiAoZSwgdCkgeyB3LmNzc0hvb2tzW2UgKyB0XSA9IHsgZXhwYW5kOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciByID0gMCwgaSA9IHt9LCBvID0gInN0cmluZyIgPT0gdHlwZW9mIG4gPyBuLnNwbGl0KCIgIikgOiBbbl07IHIgPCA0OyByKyspaVtlICsgb2Vbcl0gKyB0XSA9IG9bcl0gfHwgb1tyIC0gMl0gfHwgb1swXTsgcmV0dXJuIGkgfSB9LCAibWFyZ2luIiAhPT0gZSAmJiAody5jc3NIb29rc1tlICsgdF0uc2V0ID0gSmUpIH0pLCB3LmZuLmV4dGVuZCh7IGNzczogZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuIF8odGhpcywgZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8gPSB7fSwgYSA9IDA7IGlmIChBcnJheS5pc0FycmF5KHQpKSB7IGZvciAociA9IFdlKGUpLCBpID0gdC5sZW5ndGg7IGEgPCBpOyBhKyspb1t0W2FdXSA9IHcuY3NzKGUsIHRbYV0sICExLCByKTsgcmV0dXJuIG8gfSByZXR1cm4gdm9pZCAwICE9PSBuID8gdy5zdHlsZShlLCB0LCBuKSA6IHcuY3NzKGUsIHQpIH0sIGUsIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB9IH0pLCB3LmZuLmRlbGF5ID0gZnVuY3Rpb24gKHQsIG4pIHsgcmV0dXJuIHQgPSB3LmZ4ID8gdy5meC5zcGVlZHNbdF0gfHwgdCA6IHQsIG4gPSBuIHx8ICJmeCIsIHRoaXMucXVldWUobiwgZnVuY3Rpb24gKG4sIHIpIHsgdmFyIGkgPSBlLnNldFRpbWVvdXQobiwgdCk7IHIuc3RvcCA9IGZ1bmN0aW9uICgpIHsgZS5jbGVhclRpbWVvdXQoaSkgfSB9KSB9LCBmdW5jdGlvbiAoKSB7IHZhciBlID0gci5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLCB0ID0gci5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTsgZS50eXBlID0gImNoZWNrYm94IiwgaC5jaGVja09uID0gIiIgIT09IGUudmFsdWUsIGgub3B0U2VsZWN0ZWQgPSB0LnNlbGVjdGVkLCAoZSA9IHIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWUgPSAidCIsIGUudHlwZSA9ICJyYWRpbyIsIGgucmFkaW9WYWx1ZSA9ICJ0IiA9PT0gZS52YWx1ZSB9KCk7IHZhciB0dCwgbnQgPSB3LmV4cHIuYXR0ckhhbmRsZTsgdy5mbi5leHRlbmQoeyBhdHRyOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gXyh0aGlzLCB3LmF0dHIsIGUsIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB9LCByZW1vdmVBdHRyOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgdy5yZW1vdmVBdHRyKHRoaXMsIGUpIH0pIH0gfSksIHcuZXh0ZW5kKHsgYXR0cjogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8gPSBlLm5vZGVUeXBlOyBpZiAoMyAhPT0gbyAmJiA4ICE9PSBvICYmIDIgIT09IG8pIHJldHVybiAidW5kZWZpbmVkIiA9PSB0eXBlb2YgZS5nZXRBdHRyaWJ1dGUgPyB3LnByb3AoZSwgdCwgbikgOiAoMSA9PT0gbyAmJiB3LmlzWE1MRG9jKGUpIHx8IChpID0gdy5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXSB8fCAody5leHByLm1hdGNoLmJvb2wudGVzdCh0KSA/IHR0IDogdm9pZCAwKSksIHZvaWQgMCAhPT0gbiA/IG51bGwgPT09IG4gPyB2b2lkIHcucmVtb3ZlQXR0cihlLCB0KSA6IGkgJiYgInNldCIgaW4gaSAmJiB2b2lkIDAgIT09IChyID0gaS5zZXQoZSwgbiwgdCkpID8gciA6IChlLnNldEF0dHJpYnV0ZSh0LCBuICsgIiIpLCBuKSA6IGkgJiYgImdldCIgaW4gaSAmJiBudWxsICE9PSAociA9IGkuZ2V0KGUsIHQpKSA/IHIgOiBudWxsID09IChyID0gdy5maW5kLmF0dHIoZSwgdCkpID8gdm9pZCAwIDogcikgfSwgYXR0ckhvb2tzOiB7IHR5cGU6IHsgc2V0OiBmdW5jdGlvbiAoZSwgdCkgeyBpZiAoIWgucmFkaW9WYWx1ZSAmJiAicmFkaW8iID09PSB0ICYmIEQoZSwgImlucHV0IikpIHsgdmFyIG4gPSBlLnZhbHVlOyByZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCB0KSwgbiAmJiAoZS52YWx1ZSA9IG4pLCB0IH0gfSB9IH0sIHJlbW92ZUF0dHI6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gMCwgaSA9IHQgJiYgdC5tYXRjaChJKTsgaWYgKGkgJiYgMSA9PT0gZS5ub2RlVHlwZSkgd2hpbGUgKG4gPSBpW3IrK10pIGUucmVtb3ZlQXR0cmlidXRlKG4pIH0gfSksIHR0ID0geyBzZXQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiAhMSA9PT0gdCA/IHcucmVtb3ZlQXR0cihlLCBuKSA6IGUuc2V0QXR0cmlidXRlKG4sIG4pLCBuIH0gfSwgdy5lYWNoKHcuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLCBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IG50W3RdIHx8IHcuZmluZC5hdHRyOyBudFt0XSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7IHZhciBpLCBvLCBhID0gdC50b0xvd2VyQ2FzZSgpOyByZXR1cm4gciB8fCAobyA9IG50W2FdLCBudFthXSA9IGksIGkgPSBudWxsICE9IG4oZSwgdCwgcikgPyBhIDogbnVsbCwgbnRbYV0gPSBvKSwgaSB9IH0pOyB2YXIgcnQgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLCBpdCA9IC9eKD86YXxhcmVhKSQvaTsgdy5mbi5leHRlbmQoeyBwcm9wOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gXyh0aGlzLCB3LnByb3AsIGUsIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB9LCByZW1vdmVQcm9wOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgZGVsZXRlIHRoaXNbdy5wcm9wRml4W2VdIHx8IGVdIH0pIH0gfSksIHcuZXh0ZW5kKHsgcHJvcDogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8gPSBlLm5vZGVUeXBlOyBpZiAoMyAhPT0gbyAmJiA4ICE9PSBvICYmIDIgIT09IG8pIHJldHVybiAxID09PSBvICYmIHcuaXNYTUxEb2MoZSkgfHwgKHQgPSB3LnByb3BGaXhbdF0gfHwgdCwgaSA9IHcucHJvcEhvb2tzW3RdKSwgdm9pZCAwICE9PSBuID8gaSAmJiAic2V0IiBpbiBpICYmIHZvaWQgMCAhPT0gKHIgPSBpLnNldChlLCBuLCB0KSkgPyByIDogZVt0XSA9IG4gOiBpICYmICJnZXQiIGluIGkgJiYgbnVsbCAhPT0gKHIgPSBpLmdldChlLCB0KSkgPyByIDogZVt0XSB9LCBwcm9wSG9va3M6IHsgdGFiSW5kZXg6IHsgZ2V0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHcuZmluZC5hdHRyKGUsICJ0YWJpbmRleCIpOyByZXR1cm4gdCA/IHBhcnNlSW50KHQsIDEwKSA6IHJ0LnRlc3QoZS5ub2RlTmFtZSkgfHwgaXQudGVzdChlLm5vZGVOYW1lKSAmJiBlLmhyZWYgPyAwIDogLTEgfSB9IH0sIHByb3BGaXg6IHsgImZvciI6ICJodG1sRm9yIiwgImNsYXNzIjogImNsYXNzTmFtZSIgfSB9KSwgaC5vcHRTZWxlY3RlZCB8fCAody5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7IGdldDogZnVuY3Rpb24gKGUpIHsgdmFyIHQgPSBlLnBhcmVudE5vZGU7IHJldHVybiB0ICYmIHQucGFyZW50Tm9kZSAmJiB0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwgbnVsbCB9LCBzZXQ6IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gZS5wYXJlbnROb2RlOyB0ICYmICh0LnNlbGVjdGVkSW5kZXgsIHQucGFyZW50Tm9kZSAmJiB0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCkgfSB9KSwgdy5lYWNoKFsidGFiSW5kZXgiLCAicmVhZE9ubHkiLCAibWF4TGVuZ3RoIiwgImNlbGxTcGFjaW5nIiwgImNlbGxQYWRkaW5nIiwgInJvd1NwYW4iLCAiY29sU3BhbiIsICJ1c2VNYXAiLCAiZnJhbWVCb3JkZXIiLCAiY29udGVudEVkaXRhYmxlIl0sIGZ1bmN0aW9uICgpIHsgdy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV0gPSB0aGlzIH0pOyBmdW5jdGlvbiBvdChlKSB7IHJldHVybiAoZS5tYXRjaChJKSB8fCBbXSkuam9pbigiICIpIH0gZnVuY3Rpb24gYXQoZSkgeyByZXR1cm4gZS5nZXRBdHRyaWJ1dGUgJiYgZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgfSBmdW5jdGlvbiB1dChlKSB7IHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZSA6ICJzdHJpbmciID09IHR5cGVvZiBlID8gZS5tYXRjaChJKSB8fCBbXSA6IFtdIH0gdy5mbi5leHRlbmQoeyBhZGRDbGFzczogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4sIHIsIGksIG8sIGEsIHUsIHMgPSAwOyBpZiAoZyhlKSkgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAodCkgeyB3KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLCB0LCBhdCh0aGlzKSkpIH0pOyBpZiAoKHQgPSB1dChlKSkubGVuZ3RoKSB3aGlsZSAobiA9IHRoaXNbcysrXSkgaWYgKGkgPSBhdChuKSwgciA9IDEgPT09IG4ubm9kZVR5cGUgJiYgIiAiICsgb3QoaSkgKyAiICIpIHsgYSA9IDA7IHdoaWxlIChvID0gdFthKytdKSByLmluZGV4T2YoIiAiICsgbyArICIgIikgPCAwICYmIChyICs9IG8gKyAiICIpOyBpICE9PSAodSA9IG90KHIpKSAmJiBuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB1KSB9IHJldHVybiB0aGlzIH0sIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiwgciwgaSwgbywgYSwgdSwgcyA9IDA7IGlmIChnKGUpKSByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICh0KSB7IHcodGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsIHQsIGF0KHRoaXMpKSkgfSk7IGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCAiIik7IGlmICgodCA9IHV0KGUpKS5sZW5ndGgpIHdoaWxlIChuID0gdGhpc1tzKytdKSBpZiAoaSA9IGF0KG4pLCByID0gMSA9PT0gbi5ub2RlVHlwZSAmJiAiICIgKyBvdChpKSArICIgIikgeyBhID0gMDsgd2hpbGUgKG8gPSB0W2ErK10pIHdoaWxlIChyLmluZGV4T2YoIiAiICsgbyArICIgIikgPiAtMSkgciA9IHIucmVwbGFjZSgiICIgKyBvICsgIiAiLCAiICIpOyBpICE9PSAodSA9IG90KHIpKSAmJiBuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB1KSB9IHJldHVybiB0aGlzIH0sIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IHR5cGVvZiBlLCByID0gInN0cmluZyIgPT09IG4gfHwgQXJyYXkuaXNBcnJheShlKTsgcmV0dXJuICJib29sZWFuIiA9PSB0eXBlb2YgdCAmJiByID8gdCA/IHRoaXMuYWRkQ2xhc3MoZSkgOiB0aGlzLnJlbW92ZUNsYXNzKGUpIDogZyhlKSA/IHRoaXMuZWFjaChmdW5jdGlvbiAobikgeyB3KHRoaXMpLnRvZ2dsZUNsYXNzKGUuY2FsbCh0aGlzLCBuLCBhdCh0aGlzKSwgdCksIHQpIH0pIDogdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsgdmFyIHQsIGksIG8sIGE7IGlmIChyKSB7IGkgPSAwLCBvID0gdyh0aGlzKSwgYSA9IHV0KGUpOyB3aGlsZSAodCA9IGFbaSsrXSkgby5oYXNDbGFzcyh0KSA/IG8ucmVtb3ZlQ2xhc3ModCkgOiBvLmFkZENsYXNzKHQpIH0gZWxzZSB2b2lkIDAgIT09IGUgJiYgImJvb2xlYW4iICE9PSBuIHx8ICgodCA9IGF0KHRoaXMpKSAmJiBLLnNldCh0aGlzLCAiX19jbGFzc05hbWVfXyIsIHQpLCB0aGlzLnNldEF0dHJpYnV0ZSAmJiB0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0IHx8ICExID09PSBlID8gIiIgOiBLLmdldCh0aGlzLCAiX19jbGFzc05hbWVfXyIpIHx8ICIiKSkgfSkgfSwgaGFzQ2xhc3M6IGZ1bmN0aW9uIChlKSB7IHZhciB0LCBuLCByID0gMDsgdCA9ICIgIiArIGUgKyAiICI7IHdoaWxlIChuID0gdGhpc1tyKytdKSBpZiAoMSA9PT0gbi5ub2RlVHlwZSAmJiAoIiAiICsgb3QoYXQobikpICsgIiAiKS5pbmRleE9mKHQpID4gLTEpIHJldHVybiAhMDsgcmV0dXJuICExIH0gfSk7IHZhciBzdCA9IC9cci9nOyB3LmZuLmV4dGVuZCh7IHZhbDogZnVuY3Rpb24gKGUpIHsgdmFyIHQsIG4sIHIsIGkgPSB0aGlzWzBdOyB7IGlmIChhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gciA9IGcoZSksIHRoaXMuZWFjaChmdW5jdGlvbiAobikgeyB2YXIgaTsgMSA9PT0gdGhpcy5ub2RlVHlwZSAmJiAobnVsbCA9PSAoaSA9IHIgPyBlLmNhbGwodGhpcywgbiwgdyh0aGlzKS52YWwoKSkgOiBlKSA/IGkgPSAiIiA6ICJudW1iZXIiID09IHR5cGVvZiBpID8gaSArPSAiIiA6IEFycmF5LmlzQXJyYXkoaSkgJiYgKGkgPSB3Lm1hcChpLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gbnVsbCA9PSBlID8gIiIgOiBlICsgIiIgfSkpLCAodCA9IHcudmFsSG9va3NbdGhpcy50eXBlXSB8fCB3LnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pICYmICJzZXQiIGluIHQgJiYgdm9pZCAwICE9PSB0LnNldCh0aGlzLCBpLCAidmFsdWUiKSB8fCAodGhpcy52YWx1ZSA9IGkpKSB9KTsgaWYgKGkpIHJldHVybiAodCA9IHcudmFsSG9va3NbaS50eXBlXSB8fCB3LnZhbEhvb2tzW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pICYmICJnZXQiIGluIHQgJiYgdm9pZCAwICE9PSAobiA9IHQuZ2V0KGksICJ2YWx1ZSIpKSA/IG4gOiAic3RyaW5nIiA9PSB0eXBlb2YgKG4gPSBpLnZhbHVlKSA/IG4ucmVwbGFjZShzdCwgIiIpIDogbnVsbCA9PSBuID8gIiIgOiBuIH0gfSB9KSwgdy5leHRlbmQoeyB2YWxIb29rczogeyBvcHRpb246IHsgZ2V0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IHcuZmluZC5hdHRyKGUsICJ2YWx1ZSIpOyByZXR1cm4gbnVsbCAhPSB0ID8gdCA6IG90KHcudGV4dChlKSkgfSB9LCBzZWxlY3Q6IHsgZ2V0OiBmdW5jdGlvbiAoZSkgeyB2YXIgdCwgbiwgciwgaSA9IGUub3B0aW9ucywgbyA9IGUuc2VsZWN0ZWRJbmRleCwgYSA9ICJzZWxlY3Qtb25lIiA9PT0gZS50eXBlLCB1ID0gYSA/IG51bGwgOiBbXSwgcyA9IGEgPyBvICsgMSA6IGkubGVuZ3RoOyBmb3IgKHIgPSBvIDwgMCA/IHMgOiBhID8gbyA6IDA7IHIgPCBzOyByKyspaWYgKCgobiA9IGlbcl0pLnNlbGVjdGVkIHx8IHIgPT09IG8pICYmICFuLmRpc2FibGVkICYmICghbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFEKG4ucGFyZW50Tm9kZSwgIm9wdGdyb3VwIikpKSB7IGlmICh0ID0gdyhuKS52YWwoKSwgYSkgcmV0dXJuIHQ7IHUucHVzaCh0KSB9IHJldHVybiB1IH0sIHNldDogZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIsIGkgPSBlLm9wdGlvbnMsIG8gPSB3Lm1ha2VBcnJheSh0KSwgYSA9IGkubGVuZ3RoOyB3aGlsZSAoYS0tKSAoKHIgPSBpW2FdKS5zZWxlY3RlZCA9IHcuaW5BcnJheSh3LnZhbEhvb2tzLm9wdGlvbi5nZXQociksIG8pID4gLTEpICYmIChuID0gITApOyByZXR1cm4gbiB8fCAoZS5zZWxlY3RlZEluZGV4ID0gLTEpLCBvIH0gfSB9IH0pLCB3LmVhY2goWyJyYWRpbyIsICJjaGVja2JveCJdLCBmdW5jdGlvbiAoKSB7IHcudmFsSG9va3NbdGhpc10gPSB7IHNldDogZnVuY3Rpb24gKGUsIHQpIHsgaWYgKEFycmF5LmlzQXJyYXkodCkpIHJldHVybiBlLmNoZWNrZWQgPSB3LmluQXJyYXkodyhlKS52YWwoKSwgdCkgPiAtMSB9IH0sIGguY2hlY2tPbiB8fCAody52YWxIb29rc1t0aGlzXS5nZXQgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gbnVsbCA9PT0gZS5nZXRBdHRyaWJ1dGUoInZhbHVlIikgPyAib24iIDogZS52YWx1ZSB9KSB9KSwgaC5mb2N1c2luID0gIm9uZm9jdXNpbiIgaW4gZTsgdmFyIGx0ID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLCBjdCA9IGZ1bmN0aW9uIChlKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCkgfTsgdy5leHRlbmQody5ldmVudCwgeyB0cmlnZ2VyOiBmdW5jdGlvbiAodCwgbiwgaSwgbykgeyB2YXIgYSwgdSwgcywgbCwgYywgZCwgcCwgaCwgeSA9IFtpIHx8IHJdLCBtID0gZi5jYWxsKHQsICJ0eXBlIikgPyB0LnR5cGUgOiB0LCBiID0gZi5jYWxsKHQsICJuYW1lc3BhY2UiKSA/IHQubmFtZXNwYWNlLnNwbGl0KCIuIikgOiBbXTsgaWYgKHUgPSBoID0gcyA9IGkgPSBpIHx8IHIsIDMgIT09IGkubm9kZVR5cGUgJiYgOCAhPT0gaS5ub2RlVHlwZSAmJiAhbHQudGVzdChtICsgdy5ldmVudC50cmlnZ2VyZWQpICYmIChtLmluZGV4T2YoIi4iKSA+IC0xICYmIChtID0gKGIgPSBtLnNwbGl0KCIuIikpLnNoaWZ0KCksIGIuc29ydCgpKSwgYyA9IG0uaW5kZXhPZigiOiIpIDwgMCAmJiAib24iICsgbSwgdCA9IHRbdy5leHBhbmRvXSA/IHQgOiBuZXcgdy5FdmVudChtLCAib2JqZWN0IiA9PSB0eXBlb2YgdCAmJiB0KSwgdC5pc1RyaWdnZXIgPSBvID8gMiA6IDMsIHQubmFtZXNwYWNlID0gYi5qb2luKCIuIiksIHQucm5hbWVzcGFjZSA9IHQubmFtZXNwYWNlID8gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBiLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIikgOiBudWxsLCB0LnJlc3VsdCA9IHZvaWQgMCwgdC50YXJnZXQgfHwgKHQudGFyZ2V0ID0gaSksIG4gPSBudWxsID09IG4gPyBbdF0gOiB3Lm1ha2VBcnJheShuLCBbdF0pLCBwID0gdy5ldmVudC5zcGVjaWFsW21dIHx8IHt9LCBvIHx8ICFwLnRyaWdnZXIgfHwgITEgIT09IHAudHJpZ2dlci5hcHBseShpLCBuKSkpIHsgaWYgKCFvICYmICFwLm5vQnViYmxlICYmICF2KGkpKSB7IGZvciAobCA9IHAuZGVsZWdhdGVUeXBlIHx8IG0sIGx0LnRlc3QobCArIG0pIHx8ICh1ID0gdS5wYXJlbnROb2RlKTsgdTsgdSA9IHUucGFyZW50Tm9kZSl5LnB1c2godSksIHMgPSB1OyBzID09PSAoaS5vd25lckRvY3VtZW50IHx8IHIpICYmIHkucHVzaChzLmRlZmF1bHRWaWV3IHx8IHMucGFyZW50V2luZG93IHx8IGUpIH0gYSA9IDA7IHdoaWxlICgodSA9IHlbYSsrXSkgJiYgIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkgaCA9IHUsIHQudHlwZSA9IGEgPiAxID8gbCA6IHAuYmluZFR5cGUgfHwgbSwgKGQgPSAoSy5nZXQodSwgImV2ZW50cyIpIHx8IHt9KVt0LnR5cGVdICYmIEsuZ2V0KHUsICJoYW5kbGUiKSkgJiYgZC5hcHBseSh1LCBuKSwgKGQgPSBjICYmIHVbY10pICYmIGQuYXBwbHkgJiYgWSh1KSAmJiAodC5yZXN1bHQgPSBkLmFwcGx5KHUsIG4pLCAhMSA9PT0gdC5yZXN1bHQgJiYgdC5wcmV2ZW50RGVmYXVsdCgpKTsgcmV0dXJuIHQudHlwZSA9IG0sIG8gfHwgdC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSB8fCBwLl9kZWZhdWx0ICYmICExICE9PSBwLl9kZWZhdWx0LmFwcGx5KHkucG9wKCksIG4pIHx8ICFZKGkpIHx8IGMgJiYgZyhpW21dKSAmJiAhdihpKSAmJiAoKHMgPSBpW2NdKSAmJiAoaVtjXSA9IG51bGwpLCB3LmV2ZW50LnRyaWdnZXJlZCA9IG0sIHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAmJiBoLmFkZEV2ZW50TGlzdGVuZXIobSwgY3QpLCBpW21dKCksIHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAmJiBoLnJlbW92ZUV2ZW50TGlzdGVuZXIobSwgY3QpLCB3LmV2ZW50LnRyaWdnZXJlZCA9IHZvaWQgMCwgcyAmJiAoaVtjXSA9IHMpKSwgdC5yZXN1bHQgfSB9LCBzaW11bGF0ZTogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIgPSB3LmV4dGVuZChuZXcgdy5FdmVudCwgbiwgeyB0eXBlOiBlLCBpc1NpbXVsYXRlZDogITAgfSk7IHcuZXZlbnQudHJpZ2dlcihyLCBudWxsLCB0KSB9IH0pLCB3LmZuLmV4dGVuZCh7IHRyaWdnZXI6IGZ1bmN0aW9uIChlLCB0KSB7IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgeyB3LmV2ZW50LnRyaWdnZXIoZSwgdCwgdGhpcykgfSkgfSwgdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuID0gdGhpc1swXTsgaWYgKG4pIHJldHVybiB3LmV2ZW50LnRyaWdnZXIoZSwgdCwgbiwgITApIH0gfSksIGguZm9jdXNpbiB8fCB3LmVhY2goeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuID0gZnVuY3Rpb24gKGUpIHsgdy5ldmVudC5zaW11bGF0ZSh0LCBlLnRhcmdldCwgdy5ldmVudC5maXgoZSkpIH07IHcuZXZlbnQuc3BlY2lhbFt0XSA9IHsgc2V0dXA6IGZ1bmN0aW9uICgpIHsgdmFyIHIgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywgaSA9IEsuYWNjZXNzKHIsIHQpOyBpIHx8IHIuYWRkRXZlbnRMaXN0ZW5lcihlLCBuLCAhMCksIEsuYWNjZXNzKHIsIHQsIChpIHx8IDApICsgMSkgfSwgdGVhcmRvd246IGZ1bmN0aW9uICgpIHsgdmFyIHIgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywgaSA9IEsuYWNjZXNzKHIsIHQpIC0gMTsgaSA/IEsuYWNjZXNzKHIsIHQsIGkpIDogKHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCBuLCAhMCksIEsucmVtb3ZlKHIsIHQpKSB9IH0gfSk7IHZhciBmdCA9IC9cW1xdJC8sIGR0ID0gL1xyP1xuL2csIHB0ID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLCBodCA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTsgZnVuY3Rpb24gZ3QoZSwgdCwgbiwgcikgeyB2YXIgaTsgaWYgKEFycmF5LmlzQXJyYXkodCkpIHcuZWFjaCh0LCBmdW5jdGlvbiAodCwgaSkgeyBuIHx8IGZ0LnRlc3QoZSkgPyByKGUsIGkpIDogZ3QoZSArICJbIiArICgib2JqZWN0IiA9PSB0eXBlb2YgaSAmJiBudWxsICE9IGkgPyB0IDogIiIpICsgIl0iLCBpLCBuLCByKSB9KTsgZWxzZSBpZiAobiB8fCAib2JqZWN0IiAhPT0gYih0KSkgcihlLCB0KTsgZWxzZSBmb3IgKGkgaW4gdCkgZ3QoZSArICJbIiArIGkgKyAiXSIsIHRbaV0sIG4sIHIpIH0gdy5wYXJhbSA9IGZ1bmN0aW9uIChlLCB0KSB7IHZhciBuLCByID0gW10sIGkgPSBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IGcodCkgPyB0KCkgOiB0OyByW3IubGVuZ3RoXSA9IGVuY29kZVVSSUNvbXBvbmVudChlKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudChudWxsID09IG4gPyAiIiA6IG4pIH07IGlmIChBcnJheS5pc0FycmF5KGUpIHx8IGUuanF1ZXJ5ICYmICF3LmlzUGxhaW5PYmplY3QoZSkpIHcuZWFjaChlLCBmdW5jdGlvbiAoKSB7IGkodGhpcy5uYW1lLCB0aGlzLnZhbHVlKSB9KTsgZWxzZSBmb3IgKG4gaW4gZSkgZ3QobiwgZVtuXSwgdCwgaSk7IHJldHVybiByLmpvaW4oIiYiKSB9LCB3LmZuLmV4dGVuZCh7IHNlcmlhbGl6ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpIH0sIHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoKSB7IHZhciBlID0gdy5wcm9wKHRoaXMsICJlbGVtZW50cyIpOyByZXR1cm4gZSA/IHcubWFrZUFycmF5KGUpIDogdGhpcyB9KS5maWx0ZXIoZnVuY3Rpb24gKCkgeyB2YXIgZSA9IHRoaXMudHlwZTsgcmV0dXJuIHRoaXMubmFtZSAmJiAhdyh0aGlzKS5pcygiOmRpc2FibGVkIikgJiYgaHQudGVzdCh0aGlzLm5vZGVOYW1lKSAmJiAhcHQudGVzdChlKSAmJiAodGhpcy5jaGVja2VkIHx8ICFkZS50ZXN0KGUpKSB9KS5tYXAoZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSB3KHRoaXMpLnZhbCgpOyByZXR1cm4gbnVsbCA9PSBuID8gbnVsbCA6IEFycmF5LmlzQXJyYXkobikgPyB3Lm1hcChuLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4geyBuYW1lOiB0Lm5hbWUsIHZhbHVlOiBlLnJlcGxhY2UoZHQsICJcclxuIikgfSB9KSA6IHsgbmFtZTogdC5uYW1lLCB2YWx1ZTogbi5yZXBsYWNlKGR0LCAiXHJcbiIpIH0gfSkuZ2V0KCkgfSB9KSwgdy5mbi5leHRlbmQoeyB3cmFwQWxsOiBmdW5jdGlvbiAoZSkgeyB2YXIgdDsgcmV0dXJuIHRoaXNbMF0gJiYgKGcoZSkgJiYgKGUgPSBlLmNhbGwodGhpc1swXSkpLCB0ID0gdyhlLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSwgdGhpc1swXS5wYXJlbnROb2RlICYmIHQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLCB0Lm1hcChmdW5jdGlvbiAoKSB7IHZhciBlID0gdGhpczsgd2hpbGUgKGUuZmlyc3RFbGVtZW50Q2hpbGQpIGUgPSBlLmZpcnN0RWxlbWVudENoaWxkOyByZXR1cm4gZSB9KS5hcHBlbmQodGhpcykpLCB0aGlzIH0sIHdyYXBJbm5lcjogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGcoZSkgPyB0aGlzLmVhY2goZnVuY3Rpb24gKHQpIHsgdyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsIHQpKSB9KSA6IHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7IHZhciB0ID0gdyh0aGlzKSwgbiA9IHQuY29udGVudHMoKTsgbi5sZW5ndGggPyBuLndyYXBBbGwoZSkgOiB0LmFwcGVuZChlKSB9KSB9LCB3cmFwOiBmdW5jdGlvbiAoZSkgeyB2YXIgdCA9IGcoZSk7IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKG4pIHsgdyh0aGlzKS53cmFwQWxsKHQgPyBlLmNhbGwodGhpcywgbikgOiBlKSB9KSB9LCB1bndyYXA6IGZ1bmN0aW9uIChlKSB7IHJldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uICgpIHsgdyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpIH0pLCB0aGlzIH0gfSksIHcuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiAhdy5leHByLnBzZXVkb3MudmlzaWJsZShlKSB9LCB3LmV4cHIucHNldWRvcy52aXNpYmxlID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuICEhKGUub2Zmc2V0V2lkdGggfHwgZS5vZmZzZXRIZWlnaHQgfHwgZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkgfSwgaC5jcmVhdGVIVE1MRG9jdW1lbnQgPSBmdW5jdGlvbiAoKSB7IHZhciBlID0gci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHk7IHJldHVybiBlLmlubmVySFRNTCA9ICI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsIDIgPT09IGUuY2hpbGROb2Rlcy5sZW5ndGggfSgpLCB3LnBhcnNlSFRNTCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7IGlmICgic3RyaW5nIiAhPSB0eXBlb2YgZSkgcmV0dXJuIFtdOyAiYm9vbGVhbiIgPT0gdHlwZW9mIHQgJiYgKG4gPSB0LCB0ID0gITEpOyB2YXIgaSwgbywgYTsgcmV0dXJuIHQgfHwgKGguY3JlYXRlSFRNTERvY3VtZW50ID8gKChpID0gKHQgPSByLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZiA9IHIubG9jYXRpb24uaHJlZiwgdC5oZWFkLmFwcGVuZENoaWxkKGkpKSA6IHQgPSByKSwgbyA9IFMuZXhlYyhlKSwgYSA9ICFuICYmIFtdLCBvID8gW3QuY3JlYXRlRWxlbWVudChvWzFdKV0gOiAobyA9IGJlKFtlXSwgdCwgYSksIGEgJiYgYS5sZW5ndGggJiYgdyhhKS5yZW1vdmUoKSwgdy5tZXJnZShbXSwgby5jaGlsZE5vZGVzKSkgfSwgdy5vZmZzZXQgPSB7IHNldE9mZnNldDogZnVuY3Rpb24gKGUsIHQsIG4pIHsgdmFyIHIsIGksIG8sIGEsIHUsIHMsIGwsIGMgPSB3LmNzcyhlLCAicG9zaXRpb24iKSwgZiA9IHcoZSksIGQgPSB7fTsgInN0YXRpYyIgPT09IGMgJiYgKGUuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiKSwgdSA9IGYub2Zmc2V0KCksIG8gPSB3LmNzcyhlLCAidG9wIiksIHMgPSB3LmNzcyhlLCAibGVmdCIpLCAobCA9ICgiYWJzb2x1dGUiID09PSBjIHx8ICJmaXhlZCIgPT09IGMpICYmIChvICsgcykuaW5kZXhPZigiYXV0byIpID4gLTEpID8gKGEgPSAociA9IGYucG9zaXRpb24oKSkudG9wLCBpID0gci5sZWZ0KSA6IChhID0gcGFyc2VGbG9hdChvKSB8fCAwLCBpID0gcGFyc2VGbG9hdChzKSB8fCAwKSwgZyh0KSAmJiAodCA9IHQuY2FsbChlLCBuLCB3LmV4dGVuZCh7fSwgdSkpKSwgbnVsbCAhPSB0LnRvcCAmJiAoZC50b3AgPSB0LnRvcCAtIHUudG9wICsgYSksIG51bGwgIT0gdC5sZWZ0ICYmIChkLmxlZnQgPSB0LmxlZnQgLSB1LmxlZnQgKyBpKSwgInVzaW5nIiBpbiB0ID8gdC51c2luZy5jYWxsKGUsIGQpIDogZi5jc3MoZCkgfSB9LCB3LmZuLmV4dGVuZCh7IG9mZnNldDogZnVuY3Rpb24gKGUpIHsgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2b2lkIDAgPT09IGUgPyB0aGlzIDogdGhpcy5lYWNoKGZ1bmN0aW9uICh0KSB7IHcub2Zmc2V0LnNldE9mZnNldCh0aGlzLCBlLCB0KSB9KTsgdmFyIHQsIG4sIHIgPSB0aGlzWzBdOyBpZiAocikgcmV0dXJuIHIuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPyAodCA9IHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIG4gPSByLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcsIHsgdG9wOiB0LnRvcCArIG4ucGFnZVlPZmZzZXQsIGxlZnQ6IHQubGVmdCArIG4ucGFnZVhPZmZzZXQgfSkgOiB7IHRvcDogMCwgbGVmdDogMCB9IH0sIHBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7IGlmICh0aGlzWzBdKSB7IHZhciBlLCB0LCBuLCByID0gdGhpc1swXSwgaSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07IGlmICgiZml4ZWQiID09PSB3LmNzcyhyLCAicG9zaXRpb24iKSkgdCA9IHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IGVsc2UgeyB0ID0gdGhpcy5vZmZzZXQoKSwgbiA9IHIub3duZXJEb2N1bWVudCwgZSA9IHIub2Zmc2V0UGFyZW50IHx8IG4uZG9jdW1lbnRFbGVtZW50OyB3aGlsZSAoZSAmJiAoZSA9PT0gbi5ib2R5IHx8IGUgPT09IG4uZG9jdW1lbnRFbGVtZW50KSAmJiAic3RhdGljIiA9PT0gdy5jc3MoZSwgInBvc2l0aW9uIikpIGUgPSBlLnBhcmVudE5vZGU7IGUgJiYgZSAhPT0gciAmJiAxID09PSBlLm5vZGVUeXBlICYmICgoaSA9IHcoZSkub2Zmc2V0KCkpLnRvcCArPSB3LmNzcyhlLCAiYm9yZGVyVG9wV2lkdGgiLCAhMCksIGkubGVmdCArPSB3LmNzcyhlLCAiYm9yZGVyTGVmdFdpZHRoIiwgITApKSB9IHJldHVybiB7IHRvcDogdC50b3AgLSBpLnRvcCAtIHcuY3NzKHIsICJtYXJnaW5Ub3AiLCAhMCksIGxlZnQ6IHQubGVmdCAtIGkubGVmdCAtIHcuY3NzKHIsICJtYXJnaW5MZWZ0IiwgITApIH0gfSB9LCBvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uICgpIHsgdmFyIGUgPSB0aGlzLm9mZnNldFBhcmVudDsgd2hpbGUgKGUgJiYgInN0YXRpYyIgPT09IHcuY3NzKGUsICJwb3NpdGlvbiIpKSBlID0gZS5vZmZzZXRQYXJlbnQ7IHJldHVybiBlIHx8IHhlIH0pIH0gfSksIHcuZWFjaCh7IHNjcm9sbExlZnQ6ICJwYWdlWE9mZnNldCIsIHNjcm9sbFRvcDogInBhZ2VZT2Zmc2V0IiB9LCBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9ICJwYWdlWU9mZnNldCIgPT09IHQ7IHcuZm5bZV0gPSBmdW5jdGlvbiAocikgeyByZXR1cm4gXyh0aGlzLCBmdW5jdGlvbiAoZSwgciwgaSkgeyB2YXIgbzsgaWYgKHYoZSkgPyBvID0gZSA6IDkgPT09IGUubm9kZVR5cGUgJiYgKG8gPSBlLmRlZmF1bHRWaWV3KSwgdm9pZCAwID09PSBpKSByZXR1cm4gbyA/IG9bdF0gOiBlW3JdOyBvID8gby5zY3JvbGxUbyhuID8gby5wYWdlWE9mZnNldCA6IGksIG4gPyBpIDogby5wYWdlWU9mZnNldCkgOiBlW3JdID0gaSB9LCBlLCByLCBhcmd1bWVudHMubGVuZ3RoKSB9IH0pLCB3LmVhY2goWyJ0b3AiLCAibGVmdCJdLCBmdW5jdGlvbiAoZSwgdCkgeyB3LmNzc0hvb2tzW3RdID0gemUoaC5waXhlbFBvc2l0aW9uLCBmdW5jdGlvbiAoZSwgbikgeyBpZiAobikgcmV0dXJuIG4gPSBGZShlLCB0KSwgTWUudGVzdChuKSA/IHcoZSkucG9zaXRpb24oKVt0XSArICJweCIgOiBuIH0pIH0pLCB3LmVhY2goeyBIZWlnaHQ6ICJoZWlnaHQiLCBXaWR0aDogIndpZHRoIiB9LCBmdW5jdGlvbiAoZSwgdCkgeyB3LmVhY2goeyBwYWRkaW5nOiAiaW5uZXIiICsgZSwgY29udGVudDogdCwgIiI6ICJvdXRlciIgKyBlIH0sIGZ1bmN0aW9uIChuLCByKSB7IHcuZm5bcl0gPSBmdW5jdGlvbiAoaSwgbykgeyB2YXIgYSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKG4gfHwgImJvb2xlYW4iICE9IHR5cGVvZiBpKSwgdSA9IG4gfHwgKCEwID09PSBpIHx8ICEwID09PSBvID8gIm1hcmdpbiIgOiAiYm9yZGVyIik7IHJldHVybiBfKHRoaXMsIGZ1bmN0aW9uICh0LCBuLCBpKSB7IHZhciBvOyByZXR1cm4gdih0KSA/IDAgPT09IHIuaW5kZXhPZigib3V0ZXIiKSA/IHRbImlubmVyIiArIGVdIDogdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBlXSA6IDkgPT09IHQubm9kZVR5cGUgPyAobyA9IHQuZG9jdW1lbnRFbGVtZW50LCBNYXRoLm1heCh0LmJvZHlbInNjcm9sbCIgKyBlXSwgb1sic2Nyb2xsIiArIGVdLCB0LmJvZHlbIm9mZnNldCIgKyBlXSwgb1sib2Zmc2V0IiArIGVdLCBvWyJjbGllbnQiICsgZV0pKSA6IHZvaWQgMCA9PT0gaSA/IHcuY3NzKHQsIG4sIHUpIDogdy5zdHlsZSh0LCBuLCBpLCB1KSB9LCB0LCBhID8gaSA6IHZvaWQgMCwgYSkgfSB9KSB9KSwgdy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLCBmdW5jdGlvbiAoZSwgdCkgeyB3LmZuW3RdID0gZnVuY3Rpb24gKGUsIG4pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gdGhpcy5vbih0LCBudWxsLCBlLCBuKSA6IHRoaXMudHJpZ2dlcih0KSB9IH0pLCB3LmZuLmV4dGVuZCh7IGhvdmVyOiBmdW5jdGlvbiAoZSwgdCkgeyByZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodCB8fCBlKSB9IH0pLCB3LmZuLmV4dGVuZCh7IGJpbmQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7IHJldHVybiB0aGlzLm9uKGUsIG51bGwsIHQsIG4pIH0sIHVuYmluZDogZnVuY3Rpb24gKGUsIHQpIHsgcmV0dXJuIHRoaXMub2ZmKGUsIG51bGwsIHQpIH0sIGRlbGVnYXRlOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgeyByZXR1cm4gdGhpcy5vbih0LCBlLCBuLCByKSB9LCB1bmRlbGVnYXRlOiBmdW5jdGlvbiAoZSwgdCwgbikgeyByZXR1cm4gMSA9PT0gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMub2ZmKGUsICIqKiIpIDogdGhpcy5vZmYodCwgZSB8fCAiKioiLCBuKSB9IH0pLCB3LnByb3h5ID0gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4sIHIsIGk7IGlmICgic3RyaW5nIiA9PSB0eXBlb2YgdCAmJiAobiA9IGVbdF0sIHQgPSBlLCBlID0gbiksIGcoZSkpIHJldHVybiByID0gby5jYWxsKGFyZ3VtZW50cywgMiksIGkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBlLmFwcGx5KHQgfHwgdGhpcywgci5jb25jYXQoby5jYWxsKGFyZ3VtZW50cykpKSB9LCBpLmd1aWQgPSBlLmd1aWQgPSBlLmd1aWQgfHwgdy5ndWlkKysgLCBpIH0sIHcuaG9sZFJlYWR5ID0gZnVuY3Rpb24gKGUpIHsgZSA/IHcucmVhZHlXYWl0KysgOiB3LnJlYWR5KCEwKSB9LCB3LmlzQXJyYXkgPSBBcnJheS5pc0FycmF5LCB3LnBhcnNlSlNPTiA9IEpTT04ucGFyc2UsIHcubm9kZU5hbWUgPSBELCB3LmlzRnVuY3Rpb24gPSBnLCB3LmlzV2luZG93ID0gdiwgdy5jYW1lbENhc2UgPSBRLCB3LnR5cGUgPSBiLCB3Lm5vdyA9IERhdGUubm93LCB3LmlzTnVtZXJpYyA9IGZ1bmN0aW9uIChlKSB7IHZhciB0ID0gdy50eXBlKGUpOyByZXR1cm4gKCJudW1iZXIiID09PSB0IHx8ICJzdHJpbmciID09PSB0KSAmJiAhaXNOYU4oZSAtIHBhcnNlRmxvYXQoZSkpIH0sICJmdW5jdGlvbiIgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kICYmIGRlZmluZSgianF1ZXJ5IiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHcgfSk7IHZhciB2dCA9IGUualF1ZXJ5LCB5dCA9IGUuJDsgcmV0dXJuIHcubm9Db25mbGljdCA9IGZ1bmN0aW9uICh0KSB7IHJldHVybiBlLiQgPT09IHcgJiYgKGUuJCA9IHl0KSwgdCAmJiBlLmpRdWVyeSA9PT0gdyAmJiAoZS5qUXVlcnkgPSB2dCksIHcgfSwgdCB8fCAoZS5qUXVlcnkgPSBlLiQgPSB3KSwgdyB9KTs=\"") - packr.PackJSONBytes("./assets/default", "wails.js", "\"Ly8gV2FpbHMgcnVudGltZSBKUwoKKGZ1bmN0aW9uICgpIHsKCXdpbmRvdy53YWlscyA9IHdpbmRvdy53YWlscyB8fCB7CgkJJDoge30KCX07CgoJLyoqKioqKioqKioqKioqKioqKiBVdGlsaXR5IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLy8gLS0tLS0tLS0tLS0tLS0gUmFuZG9tIC0tLS0tLS0tLS0tLS0tCgkvLyBBd2Vzb21lUmFuZG9tCglmdW5jdGlvbiBjcnlwdG9SYW5kb20oKSB7CgkJdmFyIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpOwoJCXJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSlbMF07Cgl9CgoJLy8gTE9MUmFuZG9tCglmdW5jdGlvbiBiYXNpY1JhbmRvbSgpIHsKCQlyZXR1cm4gTWF0aC5yYW5kb20oKSAqIDkwMDcxOTkyNTQ3NDA5OTE7Cgl9CgoJLy8gUGljayBvbmUgYmFzZWQgb24gYnJvd3NlciBjYXBhYmlsaXR5Cgl2YXIgcmFuZG9tRnVuYzsKCWlmICh3aW5kb3cuY3J5cHRvKSB7CgkJcmFuZG9tRnVuYyA9IGNyeXB0b1JhbmRvbTsKCX0gZWxzZSB7CgkJcmFuZG9tRnVuYyA9IGJhc2ljUmFuZG9tOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIElkZW50aWZpZXJzIC0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0aW9uIGlzVmFsaWRJZGVudGlmaWVyKG5hbWUpIHsKCQkvLyBEb24ndCB4c3MgeW91cnNlbGYgOi0pCgkJdHJ5IHsKCQkJbmV3IEZ1bmN0aW9uKCJ2YXIgIiArIG5hbWUpOwoJCQlyZXR1cm4gdHJ1ZQoJCX0gY2F0Y2ggKGUpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIEpTIC0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGFkZFNjcmlwdChqcywgY2FsbGJhY2tJRCkgewoJCWNvbnNvbGUubG9nKCJBZGRpbmcgc2NyaXB0OiAiICsganMpCgkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoJCXNjcmlwdC50ZXh0ID0ganM7CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpOwoJCWNvbnNvbGUubG9nKCJDYWxsaW5nIGJhY2sgd2l0aDoiICsgY2FsbGJhY2tJRCk7CgkJd2luZG93LndhaWxzLmV2ZW50cy5lbWl0KGNhbGxiYWNrSUQpOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIEhUTUwgLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIHNldERvY3VtZW50KGh0bWwpIHsKCQlkb2N1bWVudC5vcGVuKCk7CgkJZG9jdW1lbnQud3JpdGUoaHRtbCk7CgkJZG9jdW1lbnQuY2xvc2UoKTsKCX0KCgkvLyAtLS0tLS0tLS0tLS0tLSBDU1MgLS0tLS0tLS0tLS0tLS0tCgkvLyBBZGFwdGVkIGZyb20gd2VidmlldyAtIHRoYW5rcyB6c2VyZ2UhCglmdW5jdGlvbiBpbmplY3RDU1MoY3NzKSB7CgkJdmFyIGVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwoJCWVsZW0uc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7CgkJaWYgKGVsZW0uc3R5bGVTaGVldCkgewoJCQllbGVtLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzczsKCQl9IGVsc2UgewoJCQllbGVtLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpOwoJCX0KCQl2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKCQloZWFkLmFwcGVuZENoaWxkKGVsZW0pCgl9CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKiogQmluZGluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgl2YXIgYmluZGluZ3NCYXNlUGF0aCA9IHdpbmRvdy53YWlscy4kOwoKCS8vIENyZWF0ZXMgdGhlIHBhdGggZ2l2ZW4gaW4gdGhlIGJpbmRpbmdzIHBhdGgKCWZ1bmN0aW9uIGFkZEJpbmRpbmdQYXRoKHBhdGhTZWN0aW9ucykgewoJCS8vIFN0YXJ0IGF0IHRoZSBiYXNlIHBhdGgKCQl2YXIgY3VycmVudFBhdGggPSBiaW5kaW5nc0Jhc2VQYXRoCgkJLy8gZm9yIGVhY2ggc2VjdGlvbiBvZiB0aGUgZ2l2ZW4gcGF0aAoJCWZvciAodmFyIHNlY3Rpb24gb2YgcGF0aFNlY3Rpb25zKSB7CgoJCQkvLyBJcyBzZWN0aW9uIGEgdmFsaWQgamF2YXNjcmlwdCBpZGVudGlmaWVyPwoJCQlpZiAoIWlzVmFsaWRJZGVudGlmaWVyKHNlY3Rpb24pKSB7CgkJCQl2YXIgZXJyTWVzc2FnZSA9IHNlY3Rpb24gKyAiIGlzIG5vdCBhIHZhbGlkIGphdmFzY3JpcHQgaWRlbnRpZmllci4iCgkJCQl2YXIgZXJyID0gbmV3IEVycm9yKGVyck1lc3NhZ2UpCgkJCQlyZXR1cm4gW251bGwsIGVycl0KCQkJfQoKCQkJLy8gQWRkIGlmIGRvZXNuJ3QgZXhpc3QKCQkJaWYgKCFjdXJyZW50UGF0aFtzZWN0aW9uXSkgewoJCQkJY3VycmVudFBhdGhbc2VjdGlvbl0gPSB7fQoJCQl9CgkJCS8vIHVwZGF0ZSBjdXJyZW50IHBhdGggdG8gbmV3IHBhdGgKCQkJY3VycmVudFBhdGggPSBjdXJyZW50UGF0aFtzZWN0aW9uXQoJCX0KCQlyZXR1cm4gW2N1cnJlbnRQYXRoLCBudWxsXQoJfQoKCWZ1bmN0aW9uIG5ld0JpbmRpbmcoYmluZGluZ05hbWUpIHsKCgkJLy8gR2V0IGFsbCB0aGUgc2VjdGlvbnMgb2YgdGhlIGJpbmRpbmcKCQl2YXIgYmluZGluZ1NlY3Rpb25zID0gYmluZGluZ05hbWUuc3BsaXQoJy4nKTsKCgkJLy8gR2V0IHRoZSBhY3R1YWwgZnVuY3Rpb24vbWV0aG9kIGNhbGwgbmFtZQoJCXZhciBjYWxsTmFtZSA9IGJpbmRpbmdTZWN0aW9ucy5wb3AoKTsKCgkJLy8gQWRkIHBhdGggdG8gYmluZGluZwoJCVtwYXRoVG9CaW5kaW5nLCBlcnJdID0gYWRkQmluZGluZ1BhdGgoYmluZGluZ1NlY3Rpb25zKQoKCQlpZiAoZXJyICE9IG51bGwpIHsKCQkJLy8gV2UgbmVlZCB0byByZXR1cm4gYW4gZXJyb3IKCQkJLy8gd2luZG93LndhaWxzLmxvZy5FcnJvcigiIikKCQkJcmV0dXJuCgkJfQoKCQkvLyBBZGQgYmluZGluZyBjYWxsCgkJcGF0aFRvQmluZGluZ1tjYWxsTmFtZV0gPSBmdW5jdGlvbiAoKSB7CgoJCQkvLyBObyB0aW1lb3V0IGJ5IGRlZmF1bHQKCQkJdmFyIHRpbWVvdXQgPSAwOwoKCQkJLy8gQWN0dWFsIGZ1bmN0aW9uCgkJCWZ1bmN0aW9uIGR5bmFtaWMoKSB7CgkJCQl2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKQoJCQkJcmV0dXJuIGNhbGwoYmluZGluZ05hbWUsIGFyZ3MsIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBBbGxvdyBzZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKG5ld1RpbWVvdXQpIHsKCQkJCXRpbWVvdXQgPSBuZXdUaW1lb3V0OwoJCQl9CgoJCQkvLyBBbGxvdyBnZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5nZXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkgewoJCQkJcmV0dXJuIHRpbWVvdXQ7CgkJCX0KCgkJCXJldHVybiBkeW5hbWljOwoJCX0oKTsKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQ2FsbHMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJdmFyIGNhbGxiYWNrcyA9IHt9OwoKCS8vIENhbGwgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHRvIGNhbGwgdGhlIGJpbmRpbmcgd2l0aCB0aGUKCS8vIGdpdmVuIGRhdGEuIEEgcHJvbWlzZSBpcyByZXR1cm5lZCBhbmQgd2lsbCBiZSBjb21wbGV0ZWQgd2hlbiB0aGUKCS8vIGJhY2tlbmQgcmVzcG9uZHMuIFRoaXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsCgkvLyBvciByZWplY3RlZCBpZiBhbiBlcnJvciBpcyBwYXNzZWQgYmFjay4KCS8vIFRoZXJlIGlzIGEgdGltZW91dCBtZWNoYW5pc20uIElmIHRoZSBjYWxsIGRvZXNuJ3QgcmVzcG9uZCBpbiB0aGUgZ2l2ZW4KCS8vIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlbiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC4KCglmdW5jdGlvbiBjYWxsKGJpbmRpbmdOYW1lLCBkYXRhLCB0aW1lb3V0KSB7CgoJCS8vIFRpbWVvdXQgaW5maW5pdGUgYnkgZGVmYXVsdAoJCWlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dCA9PSB1bmRlZmluZWQpIHsKCQkJdGltZW91dCA9IDA7CgkJfQoKCQkvLyBDcmVhdGUgYSBwcm9taXNlCgkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKCgkJCS8vIENyZWF0ZSBhIHVuaXF1ZSBjYWxsYmFja0lECgkJCXZhciBjYWxsYmFja0lEOwoJCQlkbyB7CgkJCQljYWxsYmFja0lEID0gYmluZGluZ05hbWUgKyAiLSIgKyByYW5kb21GdW5jKCk7CgkJCX0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSkKCgkJCS8vIFNldCB0aW1lb3V0CgkJCWlmICh0aW1lb3V0ID4gMCkgewoJCQkJdmFyIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCQlyZWplY3QoRXJyb3IoIkNhbGwgdG8gIiArIGJpbmRpbmdOYW1lICsgIiB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICIgKyBjYWxsYmFja0lEKSkKCQkJCX0sIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBTdG9yZSBjYWxsYmFjawoJCQljYWxsYmFja3NbY2FsbGJhY2tJRF0gPSB7CgkJCQl0aW1lb3V0SGFuZGxlOiB0aW1lb3V0SGFuZGxlLAoJCQkJcmVqZWN0OiByZWplY3QsCgkJCQlyZXNvbHZlOiByZXNvbHZlCgkJCX0KCQkJdHJ5IHsKCQkJCXZhciBwYXlsb2FkZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpCgkJCQkvLyBDcmVhdGUgdGhlIG1lc3NhZ2UKCQkJCW1lc3NhZ2UgPSB7CgkJCQkJdHlwZTogImNhbGwiLAoJCQkJCWNhbGxiYWNraWQ6IGNhbGxiYWNrSUQsCgkJCQkJcGF5bG9hZDogewoJCQkJCQliaW5kaW5nTmFtZTogYmluZGluZ05hbWUsCgkJCQkJCWRhdGE6IHBheWxvYWRkYXRhLAoJCQkJCX0KCQkJCX0KCgkJCQkvLyBNYWtlIHRoZSBjYWxsCgkJCQl2YXIgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpCgkJCQlleHRlcm5hbC5pbnZva2UocGF5bG9hZCk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWNvbnNvbGUuZXJyb3IoZSkKCQkJfQoJCX0pCgl9CgoKCS8vIENhbGxlZCBieSB0aGUgYmFja2VuZCB0byByZXR1cm4gZGF0YSB0byBhIHByZXZpb3VzbHkgY2FsbGVkCgkvLyBiaW5kaW5nIGludm9jYXRpb24KCWZ1bmN0aW9uIGNhbGxiYWNrKGluY29taW5nTWVzc2FnZSkgewoJCS8vIHdhaWxzLmxvZy5kZWJ1ZygiY2FsbGJhY2sgY2FsbGVkIHdpdGg6ICIgKyBpbmNvbWluZ01lc3NhZ2UpCgkJLy8gUGFyc2UgdGhlIG1lc3NhZ2UKCQl2YXIgbWVzc2FnZQoJCS8vIHdhaWxzLmxvZy5kZWJ1ZyhpbmNvbWluZ01lc3NhZ2UpCgkJdHJ5IHsKCQkJbWVzc2FnZSA9IEpTT04ucGFyc2UoaW5jb21pbmdNZXNzYWdlKQoJCX0gY2F0Y2ggKGUpIHsKCQkJd2FpbHMubG9nLmRlYnVnKCJJbnZhbGlkIEpTT04gcGFzc2VkIHRvIGNhbGxiYWNrOiAiICsgZS5tZXNzYWdlKQoJCQl3YWlscy5sb2cuZGVidWcoIk1lc3NhZ2U6ICIgKyBpbmNvbWluZ01lc3NhZ2UpCgkJCXJldHVybgoJCX0KCQljYWxsYmFja0lEID0gbWVzc2FnZS5jYWxsYmFja2lkCgkJY2FsbGJhY2tEYXRhID0gY2FsbGJhY2tzW2NhbGxiYWNrSURdCgkJaWYgKCFjYWxsYmFja0RhdGEpIHsKCQkJY29uc29sZS5lcnJvcigiQ2FsbGJhY2sgJyIgKyBjYWxsYmFja0lEICsgIicgbm90IHJlZ2lzdGVkISEhIikKCQkJcmV0dXJuCgkJfQoJCWNsZWFyVGltZW91dChjYWxsYmFja0RhdGEudGltZW91dEhhbmRsZSkKCQlkZWxldGUgY2FsbGJhY2tzW2NhbGxiYWNrSURdCgkJaWYgKG1lc3NhZ2UuZXJyb3IpIHsKCQkJcmV0dXJuIGNhbGxiYWNrRGF0YS5yZWplY3QobWVzc2FnZS5lcnJvcikKCQl9CgkJcmV0dXJuIGNhbGxiYWNrRGF0YS5yZXNvbHZlKG1lc3NhZ2UuZGF0YSkKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiogRXZlbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXZhciBldmVudExpc3RlbmVycyA9IHt9OwoKCS8vIFJlZ2lzdGVycyBldmVudCBsaXN0ZW5lcnMKCWZ1bmN0aW9uIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKCQlldmVudExpc3RlbmVyc1tldmVudE5hbWVdID0gZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSB8fCBbXTsKCQlldmVudExpc3RlbmVyc1tldmVudE5hbWVdLnB1c2goY2FsbGJhY2spOwoJfQoKCS8vIG5vdGlmeSBpbmZvcm1zIGZyb250ZW5kIGxpc3RlbmVycyB0aGF0IGFuIGV2ZW50IHdhcyBlbWl0dGVkIHdpdGggdGhlIGdpdmVuIGRhdGEKCWZ1bmN0aW9uIG5vdGlmeShldmVudE5hbWUsIGRhdGEpIHsKCQlpZiAoZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSkgewoJCQlldmVudExpc3RlbmVyc1tldmVudE5hbWVdLmZvckVhY2goZWxlbWVudCA9PiB7CgkJCQl2YXIgcGFyc2VkRGF0YSA9IFtdCgkJCQkvLyBQYXJzZSBkYXRhIGlmIHdlIGhhdmUgaXQKCQkJCWlmIChkYXRhKSB7CgkJCQkJdHJ5IHsKCQkJCQkJcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7CgkJCQkJfSBjYXRjaCAoZSkgewoJCQkJCQl3YWlscy5sb2cuZXJyb3IoIkludmFsaWQgSlNPTiBkYXRhIHNlbnQgdG8gbm90aWZ5LiBFdmVudCBuYW1lID0gIiArIGV2ZW50TmFtZSkKCQkJCQl9CgkJCQl9CgkJCQllbGVtZW50LmFwcGx5KG51bGwsIHBhcnNlZERhdGEpOwoJCQl9KTsKCQl9Cgl9CgoJLy8gZW1pdCBhbiBldmVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBkYXRhCglmdW5jdGlvbiBlbWl0KGV2ZW50TmFtZSkgewoKCQkvLyBDYWxjdWxhdGUgdGhlIGRhdGEKCQl2YXIgZGF0YSA9IEpTT04uc3RyaW5naWZ5KFtdLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykuc2xpY2UoMSkpOwoKCQkvLyBOb3RpZnkgYmFja2VuZAoJCW1lc3NhZ2UgPSB7CgkJCXR5cGU6ICJldmVudCIsCgkJCXBheWxvYWQ6IHsKCQkJCW5hbWU6IGV2ZW50TmFtZSwKCQkJCWRhdGE6IGRhdGEsCgkJCX0KCQl9CgkJZXh0ZXJuYWwuaW52b2tlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTsKCX0KCgkvLyBFdmVudHMgY2FsbHMKCXdpbmRvdy53YWlscy5ldmVudHMgPSB7IGVtaXQ6IGVtaXQsIG9uOiBvbiB9OwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLyoqKioqKioqKioqKioqKioqKioqKioqKiogTG9nZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgkvLyBTZW5kcyBhIGxvZyBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHdpdGggdGhlIGdpdmVuCgkvLyBsZXZlbCArIG1lc3NhZ2UKCWZ1bmN0aW9uIHNlbmRMb2dNZXNzYWdlKGxldmVsLCBtZXNzYWdlKSB7CgoJCS8vIExvZyBNZXNzYWdlCgkJbWVzc2FnZSA9IHsKCQkJdHlwZTogImxvZyIsCgkJCXBheWxvYWQ6IHsKCQkJCWxldmVsOiBsZXZlbCwKCQkJCW1lc3NhZ2U6IG1lc3NhZ2UsCgkJCX0KCQl9CgkJZXh0ZXJuYWwuaW52b2tlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTsKCX0KCglmdW5jdGlvbiBsb2dEZWJ1ZyhtZXNzYWdlKSB7CgkJc2VuZExvZ01lc3NhZ2UoImRlYnVnIiwgbWVzc2FnZSk7Cgl9CglmdW5jdGlvbiBsb2dJbmZvKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiaW5mbyIsIG1lc3NhZ2UpOwoJfQoJZnVuY3Rpb24gbG9nV2FybmluZyhtZXNzYWdlKSB7CgkJc2VuZExvZ01lc3NhZ2UoIndhcm5pbmciLCBtZXNzYWdlKTsKCX0KCWZ1bmN0aW9uIGxvZ0Vycm9yKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiZXJyb3IiLCBtZXNzYWdlKTsKCX0KCWZ1bmN0aW9uIGxvZ0ZhdGFsKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiZmF0YWwiLCBtZXNzYWdlKTsKCX0KCgl3aW5kb3cud2FpbHMubG9nID0gewoJCWRlYnVnOiBsb2dEZWJ1ZywKCQlpbmZvOiBsb2dJbmZvLAoJCXdhcm5pbmc6IGxvZ1dhcm5pbmcsCgkJZXJyb3I6IGxvZ0Vycm9yLAoJCWZhdGFsOiBsb2dGYXRhbCwKCX07CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEV4cG9ydHMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgl3aW5kb3cud2FpbHMuXyA9IHsKCQluZXdCaW5kaW5nOiBuZXdCaW5kaW5nLAoJCWNhbGxiYWNrOiBjYWxsYmFjaywKCQlub3RpZnk6IG5vdGlmeSwKCQlzZW5kTG9nTWVzc2FnZTogc2VuZExvZ01lc3NhZ2UsCgkJY2FsbGJhY2tzOiBjYWxsYmFja3MsCgkJaW5qZWN0Q1NTOiBpbmplY3RDU1MsCgkJYWRkU2NyaXB0OiBhZGRTY3JpcHQsCgkJc2V0RG9jdW1lbnQ6IHNldERvY3VtZW50LAoJfQoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLy8gTm90aWZ5IGJhY2tlbmQgdGhhdCB0aGUgcnVudGltZSBoYXMgZmluaXNoZWQgbG9hZGluZwoJd2luZG93LndhaWxzLmV2ZW50cy5lbWl0KCJ3YWlsczpsb2FkZWQiKTsKCn0pKCk=\"") + packr.PackJSONBytes("./assets/default", "wails.js", "\"Ly8gV2FpbHMgcnVudGltZSBKUwoKKGZ1bmN0aW9uICgpIHsKCXdpbmRvdy53YWlscyA9IHdpbmRvdy53YWlscyB8fCB7CgkJJDoge30KCX07CgoJLyoqKioqKioqKioqKioqKioqKiBVdGlsaXR5IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLy8gLS0tLS0tLS0tLS0tLS0gUmFuZG9tIC0tLS0tLS0tLS0tLS0tCgkvLyBBd2Vzb21lUmFuZG9tCglmdW5jdGlvbiBjcnlwdG9SYW5kb20oKSB7CgkJdmFyIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpOwoJCXJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSlbMF07Cgl9CgoJLy8gTE9MUmFuZG9tCglmdW5jdGlvbiBiYXNpY1JhbmRvbSgpIHsKCQlyZXR1cm4gTWF0aC5yYW5kb20oKSAqIDkwMDcxOTkyNTQ3NDA5OTE7Cgl9CgoJLy8gUGljayBvbmUgYmFzZWQgb24gYnJvd3NlciBjYXBhYmlsaXR5Cgl2YXIgcmFuZG9tRnVuYzsKCWlmICh3aW5kb3cuY3J5cHRvKSB7CgkJcmFuZG9tRnVuYyA9IGNyeXB0b1JhbmRvbTsKCX0gZWxzZSB7CgkJcmFuZG9tRnVuYyA9IGJhc2ljUmFuZG9tOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIElkZW50aWZpZXJzIC0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0aW9uIGlzVmFsaWRJZGVudGlmaWVyKG5hbWUpIHsKCQkvLyBEb24ndCB4c3MgeW91cnNlbGYgOi0pCgkJdHJ5IHsKCQkJbmV3IEZ1bmN0aW9uKCJ2YXIgIiArIG5hbWUpOwoJCQlyZXR1cm4gdHJ1ZQoJCX0gY2F0Y2ggKGUpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIEpTIC0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGFkZFNjcmlwdChqcywgY2FsbGJhY2tJRCkgewoJCWNvbnNvbGUubG9nKCJBZGRpbmcgc2NyaXB0OiAiICsganMpCgkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoJCXNjcmlwdC50ZXh0ID0ganM7CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpOwoJCWNvbnNvbGUubG9nKCJDYWxsaW5nIGJhY2sgd2l0aDoiICsgY2FsbGJhY2tJRCk7CgkJd2luZG93LndhaWxzLmV2ZW50cy5lbWl0KGNhbGxiYWNrSUQpOwoJfQoKCS8vIC0tLS0tLS0tLS0tLS0tIENTUyAtLS0tLS0tLS0tLS0tLS0KCS8vIEFkYXB0ZWQgZnJvbSB3ZWJ2aWV3IC0gdGhhbmtzIHpzZXJnZSEKCWZ1bmN0aW9uIGluamVjdENTUyhjc3MpIHsKCQl2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgkJZWxlbS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTsKCQlpZiAoZWxlbS5zdHlsZVNoZWV0KSB7CgkJCWVsZW0uc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzOwoJCX0gZWxzZSB7CgkJCWVsZW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7CgkJfQoJCXZhciBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwoJCWhlYWQuYXBwZW5kQ2hpbGQoZWxlbSkKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiBCaW5kaW5ncyAqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXZhciBiaW5kaW5nc0Jhc2VQYXRoID0gd2luZG93LndhaWxzLiQ7CgoJLy8gQ3JlYXRlcyB0aGUgcGF0aCBnaXZlbiBpbiB0aGUgYmluZGluZ3MgcGF0aAoJZnVuY3Rpb24gYWRkQmluZGluZ1BhdGgocGF0aFNlY3Rpb25zKSB7CgkJLy8gU3RhcnQgYXQgdGhlIGJhc2UgcGF0aAoJCXZhciBjdXJyZW50UGF0aCA9IGJpbmRpbmdzQmFzZVBhdGgKCQkvLyBmb3IgZWFjaCBzZWN0aW9uIG9mIHRoZSBnaXZlbiBwYXRoCgkJZm9yICh2YXIgc2VjdGlvbiBvZiBwYXRoU2VjdGlvbnMpIHsKCgkJCS8vIElzIHNlY3Rpb24gYSB2YWxpZCBqYXZhc2NyaXB0IGlkZW50aWZpZXI/CgkJCWlmICghaXNWYWxpZElkZW50aWZpZXIoc2VjdGlvbikpIHsKCQkJCXZhciBlcnJNZXNzYWdlID0gc2VjdGlvbiArICIgaXMgbm90IGEgdmFsaWQgamF2YXNjcmlwdCBpZGVudGlmaWVyLiIKCQkJCXZhciBlcnIgPSBuZXcgRXJyb3IoZXJyTWVzc2FnZSkKCQkJCXJldHVybiBbbnVsbCwgZXJyXQoJCQl9CgoJCQkvLyBBZGQgaWYgZG9lc24ndCBleGlzdAoJCQlpZiAoIWN1cnJlbnRQYXRoW3NlY3Rpb25dKSB7CgkJCQljdXJyZW50UGF0aFtzZWN0aW9uXSA9IHt9CgkJCX0KCQkJLy8gdXBkYXRlIGN1cnJlbnQgcGF0aCB0byBuZXcgcGF0aAoJCQljdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoW3NlY3Rpb25dCgkJfQoJCXJldHVybiBbY3VycmVudFBhdGgsIG51bGxdCgl9CgoJZnVuY3Rpb24gbmV3QmluZGluZyhiaW5kaW5nTmFtZSkgewoKCQkvLyBHZXQgYWxsIHRoZSBzZWN0aW9ucyBvZiB0aGUgYmluZGluZwoJCXZhciBiaW5kaW5nU2VjdGlvbnMgPSBiaW5kaW5nTmFtZS5zcGxpdCgnLicpOwoKCQkvLyBHZXQgdGhlIGFjdHVhbCBmdW5jdGlvbi9tZXRob2QgY2FsbCBuYW1lCgkJdmFyIGNhbGxOYW1lID0gYmluZGluZ1NlY3Rpb25zLnBvcCgpOwoKCQkvLyBBZGQgcGF0aCB0byBiaW5kaW5nCgkJW3BhdGhUb0JpbmRpbmcsIGVycl0gPSBhZGRCaW5kaW5nUGF0aChiaW5kaW5nU2VjdGlvbnMpCgoJCWlmIChlcnIgIT0gbnVsbCkgewoJCQkvLyBXZSBuZWVkIHRvIHJldHVybiBhbiBlcnJvcgoJCQlyZXR1cm4gZXJyCgkJfQoKCQkvLyBBZGQgYmluZGluZyBjYWxsCgkJcGF0aFRvQmluZGluZ1tjYWxsTmFtZV0gPSBmdW5jdGlvbiAoKSB7CgoJCQkvLyBObyB0aW1lb3V0IGJ5IGRlZmF1bHQKCQkJdmFyIHRpbWVvdXQgPSAwOwoKCQkJLy8gQWN0dWFsIGZ1bmN0aW9uCgkJCWZ1bmN0aW9uIGR5bmFtaWMoKSB7CgkJCQl2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKQoJCQkJcmV0dXJuIGNhbGwoYmluZGluZ05hbWUsIGFyZ3MsIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBBbGxvdyBzZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKG5ld1RpbWVvdXQpIHsKCQkJCXRpbWVvdXQgPSBuZXdUaW1lb3V0OwoJCQl9CgoJCQkvLyBBbGxvdyBnZXR0aW5nIHRpbWVvdXQgdG8gZnVuY3Rpb24KCQkJZHluYW1pYy5nZXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkgewoJCQkJcmV0dXJuIHRpbWVvdXQ7CgkJCX0KCgkJCXJldHVybiBkeW5hbWljOwoJCX0oKTsKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQ2FsbHMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJdmFyIGNhbGxiYWNrcyA9IHt9OwoKCS8vIENhbGwgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYWNrZW5kIHRvIGNhbGwgdGhlIGJpbmRpbmcgd2l0aCB0aGUKCS8vIGdpdmVuIGRhdGEuIEEgcHJvbWlzZSBpcyByZXR1cm5lZCBhbmQgd2lsbCBiZSBjb21wbGV0ZWQgd2hlbiB0aGUKCS8vIGJhY2tlbmQgcmVzcG9uZHMuIFRoaXMgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsCgkvLyBvciByZWplY3RlZCBpZiBhbiBlcnJvciBpcyBwYXNzZWQgYmFjay4KCS8vIFRoZXJlIGlzIGEgdGltZW91dCBtZWNoYW5pc20uIElmIHRoZSBjYWxsIGRvZXNuJ3QgcmVzcG9uZCBpbiB0aGUgZ2l2ZW4KCS8vIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlbiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZC4KCglmdW5jdGlvbiBjYWxsKGJpbmRpbmdOYW1lLCBkYXRhLCB0aW1lb3V0KSB7CgoJCS8vIFRpbWVvdXQgaW5maW5pdGUgYnkgZGVmYXVsdAoJCWlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dCA9PSB1bmRlZmluZWQpIHsKCQkJdGltZW91dCA9IDA7CgkJfQoKCQkvLyBDcmVhdGUgYSBwcm9taXNlCgkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKCgkJCS8vIENyZWF0ZSBhIHVuaXF1ZSBjYWxsYmFja0lECgkJCXZhciBjYWxsYmFja0lEOwoJCQlkbyB7CgkJCQljYWxsYmFja0lEID0gYmluZGluZ05hbWUgKyAiLSIgKyByYW5kb21GdW5jKCk7CgkJCX0gd2hpbGUgKGNhbGxiYWNrc1tjYWxsYmFja0lEXSkKCgkJCS8vIFNldCB0aW1lb3V0CgkJCWlmICh0aW1lb3V0ID4gMCkgewoJCQkJdmFyIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCQlyZWplY3QoRXJyb3IoIkNhbGwgdG8gIiArIGJpbmRpbmdOYW1lICsgIiB0aW1lZCBvdXQuIFJlcXVlc3QgSUQ6ICIgKyBjYWxsYmFja0lEKSkKCQkJCX0sIHRpbWVvdXQpOwoJCQl9CgoJCQkvLyBTdG9yZSBjYWxsYmFjawoJCQljYWxsYmFja3NbY2FsbGJhY2tJRF0gPSB7CgkJCQl0aW1lb3V0SGFuZGxlOiB0aW1lb3V0SGFuZGxlLAoJCQkJcmVqZWN0OiByZWplY3QsCgkJCQlyZXNvbHZlOiByZXNvbHZlCgkJCX0KCQkJdHJ5IHsKCQkJCXZhciBwYXlsb2FkZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpCgkJCQkvLyBDcmVhdGUgdGhlIG1lc3NhZ2UKCQkJCW1lc3NhZ2UgPSB7CgkJCQkJdHlwZTogImNhbGwiLAoJCQkJCWNhbGxiYWNraWQ6IGNhbGxiYWNrSUQsCgkJCQkJcGF5bG9hZDogewoJCQkJCQliaW5kaW5nTmFtZTogYmluZGluZ05hbWUsCgkJCQkJCWRhdGE6IHBheWxvYWRkYXRhLAoJCQkJCX0KCQkJCX0KCgkJCQkvLyBNYWtlIHRoZSBjYWxsCgkJCQl2YXIgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpCgkJCQlleHRlcm5hbC5pbnZva2UocGF5bG9hZCk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWNvbnNvbGUuZXJyb3IoZSkKCQkJfQoJCX0pCgl9CgoKCS8vIENhbGxlZCBieSB0aGUgYmFja2VuZCB0byByZXR1cm4gZGF0YSB0byBhIHByZXZpb3VzbHkgY2FsbGVkCgkvLyBiaW5kaW5nIGludm9jYXRpb24KCWZ1bmN0aW9uIGNhbGxiYWNrKGluY29taW5nTWVzc2FnZSkgewoJCS8vIFBhcnNlIHRoZSBtZXNzYWdlCgkJdmFyIG1lc3NhZ2UKCQl0cnkgewoJCQltZXNzYWdlID0gSlNPTi5wYXJzZShpbmNvbWluZ01lc3NhZ2UpCgkJfSBjYXRjaCAoZSkgewoJCQl3YWlscy5sb2cuZGVidWcoIkludmFsaWQgSlNPTiBwYXNzZWQgdG8gY2FsbGJhY2s6ICIgKyBlLm1lc3NhZ2UpCgkJCXdhaWxzLmxvZy5kZWJ1ZygiTWVzc2FnZTogIiArIGluY29taW5nTWVzc2FnZSkKCQkJcmV0dXJuCgkJfQoJCWNhbGxiYWNrSUQgPSBtZXNzYWdlLmNhbGxiYWNraWQKCQljYWxsYmFja0RhdGEgPSBjYWxsYmFja3NbY2FsbGJhY2tJRF0KCQlpZiAoIWNhbGxiYWNrRGF0YSkgewoJCQljb25zb2xlLmVycm9yKCJDYWxsYmFjayAnIiArIGNhbGxiYWNrSUQgKyAiJyBub3QgcmVnaXN0ZWQhISEiKQoJCQlyZXR1cm4KCQl9CgkJY2xlYXJUaW1lb3V0KGNhbGxiYWNrRGF0YS50aW1lb3V0SGFuZGxlKQoJCWRlbGV0ZSBjYWxsYmFja3NbY2FsbGJhY2tJRF0KCQlpZiAobWVzc2FnZS5lcnJvcikgewoJCQlyZXR1cm4gY2FsbGJhY2tEYXRhLnJlamVjdChtZXNzYWdlLmVycm9yKQoJCX0KCQlyZXR1cm4gY2FsbGJhY2tEYXRhLnJlc29sdmUobWVzc2FnZS5kYXRhKQoJfQoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBFdmVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJdmFyIGV2ZW50TGlzdGVuZXJzID0ge307CgoJLy8gUmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycwoJZnVuY3Rpb24gb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewoJCWV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdIHx8IFtdOwoJCWV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaChjYWxsYmFjayk7Cgl9CgoJLy8gbm90aWZ5IGluZm9ybXMgZnJvbnRlbmQgbGlzdGVuZXJzIHRoYXQgYW4gZXZlbnQgd2FzIGVtaXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGF0YQoJZnVuY3Rpb24gbm90aWZ5KGV2ZW50TmFtZSwgZGF0YSkgewoJCWlmIChldmVudExpc3RlbmVyc1tldmVudE5hbWVdKSB7CgkJCWV2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0uZm9yRWFjaChlbGVtZW50ID0+IHsKCQkJCXZhciBwYXJzZWREYXRhID0gW10KCQkJCS8vIFBhcnNlIGRhdGEgaWYgd2UgaGF2ZSBpdAoJCQkJaWYgKGRhdGEpIHsKCQkJCQl0cnkgewoJCQkJCQlwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkYXRhKTsKCQkJCQl9IGNhdGNoIChlKSB7CgkJCQkJCXdhaWxzLmxvZy5lcnJvcigiSW52YWxpZCBKU09OIGRhdGEgc2VudCB0byBub3RpZnkuIEV2ZW50IG5hbWUgPSAiICsgZXZlbnROYW1lKQoJCQkJCX0KCQkJCX0KCQkJCWVsZW1lbnQuYXBwbHkobnVsbCwgcGFyc2VkRGF0YSk7CgkJCX0pOwoJCX0KCX0KCgkvLyBlbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGRhdGEKCWZ1bmN0aW9uIGVtaXQoZXZlbnROYW1lKSB7CgoJCS8vIENhbGN1bGF0ZSB0aGUgZGF0YQoJCXZhciBkYXRhID0gSlNPTi5zdHJpbmdpZnkoW10uc2xpY2UuYXBwbHkoYXJndW1lbnRzKS5zbGljZSgxKSk7CgoJCS8vIE5vdGlmeSBiYWNrZW5kCgkJbWVzc2FnZSA9IHsKCQkJdHlwZTogImV2ZW50IiwKCQkJcGF5bG9hZDogewoJCQkJbmFtZTogZXZlbnROYW1lLAoJCQkJZGF0YTogZGF0YSwKCQkJfQoJCX0KCQlleHRlcm5hbC5pbnZva2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpOwoJfQoKCS8vIEV2ZW50cyBjYWxscwoJd2luZG93LndhaWxzLmV2ZW50cyA9IHsgZW1pdDogZW1pdCwgb246IG9uIH07CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2dnaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8vIFNlbmRzIGEgbG9nIG1lc3NhZ2UgdG8gdGhlIGJhY2tlbmQgd2l0aCB0aGUgZ2l2ZW4KCS8vIGxldmVsICsgbWVzc2FnZQoJZnVuY3Rpb24gc2VuZExvZ01lc3NhZ2UobGV2ZWwsIG1lc3NhZ2UpIHsKCgkJLy8gTG9nIE1lc3NhZ2UKCQltZXNzYWdlID0gewoJCQl0eXBlOiAibG9nIiwKCQkJcGF5bG9hZDogewoJCQkJbGV2ZWw6IGxldmVsLAoJCQkJbWVzc2FnZTogbWVzc2FnZSwKCQkJfQoJCX0KCQlleHRlcm5hbC5pbnZva2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpOwoJfQoKCWZ1bmN0aW9uIGxvZ0RlYnVnKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgiZGVidWciLCBtZXNzYWdlKTsKCX0KCWZ1bmN0aW9uIGxvZ0luZm8obWVzc2FnZSkgewoJCXNlbmRMb2dNZXNzYWdlKCJpbmZvIiwgbWVzc2FnZSk7Cgl9CglmdW5jdGlvbiBsb2dXYXJuaW5nKG1lc3NhZ2UpIHsKCQlzZW5kTG9nTWVzc2FnZSgid2FybmluZyIsIG1lc3NhZ2UpOwoJfQoJZnVuY3Rpb24gbG9nRXJyb3IobWVzc2FnZSkgewoJCXNlbmRMb2dNZXNzYWdlKCJlcnJvciIsIG1lc3NhZ2UpOwoJfQoJZnVuY3Rpb24gbG9nRmF0YWwobWVzc2FnZSkgewoJCXNlbmRMb2dNZXNzYWdlKCJmYXRhbCIsIG1lc3NhZ2UpOwoJfQoKCXdpbmRvdy53YWlscy5sb2cgPSB7CgkJZGVidWc6IGxvZ0RlYnVnLAoJCWluZm86IGxvZ0luZm8sCgkJd2FybmluZzogbG9nV2FybmluZywKCQllcnJvcjogbG9nRXJyb3IsCgkJZmF0YWw6IGxvZ0ZhdGFsLAoJfTsKCgkvKioqKioqKioqKioqKioqKioqKioqKioqKiogRXhwb3J0cyAqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXdpbmRvdy53YWlscy5fID0gewoJCW5ld0JpbmRpbmc6IG5ld0JpbmRpbmcsCgkJY2FsbGJhY2s6IGNhbGxiYWNrLAoJCW5vdGlmeTogbm90aWZ5LAoJCXNlbmRMb2dNZXNzYWdlOiBzZW5kTG9nTWVzc2FnZSwKCQljYWxsYmFja3M6IGNhbGxiYWNrcywKCQlpbmplY3RDU1M6IGluamVjdENTUywKCQlhZGRTY3JpcHQ6IGFkZFNjcmlwdCwKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8vIE5vdGlmeSBiYWNrZW5kIHRoYXQgdGhlIHJ1bnRpbWUgaGFzIGZpbmlzaGVkIGxvYWRpbmcKCXdpbmRvdy53YWlscy5ldmVudHMuZW1pdCgid2FpbHM6bG9hZGVkIik7Cgp9KSgp\"") packr.PackJSONBytes("./assets/headless", "index.html", "\"PGh0bWw+Cgo8aGVhZD4KICA8dGl0bGU+V2FpbHMgSGVhZGxlc3M8L3RpdGxlPgogIDxzdHlsZT4KICAgIC53YWlscy1yZWNvbm5lY3Qtb3ZlcmxheSB7CiAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiAwOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwogICAgICBkaXNwbGF5OiBub25lOwogICAgICB6LWluZGV4OiA5OTk5OTk7CiAgICB9CgogICAgLndhaWxzLXJlY29ubmVjdC1vdmVybGF5LWNvbnRlbnQgewogICAgICBwYWRkaW5nOiAyMHB4IDMwcHg7CiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgd2lkdGg6IDIwZW07CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgaGVpZ2h0OiAxN2VtOwogICAgICBib3JkZXItcmFkaXVzOiAxZW07CiAgICAgIG1hcmdpbjogNSUgYXV0byAwOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgYm94LXNoYWRvdzogMXB4IDFweCAyMHB4IDNweDsKICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUM4QUFBQXVDQU1BQUFDUHBiQTdBQUFBcUZCTVZFVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVCQVFBQUFBQUFBQUVCQVFBQUFBQUFBQUFBQUFFQkFRRUJBUURBd01CQVFFQUFBQUJBUUVBQUFBQUFBQUFBQUFCQVFFQUFBQUFBQUFDQWdJQ0FnSUJBUUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQVFFQUFBQUNBZ0lBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFGQlFXS0NqNm9BQUFBTjNSU1RsTUFMaUlxRGhrR0JBc3dKalAwR3hQNk5SNFc5L3p0alJETWhXVTUwRzlnNWVIWHZiWjlYRUk5eFpUY3FabDJhbGRLbzU1UXdvQ3ZaVWd6aEFBQUFzOUpSRUZVU01lTmxlZVdxakFVaFUwQkNhSDNJdGl3OXpLVDkzK3pHMDJRSzFobS81SEYranpaSjZmUWU2Y3lYRStqZzlYN285d3h1eWxJSWY0VHYyVjMrYk9yRVhuZjhkd1EvS1FJR0ROMi9TKzRPbVZDVlhML1NjQm5maWJ4VVJxSUJ5UC9oT05FOHI4VCtiRE1sUTk4S1NsN1k4aHpqcFM4djFxdERoOHU1ZjhLUXBHcGZuUFBocUc4SmVvZ04zN0hxOWVhTjJ4UmhJd0FhR252d3M4RjFTaHhxSzVvYjJ0d1lpMUZBTUQ0clhzWXRuQy9KRWlSYmw0Y1VyQ1dobk1DTFJGZW1YZXpYYmI1OVFLNFdBU09zbTZuMlcxKzRDQlQySm10elE2ZnNyYkd1YlIvTkZiZDJnNVkxNzkrNXcvR0VIYUtzSGpZQ2V0N0NnclhVM3R4YXJOQzdZeE9WSnRJajQvRVJ6TWRaZnpjMzFocCs4Y0Q2ZUdJTGdhclpZOXVaMTJoQXMwM3ZmQkQ5QzE3MWdTNU9tejdPY3Z4QUxRSW40dThSUkJCQmNzaTlXVzJ3b085aXBMZ2Z6cFlsZ2dnM1pSZFJPVUM4S1Q3UUxxcTNXOUtCNUJiZEZWZzQ5MjlrZHdwNitxYVpuTUNDTkJkaitOeU4xVzg4NVJ5L0FMM0Q0QVFic1ZWNG5vQ2lNL0M4M2t5WXE4MFhsREFZUXRyYWxPaUR6b1JBSGxvdFdsOHEydGp2WWxPZ2NnMUE4akVBcFphK0MwNlRCZEF6MlF2MHd1MTFJL3paT3lKUTZFd0dlejJQMmI4UElRcjFod3duQVpzQXh3QTRVQVlPeVhVeE0veHA2dEhBbjRHVW1QR005UjI4b1Z4Z0MwZS96UUpKSTZEeWh5WjFyN3V6UlFocGNXN3g3dlRhV1N6S1NHNmFlcDc3a3JvVEVsM1U4MXVTVmFVVHRnRUlOZkM4ZXB4K1E0RjlTcHBsSEc4NEVrNm00UkFxOS9UTGtPQnJ4eWV1ZGRaaEh2R0lwMVhYZkZ5M1ozdnR3TmJsS0dpRG4rSis5MnZ3d0FCSGdoajdIbnpsUzFINWtCNDlBWnZkR0NGZ2lCUHE2OXFmWFByM3krK3lpbEYwT040UjhlUjdzcEFzTHBaOTVOcUFXNXRhYjFjNHZrWm02YWxlYWpjaE13WVRkSUxRUVR3RTJPVjQxMVpNOVd6dERqUHFsMTJjYUJpNmdEcFVLbURkNFUxWE5kUXhaNExJWFE1L1RyNFA3STl0WWNGckRLM0FBQUFBRWxGVGtTdVFtQ0MiKTsKICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgfQoKICAgIC53YWlscy1yZWNvbm5lY3Qtb3ZlcmxheS10aXRsZSB7CiAgICAgIGZvbnQtc2l6ZTogMmVtOwogICAgfQoKICAgIC53YWlscy1yZWNvbm5lY3Qtb3ZlcmxheS1tZXNzYWdlIHsKICAgICAgZm9udC1zaXplOiAxLjNlbTsKICAgIH0KCiAgICAvKiBodHRwczovL2NvZGVwZW4uaW8vRWFzdGluZ0FuZE5vcnRoaW5nL3Blbi9hTldyWnogLSBDaGVlcnMgTWFyayEgKi8KCiAgICAud2FpbHMtcmVjb25uZWN0LW92ZXJsYXktbG9hZGluZ3NwaW5uZXIgewogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgd2lkdGg6IDIuNWVtOwogICAgICBoZWlnaHQ6IDIuNWVtOwogICAgICBib3JkZXI6IDAuNGVtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICBib3JkZXItY29sb3I6ICNlZWU7CiAgICAgIGJvcmRlci10b3AtY29sb3I6ICMzRTY3RUM7CiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgYW5pbWF0aW9uOiBsb2FkaW5nc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIG1hcmdpbjogYXV0bzsKICAgICAgcGFkZGluZzogMi41ZW07CiAgICB9CgogICAgQGtleWZyYW1lcyBsb2FkaW5nc3BpbiB7CiAgICAgIDEwMCUgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykKICAgICAgfQogICAgfQogIDwvc3R5bGU+CjwvaGVhZD4KCjxib2R5PgogIDxkaXYgY2xhc3M9IndhaWxzLXJlY29ubmVjdC1vdmVybGF5Ij4KICAgIDxkaXYgY2xhc3M9IndhaWxzLXJlY29ubmVjdC1vdmVybGF5LWNvbnRlbnQiPgogICAgICA8ZGl2IGNsYXNzPSJ3YWlscy1yZWNvbm5lY3Qtb3ZlcmxheS10aXRsZSI+RGlzY29ubmVjdGVkPC9kaXY+PGJyPgogICAgICA8ZGl2IGNsYXNzPSJ3YWlscy1yZWNvbm5lY3Qtb3ZlcmxheS1sb2FkaW5nc3Bpbm5lciI+PC9kaXY+PGJyPgogICAgICA8ZGl2IGNsYXNzPSJ3YWlscy1yZWNvbm5lY3Qtb3ZlcmxheS1tZXNzYWdlIj5XYWl0aW5nIGZvciBiYWNrZW5kPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KCiAgPGRpdiBpZD0iYXBwIj48L2Rpdj4KCiAgPHNjcmlwdCBpZD0id2FpbHMtaGVhZGxlc3MtcnVudGltZSI+CiAgICAoZnVuY3Rpb24gKCkgewoKICAgICAgdmFyIHdlYnNvY2tldCA9IG51bGw7CiAgICAgIHZhciBjb25uZWN0VGltZXIgPSBudWxsOwogICAgICB2YXIgcmVjb25uZWN0T3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi53YWlscy1yZWNvbm5lY3Qtb3ZlcmxheSIpOwogICAgICB2YXIgY29ubmVjdGlvblN0YXRlID0gImRpc2Nvbm5lY3RlZCI7CgogICAgICBmdW5jdGlvbiBzaG93UmVjb25uZWN0T3ZlcmxheSgpIHsKICAgICAgICByZWNvbm5lY3RPdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlUmVjb25uZWN0T3ZlcmxheSgpIHsKICAgICAgICByZWNvbm5lY3RPdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIH0KCiAgICAgIHdpbmRvdy5leHRlcm5hbCA9IHsKICAgICAgICBpbnZva2U6IGZ1bmN0aW9uIChtc2cpIHsKICAgICAgICAgIHdlYnNvY2tldC5zZW5kKG1zZyk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgZnVuY3Rpb24gYWRkU2NyaXB0KHNjcmlwdCwgaWQpIHsKICAgICAgICB2YXIgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpCiAgICAgICAgaWYgKGlkKSB7CiAgICAgICAgICBzLmlkID0gaWQ7CiAgICAgICAgfQogICAgICAgIHMudGV4dENvbnRlbnQgPSBzY3JpcHQ7CiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKQogICAgICB9CgogICAgICBmdW5jdGlvbiBoYW5kbGVDb25uZWN0KCkgewogICAgICAgIGNvbnNvbGUubG9nKCJbV2FpbHNdIENvbm5lY3RlZCB0byBiYWNrZW5kIik7CiAgICAgICAgYWRkS2V5TGlzdGVuZXIoKTsKICAgICAgICBoaWRlUmVjb25uZWN0T3ZlcmxheSgpOwogICAgICAgIGNsZWFySW50ZXJ2YWwoY29ubmVjdFRpbWVyKTsKICAgICAgICB3ZWJzb2NrZXQub25jbG9zZSA9IGhhbmRsZURpc2Nvbm5lY3Q7CiAgICAgICAgd2Vic29ja2V0Lm9ubWVzc2FnZSA9IGhhbmRsZU1lc3NhZ2U7CiAgICAgICAgY29ubmVjdGlvblN0YXRlID0gImNvbm5lY3RlZCI7CiAgICAgICAgLy8gd2Vic29ja2V0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGFuZGxlRGlzY29ubmVjdCgpIHsKICAgICAgICBjb25zb2xlLmxvZygiW1dhaWxzXSBEaXNjb25uZWN0ZWQgZnJvbSBiYWNrZW5kIik7CiAgICAgICAgd2Vic29ja2V0ID0gbnVsbDsKICAgICAgICByZW1vdmVLZXlMaXN0ZW5lcigpOwogICAgICAgIGNvbm5lY3Rpb25TdGF0ZSA9ICJkaXNjb25uZWN0ZWQiOwogICAgICAgIHNob3dSZWNvbm5lY3RPdmVybGF5KCk7CiAgICAgICAgY29ubmVjdCgpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBjb25uZWN0KCkgewogICAgICAgIGNvbm5lY3RUaW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGlmICh3ZWJzb2NrZXQgPT0gbnVsbCkgewogICAgICAgICAgICB3ZWJzb2NrZXQgPSBuZXcgV2ViU29ja2V0KCJ3czovL2xvY2FsaG9zdDozNDExNS93cyIpCiAgICAgICAgICAgIHdlYnNvY2tldC5vbm9wZW4gPSBoYW5kbGVDb25uZWN0OwogICAgICAgICAgICB3ZWJzb2NrZXQub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICB3ZWJzb2NrZXQgPSBudWxsOwogICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwgMzAwKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGFuZGxlTWVzc2FnZShlKSB7CiAgICAgICAgYWRkU2NyaXB0KGUuZGF0YSk7CiAgICAgIH0KCiAgICAgIC8vIEtleSBsaXN0ZW5lcgogICAgICB2YXIgZGVsdGEgPSAzMDA7CiAgICAgIHZhciBsYXN0S2V5cHJlc3NUaW1lID0gMDsKICAgICAgZnVuY3Rpb24gS2V5SGFuZGxlcihldmVudCkgewogICAgICAgIGlmIChldmVudC5rZXkgPT09ICJgIikgewogICAgICAgICAgdmFyIHRoaXNLZXlwcmVzc1RpbWUgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgaWYgKHRoaXNLZXlwcmVzc1RpbWUgLSBsYXN0S2V5cHJlc3NUaW1lIDw9IGRlbHRhKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJEb3VibGUgdGFwISIpCiAgICAgICAgICAgIC8vIG9wdGlvbmFsIC0gaWYgd2UnZCByYXRoZXIgbm90IGRldGVjdCBhIHRyaXBsZS1wcmVzcwogICAgICAgICAgICAvLyBhcyBhIHNlY29uZCBkb3VibGUtcHJlc3MsIHJlc2V0IHRoZSB0aW1lc3RhbXAKICAgICAgICAgICAgdGhpc0tleXByZXNzVGltZSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBsYXN0S2V5cHJlc3NUaW1lID0gdGhpc0tleXByZXNzVGltZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFkZEtleUxpc3RlbmVyKCkgewogICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIEtleUhhbmRsZXIpOwogICAgICB9CgogICAgICBmdW5jdGlvbiByZW1vdmVLZXlMaXN0ZW5lcigpIHsKICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBLZXlIYW5kbGVyKTsKICAgICAgfQoKICAgICAgY29ubmVjdCgpOwoKCiAgICB9KCkpOwoKICA8L3NjcmlwdD4KCjwvYm9keT4KCjwvaHRtbD4=\"") } diff --git a/assets/default/default.html b/assets/default/default.html new file mode 100644 index 000000000..865e670f4 --- /dev/null +++ b/assets/default/default.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/assets/default/jquery.3.3.1.min.js b/assets/default/jquery.3.3.1.min.js new file mode 100644 index 000000000..25e5e180c --- /dev/null +++ b/assets/default/jquery.3.3.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.3.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ +!function (e, t) { "use strict"; "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function (e) { if (!e.document) throw new Error("jQuery requires a window with a document"); return t(e) } : t(e) }("undefined" != typeof window ? window : this, function (e, t) { "use strict"; var n = [], r = e.document, i = Object.getPrototypeOf, o = n.slice, a = n.concat, u = n.push, s = n.indexOf, l = {}, c = l.toString, f = l.hasOwnProperty, d = f.toString, p = d.call(Object), h = {}, g = function e(t) { return "function" == typeof t && "number" != typeof t.nodeType }, v = function e(t) { return null != t && t === t.window }, y = { type: !0, src: !0, noModule: !0 }; function m(e, t, n) { var i, o = (t = t || r).createElement("script"); if (o.text = e, n) for (i in y) n[i] && (o[i] = n[i]); t.head.appendChild(o).parentNode.removeChild(o) } function b(e) { return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? l[c.call(e)] || "object" : typeof e } var x = "3.3.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector", w = function (e, t) { return new w.fn.init(e, t) }, C = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; w.fn = w.prototype = { jquery: x, constructor: w, length: 0, toArray: function () { return o.call(this) }, get: function (e) { return null == e ? o.call(this) : e < 0 ? this[e + this.length] : this[e] }, pushStack: function (e) { var t = w.merge(this.constructor(), e); return t.prevObject = this, t }, each: function (e) { return w.each(this, e) }, map: function (e) { return this.pushStack(w.map(this, function (t, n) { return e.call(t, n, t) })) }, slice: function () { return this.pushStack(o.apply(this, arguments)) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, eq: function (e) { var t = this.length, n = +e + (e < 0 ? t : 0); return this.pushStack(n >= 0 && n < t ? [this[n]] : []) }, end: function () { return this.prevObject || this.constructor() }, push: u, sort: n.sort, splice: n.splice }, w.extend = w.fn.extend = function () { var e, t, n, r, i, o, a = arguments[0] || {}, u = 1, s = arguments.length, l = !1; for ("boolean" == typeof a && (l = a, a = arguments[u] || {}, u++), "object" == typeof a || g(a) || (a = {}), u === s && (a = this, u--); u < s; u++)if (null != (e = arguments[u])) for (t in e) n = a[t], a !== (r = e[t]) && (l && r && (w.isPlainObject(r) || (i = Array.isArray(r))) ? (i ? (i = !1, o = n && Array.isArray(n) ? n : []) : o = n && w.isPlainObject(n) ? n : {}, a[t] = w.extend(l, o, r)) : void 0 !== r && (a[t] = r)); return a }, w.extend({ expando: "jQuery" + (x + Math.random()).replace(/\D/g, ""), isReady: !0, error: function (e) { throw new Error(e) }, noop: function () { }, isPlainObject: function (e) { var t, n; return !(!e || "[object Object]" !== c.call(e)) && (!(t = i(e)) || "function" == typeof (n = f.call(t, "constructor") && t.constructor) && d.call(n) === p) }, isEmptyObject: function (e) { var t; for (t in e) return !1; return !0 }, globalEval: function (e) { m(e) }, each: function (e, t) { var n, r = 0; if (T(e)) { for (n = e.length; r < n; r++)if (!1 === t.call(e[r], r, e[r])) break } else for (r in e) if (!1 === t.call(e[r], r, e[r])) break; return e }, trim: function (e) { return null == e ? "" : (e + "").replace(C, "") }, makeArray: function (e, t) { var n = t || []; return null != e && (T(Object(e)) ? w.merge(n, "string" == typeof e ? [e] : e) : u.call(n, e)), n }, inArray: function (e, t, n) { return null == t ? -1 : s.call(t, e, n) }, merge: function (e, t) { for (var n = +t.length, r = 0, i = e.length; r < n; r++)e[i++] = t[r]; return e.length = i, e }, grep: function (e, t, n) { for (var r, i = [], o = 0, a = e.length, u = !n; o < a; o++)(r = !t(e[o], o)) !== u && i.push(e[o]); return i }, map: function (e, t, n) { var r, i, o = 0, u = []; if (T(e)) for (r = e.length; o < r; o++)null != (i = t(e[o], o, n)) && u.push(i); else for (o in e) null != (i = t(e[o], o, n)) && u.push(i); return a.apply([], u) }, guid: 1, support: h }), "function" == typeof Symbol && (w.fn[Symbol.iterator] = n[Symbol.iterator]), w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (e, t) { l["[object " + t + "]"] = t.toLowerCase() }); function T(e) { var t = !!e && "length" in e && e.length, n = b(e); return !g(e) && !v(e) && ("array" === n || 0 === t || "number" == typeof t && t > 0 && t - 1 in e) } var E = function (e) { var t, n, r, i, o, a, u, s, l, c, f, d, p, h, g, v, y, m, b, x = "sizzle" + 1 * new Date, w = e.document, C = 0, T = 0, E = ae(), N = ae(), k = ae(), A = function (e, t) { return e === t && (f = !0), 0 }, D = {}.hasOwnProperty, S = [], L = S.pop, j = S.push, q = S.push, O = S.slice, P = function (e, t) { for (var n = 0, r = e.length; n < r; n++)if (e[n] === t) return n; return -1 }, H = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", I = "[\\x20\\t\\r\\n\\f]", R = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", B = "\\[" + I + "*(" + R + ")(?:" + I + "*([*^$|!~]?=)" + I + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + R + "))|)" + I + "*\\]", M = ":(" + R + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + B + ")*)|.*)\\)|)", W = new RegExp(I + "+", "g"), $ = new RegExp("^" + I + "+|((?:^|[^\\\\])(?:\\\\.)*)" + I + "+$", "g"), F = new RegExp("^" + I + "*," + I + "*"), z = new RegExp("^" + I + "*([>+~]|" + I + ")" + I + "*"), _ = new RegExp("=" + I + "*([^\\]'\"]*?)" + I + "*\\]", "g"), U = new RegExp(M), V = new RegExp("^" + R + "$"), X = { ID: new RegExp("^#(" + R + ")"), CLASS: new RegExp("^\\.(" + R + ")"), TAG: new RegExp("^(" + R + "|[*])"), ATTR: new RegExp("^" + B), PSEUDO: new RegExp("^" + M), CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + I + "*(even|odd|(([+-]|)(\\d*)n|)" + I + "*(?:([+-]|)" + I + "*(\\d+)|))" + I + "*\\)|)", "i"), bool: new RegExp("^(?:" + H + ")$", "i"), needsContext: new RegExp("^" + I + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + I + "*((?:-\\d)?\\d*)" + I + "*\\)|)(?=[^-]|$)", "i") }, Q = /^(?:input|select|textarea|button)$/i, Y = /^h\d$/i, G = /^[^{]+\{\s*\[native \w/, K = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, J = /[+~]/, Z = new RegExp("\\\\([\\da-f]{1,6}" + I + "?|(" + I + ")|.)", "ig"), ee = function (e, t, n) { var r = "0x" + t - 65536; return r !== r || n ? t : r < 0 ? String.fromCharCode(r + 65536) : String.fromCharCode(r >> 10 | 55296, 1023 & r | 56320) }, te = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, ne = function (e, t) { return t ? "\0" === e ? "\ufffd" : e.slice(0, -1) + "\\" + e.charCodeAt(e.length - 1).toString(16) + " " : "\\" + e }, re = function () { d() }, ie = me(function (e) { return !0 === e.disabled && ("form" in e || "label" in e) }, { dir: "parentNode", next: "legend" }); try { q.apply(S = O.call(w.childNodes), w.childNodes), S[w.childNodes.length].nodeType } catch (e) { q = { apply: S.length ? function (e, t) { j.apply(e, O.call(t)) } : function (e, t) { var n = e.length, r = 0; while (e[n++] = t[r++]); e.length = n - 1 } } } function oe(e, t, r, i) { var o, u, l, c, f, h, y, m = t && t.ownerDocument, C = t ? t.nodeType : 9; if (r = r || [], "string" != typeof e || !e || 1 !== C && 9 !== C && 11 !== C) return r; if (!i && ((t ? t.ownerDocument || t : w) !== p && d(t), t = t || p, g)) { if (11 !== C && (f = K.exec(e))) if (o = f[1]) { if (9 === C) { if (!(l = t.getElementById(o))) return r; if (l.id === o) return r.push(l), r } else if (m && (l = m.getElementById(o)) && b(t, l) && l.id === o) return r.push(l), r } else { if (f[2]) return q.apply(r, t.getElementsByTagName(e)), r; if ((o = f[3]) && n.getElementsByClassName && t.getElementsByClassName) return q.apply(r, t.getElementsByClassName(o)), r } if (n.qsa && !k[e + " "] && (!v || !v.test(e))) { if (1 !== C) m = t, y = e; else if ("object" !== t.nodeName.toLowerCase()) { (c = t.getAttribute("id")) ? c = c.replace(te, ne) : t.setAttribute("id", c = x), u = (h = a(e)).length; while (u--) h[u] = "#" + c + " " + ye(h[u]); y = h.join(","), m = J.test(e) && ge(t.parentNode) || t } if (y) try { return q.apply(r, m.querySelectorAll(y)), r } catch (e) { } finally { c === x && t.removeAttribute("id") } } } return s(e.replace($, "$1"), t, r, i) } function ae() { var e = []; function t(n, i) { return e.push(n + " ") > r.cacheLength && delete t[e.shift()], t[n + " "] = i } return t } function ue(e) { return e[x] = !0, e } function se(e) { var t = p.createElement("fieldset"); try { return !!e(t) } catch (e) { return !1 } finally { t.parentNode && t.parentNode.removeChild(t), t = null } } function le(e, t) { var n = e.split("|"), i = n.length; while (i--) r.attrHandle[n[i]] = t } function ce(e, t) { var n = t && e, r = n && 1 === e.nodeType && 1 === t.nodeType && e.sourceIndex - t.sourceIndex; if (r) return r; if (n) while (n = n.nextSibling) if (n === t) return -1; return e ? 1 : -1 } function fe(e) { return function (t) { return "input" === t.nodeName.toLowerCase() && t.type === e } } function de(e) { return function (t) { var n = t.nodeName.toLowerCase(); return ("input" === n || "button" === n) && t.type === e } } function pe(e) { return function (t) { return "form" in t ? t.parentNode && !1 === t.disabled ? "label" in t ? "label" in t.parentNode ? t.parentNode.disabled === e : t.disabled === e : t.isDisabled === e || t.isDisabled !== !e && ie(t) === e : t.disabled === e : "label" in t && t.disabled === e } } function he(e) { return ue(function (t) { return t = +t, ue(function (n, r) { var i, o = e([], n.length, t), a = o.length; while (a--) n[i = o[a]] && (n[i] = !(r[i] = n[i])) }) }) } function ge(e) { return e && "undefined" != typeof e.getElementsByTagName && e } n = oe.support = {}, o = oe.isXML = function (e) { var t = e && (e.ownerDocument || e).documentElement; return !!t && "HTML" !== t.nodeName }, d = oe.setDocument = function (e) { var t, i, a = e ? e.ownerDocument || e : w; return a !== p && 9 === a.nodeType && a.documentElement ? (p = a, h = p.documentElement, g = !o(p), w !== p && (i = p.defaultView) && i.top !== i && (i.addEventListener ? i.addEventListener("unload", re, !1) : i.attachEvent && i.attachEvent("onunload", re)), n.attributes = se(function (e) { return e.className = "i", !e.getAttribute("className") }), n.getElementsByTagName = se(function (e) { return e.appendChild(p.createComment("")), !e.getElementsByTagName("*").length }), n.getElementsByClassName = G.test(p.getElementsByClassName), n.getById = se(function (e) { return h.appendChild(e).id = x, !p.getElementsByName || !p.getElementsByName(x).length }), n.getById ? (r.filter.ID = function (e) { var t = e.replace(Z, ee); return function (e) { return e.getAttribute("id") === t } }, r.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && g) { var n = t.getElementById(e); return n ? [n] : [] } }) : (r.filter.ID = function (e) { var t = e.replace(Z, ee); return function (e) { var n = "undefined" != typeof e.getAttributeNode && e.getAttributeNode("id"); return n && n.value === t } }, r.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && g) { var n, r, i, o = t.getElementById(e); if (o) { if ((n = o.getAttributeNode("id")) && n.value === e) return [o]; i = t.getElementsByName(e), r = 0; while (o = i[r++]) if ((n = o.getAttributeNode("id")) && n.value === e) return [o] } return [] } }), r.find.TAG = n.getElementsByTagName ? function (e, t) { return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName(e) : n.qsa ? t.querySelectorAll(e) : void 0 } : function (e, t) { var n, r = [], i = 0, o = t.getElementsByTagName(e); if ("*" === e) { while (n = o[i++]) 1 === n.nodeType && r.push(n); return r } return o }, r.find.CLASS = n.getElementsByClassName && function (e, t) { if ("undefined" != typeof t.getElementsByClassName && g) return t.getElementsByClassName(e) }, y = [], v = [], (n.qsa = G.test(p.querySelectorAll)) && (se(function (e) { h.appendChild(e).innerHTML = "", e.querySelectorAll("[msallowcapture^='']").length && v.push("[*^$]=" + I + "*(?:''|\"\")"), e.querySelectorAll("[selected]").length || v.push("\\[" + I + "*(?:value|" + H + ")"), e.querySelectorAll("[id~=" + x + "-]").length || v.push("~="), e.querySelectorAll(":checked").length || v.push(":checked"), e.querySelectorAll("a#" + x + "+*").length || v.push(".#.+[+~]") }), se(function (e) { e.innerHTML = ""; var t = p.createElement("input"); t.setAttribute("type", "hidden"), e.appendChild(t).setAttribute("name", "D"), e.querySelectorAll("[name=d]").length && v.push("name" + I + "*[*^$|!~]?="), 2 !== e.querySelectorAll(":enabled").length && v.push(":enabled", ":disabled"), h.appendChild(e).disabled = !0, 2 !== e.querySelectorAll(":disabled").length && v.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), v.push(",.*:") })), (n.matchesSelector = G.test(m = h.matches || h.webkitMatchesSelector || h.mozMatchesSelector || h.oMatchesSelector || h.msMatchesSelector)) && se(function (e) { n.disconnectedMatch = m.call(e, "*"), m.call(e, "[s!='']:x"), y.push("!=", M) }), v = v.length && new RegExp(v.join("|")), y = y.length && new RegExp(y.join("|")), t = G.test(h.compareDocumentPosition), b = t || G.test(h.contains) ? function (e, t) { var n = 9 === e.nodeType ? e.documentElement : e, r = t && t.parentNode; return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r))) } : function (e, t) { if (t) while (t = t.parentNode) if (t === e) return !0; return !1 }, A = t ? function (e, t) { if (e === t) return f = !0, 0; var r = !e.compareDocumentPosition - !t.compareDocumentPosition; return r || (1 & (r = (e.ownerDocument || e) === (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1) || !n.sortDetached && t.compareDocumentPosition(e) === r ? e === p || e.ownerDocument === w && b(w, e) ? -1 : t === p || t.ownerDocument === w && b(w, t) ? 1 : c ? P(c, e) - P(c, t) : 0 : 4 & r ? -1 : 1) } : function (e, t) { if (e === t) return f = !0, 0; var n, r = 0, i = e.parentNode, o = t.parentNode, a = [e], u = [t]; if (!i || !o) return e === p ? -1 : t === p ? 1 : i ? -1 : o ? 1 : c ? P(c, e) - P(c, t) : 0; if (i === o) return ce(e, t); n = e; while (n = n.parentNode) a.unshift(n); n = t; while (n = n.parentNode) u.unshift(n); while (a[r] === u[r]) r++; return r ? ce(a[r], u[r]) : a[r] === w ? -1 : u[r] === w ? 1 : 0 }, p) : p }, oe.matches = function (e, t) { return oe(e, null, null, t) }, oe.matchesSelector = function (e, t) { if ((e.ownerDocument || e) !== p && d(e), t = t.replace(_, "='$1']"), n.matchesSelector && g && !k[t + " "] && (!y || !y.test(t)) && (!v || !v.test(t))) try { var r = m.call(e, t); if (r || n.disconnectedMatch || e.document && 11 !== e.document.nodeType) return r } catch (e) { } return oe(t, p, null, [e]).length > 0 }, oe.contains = function (e, t) { return (e.ownerDocument || e) !== p && d(e), b(e, t) }, oe.attr = function (e, t) { (e.ownerDocument || e) !== p && d(e); var i = r.attrHandle[t.toLowerCase()], o = i && D.call(r.attrHandle, t.toLowerCase()) ? i(e, t, !g) : void 0; return void 0 !== o ? o : n.attributes || !g ? e.getAttribute(t) : (o = e.getAttributeNode(t)) && o.specified ? o.value : null }, oe.escape = function (e) { return (e + "").replace(te, ne) }, oe.error = function (e) { throw new Error("Syntax error, unrecognized expression: " + e) }, oe.uniqueSort = function (e) { var t, r = [], i = 0, o = 0; if (f = !n.detectDuplicates, c = !n.sortStable && e.slice(0), e.sort(A), f) { while (t = e[o++]) t === e[o] && (i = r.push(o)); while (i--) e.splice(r[i], 1) } return c = null, e }, i = oe.getText = function (e) { var t, n = "", r = 0, o = e.nodeType; if (o) { if (1 === o || 9 === o || 11 === o) { if ("string" == typeof e.textContent) return e.textContent; for (e = e.firstChild; e; e = e.nextSibling)n += i(e) } else if (3 === o || 4 === o) return e.nodeValue } else while (t = e[r++]) n += i(t); return n }, (r = oe.selectors = { cacheLength: 50, createPseudo: ue, match: X, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (e) { return e[1] = e[1].replace(Z, ee), e[3] = (e[3] || e[4] || e[5] || "").replace(Z, ee), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4) }, CHILD: function (e) { return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || oe.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && oe.error(e[0]), e }, PSEUDO: function (e) { var t, n = !e[6] && e[2]; return X.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && U.test(n) && (t = a(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3)) } }, filter: { TAG: function (e) { var t = e.replace(Z, ee).toLowerCase(); return "*" === e ? function () { return !0 } : function (e) { return e.nodeName && e.nodeName.toLowerCase() === t } }, CLASS: function (e) { var t = E[e + " "]; return t || (t = new RegExp("(^|" + I + ")" + e + "(" + I + "|$)")) && E(e, function (e) { return t.test("string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute("class") || "") }) }, ATTR: function (e, t, n) { return function (r) { var i = oe.attr(r, e); return null == i ? "!=" === t : !t || (i += "", "=" === t ? i === n : "!=" === t ? i !== n : "^=" === t ? n && 0 === i.indexOf(n) : "*=" === t ? n && i.indexOf(n) > -1 : "$=" === t ? n && i.slice(-n.length) === n : "~=" === t ? (" " + i.replace(W, " ") + " ").indexOf(n) > -1 : "|=" === t && (i === n || i.slice(0, n.length + 1) === n + "-")) } }, CHILD: function (e, t, n, r, i) { var o = "nth" !== e.slice(0, 3), a = "last" !== e.slice(-4), u = "of-type" === t; return 1 === r && 0 === i ? function (e) { return !!e.parentNode } : function (t, n, s) { var l, c, f, d, p, h, g = o !== a ? "nextSibling" : "previousSibling", v = t.parentNode, y = u && t.nodeName.toLowerCase(), m = !s && !u, b = !1; if (v) { if (o) { while (g) { d = t; while (d = d[g]) if (u ? d.nodeName.toLowerCase() === y : 1 === d.nodeType) return !1; h = g = "only" === e && !h && "nextSibling" } return !0 } if (h = [a ? v.firstChild : v.lastChild], a && m) { b = (p = (l = (c = (f = (d = v)[x] || (d[x] = {}))[d.uniqueID] || (f[d.uniqueID] = {}))[e] || [])[0] === C && l[1]) && l[2], d = p && v.childNodes[p]; while (d = ++p && d && d[g] || (b = p = 0) || h.pop()) if (1 === d.nodeType && ++b && d === t) { c[e] = [C, p, b]; break } } else if (m && (b = p = (l = (c = (f = (d = t)[x] || (d[x] = {}))[d.uniqueID] || (f[d.uniqueID] = {}))[e] || [])[0] === C && l[1]), !1 === b) while (d = ++p && d && d[g] || (b = p = 0) || h.pop()) if ((u ? d.nodeName.toLowerCase() === y : 1 === d.nodeType) && ++b && (m && ((c = (f = d[x] || (d[x] = {}))[d.uniqueID] || (f[d.uniqueID] = {}))[e] = [C, b]), d === t)) break; return (b -= i) === r || b % r == 0 && b / r >= 0 } } }, PSEUDO: function (e, t) { var n, i = r.pseudos[e] || r.setFilters[e.toLowerCase()] || oe.error("unsupported pseudo: " + e); return i[x] ? i(t) : i.length > 1 ? (n = [e, e, "", t], r.setFilters.hasOwnProperty(e.toLowerCase()) ? ue(function (e, n) { var r, o = i(e, t), a = o.length; while (a--) e[r = P(e, o[a])] = !(n[r] = o[a]) }) : function (e) { return i(e, 0, n) }) : i } }, pseudos: { not: ue(function (e) { var t = [], n = [], r = u(e.replace($, "$1")); return r[x] ? ue(function (e, t, n, i) { var o, a = r(e, null, i, []), u = e.length; while (u--) (o = a[u]) && (e[u] = !(t[u] = o)) }) : function (e, i, o) { return t[0] = e, r(t, null, o, n), t[0] = null, !n.pop() } }), has: ue(function (e) { return function (t) { return oe(e, t).length > 0 } }), contains: ue(function (e) { return e = e.replace(Z, ee), function (t) { return (t.textContent || t.innerText || i(t)).indexOf(e) > -1 } }), lang: ue(function (e) { return V.test(e || "") || oe.error("unsupported lang: " + e), e = e.replace(Z, ee).toLowerCase(), function (t) { var n; do { if (n = g ? t.lang : t.getAttribute("xml:lang") || t.getAttribute("lang")) return (n = n.toLowerCase()) === e || 0 === n.indexOf(e + "-") } while ((t = t.parentNode) && 1 === t.nodeType); return !1 } }), target: function (t) { var n = e.location && e.location.hash; return n && n.slice(1) === t.id }, root: function (e) { return e === h }, focus: function (e) { return e === p.activeElement && (!p.hasFocus || p.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) }, enabled: pe(!1), disabled: pe(!0), checked: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && !!e.checked || "option" === t && !!e.selected }, selected: function (e) { return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected }, empty: function (e) { for (e = e.firstChild; e; e = e.nextSibling)if (e.nodeType < 6) return !1; return !0 }, parent: function (e) { return !r.pseudos.empty(e) }, header: function (e) { return Y.test(e.nodeName) }, input: function (e) { return Q.test(e.nodeName) }, button: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && "button" === e.type || "button" === t }, text: function (e) { var t; return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase()) }, first: he(function () { return [0] }), last: he(function (e, t) { return [t - 1] }), eq: he(function (e, t, n) { return [n < 0 ? n + t : n] }), even: he(function (e, t) { for (var n = 0; n < t; n += 2)e.push(n); return e }), odd: he(function (e, t) { for (var n = 1; n < t; n += 2)e.push(n); return e }), lt: he(function (e, t, n) { for (var r = n < 0 ? n + t : n; --r >= 0;)e.push(r); return e }), gt: he(function (e, t, n) { for (var r = n < 0 ? n + t : n; ++r < t;)e.push(r); return e }) } }).pseudos.nth = r.pseudos.eq; for (t in { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) r.pseudos[t] = fe(t); for (t in { submit: !0, reset: !0 }) r.pseudos[t] = de(t); function ve() { } ve.prototype = r.filters = r.pseudos, r.setFilters = new ve, a = oe.tokenize = function (e, t) { var n, i, o, a, u, s, l, c = N[e + " "]; if (c) return t ? 0 : c.slice(0); u = e, s = [], l = r.preFilter; while (u) { n && !(i = F.exec(u)) || (i && (u = u.slice(i[0].length) || u), s.push(o = [])), n = !1, (i = z.exec(u)) && (n = i.shift(), o.push({ value: n, type: i[0].replace($, " ") }), u = u.slice(n.length)); for (a in r.filter) !(i = X[a].exec(u)) || l[a] && !(i = l[a](i)) || (n = i.shift(), o.push({ value: n, type: a, matches: i }), u = u.slice(n.length)); if (!n) break } return t ? u.length : u ? oe.error(e) : N(e, s).slice(0) }; function ye(e) { for (var t = 0, n = e.length, r = ""; t < n; t++)r += e[t].value; return r } function me(e, t, n) { var r = t.dir, i = t.next, o = i || r, a = n && "parentNode" === o, u = T++; return t.first ? function (t, n, i) { while (t = t[r]) if (1 === t.nodeType || a) return e(t, n, i); return !1 } : function (t, n, s) { var l, c, f, d = [C, u]; if (s) { while (t = t[r]) if ((1 === t.nodeType || a) && e(t, n, s)) return !0 } else while (t = t[r]) if (1 === t.nodeType || a) if (f = t[x] || (t[x] = {}), c = f[t.uniqueID] || (f[t.uniqueID] = {}), i && i === t.nodeName.toLowerCase()) t = t[r] || t; else { if ((l = c[o]) && l[0] === C && l[1] === u) return d[2] = l[2]; if (c[o] = d, d[2] = e(t, n, s)) return !0 } return !1 } } function be(e) { return e.length > 1 ? function (t, n, r) { var i = e.length; while (i--) if (!e[i](t, n, r)) return !1; return !0 } : e[0] } function xe(e, t, n) { for (var r = 0, i = t.length; r < i; r++)oe(e, t[r], n); return n } function we(e, t, n, r, i) { for (var o, a = [], u = 0, s = e.length, l = null != t; u < s; u++)(o = e[u]) && (n && !n(o, r, i) || (a.push(o), l && t.push(u))); return a } function Ce(e, t, n, r, i, o) { return r && !r[x] && (r = Ce(r)), i && !i[x] && (i = Ce(i, o)), ue(function (o, a, u, s) { var l, c, f, d = [], p = [], h = a.length, g = o || xe(t || "*", u.nodeType ? [u] : u, []), v = !e || !o && t ? g : we(g, d, e, u, s), y = n ? i || (o ? e : h || r) ? [] : a : v; if (n && n(v, y, u, s), r) { l = we(y, p), r(l, [], u, s), c = l.length; while (c--) (f = l[c]) && (y[p[c]] = !(v[p[c]] = f)) } if (o) { if (i || e) { if (i) { l = [], c = y.length; while (c--) (f = y[c]) && l.push(v[c] = f); i(null, y = [], l, s) } c = y.length; while (c--) (f = y[c]) && (l = i ? P(o, f) : d[c]) > -1 && (o[l] = !(a[l] = f)) } } else y = we(y === a ? y.splice(h, y.length) : y), i ? i(null, a, y, s) : q.apply(a, y) }) } function Te(e) { for (var t, n, i, o = e.length, a = r.relative[e[0].type], u = a || r.relative[" "], s = a ? 1 : 0, c = me(function (e) { return e === t }, u, !0), f = me(function (e) { return P(t, e) > -1 }, u, !0), d = [function (e, n, r) { var i = !a && (r || n !== l) || ((t = n).nodeType ? c(e, n, r) : f(e, n, r)); return t = null, i }]; s < o; s++)if (n = r.relative[e[s].type]) d = [me(be(d), n)]; else { if ((n = r.filter[e[s].type].apply(null, e[s].matches))[x]) { for (i = ++s; i < o; i++)if (r.relative[e[i].type]) break; return Ce(s > 1 && be(d), s > 1 && ye(e.slice(0, s - 1).concat({ value: " " === e[s - 2].type ? "*" : "" })).replace($, "$1"), n, s < i && Te(e.slice(s, i)), i < o && Te(e = e.slice(i)), i < o && ye(e)) } d.push(n) } return be(d) } function Ee(e, t) { var n = t.length > 0, i = e.length > 0, o = function (o, a, u, s, c) { var f, h, v, y = 0, m = "0", b = o && [], x = [], w = l, T = o || i && r.find.TAG("*", c), E = C += null == w ? 1 : Math.random() || .1, N = T.length; for (c && (l = a === p || a || c); m !== N && null != (f = T[m]); m++) { if (i && f) { h = 0, a || f.ownerDocument === p || (d(f), u = !g); while (v = e[h++]) if (v(f, a || p, u)) { s.push(f); break } c && (C = E) } n && ((f = !v && f) && y-- , o && b.push(f)) } if (y += m, n && m !== y) { h = 0; while (v = t[h++]) v(b, x, a, u); if (o) { if (y > 0) while (m--) b[m] || x[m] || (x[m] = L.call(s)); x = we(x) } q.apply(s, x), c && !o && x.length > 0 && y + t.length > 1 && oe.uniqueSort(s) } return c && (C = E, l = w), b }; return n ? ue(o) : o } return u = oe.compile = function (e, t) { var n, r = [], i = [], o = k[e + " "]; if (!o) { t || (t = a(e)), n = t.length; while (n--) (o = Te(t[n]))[x] ? r.push(o) : i.push(o); (o = k(e, Ee(i, r))).selector = e } return o }, s = oe.select = function (e, t, n, i) { var o, s, l, c, f, d = "function" == typeof e && e, p = !i && a(e = d.selector || e); if (n = n || [], 1 === p.length) { if ((s = p[0] = p[0].slice(0)).length > 2 && "ID" === (l = s[0]).type && 9 === t.nodeType && g && r.relative[s[1].type]) { if (!(t = (r.find.ID(l.matches[0].replace(Z, ee), t) || [])[0])) return n; d && (t = t.parentNode), e = e.slice(s.shift().value.length) } o = X.needsContext.test(e) ? 0 : s.length; while (o--) { if (l = s[o], r.relative[c = l.type]) break; if ((f = r.find[c]) && (i = f(l.matches[0].replace(Z, ee), J.test(s[0].type) && ge(t.parentNode) || t))) { if (s.splice(o, 1), !(e = i.length && ye(s))) return q.apply(n, i), n; break } } } return (d || u(e, p))(i, t, !g, n, !t || J.test(e) && ge(t.parentNode) || t), n }, n.sortStable = x.split("").sort(A).join("") === x, n.detectDuplicates = !!f, d(), n.sortDetached = se(function (e) { return 1 & e.compareDocumentPosition(p.createElement("fieldset")) }), se(function (e) { return e.innerHTML = "", "#" === e.firstChild.getAttribute("href") }) || le("type|href|height|width", function (e, t, n) { if (!n) return e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2) }), n.attributes && se(function (e) { return e.innerHTML = "", e.firstChild.setAttribute("value", ""), "" === e.firstChild.getAttribute("value") }) || le("value", function (e, t, n) { if (!n && "input" === e.nodeName.toLowerCase()) return e.defaultValue }), se(function (e) { return null == e.getAttribute("disabled") }) || le(H, function (e, t, n) { var r; if (!n) return !0 === e[t] ? t.toLowerCase() : (r = e.getAttributeNode(t)) && r.specified ? r.value : null }), oe }(e); w.find = E, w.expr = E.selectors, w.expr[":"] = w.expr.pseudos, w.uniqueSort = w.unique = E.uniqueSort, w.text = E.getText, w.isXMLDoc = E.isXML, w.contains = E.contains, w.escapeSelector = E.escape; var N = function (e, t, n) { var r = [], i = void 0 !== n; while ((e = e[t]) && 9 !== e.nodeType) if (1 === e.nodeType) { if (i && w(e).is(n)) break; r.push(e) } return r }, k = function (e, t) { for (var n = []; e; e = e.nextSibling)1 === e.nodeType && e !== t && n.push(e); return n }, A = w.expr.match.needsContext; function D(e, t) { return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() } var S = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; function L(e, t, n) { return g(t) ? w.grep(e, function (e, r) { return !!t.call(e, r, e) !== n }) : t.nodeType ? w.grep(e, function (e) { return e === t !== n }) : "string" != typeof t ? w.grep(e, function (e) { return s.call(t, e) > -1 !== n }) : w.filter(t, e, n) } w.filter = function (e, t, n) { var r = t[0]; return n && (e = ":not(" + e + ")"), 1 === t.length && 1 === r.nodeType ? w.find.matchesSelector(r, e) ? [r] : [] : w.find.matches(e, w.grep(t, function (e) { return 1 === e.nodeType })) }, w.fn.extend({ find: function (e) { var t, n, r = this.length, i = this; if ("string" != typeof e) return this.pushStack(w(e).filter(function () { for (t = 0; t < r; t++)if (w.contains(i[t], this)) return !0 })); for (n = this.pushStack([]), t = 0; t < r; t++)w.find(e, i[t], n); return r > 1 ? w.uniqueSort(n) : n }, filter: function (e) { return this.pushStack(L(this, e || [], !1)) }, not: function (e) { return this.pushStack(L(this, e || [], !0)) }, is: function (e) { return !!L(this, "string" == typeof e && A.test(e) ? w(e) : e || [], !1).length } }); var j, q = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; (w.fn.init = function (e, t, n) { var i, o; if (!e) return this; if (n = n || j, "string" == typeof e) { if (!(i = "<" === e[0] && ">" === e[e.length - 1] && e.length >= 3 ? [null, e, null] : q.exec(e)) || !i[1] && t) return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); if (i[1]) { if (t = t instanceof w ? t[0] : t, w.merge(this, w.parseHTML(i[1], t && t.nodeType ? t.ownerDocument || t : r, !0)), S.test(i[1]) && w.isPlainObject(t)) for (i in t) g(this[i]) ? this[i](t[i]) : this.attr(i, t[i]); return this } return (o = r.getElementById(i[2])) && (this[0] = o, this.length = 1), this } return e.nodeType ? (this[0] = e, this.length = 1, this) : g(e) ? void 0 !== n.ready ? n.ready(e) : e(w) : w.makeArray(e, this) }).prototype = w.fn, j = w(r); var O = /^(?:parents|prev(?:Until|All))/, P = { children: !0, contents: !0, next: !0, prev: !0 }; w.fn.extend({ has: function (e) { var t = w(e, this), n = t.length; return this.filter(function () { for (var e = 0; e < n; e++)if (w.contains(this, t[e])) return !0 }) }, closest: function (e, t) { var n, r = 0, i = this.length, o = [], a = "string" != typeof e && w(e); if (!A.test(e)) for (; r < i; r++)for (n = this[r]; n && n !== t; n = n.parentNode)if (n.nodeType < 11 && (a ? a.index(n) > -1 : 1 === n.nodeType && w.find.matchesSelector(n, e))) { o.push(n); break } return this.pushStack(o.length > 1 ? w.uniqueSort(o) : o) }, index: function (e) { return e ? "string" == typeof e ? s.call(w(e), this[0]) : s.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 }, add: function (e, t) { return this.pushStack(w.uniqueSort(w.merge(this.get(), w(e, t)))) }, addBack: function (e) { return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) } }); function H(e, t) { while ((e = e[t]) && 1 !== e.nodeType); return e } w.each({ parent: function (e) { var t = e.parentNode; return t && 11 !== t.nodeType ? t : null }, parents: function (e) { return N(e, "parentNode") }, parentsUntil: function (e, t, n) { return N(e, "parentNode", n) }, next: function (e) { return H(e, "nextSibling") }, prev: function (e) { return H(e, "previousSibling") }, nextAll: function (e) { return N(e, "nextSibling") }, prevAll: function (e) { return N(e, "previousSibling") }, nextUntil: function (e, t, n) { return N(e, "nextSibling", n) }, prevUntil: function (e, t, n) { return N(e, "previousSibling", n) }, siblings: function (e) { return k((e.parentNode || {}).firstChild, e) }, children: function (e) { return k(e.firstChild) }, contents: function (e) { return D(e, "iframe") ? e.contentDocument : (D(e, "template") && (e = e.content || e), w.merge([], e.childNodes)) } }, function (e, t) { w.fn[e] = function (n, r) { var i = w.map(this, t, n); return "Until" !== e.slice(-5) && (r = n), r && "string" == typeof r && (i = w.filter(r, i)), this.length > 1 && (P[e] || w.uniqueSort(i), O.test(e) && i.reverse()), this.pushStack(i) } }); var I = /[^\x20\t\r\n\f]+/g; function R(e) { var t = {}; return w.each(e.match(I) || [], function (e, n) { t[n] = !0 }), t } w.Callbacks = function (e) { e = "string" == typeof e ? R(e) : w.extend({}, e); var t, n, r, i, o = [], a = [], u = -1, s = function () { for (i = i || e.once, r = t = !0; a.length; u = -1) { n = a.shift(); while (++u < o.length) !1 === o[u].apply(n[0], n[1]) && e.stopOnFalse && (u = o.length, n = !1) } e.memory || (n = !1), t = !1, i && (o = n ? [] : "") }, l = { add: function () { return o && (n && !t && (u = o.length - 1, a.push(n)), function t(n) { w.each(n, function (n, r) { g(r) ? e.unique && l.has(r) || o.push(r) : r && r.length && "string" !== b(r) && t(r) }) }(arguments), n && !t && s()), this }, remove: function () { return w.each(arguments, function (e, t) { var n; while ((n = w.inArray(t, o, n)) > -1) o.splice(n, 1), n <= u && u-- }), this }, has: function (e) { return e ? w.inArray(e, o) > -1 : o.length > 0 }, empty: function () { return o && (o = []), this }, disable: function () { return i = a = [], o = n = "", this }, disabled: function () { return !o }, lock: function () { return i = a = [], n || t || (o = n = ""), this }, locked: function () { return !!i }, fireWith: function (e, n) { return i || (n = [e, (n = n || []).slice ? n.slice() : n], a.push(n), t || s()), this }, fire: function () { return l.fireWith(this, arguments), this }, fired: function () { return !!r } }; return l }; function B(e) { return e } function M(e) { throw e } function W(e, t, n, r) { var i; try { e && g(i = e.promise) ? i.call(e).done(t).fail(n) : e && g(i = e.then) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r)) } catch (e) { n.apply(void 0, [e]) } } w.extend({ Deferred: function (t) { var n = [["notify", "progress", w.Callbacks("memory"), w.Callbacks("memory"), 2], ["resolve", "done", w.Callbacks("once memory"), w.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", w.Callbacks("once memory"), w.Callbacks("once memory"), 1, "rejected"]], r = "pending", i = { state: function () { return r }, always: function () { return o.done(arguments).fail(arguments), this }, "catch": function (e) { return i.then(null, e) }, pipe: function () { var e = arguments; return w.Deferred(function (t) { w.each(n, function (n, r) { var i = g(e[r[4]]) && e[r[4]]; o[r[1]](function () { var e = i && i.apply(this, arguments); e && g(e.promise) ? e.promise().progress(t.notify).done(t.resolve).fail(t.reject) : t[r[0] + "With"](this, i ? [e] : arguments) }) }), e = null }).promise() }, then: function (t, r, i) { var o = 0; function a(t, n, r, i) { return function () { var u = this, s = arguments, l = function () { var e, l; if (!(t < o)) { if ((e = r.apply(u, s)) === n.promise()) throw new TypeError("Thenable self-resolution"); l = e && ("object" == typeof e || "function" == typeof e) && e.then, g(l) ? i ? l.call(e, a(o, n, B, i), a(o, n, M, i)) : (o++ , l.call(e, a(o, n, B, i), a(o, n, M, i), a(o, n, B, n.notifyWith))) : (r !== B && (u = void 0, s = [e]), (i || n.resolveWith)(u, s)) } }, c = i ? l : function () { try { l() } catch (e) { w.Deferred.exceptionHook && w.Deferred.exceptionHook(e, c.stackTrace), t + 1 >= o && (r !== M && (u = void 0, s = [e]), n.rejectWith(u, s)) } }; t ? c() : (w.Deferred.getStackHook && (c.stackTrace = w.Deferred.getStackHook()), e.setTimeout(c)) } } return w.Deferred(function (e) { n[0][3].add(a(0, e, g(i) ? i : B, e.notifyWith)), n[1][3].add(a(0, e, g(t) ? t : B)), n[2][3].add(a(0, e, g(r) ? r : M)) }).promise() }, promise: function (e) { return null != e ? w.extend(e, i) : i } }, o = {}; return w.each(n, function (e, t) { var a = t[2], u = t[5]; i[t[1]] = a.add, u && a.add(function () { r = u }, n[3 - e][2].disable, n[3 - e][3].disable, n[0][2].lock, n[0][3].lock), a.add(t[3].fire), o[t[0]] = function () { return o[t[0] + "With"](this === o ? void 0 : this, arguments), this }, o[t[0] + "With"] = a.fireWith }), i.promise(o), t && t.call(o, o), o }, when: function (e) { var t = arguments.length, n = t, r = Array(n), i = o.call(arguments), a = w.Deferred(), u = function (e) { return function (n) { r[e] = this, i[e] = arguments.length > 1 ? o.call(arguments) : n, --t || a.resolveWith(r, i) } }; if (t <= 1 && (W(e, a.done(u(n)).resolve, a.reject, !t), "pending" === a.state() || g(i[n] && i[n].then))) return a.then(); while (n--) W(i[n], u(n), a.reject); return a.promise() } }); var $ = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; w.Deferred.exceptionHook = function (t, n) { e.console && e.console.warn && t && $.test(t.name) && e.console.warn("jQuery.Deferred exception: " + t.message, t.stack, n) }, w.readyException = function (t) { e.setTimeout(function () { throw t }) }; var F = w.Deferred(); w.fn.ready = function (e) { return F.then(e)["catch"](function (e) { w.readyException(e) }), this }, w.extend({ isReady: !1, readyWait: 1, ready: function (e) { (!0 === e ? --w.readyWait : w.isReady) || (w.isReady = !0, !0 !== e && --w.readyWait > 0 || F.resolveWith(r, [w])) } }), w.ready.then = F.then; function z() { r.removeEventListener("DOMContentLoaded", z), e.removeEventListener("load", z), w.ready() } "complete" === r.readyState || "loading" !== r.readyState && !r.documentElement.doScroll ? e.setTimeout(w.ready) : (r.addEventListener("DOMContentLoaded", z), e.addEventListener("load", z)); var _ = function (e, t, n, r, i, o, a) { var u = 0, s = e.length, l = null == n; if ("object" === b(n)) { i = !0; for (u in n) _(e, t, u, n[u], !0, o, a) } else if (void 0 !== r && (i = !0, g(r) || (a = !0), l && (a ? (t.call(e, r), t = null) : (l = t, t = function (e, t, n) { return l.call(w(e), n) })), t)) for (; u < s; u++)t(e[u], n, a ? r : r.call(e[u], u, t(e[u], n))); return i ? e : l ? t.call(e) : s ? t(e[0], n) : o }, U = /^-ms-/, V = /-([a-z])/g; function X(e, t) { return t.toUpperCase() } function Q(e) { return e.replace(U, "ms-").replace(V, X) } var Y = function (e) { return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType }; function G() { this.expando = w.expando + G.uid++ } G.uid = 1, G.prototype = { cache: function (e) { var t = e[this.expando]; return t || (t = {}, Y(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, { value: t, configurable: !0 }))), t }, set: function (e, t, n) { var r, i = this.cache(e); if ("string" == typeof t) i[Q(t)] = n; else for (r in t) i[Q(r)] = t[r]; return i }, get: function (e, t) { return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][Q(t)] }, access: function (e, t, n) { return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get(e, t) : (this.set(e, t, n), void 0 !== n ? n : t) }, remove: function (e, t) { var n, r = e[this.expando]; if (void 0 !== r) { if (void 0 !== t) { n = (t = Array.isArray(t) ? t.map(Q) : (t = Q(t)) in r ? [t] : t.match(I) || []).length; while (n--) delete r[t[n]] } (void 0 === t || w.isEmptyObject(r)) && (e.nodeType ? e[this.expando] = void 0 : delete e[this.expando]) } }, hasData: function (e) { var t = e[this.expando]; return void 0 !== t && !w.isEmptyObject(t) } }; var K = new G, J = new G, Z = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, ee = /[A-Z]/g; function te(e) { return "true" === e || "false" !== e && ("null" === e ? null : e === +e + "" ? +e : Z.test(e) ? JSON.parse(e) : e) } function ne(e, t, n) { var r; if (void 0 === n && 1 === e.nodeType) if (r = "data-" + t.replace(ee, "-$&").toLowerCase(), "string" == typeof (n = e.getAttribute(r))) { try { n = te(n) } catch (e) { } J.set(e, t, n) } else n = void 0; return n } w.extend({ hasData: function (e) { return J.hasData(e) || K.hasData(e) }, data: function (e, t, n) { return J.access(e, t, n) }, removeData: function (e, t) { J.remove(e, t) }, _data: function (e, t, n) { return K.access(e, t, n) }, _removeData: function (e, t) { K.remove(e, t) } }), w.fn.extend({ data: function (e, t) { var n, r, i, o = this[0], a = o && o.attributes; if (void 0 === e) { if (this.length && (i = J.get(o), 1 === o.nodeType && !K.get(o, "hasDataAttrs"))) { n = a.length; while (n--) a[n] && 0 === (r = a[n].name).indexOf("data-") && (r = Q(r.slice(5)), ne(o, r, i[r])); K.set(o, "hasDataAttrs", !0) } return i } return "object" == typeof e ? this.each(function () { J.set(this, e) }) : _(this, function (t) { var n; if (o && void 0 === t) { if (void 0 !== (n = J.get(o, e))) return n; if (void 0 !== (n = ne(o, e))) return n } else this.each(function () { J.set(this, e, t) }) }, null, t, arguments.length > 1, null, !0) }, removeData: function (e) { return this.each(function () { J.remove(this, e) }) } }), w.extend({ queue: function (e, t, n) { var r; if (e) return t = (t || "fx") + "queue", r = K.get(e, t), n && (!r || Array.isArray(n) ? r = K.access(e, t, w.makeArray(n)) : r.push(n)), r || [] }, dequeue: function (e, t) { t = t || "fx"; var n = w.queue(e, t), r = n.length, i = n.shift(), o = w._queueHooks(e, t), a = function () { w.dequeue(e, t) }; "inprogress" === i && (i = n.shift(), r--), i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, a, o)), !r && o && o.empty.fire() }, _queueHooks: function (e, t) { var n = t + "queueHooks"; return K.get(e, n) || K.access(e, n, { empty: w.Callbacks("once memory").add(function () { K.remove(e, [t + "queue", n]) }) }) } }), w.fn.extend({ queue: function (e, t) { var n = 2; return "string" != typeof e && (t = e, e = "fx", n--), arguments.length < n ? w.queue(this[0], e) : void 0 === t ? this : this.each(function () { var n = w.queue(this, e, t); w._queueHooks(this, e), "fx" === e && "inprogress" !== n[0] && w.dequeue(this, e) }) }, dequeue: function (e) { return this.each(function () { w.dequeue(this, e) }) }, clearQueue: function (e) { return this.queue(e || "fx", []) }, promise: function (e, t) { var n, r = 1, i = w.Deferred(), o = this, a = this.length, u = function () { --r || i.resolveWith(o, [o]) }; "string" != typeof e && (t = e, e = void 0), e = e || "fx"; while (a--) (n = K.get(o[a], e + "queueHooks")) && n.empty && (r++ , n.empty.add(u)); return u(), i.promise(t) } }); var re = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, ie = new RegExp("^(?:([+-])=|)(" + re + ")([a-z%]*)$", "i"), oe = ["Top", "Right", "Bottom", "Left"], ae = function (e, t) { return "none" === (e = t || e).style.display || "" === e.style.display && w.contains(e.ownerDocument, e) && "none" === w.css(e, "display") }, ue = function (e, t, n, r) { var i, o, a = {}; for (o in t) a[o] = e.style[o], e.style[o] = t[o]; i = n.apply(e, r || []); for (o in t) e.style[o] = a[o]; return i }; function se(e, t, n, r) { var i, o, a = 20, u = r ? function () { return r.cur() } : function () { return w.css(e, t, "") }, s = u(), l = n && n[3] || (w.cssNumber[t] ? "" : "px"), c = (w.cssNumber[t] || "px" !== l && +s) && ie.exec(w.css(e, t)); if (c && c[3] !== l) { s /= 2, l = l || c[3], c = +s || 1; while (a--) w.style(e, t, c + l), (1 - o) * (1 - (o = u() / s || .5)) <= 0 && (a = 0), c /= o; c *= 2, w.style(e, t, c + l), n = n || [] } return n && (c = +c || +s || 0, i = n[1] ? c + (n[1] + 1) * n[2] : +n[2], r && (r.unit = l, r.start = c, r.end = i)), i } var le = {}; function ce(e) { var t, n = e.ownerDocument, r = e.nodeName, i = le[r]; return i || (t = n.body.appendChild(n.createElement(r)), i = w.css(t, "display"), t.parentNode.removeChild(t), "none" === i && (i = "block"), le[r] = i, i) } function fe(e, t) { for (var n, r, i = [], o = 0, a = e.length; o < a; o++)(r = e[o]).style && (n = r.style.display, t ? ("none" === n && (i[o] = K.get(r, "display") || null, i[o] || (r.style.display = "")), "" === r.style.display && ae(r) && (i[o] = ce(r))) : "none" !== n && (i[o] = "none", K.set(r, "display", n))); for (o = 0; o < a; o++)null != i[o] && (e[o].style.display = i[o]); return e } w.fn.extend({ show: function () { return fe(this, !0) }, hide: function () { return fe(this) }, toggle: function (e) { return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function () { ae(this) ? w(this).show() : w(this).hide() }) } }); var de = /^(?:checkbox|radio)$/i, pe = /<([a-z][^\/\0>\x20\t\r\n\f]+)/i, he = /^$|^module$|\/(?:java|ecma)script/i, ge = { option: [1, ""], thead: [1, "