@workflow/world-testing 4.1.11 → 4.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -225,10 +225,10 @@ function $constructor(name, initializer3, params) {
|
|
|
225
225
|
}
|
|
226
226
|
function config(newConfig) {
|
|
227
227
|
if (newConfig)
|
|
228
|
-
Object.assign(
|
|
229
|
-
return
|
|
228
|
+
Object.assign(globalConfig2, newConfig);
|
|
229
|
+
return globalConfig2;
|
|
230
230
|
}
|
|
231
|
-
var NEVER, $brand, $ZodAsyncError, $ZodEncodeError,
|
|
231
|
+
var NEVER, $brand, $ZodAsyncError, $ZodEncodeError, globalConfig2;
|
|
232
232
|
var init_core = __esm({
|
|
233
233
|
"../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/core.js"() {
|
|
234
234
|
NEVER = Object.freeze({
|
|
@@ -253,7 +253,7 @@ var init_core = __esm({
|
|
|
253
253
|
this.name = "ZodEncodeError";
|
|
254
254
|
}
|
|
255
255
|
};
|
|
256
|
-
|
|
256
|
+
globalConfig2 = {};
|
|
257
257
|
__name(config, "config");
|
|
258
258
|
}
|
|
259
259
|
});
|
|
@@ -3131,7 +3131,7 @@ var init_schemas = __esm({
|
|
|
3131
3131
|
}, "generateFastpass");
|
|
3132
3132
|
let fastpass;
|
|
3133
3133
|
const isObject2 = isObject;
|
|
3134
|
-
const jit = !
|
|
3134
|
+
const jit = !globalConfig2.jitless;
|
|
3135
3135
|
const allowsEval2 = allowsEval;
|
|
3136
3136
|
const fastEnabled = jit && allowsEval2.value;
|
|
3137
3137
|
const catchall = def.catchall;
|
|
@@ -12538,7 +12538,7 @@ __export(core_exports2, {
|
|
|
12538
12538
|
finalize: () => finalize,
|
|
12539
12539
|
flattenError: () => flattenError,
|
|
12540
12540
|
formatError: () => formatError,
|
|
12541
|
-
globalConfig: () =>
|
|
12541
|
+
globalConfig: () => globalConfig2,
|
|
12542
12542
|
globalRegistry: () => globalRegistry,
|
|
12543
12543
|
initializeContext: () => initializeContext,
|
|
12544
12544
|
isValidBase64: () => isValidBase64,
|
|
@@ -19828,34 +19828,34 @@ var require_util = __commonJS({
|
|
|
19828
19828
|
return buffer2 instanceof Uint8Array || Buffer.isBuffer(buffer2);
|
|
19829
19829
|
}
|
|
19830
19830
|
__name(isBuffer, "isBuffer");
|
|
19831
|
-
function assertRequestHandler(
|
|
19832
|
-
if (!
|
|
19831
|
+
function assertRequestHandler(handler, method, upgrade) {
|
|
19832
|
+
if (!handler || typeof handler !== "object") {
|
|
19833
19833
|
throw new InvalidArgumentError("handler must be an object");
|
|
19834
19834
|
}
|
|
19835
|
-
if (typeof
|
|
19835
|
+
if (typeof handler.onRequestStart === "function") {
|
|
19836
19836
|
return;
|
|
19837
19837
|
}
|
|
19838
|
-
if (typeof
|
|
19838
|
+
if (typeof handler.onConnect !== "function") {
|
|
19839
19839
|
throw new InvalidArgumentError("invalid onConnect method");
|
|
19840
19840
|
}
|
|
19841
|
-
if (typeof
|
|
19841
|
+
if (typeof handler.onError !== "function") {
|
|
19842
19842
|
throw new InvalidArgumentError("invalid onError method");
|
|
19843
19843
|
}
|
|
19844
|
-
if (typeof
|
|
19844
|
+
if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) {
|
|
19845
19845
|
throw new InvalidArgumentError("invalid onBodySent method");
|
|
19846
19846
|
}
|
|
19847
19847
|
if (upgrade || method === "CONNECT") {
|
|
19848
|
-
if (typeof
|
|
19848
|
+
if (typeof handler.onUpgrade !== "function") {
|
|
19849
19849
|
throw new InvalidArgumentError("invalid onUpgrade method");
|
|
19850
19850
|
}
|
|
19851
19851
|
} else {
|
|
19852
|
-
if (typeof
|
|
19852
|
+
if (typeof handler.onHeaders !== "function") {
|
|
19853
19853
|
throw new InvalidArgumentError("invalid onHeaders method");
|
|
19854
19854
|
}
|
|
19855
|
-
if (typeof
|
|
19855
|
+
if (typeof handler.onData !== "function") {
|
|
19856
19856
|
throw new InvalidArgumentError("invalid onData method");
|
|
19857
19857
|
}
|
|
19858
|
-
if (typeof
|
|
19858
|
+
if (typeof handler.onComplete !== "function") {
|
|
19859
19859
|
throw new InvalidArgumentError("invalid onComplete method");
|
|
19860
19860
|
}
|
|
19861
19861
|
}
|
|
@@ -20710,7 +20710,7 @@ var require_request = __commonJS({
|
|
|
20710
20710
|
throwOnError,
|
|
20711
20711
|
maxRedirections,
|
|
20712
20712
|
typeOfService
|
|
20713
|
-
},
|
|
20713
|
+
}, handler) {
|
|
20714
20714
|
if (typeof path12 !== "string") {
|
|
20715
20715
|
throw new InvalidArgumentError("path must be a string");
|
|
20716
20716
|
} else if (path12[0] !== "/" && !(path12.startsWith("http://") || path12.startsWith("https://")) && method !== "CONNECT") {
|
|
@@ -20825,9 +20825,9 @@ var require_request = __commonJS({
|
|
|
20825
20825
|
} else if (headers != null) {
|
|
20826
20826
|
throw new InvalidArgumentError("headers must be an object or an array");
|
|
20827
20827
|
}
|
|
20828
|
-
assertRequestHandler(
|
|
20828
|
+
assertRequestHandler(handler, method, upgrade);
|
|
20829
20829
|
this.servername = servername || getServerName(this.host) || null;
|
|
20830
|
-
this[kHandler] =
|
|
20830
|
+
this[kHandler] = handler;
|
|
20831
20831
|
if (channels.create.hasSubscribers) {
|
|
20832
20832
|
channels.create.publish({ request: this });
|
|
20833
20833
|
}
|
|
@@ -21034,11 +21034,11 @@ var require_wrap_handler = __commonJS({
|
|
|
21034
21034
|
__name(this, "WrapHandler");
|
|
21035
21035
|
}
|
|
21036
21036
|
#handler;
|
|
21037
|
-
constructor(
|
|
21038
|
-
this.#handler =
|
|
21037
|
+
constructor(handler) {
|
|
21038
|
+
this.#handler = handler;
|
|
21039
21039
|
}
|
|
21040
|
-
static wrap(
|
|
21041
|
-
return
|
|
21040
|
+
static wrap(handler) {
|
|
21041
|
+
return handler.onRequestStart ? handler : new WrapHandler(handler);
|
|
21042
21042
|
}
|
|
21043
21043
|
// Unwrap Interface
|
|
21044
21044
|
onConnect(abort, context2) {
|
|
@@ -21117,7 +21117,7 @@ var require_dispatcher = __commonJS({
|
|
|
21117
21117
|
"use strict";
|
|
21118
21118
|
var EventEmitter2 = require("node:events");
|
|
21119
21119
|
var WrapHandler = require_wrap_handler();
|
|
21120
|
-
var wrapInterceptor = /* @__PURE__ */ __name((dispatch) => (opts,
|
|
21120
|
+
var wrapInterceptor = /* @__PURE__ */ __name((dispatch) => (opts, handler) => dispatch(opts, WrapHandler.wrap(handler)), "wrapInterceptor");
|
|
21121
21121
|
var Dispatcher = class extends EventEmitter2 {
|
|
21122
21122
|
static {
|
|
21123
21123
|
__name(this, "Dispatcher");
|
|
@@ -21209,11 +21209,11 @@ var require_unwrap_handler = __commonJS({
|
|
|
21209
21209
|
}
|
|
21210
21210
|
#handler;
|
|
21211
21211
|
#controller;
|
|
21212
|
-
constructor(
|
|
21213
|
-
this.#handler =
|
|
21212
|
+
constructor(handler) {
|
|
21213
|
+
this.#handler = handler;
|
|
21214
21214
|
}
|
|
21215
|
-
static unwrap(
|
|
21216
|
-
return !
|
|
21215
|
+
static unwrap(handler) {
|
|
21216
|
+
return !handler.onRequestStart ? handler : new UnwrapHandler(handler);
|
|
21217
21217
|
}
|
|
21218
21218
|
onConnect(abort, context2) {
|
|
21219
21219
|
this.#controller = new UnwrapController(abort);
|
|
@@ -21376,11 +21376,11 @@ var require_dispatcher_base = __commonJS({
|
|
|
21376
21376
|
}, "onDestroyed");
|
|
21377
21377
|
this[kDestroy](err).then(() => queueMicrotask(onDestroyed));
|
|
21378
21378
|
}
|
|
21379
|
-
dispatch(opts,
|
|
21380
|
-
if (!
|
|
21379
|
+
dispatch(opts, handler) {
|
|
21380
|
+
if (!handler || typeof handler !== "object") {
|
|
21381
21381
|
throw new InvalidArgumentError("handler must be an object");
|
|
21382
21382
|
}
|
|
21383
|
-
|
|
21383
|
+
handler = UnwrapHandler.unwrap(handler);
|
|
21384
21384
|
try {
|
|
21385
21385
|
if (!opts || typeof opts !== "object") {
|
|
21386
21386
|
throw new InvalidArgumentError("opts must be an object.");
|
|
@@ -21391,12 +21391,12 @@ var require_dispatcher_base = __commonJS({
|
|
|
21391
21391
|
if (this[kClosed]) {
|
|
21392
21392
|
throw new ClientClosedError();
|
|
21393
21393
|
}
|
|
21394
|
-
return this[kDispatch](opts,
|
|
21394
|
+
return this[kDispatch](opts, handler);
|
|
21395
21395
|
} catch (err) {
|
|
21396
|
-
if (typeof
|
|
21396
|
+
if (typeof handler.onError !== "function") {
|
|
21397
21397
|
throw err;
|
|
21398
21398
|
}
|
|
21399
|
-
|
|
21399
|
+
handler.onError(err);
|
|
21400
21400
|
return false;
|
|
21401
21401
|
}
|
|
21402
21402
|
}
|
|
@@ -27570,8 +27570,8 @@ var require_client = __commonJS({
|
|
|
27570
27570
|
connect2(this);
|
|
27571
27571
|
this.once("connect", cb);
|
|
27572
27572
|
}
|
|
27573
|
-
[kDispatch](opts,
|
|
27574
|
-
const request2 = new Request2(this[kUrl].origin, opts,
|
|
27573
|
+
[kDispatch](opts, handler) {
|
|
27574
|
+
const request2 = new Request2(this[kUrl].origin, opts, handler);
|
|
27575
27575
|
this[kQueue].push(request2);
|
|
27576
27576
|
if (this[kResuming]) {
|
|
27577
27577
|
} else if (util.bodyLength(request2.body) == null && util.isIterable(request2.body)) {
|
|
@@ -28045,13 +28045,13 @@ var require_pool_base = __commonJS({
|
|
|
28045
28045
|
}
|
|
28046
28046
|
return Promise.all(destroyAll);
|
|
28047
28047
|
}
|
|
28048
|
-
[kDispatch](opts,
|
|
28048
|
+
[kDispatch](opts, handler) {
|
|
28049
28049
|
const dispatcher = this[kGetDispatcher]();
|
|
28050
28050
|
if (!dispatcher) {
|
|
28051
28051
|
this[kNeedDrain] = true;
|
|
28052
|
-
this[kQueue].push({ opts, handler
|
|
28052
|
+
this[kQueue].push({ opts, handler });
|
|
28053
28053
|
this[kQueued]++;
|
|
28054
|
-
} else if (!dispatcher.dispatch(opts,
|
|
28054
|
+
} else if (!dispatcher.dispatch(opts, handler)) {
|
|
28055
28055
|
dispatcher[kNeedDrain] = true;
|
|
28056
28056
|
this[kNeedDrain] = !this[kGetDispatcher]();
|
|
28057
28057
|
}
|
|
@@ -28533,7 +28533,7 @@ var require_agent = __commonJS({
|
|
|
28533
28533
|
}
|
|
28534
28534
|
return ret;
|
|
28535
28535
|
}
|
|
28536
|
-
[kDispatch](opts,
|
|
28536
|
+
[kDispatch](opts, handler) {
|
|
28537
28537
|
let key;
|
|
28538
28538
|
if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) {
|
|
28539
28539
|
key = String(opts.origin);
|
|
@@ -28575,7 +28575,7 @@ var require_agent = __commonJS({
|
|
|
28575
28575
|
this[kClients].set(key, { count: 0, dispatcher });
|
|
28576
28576
|
this[kOrigins].add(key);
|
|
28577
28577
|
}
|
|
28578
|
-
return dispatcher.dispatch(opts,
|
|
28578
|
+
return dispatcher.dispatch(opts, handler);
|
|
28579
28579
|
}
|
|
28580
28580
|
[kClose]() {
|
|
28581
28581
|
const closePromises = [];
|
|
@@ -29238,7 +29238,7 @@ var require_socks5_proxy_agent = __commonJS({
|
|
|
29238
29238
|
/**
|
|
29239
29239
|
* Dispatch a request through the SOCKS5 proxy
|
|
29240
29240
|
*/
|
|
29241
|
-
[kDispatch](opts,
|
|
29241
|
+
[kDispatch](opts, handler) {
|
|
29242
29242
|
const { origin } = opts;
|
|
29243
29243
|
debug2("dispatching request to", origin, "via SOCKS5");
|
|
29244
29244
|
try {
|
|
@@ -29280,14 +29280,14 @@ var require_socks5_proxy_agent = __commonJS({
|
|
|
29280
29280
|
});
|
|
29281
29281
|
this[kPools].set(originKey, pool);
|
|
29282
29282
|
}
|
|
29283
|
-
return pool[kDispatch](opts,
|
|
29283
|
+
return pool[kDispatch](opts, handler);
|
|
29284
29284
|
} catch (err) {
|
|
29285
29285
|
debug2("dispatch error:", err);
|
|
29286
|
-
if (typeof
|
|
29287
|
-
|
|
29286
|
+
if (typeof handler.onResponseError === "function") {
|
|
29287
|
+
handler.onResponseError(null, err);
|
|
29288
29288
|
return false;
|
|
29289
|
-
} else if (typeof
|
|
29290
|
-
|
|
29289
|
+
} else if (typeof handler.onError === "function") {
|
|
29290
|
+
handler.onError(err);
|
|
29291
29291
|
return false;
|
|
29292
29292
|
} else {
|
|
29293
29293
|
throw err;
|
|
@@ -29369,12 +29369,12 @@ var require_proxy_agent = __commonJS({
|
|
|
29369
29369
|
this.#client = new Client(proxyUrl, { connect: connect2 });
|
|
29370
29370
|
}
|
|
29371
29371
|
}
|
|
29372
|
-
[kDispatch](opts,
|
|
29373
|
-
const onHeaders =
|
|
29374
|
-
|
|
29372
|
+
[kDispatch](opts, handler) {
|
|
29373
|
+
const onHeaders = handler.onHeaders;
|
|
29374
|
+
handler.onHeaders = function(statusCode, data, resume) {
|
|
29375
29375
|
if (statusCode === 407) {
|
|
29376
|
-
if (typeof
|
|
29377
|
-
|
|
29376
|
+
if (typeof handler.onError === "function") {
|
|
29377
|
+
handler.onError(new InvalidArgumentError("Proxy Authentication Required (407)"));
|
|
29378
29378
|
}
|
|
29379
29379
|
return;
|
|
29380
29380
|
}
|
|
@@ -29391,7 +29391,7 @@ var require_proxy_agent = __commonJS({
|
|
|
29391
29391
|
headers.host = host;
|
|
29392
29392
|
}
|
|
29393
29393
|
opts.headers = { ...this[kProxyHeaders], ...headers };
|
|
29394
|
-
return this.#client[kDispatch](opts,
|
|
29394
|
+
return this.#client[kDispatch](opts, handler);
|
|
29395
29395
|
}
|
|
29396
29396
|
[kClose]() {
|
|
29397
29397
|
return this.#client.close();
|
|
@@ -29518,7 +29518,7 @@ var require_proxy_agent = __commonJS({
|
|
|
29518
29518
|
}, "connect")
|
|
29519
29519
|
});
|
|
29520
29520
|
}
|
|
29521
|
-
dispatch(opts,
|
|
29521
|
+
dispatch(opts, handler) {
|
|
29522
29522
|
const headers = buildHeaders(opts.headers);
|
|
29523
29523
|
throwIfProxyAuthIsSent(headers);
|
|
29524
29524
|
if (headers && !("host" in headers) && !("Host" in headers)) {
|
|
@@ -29530,7 +29530,7 @@ var require_proxy_agent = __commonJS({
|
|
|
29530
29530
|
...opts,
|
|
29531
29531
|
headers
|
|
29532
29532
|
},
|
|
29533
|
-
|
|
29533
|
+
handler
|
|
29534
29534
|
);
|
|
29535
29535
|
}
|
|
29536
29536
|
/**
|
|
@@ -29621,10 +29621,10 @@ var require_env_http_proxy_agent = __commonJS({
|
|
|
29621
29621
|
}
|
|
29622
29622
|
this.#parseNoProxy();
|
|
29623
29623
|
}
|
|
29624
|
-
[kDispatch](opts,
|
|
29624
|
+
[kDispatch](opts, handler) {
|
|
29625
29625
|
const url2 = new URL(opts.origin);
|
|
29626
29626
|
const agent = this.#getProxyAgentForUrl(url2);
|
|
29627
|
-
return agent.dispatch(opts,
|
|
29627
|
+
return agent.dispatch(opts, handler);
|
|
29628
29628
|
}
|
|
29629
29629
|
[kClose]() {
|
|
29630
29630
|
return Promise.all([
|
|
@@ -29731,7 +29731,7 @@ var require_retry_handler = __commonJS({
|
|
|
29731
29731
|
static {
|
|
29732
29732
|
__name(this, "RetryHandler");
|
|
29733
29733
|
}
|
|
29734
|
-
constructor(opts, { dispatch, handler
|
|
29734
|
+
constructor(opts, { dispatch, handler }) {
|
|
29735
29735
|
const { retryOptions, ...dispatchOpts } = opts;
|
|
29736
29736
|
const {
|
|
29737
29737
|
// Retry scoped
|
|
@@ -29749,7 +29749,7 @@ var require_retry_handler = __commonJS({
|
|
|
29749
29749
|
} = retryOptions ?? {};
|
|
29750
29750
|
this.error = null;
|
|
29751
29751
|
this.dispatch = dispatch;
|
|
29752
|
-
this.handler = WrapHandler.wrap(
|
|
29752
|
+
this.handler = WrapHandler.wrap(handler);
|
|
29753
29753
|
this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) };
|
|
29754
29754
|
this.retryOpts = {
|
|
29755
29755
|
throwOnError: throwOnError ?? true,
|
|
@@ -30041,13 +30041,13 @@ var require_retry_agent = __commonJS({
|
|
|
30041
30041
|
this.#agent = agent;
|
|
30042
30042
|
this.#options = options;
|
|
30043
30043
|
}
|
|
30044
|
-
dispatch(opts,
|
|
30044
|
+
dispatch(opts, handler) {
|
|
30045
30045
|
const retry = new RetryHandler({
|
|
30046
30046
|
...opts,
|
|
30047
30047
|
retryOptions: this.#options
|
|
30048
30048
|
}, {
|
|
30049
30049
|
dispatch: this.#agent.dispatch.bind(this.#agent),
|
|
30050
|
-
handler
|
|
30050
|
+
handler
|
|
30051
30051
|
});
|
|
30052
30052
|
return this.#agent.dispatch(opts, retry);
|
|
30053
30053
|
}
|
|
@@ -30689,8 +30689,8 @@ var require_api_request = __commonJS({
|
|
|
30689
30689
|
});
|
|
30690
30690
|
}
|
|
30691
30691
|
try {
|
|
30692
|
-
const
|
|
30693
|
-
this.dispatch(opts,
|
|
30692
|
+
const handler = new RequestHandler(opts, callback);
|
|
30693
|
+
this.dispatch(opts, handler);
|
|
30694
30694
|
} catch (err) {
|
|
30695
30695
|
if (typeof callback !== "function") {
|
|
30696
30696
|
throw err;
|
|
@@ -30911,8 +30911,8 @@ var require_api_stream = __commonJS({
|
|
|
30911
30911
|
});
|
|
30912
30912
|
}
|
|
30913
30913
|
try {
|
|
30914
|
-
const
|
|
30915
|
-
this.dispatch(opts,
|
|
30914
|
+
const handler = new StreamHandler(opts, factory, callback);
|
|
30915
|
+
this.dispatch(opts, handler);
|
|
30916
30916
|
} catch (err) {
|
|
30917
30917
|
if (typeof callback !== "function") {
|
|
30918
30918
|
throw err;
|
|
@@ -30990,11 +30990,11 @@ var require_api_pipeline = __commonJS({
|
|
|
30990
30990
|
static {
|
|
30991
30991
|
__name(this, "PipelineHandler");
|
|
30992
30992
|
}
|
|
30993
|
-
constructor(opts,
|
|
30993
|
+
constructor(opts, handler) {
|
|
30994
30994
|
if (!opts || typeof opts !== "object") {
|
|
30995
30995
|
throw new InvalidArgumentError("invalid opts");
|
|
30996
30996
|
}
|
|
30997
|
-
if (typeof
|
|
30997
|
+
if (typeof handler !== "function") {
|
|
30998
30998
|
throw new InvalidArgumentError("invalid handler");
|
|
30999
30999
|
}
|
|
31000
31000
|
const { signal, method, opaque, onInfo, responseHeaders } = opts;
|
|
@@ -31010,7 +31010,7 @@ var require_api_pipeline = __commonJS({
|
|
|
31010
31010
|
super("UNDICI_PIPELINE");
|
|
31011
31011
|
this.opaque = opaque || null;
|
|
31012
31012
|
this.responseHeaders = responseHeaders || null;
|
|
31013
|
-
this.handler =
|
|
31013
|
+
this.handler = handler;
|
|
31014
31014
|
this.abort = null;
|
|
31015
31015
|
this.context = null;
|
|
31016
31016
|
this.onInfo = onInfo || null;
|
|
@@ -31064,7 +31064,7 @@ var require_api_pipeline = __commonJS({
|
|
|
31064
31064
|
this.context = context2;
|
|
31065
31065
|
}
|
|
31066
31066
|
onHeaders(statusCode, rawHeaders, resume) {
|
|
31067
|
-
const { opaque, handler
|
|
31067
|
+
const { opaque, handler, context: context2 } = this;
|
|
31068
31068
|
if (statusCode < 200) {
|
|
31069
31069
|
if (this.onInfo) {
|
|
31070
31070
|
const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
|
|
@@ -31077,7 +31077,7 @@ var require_api_pipeline = __commonJS({
|
|
|
31077
31077
|
try {
|
|
31078
31078
|
this.handler = null;
|
|
31079
31079
|
const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
|
|
31080
|
-
body = this.runInAsyncScope(
|
|
31080
|
+
body = this.runInAsyncScope(handler, null, {
|
|
31081
31081
|
statusCode,
|
|
31082
31082
|
headers,
|
|
31083
31083
|
opaque,
|
|
@@ -31124,9 +31124,9 @@ var require_api_pipeline = __commonJS({
|
|
|
31124
31124
|
util.destroy(ret, err);
|
|
31125
31125
|
}
|
|
31126
31126
|
};
|
|
31127
|
-
function pipeline(opts,
|
|
31127
|
+
function pipeline(opts, handler) {
|
|
31128
31128
|
try {
|
|
31129
|
-
const pipelineHandler = new PipelineHandler(opts,
|
|
31129
|
+
const pipelineHandler = new PipelineHandler(opts, handler);
|
|
31130
31130
|
this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler);
|
|
31131
31131
|
return pipelineHandler.ret;
|
|
31132
31132
|
} catch (err) {
|
|
@@ -31657,7 +31657,7 @@ var require_mock_utils = __commonJS({
|
|
|
31657
31657
|
return Buffer.concat(buffers).toString("utf8");
|
|
31658
31658
|
}
|
|
31659
31659
|
__name(getResponse, "getResponse");
|
|
31660
|
-
function mockDispatch(opts,
|
|
31660
|
+
function mockDispatch(opts, handler) {
|
|
31661
31661
|
const key = buildKey(opts);
|
|
31662
31662
|
const mockDispatch2 = getMockDispatch(this[kDispatches], key);
|
|
31663
31663
|
mockDispatch2.timesInvoked++;
|
|
@@ -31670,7 +31670,7 @@ var require_mock_utils = __commonJS({
|
|
|
31670
31670
|
mockDispatch2.pending = timesInvoked < times;
|
|
31671
31671
|
if (error48 !== null) {
|
|
31672
31672
|
deleteMockDispatch(this[kDispatches], key);
|
|
31673
|
-
|
|
31673
|
+
handler.onError(error48);
|
|
31674
31674
|
return true;
|
|
31675
31675
|
}
|
|
31676
31676
|
let aborted2 = false;
|
|
@@ -31684,10 +31684,10 @@ var require_mock_utils = __commonJS({
|
|
|
31684
31684
|
clearTimeout(timer);
|
|
31685
31685
|
timer = null;
|
|
31686
31686
|
}
|
|
31687
|
-
|
|
31687
|
+
handler.onError(err);
|
|
31688
31688
|
}
|
|
31689
31689
|
__name(abort, "abort");
|
|
31690
|
-
|
|
31690
|
+
handler.onConnect?.(abort, null);
|
|
31691
31691
|
if (typeof delay === "number" && delay > 0) {
|
|
31692
31692
|
timer = setTimeout(() => {
|
|
31693
31693
|
timer = null;
|
|
@@ -31711,9 +31711,9 @@ var require_mock_utils = __commonJS({
|
|
|
31711
31711
|
const responseData = getResponseData(body);
|
|
31712
31712
|
const responseHeaders = generateKeyValues(headers);
|
|
31713
31713
|
const responseTrailers = generateKeyValues(trailers);
|
|
31714
|
-
|
|
31715
|
-
|
|
31716
|
-
|
|
31714
|
+
handler.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode));
|
|
31715
|
+
handler.onData?.(Buffer.from(responseData));
|
|
31716
|
+
handler.onComplete?.(responseTrailers);
|
|
31717
31717
|
deleteMockDispatch(mockDispatches, key);
|
|
31718
31718
|
}
|
|
31719
31719
|
__name(handleReply, "handleReply");
|
|
@@ -31727,10 +31727,10 @@ var require_mock_utils = __commonJS({
|
|
|
31727
31727
|
const agent = this[kMockAgent];
|
|
31728
31728
|
const origin = this[kOrigin];
|
|
31729
31729
|
const originalDispatch = this[kOriginalDispatch];
|
|
31730
|
-
return /* @__PURE__ */ __name(function dispatch(opts,
|
|
31730
|
+
return /* @__PURE__ */ __name(function dispatch(opts, handler) {
|
|
31731
31731
|
if (agent.isMockActive) {
|
|
31732
31732
|
try {
|
|
31733
|
-
mockDispatch.call(this, opts,
|
|
31733
|
+
mockDispatch.call(this, opts, handler);
|
|
31734
31734
|
} catch (error48) {
|
|
31735
31735
|
if (error48.code === "UND_MOCK_ERR_MOCK_NOT_MATCHED") {
|
|
31736
31736
|
const netConnect = agent[kGetNetConnect]();
|
|
@@ -31741,7 +31741,7 @@ var require_mock_utils = __commonJS({
|
|
|
31741
31741
|
throw new MockNotMatchedError(`${error48.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)${interceptsMessage}`);
|
|
31742
31742
|
}
|
|
31743
31743
|
if (checkNetConnect(netConnect, origin)) {
|
|
31744
|
-
originalDispatch.call(this, opts,
|
|
31744
|
+
originalDispatch.call(this, opts, handler);
|
|
31745
31745
|
} else {
|
|
31746
31746
|
throw new MockNotMatchedError(`${error48.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)${interceptsMessage}`);
|
|
31747
31747
|
}
|
|
@@ -31750,7 +31750,7 @@ var require_mock_utils = __commonJS({
|
|
|
31750
31750
|
}
|
|
31751
31751
|
}
|
|
31752
31752
|
} else {
|
|
31753
|
-
originalDispatch.call(this, opts,
|
|
31753
|
+
originalDispatch.call(this, opts, handler);
|
|
31754
31754
|
}
|
|
31755
31755
|
}, "dispatch");
|
|
31756
31756
|
}
|
|
@@ -32051,13 +32051,13 @@ var require_mock_call_history = __commonJS({
|
|
|
32051
32051
|
"use strict";
|
|
32052
32052
|
var { kMockCallHistoryAddLog } = require_mock_symbols();
|
|
32053
32053
|
var { InvalidArgumentError } = require_errors();
|
|
32054
|
-
function handleFilterCallsWithOptions(criteria, options,
|
|
32054
|
+
function handleFilterCallsWithOptions(criteria, options, handler, store, allLogs) {
|
|
32055
32055
|
switch (options.operator) {
|
|
32056
32056
|
case "OR":
|
|
32057
|
-
store.push(...
|
|
32057
|
+
store.push(...handler(criteria, allLogs));
|
|
32058
32058
|
return store;
|
|
32059
32059
|
case "AND":
|
|
32060
|
-
return
|
|
32060
|
+
return handler(criteria, store);
|
|
32061
32061
|
default:
|
|
32062
32062
|
throw new InvalidArgumentError("options.operator must to be a case insensitive string equal to 'OR' or 'AND'");
|
|
32063
32063
|
}
|
|
@@ -32427,7 +32427,7 @@ var require_mock_agent = __commonJS({
|
|
|
32427
32427
|
}
|
|
32428
32428
|
return dispatcher;
|
|
32429
32429
|
}
|
|
32430
|
-
dispatch(opts,
|
|
32430
|
+
dispatch(opts, handler) {
|
|
32431
32431
|
opts.origin = normalizeOrigin(opts.origin);
|
|
32432
32432
|
this.get(opts.origin);
|
|
32433
32433
|
this[kMockAgentAddCallHistoryLog](opts);
|
|
@@ -32438,7 +32438,7 @@ var require_mock_agent = __commonJS({
|
|
|
32438
32438
|
const normalizedSearchParams = normalizeSearchParams(searchParams, acceptNonStandardSearchParameters);
|
|
32439
32439
|
dispatchOpts.path = `${path12}?${normalizedSearchParams}`;
|
|
32440
32440
|
}
|
|
32441
|
-
return this[kAgent].dispatch(dispatchOpts,
|
|
32441
|
+
return this[kAgent].dispatch(dispatchOpts, handler);
|
|
32442
32442
|
}
|
|
32443
32443
|
async close() {
|
|
32444
32444
|
this.clearCallHistory();
|
|
@@ -33089,44 +33089,44 @@ var require_snapshot_agent = __commonJS({
|
|
|
33089
33089
|
});
|
|
33090
33090
|
}
|
|
33091
33091
|
}
|
|
33092
|
-
dispatch(opts,
|
|
33093
|
-
|
|
33092
|
+
dispatch(opts, handler) {
|
|
33093
|
+
handler = WrapHandler.wrap(handler);
|
|
33094
33094
|
const mode = this[kSnapshotMode];
|
|
33095
33095
|
if (this[kSnapshotRecorder].isUrlExcluded(opts)) {
|
|
33096
|
-
return this[kRealAgent].dispatch(opts,
|
|
33096
|
+
return this[kRealAgent].dispatch(opts, handler);
|
|
33097
33097
|
}
|
|
33098
33098
|
if (mode === "playback" || mode === "update") {
|
|
33099
33099
|
if (!this[kSnapshotLoaded]) {
|
|
33100
|
-
return this.#asyncDispatch(opts,
|
|
33100
|
+
return this.#asyncDispatch(opts, handler);
|
|
33101
33101
|
}
|
|
33102
33102
|
const snapshot = this[kSnapshotRecorder].findSnapshot(opts);
|
|
33103
33103
|
if (snapshot) {
|
|
33104
|
-
return this.#replaySnapshot(snapshot,
|
|
33104
|
+
return this.#replaySnapshot(snapshot, handler);
|
|
33105
33105
|
} else if (mode === "update") {
|
|
33106
|
-
return this.#recordAndReplay(opts,
|
|
33106
|
+
return this.#recordAndReplay(opts, handler);
|
|
33107
33107
|
} else {
|
|
33108
33108
|
const error48 = new UndiciError(`No snapshot found for ${opts.method || "GET"} ${opts.path}`);
|
|
33109
|
-
if (
|
|
33110
|
-
|
|
33109
|
+
if (handler.onError) {
|
|
33110
|
+
handler.onError(error48);
|
|
33111
33111
|
return;
|
|
33112
33112
|
}
|
|
33113
33113
|
throw error48;
|
|
33114
33114
|
}
|
|
33115
33115
|
} else if (mode === "record") {
|
|
33116
|
-
return this.#recordAndReplay(opts,
|
|
33116
|
+
return this.#recordAndReplay(opts, handler);
|
|
33117
33117
|
}
|
|
33118
33118
|
}
|
|
33119
33119
|
/**
|
|
33120
33120
|
* Async version of dispatch for when we need to load snapshots first
|
|
33121
33121
|
*/
|
|
33122
|
-
async #asyncDispatch(opts,
|
|
33122
|
+
async #asyncDispatch(opts, handler) {
|
|
33123
33123
|
await this.loadSnapshots();
|
|
33124
|
-
return this.dispatch(opts,
|
|
33124
|
+
return this.dispatch(opts, handler);
|
|
33125
33125
|
}
|
|
33126
33126
|
/**
|
|
33127
33127
|
* Records a real request and replays the response
|
|
33128
33128
|
*/
|
|
33129
|
-
#recordAndReplay(opts,
|
|
33129
|
+
#recordAndReplay(opts, handler) {
|
|
33130
33130
|
const responseData = {
|
|
33131
33131
|
statusCode: null,
|
|
33132
33132
|
headers: {},
|
|
@@ -33136,19 +33136,19 @@ var require_snapshot_agent = __commonJS({
|
|
|
33136
33136
|
const self2 = this;
|
|
33137
33137
|
const recordingHandler = {
|
|
33138
33138
|
onRequestStart(controller, context2) {
|
|
33139
|
-
return
|
|
33139
|
+
return handler.onRequestStart(controller, { ...context2, history: this.history });
|
|
33140
33140
|
},
|
|
33141
33141
|
onRequestUpgrade(controller, statusCode, headers, socket) {
|
|
33142
|
-
return
|
|
33142
|
+
return handler.onRequestUpgrade(controller, statusCode, headers, socket);
|
|
33143
33143
|
},
|
|
33144
33144
|
onResponseStart(controller, statusCode, headers, statusMessage) {
|
|
33145
33145
|
responseData.statusCode = statusCode;
|
|
33146
33146
|
responseData.headers = headers;
|
|
33147
|
-
return
|
|
33147
|
+
return handler.onResponseStart(controller, statusCode, headers, statusMessage);
|
|
33148
33148
|
},
|
|
33149
33149
|
onResponseData(controller, chunk) {
|
|
33150
33150
|
responseData.body.push(chunk);
|
|
33151
|
-
return
|
|
33151
|
+
return handler.onResponseData(controller, chunk);
|
|
33152
33152
|
},
|
|
33153
33153
|
onResponseEnd(controller, trailers) {
|
|
33154
33154
|
responseData.trailers = trailers;
|
|
@@ -33158,7 +33158,7 @@ var require_snapshot_agent = __commonJS({
|
|
|
33158
33158
|
headers: responseData.headers,
|
|
33159
33159
|
body: responseBody,
|
|
33160
33160
|
trailers: responseData.trailers
|
|
33161
|
-
}).then(() =>
|
|
33161
|
+
}).then(() => handler.onResponseEnd(controller, trailers)).catch((error48) => handler.onResponseError(controller, error48));
|
|
33162
33162
|
}
|
|
33163
33163
|
};
|
|
33164
33164
|
const agent = this[kRealAgent];
|
|
@@ -33171,7 +33171,7 @@ var require_snapshot_agent = __commonJS({
|
|
|
33171
33171
|
* @param {Object} handler - The handler to call with the response data.
|
|
33172
33172
|
* @returns {void}
|
|
33173
33173
|
*/
|
|
33174
|
-
#replaySnapshot(snapshot,
|
|
33174
|
+
#replaySnapshot(snapshot, handler) {
|
|
33175
33175
|
try {
|
|
33176
33176
|
const { response } = snapshot;
|
|
33177
33177
|
const controller = {
|
|
@@ -33186,13 +33186,13 @@ var require_snapshot_agent = __commonJS({
|
|
|
33186
33186
|
aborted: false,
|
|
33187
33187
|
paused: false
|
|
33188
33188
|
};
|
|
33189
|
-
|
|
33190
|
-
|
|
33189
|
+
handler.onRequestStart(controller);
|
|
33190
|
+
handler.onResponseStart(controller, response.statusCode, response.headers);
|
|
33191
33191
|
const body = Buffer.from(response.body, "base64");
|
|
33192
|
-
|
|
33193
|
-
|
|
33192
|
+
handler.onResponseData(controller, body);
|
|
33193
|
+
handler.onResponseEnd(controller, response.trailers);
|
|
33194
33194
|
} catch (error48) {
|
|
33195
|
-
|
|
33195
|
+
handler.onError?.(error48);
|
|
33196
33196
|
}
|
|
33197
33197
|
}
|
|
33198
33198
|
/**
|
|
@@ -33384,11 +33384,11 @@ var require_decorator_handler = __commonJS({
|
|
|
33384
33384
|
#onCompleteCalled = false;
|
|
33385
33385
|
#onErrorCalled = false;
|
|
33386
33386
|
#onResponseStartCalled = false;
|
|
33387
|
-
constructor(
|
|
33388
|
-
if (typeof
|
|
33387
|
+
constructor(handler) {
|
|
33388
|
+
if (typeof handler !== "object" || handler === null) {
|
|
33389
33389
|
throw new TypeError("handler must be an object");
|
|
33390
33390
|
}
|
|
33391
|
-
this.#handler = WrapHandler.wrap(
|
|
33391
|
+
this.#handler = WrapHandler.wrap(handler);
|
|
33392
33392
|
}
|
|
33393
33393
|
onRequestStart(...args) {
|
|
33394
33394
|
this.#handler.onRequestStart?.(...args);
|
|
@@ -33467,7 +33467,7 @@ var require_redirect_handler = __commonJS({
|
|
|
33467
33467
|
const dispatch = dispatcher.dispatch.bind(dispatcher);
|
|
33468
33468
|
return (opts, originalHandler) => dispatch(opts, new _RedirectHandler(dispatch, maxRedirections, opts, originalHandler));
|
|
33469
33469
|
}
|
|
33470
|
-
constructor(dispatch, maxRedirections, opts,
|
|
33470
|
+
constructor(dispatch, maxRedirections, opts, handler) {
|
|
33471
33471
|
if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
|
|
33472
33472
|
throw new InvalidArgumentError("maxRedirections must be a positive number");
|
|
33473
33473
|
}
|
|
@@ -33476,7 +33476,7 @@ var require_redirect_handler = __commonJS({
|
|
|
33476
33476
|
const { maxRedirections: _, ...cleanOpts } = opts;
|
|
33477
33477
|
this.opts = cleanOpts;
|
|
33478
33478
|
this.maxRedirections = maxRedirections;
|
|
33479
|
-
this.handler =
|
|
33479
|
+
this.handler = handler;
|
|
33480
33480
|
this.history = [];
|
|
33481
33481
|
if (util.isStream(this.opts.body)) {
|
|
33482
33482
|
if (util.bodyLength(this.opts.body) === 0) {
|
|
@@ -33604,13 +33604,13 @@ var require_redirect = __commonJS({
|
|
|
33604
33604
|
var RedirectHandler = require_redirect_handler();
|
|
33605
33605
|
function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections } = {}) {
|
|
33606
33606
|
return (dispatch) => {
|
|
33607
|
-
return /* @__PURE__ */ __name(function Intercept(opts,
|
|
33607
|
+
return /* @__PURE__ */ __name(function Intercept(opts, handler) {
|
|
33608
33608
|
const { maxRedirections = defaultMaxRedirections, ...rest } = opts;
|
|
33609
33609
|
if (maxRedirections == null || maxRedirections === 0) {
|
|
33610
|
-
return dispatch(opts,
|
|
33610
|
+
return dispatch(opts, handler);
|
|
33611
33611
|
}
|
|
33612
33612
|
const dispatchOpts = { ...rest };
|
|
33613
|
-
const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts,
|
|
33613
|
+
const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts, handler);
|
|
33614
33614
|
return dispatch(dispatchOpts, redirectHandler);
|
|
33615
33615
|
}, "Intercept");
|
|
33616
33616
|
};
|
|
@@ -33635,8 +33635,8 @@ var require_response_error = __commonJS({
|
|
|
33635
33635
|
#decoder;
|
|
33636
33636
|
#headers;
|
|
33637
33637
|
#body;
|
|
33638
|
-
constructor(_opts, { handler
|
|
33639
|
-
super(
|
|
33638
|
+
constructor(_opts, { handler }) {
|
|
33639
|
+
super(handler);
|
|
33640
33640
|
}
|
|
33641
33641
|
#checkContentType(contentType) {
|
|
33642
33642
|
return (this.#contentType ?? "").indexOf(contentType) === 0;
|
|
@@ -33697,8 +33697,8 @@ var require_response_error = __commonJS({
|
|
|
33697
33697
|
};
|
|
33698
33698
|
module2.exports = () => {
|
|
33699
33699
|
return (dispatch) => {
|
|
33700
|
-
return /* @__PURE__ */ __name(function Intercept(opts,
|
|
33701
|
-
return dispatch(opts, new ResponseErrorHandler(opts, { handler
|
|
33700
|
+
return /* @__PURE__ */ __name(function Intercept(opts, handler) {
|
|
33701
|
+
return dispatch(opts, new ResponseErrorHandler(opts, { handler }));
|
|
33702
33702
|
}, "Intercept");
|
|
33703
33703
|
};
|
|
33704
33704
|
};
|
|
@@ -33712,13 +33712,13 @@ var require_retry = __commonJS({
|
|
|
33712
33712
|
var RetryHandler = require_retry_handler();
|
|
33713
33713
|
module2.exports = (globalOpts) => {
|
|
33714
33714
|
return (dispatch) => {
|
|
33715
|
-
return /* @__PURE__ */ __name(function retryInterceptor(opts,
|
|
33715
|
+
return /* @__PURE__ */ __name(function retryInterceptor(opts, handler) {
|
|
33716
33716
|
return dispatch(
|
|
33717
33717
|
opts,
|
|
33718
33718
|
new RetryHandler(
|
|
33719
33719
|
{ ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } },
|
|
33720
33720
|
{
|
|
33721
|
-
handler
|
|
33721
|
+
handler,
|
|
33722
33722
|
dispatch
|
|
33723
33723
|
}
|
|
33724
33724
|
)
|
|
@@ -33745,11 +33745,11 @@ var require_dump = __commonJS({
|
|
|
33745
33745
|
#controller = null;
|
|
33746
33746
|
aborted = false;
|
|
33747
33747
|
reason = false;
|
|
33748
|
-
constructor({ maxSize, signal },
|
|
33748
|
+
constructor({ maxSize, signal }, handler) {
|
|
33749
33749
|
if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) {
|
|
33750
33750
|
throw new InvalidArgumentError("maxSize must be a number greater than 0");
|
|
33751
33751
|
}
|
|
33752
|
-
super(
|
|
33752
|
+
super(handler);
|
|
33753
33753
|
this.#maxSize = maxSize ?? this.#maxSize;
|
|
33754
33754
|
}
|
|
33755
33755
|
#abort(reason) {
|
|
@@ -33807,9 +33807,9 @@ var require_dump = __commonJS({
|
|
|
33807
33807
|
maxSize: 1024 * 1024
|
|
33808
33808
|
}) {
|
|
33809
33809
|
return (dispatch) => {
|
|
33810
|
-
return /* @__PURE__ */ __name(function Intercept(opts,
|
|
33810
|
+
return /* @__PURE__ */ __name(function Intercept(opts, handler) {
|
|
33811
33811
|
const { dumpMaxSize = defaultMaxSize } = opts;
|
|
33812
|
-
const dumpHandler = new DumpHandler({ maxSize: dumpMaxSize, signal: opts.signal },
|
|
33812
|
+
const dumpHandler = new DumpHandler({ maxSize: dumpMaxSize, signal: opts.signal }, handler);
|
|
33813
33813
|
return dispatch(opts, dumpHandler);
|
|
33814
33814
|
}, "Intercept");
|
|
33815
33815
|
};
|
|
@@ -34145,8 +34145,8 @@ var require_dns = __commonJS({
|
|
|
34145
34145
|
#controller = null;
|
|
34146
34146
|
#newOrigin = null;
|
|
34147
34147
|
#firstTry = true;
|
|
34148
|
-
constructor(state, { origin, handler
|
|
34149
|
-
super(
|
|
34148
|
+
constructor(state, { origin, handler, dispatch, newOrigin }, opts) {
|
|
34149
|
+
super(handler);
|
|
34150
34150
|
this.#origin = origin;
|
|
34151
34151
|
this.#newOrigin = newOrigin;
|
|
34152
34152
|
this.#opts = { ...opts };
|
|
@@ -34241,14 +34241,14 @@ var require_dns = __commonJS({
|
|
|
34241
34241
|
};
|
|
34242
34242
|
const instance = new DNSInstance(opts);
|
|
34243
34243
|
return (dispatch) => {
|
|
34244
|
-
return /* @__PURE__ */ __name(function dnsInterceptor(origDispatchOpts,
|
|
34244
|
+
return /* @__PURE__ */ __name(function dnsInterceptor(origDispatchOpts, handler) {
|
|
34245
34245
|
const origin = origDispatchOpts.origin.constructor === URL ? origDispatchOpts.origin : new URL(origDispatchOpts.origin);
|
|
34246
34246
|
if (isIP(origin.hostname) !== 0) {
|
|
34247
|
-
return dispatch(origDispatchOpts,
|
|
34247
|
+
return dispatch(origDispatchOpts, handler);
|
|
34248
34248
|
}
|
|
34249
34249
|
instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => {
|
|
34250
34250
|
if (err) {
|
|
34251
|
-
return
|
|
34251
|
+
return handler.onResponseError(null, err);
|
|
34252
34252
|
}
|
|
34253
34253
|
const dispatchOpts = {
|
|
34254
34254
|
...origDispatchOpts,
|
|
@@ -34260,7 +34260,7 @@ var require_dns = __commonJS({
|
|
|
34260
34260
|
dispatch(
|
|
34261
34261
|
dispatchOpts,
|
|
34262
34262
|
instance.getHandler(
|
|
34263
|
-
{ origin, dispatch, handler
|
|
34263
|
+
{ origin, dispatch, handler, newOrigin },
|
|
34264
34264
|
origDispatchOpts
|
|
34265
34265
|
)
|
|
34266
34266
|
);
|
|
@@ -35120,12 +35120,12 @@ var require_cache_handler = __commonJS({
|
|
|
35120
35120
|
* @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey
|
|
35121
35121
|
* @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler
|
|
35122
35122
|
*/
|
|
35123
|
-
constructor({ store, type, cacheByDefault }, cacheKey,
|
|
35123
|
+
constructor({ store, type, cacheByDefault }, cacheKey, handler) {
|
|
35124
35124
|
this.#store = store;
|
|
35125
35125
|
this.#cacheType = type;
|
|
35126
35126
|
this.#cacheByDefault = cacheByDefault;
|
|
35127
35127
|
this.#cacheKey = cacheKey;
|
|
35128
|
-
this.#handler =
|
|
35128
|
+
this.#handler = handler;
|
|
35129
35129
|
}
|
|
35130
35130
|
onRequestStart(controller, context2) {
|
|
35131
35131
|
this.#writeStream?.destroy();
|
|
@@ -35148,7 +35148,7 @@ var require_cache_handler = __commonJS({
|
|
|
35148
35148
|
resHeaders,
|
|
35149
35149
|
statusMessage
|
|
35150
35150
|
), "downstreamOnHeaders");
|
|
35151
|
-
const
|
|
35151
|
+
const handler = this;
|
|
35152
35152
|
if (!util.safeHTTPMethods.includes(this.#cacheKey.method) && statusCode >= 200 && statusCode <= 399) {
|
|
35153
35153
|
try {
|
|
35154
35154
|
this.#store.delete(this.#cacheKey)?.catch?.(noop);
|
|
@@ -35225,13 +35225,13 @@ var require_cache_handler = __commonJS({
|
|
|
35225
35225
|
}
|
|
35226
35226
|
}, "streamCachedBody");
|
|
35227
35227
|
this.#writeStream.on("error", function() {
|
|
35228
|
-
|
|
35229
|
-
|
|
35228
|
+
handler.#writeStream = void 0;
|
|
35229
|
+
handler.#store.delete(handler.#cacheKey);
|
|
35230
35230
|
}).on("drain", () => {
|
|
35231
35231
|
streamCachedBody();
|
|
35232
35232
|
}).on("close", function() {
|
|
35233
|
-
if (
|
|
35234
|
-
|
|
35233
|
+
if (handler.#writeStream === this) {
|
|
35234
|
+
handler.#writeStream = void 0;
|
|
35235
35235
|
}
|
|
35236
35236
|
});
|
|
35237
35237
|
streamCachedBody();
|
|
@@ -35246,11 +35246,11 @@ var require_cache_handler = __commonJS({
|
|
|
35246
35246
|
this.#store.delete(this.#cacheKey);
|
|
35247
35247
|
});
|
|
35248
35248
|
this.#writeStream.on("error", function() {
|
|
35249
|
-
|
|
35250
|
-
|
|
35249
|
+
handler.#writeStream = void 0;
|
|
35250
|
+
handler.#store.delete(handler.#cacheKey);
|
|
35251
35251
|
}).on("close", function() {
|
|
35252
|
-
if (
|
|
35253
|
-
|
|
35252
|
+
if (handler.#writeStream === this) {
|
|
35253
|
+
handler.#writeStream = void 0;
|
|
35254
35254
|
}
|
|
35255
35255
|
});
|
|
35256
35256
|
}
|
|
@@ -35270,11 +35270,11 @@ var require_cache_handler = __commonJS({
|
|
|
35270
35270
|
return downstreamOnHeaders();
|
|
35271
35271
|
}
|
|
35272
35272
|
this.#writeStream.on("drain", () => controller.resume()).on("error", function() {
|
|
35273
|
-
|
|
35274
|
-
|
|
35273
|
+
handler.#writeStream = void 0;
|
|
35274
|
+
handler.#store.delete(handler.#cacheKey);
|
|
35275
35275
|
}).on("close", function() {
|
|
35276
|
-
if (
|
|
35277
|
-
|
|
35276
|
+
if (handler.#writeStream === this) {
|
|
35277
|
+
handler.#writeStream = void 0;
|
|
35278
35278
|
}
|
|
35279
35279
|
controller.resume();
|
|
35280
35280
|
});
|
|
@@ -35653,12 +35653,12 @@ var require_cache_revalidation_handler = __commonJS({
|
|
|
35653
35653
|
* @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler
|
|
35654
35654
|
* @param {boolean} allowErrorStatusCodes
|
|
35655
35655
|
*/
|
|
35656
|
-
constructor(callback,
|
|
35656
|
+
constructor(callback, handler, allowErrorStatusCodes) {
|
|
35657
35657
|
if (typeof callback !== "function") {
|
|
35658
35658
|
throw new TypeError("callback must be a function");
|
|
35659
35659
|
}
|
|
35660
35660
|
this.#callback = callback;
|
|
35661
|
-
this.#handler =
|
|
35661
|
+
this.#handler = handler;
|
|
35662
35662
|
this.#allowErrorStatusCodes = allowErrorStatusCodes;
|
|
35663
35663
|
}
|
|
35664
35664
|
onRequestStart(_, context2) {
|
|
@@ -35782,38 +35782,38 @@ var require_cache2 = __commonJS({
|
|
|
35782
35782
|
return now <= staleWhileRevalidateExpiry;
|
|
35783
35783
|
}
|
|
35784
35784
|
__name(withinStaleWhileRevalidateWindow, "withinStaleWhileRevalidateWindow");
|
|
35785
|
-
function handleUncachedResponse(dispatch, globalOpts, cacheKey,
|
|
35785
|
+
function handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl) {
|
|
35786
35786
|
if (reqCacheControl?.["only-if-cached"]) {
|
|
35787
35787
|
let aborted2 = false;
|
|
35788
35788
|
try {
|
|
35789
|
-
if (typeof
|
|
35790
|
-
|
|
35789
|
+
if (typeof handler.onConnect === "function") {
|
|
35790
|
+
handler.onConnect(() => {
|
|
35791
35791
|
aborted2 = true;
|
|
35792
35792
|
});
|
|
35793
35793
|
if (aborted2) {
|
|
35794
35794
|
return;
|
|
35795
35795
|
}
|
|
35796
35796
|
}
|
|
35797
|
-
if (typeof
|
|
35798
|
-
|
|
35797
|
+
if (typeof handler.onHeaders === "function") {
|
|
35798
|
+
handler.onHeaders(504, [], nop, "Gateway Timeout");
|
|
35799
35799
|
if (aborted2) {
|
|
35800
35800
|
return;
|
|
35801
35801
|
}
|
|
35802
35802
|
}
|
|
35803
|
-
if (typeof
|
|
35804
|
-
|
|
35803
|
+
if (typeof handler.onComplete === "function") {
|
|
35804
|
+
handler.onComplete([]);
|
|
35805
35805
|
}
|
|
35806
35806
|
} catch (err) {
|
|
35807
|
-
if (typeof
|
|
35808
|
-
|
|
35807
|
+
if (typeof handler.onError === "function") {
|
|
35808
|
+
handler.onError(err);
|
|
35809
35809
|
}
|
|
35810
35810
|
}
|
|
35811
35811
|
return true;
|
|
35812
35812
|
}
|
|
35813
|
-
return dispatch(opts, new CacheHandler(globalOpts, cacheKey,
|
|
35813
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler));
|
|
35814
35814
|
}
|
|
35815
35815
|
__name(handleUncachedResponse, "handleUncachedResponse");
|
|
35816
|
-
function sendCachedValue(
|
|
35816
|
+
function sendCachedValue(handler, opts, result, age, context2, isStale2) {
|
|
35817
35817
|
const stream = util.isStream(result.body) ? result.body : Readable.from(result.body ?? []);
|
|
35818
35818
|
assert2(!stream.destroyed, "stream should not be destroyed");
|
|
35819
35819
|
assert2(!stream.readableDidRead, "stream should not be readableDidRead");
|
|
@@ -35839,18 +35839,18 @@ var require_cache2 = __commonJS({
|
|
|
35839
35839
|
};
|
|
35840
35840
|
stream.on("error", function(err) {
|
|
35841
35841
|
if (!this.readableEnded) {
|
|
35842
|
-
if (typeof
|
|
35843
|
-
|
|
35842
|
+
if (typeof handler.onResponseError === "function") {
|
|
35843
|
+
handler.onResponseError(controller, err);
|
|
35844
35844
|
} else {
|
|
35845
35845
|
throw err;
|
|
35846
35846
|
}
|
|
35847
35847
|
}
|
|
35848
35848
|
}).on("close", function() {
|
|
35849
35849
|
if (!this.errored) {
|
|
35850
|
-
|
|
35850
|
+
handler.onResponseEnd?.(controller, {});
|
|
35851
35851
|
}
|
|
35852
35852
|
});
|
|
35853
|
-
|
|
35853
|
+
handler.onRequestStart?.(controller, context2);
|
|
35854
35854
|
if (stream.destroyed) {
|
|
35855
35855
|
return;
|
|
35856
35856
|
}
|
|
@@ -35858,36 +35858,36 @@ var require_cache2 = __commonJS({
|
|
|
35858
35858
|
if (isStale2) {
|
|
35859
35859
|
headers.warning = '110 - "response is stale"';
|
|
35860
35860
|
}
|
|
35861
|
-
|
|
35861
|
+
handler.onResponseStart?.(controller, result.statusCode, headers, result.statusMessage);
|
|
35862
35862
|
if (opts.method === "HEAD") {
|
|
35863
35863
|
stream.destroy();
|
|
35864
35864
|
} else {
|
|
35865
35865
|
stream.on("data", function(chunk) {
|
|
35866
|
-
|
|
35866
|
+
handler.onResponseData?.(controller, chunk);
|
|
35867
35867
|
});
|
|
35868
35868
|
}
|
|
35869
35869
|
}
|
|
35870
35870
|
__name(sendCachedValue, "sendCachedValue");
|
|
35871
|
-
function handleResult(dispatch, globalOpts, cacheKey,
|
|
35871
|
+
function handleResult(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl, result) {
|
|
35872
35872
|
if (!result) {
|
|
35873
|
-
return handleUncachedResponse(dispatch, globalOpts, cacheKey,
|
|
35873
|
+
return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl);
|
|
35874
35874
|
}
|
|
35875
35875
|
const now = Date.now();
|
|
35876
35876
|
if (now > result.deleteAt) {
|
|
35877
|
-
return dispatch(opts, new CacheHandler(globalOpts, cacheKey,
|
|
35877
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler));
|
|
35878
35878
|
}
|
|
35879
35879
|
const age = Math.round((now - result.cachedAt) / 1e3);
|
|
35880
35880
|
if (reqCacheControl?.["max-age"] && age >= reqCacheControl["max-age"]) {
|
|
35881
|
-
return dispatch(opts,
|
|
35881
|
+
return dispatch(opts, handler);
|
|
35882
35882
|
}
|
|
35883
35883
|
const stale = isStale(result, reqCacheControl);
|
|
35884
35884
|
const revalidate = needsRevalidation(result, reqCacheControl, opts);
|
|
35885
35885
|
if (stale || revalidate) {
|
|
35886
35886
|
if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) {
|
|
35887
|
-
return dispatch(opts, new CacheHandler(globalOpts, cacheKey,
|
|
35887
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler));
|
|
35888
35888
|
}
|
|
35889
35889
|
if (!revalidate && withinStaleWhileRevalidateWindow(result)) {
|
|
35890
|
-
sendCachedValue(
|
|
35890
|
+
sendCachedValue(handler, opts, result, age, null, true);
|
|
35891
35891
|
queueMicrotask(() => {
|
|
35892
35892
|
const headers2 = {
|
|
35893
35893
|
...opts.headers,
|
|
@@ -35954,12 +35954,12 @@ var require_cache2 = __commonJS({
|
|
|
35954
35954
|
new CacheRevalidationHandler(
|
|
35955
35955
|
(success2, context2) => {
|
|
35956
35956
|
if (success2) {
|
|
35957
|
-
sendCachedValue(
|
|
35957
|
+
sendCachedValue(handler, opts, result, age, context2, stale);
|
|
35958
35958
|
} else if (util.isStream(result.body)) {
|
|
35959
35959
|
result.body.on("error", nop).destroy();
|
|
35960
35960
|
}
|
|
35961
35961
|
},
|
|
35962
|
-
new CacheHandler(globalOpts, cacheKey,
|
|
35962
|
+
new CacheHandler(globalOpts, cacheKey, handler),
|
|
35963
35963
|
withinStaleIfErrorThreshold
|
|
35964
35964
|
)
|
|
35965
35965
|
);
|
|
@@ -35967,7 +35967,7 @@ var require_cache2 = __commonJS({
|
|
|
35967
35967
|
if (util.isStream(opts.body)) {
|
|
35968
35968
|
opts.body.on("error", nop).destroy();
|
|
35969
35969
|
}
|
|
35970
|
-
sendCachedValue(
|
|
35970
|
+
sendCachedValue(handler, opts, result, age, null, false);
|
|
35971
35971
|
}
|
|
35972
35972
|
__name(handleResult, "handleResult");
|
|
35973
35973
|
module2.exports = (opts = {}) => {
|
|
@@ -35998,9 +35998,9 @@ var require_cache2 = __commonJS({
|
|
|
35998
35998
|
};
|
|
35999
35999
|
const safeMethodsToNotCache = util.safeHTTPMethods.filter((method) => methods.includes(method) === false);
|
|
36000
36000
|
return (dispatch) => {
|
|
36001
|
-
return (opts2,
|
|
36001
|
+
return (opts2, handler) => {
|
|
36002
36002
|
if (!opts2.origin || safeMethodsToNotCache.includes(opts2.method)) {
|
|
36003
|
-
return dispatch(opts2,
|
|
36003
|
+
return dispatch(opts2, handler);
|
|
36004
36004
|
}
|
|
36005
36005
|
if (origins !== void 0) {
|
|
36006
36006
|
const requestOrigin = opts2.origin.toString().toLowerCase();
|
|
@@ -36018,7 +36018,7 @@ var require_cache2 = __commonJS({
|
|
|
36018
36018
|
}
|
|
36019
36019
|
}
|
|
36020
36020
|
if (!isAllowed) {
|
|
36021
|
-
return dispatch(opts2,
|
|
36021
|
+
return dispatch(opts2, handler);
|
|
36022
36022
|
}
|
|
36023
36023
|
}
|
|
36024
36024
|
opts2 = {
|
|
@@ -36027,7 +36027,7 @@ var require_cache2 = __commonJS({
|
|
|
36027
36027
|
};
|
|
36028
36028
|
const reqCacheControl = opts2.headers?.["cache-control"] ? parseCacheControlHeader(opts2.headers["cache-control"]) : void 0;
|
|
36029
36029
|
if (reqCacheControl?.["no-store"]) {
|
|
36030
|
-
return dispatch(opts2,
|
|
36030
|
+
return dispatch(opts2, handler);
|
|
36031
36031
|
}
|
|
36032
36032
|
const cacheKey = makeCacheKey(opts2);
|
|
36033
36033
|
const result = store.get(cacheKey);
|
|
@@ -36036,7 +36036,7 @@ var require_cache2 = __commonJS({
|
|
|
36036
36036
|
dispatch,
|
|
36037
36037
|
globalOpts,
|
|
36038
36038
|
cacheKey,
|
|
36039
|
-
|
|
36039
|
+
handler,
|
|
36040
36040
|
opts2,
|
|
36041
36041
|
reqCacheControl,
|
|
36042
36042
|
result2
|
|
@@ -36046,7 +36046,7 @@ var require_cache2 = __commonJS({
|
|
|
36046
36046
|
dispatch,
|
|
36047
36047
|
globalOpts,
|
|
36048
36048
|
cacheKey,
|
|
36049
|
-
|
|
36049
|
+
handler,
|
|
36050
36050
|
opts2,
|
|
36051
36051
|
reqCacheControl,
|
|
36052
36052
|
result
|
|
@@ -36093,8 +36093,8 @@ var require_decompress = __commonJS({
|
|
|
36093
36093
|
#skipStatusCodes;
|
|
36094
36094
|
/** @type {boolean} */
|
|
36095
36095
|
#skipErrorResponses;
|
|
36096
|
-
constructor(
|
|
36097
|
-
super(
|
|
36096
|
+
constructor(handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) {
|
|
36097
|
+
super(handler);
|
|
36098
36098
|
this.#skipStatusCodes = skipStatusCodes;
|
|
36099
36099
|
this.#skipErrorResponses = skipErrorResponses;
|
|
36100
36100
|
}
|
|
@@ -36265,8 +36265,8 @@ var require_decompress = __commonJS({
|
|
|
36265
36265
|
warningEmitted = true;
|
|
36266
36266
|
}
|
|
36267
36267
|
return (dispatch) => {
|
|
36268
|
-
return (opts,
|
|
36269
|
-
const decompressHandler = new DecompressHandler(
|
|
36268
|
+
return (opts, handler) => {
|
|
36269
|
+
const decompressHandler = new DecompressHandler(handler, options);
|
|
36270
36270
|
return dispatch(opts, decompressHandler);
|
|
36271
36271
|
};
|
|
36272
36272
|
};
|
|
@@ -36351,20 +36351,20 @@ var require_deduplication_handler = __commonJS({
|
|
|
36351
36351
|
* @param {DispatchHandler} handler
|
|
36352
36352
|
* @returns {boolean}
|
|
36353
36353
|
*/
|
|
36354
|
-
addWaitingHandler(
|
|
36354
|
+
addWaitingHandler(handler) {
|
|
36355
36355
|
if (this.#completed || this.#responseDataStarted) {
|
|
36356
36356
|
return false;
|
|
36357
36357
|
}
|
|
36358
|
-
const waitingHandler = this.#createWaitingHandler(
|
|
36358
|
+
const waitingHandler = this.#createWaitingHandler(handler);
|
|
36359
36359
|
const waitingController = waitingHandler.controller;
|
|
36360
36360
|
try {
|
|
36361
|
-
|
|
36361
|
+
handler.onRequestStart?.(waitingController, null);
|
|
36362
36362
|
if (waitingController.aborted) {
|
|
36363
36363
|
waitingHandler.done = true;
|
|
36364
36364
|
return true;
|
|
36365
36365
|
}
|
|
36366
36366
|
if (this.#responseStarted) {
|
|
36367
|
-
|
|
36367
|
+
handler.onResponseStart?.(
|
|
36368
36368
|
waitingController,
|
|
36369
36369
|
this.#statusCode,
|
|
36370
36370
|
this.#headers,
|
|
@@ -36410,13 +36410,13 @@ var require_deduplication_handler = __commonJS({
|
|
|
36410
36410
|
this.#statusMessage = statusMessage;
|
|
36411
36411
|
this.#primaryHandler.onResponseStart?.(controller, statusCode, headers, statusMessage);
|
|
36412
36412
|
for (const waitingHandler of this.#waitingHandlers) {
|
|
36413
|
-
const { handler
|
|
36413
|
+
const { handler, controller: waitingController } = waitingHandler;
|
|
36414
36414
|
if (waitingHandler.done || waitingController.aborted) {
|
|
36415
36415
|
waitingHandler.done = true;
|
|
36416
36416
|
continue;
|
|
36417
36417
|
}
|
|
36418
36418
|
try {
|
|
36419
|
-
|
|
36419
|
+
handler.onResponseStart?.(
|
|
36420
36420
|
waitingController,
|
|
36421
36421
|
statusCode,
|
|
36422
36422
|
headers,
|
|
@@ -36441,7 +36441,7 @@ var require_deduplication_handler = __commonJS({
|
|
|
36441
36441
|
this.#responseDataStarted = true;
|
|
36442
36442
|
this.#primaryHandler.onResponseData?.(controller, chunk);
|
|
36443
36443
|
for (const waitingHandler of this.#waitingHandlers) {
|
|
36444
|
-
const { handler
|
|
36444
|
+
const { handler, controller: waitingController } = waitingHandler;
|
|
36445
36445
|
if (waitingHandler.done || waitingController.aborted) {
|
|
36446
36446
|
waitingHandler.done = true;
|
|
36447
36447
|
continue;
|
|
@@ -36451,7 +36451,7 @@ var require_deduplication_handler = __commonJS({
|
|
|
36451
36451
|
continue;
|
|
36452
36452
|
}
|
|
36453
36453
|
try {
|
|
36454
|
-
|
|
36454
|
+
handler.onResponseData?.(waitingController, chunk);
|
|
36455
36455
|
} catch {
|
|
36456
36456
|
}
|
|
36457
36457
|
if (waitingController.aborted) {
|
|
@@ -36516,9 +36516,9 @@ var require_deduplication_handler = __commonJS({
|
|
|
36516
36516
|
* @param {DispatchHandler} handler
|
|
36517
36517
|
* @returns {WaitingHandler}
|
|
36518
36518
|
*/
|
|
36519
|
-
#createWaitingHandler(
|
|
36519
|
+
#createWaitingHandler(handler) {
|
|
36520
36520
|
const waitingHandler = {
|
|
36521
|
-
handler
|
|
36521
|
+
handler,
|
|
36522
36522
|
controller: null,
|
|
36523
36523
|
bufferedChunks: [],
|
|
36524
36524
|
bufferedBytes: 0,
|
|
@@ -36595,12 +36595,12 @@ var require_deduplication_handler = __commonJS({
|
|
|
36595
36595
|
* @param {WaitingHandler} waitingHandler
|
|
36596
36596
|
*/
|
|
36597
36597
|
#flushWaitingHandler(waitingHandler) {
|
|
36598
|
-
const { handler
|
|
36598
|
+
const { handler, controller } = waitingHandler;
|
|
36599
36599
|
while (!waitingHandler.done && !controller.aborted && !controller.paused && waitingHandler.bufferedChunks.length > 0) {
|
|
36600
36600
|
const bufferedChunk = waitingHandler.bufferedChunks.shift();
|
|
36601
36601
|
waitingHandler.bufferedBytes -= bufferedChunk.length;
|
|
36602
36602
|
try {
|
|
36603
|
-
|
|
36603
|
+
handler.onResponseData?.(controller, bufferedChunk);
|
|
36604
36604
|
} catch {
|
|
36605
36605
|
}
|
|
36606
36606
|
if (controller.aborted) {
|
|
@@ -36678,9 +36678,9 @@ var require_deduplicate = __commonJS({
|
|
|
36678
36678
|
const excludeHeaderNamesSet = new Set(excludeHeaderNames.map((name) => name.toLowerCase()));
|
|
36679
36679
|
const pendingRequests = /* @__PURE__ */ new Map();
|
|
36680
36680
|
return (dispatch) => {
|
|
36681
|
-
return (opts2,
|
|
36681
|
+
return (opts2, handler) => {
|
|
36682
36682
|
if (!opts2.origin || methods.includes(opts2.method) === false) {
|
|
36683
|
-
return dispatch(opts2,
|
|
36683
|
+
return dispatch(opts2, handler);
|
|
36684
36684
|
}
|
|
36685
36685
|
opts2 = {
|
|
36686
36686
|
...opts2,
|
|
@@ -36689,7 +36689,7 @@ var require_deduplicate = __commonJS({
|
|
|
36689
36689
|
if (skipHeaderNamesSet.size > 0) {
|
|
36690
36690
|
for (const headerName of Object.keys(opts2.headers)) {
|
|
36691
36691
|
if (skipHeaderNamesSet.has(headerName.toLowerCase())) {
|
|
36692
|
-
return dispatch(opts2,
|
|
36692
|
+
return dispatch(opts2, handler);
|
|
36693
36693
|
}
|
|
36694
36694
|
}
|
|
36695
36695
|
}
|
|
@@ -36697,13 +36697,13 @@ var require_deduplicate = __commonJS({
|
|
|
36697
36697
|
const dedupeKey = makeDeduplicationKey(cacheKey, excludeHeaderNamesSet);
|
|
36698
36698
|
const pendingHandler = pendingRequests.get(dedupeKey);
|
|
36699
36699
|
if (pendingHandler) {
|
|
36700
|
-
if (pendingHandler.addWaitingHandler(
|
|
36700
|
+
if (pendingHandler.addWaitingHandler(handler)) {
|
|
36701
36701
|
return true;
|
|
36702
36702
|
}
|
|
36703
|
-
return dispatch(opts2,
|
|
36703
|
+
return dispatch(opts2, handler);
|
|
36704
36704
|
}
|
|
36705
36705
|
const deduplicationHandler = new DeduplicationHandler(
|
|
36706
|
-
|
|
36706
|
+
handler,
|
|
36707
36707
|
() => {
|
|
36708
36708
|
pendingRequests.delete(dedupeKey);
|
|
36709
36709
|
if (pendingRequestsChannel.hasSubscribers) {
|
|
@@ -41589,8 +41589,8 @@ var require_util5 = __commonJS({
|
|
|
41589
41589
|
target2.dispatchEvent(event);
|
|
41590
41590
|
}
|
|
41591
41591
|
__name(fireEvent, "fireEvent");
|
|
41592
|
-
function websocketMessageReceived(
|
|
41593
|
-
|
|
41592
|
+
function websocketMessageReceived(handler, type, data) {
|
|
41593
|
+
handler.onMessage(type, data);
|
|
41594
41594
|
}
|
|
41595
41595
|
__name(websocketMessageReceived, "websocketMessageReceived");
|
|
41596
41596
|
function toArrayBuffer(buffer2) {
|
|
@@ -41878,7 +41878,7 @@ var require_connection = __commonJS({
|
|
|
41878
41878
|
var { runtimeFeatures } = require_runtime_features();
|
|
41879
41879
|
var crypto2 = runtimeFeatures.has("crypto") ? require("node:crypto") : null;
|
|
41880
41880
|
var warningEmitted = false;
|
|
41881
|
-
function establishWebSocketConnection(url2, protocols, client,
|
|
41881
|
+
function establishWebSocketConnection(url2, protocols, client, handler, options) {
|
|
41882
41882
|
const requestURL = url2;
|
|
41883
41883
|
requestURL.protocol = url2.protocol === "ws:" ? "http:" : "https:";
|
|
41884
41884
|
const request2 = makeRequest2({
|
|
@@ -41911,11 +41911,11 @@ var require_connection = __commonJS({
|
|
|
41911
41911
|
processResponse(response) {
|
|
41912
41912
|
if (response.type === "error" || response.status !== 101) {
|
|
41913
41913
|
if (response.socket?.session == null) {
|
|
41914
|
-
failWebsocketConnection(
|
|
41914
|
+
failWebsocketConnection(handler, 1002, "Received network error or non-101 status code.", response.error);
|
|
41915
41915
|
return;
|
|
41916
41916
|
}
|
|
41917
41917
|
if (response.status !== 200) {
|
|
41918
|
-
failWebsocketConnection(
|
|
41918
|
+
failWebsocketConnection(handler, 1002, "Received network error or non-200 status code.", response.error);
|
|
41919
41919
|
return;
|
|
41920
41920
|
}
|
|
41921
41921
|
}
|
|
@@ -41924,21 +41924,21 @@ var require_connection = __commonJS({
|
|
|
41924
41924
|
warningEmitted = true;
|
|
41925
41925
|
}
|
|
41926
41926
|
if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) {
|
|
41927
|
-
failWebsocketConnection(
|
|
41927
|
+
failWebsocketConnection(handler, 1002, "Server did not respond with sent protocols.");
|
|
41928
41928
|
return;
|
|
41929
41929
|
}
|
|
41930
41930
|
if (response.socket.session == null && response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") {
|
|
41931
|
-
failWebsocketConnection(
|
|
41931
|
+
failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to "websocket".');
|
|
41932
41932
|
return;
|
|
41933
41933
|
}
|
|
41934
41934
|
if (response.socket.session == null && response.headersList.get("Connection")?.toLowerCase() !== "upgrade") {
|
|
41935
|
-
failWebsocketConnection(
|
|
41935
|
+
failWebsocketConnection(handler, 1002, 'Server did not set Connection header to "upgrade".');
|
|
41936
41936
|
return;
|
|
41937
41937
|
}
|
|
41938
41938
|
const secWSAccept = response.headersList.get("Sec-WebSocket-Accept");
|
|
41939
41939
|
const digest = crypto2.hash("sha1", keyValue + uid, "base64");
|
|
41940
41940
|
if (secWSAccept !== digest) {
|
|
41941
|
-
failWebsocketConnection(
|
|
41941
|
+
failWebsocketConnection(handler, 1002, "Incorrect hash received in Sec-WebSocket-Accept header.");
|
|
41942
41942
|
return;
|
|
41943
41943
|
}
|
|
41944
41944
|
const secExtension = response.headersList.get("Sec-WebSocket-Extensions");
|
|
@@ -41946,7 +41946,7 @@ var require_connection = __commonJS({
|
|
|
41946
41946
|
if (secExtension !== null) {
|
|
41947
41947
|
extensions2 = parseExtensions(secExtension);
|
|
41948
41948
|
if (!extensions2.has("permessage-deflate")) {
|
|
41949
|
-
failWebsocketConnection(
|
|
41949
|
+
failWebsocketConnection(handler, 1002, "Sec-WebSocket-Extensions header does not match.");
|
|
41950
41950
|
return;
|
|
41951
41951
|
}
|
|
41952
41952
|
}
|
|
@@ -41954,15 +41954,15 @@ var require_connection = __commonJS({
|
|
|
41954
41954
|
if (secProtocol !== null) {
|
|
41955
41955
|
const requestProtocols = getDecodeSplit("sec-websocket-protocol", request2.headersList);
|
|
41956
41956
|
if (!requestProtocols.includes(secProtocol)) {
|
|
41957
|
-
failWebsocketConnection(
|
|
41957
|
+
failWebsocketConnection(handler, 1002, "Protocol was not set in the opening handshake.");
|
|
41958
41958
|
return;
|
|
41959
41959
|
}
|
|
41960
41960
|
}
|
|
41961
|
-
response.socket.on("data",
|
|
41962
|
-
response.socket.on("close",
|
|
41963
|
-
response.socket.on("error",
|
|
41964
|
-
|
|
41965
|
-
|
|
41961
|
+
response.socket.on("data", handler.onSocketData);
|
|
41962
|
+
response.socket.on("close", handler.onSocketClose);
|
|
41963
|
+
response.socket.on("error", handler.onSocketError);
|
|
41964
|
+
handler.wasEverConnected = true;
|
|
41965
|
+
handler.onConnectionEstablished(response, extensions2);
|
|
41966
41966
|
}
|
|
41967
41967
|
});
|
|
41968
41968
|
return controller;
|
|
@@ -42002,15 +42002,15 @@ var require_connection = __commonJS({
|
|
|
42002
42002
|
}
|
|
42003
42003
|
}
|
|
42004
42004
|
__name(closeWebSocketConnection, "closeWebSocketConnection");
|
|
42005
|
-
function failWebsocketConnection(
|
|
42006
|
-
if (isEstablished(
|
|
42007
|
-
closeWebSocketConnection(
|
|
42005
|
+
function failWebsocketConnection(handler, code, reason, cause) {
|
|
42006
|
+
if (isEstablished(handler.readyState)) {
|
|
42007
|
+
closeWebSocketConnection(handler, code, reason, false);
|
|
42008
42008
|
}
|
|
42009
|
-
|
|
42010
|
-
if (isConnecting(
|
|
42011
|
-
|
|
42012
|
-
} else if (
|
|
42013
|
-
|
|
42009
|
+
handler.controller.abort();
|
|
42010
|
+
if (isConnecting(handler.readyState)) {
|
|
42011
|
+
handler.onSocketClose();
|
|
42012
|
+
} else if (handler.socket?.destroyed === false) {
|
|
42013
|
+
handler.socket.destroy();
|
|
42014
42014
|
}
|
|
42015
42015
|
}
|
|
42016
42016
|
__name(failWebsocketConnection, "failWebsocketConnection");
|
|
@@ -42150,9 +42150,9 @@ var require_receiver = __commonJS({
|
|
|
42150
42150
|
* @param {Map<string, string>|null} extensions
|
|
42151
42151
|
* @param {{ maxFragments?: number, maxPayloadSize?: number }} [options]
|
|
42152
42152
|
*/
|
|
42153
|
-
constructor(
|
|
42153
|
+
constructor(handler, extensions2, options = {}) {
|
|
42154
42154
|
super();
|
|
42155
|
-
this.#handler =
|
|
42155
|
+
this.#handler = handler;
|
|
42156
42156
|
this.#extensions = extensions2 == null ? /* @__PURE__ */ new Map() : extensions2;
|
|
42157
42157
|
this.#maxFragments = options.maxFragments ?? 0;
|
|
42158
42158
|
this.#maxPayloadSize = options.maxPayloadSize ?? 0;
|
|
@@ -44099,9 +44099,9 @@ var require_undici = __commonJS({
|
|
|
44099
44099
|
headerNameToString: util.headerNameToString
|
|
44100
44100
|
};
|
|
44101
44101
|
function makeDispatcher(fn) {
|
|
44102
|
-
return (url2, opts,
|
|
44102
|
+
return (url2, opts, handler) => {
|
|
44103
44103
|
if (typeof opts === "function") {
|
|
44104
|
-
|
|
44104
|
+
handler = opts;
|
|
44105
44105
|
opts = null;
|
|
44106
44106
|
}
|
|
44107
44107
|
if (!url2 || typeof url2 !== "string" && typeof url2 !== "object" && !(url2 instanceof URL)) {
|
|
@@ -44134,7 +44134,7 @@ var require_undici = __commonJS({
|
|
|
44134
44134
|
origin: url2.origin,
|
|
44135
44135
|
path: url2.search ? `${url2.pathname}${url2.search}` : url2.pathname,
|
|
44136
44136
|
method: opts.method || (opts.body ? "PUT" : "GET")
|
|
44137
|
-
},
|
|
44137
|
+
}, handler);
|
|
44138
44138
|
};
|
|
44139
44139
|
}
|
|
44140
44140
|
__name(makeDispatcher, "makeDispatcher");
|
|
@@ -49407,7 +49407,9 @@ var require_functions = __commonJS({
|
|
|
49407
49407
|
// virtual-entry.js
|
|
49408
49408
|
var virtual_entry_exports = {};
|
|
49409
49409
|
__export(virtual_entry_exports, {
|
|
49410
|
+
GET: () => GET,
|
|
49410
49411
|
HEAD: () => HEAD,
|
|
49412
|
+
OPTIONS: () => OPTIONS,
|
|
49411
49413
|
POST: () => POST
|
|
49412
49414
|
});
|
|
49413
49415
|
module.exports = __toCommonJS(virtual_entry_exports);
|
|
@@ -49496,6 +49498,52 @@ function parseDurationToDate(param) {
|
|
|
49496
49498
|
}
|
|
49497
49499
|
__name(parseDurationToDate, "parseDurationToDate");
|
|
49498
49500
|
|
|
49501
|
+
// ../utils/dist/workflow-routes.js
|
|
49502
|
+
var WORKFLOW_ROUTE_BASE = "/.well-known/workflow/v1";
|
|
49503
|
+
var BASE_PATH_SYMBOL = /* @__PURE__ */ Symbol.for("@workflow/core/basePath");
|
|
49504
|
+
var globalConfig = globalThis;
|
|
49505
|
+
function setWorkflowBasePath(basePath) {
|
|
49506
|
+
globalConfig[BASE_PATH_SYMBOL] = basePath ?? "";
|
|
49507
|
+
}
|
|
49508
|
+
__name(setWorkflowBasePath, "setWorkflowBasePath");
|
|
49509
|
+
function getWorkflowBasePath() {
|
|
49510
|
+
return globalConfig[BASE_PATH_SYMBOL] ?? "";
|
|
49511
|
+
}
|
|
49512
|
+
__name(getWorkflowBasePath, "getWorkflowBasePath");
|
|
49513
|
+
function createWorkflowBaseUrl(origin) {
|
|
49514
|
+
new URL(origin);
|
|
49515
|
+
return `${origin.replace(/[?#].*$/, "").replace(/\/+$/, "")}${getWorkflowBasePath()}`;
|
|
49516
|
+
}
|
|
49517
|
+
__name(createWorkflowBaseUrl, "createWorkflowBaseUrl");
|
|
49518
|
+
function createWorkflowUrl(baseUrl, route) {
|
|
49519
|
+
const url2 = new URL(baseUrl);
|
|
49520
|
+
url2.pathname = `${url2.pathname.replace(/\/+$/, "")}${WORKFLOW_ROUTE_BASE}/${getWorkflowRouteEndpoint(route)}`;
|
|
49521
|
+
url2.search = route.type === "health" ? "__health" : "";
|
|
49522
|
+
url2.hash = "";
|
|
49523
|
+
return url2.toString();
|
|
49524
|
+
}
|
|
49525
|
+
__name(createWorkflowUrl, "createWorkflowUrl");
|
|
49526
|
+
function getWorkflowRouteEndpoint(route) {
|
|
49527
|
+
switch (route.type) {
|
|
49528
|
+
case "flow":
|
|
49529
|
+
case "health":
|
|
49530
|
+
return "flow";
|
|
49531
|
+
case "step":
|
|
49532
|
+
return "step";
|
|
49533
|
+
case "manifest":
|
|
49534
|
+
return "manifest.json";
|
|
49535
|
+
case "webhook":
|
|
49536
|
+
return `webhook/${encodeURIComponent(route.token)}`;
|
|
49537
|
+
}
|
|
49538
|
+
const exhaustive = route;
|
|
49539
|
+
return exhaustive;
|
|
49540
|
+
}
|
|
49541
|
+
__name(getWorkflowRouteEndpoint, "getWorkflowRouteEndpoint");
|
|
49542
|
+
function createWorkflowHealthEndpoint() {
|
|
49543
|
+
return `${getWorkflowBasePath()}${WORKFLOW_ROUTE_BASE}/flow?__health`;
|
|
49544
|
+
}
|
|
49545
|
+
__name(createWorkflowHealthEndpoint, "createWorkflowHealthEndpoint");
|
|
49546
|
+
|
|
49499
49547
|
// ../utils/dist/world-target.js
|
|
49500
49548
|
function resolveWorkflowTargetWorld(env = process.env) {
|
|
49501
49549
|
const configuredWorld = env.WORKFLOW_TARGET_WORLD;
|
|
@@ -50342,7 +50390,7 @@ init_dist();
|
|
|
50342
50390
|
init_node();
|
|
50343
50391
|
|
|
50344
50392
|
// ../core/dist/version.js
|
|
50345
|
-
var version2 = "4.6.
|
|
50393
|
+
var version2 = "4.6.2";
|
|
50346
50394
|
|
|
50347
50395
|
// ../core/dist/runtime/world.js
|
|
50348
50396
|
var import_node_module = require("node:module");
|
|
@@ -50552,7 +50600,7 @@ async function getPort() {
|
|
|
50552
50600
|
}
|
|
50553
50601
|
__name(getPort, "getPort");
|
|
50554
50602
|
var PROBE_TIMEOUT_MS = 500;
|
|
50555
|
-
var PROBE_ENDPOINT =
|
|
50603
|
+
var PROBE_ENDPOINT = `${WORKFLOW_ROUTE_BASE}/flow?__health`;
|
|
50556
50604
|
async function probePort(port, options = {}) {
|
|
50557
50605
|
const { endpoint = PROBE_ENDPOINT, timeout = PROBE_TIMEOUT_MS } = options;
|
|
50558
50606
|
const controller = new AbortController();
|
|
@@ -50619,6 +50667,10 @@ var config2 = once2(() => {
|
|
|
50619
50667
|
const baseUrl = getBaseUrlFromEnv();
|
|
50620
50668
|
return { dataDir, baseUrl };
|
|
50621
50669
|
});
|
|
50670
|
+
function resolveDirectBaseUrl(config3) {
|
|
50671
|
+
return config3.baseUrl ?? process.env.WORKFLOW_LOCAL_BASE_URL ?? createWorkflowBaseUrl("http://localhost");
|
|
50672
|
+
}
|
|
50673
|
+
__name(resolveDirectBaseUrl, "resolveDirectBaseUrl");
|
|
50622
50674
|
async function resolveBaseUrl(config3) {
|
|
50623
50675
|
if (config3.baseUrl) {
|
|
50624
50676
|
return config3.baseUrl;
|
|
@@ -50627,14 +50679,16 @@ async function resolveBaseUrl(config3) {
|
|
|
50627
50679
|
return process.env.WORKFLOW_LOCAL_BASE_URL;
|
|
50628
50680
|
}
|
|
50629
50681
|
if (typeof config3.port === "number") {
|
|
50630
|
-
return `http://localhost:${config3.port}
|
|
50682
|
+
return createWorkflowBaseUrl(`http://localhost:${config3.port}`);
|
|
50631
50683
|
}
|
|
50632
50684
|
if (process.env.PORT) {
|
|
50633
|
-
return `http://localhost:${process.env.PORT}
|
|
50685
|
+
return createWorkflowBaseUrl(`http://localhost:${process.env.PORT}`);
|
|
50634
50686
|
}
|
|
50635
|
-
const detectedPort = await getWorkflowPort(
|
|
50687
|
+
const detectedPort = await getWorkflowPort({
|
|
50688
|
+
endpoint: createWorkflowHealthEndpoint()
|
|
50689
|
+
});
|
|
50636
50690
|
if (detectedPort) {
|
|
50637
|
-
return `http://localhost:${detectedPort}
|
|
50691
|
+
return createWorkflowBaseUrl(`http://localhost:${detectedPort}`);
|
|
50638
50692
|
}
|
|
50639
50693
|
throw new Error("Unable to resolve base URL for workflow queue.");
|
|
50640
50694
|
}
|
|
@@ -51466,7 +51520,9 @@ function createQueue(config3) {
|
|
|
51466
51520
|
const directHandler = directHandlers.get(prefix);
|
|
51467
51521
|
let response;
|
|
51468
51522
|
if (directHandler) {
|
|
51469
|
-
const req = new Request(
|
|
51523
|
+
const req = new Request(createWorkflowUrl(resolveDirectBaseUrl(config3), {
|
|
51524
|
+
type: pathname
|
|
51525
|
+
}), {
|
|
51470
51526
|
method: "POST",
|
|
51471
51527
|
headers,
|
|
51472
51528
|
body
|
|
@@ -51474,7 +51530,7 @@ function createQueue(config3) {
|
|
|
51474
51530
|
response = await directHandler(req);
|
|
51475
51531
|
} else {
|
|
51476
51532
|
const baseUrl = await resolveBaseUrl(config3);
|
|
51477
|
-
response = await fetch(
|
|
51533
|
+
response = await fetch(createWorkflowUrl(baseUrl, { type: pathname }), {
|
|
51478
51534
|
method: "POST",
|
|
51479
51535
|
duplex: "half",
|
|
51480
51536
|
dispatcher: httpAgent,
|
|
@@ -51542,7 +51598,7 @@ function createQueue(config3) {
|
|
|
51542
51598
|
"x-vqs-message-id": MessageId,
|
|
51543
51599
|
"x-vqs-message-attempt": external_exports.coerce.number()
|
|
51544
51600
|
});
|
|
51545
|
-
const createQueueHandler2 = /* @__PURE__ */ __name((prefix,
|
|
51601
|
+
const createQueueHandler2 = /* @__PURE__ */ __name((prefix, handler) => {
|
|
51546
51602
|
return async (req) => {
|
|
51547
51603
|
const headers = HeaderParser.safeParse(Object.fromEntries(req.headers));
|
|
51548
51604
|
if (!headers.success || !req.body) {
|
|
@@ -51558,7 +51614,7 @@ function createQueue(config3) {
|
|
|
51558
51614
|
}
|
|
51559
51615
|
const body = await new TypedJsonTransport().deserialize(req.body);
|
|
51560
51616
|
try {
|
|
51561
|
-
const result = await
|
|
51617
|
+
const result = await handler(body, { attempt, queueName, messageId });
|
|
51562
51618
|
let timeoutSeconds = null;
|
|
51563
51619
|
if (typeof result?.timeoutSeconds === "number") {
|
|
51564
51620
|
timeoutSeconds = Math.min(result.timeoutSeconds, LOCAL_QUEUE_MAX_VISIBILITY);
|
|
@@ -51580,8 +51636,8 @@ function createQueue(config3) {
|
|
|
51580
51636
|
queue,
|
|
51581
51637
|
createQueueHandler: createQueueHandler2,
|
|
51582
51638
|
getDeploymentId,
|
|
51583
|
-
registerHandler(prefix,
|
|
51584
|
-
directHandlers.set(prefix,
|
|
51639
|
+
registerHandler(prefix, handler) {
|
|
51640
|
+
directHandlers.set(prefix, handler);
|
|
51585
51641
|
},
|
|
51586
51642
|
async close() {
|
|
51587
51643
|
await httpAgent.close();
|
|
@@ -56270,7 +56326,7 @@ var ConsumerGroup = class {
|
|
|
56270
56326
|
}
|
|
56271
56327
|
}
|
|
56272
56328
|
}
|
|
56273
|
-
async processMessage(message,
|
|
56329
|
+
async processMessage(message, handler, options) {
|
|
56274
56330
|
const stopExtension = this.startVisibilityExtension(
|
|
56275
56331
|
message.receiptHandle,
|
|
56276
56332
|
options
|
|
@@ -56286,7 +56342,7 @@ var ConsumerGroup = class {
|
|
|
56286
56342
|
region: this.client.getRegion()
|
|
56287
56343
|
};
|
|
56288
56344
|
try {
|
|
56289
|
-
await
|
|
56345
|
+
await handler(message.payload, metadata);
|
|
56290
56346
|
await stopExtension();
|
|
56291
56347
|
await this.client.acknowledgeMessage({
|
|
56292
56348
|
queueName: this.topicName,
|
|
@@ -56360,10 +56416,10 @@ var ConsumerGroup = class {
|
|
|
56360
56416
|
* visibility timeout expires (from `ce-vqsvisibilitydeadline`). Used to
|
|
56361
56417
|
* schedule the first visibility extension before the lease expires.
|
|
56362
56418
|
*/
|
|
56363
|
-
async consumeMessage(
|
|
56364
|
-
await this.processMessage(message,
|
|
56419
|
+
async consumeMessage(handler, message, options) {
|
|
56420
|
+
await this.processMessage(message, handler, options);
|
|
56365
56421
|
}
|
|
56366
|
-
async consume(
|
|
56422
|
+
async consume(handler, options) {
|
|
56367
56423
|
const retry = options?.retry;
|
|
56368
56424
|
if (options && "messageId" in options) {
|
|
56369
56425
|
const response = await this.client.receiveMessageById({
|
|
@@ -56372,7 +56428,7 @@ var ConsumerGroup = class {
|
|
|
56372
56428
|
messageId: options.messageId,
|
|
56373
56429
|
visibilityTimeoutSeconds: this.visibilityTimeout
|
|
56374
56430
|
});
|
|
56375
|
-
await this.processMessage(response.message,
|
|
56431
|
+
await this.processMessage(response.message, handler, { retry });
|
|
56376
56432
|
return 1;
|
|
56377
56433
|
} else {
|
|
56378
56434
|
const limit = options && "limit" in options ? options.limit : 1;
|
|
@@ -56384,7 +56440,7 @@ var ConsumerGroup = class {
|
|
|
56384
56440
|
limit
|
|
56385
56441
|
})) {
|
|
56386
56442
|
messagesProcessed++;
|
|
56387
|
-
await this.processMessage(message,
|
|
56443
|
+
await this.processMessage(message, handler, { retry });
|
|
56388
56444
|
}
|
|
56389
56445
|
return messagesProcessed;
|
|
56390
56446
|
}
|
|
@@ -56612,7 +56668,7 @@ async function parseCallback(request2) {
|
|
|
56612
56668
|
return parseRawCallback(body, headers);
|
|
56613
56669
|
}
|
|
56614
56670
|
__name(parseCallback, "parseCallback");
|
|
56615
|
-
async function handleCallback(
|
|
56671
|
+
async function handleCallback(handler, request2, options) {
|
|
56616
56672
|
const { queueName, consumerGroup, messageId } = request2;
|
|
56617
56673
|
if (!options?.client) {
|
|
56618
56674
|
throw new Error("HandleCallbackOptions.client is required");
|
|
@@ -56648,12 +56704,12 @@ async function handleCallback(handler2, request2, options) {
|
|
|
56648
56704
|
receiptHandle: request2.receiptHandle
|
|
56649
56705
|
};
|
|
56650
56706
|
const visibilityDeadline = request2.visibilityDeadline ? new Date(request2.visibilityDeadline) : void 0;
|
|
56651
|
-
await cg.consumeMessage(
|
|
56707
|
+
await cg.consumeMessage(handler, message, {
|
|
56652
56708
|
visibilityDeadline,
|
|
56653
56709
|
retry: options?.retry
|
|
56654
56710
|
});
|
|
56655
56711
|
} else {
|
|
56656
|
-
await cg.consume(
|
|
56712
|
+
await cg.consume(handler, { messageId, retry: options?.retry });
|
|
56657
56713
|
}
|
|
56658
56714
|
}
|
|
56659
56715
|
__name(handleCallback, "handleCallback");
|
|
@@ -56839,7 +56895,7 @@ function getHandlerRegistry() {
|
|
|
56839
56895
|
return g[HANDLER_REGISTRY_KEY];
|
|
56840
56896
|
}
|
|
56841
56897
|
__name(getHandlerRegistry, "getHandlerRegistry");
|
|
56842
|
-
function registerHandlerForFile(filePath,
|
|
56898
|
+
function registerHandlerForFile(filePath, handler, client, options) {
|
|
56843
56899
|
const absolutePath = path11.isAbsolute(filePath) ? filePath : path11.resolve(process.cwd(), filePath);
|
|
56844
56900
|
const fileMappings = findMappingsForFile(absolutePath);
|
|
56845
56901
|
if (fileMappings.length === 0) return false;
|
|
@@ -56849,7 +56905,7 @@ function registerHandlerForFile(filePath, handler2, client, options) {
|
|
|
56849
56905
|
const existing = registry2.get(key) ?? [];
|
|
56850
56906
|
const nextEntry = {
|
|
56851
56907
|
consumerGroup: mapping.consumer,
|
|
56852
|
-
handler
|
|
56908
|
+
handler,
|
|
56853
56909
|
client,
|
|
56854
56910
|
options
|
|
56855
56911
|
};
|
|
@@ -56866,7 +56922,7 @@ function registerHandlerForFile(filePath, handler2, client, options) {
|
|
|
56866
56922
|
return true;
|
|
56867
56923
|
}
|
|
56868
56924
|
__name(registerHandlerForFile, "registerHandlerForFile");
|
|
56869
|
-
function registerDevHandler(
|
|
56925
|
+
function registerDevHandler(handler, client, options, _testCallerPath) {
|
|
56870
56926
|
const callerPath = _testCallerPath ?? extractCallerFilePath();
|
|
56871
56927
|
if (!callerPath) {
|
|
56872
56928
|
console.warn(
|
|
@@ -56876,7 +56932,7 @@ function registerDevHandler(handler2, client, options, _testCallerPath) {
|
|
|
56876
56932
|
}
|
|
56877
56933
|
const registered = registerHandlerForFile(
|
|
56878
56934
|
callerPath,
|
|
56879
|
-
|
|
56935
|
+
handler,
|
|
56880
56936
|
client,
|
|
56881
56937
|
options
|
|
56882
56938
|
);
|
|
@@ -57003,12 +57059,12 @@ function isPortListening(port) {
|
|
|
57003
57059
|
});
|
|
57004
57060
|
}
|
|
57005
57061
|
__name(isPortListening, "isPortListening");
|
|
57006
|
-
async function invokeWithRetry(
|
|
57062
|
+
async function invokeWithRetry(handler, request2, options) {
|
|
57007
57063
|
let elapsed = 0;
|
|
57008
57064
|
let delay = DEV_RETRY_INITIAL_DELAY_MS;
|
|
57009
57065
|
while (true) {
|
|
57010
57066
|
try {
|
|
57011
|
-
await handleCallback(
|
|
57067
|
+
await handleCallback(handler, request2, options);
|
|
57012
57068
|
return;
|
|
57013
57069
|
} catch (error48) {
|
|
57014
57070
|
if (isMessageNotFoundError(error48) && elapsed < DEV_RETRY_MAX_WAIT_MS) {
|
|
@@ -58043,9 +58099,9 @@ var QueueClient = class {
|
|
|
58043
58099
|
* reschedule the message for redelivery after N seconds.
|
|
58044
58100
|
* @returns A route handler that accepts either `Request` or `{ request: Request }`
|
|
58045
58101
|
*/
|
|
58046
|
-
handleCallback = /* @__PURE__ */ __name((
|
|
58102
|
+
handleCallback = /* @__PURE__ */ __name((handler, options) => {
|
|
58047
58103
|
if (isDevMode()) {
|
|
58048
|
-
registerDevHandler(
|
|
58104
|
+
registerDevHandler(handler, this, options);
|
|
58049
58105
|
}
|
|
58050
58106
|
return async (requestOrEvent) => {
|
|
58051
58107
|
const request2 = resolveCallbackRequest(requestOrEvent);
|
|
@@ -58053,7 +58109,7 @@ var QueueClient = class {
|
|
|
58053
58109
|
const primeFile = request2.headers.get("x-vercel-queue-prime-file");
|
|
58054
58110
|
if (primeFile) {
|
|
58055
58111
|
registerDevHandler(
|
|
58056
|
-
|
|
58112
|
+
handler,
|
|
58057
58113
|
this,
|
|
58058
58114
|
options,
|
|
58059
58115
|
primeFile
|
|
@@ -58063,7 +58119,7 @@ var QueueClient = class {
|
|
|
58063
58119
|
}
|
|
58064
58120
|
try {
|
|
58065
58121
|
const parsed = await parseCallback(request2);
|
|
58066
|
-
await handleCallback(
|
|
58122
|
+
await handleCallback(handler, parsed, {
|
|
58067
58123
|
client: this,
|
|
58068
58124
|
visibilityTimeoutSeconds: options?.visibilityTimeoutSeconds,
|
|
58069
58125
|
retry: options?.retry
|
|
@@ -58101,9 +58157,9 @@ var QueueClient = class {
|
|
|
58101
58157
|
* reschedule the message for redelivery after N seconds.
|
|
58102
58158
|
* @returns A `(req, res) => Promise<void>` route handler
|
|
58103
58159
|
*/
|
|
58104
|
-
handleNodeCallback = /* @__PURE__ */ __name((
|
|
58160
|
+
handleNodeCallback = /* @__PURE__ */ __name((handler, options) => {
|
|
58105
58161
|
if (isDevMode()) {
|
|
58106
|
-
registerDevHandler(
|
|
58162
|
+
registerDevHandler(handler, this, options);
|
|
58107
58163
|
}
|
|
58108
58164
|
return async (req, res) => {
|
|
58109
58165
|
if (req.method !== "POST") {
|
|
@@ -58116,7 +58172,7 @@ var QueueClient = class {
|
|
|
58116
58172
|
const primeFile = Array.isArray(primeFileHeader) ? primeFileHeader[0] : primeFileHeader;
|
|
58117
58173
|
if (primeFile) {
|
|
58118
58174
|
registerDevHandler(
|
|
58119
|
-
|
|
58175
|
+
handler,
|
|
58120
58176
|
this,
|
|
58121
58177
|
options,
|
|
58122
58178
|
primeFile
|
|
@@ -58127,7 +58183,7 @@ var QueueClient = class {
|
|
|
58127
58183
|
}
|
|
58128
58184
|
try {
|
|
58129
58185
|
const parsed = parseRawCallback(req.body, req.headers);
|
|
58130
|
-
await handleCallback(
|
|
58186
|
+
await handleCallback(handler, parsed, {
|
|
58131
58187
|
client: this,
|
|
58132
58188
|
visibilityTimeoutSeconds: options?.visibilityTimeoutSeconds,
|
|
58133
58189
|
retry: options?.retry
|
|
@@ -60509,7 +60565,7 @@ var import_oidc3 = __toESM(require_dist(), 1);
|
|
|
60509
60565
|
init_dist();
|
|
60510
60566
|
|
|
60511
60567
|
// ../world-vercel/dist/version.js
|
|
60512
|
-
var version3 = "4.5.
|
|
60568
|
+
var version3 = "4.5.1";
|
|
60513
60569
|
|
|
60514
60570
|
// ../world-vercel/dist/utils.js
|
|
60515
60571
|
var HTTP_DEBUG_ENABLED = typeof process !== "undefined" && typeof process.env.DEBUG === "string" && (process.env.DEBUG.includes("workflow:") || process.env.DEBUG === "*");
|
|
@@ -60610,6 +60666,7 @@ function deserializeError(obj) {
|
|
|
60610
60666
|
return obj;
|
|
60611
60667
|
}
|
|
60612
60668
|
__name(deserializeError, "deserializeError");
|
|
60669
|
+
var joinUserAgentProducts = /* @__PURE__ */ __name((...products) => products.filter(Boolean).join(" "), "joinUserAgentProducts");
|
|
60613
60670
|
var getUserAgent = /* @__PURE__ */ __name(() => {
|
|
60614
60671
|
const deploymentId = process.env.VERCEL_DEPLOYMENT_ID;
|
|
60615
60672
|
if (deploymentId) {
|
|
@@ -60629,7 +60686,7 @@ var getHttpUrl = /* @__PURE__ */ __name((config3) => {
|
|
|
60629
60686
|
var getHeaders = /* @__PURE__ */ __name((config3, options) => {
|
|
60630
60687
|
const projectConfig = config3?.projectConfig;
|
|
60631
60688
|
const headers = new Headers(config3?.headers);
|
|
60632
|
-
headers.set("User-Agent", getUserAgent());
|
|
60689
|
+
headers.set("User-Agent", joinUserAgentProducts(getUserAgent(), headers.get("User-Agent")));
|
|
60633
60690
|
if (projectConfig) {
|
|
60634
60691
|
headers.set("x-vercel-environment", projectConfig.environment || "production");
|
|
60635
60692
|
if (projectConfig.projectId) {
|
|
@@ -60670,7 +60727,7 @@ async function getHttpConfig(config3) {
|
|
|
60670
60727
|
return { baseUrl, headers, usingProxy };
|
|
60671
60728
|
}
|
|
60672
60729
|
__name(getHttpConfig, "getHttpConfig");
|
|
60673
|
-
async function makeRequest({ endpoint, options = {}, config: config3 = {}, schema, data, onResponse }) {
|
|
60730
|
+
async function makeRequest({ endpoint, options = {}, config: config3 = {}, schema, data, onResponse, retryConnectTimeout = false }) {
|
|
60674
60731
|
const method = options.method || "GET";
|
|
60675
60732
|
const { baseUrl, headers } = await getHttpConfig(config3);
|
|
60676
60733
|
const url2 = `${baseUrl}${endpoint}`;
|
|
@@ -60699,7 +60756,7 @@ async function makeRequest({ endpoint, options = {}, config: config3 = {}, schem
|
|
|
60699
60756
|
headers.set("Content-Type", "application/cbor");
|
|
60700
60757
|
body = encode3(data);
|
|
60701
60758
|
}
|
|
60702
|
-
const
|
|
60759
|
+
const canRetryRead = IDEMPOTENT_METHODS.has(method.toUpperCase());
|
|
60703
60760
|
let parseResult;
|
|
60704
60761
|
let responseDiagnostics = "";
|
|
60705
60762
|
for (let attempt = 0; ; attempt++) {
|
|
@@ -60728,6 +60785,10 @@ async function makeRequest({ endpoint, options = {}, config: config3 = {}, schem
|
|
|
60728
60785
|
}
|
|
60729
60786
|
const transportCode = getTransientTransportCode(error48);
|
|
60730
60787
|
if (transportCode) {
|
|
60788
|
+
if (retryConnectTimeout && canRetryRead && transportCode === "UND_ERR_CONNECT_TIMEOUT" && attempt === 0) {
|
|
60789
|
+
await new Promise((resolve3) => setTimeout(resolve3, BODY_PARSE_RETRY_BASE_MS));
|
|
60790
|
+
continue;
|
|
60791
|
+
}
|
|
60731
60792
|
const transportError = new WorkflowWorldError(`${method} ${endpoint} transport failure after ${elapsed}ms (${transportCode})`, { url: url2, code: "TRANSPORT", cause: error48 });
|
|
60732
60793
|
span?.setAttributes({ ...ErrorType2("TRANSPORT") });
|
|
60733
60794
|
span?.recordException?.(transportError);
|
|
@@ -60804,7 +60865,7 @@ curl -X ${request2.method} ${stringifiedHeaders} "${url2}"`);
|
|
|
60804
60865
|
});
|
|
60805
60866
|
break;
|
|
60806
60867
|
} catch (error48) {
|
|
60807
|
-
if (
|
|
60868
|
+
if (canRetryRead && attempt < MAX_BODY_PARSE_RETRIES) {
|
|
60808
60869
|
const backoffMs = BODY_PARSE_RETRY_BASE_MS * 2 ** attempt;
|
|
60809
60870
|
span?.setAttributes({
|
|
60810
60871
|
...ErrorType2("PARSE_ERROR_RETRYING")
|
|
@@ -61029,7 +61090,7 @@ function createQueue2(config3) {
|
|
|
61029
61090
|
throw error48;
|
|
61030
61091
|
}
|
|
61031
61092
|
}, "queue");
|
|
61032
|
-
const createQueueHandler2 = /* @__PURE__ */ __name((_prefix,
|
|
61093
|
+
const createQueueHandler2 = /* @__PURE__ */ __name((_prefix, handler) => {
|
|
61033
61094
|
const client = new QueueClient(clientOptions);
|
|
61034
61095
|
const vqsHandler = client.handleCallback(async (message, metadata) => {
|
|
61035
61096
|
if (!message || !metadata) {
|
|
@@ -61037,7 +61098,7 @@ function createQueue2(config3) {
|
|
|
61037
61098
|
}
|
|
61038
61099
|
const requestId = requestIdStorage.getStore();
|
|
61039
61100
|
const { payload, queueName, deploymentId } = MessageWrapper.parse(message);
|
|
61040
|
-
const result = await
|
|
61101
|
+
const result = await handler(payload, {
|
|
61041
61102
|
queueName,
|
|
61042
61103
|
messageId: MessageId.parse(metadata.messageId),
|
|
61043
61104
|
attempt: metadata.deliveryCount,
|
|
@@ -61054,9 +61115,11 @@ function createQueue2(config3) {
|
|
|
61054
61115
|
// with jitter so an outage or poison message cannot hot-loop or
|
|
61055
61116
|
// redrive in lockstep. Workflow handlers are event-sourced and must
|
|
61056
61117
|
// remain idempotent because queue retries can happen close together.
|
|
61057
|
-
retry: /* @__PURE__ */ __name((
|
|
61058
|
-
afterSeconds
|
|
61059
|
-
|
|
61118
|
+
retry: /* @__PURE__ */ __name((error48, { messageId, deliveryCount }) => {
|
|
61119
|
+
const afterSeconds = getHandlerErrorRetryAfterSeconds(deliveryCount);
|
|
61120
|
+
console.error(`[workflow] Queue handler failed for message "${messageId}" on delivery attempt ${deliveryCount}; retrying in ${afterSeconds}s:`, error48);
|
|
61121
|
+
return { afterSeconds };
|
|
61122
|
+
}, "retry")
|
|
61060
61123
|
});
|
|
61061
61124
|
return async (req) => {
|
|
61062
61125
|
const rawId = req.headers.get("x-vercel-id");
|
|
@@ -61524,6 +61587,7 @@ async function getWorkflowRun(id, params, config3) {
|
|
|
61524
61587
|
endpoint,
|
|
61525
61588
|
options: { method: "GET" },
|
|
61526
61589
|
config: config3,
|
|
61590
|
+
retryConnectTimeout: true,
|
|
61527
61591
|
schema: remoteRefBehavior === "lazy" ? WorkflowRunWireWithRefsSchema : WorkflowRunWireSchema
|
|
61528
61592
|
});
|
|
61529
61593
|
return filterRunData2(run2, resolveData);
|
|
@@ -62450,7 +62514,7 @@ var HEALTH_CHECK_CORS_HEADERS = {
|
|
|
62450
62514
|
"Access-Control-Allow-Methods": "POST, OPTIONS, GET, HEAD",
|
|
62451
62515
|
"Access-Control-Allow-Headers": "Content-Type"
|
|
62452
62516
|
};
|
|
62453
|
-
function withHealthCheck(
|
|
62517
|
+
function withHealthCheck(handler, worldSpecVersion2) {
|
|
62454
62518
|
return async (req) => {
|
|
62455
62519
|
const url2 = new URL(req.url);
|
|
62456
62520
|
const isHealthCheck = url2.searchParams.has("__health");
|
|
@@ -62480,7 +62544,7 @@ function withHealthCheck(handler2, worldSpecVersion2) {
|
|
|
62480
62544
|
}
|
|
62481
62545
|
});
|
|
62482
62546
|
}
|
|
62483
|
-
return await
|
|
62547
|
+
return await handler(req);
|
|
62484
62548
|
};
|
|
62485
62549
|
}
|
|
62486
62550
|
__name(withHealthCheck, "withHealthCheck");
|
|
@@ -66713,7 +66777,7 @@ async function runWorkflow(workflowCode2, workflowRun, events, encryptionKey, st
|
|
|
66713
66777
|
throw new Error(`Workflow run "${workflowRun.runId}" has no "startedAt" timestamp (should not happen)`);
|
|
66714
66778
|
}
|
|
66715
66779
|
const isVercel = process.env.VERCEL_URL !== void 0;
|
|
66716
|
-
const
|
|
66780
|
+
const workflowBaseUrl = createWorkflowBaseUrl(isVercel ? `https://${process.env.VERCEL_URL}` : `http://localhost:${await getPortLazy() ?? 3e3}`);
|
|
66717
66781
|
const { context: context2, globalThis: vmGlobalThis, updateTimestamp } = createContext({
|
|
66718
66782
|
seed: `${workflowRun.runId}:${workflowRun.workflowName}:${+startedAt}`,
|
|
66719
66783
|
fixedTimestamp: +startedAt
|
|
@@ -66771,12 +66835,11 @@ async function runWorkflow(workflowCode2, workflowRun, events, encryptionKey, st
|
|
|
66771
66835
|
vmGlobalThis[WORKFLOW_CREATE_HOOK] = createHook;
|
|
66772
66836
|
vmGlobalThis[WORKFLOW_SLEEP] = sleep;
|
|
66773
66837
|
vmGlobalThis[WORKFLOW_GET_STREAM_ID] = (namespace) => getWorkflowRunStreamId(workflowRun.runId, namespace);
|
|
66774
|
-
const url2 = isVercel ? `https://${process.env.VERCEL_URL}` : `http://localhost:${port ?? 3e3}`;
|
|
66775
66838
|
const ctx = {
|
|
66776
66839
|
workflowName: workflowRun.workflowName,
|
|
66777
66840
|
workflowRunId: workflowRun.runId,
|
|
66778
66841
|
workflowStartedAt: new vmGlobalThis.Date(+startedAt),
|
|
66779
|
-
url:
|
|
66842
|
+
url: workflowBaseUrl
|
|
66780
66843
|
};
|
|
66781
66844
|
vmGlobalThis[WORKFLOW_CONTEXT_SYMBOL] = ctx;
|
|
66782
66845
|
vmGlobalThis[STABLE_ULID] = ulid5;
|
|
@@ -67049,12 +67112,12 @@ Learn more: https://useworkflow.dev/err/${ERROR_SLUGS.FETCH_IN_WORKFLOW_FUNCTION
|
|
|
67049
67112
|
static error() {
|
|
67050
67113
|
ENOTSUP();
|
|
67051
67114
|
}
|
|
67052
|
-
static redirect(
|
|
67115
|
+
static redirect(url2, status = 302) {
|
|
67053
67116
|
if (![301, 302, 303, 307, 308].includes(status)) {
|
|
67054
67117
|
throw new RangeError(`Invalid redirect status code: ${status}. Must be one of: 301, 302, 303, 307, 308`);
|
|
67055
67118
|
}
|
|
67056
67119
|
const headers = new vmGlobalThis.Headers();
|
|
67057
|
-
headers.set("Location", String(
|
|
67120
|
+
headers.set("Location", String(url2));
|
|
67058
67121
|
const response = Object.create(Response2.prototype);
|
|
67059
67122
|
response.status = status;
|
|
67060
67123
|
response.statusText = "";
|
|
@@ -67295,7 +67358,7 @@ var stepHandler = createQueueHandler(stepPrefix, async (message_, metadata) => {
|
|
|
67295
67358
|
const world = getWorld();
|
|
67296
67359
|
const isVercel = process.env.VERCEL_URL !== void 0;
|
|
67297
67360
|
const [port, spanKind] = await Promise.all([
|
|
67298
|
-
isVercel ? void 0 :
|
|
67361
|
+
isVercel ? void 0 : getPortLazy(),
|
|
67299
67362
|
getSpanKind("CONSUMER")
|
|
67300
67363
|
]);
|
|
67301
67364
|
return trace2(`STEP ${stepName}`, { kind: spanKind, links: spanLinks }, async (span) => {
|
|
@@ -67546,7 +67609,7 @@ var stepHandler = createQueueHandler(stepPrefix, async (message_, metadata) => {
|
|
|
67546
67609
|
workflowStartedAt: /* @__PURE__ */ new Date(+workflowStartedAt),
|
|
67547
67610
|
// TODO: there should be a getUrl method on the world interface itself. This
|
|
67548
67611
|
// solution only works for vercel + local worlds.
|
|
67549
|
-
url: isVercel ? `https://${process.env.VERCEL_URL}` : `http://localhost:${port ?? 3e3}`
|
|
67612
|
+
url: createWorkflowBaseUrl(isVercel ? `https://${process.env.VERCEL_URL}` : `http://localhost:${port ?? 3e3}`)
|
|
67550
67613
|
},
|
|
67551
67614
|
workflowDeploymentId: process.env.VERCEL_DEPLOYMENT_ID,
|
|
67552
67615
|
ops,
|
|
@@ -67807,10 +67870,11 @@ function hasRecordedTerminalRunEvent(events, runId) {
|
|
|
67807
67870
|
}
|
|
67808
67871
|
__name(hasRecordedTerminalRunEvent, "hasRecordedTerminalRunEvent");
|
|
67809
67872
|
function workflowEntrypoint(workflowCode2, options) {
|
|
67873
|
+
setWorkflowBasePath(options?.basePath);
|
|
67810
67874
|
const namespace = resolveQueueNamespace(options?.namespace);
|
|
67811
67875
|
const workflowPrefix = getQueueTopicPrefix("workflow", namespace);
|
|
67812
67876
|
const { createQueueHandler: createQueueHandler2, specVersion: worldSpecVersion2 } = getWorldHandlers();
|
|
67813
|
-
const
|
|
67877
|
+
const handler = createQueueHandler2(workflowPrefix, async (message_, metadata) => {
|
|
67814
67878
|
const healthCheck2 = parseHealthCheckPayload(message_);
|
|
67815
67879
|
if (healthCheck2) {
|
|
67816
67880
|
await handleHealthCheckMessage(healthCheck2, "workflow", worldSpecVersion2);
|
|
@@ -68274,7 +68338,7 @@ function workflowEntrypoint(workflowCode2, options) {
|
|
|
68274
68338
|
}
|
|
68275
68339
|
});
|
|
68276
68340
|
});
|
|
68277
|
-
return withHealthCheck(
|
|
68341
|
+
return withHealthCheck(handler, worldSpecVersion2);
|
|
68278
68342
|
}
|
|
68279
68343
|
__name(workflowEntrypoint, "workflowEntrypoint");
|
|
68280
68344
|
|
|
@@ -73188,14 +73252,17 @@ retryableAndFatalErrorWorkflow.workflowId = "workflow//./workflows/retriable-and
|
|
|
73188
73252
|
globalThis.__private_workflows.set("workflow//./workflows/retriable-and-fatal//retryableAndFatalErrorWorkflow", retryableAndFatalErrorWorkflow);
|
|
73189
73253
|
var stepThatThrowsRetryableError = globalThis[/* @__PURE__ */ Symbol.for("WORKFLOW_USE_STEP")]("step//./workflows/retriable-and-fatal//stepThatThrowsRetryableError");
|
|
73190
73254
|
var stepThatFails = globalThis[/* @__PURE__ */ Symbol.for("WORKFLOW_USE_STEP")]("step//./workflows/retriable-and-fatal//stepThatFails");
|
|
73191
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJ3b3JrZmxvd3MvYWRkaXRpb24udHMiLCAiLi4vdXRpbHMvc3JjL3RpbWUudHMiLCAiLi4vZXJyb3JzL3NyYy9pbmRleC50cyIsICIuLi9jb3JlL3NyYy9zeW1ib2xzLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L2NyZWF0ZS1ob29rLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L2RlZmluZS1ob29rLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L3dyaXRhYmxlLXN0cmVhbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9jb3JlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3V0aWwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjMuNi9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvZXJyb3JzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3BhcnNlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3JlZ2V4ZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjMuNi9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvY2hlY2tzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL2RvYy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS92ZXJzaW9ucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9zY2hlbWFzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3JlZ2lzdHJpZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjMuNi9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvYXBpLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3RvLWpzb24tc2NoZW1hLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL2pzb24tc2NoZW1hLXByb2Nlc3NvcnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjMuNi9ub2RlX21vZHVsZXMvem9kL3Y0L2NsYXNzaWMvaXNvLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jbGFzc2ljL2Vycm9ycy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9wYXJzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9zY2hlbWFzLmpzIiwgIndvcmtmbG93cy9ob29rcy50cyIsICJ3b3JrZmxvd3Mvbm9vcC50cyIsICJ3b3JrZmxvd3MvbnVsbC1ieXRlLnRzIiwgIndvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEhlbHBlcnMuXG4gKi8gdmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICsgSlNPTi5zdHJpbmdpZnkodmFsKSk7XG59O1xuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCh0eXBlKXtcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgY2FzZSAneXJzJzpcbiAgICAgICAgY2FzZSAneXInOlxuICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIHJldHVybiBuICogeTtcbiAgICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHc7XG4gICAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgIHJldHVybiBuICogZDtcbiAgICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgY2FzZSAnaHJzJzpcbiAgICAgICAgY2FzZSAnaHInOlxuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiBuICogaDtcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIHJldHVybiBuICogbTtcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgIGNhc2UgJ3NlY3MnOlxuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgIHJldHVybiBuICogcztcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICBjYXNlICdtc2Vjcyc6XG4gICAgICAgIGNhc2UgJ21zZWMnOlxuICAgICAgICBjYXNlICdtcyc6XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICAgIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICAgIH1cbiAgICByZXR1cm4gbXMgKyAnbXMnO1xufVxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gICAgfVxuICAgIHJldHVybiBtcyArICcgbXMnO1xufVxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqLyBmdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gICAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9hZGRpdGlvbi50c1wiOntcImFkZGl0aW9uXCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvLy4vd29ya2Zsb3dzL2FkZGl0aW9uLy9hZGRpdGlvblwifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3MvYWRkaXRpb24udHNcIjp7XCJhZGRcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vd29ya2Zsb3dzL2FkZGl0aW9uLy9hZGRcIn19fX0qLztcbnZhciBhZGQgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3dvcmtmbG93cy9hZGRpdGlvbi8vYWRkXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZGl0aW9uKG51bSwgbnVtMikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkZChudW0sIG51bTIpO1xuICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgcmVzdWx0XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmFkZGl0aW9uLndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly8uL3dvcmtmbG93cy9hZGRpdGlvbi8vYWRkaXRpb25cIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvYWRkaXRpb24vL2FkZGl0aW9uXCIsIGFkZGl0aW9uKTtcbiIsICJpbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IG1zIGZyb20gJ21zJztcblxuLyoqXG4gKiBQYXJzZXMgYSBkdXJhdGlvbiBwYXJhbWV0ZXIgKHN0cmluZywgbnVtYmVyLCBvciBEYXRlKSBhbmQgcmV0dXJucyBhIERhdGUgb2JqZWN0XG4gKiByZXByZXNlbnRpbmcgd2hlbiB0aGUgZHVyYXRpb24gc2hvdWxkIGVsYXBzZS5cbiAqXG4gKiAtIEZvciBzdHJpbmdzOiBQYXJzZXMgZHVyYXRpb24gc3RyaW5ncyBsaWtlIFwiMXNcIiwgXCI1bVwiLCBcIjFoXCIsIGV0Yy4gdXNpbmcgdGhlIGBtc2AgbGlicmFyeVxuICogLSBGb3IgbnVtYmVyczogVHJlYXRzIGFzIG1pbGxpc2Vjb25kcyBmcm9tIG5vd1xuICogLSBGb3IgRGF0ZSBvYmplY3RzOiBSZXR1cm5zIHRoZSBkYXRlIGRpcmVjdGx5IChoYW5kbGVzIGJvdGggRGF0ZSBpbnN0YW5jZXMgYW5kIGRhdGUtbGlrZSBvYmplY3RzIGZyb20gZGVzZXJpYWxpemF0aW9uKVxuICpcbiAqIEBwYXJhbSBwYXJhbSAtIFRoZSBkdXJhdGlvbiBwYXJhbWV0ZXIgKFN0cmluZ1ZhbHVlLCBEYXRlLCBvciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzKVxuICogQHJldHVybnMgQSBEYXRlIG9iamVjdCByZXByZXNlbnRpbmcgd2hlbiB0aGUgZHVyYXRpb24gc2hvdWxkIGVsYXBzZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCBvciBjYW5ub3QgYmUgcGFyc2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUR1cmF0aW9uVG9EYXRlKHBhcmFtOiBTdHJpbmdWYWx1ZSB8IERhdGUgfCBudW1iZXIpOiBEYXRlIHtcbiAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gbXMocGFyYW0pO1xuICAgIGlmICh0eXBlb2YgZHVyYXRpb25NcyAhPT0gJ251bWJlcicgfHwgZHVyYXRpb25NcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgZHVyYXRpb246IFwiJHtwYXJhbX1cIi4gRXhwZWN0ZWQgYSB2YWxpZCBkdXJhdGlvbiBzdHJpbmcgbGlrZSBcIjFzXCIsIFwiMW1cIiwgXCIxaFwiLCBldGMuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkgKyBkdXJhdGlvbk1zKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHBhcmFtIDwgMCB8fCAhTnVtYmVyLmlzRmluaXRlKHBhcmFtKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBkdXJhdGlvbjogJHtwYXJhbX0uIEV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgcGFyYW0pO1xuICB9IGVsc2UgaWYgKFxuICAgIHBhcmFtIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIChwYXJhbSAmJlxuICAgICAgdHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIChwYXJhbSBhcyBhbnkpLmdldFRpbWUgPT09ICdmdW5jdGlvbicpXG4gICkge1xuICAgIC8vIEhhbmRsZSBib3RoIERhdGUgaW5zdGFuY2VzIGFuZCBkYXRlLWxpa2Ugb2JqZWN0cyAoZnJvbSBkZXNlcmlhbGl6YXRpb24pXG4gICAgcmV0dXJuIHBhcmFtIGluc3RhbmNlb2YgRGF0ZSA/IHBhcmFtIDogbmV3IERhdGUoKHBhcmFtIGFzIGFueSkuZ2V0VGltZSgpKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBkdXJhdGlvbiBwYXJhbWV0ZXIuIEV4cGVjdGVkIGEgZHVyYXRpb24gc3RyaW5nLCBudW1iZXIgKG1pbGxpc2Vjb25kcyksIG9yIERhdGUgb2JqZWN0LmBcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcGFyc2VEdXJhdGlvblRvRGF0ZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuXG5jb25zdCBCQVNFX1VSTCA9ICdodHRwczovL3VzZXdvcmtmbG93LmRldi9lcnInO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhbiBFcnJvciB3aXRob3V0IHJlbHlpbmcgb24gTm9kZS5qcyB1dGlsaXRpZXMuXG4gKiBUaGlzIGlzIG5lZWRlZCBmb3IgZXJyb3IgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIFZNIGNvbnRleHRzIHdoZXJlXG4gKiBOb2RlLmpzIGltcG9ydHMgYXJlIG5vdCBhdmFpbGFibGUuXG4gKi9cbmZ1bmN0aW9uIGlzRXJyb3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB7IG5hbWU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICduYW1lJyBpbiB2YWx1ZSAmJlxuICAgICdtZXNzYWdlJyBpbiB2YWx1ZVxuICApO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQWxsIHRoZSBzbHVncyBvZiB0aGUgZXJyb3JzIHVzZWQgZm9yIGRvY3VtZW50YXRpb24gbGlua3MuXG4gKi9cbmV4cG9ydCBjb25zdCBFUlJPUl9TTFVHUyA9IHtcbiAgTk9ERV9KU19NT0RVTEVfSU5fV09SS0ZMT1c6ICdub2RlLWpzLW1vZHVsZS1pbi13b3JrZmxvdycsXG4gIFNUQVJUX0lOVkFMSURfV09SS0ZMT1dfRlVOQ1RJT046ICdzdGFydC1pbnZhbGlkLXdvcmtmbG93LWZ1bmN0aW9uJyxcbiAgU0VSSUFMSVpBVElPTl9GQUlMRUQ6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcsXG4gIFdFQkhPT0tfSU5WQUxJRF9SRVNQT05EX1dJVEhfVkFMVUU6ICd3ZWJob29rLWludmFsaWQtcmVzcG9uZC13aXRoLXZhbHVlJyxcbiAgV0VCSE9PS19SRVNQT05TRV9OT1RfU0VOVDogJ3dlYmhvb2stcmVzcG9uc2Utbm90LXNlbnQnLFxuICBGRVRDSF9JTl9XT1JLRkxPV19GVU5DVElPTjogJ2ZldGNoLWluLXdvcmtmbG93JyxcbiAgVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1c6ICd0aW1lb3V0LWluLXdvcmtmbG93JyxcbiAgSE9PS19DT05GTElDVDogJ2hvb2stY29uZmxpY3QnLFxuICBDT1JSVVBURURfRVZFTlRfTE9HOiAnY29ycnVwdGVkLWV2ZW50LWxvZycsXG4gIFJFUExBWV9ESVZFUkdFTkNFOiAncmVwbGF5LWRpdmVyZ2VuY2UnLFxuICBTVEVQX05PVF9SRUdJU1RFUkVEOiAnc3RlcC1ub3QtcmVnaXN0ZXJlZCcsXG4gIFdPUktGTE9XX05PVF9SRUdJU1RFUkVEOiAnd29ya2Zsb3ctbm90LXJlZ2lzdGVyZWQnLFxuICBSVU5USU1FX0RFQ1JZUFRJT05fRkFJTEVEOiAncnVudGltZS1kZWNyeXB0aW9uLWZhaWxlZCcsXG59IGFzIGNvbnN0O1xuXG50eXBlIEVycm9yU2x1ZyA9ICh0eXBlb2YgRVJST1JfU0xVR1MpW2tleW9mIHR5cGVvZiBFUlJPUl9TTFVHU107XG5cbmludGVyZmFjZSBXb3JrZmxvd0Vycm9yT3B0aW9ucyBleHRlbmRzIEVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc2x1ZyBvZiB0aGUgZXJyb3IuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgbGluayB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbi5cbiAgICovXG4gIHNsdWc/OiBFcnJvclNsdWc7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBXb3JrZmxvdy1yZWxhdGVkIGVycm9ycy5cbiAqXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biBieSB0aGUgV29ya2Zsb3cgU0RLIHdoZW4gaW50ZXJuYWwgb3BlcmF0aW9ucyBmYWlsLlxuICogWW91IGNhbiB1c2UgdGhpcyBjbGFzcyB3aXRoIGBpbnN0YW5jZW9mYCB0byBjYXRjaCBhbnkgV29ya2Zsb3cgU0RLIGVycm9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgYXdhaXQgZ2V0UnVuKHJ1bklkKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdXb3JrZmxvdyBTREsgZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY2F1c2U/OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFdvcmtmbG93RXJyb3JPcHRpb25zKSB7XG4gICAgY29uc3QgbXNnRG9jcyA9IG9wdGlvbnM/LnNsdWdcbiAgICAgID8gYCR7bWVzc2FnZX1cXG5cXG5MZWFybiBtb3JlOiAke0JBU0VfVVJMfS8ke29wdGlvbnMuc2x1Z31gXG4gICAgICA6IG1lc3NhZ2U7XG4gICAgc3VwZXIobXNnRG9jcywgeyBjYXVzZTogb3B0aW9ucz8uY2F1c2UgfSk7XG4gICAgdGhpcy5jYXVzZSA9IG9wdGlvbnM/LmNhdXNlO1xuXG4gICAgaWYgKG9wdGlvbnM/LmNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBgJHt0aGlzLnN0YWNrfVxcbkNhdXNlZCBieTogJHtvcHRpb25zLmNhdXNlLnN0YWNrfWA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd0Vycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgd29ybGQgKHN0b3JhZ2UgYmFja2VuZCkgb3BlcmF0aW9uIGZhaWxzIHVuZXhwZWN0ZWRseS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBjYXRjaC1hbGwgZXJyb3IgZm9yIHdvcmxkIGltcGxlbWVudGF0aW9ucy4gU3BlY2lmaWMsXG4gKiB3ZWxsLWtub3duIGZhaWx1cmUgbW9kZXMgaGF2ZSBkZWRpY2F0ZWQgZXJyb3IgdHlwZXMgKGUuZy5cbiAqIEVudGl0eUNvbmZsaWN0RXJyb3IsIFJ1bkV4cGlyZWRFcnJvciwgVGhyb3R0bGVFcnJvcikuIFRoaXMgZXJyb3JcbiAqIGNvdmVycyBldmVyeXRoaW5nIGVsc2Ug4oCUIHZhbGlkYXRpb24gZmFpbHVyZXMsIG1pc3NpbmcgZW50aXRpZXNcbiAqIHdpdGhvdXQgYSBkZWRpY2F0ZWQgdHlwZSwgb3IgdW5leHBlY3RlZCBIVFRQIGVycm9ycyBmcm9tIHdvcmxkLXZlcmNlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93V29ybGRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBzdGF0dXM/OiBudW1iZXI7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgLyoqIFJldHJ5LUFmdGVyIHZhbHVlIGluIHNlY29uZHMsIHByZXNlbnQgb24gNDI5IGFuZCA0MjUgcmVzcG9uc2VzICovXG4gIHJldHJ5QWZ0ZXI/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBzdGF0dXM/OiBudW1iZXI7XG4gICAgICB1cmw/OiBzdHJpbmc7XG4gICAgICBjb2RlPzogc3RyaW5nO1xuICAgICAgcmV0cnlBZnRlcj86IG51bWJlcjtcbiAgICAgIGNhdXNlPzogdW5rbm93bjtcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIHtcbiAgICAgIGNhdXNlOiBvcHRpb25zPy5jYXVzZSxcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dXb3JsZEVycm9yJztcbiAgICB0aGlzLnN0YXR1cyA9IG9wdGlvbnM/LnN0YXR1cztcbiAgICB0aGlzLmNvZGUgPSBvcHRpb25zPy5jb2RlO1xuICAgIHRoaXMudXJsID0gb3B0aW9ucz8udXJsO1xuICAgIHRoaXMucmV0cnlBZnRlciA9IG9wdGlvbnM/LnJldHJ5QWZ0ZXI7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dXb3JsZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgd29ya2Zsb3cgcnVuIGZhaWxzIGR1cmluZyBleGVjdXRpb24uXG4gKlxuICogVGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCB0aGUgd29ya2Zsb3cgZW5jb3VudGVyZWQgYSBmYXRhbCBlcnJvciBhbmQgY2Fubm90XG4gKiBjb250aW51ZS4gSXQgaXMgdGhyb3duIHdoZW4gYXdhaXRpbmcgYHJ1bi5yZXR1cm5WYWx1ZWAgb24gYSBydW4gd2hvc2Ugc3RhdHVzXG4gKiBpcyBgJ2ZhaWxlZCdgLiBUaGUgYGNhdXNlYCBwcm9wZXJ0eSBjb250YWlucyB0aGUgdW5kZXJseWluZyBlcnJvciB3aXRoIGl0c1xuICogbWVzc2FnZSwgc3RhY2sgdHJhY2UsIGFuZCBvcHRpb25hbCBlcnJvciBjb2RlLlxuICpcbiAqIFVzZSB0aGUgc3RhdGljIGBXb3JrZmxvd1J1bkZhaWxlZEVycm9yLmlzKClgIG1ldGhvZCBmb3IgdHlwZS1zYWZlIGNoZWNraW5nXG4gKiBpbiBjYXRjaCBibG9ja3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBXb3JrZmxvd1J1bkZhaWxlZEVycm9yIH0gZnJvbSBcIndvcmtmbG93L2ludGVybmFsL2Vycm9yc1wiO1xuICpcbiAqIHRyeSB7XG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bi5yZXR1cm5WYWx1ZTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChXb3JrZmxvd1J1bkZhaWxlZEVycm9yLmlzKGVycm9yKSkge1xuICogICAgIGNvbnNvbGUuZXJyb3IoYFJ1biAke2Vycm9yLnJ1bklkfSBmYWlsZWQ6YCwgZXJyb3IuY2F1c2UubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5GYWlsZWRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBydW5JZDogc3RyaW5nO1xuICBkZWNsYXJlIGNhdXNlOiBFcnJvciAmIHsgY29kZT86IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIGVycm9yOiBTdHJ1Y3R1cmVkRXJyb3IpIHtcbiAgICAvLyBDcmVhdGUgYSBwcm9wZXIgRXJyb3IgaW5zdGFuY2UgZnJvbSB0aGUgU3RydWN0dXJlZEVycm9yIHRvIHNldCBhcyBjYXVzZVxuICAgIC8vIE5PVEU6IGN1c3RvbSBlcnJvciB0eXBlcyBkbyBub3QgZ2V0IHNlcmlhbGl6ZWQvZGVzZXJpYWxpemVkLiBFdmVyeXRoaW5nIGlzIGFuIEVycm9yXG4gICAgY29uc3QgY2F1c2VFcnJvciA9IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICAgIGNhdXNlRXJyb3Iuc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgICB9XG4gICAgaWYgKGVycm9yLmNvZGUpIHtcbiAgICAgIChjYXVzZUVycm9yIGFzIGFueSkuY29kZSA9IGVycm9yLmNvZGU7XG4gICAgfVxuXG4gICAgc3VwZXIoYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCwge1xuICAgICAgY2F1c2U6IGNhdXNlRXJyb3IsXG4gICAgfSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93UnVuRmFpbGVkRXJyb3InO1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVuRmFpbGVkRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5GYWlsZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGdldCByZXN1bHRzIGZyb20gYW4gaW5jb21wbGV0ZSB3b3JrZmxvdyBydW4uXG4gKlxuICogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB5b3UgdHJ5IHRvIGFjY2VzcyB0aGUgcmVzdWx0IG9mIGEgd29ya2Zsb3dcbiAqIHRoYXQgaXMgc3RpbGwgcnVubmluZyBvciBoYXNuJ3QgY29tcGxldGVkIHlldC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgc3RhdHVzOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBoYXMgbm90IGNvbXBsZXRlZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvcic7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBXb3JrZmxvdyBydW50aW1lIGVuY291bnRlcnMgYW4gaW50ZXJuYWwgZXJyb3IuXG4gKlxuICogVGhpcyBlcnJvciBpbmRpY2F0ZXMgYW4gaXNzdWUgd2l0aCB3b3JrZmxvdyBleGVjdXRpb24sIHN1Y2ggYXNcbiAqIHNlcmlhbGl6YXRpb24gZmFpbHVyZXMsIHN0YXJ0aW5nIGFuIGludmFsaWQgd29ya2Zsb3cgZnVuY3Rpb24sIG9yXG4gKiBvdGhlciBydW50aW1lIHByb2JsZW1zLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW50aW1lRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogV29ya2Zsb3dFcnJvck9wdGlvbnMpIHtcbiAgICBzdXBlcihtZXNzYWdlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd1J1bnRpbWVFcnJvcic7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bnRpbWVFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bnRpbWVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcGVyc2lzdGVkIHdvcmtmbG93IGV2ZW50IGxvZyBjYW5ub3QgYmUgcmVwbGF5ZWQgYmVjYXVzZSBpdFxuICogY29udGFpbnMgb3JwaGFuZWQsIGR1cGxpY2F0ZSwgb3IgbWlzbWF0Y2hlZCBldmVudHMuXG4gKlxuICogVGhpcyBpcyBhIHJ1bnRpbWUvaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZSByYXRoZXIgdGhhbiB1c2VyIGNvZGUgdGhyb3dpbmcuXG4gKiBXaGVuIHRoaXMgcmVhY2hlcyBydW4gZmFpbHVyZSBoYW5kbGluZywgaXQgaXMgcmVjb3JkZWQgd2l0aCB0aGUgZGlzdGluY3RcbiAqIGBDT1JSVVBURURfRVZFTlRfTE9HYCBjb2RlIHNvIHdvcmxkcyBhbmQgYmFja2VuZHMgY2FuIHRyYWNrIGl0IHNlcGFyYXRlbHlcbiAqIGZyb20gZ2VuZXJpYyBydW50aW1lIGZhaWx1cmVzLlxuICovXG5leHBvcnQgY2xhc3MgQ29ycnVwdGVkRXZlbnRMb2dFcnJvciBleHRlbmRzIFdvcmtmbG93UnVudGltZUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgc3VwZXIobWVzc2FnZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLkNPUlJVUFRFRF9FVkVOVF9MT0csXG4gICAgfSk7XG4gICAgdGhpcy5uYW1lID0gJ0NvcnJ1cHRlZEV2ZW50TG9nRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29ycnVwdGVkRXZlbnRMb2dFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdDb3JydXB0ZWRFdmVudExvZ0Vycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbmFsIHN0cnVjdHVyZWQgY29udGV4dCBhdHRhY2hlZCB0byBhIHtAbGluayBSdW50aW1lRGVjcnlwdGlvbkVycm9yfSxcbiAqIGNhcnJpZWQgb3ZlciBmcm9tIHRoZSB1bmRlcmx5aW5nIGRlY3J5cHQgY2FsbCBzaXRlIHRvIGhlbHAgZGlhZ25vc2UgdGhlXG4gKiBmYWlsdXJlIHdpdGhvdXQgcG9raW5nIHRocm91Z2ggc3RhY2tzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JDb250ZXh0IHtcbiAgLyoqIFRoZSBvcGVyYXRpb24gdGhhdCBmYWlsZWQg4oCUIHVzZWZ1bCB0byB0ZWxsIGVuY3J5cHQgdnMgZGVjcnlwdCBhcGFydC4gKi9cbiAgb3BlcmF0aW9uPzogJ2VuY3J5cHQnIHwgJ2RlY3J5cHQnO1xuICAvKiogQnl0ZSBsZW5ndGggb2YgdGhlIGlucHV0IHBheWxvYWQgYXQgdGhlIHRpbWUgb2YgdGhlIGZhaWx1cmUuICovXG4gIGJ5dGVMZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgaW5wdXQgcGF5bG9hZCwgZGVjb2RlZCBhcyBVVEYtOCBpZiBwcmludGFibGUuXG4gICAqIFVzZWZ1bCBmb3IgdGVsbGluZyBhcGFydCB0cnVuY2F0ZWQtYnV0LXZhbGlkLWxvb2tpbmcgZW5jcnlwdGVkIHBheWxvYWRzXG4gICAqIGZyb20gY29tcGxldGVseSB1bnJlbGF0ZWQgY29ycnVwdGlvbiAoZS5nLiBhbiBIVE1MIGVycm9yIHBhZ2Ugc3VyZmFjZWRcbiAgICogYXMgYSAyMDAgT0spLlxuICAgKi9cbiAgZm9ybWF0UHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBTREsncyBidWlsdC1pbiBBRVMtR0NNIGVuY3J5cHRpb24gbGF5ZXIgZmFpbHMgdG8gZW5jcnlwdFxuICogb3IgZGVjcnlwdCBhIHdvcmtmbG93IHBheWxvYWQuXG4gKlxuICogVGhpcyBpcyBhbiBpbnRlcm5hbCBTREsgZmFpbHVyZSDigJQgdXNlciBjb2RlIG5ldmVyIGludm9rZXMgdGhlIFNESydzXG4gKiBlbmNyeXB0aW9uIHByaW1pdGl2ZXMgZGlyZWN0bHkuIENvbW1vbiBjYXVzZXM6XG4gKlxuICogLSBBIGNpcGhlcnRleHQgLyBhdXRoIHRhZyBtaXNtYXRjaCwgdHlwaWNhbGx5IHN1cmZhY2VkIGFzIHRoZSBuYXRpdmUgV2ViXG4gKiAgIENyeXB0byBgT3BlcmF0aW9uRXJyb3I6IFRoZSBvcGVyYXRpb24gZmFpbGVkIGZvciBhbiBvcGVyYXRpb24tc3BlY2lmaWNcbiAqICAgcmVhc29uYC4gVXN1YWxseSBjYXVzZWQgYnkgY2lwaGVydGV4dCBtdXRhdGlvbiBvciB0cnVuY2F0aW9uIGluIHRyYW5zaXRcbiAqICAgYmV0d2VlbiBzdG9yYWdlIGFuZCByZWFkICh0cnVuY2F0ZWQgSFRUUCByZXNwb25zZSwgZWRnZS1jYWNoZSBtaXNzXG4gKiAgIHJldHVybmluZyBhIHBhcnRpYWwgMjAwLCBwcm94eSBkcm9wIGR1cmluZyBzdHJlYW1pbmcsIGV0Yy4pLlxuICogLSBBIGtleSByZXNvbHV0aW9uIG1pc21hdGNoICh3cm9uZyBkZXBsb3ltZW50LCBtaXNzaW5nIGtleSBtYXRlcmlhbCkuXG4gKiAtIEEgbWFsZm9ybWVkIGVuY3J5cHRlZCBlbnZlbG9wZSAodG9vIHNob3J0IHRvIGNvbnRhaW4gdGhlIEdDTSBub25jZVxuICogICBhbmQgdGFnKS5cbiAqXG4gKiBFeHRlbmRzIHtAbGluayBXb3JrZmxvd1J1bnRpbWVFcnJvcn0gc28gdGhlIHJ1bi1mYWlsdXJlIGNsYXNzaWZpZXJcbiAqIHJvdXRlcyBpdCB0byBgUlVOVElNRV9FUlJPUmAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRGVjcnlwdGlvbkVycm9yIGV4dGVuZHMgV29ya2Zsb3dSdW50aW1lRXJyb3Ige1xuICAvKiogT3B0aW9uYWwgc3RydWN0dXJlZCBjb250ZXh0IGFib3V0IHRoZSBmYWlsZWQgZW5jcnlwdC9kZWNyeXB0IGNhbGwuICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgY29udGV4dD86IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBvcHRpb25zPzogRXJyb3JPcHRpb25zICYgeyBjb250ZXh0PzogUnVudGltZURlY3J5cHRpb25FcnJvckNvbnRleHQgfVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCB7XG4gICAgICBjYXVzZTogb3B0aW9ucz8uY2F1c2UsXG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5SVU5USU1FX0RFQ1JZUFRJT05fRkFJTEVELFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICBpZiAob3B0aW9ucz8uY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVudGltZURlY3J5cHRpb25FcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBjdXJyZW50IHdvcmtmbG93IHJlcGxheSBjYW5ub3QgZm9sbG93IHRoZSBwYXRoIGRlc2NyaWJlZCBieVxuICogdGhlIHJlY29yZGVkIGV2ZW50IGxvZy4gQSBzaW5nbGUgZGl2ZXJnZW5jZSBkb2VzIG5vdCBwcm92ZSB0aGF0IHRoZVxuICogcGVyc2lzdGVkIGhpc3RvcnkgaXMgaW52YWxpZDogYSBzdWJzZXF1ZW50IHJlcGxheSBtYXkgb2JzZXJ2ZSBvciBzY2hlZHVsZVxuICogd29yayBjb3JyZWN0bHksIHNvIHRoZSBydW50aW1lIG1heSByZWRlbGl2ZXIgYmVmb3JlIGRlY2xhcmluZyBjb3JydXB0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUmVwbGF5RGl2ZXJnZW5jZUVycm9yIGV4dGVuZHMgV29ya2Zsb3dSdW50aW1lRXJyb3Ige1xuICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zOiBFcnJvck9wdGlvbnMgJiB7IGV2ZW50SWQ6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIobWVzc2FnZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlJFUExBWV9ESVZFUkdFTkNFLFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdSZXBsYXlEaXZlcmdlbmNlRXJyb3InO1xuICAgIHRoaXMuZXZlbnRJZCA9IG9wdGlvbnMuZXZlbnRJZDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlcGxheURpdmVyZ2VuY2VFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSZXBsYXlEaXZlcmdlbmNlRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzdGVwIGZ1bmN0aW9uIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXG4gKlxuICogVGhpcyBpcyBhbiBpbmZyYXN0cnVjdHVyZSBlcnJvciDigJQgbm90IGEgdXNlciBjb2RlIGVycm9yLiBJdCB0eXBpY2FsbHkgbWVhbnNcbiAqIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIGJ1bmRsaW5nL2J1aWxkIHRvb2xpbmcgdGhhdCBjYXVzZWQgdGhlIHN0ZXBcbiAqIHRvIG5vdCBnZXQgYnVpbHQgY29ycmVjdGx5LlxuICpcbiAqIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgc3RlcCBmYWlscyAobGlrZSBhIEZhdGFsRXJyb3IpIGFuZCBjb250cm9sIGlzIHBhc3NlZCBiYWNrXG4gKiB0byB0aGUgd29ya2Zsb3cgZnVuY3Rpb24sIHdoaWNoIGNhbiBvcHRpb25hbGx5IGhhbmRsZSB0aGUgZmFpbHVyZSBncmFjZWZ1bGx5LlxuICovXG5leHBvcnQgY2xhc3MgU3RlcE5vdFJlZ2lzdGVyZWRFcnJvciBleHRlbmRzIFdvcmtmbG93UnVudGltZUVycm9yIHtcbiAgc3RlcE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzdGVwTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGN1cnJlbnQgZGVwbG95bWVudC4gVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIGJ1aWxkIG9yIGJ1bmRsaW5nIGlzc3VlIHRoYXQgY2F1c2VkIHRoZSBzdGVwIHRvIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgZGVwbG95bWVudC5gLFxuICAgICAgeyBzbHVnOiBFUlJPUl9TTFVHUy5TVEVQX05PVF9SRUdJU1RFUkVEIH1cbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdTdGVwTm90UmVnaXN0ZXJlZEVycm9yJztcbiAgICB0aGlzLnN0ZXBOYW1lID0gc3RlcE5hbWU7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdGVwTm90UmVnaXN0ZXJlZEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1N0ZXBOb3RSZWdpc3RlcmVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSB3b3JrZmxvdyBmdW5jdGlvbiBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgY3VycmVudCBkZXBsb3ltZW50LlxuICpcbiAqIFRoaXMgaXMgYW4gaW5mcmFzdHJ1Y3R1cmUgZXJyb3Ig4oCUIG5vdCBhIHVzZXIgY29kZSBlcnJvci4gSXQgdHlwaWNhbGx5IG1lYW5zOlxuICogLSBBIHJ1biB3YXMgc3RhcnRlZCBhZ2FpbnN0IGEgZGVwbG95bWVudCB0aGF0IGRvZXMgbm90IGhhdmUgdGhlIHdvcmtmbG93XG4gKiAgIChlLmcuLCB0aGUgd29ya2Zsb3cgd2FzIHJlbmFtZWQgb3IgbW92ZWQgYW5kIGEgbmV3IHJ1biB0YXJnZXRlZCB0aGUgbGF0ZXN0IGRlcGxveW1lbnQpXG4gKiAtIFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIGJ1bmRsaW5nL2J1aWxkIHRvb2xpbmcgdGhhdCBjYXVzZWQgdGhlIHdvcmtmbG93XG4gKiAgIHRvIG5vdCBnZXQgYnVpbHQgY29ycmVjdGx5XG4gKlxuICogV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBydW4gZmFpbHMgd2l0aCBhIGBSVU5USU1FX0VSUk9SYCBlcnJvciBjb2RlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd1J1bnRpbWVFcnJvciB7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHdvcmtmbG93TmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgV29ya2Zsb3cgXCIke3dvcmtmbG93TmFtZX1cIiBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgY3VycmVudCBkZXBsb3ltZW50LiBUaGlzIHVzdWFsbHkgbWVhbnMgYSBydW4gd2FzIHN0YXJ0ZWQgYWdhaW5zdCBhIGRlcGxveW1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlIHRoaXMgd29ya2Zsb3csIG9yIHRoZXJlIHdhcyBhIGJ1aWxkL2J1bmRsaW5nIGlzc3VlLmAsXG4gICAgICB7IHNsdWc6IEVSUk9SX1NMVUdTLldPUktGTE9XX05PVF9SRUdJU1RFUkVEIH1cbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcic7XG4gICAgdGhpcy53b3JrZmxvd05hbWUgPSB3b3JrZmxvd05hbWU7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgb24gYSB3b3JrZmxvdyBydW4gdGhhdCBkb2VzIG5vdCBleGlzdC5cbiAqXG4gKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSBjYWxsIG1ldGhvZHMgb24gYSBydW4gb2JqZWN0IChlLmcuIGBydW4uc3RhdHVzYCxcbiAqIGBydW4uY2FuY2VsKClgLCBgcnVuLnJldHVyblZhbHVlYCkgYnV0IHRoZSB1bmRlcmx5aW5nIHJ1biBJRCBkb2VzIG5vdCBtYXRjaFxuICogYW55IGtub3duIHdvcmtmbG93IHJ1bi4gTm90ZSB0aGF0IGBnZXRSdW4oaWQpYCBpdHNlbGYgaXMgc3luY2hyb25vdXMgYW5kIHdpbGxcbiAqIG5vdCB0aHJvdyDigJQgdGhpcyBlcnJvciBpcyByYWlzZWQgd2hlbiBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgZGlzY292ZXIgdGhlIHJ1blxuICogaXMgbWlzc2luZy5cbiAqXG4gKiBVc2UgdGhlIHN0YXRpYyBgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKClgIG1ldGhvZCBmb3IgdHlwZS1zYWZlIGNoZWNraW5nXG4gKiBpbiBjYXRjaCBibG9ja3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgfSBmcm9tIFwid29ya2Zsb3cvaW50ZXJuYWwvZXJyb3JzXCI7XG4gKlxuICogdHJ5IHtcbiAqICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgcnVuLnN0YXR1cztcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IuaXMoZXJyb3IpKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihgUnVuICR7ZXJyb3IucnVuSWR9IGRvZXMgbm90IGV4aXN0YCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIG5vdCBmb3VuZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yJztcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgaG9vayB0b2tlbiBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIGFjdGl2ZSB3b3JrZmxvdyBydW4uXG4gKlxuICogVGhpcyBpcyBhIHVzZXIgZXJyb3Ig4oCUIGl0IG1lYW5zIHRoZSBzYW1lIGN1c3RvbSB0b2tlbiB3YXMgcGFzc2VkIHRvXG4gKiBgY3JlYXRlSG9va2AgaW4gdHdvIG9yIG1vcmUgY29uY3VycmVudCBydW5zLiBVc2UgYSB1bmlxdWUgdG9rZW4gcGVyIHJ1blxuICogKG9yIG9taXQgdGhlIHRva2VuIHRvIGxldCB0aGUgcnVudGltZSBnZW5lcmF0ZSBvbmUgYXV0b21hdGljYWxseSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb29rQ29uZmxpY3RFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICB0b2tlbjogc3RyaW5nO1xuICAvLyBUT0RPOiBNYWtlIHRoaXMgcmVxdWlyZWQgb25jZSBhbGwgcGVyc2lzdGVkIGhvb2tfY29uZmxpY3QgZXZlbnRzIGFuZCBXb3JsZFxuICAvLyBpbXBsZW1lbnRhdGlvbnMgYWx3YXlzIGluY2x1ZGUgdGhlIGFjdGl2ZSBob29rIG93bmVyJ3MgcnVuIElELlxuICBjb25mbGljdGluZ1J1bklkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHRva2VuOiBzdHJpbmcsIGNvbmZsaWN0aW5nUnVuSWQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGBIb29rIHRva2VuIFwiJHt0b2tlbn1cIiBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHdvcmtmbG93JHtjb25mbGljdGluZ1J1bklkID8gYCAocnVuIFwiJHtjb25mbGljdGluZ1J1bklkfVwiKWAgOiAnJ31gLFxuICAgICAge1xuICAgICAgICBzbHVnOiBFUlJPUl9TTFVHUy5IT09LX0NPTkZMSUNULFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ0hvb2tDb25mbGljdEVycm9yJztcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb25mbGljdGluZ1J1bklkID0gY29uZmxpY3RpbmdSdW5JZDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBIb29rQ29uZmxpY3RFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdIb29rQ29uZmxpY3RFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBjYWxsaW5nIGByZXN1bWVIb29rKClgIG9yIGByZXN1bWVXZWJob29rKClgIHdpdGggYSB0b2tlbiB0aGF0XG4gKiBkb2VzIG5vdCBtYXRjaCBhbnkgYWN0aXZlIGhvb2suXG4gKlxuICogQ29tbW9uIGNhdXNlczpcbiAqIC0gVGhlIGhvb2sgaGFzIGV4cGlyZWQgKHBhc3QgaXRzIFRUTClcbiAqIC0gVGhlIGhvb2sgd2FzIGFscmVhZHkgZGlzcG9zZWQgYWZ0ZXIgYmVpbmcgY29uc3VtZWRcbiAqIC0gVGhlIHdvcmtmbG93IGhhcyBub3Qgc3RhcnRlZCB5ZXQsIHNvIHRoZSBob29rIGRvZXMgbm90IGV4aXN0XG4gKlxuICogQSBjb21tb24gcGF0dGVybiBpcyB0byBjYXRjaCB0aGlzIGVycm9yIGFuZCBzdGFydCBhIG5ldyB3b3JrZmxvdyBydW4gd2hlblxuICogdGhlIGhvb2sgZG9lcyBub3QgZXhpc3QgeWV0ICh0aGUgXCJyZXN1bWUgb3Igc3RhcnRcIiBwYXR0ZXJuKS5cbiAqXG4gKiBVc2UgdGhlIHN0YXRpYyBgSG9va05vdEZvdW5kRXJyb3IuaXMoKWAgbWV0aG9kIGZvciB0eXBlLXNhZmUgY2hlY2tpbmcgaW5cbiAqIGNhdGNoIGJsb2Nrcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEhvb2tOb3RGb3VuZEVycm9yIH0gZnJvbSBcIndvcmtmbG93L2ludGVybmFsL2Vycm9yc1wiO1xuICpcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IHJlc3VtZUhvb2sodG9rZW4sIHBheWxvYWQpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycm9yKSkge1xuICogICAgIC8vIEhvb2sgZG9lc24ndCBleGlzdCDigJQgc3RhcnQgYSBuZXcgd29ya2Zsb3cgcnVuIGluc3RlYWRcbiAqICAgICBhd2FpdCBzdGFydFdvcmtmbG93KFwibXlXb3JrZmxvd1wiLCBwYXlsb2FkKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBIb29rTm90Rm91bmRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICB0b2tlbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHRva2VuOiBzdHJpbmcpIHtcbiAgICBzdXBlcignSG9vayBub3QgZm91bmQnLCB7fSk7XG4gICAgdGhpcy5uYW1lID0gJ0hvb2tOb3RGb3VuZEVycm9yJztcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBIb29rTm90Rm91bmRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdIb29rTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhbiBvcGVyYXRpb24gY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gZW50aXR5LlxuICogVGhpcyBpbmNsdWRlcyBhdHRlbXB0cyB0byBtb2RpZnkgYW4gZW50aXR5IGFscmVhZHkgaW4gYSB0ZXJtaW5hbCBzdGF0ZSxcbiAqIGNyZWF0ZSBhbiBlbnRpdHkgdGhhdCBhbHJlYWR5IGV4aXN0cywgb3IgYW55IG90aGVyIDQwOS1zdHlsZSBjb25mbGljdC5cbiAqXG4gKiBUaGUgd29ya2Zsb3cgcnVudGltZSBoYW5kbGVzIHRoaXMgZXJyb3IgYXV0b21hdGljYWxseS4gVXNlcnMgaW50ZXJhY3RpbmdcbiAqIHdpdGggd29ybGQgc3RvcmFnZSBiYWNrZW5kcyBkaXJlY3RseSBtYXkgZW5jb3VudGVyIGl0LlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5Q29uZmxpY3RFcnJvciBleHRlbmRzIFdvcmtmbG93V29ybGRFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdFbnRpdHlDb25mbGljdEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEVudGl0eUNvbmZsaWN0RXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnRW50aXR5Q29uZmxpY3RFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHJ1biBpcyBubyBsb25nZXIgYXZhaWxhYmxlIOKAlCBlaXRoZXIgYmVjYXVzZSBpdCBoYXMgYmVlblxuICogY2xlYW5lZCB1cCwgZXhwaXJlZCwgb3IgYWxyZWFkeSByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgKGNvbXBsZXRlZC9mYWlsZWQpLlxuICpcbiAqIFRoZSB3b3JrZmxvdyBydW50aW1lIGhhbmRsZXMgdGhpcyBlcnJvciBhdXRvbWF0aWNhbGx5LiBVc2VycyBpbnRlcmFjdGluZ1xuICogd2l0aCB3b3JsZCBzdG9yYWdlIGJhY2tlbmRzIGRpcmVjdGx5IG1heSBlbmNvdW50ZXIgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5FeHBpcmVkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnUnVuRXhwaXJlZEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1bkV4cGlyZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSdW5FeHBpcmVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgYSByZXF1aXJlZCB0aW1lc3RhbXBcbiAqIChlLmcuIHJldHJ5QWZ0ZXIpIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC5cbiAqXG4gKiBUaGUgd29ya2Zsb3cgcnVudGltZSBoYW5kbGVzIHRoaXMgZXJyb3IgYXV0b21hdGljYWxseS4gVXNlcnMgaW50ZXJhY3RpbmdcbiAqIHdpdGggd29ybGQgc3RvcmFnZSBiYWNrZW5kcyBkaXJlY3RseSBtYXkgZW5jb3VudGVyIGl0LlxuICpcbiAqIEBwcm9wZXJ0eSByZXRyeUFmdGVyIC0gRGVsYXkgaW4gc2Vjb25kcyBiZWZvcmUgdGhlIG9wZXJhdGlvbiBjYW4gYmUgcmV0cmllZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRvb0Vhcmx5RXJyb3IgZXh0ZW5kcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJldHJ5QWZ0ZXI/OiBudW1iZXIgfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIHsgcmV0cnlBZnRlcjogb3B0aW9ucz8ucmV0cnlBZnRlciB9KTtcbiAgICB0aGlzLm5hbWUgPSAnVG9vRWFybHlFcnJvcic7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUb29FYXJseUVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1Rvb0Vhcmx5RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSByZXF1ZXN0IGlzIHJhdGUgbGltaXRlZCBieSB0aGUgd29ya2Zsb3cgYmFja2VuZC5cbiAqXG4gKiBUaGUgd29ya2Zsb3cgcnVudGltZSBoYW5kbGVzIHRoaXMgZXJyb3IgYXV0b21hdGljYWxseSB3aXRoIHJldHJ5IGxvZ2ljLlxuICogVXNlcnMgaW50ZXJhY3Rpbmcgd2l0aCB3b3JsZCBzdG9yYWdlIGJhY2tlbmRzIGRpcmVjdGx5IG1heSBlbmNvdW50ZXIgaXRcbiAqIGlmIHJldHJpZXMgYXJlIGV4aGF1c3RlZC5cbiAqXG4gKiBAcHJvcGVydHkgcmV0cnlBZnRlciAtIERlbGF5IGluIHNlY29uZHMgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSByZXRyaWVkLlxuICovXG5leHBvcnQgY2xhc3MgVGhyb3R0bGVFcnJvciBleHRlbmRzIFdvcmtmbG93V29ybGRFcnJvciB7XG4gIHJldHJ5QWZ0ZXI/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogeyByZXRyeUFmdGVyPzogbnVtYmVyIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVGhyb3R0bGVFcnJvcic7XG4gICAgdGhpcy5yZXRyeUFmdGVyID0gb3B0aW9ucz8ucmV0cnlBZnRlcjtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRocm90dGxlRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnVGhyb3R0bGVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhd2FpdGluZyBgcnVuLnJldHVyblZhbHVlYCBvbiBhIHdvcmtmbG93IHJ1biB0aGF0IHdhcyBjYW5jZWxsZWQuXG4gKlxuICogVGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCB0aGUgd29ya2Zsb3cgd2FzIGV4cGxpY2l0bHkgY2FuY2VsbGVkICh2aWFcbiAqIGBydW4uY2FuY2VsKClgKSBhbmQgd2lsbCBub3QgcHJvZHVjZSBhIHJldHVybiB2YWx1ZS4gWW91IGNhbiBjaGVjayBmb3JcbiAqIGNhbmNlbGxhdGlvbiBiZWZvcmUgYXdhaXRpbmcgdGhlIHJldHVybiB2YWx1ZSBieSBpbnNwZWN0aW5nIGBydW4uc3RhdHVzYC5cbiAqXG4gKiBVc2UgdGhlIHN0YXRpYyBgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvci5pcygpYCBtZXRob2QgZm9yIHR5cGUtc2FmZVxuICogY2hlY2tpbmcgaW4gY2F0Y2ggYmxvY2tzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvciB9IGZyb20gXCJ3b3JrZmxvdy9pbnRlcm5hbC9lcnJvcnNcIjtcbiAqXG4gKiB0cnkge1xuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4ucmV0dXJuVmFsdWU7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvci5pcyhlcnJvcikpIHtcbiAqICAgICBjb25zb2xlLmxvZyhgUnVuICR7ZXJyb3IucnVuSWR9IHdhcyBjYW5jZWxsZWRgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGNhbmNlbGxlZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcic7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gb3BlcmF0ZSBvbiBhIHdvcmtmbG93IHJ1biB0aGF0IHJlcXVpcmVzIGEgbmV3ZXIgV29ybGQgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIGEgcnVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciBzcGVjIHZlcnNpb24gdGhhbiB0aGVcbiAqIGN1cnJlbnQgV29ybGQgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMuIFRvIHJlc29sdmUgdGhpcywgdXBncmFkZSB5b3VyXG4gKiBgd29ya2Zsb3dgIHBhY2thZ2VzIHRvIGEgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIHRoZSByZXF1aXJlZCBzcGVjIHZlcnNpb24uXG4gKlxuICogVXNlIHRoZSBzdGF0aWMgYFJ1bk5vdFN1cHBvcnRlZEVycm9yLmlzKClgIG1ldGhvZCBmb3IgdHlwZS1zYWZlIGNoZWNraW5nIGluXG4gKiBjYXRjaCBibG9ja3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBSdW5Ob3RTdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJ3b3JrZmxvdy9pbnRlcm5hbC9lcnJvcnNcIjtcbiAqXG4gKiB0cnkge1xuICogICBjb25zdCBzdGF0dXMgPSBhd2FpdCBydW4uc3RhdHVzO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKFJ1bk5vdFN1cHBvcnRlZEVycm9yLmlzKGVycm9yKSkge1xuICogICAgIGNvbnNvbGUuZXJyb3IoXG4gKiAgICAgICBgUnVuIHJlcXVpcmVzIHNwZWMgdiR7ZXJyb3IucnVuU3BlY1ZlcnNpb259LCBgICtcbiAqICAgICAgIGBidXQgd29ybGQgc3VwcG9ydHMgdiR7ZXJyb3Iud29ybGRTcGVjVmVyc2lvbn1gXG4gKiAgICAgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5Ob3RTdXBwb3J0ZWRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICByZWFkb25seSBydW5TcGVjVmVyc2lvbjogbnVtYmVyO1xuICByZWFkb25seSB3b3JsZFNwZWNWZXJzaW9uOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocnVuU3BlY1ZlcnNpb246IG51bWJlciwgd29ybGRTcGVjVmVyc2lvbjogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgUnVuIHJlcXVpcmVzIHNwZWMgdmVyc2lvbiAke3J1blNwZWNWZXJzaW9ufSwgYnV0IHdvcmxkIHN1cHBvcnRzIHZlcnNpb24gJHt3b3JsZFNwZWNWZXJzaW9ufS4gYCArXG4gICAgICAgIGBQbGVhc2UgdXBncmFkZSAnd29ya2Zsb3cnIHBhY2thZ2UuYFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bk5vdFN1cHBvcnRlZEVycm9yJztcbiAgICB0aGlzLnJ1blNwZWNWZXJzaW9uID0gcnVuU3BlY1ZlcnNpb247XG4gICAgdGhpcy53b3JsZFNwZWNWZXJzaW9uID0gd29ybGRTcGVjVmVyc2lvbjtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1bk5vdFN1cHBvcnRlZEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1J1bk5vdFN1cHBvcnRlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEEgZmF0YWwgZXJyb3IgaXMgYW4gZXJyb3IgdGhhdCBjYW5ub3QgYmUgcmV0cmllZC5cbiAqIEl0IHdpbGwgY2F1c2UgdGhlIHN0ZXAgdG8gZmFpbCBhbmQgdGhlIGVycm9yIHdpbGxcbiAqIGJlIGJ1YmJsZWQgdXAgdG8gdGhlIHdvcmtmbG93IGxvZ2ljLlxuICovXG5leHBvcnQgY2xhc3MgRmF0YWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgZmF0YWwgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdGYXRhbEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEZhdGFsRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnRmF0YWxFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeWFibGVFcnJvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgdGhlIHN0ZXAuXG4gICAqIENhbiBhbHNvIGJlIGEgZHVyYXRpb24gc3RyaW5nIChlLmcuLCBcIjVzXCIsIFwiMm1cIikgb3IgYSBEYXRlIG9iamVjdC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgc3RlcCB3aWxsIGJlIHJldHJpZWQgYWZ0ZXIgMSBzZWNvbmQgKDEwMDAgbWlsbGlzZWNvbmRzKS5cbiAgICovXG4gIHJldHJ5QWZ0ZXI/OiBudW1iZXIgfCBTdHJpbmdWYWx1ZSB8IERhdGU7XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdGhhdCBjYW4gaGFwcGVuIGR1cmluZyBhIHN0ZXAgZXhlY3V0aW9uLCBhbGxvd2luZ1xuICogZm9yIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJldHJ5IGJlaGF2aW9yLlxuICovXG5leHBvcnQgY2xhc3MgUmV0cnlhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgRGF0ZSB3aGVuIHRoZSBzdGVwIHNob3VsZCBiZSByZXRyaWVkLlxuICAgKi9cbiAgcmV0cnlBZnRlcjogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM6IFJldHJ5YWJsZUVycm9yT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1JldHJ5YWJsZUVycm9yJztcblxuICAgIGlmIChvcHRpb25zLnJldHJ5QWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZXRyeUFmdGVyID0gcGFyc2VEdXJhdGlvblRvRGF0ZShvcHRpb25zLnJldHJ5QWZ0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIDEgc2Vjb25kICgxMDAwIG1pbGxpc2Vjb25kcylcbiAgICAgIHRoaXMucmV0cnlBZnRlciA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZXRyeWFibGVFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSZXRyeWFibGVFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRSA9XG4gICdZb3VyIGN1cnJlbnQgdmVyY2VsIGFjY291bnQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZS4gVXNlIGB2ZXJjZWwgbG9naW5gIG9yIGB2ZXJjZWwgc3dpdGNoYCB0byBlbnN1cmUgeW91IGFyZSBsaW5rZWQgdG8gdGhlIHJpZ2h0IGFjY291bnQuJztcblxuZXhwb3J0IHsgUlVOX0VSUk9SX0NPREVTLCB0eXBlIFJ1bkVycm9yQ29kZSB9IGZyb20gJy4vZXJyb3ItY29kZXMuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyb3NzLXJlYWxtIGNsYXNzIHJlZ2lzdHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gYEZhdGFsRXJyb3JgLCBgUmV0cnlhYmxlRXJyb3JgLCBhbmQgYEhvb2tDb25mbGljdEVycm9yYCBhcmUgbm90IGJ1aWx0LWlucywgc28gZGlmZmVyZW50IHJlYWxtc1xuLy8gKGUuZy4gdGhlIHdvcmtmbG93IFZNIGNvbnRleHQgdnMuIHRoZSBob3N0IGNvbnRleHQgdGhhdCBydW5zIHRoZSBxdWV1ZVxuLy8gaGFuZGxlcikgYnVuZGxlIGFuZCBsb2FkIHRoZWlyIG93biBjb3BpZXMgb2YgdGhpcyBtb2R1bGUg4oCUIG1lYW5pbmcgZWFjaFxuLy8gcmVhbG0gaGFzIGl0cyBvd24gZGlzdGluY3QgY2xhc3MgaWRlbnRpdHkuIENyb3NzLXJlYWxtIGBpbnN0YW5jZW9mYCBmYWlsc1xuLy8gYmVjYXVzZSB0aGUgcHJvdG90eXBlIGNoYWlucyBuZXZlciBtZWV0LlxuLy9cbi8vIFRvIGxldCBzZXJpYWxpemF0aW9uIHJldml2ZXJzIHJlY29uc3RydWN0IGEgdmFsdWUgYXMgdGhlICpjb25zdW1lcidzKlxuLy8gRmF0YWxFcnJvciAoc28gdXNlci1jb2RlIGBlcnIgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCBwYXNzZXMpLCBlYWNoIGJ1bmRsZWRcbi8vIGNvcHkgb2YgdGhpcyBtb2R1bGUgc2VsZi1yZWdpc3RlcnMgaXRzIGNsYXNzIG9uIGBnbG9iYWxUaGlzYCB2aWEgYSBrbm93blxuLy8gU3ltYm9sLmZvciBrZXkuIFJldml2ZXJzIGluIGBAd29ya2Zsb3cvY29yZWAgbG9vayB1cCB0aGUgY2xhc3MgdmlhIHRoZVxuLy8gY29uc3VtZXIncyBnbG9iYWxUaGlzIGF0IGh5ZHJhdGlvbiB0aW1lLlxuLy9cbi8vIEZpcnN0IHJlZ2lzdHJhdGlvbiBpbiBhIGdpdmVuIHJlYWxtIHdpbnMuIFRoZSBkZXNjcmlwdG9yIGlzIG5vbi13cml0YWJsZVxuLy8gYW5kIG5vbi1jb25maWd1cmFibGUgdG8gbWFrZSBhY2NpZGVudGFsIGNsb2JiZXJpbmcgbG91ZC5cbmNvbnN0IEZBVEFMX0VSUk9SX0tFWSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL0ZhdGFsRXJyb3InKTtcbmNvbnN0IFJFVFJZQUJMRV9FUlJPUl9LRVkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpO1xuY29uc3QgSE9PS19DT05GTElDVF9FUlJPUl9LRVkgPSBTeW1ib2wuZm9yKFxuICAnQHdvcmtmbG93L2Vycm9ycy8vSG9va0NvbmZsaWN0RXJyb3InXG4pO1xuXG5pZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gIGlmICghT2JqZWN0Lmhhc093bihnbG9iYWxUaGlzLCBGQVRBTF9FUlJPUl9LRVkpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIEZBVEFMX0VSUk9SX0tFWSwge1xuICAgICAgdmFsdWU6IEZhdGFsRXJyb3IsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgaWYgKCFPYmplY3QuaGFzT3duKGdsb2JhbFRoaXMsIFJFVFJZQUJMRV9FUlJPUl9LRVkpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIFJFVFJZQUJMRV9FUlJPUl9LRVksIHtcbiAgICAgIHZhbHVlOiBSZXRyeWFibGVFcnJvcixcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuICBpZiAoIU9iamVjdC5oYXNPd24oZ2xvYmFsVGhpcywgSE9PS19DT05GTElDVF9FUlJPUl9LRVkpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIEhPT0tfQ09ORkxJQ1RfRVJST1JfS0VZLCB7XG4gICAgICB2YWx1ZTogSG9va0NvbmZsaWN0RXJyb3IsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgV09SS0ZMT1dfVVNFX1NURVAgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19VU0VfU1RFUCcpO1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0NSRUFURV9IT09LID0gU3ltYm9sLmZvcignV09SS0ZMT1dfQ1JFQVRFX0hPT0snKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19TTEVFUCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NMRUVQJyk7XG5leHBvcnQgY29uc3QgV09SS0ZMT1dfQ09OVEVYVCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0NPTlRFWFQnKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19HRVRfU1RSRUFNX0lEID0gU3ltYm9sLmZvcignV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCcpO1xuZXhwb3J0IGNvbnN0IFNUQUJMRV9VTElEID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU1RBQkxFX1VMSUQnKTtcbmV4cG9ydCBjb25zdCBTVFJFQU1fTkFNRV9TWU1CT0wgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpO1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9UWVBFX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyk7XG5leHBvcnQgY29uc3QgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX0ZSQU1JTkcnKTtcbi8qKlxuICogU3RhbXBlZCBvbiBhIHJlYWwgYFdyaXRhYmxlU3RyZWFtYCAodGhlIHVzZXItdmlzaWJsZSBgc2VyaWFsaXplLndyaXRhYmxlYFxuICogcmV0dXJuZWQgZnJvbSBhIHN0ZXAtc2lkZSByZXZpdmVyIG9yIHN0ZXAtY29udGV4dCBgZ2V0V3JpdGFibGUoKWApIHRvXG4gKiByZWNvcmQgdGhlIGBydW5JZGAgb2YgdGhlIHdvcmtmbG93IHJ1biB0aGF0IG93bnMgdGhlIHVuZGVybHlpbmcgc2VydmVyXG4gKiBzdHJlYW0uIFVzZWQgdG9nZXRoZXIgd2l0aCBgU1RSRUFNX05BTUVfU1lNQk9MYC5cbiAqXG4gKiBXaGVuIGBnZXRFeHRlcm5hbFJlZHVjZXJzLldyaXRhYmxlU3RyZWFtYCAodGhlIGRlaHlkcmF0aW9uIHBhdGggdXNlZCBieVxuICogYHN0YXJ0KClgKSBzZWVzIGJvdGggc3ltYm9scyBvbiBhIHdyaXRhYmxlLCBpdCBpbmNsdWRlcyB0aGUgYHJ1bklkYCBpblxuICogdGhlIGRlc2NyaXB0b3IgaXQgZW1pdHMuIFRoZSBjaGlsZCBydW4ncyBzdGVwLXNpZGUgcmV2aXZlciB0aGVuIG9wZW5zXG4gKiBhIHNlcnZlciB3cml0YWJsZSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgKHJ1bklkLCBuYW1lKWAgYW5kIHJlc29sdmVzXG4gKiB0aGF0IHJ1bidzIGVuY3J5cHRpb24ga2V5IGRpcmVjdGx5IOKAlCBzbyB0aGUgY2hpbGQncyB3cml0ZXMgbGFuZCBvblxuICogdGhlIHBhcmVudCdzIHN0cmVhbSBhcy1pcywgd2l0aCBubyBjbGllbnQgcHJvY2VzcyBpbiB0aGUgbG9vcC4gVGhhdFxuICoga2VlcHMgdGhlIGZvcndhcmRpbmcgYWxpdmUgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBjaGlsZCBydW4sXG4gKiBub3QganVzdCBmb3IgdGhlIHBhcmVudCBzdGVwIHRoYXQgaW5pdGlhdGVkIGBzdGFydCgpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCA9IFN5bWJvbC5mb3IoXG4gICdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX1JVTl9JRCdcbik7XG4vKipcbiAqIFN0YW1wZWQgYWxvbmdzaWRlIGBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xgIHdoZW4gdGhlIGRlcGxveW1lbnQgdGhhdFxuICogb3ducyBhIGZvcndhcmRlZCB3cml0YWJsZSBzdHJlYW0gaXMga25vd24uIENyb3NzLWRlcGxveW1lbnQgY29uc3VtZXJzIHVzZVxuICogaXQgdG8gcmVzb2x2ZSB0aGUgb3duaW5nIHJ1bidzIGVuY3J5cHRpb24ga2V5IHdpdGhvdXQgbG9hZGluZyB0aGUgcnVuIGZpcnN0LlxuICovXG5leHBvcnQgY29uc3QgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCA9IFN5bWJvbC5mb3IoXG4gICdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSUQnXG4pO1xuZXhwb3J0IGNvbnN0IEJPRFlfSU5JVF9TWU1CT0wgPSBTeW1ib2wuZm9yKCdCT0RZX0lOSVQnKTtcbmV4cG9ydCBjb25zdCBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFID0gU3ltYm9sLmZvcihcbiAgJ1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUnXG4pO1xuXG4vKipcbiAqIFN5bWJvbCB1c2VkIHRvIHN0b3JlIHRoZSBjbGFzcyByZWdpc3RyeSBvbiBnbG9iYWxUaGlzIGluIHdvcmtmbG93IG1vZGUuXG4gKiBUaGlzIGFsbG93cyB0aGUgZGVzZXJpYWxpemVyIHRvIGZpbmQgY2xhc3NlcyBieSBjbGFzc0lkIGluIHRoZSBWTSBjb250ZXh0LlxuICovXG5leHBvcnQgY29uc3QgV09SS0ZMT1dfQ0xBU1NfUkVHSVNUUlkgPSBTeW1ib2wuZm9yKCd3b3JrZmxvdy1jbGFzcy1yZWdpc3RyeScpO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgSG9vayxcbiAgSG9va09wdGlvbnMsXG4gIFJlcXVlc3RXaXRoUmVzcG9uc2UsXG4gIFdlYmhvb2ssXG4gIFdlYmhvb2tPcHRpb25zLFxufSBmcm9tICcuLi9jcmVhdGUtaG9vay5qcyc7XG5pbXBvcnQgeyBXT1JLRkxPV19DUkVBVEVfSE9PSyB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gJy4vZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2s8VCA9IGFueT4ob3B0aW9ucz86IEhvb2tPcHRpb25zKTogSG9vazxUPiB7XG4gIC8vIEluc2lkZSB0aGUgd29ya2Zsb3cgVk0sIHRoZSBob29rIGZ1bmN0aW9uIGlzIHN0b3JlZCBpbiB0aGUgZ2xvYmFsVGhpcyBvYmplY3QgYmVoaW5kIGEgc3ltYm9sXG4gIGNvbnN0IGNyZWF0ZUhvb2tGbiA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgV09SS0ZMT1dfQ1JFQVRFX0hPT0tcbiAgXSBhcyB0eXBlb2YgY3JlYXRlSG9vazxUPjtcbiAgaWYgKCFjcmVhdGVIb29rRm4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYGNyZWF0ZUhvb2soKWAgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBhIHdvcmtmbG93IGZ1bmN0aW9uJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUhvb2tGbihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2soXG4gIG9wdGlvbnM6IFdlYmhvb2tPcHRpb25zICYgeyByZXNwb25kV2l0aDogJ21hbnVhbCcgfVxuKTogV2ViaG9vazxSZXF1ZXN0V2l0aFJlc3BvbnNlPjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rKG9wdGlvbnM/OiBXZWJob29rT3B0aW9ucyk6IFdlYmhvb2s8UmVxdWVzdD47XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViaG9vayhcbiAgb3B0aW9ucz86IFdlYmhvb2tPcHRpb25zXG4pOiBXZWJob29rPFJlcXVlc3Q+IHwgV2ViaG9vazxSZXF1ZXN0V2l0aFJlc3BvbnNlPiB7XG4gIGNvbnN0IHsgcmVzcG9uZFdpdGgsIHRva2VuLCAuLi5yZXN0IH0gPSAob3B0aW9ucyA/PyB7fSkgYXMgV2ViaG9va09wdGlvbnMgJiB7XG4gICAgdG9rZW4/OiBzdHJpbmc7XG4gIH07XG5cbiAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYGNyZWF0ZVdlYmhvb2soKWAgZG9lcyBub3QgYWNjZXB0IGEgYHRva2VuYCBvcHRpb24uIFdlYmhvb2sgdG9rZW5zIGFyZSBhbHdheXMgcmFuZG9tbHkgZ2VuZXJhdGVkLiBVc2UgYGNyZWF0ZUhvb2soKWAgd2l0aCBgcmVzdW1lSG9vaygpYCBmb3IgZGV0ZXJtaW5pc3RpYyB0b2tlbiBwYXR0ZXJucy4nXG4gICAgKTtcbiAgfVxuXG4gIGxldCBtZXRhZGF0YTogUGljazxXZWJob29rT3B0aW9ucywgJ3Jlc3BvbmRXaXRoJz4gfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgcmVzcG9uZFdpdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbWV0YWRhdGEgPSB7IHJlc3BvbmRXaXRoIH07XG4gIH1cblxuICBjb25zdCBob29rID0gY3JlYXRlSG9vayh7IC4uLnJlc3QsIG1ldGFkYXRhLCBpc1dlYmhvb2s6IHRydWUgfSkgYXNcbiAgICB8IFdlYmhvb2s8UmVxdWVzdD5cbiAgICB8IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT47XG5cbiAgY29uc3QgeyB1cmwgfSA9IGdldFdvcmtmbG93TWV0YWRhdGEoKTtcbiAgaG9vay51cmwgPSBgJHt1cmx9Ly53ZWxsLWtub3duL3dvcmtmbG93L3YxL3dlYmhvb2svJHtlbmNvZGVVUklDb21wb25lbnQoaG9vay50b2tlbil9YDtcblxuICByZXR1cm4gaG9vaztcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEhvb2sgYXMgSG9va0VudGl0eSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgY3JlYXRlSG9vayB9IGZyb20gJy4vY3JlYXRlLWhvb2suanMnO1xuXG4vKipcbiAqIE5PVEU6IFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBkZWZpbmVIb29rKClgIHRoYXQgaXMgdXNlZCBpbiB3b3JrZmxvdyBjb250ZXh0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUhvb2s8VElucHV0LCBUT3V0cHV0ID0gVElucHV0PigpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGUob3B0aW9ucz86IEhvb2tPcHRpb25zKTogSG9vazxUT3V0cHV0PiB7XG4gICAgICByZXR1cm4gY3JlYXRlSG9vazxUT3V0cHV0PihvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgcmVzdW1lKF90b2tlbjogc3RyaW5nLCBfcGF5bG9hZDogVElucHV0KTogUHJvbWlzZTxIb29rRW50aXR5IHwgbnVsbD4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnYGRlZmluZUhvb2soKS5yZXN1bWUoKWAgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gZXh0ZXJuYWwgY29udGV4dHMgKGUuZy4gQVBJIHJvdXRlcykuJ1xuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgV29ya2Zsb3dXcml0YWJsZVN0cmVhbU9wdGlvbnMgfSBmcm9tICcuLi9zdGVwL3dyaXRhYmxlLXN0cmVhbS5qcyc7XG5pbXBvcnQgeyBTVFJFQU1fTkFNRV9TWU1CT0wsIFdPUktGTE9XX0dFVF9TVFJFQU1fSUQgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdyaXRhYmxlPFcgPSBhbnk+KFxuICBvcHRpb25zOiBXb3JrZmxvd1dyaXRhYmxlU3RyZWFtT3B0aW9ucyA9IHt9XG4pOiBXcml0YWJsZVN0cmVhbTxXPiB7XG4gIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBvcHRpb25zO1xuICBjb25zdCBuYW1lID0gKGdsb2JhbFRoaXMgYXMgYW55KVtXT1JLRkxPV19HRVRfU1RSRUFNX0lEXShuYW1lc3BhY2UpO1xuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICB2YWx1ZTogbmFtZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbn1cbiIsICIvKiogQSBzcGVjaWFsIGNvbnN0YW50IHdpdGggdHlwZSBgbmV2ZXJgICovIGV4cG9ydCBjb25zdCBORVZFUiA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0YXR1czogXCJhYm9ydGVkXCJcbn0pO1xuZXhwb3J0IC8qQF9fTk9fU0lERV9FRkZFQ1RTX18qLyBmdW5jdGlvbiAkY29uc3RydWN0b3IobmFtZSwgaW5pdGlhbGl6ZXIsIHBhcmFtcykge1xuICAgIGZ1bmN0aW9uIGluaXQoaW5zdCwgZGVmKSB7XG4gICAgICAgIGlmICghaW5zdC5fem9kKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJfem9kXCIsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBkZWYsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cjogXyxcbiAgICAgICAgICAgICAgICAgICAgdHJhaXRzOiBuZXcgU2V0KClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5zdC5fem9kLnRyYWl0cy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0Ll96b2QudHJhaXRzLmFkZChuYW1lKTtcbiAgICAgICAgaW5pdGlhbGl6ZXIoaW5zdCwgZGVmKTtcbiAgICAgICAgLy8gc3VwcG9ydCBwcm90b3R5cGUgbW9kaWZpY2F0aW9uc1xuICAgICAgICBjb25zdCBwcm90byA9IF8ucHJvdG90eXBlO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvdG8pO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBrID0ga2V5c1tpXTtcbiAgICAgICAgICAgIGlmICghKGsgaW4gaW5zdCkpIHtcbiAgICAgICAgICAgICAgICBpbnN0W2tdID0gcHJvdG9ba10uYmluZChpbnN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkb2Vzbid0IHdvcmsgaWYgUGFyZW50IGhhcyBhIGNvbnN0cnVjdG9yIHdpdGggYXJndW1lbnRzXG4gICAgY29uc3QgUGFyZW50ID0gcGFyYW1zPy5QYXJlbnQgPz8gT2JqZWN0O1xuICAgIGNsYXNzIERlZmluaXRpb24gZXh0ZW5kcyBQYXJlbnQge1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVmaW5pdGlvbiwgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IG5hbWVcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBfKGRlZikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGluc3QgPSBwYXJhbXM/LlBhcmVudCA/IG5ldyBEZWZpbml0aW9uKCkgOiB0aGlzO1xuICAgICAgICBpbml0KGluc3QsIGRlZik7XG4gICAgICAgIChfYSA9IGluc3QuX3pvZCkuZGVmZXJyZWQgPz8gKF9hLmRlZmVycmVkID0gW10pO1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGluc3QuX3pvZC5kZWZlcnJlZCl7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgXCJpbml0XCIsIHtcbiAgICAgICAgdmFsdWU6IGluaXRcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgICAgIHZhbHVlOiAoaW5zdCk9PntcbiAgICAgICAgICAgIGlmIChwYXJhbXM/LlBhcmVudCAmJiBpbnN0IGluc3RhbmNlb2YgcGFyYW1zLlBhcmVudCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gaW5zdD8uX3pvZD8udHJhaXRzPy5oYXMobmFtZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IG5hbWVcbiAgICB9KTtcbiAgICByZXR1cm4gXztcbn1cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFVUSUxJVElFUyAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGNvbnN0ICRicmFuZCA9IFN5bWJvbChcInpvZF9icmFuZFwiKTtcbmV4cG9ydCBjbGFzcyAkWm9kQXN5bmNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcihgRW5jb3VudGVyZWQgUHJvbWlzZSBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2UuIFVzZSAucGFyc2VBc3luYygpIGluc3RlYWQuYCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzICRab2RFbmNvZGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKXtcbiAgICAgICAgc3VwZXIoYEVuY291bnRlcmVkIHVuaWRpcmVjdGlvbmFsIHRyYW5zZm9ybSBkdXJpbmcgZW5jb2RlOiAke25hbWV9YCk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWm9kRW5jb2RlRXJyb3JcIjtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZ2xvYmFsQ29uZmlnID0ge307XG5leHBvcnQgZnVuY3Rpb24gY29uZmlnKG5ld0NvbmZpZykge1xuICAgIGlmIChuZXdDb25maWcpIE9iamVjdC5hc3NpZ24oZ2xvYmFsQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIHJldHVybiBnbG9iYWxDb25maWc7XG59XG4iLCAiLy8gZnVuY3Rpb25zXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsKSB7XG4gICAgcmV0dXJuIHZhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3RFcXVhbCh2YWwpIHtcbiAgICByZXR1cm4gdmFsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzKF9hcmcpIHt9XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIoX3gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHZhbHVlIGluIGV4aGF1c3RpdmUgY2hlY2tcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KF8pIHt9XG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bVZhbHVlcyhlbnRyaWVzKSB7XG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlcyA9IE9iamVjdC52YWx1ZXMoZW50cmllcykuZmlsdGVyKCh2KT0+dHlwZW9mIHYgPT09IFwibnVtYmVyXCIpO1xuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZpbHRlcigoW2ssIF9dKT0+bnVtZXJpY1ZhbHVlcy5pbmRleE9mKCtrKSA9PT0gLTEpLm1hcCgoW18sIHZdKT0+dik7XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBqb2luVmFsdWVzKGFycmF5LCBzZXBhcmF0b3IgPSBcInxcIikge1xuICAgIHJldHVybiBhcnJheS5tYXAoKHZhbCk9PnN0cmluZ2lmeVByaW1pdGl2ZSh2YWwpKS5qb2luKHNlcGFyYXRvcik7XG59XG5leHBvcnQgZnVuY3Rpb24ganNvblN0cmluZ2lmeVJlcGxhY2VyKF8sIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlZChnZXR0ZXIpIHtcbiAgICBjb25zdCBzZXQgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgdmFsdWUgKCkge1xuICAgICAgICAgICAgaWYgKCFzZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldHRlcigpO1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInZhbHVlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWNoZWQgdmFsdWUgYWxyZWFkeSBzZXRcIik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bGxpc2goaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblJlZ2V4KHNvdXJjZSkge1xuICAgIGNvbnN0IHN0YXJ0ID0gc291cmNlLnN0YXJ0c1dpdGgoXCJeXCIpID8gMSA6IDA7XG4gICAgY29uc3QgZW5kID0gc291cmNlLmVuZHNXaXRoKFwiJFwiKSA/IHNvdXJjZS5sZW5ndGggLSAxIDogc291cmNlLmxlbmd0aDtcbiAgICByZXR1cm4gc291cmNlLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZsb2F0U2FmZVJlbWFpbmRlcih2YWwsIHN0ZXApIHtcbiAgICBjb25zdCB2YWxEZWNDb3VudCA9ICh2YWwudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoO1xuICAgIGNvbnN0IHN0ZXBTdHJpbmcgPSBzdGVwLnRvU3RyaW5nKCk7XG4gICAgbGV0IHN0ZXBEZWNDb3VudCA9IChzdGVwU3RyaW5nLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgaWYgKHN0ZXBEZWNDb3VudCA9PT0gMCAmJiAvXFxkP2UtXFxkPy8udGVzdChzdGVwU3RyaW5nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN0ZXBTdHJpbmcubWF0Y2goL1xcZD9lLShcXGQ/KS8pO1xuICAgICAgICBpZiAobWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgc3RlcERlY0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZWNDb3VudCA9IHZhbERlY0NvdW50ID4gc3RlcERlY0NvdW50ID8gdmFsRGVjQ291bnQgOiBzdGVwRGVjQ291bnQ7XG4gICAgY29uc3QgdmFsSW50ID0gTnVtYmVyLnBhcnNlSW50KHZhbC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgY29uc3Qgc3RlcEludCA9IE51bWJlci5wYXJzZUludChzdGVwLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICByZXR1cm4gdmFsSW50ICUgc3RlcEludCAvIDEwICoqIGRlY0NvdW50O1xufVxuY29uc3QgRVZBTFVBVElORyA9IFN5bWJvbChcImV2YWx1YXRpbmdcIik7XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lTGF6eShvYmplY3QsIGtleSwgZ2V0dGVyKSB7XG4gICAgbGV0IHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBFVkFMVUFUSU5HKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkLCByZXR1cm4gdW5kZWZpbmVkIHRvIGJyZWFrIHRoZSBjeWNsZVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gRVZBTFVBVElORztcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldHRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgKHYpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gb2JqZWN0W2tleV0gPSB2O1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RDbG9uZShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzaWduUHJvcCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVmcyguLi5kZWZzKSB7XG4gICAgY29uc3QgbWVyZ2VkRGVzY3JpcHRvcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKXtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhkZWYpO1xuICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlZERlc2NyaXB0b3JzLCBkZXNjcmlwdG9ycyk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSwgbWVyZ2VkRGVzY3JpcHRvcnMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lRGVmKHNjaGVtYSkge1xuICAgIHJldHVybiBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50QXRQYXRoKG9iaiwgcGF0aCkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIG9iajtcbiAgICByZXR1cm4gcGF0aC5yZWR1Y2UoKGFjYywga2V5KT0+YWNjPy5ba2V5XSwgb2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlQWxsT2JqZWN0KHByb21pc2VzT2JqKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb21pc2VzT2JqKTtcbiAgICBjb25zdCBwcm9taXNlcyA9IGtleXMubWFwKChrZXkpPT5wcm9taXNlc09ialtrZXldKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHJlc3VsdHMpPT57XG4gICAgICAgIGNvbnN0IHJlc29sdmVkT2JqID0ge307XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHJlc29sdmVkT2JqW2tleXNbaV1dID0gcmVzdWx0c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRPYmo7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nKGxlbmd0aCA9IDEwKSB7XG4gICAgY29uc3QgY2hhcnMgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXtcbiAgICAgICAgc3RyICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCldO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVzYyhzdHIpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3RyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzbHVnaWZ5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0LnRvTG93ZXJDYXNlKCkudHJpbSgpLnJlcGxhY2UoL1teXFx3XFxzLV0vZywgXCJcIikucmVwbGFjZSgvW1xcc18tXSsvZywgXCItXCIpLnJlcGxhY2UoL14tK3wtKyQvZywgXCJcIik7XG59XG5leHBvcnQgY29uc3QgY2FwdHVyZVN0YWNrVHJhY2UgPSBcImNhcHR1cmVTdGFja1RyYWNlXCIgaW4gRXJyb3IgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA6ICguLi5fYXJncyk9Pnt9O1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKTtcbn1cbmV4cG9ydCBjb25zdCBhbGxvd3NFdmFsID0gY2FjaGVkKCgpPT57XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvcj8udXNlckFnZW50Py5pbmNsdWRlcyhcIkNsb3VkZmxhcmVcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBGID0gRnVuY3Rpb247XG4gICAgICAgIG5ldyBGKFwiXCIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG8pIHtcbiAgICBpZiAoaXNPYmplY3QobykgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gbW9kaWZpZWQgY29uc3RydWN0b3JcbiAgICBjb25zdCBjdG9yID0gby5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoY3RvciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN0b3IgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG4gICAgLy8gbW9kaWZpZWQgcHJvdG90eXBlXG4gICAgY29uc3QgcHJvdCA9IGN0b3IucHJvdG90eXBlO1xuICAgIGlmIChpc09iamVjdChwcm90KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAvLyBjdG9yIGRvZXNuJ3QgaGF2ZSBzdGF0aWMgYGlzUHJvdG90eXBlT2ZgXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90LCBcImlzUHJvdG90eXBlT2ZcIikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0Nsb25lKG8pIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChvKSkgcmV0dXJuIHtcbiAgICAgICAgLi4ub1xuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBbXG4gICAgICAgIC4uLm9cbiAgICBdO1xuICAgIHJldHVybiBvO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bUtleXMoZGF0YSkge1xuICAgIGxldCBrZXlDb3VudCA9IDA7XG4gICAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKXtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlDb3VudDtcbn1cbmV4cG9ydCBjb25zdCBnZXRQYXJzZWRUeXBlID0gKGRhdGEpPT57XG4gICAgY29uc3QgdCA9IHR5cGVvZiBkYXRhO1xuICAgIHN3aXRjaCh0KXtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGEpID8gXCJuYW5cIiA6IFwibnVtYmVyXCI7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIjtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN5bWJvbFwiO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImFycmF5XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnRoZW4gJiYgdHlwZW9mIGRhdGEudGhlbiA9PT0gXCJmdW5jdGlvblwiICYmIGRhdGEuY2F0Y2ggJiYgdHlwZW9mIGRhdGEuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBcInByb21pc2VcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJtYXBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgU2V0ICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzZXRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImRhdGVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImZpbGVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIm9iamVjdFwiO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZTogJHt0fWApO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcHJvcGVydHlLZXlUeXBlcyA9IG5ldyBTZXQoW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcInN5bWJvbFwiXG5dKTtcbmV4cG9ydCBjb25zdCBwcmltaXRpdmVUeXBlcyA9IG5ldyBTZXQoW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcImJpZ2ludFwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwic3ltYm9sXCIsXG4gICAgXCJ1bmRlZmluZWRcIlxuXSk7XG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnZXgoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG59XG4vLyB6b2Qtc3BlY2lmaWMgdXRpbHNcbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShpbnN0LCBkZWYsIHBhcmFtcykge1xuICAgIGNvbnN0IGNsID0gbmV3IGluc3QuX3pvZC5jb25zdHIoZGVmID8/IGluc3QuX3pvZC5kZWYpO1xuICAgIGlmICghZGVmIHx8IHBhcmFtcz8ucGFyZW50KSBjbC5fem9kLnBhcmVudCA9IGluc3Q7XG4gICAgcmV0dXJuIGNsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKSB7XG4gICAgY29uc3QgcGFyYW1zID0gX3BhcmFtcztcbiAgICBpZiAoIXBhcmFtcykgcmV0dXJuIHt9O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInN0cmluZ1wiKSByZXR1cm4ge1xuICAgICAgICBlcnJvcjogKCk9PnBhcmFtc1xuICAgIH07XG4gICAgaWYgKHBhcmFtcz8ubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChwYXJhbXM/LmVycm9yICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGJvdGggYG1lc3NhZ2VgIGFuZCBgZXJyb3JgIHBhcmFtc1wiKTtcbiAgICAgICAgcGFyYW1zLmVycm9yID0gcGFyYW1zLm1lc3NhZ2U7XG4gICAgfVxuICAgIGRlbGV0ZSBwYXJhbXMubWVzc2FnZTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5lcnJvciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBlcnJvcjogKCk9PnBhcmFtcy5lcnJvclxuICAgIH07XG4gICAgcmV0dXJuIHBhcmFtcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFuc3BhcmVudFByb3h5KGdldHRlcikge1xuICAgIGxldCB0YXJnZXQ7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICBnZXQgKF8sIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IChfLCBwcm9wLCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzIChfLCBwcm9wKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBkZWxldGVQcm9wZXJ0eSAoXywgcHJvcCkge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBvd25LZXlzIChfKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIChfLCBwcm9wKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBkZWZpbmVQcm9wZXJ0eSAoXywgcHJvcCwgZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5UHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkgKyBcIm5cIjtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxLZXlzKHNoYXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNoYXBlKS5maWx0ZXIoKGspPT57XG4gICAgICAgIHJldHVybiBzaGFwZVtrXS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIgJiYgc2hhcGVba10uX3pvZC5vcHRvdXQgPT09IFwib3B0aW9uYWxcIjtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBOVU1CRVJfRk9STUFUX1JBTkdFUyA9IHtcbiAgICBzYWZlaW50OiBbXG4gICAgICAgIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgIF0sXG4gICAgaW50MzI6IFtcbiAgICAgICAgLTIxNDc0ODM2NDgsXG4gICAgICAgIDIxNDc0ODM2NDdcbiAgICBdLFxuICAgIHVpbnQzMjogW1xuICAgICAgICAwLFxuICAgICAgICA0Mjk0OTY3Mjk1XG4gICAgXSxcbiAgICBmbG9hdDMyOiBbXG4gICAgICAgIC0zLjQwMjgyMzQ2NjM4NTI4ODZlMzgsXG4gICAgICAgIDMuNDAyODIzNDY2Mzg1Mjg4NmUzOFxuICAgIF0sXG4gICAgZmxvYXQ2NDogW1xuICAgICAgICAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgTnVtYmVyLk1BWF9WQUxVRVxuICAgIF1cbn07XG5leHBvcnQgY29uc3QgQklHSU5UX0ZPUk1BVF9SQU5HRVMgPSB7XG4gICAgaW50NjQ6IFtcbiAgICAgICAgLyogQF9fUFVSRV9fKi8gQmlnSW50KFwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiksXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludChcIjkyMjMzNzIwMzY4NTQ3NzU4MDdcIilcbiAgICBdLFxuICAgIHVpbnQ2NDogW1xuICAgICAgICAvKiBAX19QVVJFX18qLyBCaWdJbnQoMCksXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludChcIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XCIpXG4gICAgXVxufTtcbmV4cG9ydCBmdW5jdGlvbiBwaWNrKHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGN1cnJEZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgY2hlY2tzID0gY3VyckRlZi5jaGVja3M7XG4gICAgY29uc3QgaGFzQ2hlY2tzID0gY2hlY2tzICYmIGNoZWNrcy5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNDaGVja3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiLnBpY2soKSBjYW5ub3QgYmUgdXNlZCBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzXCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBtYXNrKXtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gY3VyckRlZi5zaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gY3VyckRlZi5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIG5ld1NoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gbmV3U2hhcGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrczogW11cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoc2NoZW1hLCBkZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9taXQoc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgY3VyckRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCBjaGVja3MgPSBjdXJyRGVmLmNoZWNrcztcbiAgICBjb25zdCBoYXNDaGVja3MgPSBjaGVja3MgJiYgY2hlY2tzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc0NoZWNrcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIub21pdCgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHNcIik7XG4gICAgfVxuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge1xuICAgICAgICAgICAgICAgIC4uLnNjaGVtYS5fem9kLmRlZi5zaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIGN1cnJEZWYuc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hc2tba2V5XSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1NoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgbmV3U2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBuZXdTaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHNjaGVtYSwgc2hhcGUpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qoc2hhcGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgdG8gZXh0ZW5kOiBleHBlY3RlZCBhIHBsYWluIG9iamVjdFwiKTtcbiAgICB9XG4gICAgY29uc3QgY2hlY2tzID0gc2NoZW1hLl96b2QuZGVmLmNoZWNrcztcbiAgICBjb25zdCBoYXNDaGVja3MgPSBjaGVja3MgJiYgY2hlY2tzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc0NoZWNrcykge1xuICAgICAgICAvLyBPbmx5IHRocm93IGlmIG5ldyBzaGFwZSBvdmVybGFwcyB3aXRoIGV4aXN0aW5nIHNoYXBlXG4gICAgICAgIC8vIFVzZSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgdG8gY2hlY2sga2V5IGV4aXN0ZW5jZSB3aXRob3V0IGFjY2Vzc2luZyB2YWx1ZXNcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTaGFwZSA9IHNjaGVtYS5fem9kLmRlZi5zaGFwZTtcbiAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBzaGFwZSl7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihleGlzdGluZ1NoYXBlLCBrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgb3ZlcndyaXRlIGtleXMgb24gb2JqZWN0IHNjaGVtYXMgY29udGFpbmluZyByZWZpbmVtZW50cy4gVXNlIGAuc2FmZUV4dGVuZCgpYCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLnNoYXBlLFxuICAgICAgICAgICAgICAgIC4uLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2FmZUV4dGVuZChzY2hlbWEsIHNoYXBlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHNoYXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHRvIHNhZmVFeHRlbmQ6IGV4cGVjdGVkIGEgcGxhaW4gb2JqZWN0XCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLnNoYXBlLFxuICAgICAgICAgICAgICAgIC4uLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UoYSwgYikge1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhhLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uYS5fem9kLmRlZi5zaGFwZSxcbiAgICAgICAgICAgICAgICAuLi5iLl96b2QuZGVmLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGNhdGNoYWxsICgpIHtcbiAgICAgICAgICAgIHJldHVybiBiLl96b2QuZGVmLmNhdGNoYWxsO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKGEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbChDbGFzcywgc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgY3VyckRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCBjaGVja3MgPSBjdXJyRGVmLmNoZWNrcztcbiAgICBjb25zdCBoYXNDaGVja3MgPSBjaGVja3MgJiYgY2hlY2tzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc0NoZWNrcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIucGFydGlhbCgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHNcIik7XG4gICAgfVxuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNoYXBlID0gc2NoZW1hLl96b2QuZGVmLnNoYXBlO1xuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4ub2xkU2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobWFzaykge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBvbGRTaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9sZFNoYXBlW2tleV0hLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBDbGFzcyA/IG5ldyBDbGFzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm9wdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lclR5cGU6IG9sZFNoYXBlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSkgOiBvbGRTaGFwZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBvbGRTaGFwZSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChvbGRTaGFwZVtrZXldIS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gQ2xhc3MgPyBuZXcgQ2xhc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJvcHRpb25hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlOiBvbGRTaGFwZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH0pIDogb2xkU2hhcGVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgc2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQoQ2xhc3MsIHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNoYXBlID0gc2NoZW1hLl96b2QuZGVmLnNoYXBlO1xuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4ub2xkU2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobWFzaykge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBzaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHdpdGggbm9uLW9wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBuZXcgQ2xhc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJub25vcHRpb25hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlOiBvbGRTaGFwZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBvbGRTaGFwZSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0ZSB3aXRoIG5vbi1vcHRpb25hbFxuICAgICAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gbmV3IENsYXNzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHlwZTogb2xkU2hhcGVba2V5XVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgc2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG4vLyBpbnZhbGlkX3R5cGUgfCB0b29fYmlnIHwgdG9vX3NtYWxsIHwgaW52YWxpZF9mb3JtYXQgfCBub3RfbXVsdGlwbGVfb2YgfCB1bnJlY29nbml6ZWRfa2V5cyB8IGludmFsaWRfdW5pb24gfCBpbnZhbGlkX2tleSB8IGludmFsaWRfZWxlbWVudCB8IGludmFsaWRfdmFsdWUgfCBjdXN0b21cbmV4cG9ydCBmdW5jdGlvbiBhYm9ydGVkKHgsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgaWYgKHguYWJvcnRlZCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgZm9yKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IHguaXNzdWVzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgaWYgKHguaXNzdWVzW2ldPy5jb250aW51ZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeElzc3VlcyhwYXRoLCBpc3N1ZXMpIHtcbiAgICByZXR1cm4gaXNzdWVzLm1hcCgoaXNzKT0+e1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGlzcykucGF0aCA/PyAoX2EucGF0aCA9IFtdKTtcbiAgICAgICAgaXNzLnBhdGgudW5zaGlmdChwYXRoKTtcbiAgICAgICAgcmV0dXJuIGlzcztcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogbWVzc2FnZT8ubWVzc2FnZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb25maWcpIHtcbiAgICBjb25zdCBmdWxsID0ge1xuICAgICAgICAuLi5pc3MsXG4gICAgICAgIHBhdGg6IGlzcy5wYXRoID8/IFtdXG4gICAgfTtcbiAgICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAoIWlzcy5tZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB1bndyYXBNZXNzYWdlKGlzcy5pbnN0Py5fem9kLmRlZj8uZXJyb3I/Lihpc3MpKSA/PyB1bndyYXBNZXNzYWdlKGN0eD8uZXJyb3I/Lihpc3MpKSA/PyB1bndyYXBNZXNzYWdlKGNvbmZpZy5jdXN0b21FcnJvcj8uKGlzcykpID8/IHVud3JhcE1lc3NhZ2UoY29uZmlnLmxvY2FsZUVycm9yPy4oaXNzKSkgPz8gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICAgIGZ1bGwubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuICAgIC8vIGRlbGV0ZSAoZnVsbCBhcyBhbnkpLmRlZjtcbiAgICBkZWxldGUgZnVsbC5pbnN0O1xuICAgIGRlbGV0ZSBmdWxsLmNvbnRpbnVlO1xuICAgIGlmICghY3R4Py5yZXBvcnRJbnB1dCkge1xuICAgICAgICBkZWxldGUgZnVsbC5pbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2l6YWJsZU9yaWdpbihpbnB1dCkge1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIFwic2V0XCI7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTWFwKSByZXR1cm4gXCJtYXBcIjtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZSkgcmV0dXJuIFwiZmlsZVwiO1xuICAgIHJldHVybiBcInVua25vd25cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSByZXR1cm4gXCJhcnJheVwiO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInN0cmluZ1wiO1xuICAgIHJldHVybiBcInVua25vd25cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZWRUeXBlKGRhdGEpIHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7XG4gICAgc3dpdGNoKHQpe1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihkYXRhKSA/IFwibmFuXCIgOiBcIm51bWJlclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBkYXRhO1xuICAgICAgICAgICAgICAgIGlmIChvYmogJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgXCJjb25zdHJ1Y3RvclwiIGluIG9iaiAmJiBvYmouY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNzdWUoLi4uYXJncykge1xuICAgIGNvbnN0IFtpc3MsIGlucHV0LCBpbnN0XSA9IGFyZ3M7XG4gICAgaWYgKHR5cGVvZiBpc3MgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGlzcyxcbiAgICAgICAgICAgIGNvZGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXNzXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkVudW0ob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChbaywgX10pPT57XG4gICAgICAgIC8vIHJldHVybiB0cnVlIGlmIE5hTiwgbWVhbmluZyBpdCdzIG5vdCBhIG51bWJlciwgdGh1cyBhIHN0cmluZyBrZXlcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQoaywgMTApKTtcbiAgICB9KS5tYXAoKGVsKT0+ZWxbMV0pO1xufVxuLy8gQ29kZWMgdXRpbGl0eSBmdW5jdGlvbnNcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0KSB7XG4gICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyaW5nLmxlbmd0aCk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGJpbmFyeVN0cmluZy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGJ5dGVzW2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50OEFycmF5VG9CYXNlNjQoYnl0ZXMpIHtcbiAgICBsZXQgYmluYXJ5U3RyaW5nID0gXCJcIjtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICBiaW5hcnlTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBidG9hKGJpbmFyeVN0cmluZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0dXJsVG9VaW50OEFycmF5KGJhc2U2NHVybCkge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJhc2U2NHVybC5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKTtcbiAgICBjb25zdCBwYWRkaW5nID0gXCI9XCIucmVwZWF0KCg0IC0gYmFzZTY0Lmxlbmd0aCAlIDQpICUgNCk7XG4gICAgcmV0dXJuIGJhc2U2NFRvVWludDhBcnJheShiYXNlNjQgKyBwYWRkaW5nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50OEFycmF5VG9CYXNlNjR1cmwoYnl0ZXMpIHtcbiAgICByZXR1cm4gdWludDhBcnJheVRvQmFzZTY0KGJ5dGVzKS5yZXBsYWNlKC9cXCsvZywgXCItXCIpLnJlcGxhY2UoL1xcLy9nLCBcIl9cIikucmVwbGFjZSgvPS9nLCBcIlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoZXhUb1VpbnQ4QXJyYXkoaGV4KSB7XG4gICAgY29uc3QgY2xlYW5IZXggPSBoZXgucmVwbGFjZSgvXjB4LywgXCJcIik7XG4gICAgaWYgKGNsZWFuSGV4Lmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoZXggc3RyaW5nIGxlbmd0aFwiKTtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjbGVhbkhleC5sZW5ndGggLyAyKTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgY2xlYW5IZXgubGVuZ3RoOyBpICs9IDIpe1xuICAgICAgICBieXRlc1tpIC8gMl0gPSBOdW1iZXIucGFyc2VJbnQoY2xlYW5IZXguc2xpY2UoaSwgaSArIDIpLCAxNik7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50OEFycmF5VG9IZXgoYnl0ZXMpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShieXRlcykubWFwKChiKT0+Yi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpO1xufVxuLy8gaW5zdGFuY2VvZlxuZXhwb3J0IGNsYXNzIENsYXNzIHtcbiAgICBjb25zdHJ1Y3RvciguLi5fYXJncyl7fVxufVxuIiwgImltcG9ydCB7ICRjb25zdHJ1Y3RvciB9IGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuY29uc3QgaW5pdGlhbGl6ZXIgPSAoaW5zdCwgZGVmKT0+e1xuICAgIGluc3QubmFtZSA9IFwiJFpvZEVycm9yXCI7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiX3pvZFwiLCB7XG4gICAgICAgIHZhbHVlOiBpbnN0Ll96b2QsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiaXNzdWVzXCIsIHtcbiAgICAgICAgdmFsdWU6IGRlZixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICBpbnN0Lm1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShkZWYsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJ0b1N0cmluZ1wiLCB7XG4gICAgICAgIHZhbHVlOiAoKT0+aW5zdC5tZXNzYWdlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCAkWm9kRXJyb3IgPSAkY29uc3RydWN0b3IoXCIkWm9kRXJyb3JcIiwgaW5pdGlhbGl6ZXIpO1xuZXhwb3J0IGNvbnN0ICRab2RSZWFsRXJyb3IgPSAkY29uc3RydWN0b3IoXCIkWm9kRXJyb3JcIiwgaW5pdGlhbGl6ZXIsIHtcbiAgICBQYXJlbnQ6IEVycm9yXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuRXJyb3IoZXJyb3IsIG1hcHBlciA9IChpc3N1ZSk9Pmlzc3VlLm1lc3NhZ2UpIHtcbiAgICBjb25zdCBmaWVsZEVycm9ycyA9IHt9O1xuICAgIGNvbnN0IGZvcm1FcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICBpZiAoc3ViLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dID0gZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dIHx8IFtdO1xuICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybUVycm9ycy5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtRXJyb3JzLFxuICAgICAgICBmaWVsZEVycm9yc1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyb3IsIG1hcHBlciA9IChpc3N1ZSk9Pmlzc3VlLm1lc3NhZ2UpIHtcbiAgICBjb25zdCBmaWVsZEVycm9ycyA9IHtcbiAgICAgICAgX2Vycm9yczogW11cbiAgICB9O1xuICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IChlcnJvcik9PntcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiICYmIGlzc3VlLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpc3N1ZS5lcnJvcnMubWFwKChpc3N1ZXMpPT5wcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2tleVwiKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBpc3N1ZS5pc3N1ZXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2VsZW1lbnRcIikge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogaXNzdWUuaXNzdWVzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLnBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnMuX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgY3VyciA9IGZpZWxkRXJyb3JzO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZShpIDwgaXNzdWUucGF0aC5sZW5ndGgpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGlzc3VlLnBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gaXNzdWUucGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXJyb3JzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lcnJvcnM6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0uX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcHJvY2Vzc0Vycm9yKGVycm9yKTtcbiAgICByZXR1cm4gZmllbGRFcnJvcnM7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJlZWlmeUVycm9yKGVycm9yLCBtYXBwZXIgPSAoaXNzdWUpPT5pc3N1ZS5tZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBlcnJvcnM6IFtdXG4gICAgfTtcbiAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSAoZXJyb3IsIHBhdGggPSBbXSk9PntcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiICYmIGlzc3VlLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyByZWd1bGFyIHVuaW9uIGVycm9yXG4gICAgICAgICAgICAgICAgaXNzdWUuZXJyb3JzLm1hcCgoaXNzdWVzKT0+cHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9LCBpc3N1ZS5wYXRoKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9rZXlcIikge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogaXNzdWUuaXNzdWVzXG4gICAgICAgICAgICAgICAgfSwgaXNzdWUucGF0aCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9lbGVtZW50XCIpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGlzc3VlLmlzc3Vlc1xuICAgICAgICAgICAgICAgIH0sIGlzc3VlLnBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmdWxscGF0aCA9IFtcbiAgICAgICAgICAgICAgICAgICAgLi4ucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgLi4uaXNzdWUucGF0aFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKGZ1bGxwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY3VyciA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUoaSA8IGZ1bGxwYXRoLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZnVsbHBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gZnVsbHBhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyci5wcm9wZXJ0aWVzID8/IChjdXJyLnByb3BlcnRpZXMgPSB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoX2EgPSBjdXJyLnByb3BlcnRpZXMpW2VsXSA/PyAoX2FbZWxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnIucHJvcGVydGllc1tlbF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyLml0ZW1zID8/IChjdXJyLml0ZW1zID0gW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgKF9iID0gY3Vyci5pdGVtcylbZWxdID8/IChfYltlbF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5pdGVtc1tlbF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyLmVycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKiBGb3JtYXQgYSBab2RFcnJvciBhcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBpbiB0aGUgZm9sbG93aW5nIGZvcm0uXG4gKlxuICogRnJvbVxuICpcbiAqIGBgYHRzXG4gKiBab2RFcnJvciB7XG4gKiAgIGlzc3VlczogW1xuICogICAgIHtcbiAqICAgICAgIGV4cGVjdGVkOiAnc3RyaW5nJyxcbiAqICAgICAgIGNvZGU6ICdpbnZhbGlkX3R5cGUnLFxuICogICAgICAgcGF0aDogWyAndXNlcm5hbWUnIF0sXG4gKiAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgc3RyaW5nJ1xuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgZXhwZWN0ZWQ6ICdudW1iZXInLFxuICogICAgICAgY29kZTogJ2ludmFsaWRfdHlwZScsXG4gKiAgICAgICBwYXRoOiBbICdmYXZvcml0ZU51bWJlcnMnLCAxIF0sXG4gKiAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgbnVtYmVyJ1xuICogICAgIH1cbiAqICAgXTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIHRvXG4gKlxuICogYGBgXG4gKiB1c2VybmFtZVxuICogICBcdTI3MTYgRXhwZWN0ZWQgbnVtYmVyLCByZWNlaXZlZCBzdHJpbmcgYXQgXCJ1c2VybmFtZVxuICogZmF2b3JpdGVOdW1iZXJzWzBdXG4gKiAgIFx1MjcxNiBJbnZhbGlkIGlucHV0OiBleHBlY3RlZCBudW1iZXJcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiB0b0RvdFBhdGgoX3BhdGgpIHtcbiAgICBjb25zdCBzZWdzID0gW107XG4gICAgY29uc3QgcGF0aCA9IF9wYXRoLm1hcCgoc2VnKT0+dHlwZW9mIHNlZyA9PT0gXCJvYmplY3RcIiA/IHNlZy5rZXkgOiBzZWcpO1xuICAgIGZvciAoY29uc3Qgc2VnIG9mIHBhdGgpe1xuICAgICAgICBpZiAodHlwZW9mIHNlZyA9PT0gXCJudW1iZXJcIikgc2Vncy5wdXNoKGBbJHtzZWd9XWApO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2VnID09PSBcInN5bWJvbFwiKSBzZWdzLnB1c2goYFske0pTT04uc3RyaW5naWZ5KFN0cmluZyhzZWcpKX1dYCk7XG4gICAgICAgIGVsc2UgaWYgKC9bXlxcdyRdLy50ZXN0KHNlZykpIHNlZ3MucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoc2VnKX1dYCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNlZ3MubGVuZ3RoKSBzZWdzLnB1c2goXCIuXCIpO1xuICAgICAgICAgICAgc2Vncy5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlZ3Muam9pbihcIlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcmV0dGlmeUVycm9yKGVycm9yKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAvLyBzb3J0IGJ5IHBhdGggbGVuZ3RoXG4gICAgY29uc3QgaXNzdWVzID0gW1xuICAgICAgICAuLi5lcnJvci5pc3N1ZXNcbiAgICBdLnNvcnQoKGEsIGIpPT4oYS5wYXRoID8/IFtdKS5sZW5ndGggLSAoYi5wYXRoID8/IFtdKS5sZW5ndGgpO1xuICAgIC8vIFByb2Nlc3MgZWFjaCBpc3N1ZVxuICAgIGZvciAoY29uc3QgaXNzdWUgb2YgaXNzdWVzKXtcbiAgICAgICAgbGluZXMucHVzaChgXHUyNzE2ICR7aXNzdWUubWVzc2FnZX1gKTtcbiAgICAgICAgaWYgKGlzc3VlLnBhdGg/Lmxlbmd0aCkgbGluZXMucHVzaChgICBcdTIxOTIgYXQgJHt0b0RvdFBhdGgoaXNzdWUucGF0aCl9YCk7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgTWFwIHRvIGZvcm1hdHRlZCBzdHJpbmdcbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn1cbiIsICJpbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuZXhwb3J0IGNvbnN0IF9wYXJzZSA9IChfRXJyKT0+KHNjaGVtYSwgdmFsdWUsIF9jdHgsIF9wYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyAoX3BhcmFtcz8uRXJyID8/IF9FcnIpKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSk7XG4gICAgICAgICAgICB1dGlsLmNhcHR1cmVTdGFja1RyYWNlKGUsIF9wYXJhbXM/LmNhbGxlZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBwYXJzZSA9IC8qIEBfX1BVUkVfXyovIF9wYXJzZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3BhcnNlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4LCBwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IChwYXJhbXM/LkVyciA/PyBfRXJyKShyZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSkpO1xuICAgICAgICAgICAgdXRpbC5jYXB0dXJlU3RhY2tUcmFjZShlLCBwYXJhbXM/LmNhbGxlZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBwYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3BhcnNlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlUGFyc2UgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8ge1xuICAgICAgICAgICAgLi4uX2N0eCxcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc3N1ZXMubGVuZ3RoID8ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbmV3IChfRXJyID8/IGVycm9ycy4kWm9kRXJyb3IpKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSlcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiByZXN1bHQudmFsdWVcbiAgICAgICAgfTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVQYXJzZSA9IC8qIEBfX1BVUkVfXyovIF9zYWZlUGFyc2UoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlUGFyc2VBc3luYyA9IChfRXJyKT0+YXN5bmMgKHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc3N1ZXMubGVuZ3RoID8ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbmV3IF9FcnIocmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IHJlc3VsdC52YWx1ZVxuICAgICAgICB9O1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18qLyBfc2FmZVBhcnNlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9lbmNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfcGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IC8qIEBfX1BVUkVfXyovIF9lbmNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9kZWNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3BhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3QgZGVjb2RlID0gLyogQF9fUFVSRV9fKi8gX2RlY29kZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX2VuY29kZUFzeW5jID0gKF9FcnIpPT5hc3luYyAoc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3BhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGVuY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX2VuY29kZUFzeW5jKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfZGVjb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3BhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBkZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9kZWNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3NhZmVFbmNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIGN0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRW5jb2RlID0gLyogQF9fUFVSRV9fKi8gX3NhZmVFbmNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRGVjb2RlID0gKF9FcnIpPT4oc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgcmV0dXJuIF9zYWZlUGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlID0gLyogQF9fUFVSRV9fKi8gX3NhZmVEZWNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRW5jb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9zYWZlRW5jb2RlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRGVjb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3NhZmVQYXJzZUFzeW5jKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZURlY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3NhZmVEZWNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG4iLCAiaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi91dGlsLmpzXCI7XG5leHBvcnQgY29uc3QgY3VpZCA9IC9eW2NDXVteXFxzLV17OCx9JC87XG5leHBvcnQgY29uc3QgY3VpZDIgPSAvXlswLTlhLXpdKyQvO1xuZXhwb3J0IGNvbnN0IHVsaWQgPSAvXlswLTlBLUhKS01OUC1UVi1aYS1oamttbnAtdHYtel17MjZ9JC87XG5leHBvcnQgY29uc3QgeGlkID0gL15bMC05YS12QS1WXXsyMH0kLztcbmV4cG9ydCBjb25zdCBrc3VpZCA9IC9eW0EtWmEtejAtOV17Mjd9JC87XG5leHBvcnQgY29uc3QgbmFub2lkID0gL15bYS16QS1aMC05Xy1dezIxfSQvO1xuLyoqIElTTyA4NjAxLTEgZHVyYXRpb24gcmVnZXguIERvZXMgbm90IHN1cHBvcnQgdGhlIDg2MDEtMiBleHRlbnNpb25zIGxpa2UgbmVnYXRpdmUgZHVyYXRpb25zIG9yIGZyYWN0aW9uYWwvbmVnYXRpdmUgY29tcG9uZW50cy4gKi8gZXhwb3J0IGNvbnN0IGR1cmF0aW9uID0gL15QKD86KFxcZCtXKXwoPyEuKlcpKD89XFxkfFRcXGQpKFxcZCtZKT8oXFxkK00pPyhcXGQrRCk/KFQoPz1cXGQpKFxcZCtIKT8oXFxkK00pPyhcXGQrKFsuLF1cXGQrKT9TKT8pPykkLztcbi8qKiBJbXBsZW1lbnRzIElTTyA4NjAxLTIgZXh0ZW5zaW9ucyBsaWtlIGV4cGxpY2l0ICstIHByZWZpeGVzLCBtaXhpbmcgd2Vla3Mgd2l0aCBvdGhlciB1bml0cywgYW5kIGZyYWN0aW9uYWwvbmVnYXRpdmUgY29tcG9uZW50cy4gKi8gZXhwb3J0IGNvbnN0IGV4dGVuZGVkRHVyYXRpb24gPSAvXlstK10/UCg/ISQpKD86KD86Wy0rXT9cXGQrWSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtZJCkpPyg/Oig/OlstK10/XFxkK00pfCg/OlstK10/XFxkK1suLF1cXGQrTSQpKT8oPzooPzpbLStdP1xcZCtXKXwoPzpbLStdP1xcZCtbLixdXFxkK1ckKSk/KD86KD86Wy0rXT9cXGQrRCl8KD86Wy0rXT9cXGQrWy4sXVxcZCtEJCkpPyg/OlQoPz1bXFxkKy1dKSg/Oig/OlstK10/XFxkK0gpfCg/OlstK10/XFxkK1suLF1cXGQrSCQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86Wy0rXT9cXGQrKD86Wy4sXVxcZCspP1MpPyk/PyQvO1xuLyoqIEEgcmVnZXggZm9yIGFueSBVVUlELWxpa2UgaWRlbnRpZmllcjogOC00LTQtNC0xMiBoZXggcGF0dGVybiAqLyBleHBvcnQgY29uc3QgZ3VpZCA9IC9eKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSkkLztcbi8qKiBSZXR1cm5zIGEgcmVnZXggZm9yIHZhbGlkYXRpbmcgYW4gUkZDIDk1NjIvNDEyMiBVVUlELlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIE9wdGlvbmFsbHkgc3BlY2lmeSBhIHZlcnNpb24gMS04LiBJZiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZCwgYWxsIHZlcnNpb25zIGFyZSBzdXBwb3J0ZWQuICovIGV4cG9ydCBjb25zdCB1dWlkID0gKHZlcnNpb24pPT57XG4gICAgaWYgKCF2ZXJzaW9uKSByZXR1cm4gL14oWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzEtOF1bMC05YS1mQS1GXXszfS1bODlhYkFCXVswLTlhLWZBLUZdezN9LVswLTlhLWZBLUZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmKSQvO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LSR7dmVyc2lvbn1bMC05YS1mQS1GXXszfS1bODlhYkFCXVswLTlhLWZBLUZdezN9LVswLTlhLWZBLUZdezEyfSkkYCk7XG59O1xuZXhwb3J0IGNvbnN0IHV1aWQ0ID0gLypAX19QVVJFX18qLyB1dWlkKDQpO1xuZXhwb3J0IGNvbnN0IHV1aWQ2ID0gLypAX19QVVJFX18qLyB1dWlkKDYpO1xuZXhwb3J0IGNvbnN0IHV1aWQ3ID0gLypAX19QVVJFX18qLyB1dWlkKDcpO1xuLyoqIFByYWN0aWNhbCBlbWFpbCB2YWxpZGF0aW9uICovIGV4cG9ydCBjb25zdCBlbWFpbCA9IC9eKD8hXFwuKSg/IS4qXFwuXFwuKShbQS1aYS16MC05XycrXFwtXFwuXSopW0EtWmEtejAtOV8rLV1AKFtBLVphLXowLTldW0EtWmEtejAtOVxcLV0qXFwuKStbQS1aYS16XXsyLH0kLztcbi8qKiBFcXVpdmFsZW50IHRvIHRoZSBIVE1MNSBpbnB1dFt0eXBlPWVtYWlsXSB2YWxpZGF0aW9uIGltcGxlbWVudGVkIGJ5IGJyb3dzZXJzLiBTb3VyY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9lbWFpbCAqLyBleHBvcnQgY29uc3QgaHRtbDVFbWFpbCA9IC9eW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSokLztcbi8qKiBUaGUgY2xhc3NpYyBlbWFpbHJlZ2V4LmNvbSByZWdleCBmb3IgUkZDIDUzMjItY29tcGxpYW50IGVtYWlscyAqLyBleHBvcnQgY29uc3QgcmZjNTMyMkVtYWlsID0gL14oKFtePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC87XG4vKiogQSBsb29zZSByZWdleCB0aGF0IGFsbG93cyBVbmljb2RlIGNoYXJhY3RlcnMsIGVuZm9yY2VzIGxlbmd0aCBsaW1pdHMsIGFuZCB0aGF0J3MgYWJvdXQgaXQuICovIGV4cG9ydCBjb25zdCB1bmljb2RlRW1haWwgPSAvXlteXFxzQFwiXXsxLDY0fUBbXlxcc0BdezEsMjU1fSQvdTtcbmV4cG9ydCBjb25zdCBpZG5FbWFpbCA9IHVuaWNvZGVFbWFpbDtcbmV4cG9ydCBjb25zdCBicm93c2VyRW1haWwgPSAvXlthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC87XG4vLyBmcm9tIGh0dHBzOi8vdGhla2V2aW5zY290dC5jb20vZW1vamlzLWluLWphdmFzY3JpcHQvI3dyaXRpbmctYS1yZWd1bGFyLWV4cHJlc3Npb25cbmNvbnN0IF9lbW9qaSA9IGBeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7XG5leHBvcnQgZnVuY3Rpb24gZW1vamkoKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoX2Vtb2ppLCBcInVcIik7XG59XG5leHBvcnQgY29uc3QgaXB2NCA9IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC87XG5leHBvcnQgY29uc3QgaXB2NiA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318OikpJC87XG5leHBvcnQgY29uc3QgbWFjID0gKGRlbGltaXRlcik9PntcbiAgICBjb25zdCBlc2NhcGVkRGVsaW0gPSB1dGlsLmVzY2FwZVJlZ2V4KGRlbGltaXRlciA/PyBcIjpcIik7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4oPzpbMC05QS1GXXsyfSR7ZXNjYXBlZERlbGltfSl7NX1bMC05QS1GXXsyfSR8Xig/OlswLTlhLWZdezJ9JHtlc2NhcGVkRGVsaW19KXs1fVswLTlhLWZdezJ9JGApO1xufTtcbmV4cG9ydCBjb25zdCBjaWRydjQgPSAvXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLyhbMC05XXxbMS0yXVswLTldfDNbMC0yXSkkLztcbmV4cG9ydCBjb25zdCBjaWRydjYgPSAvXigoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXw6OnwoWzAtOWEtZkEtRl17MSw0fSk/OjooWzAtOWEtZkEtRl17MSw0fTo/KXswLDZ9KVxcLygxMlswLThdfDFbMDFdWzAtOV18WzEtOV0/WzAtOV0pJC87XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83ODYwMzkyL2RldGVybWluZS1pZi1zdHJpbmctaXMtaW4tYmFzZTY0LXVzaW5nLWphdmFzY3JpcHRcbmV4cG9ydCBjb25zdCBiYXNlNjQgPSAvXiR8Xig/OlswLTlhLXpBLVorL117NH0pKig/Oig/OlswLTlhLXpBLVorL117Mn09PSl8KD86WzAtOWEtekEtWisvXXszfT0pKT8kLztcbmV4cG9ydCBjb25zdCBiYXNlNjR1cmwgPSAvXltBLVphLXowLTlfLV0qJC87XG4vLyBiYXNlZCBvbiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDYxNzkvcmVndWxhci1leHByZXNzaW9uLXRvLW1hdGNoLWRucy1ob3N0bmFtZS1vci1pcC1hZGRyZXNzXG4vLyBleHBvcnQgY29uc3QgaG9zdG5hbWU6IFJlZ0V4cCA9IC9eKFthLXpBLVowLTktXStcXC4pKlthLXpBLVowLTktXSskLztcbmV4cG9ydCBjb25zdCBob3N0bmFtZSA9IC9eKD89LnsxLDI1M31cXC4/JClbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlstMC05YS16QS1aXXswLDYxfVswLTlhLXpBLVpdKT8pKlxcLj8kLztcbmV4cG9ydCBjb25zdCBkb21haW4gPSAvXihbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT9cXC4pK1thLXpBLVpdezIsfSQvO1xuLy8gaHR0cHM6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy92YWxpZGF0ZS1waG9uZS1udW1iZXIjcjQtMyAocmVnZXggc2FucyBzcGFjZXMpXG4vLyBFLjE2NDogbGVhZGluZyBkaWdpdCBtdXN0IGJlIDEtOTsgdG90YWwgZGlnaXRzIChleGNsdWRpbmcgJysnKSBiZXR3ZWVuIDctMTVcbmV4cG9ydCBjb25zdCBlMTY0ID0gL15cXCtbMS05XVxcZHs2LDE0fSQvO1xuLy8gY29uc3QgZGF0ZVNvdXJjZSA9IGAoKFxcXFxkXFxcXGRbMjQ2OF1bMDQ4XXxcXFxcZFxcXFxkWzEzNTc5XVsyNl18XFxcXGRcXFxcZDBbNDhdfFswMjQ2OF1bMDQ4XTAwfFsxMzU3OV1bMjZdMDApLTAyLTI5fFxcXFxkezR9LSgoMFsxMzU3OF18MVswMl0pLSgwWzEtOV18WzEyXVxcXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXFxcZHwzMCl8KDAyKS0oMFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuY29uc3QgZGF0ZVNvdXJjZSA9IGAoPzooPzpcXFxcZFxcXFxkWzI0NjhdWzA0OF18XFxcXGRcXFxcZFsxMzU3OV1bMjZdfFxcXFxkXFxcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXFxcZHs0fS0oPzooPzowWzEzNTc4XXwxWzAyXSktKD86MFsxLTldfFsxMl1cXFxcZHwzWzAxXSl8KD86MFs0NjldfDExKS0oPzowWzEtOV18WzEyXVxcXFxkfDMwKXwoPzowMiktKD86MFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuZXhwb3J0IGNvbnN0IGRhdGUgPSAvKkBfX1BVUkVfXyovIG5ldyBSZWdFeHAoYF4ke2RhdGVTb3VyY2V9JGApO1xuZnVuY3Rpb24gdGltZVNvdXJjZShhcmdzKSB7XG4gICAgY29uc3QgaGhtbSA9IGAoPzpbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkYDtcbiAgICBjb25zdCByZWdleCA9IHR5cGVvZiBhcmdzLnByZWNpc2lvbiA9PT0gXCJudW1iZXJcIiA/IGFyZ3MucHJlY2lzaW9uID09PSAtMSA/IGAke2hobW19YCA6IGFyZ3MucHJlY2lzaW9uID09PSAwID8gYCR7aGhtbX06WzAtNV1cXFxcZGAgOiBgJHtoaG1tfTpbMC01XVxcXFxkXFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1gIDogYCR7aGhtbX0oPzo6WzAtNV1cXFxcZCg/OlxcXFwuXFxcXGQrKT8pP2A7XG4gICAgcmV0dXJuIHJlZ2V4O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRpbWUoYXJncykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHt0aW1lU291cmNlKGFyZ3MpfSRgKTtcbn1cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzE0MzIzMVxuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lKGFyZ3MpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZVNvdXJjZSh7XG4gICAgICAgIHByZWNpc2lvbjogYXJncy5wcmVjaXNpb25cbiAgICB9KTtcbiAgICBjb25zdCBvcHRzID0gW1xuICAgICAgICBcIlpcIlxuICAgIF07XG4gICAgaWYgKGFyZ3MubG9jYWwpIG9wdHMucHVzaChcIlwiKTtcbiAgICAvLyBpZiAoYXJncy5vZmZzZXQpIG9wdHMucHVzaChgKFsrLV1cXFxcZHsyfTpcXFxcZHsyfSlgKTtcbiAgICBpZiAoYXJncy5vZmZzZXQpIG9wdHMucHVzaChgKFsrLV0oPzpbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkKWApO1xuICAgIGNvbnN0IHRpbWVSZWdleCA9IGAke3RpbWV9KD86JHtvcHRzLmpvaW4oXCJ8XCIpfSlgO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtkYXRlU291cmNlfVQoPzoke3RpbWVSZWdleH0pJGApO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZyA9IChwYXJhbXMpPT57XG4gICAgY29uc3QgcmVnZXggPSBwYXJhbXMgPyBgW1xcXFxzXFxcXFNdeyR7cGFyYW1zPy5taW5pbXVtID8/IDB9LCR7cGFyYW1zPy5tYXhpbXVtID8/IFwiXCJ9fWAgOiBgW1xcXFxzXFxcXFNdKmA7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4fSRgKTtcbn07XG5leHBvcnQgY29uc3QgYmlnaW50ID0gL14tP1xcZCtuPyQvO1xuZXhwb3J0IGNvbnN0IGludGVnZXIgPSAvXi0/XFxkKyQvO1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IC9eLT9cXGQrKD86XFwuXFxkKyk/JC87XG5leHBvcnQgY29uc3QgYm9vbGVhbiA9IC9eKD86dHJ1ZXxmYWxzZSkkL2k7XG5jb25zdCBfbnVsbCA9IC9ebnVsbCQvaTtcbmV4cG9ydCB7IF9udWxsIGFzIG51bGwgfTtcbmNvbnN0IF91bmRlZmluZWQgPSAvXnVuZGVmaW5lZCQvaTtcbmV4cG9ydCB7IF91bmRlZmluZWQgYXMgdW5kZWZpbmVkIH07XG4vLyByZWdleCBmb3Igc3RyaW5nIHdpdGggbm8gdXBwZXJjYXNlIGxldHRlcnNcbmV4cG9ydCBjb25zdCBsb3dlcmNhc2UgPSAvXlteQS1aXSokLztcbi8vIHJlZ2V4IGZvciBzdHJpbmcgd2l0aCBubyBsb3dlcmNhc2UgbGV0dGVyc1xuZXhwb3J0IGNvbnN0IHVwcGVyY2FzZSA9IC9eW15hLXpdKiQvO1xuLy8gcmVnZXggZm9yIGhleGFkZWNpbWFsIHN0cmluZ3MgKGFueSBsZW5ndGgpXG5leHBvcnQgY29uc3QgaGV4ID0gL15bMC05YS1mQS1GXSokLztcbi8vIEhhc2ggcmVnZXhlcyBmb3IgZGlmZmVyZW50IGFsZ29yaXRobXMgYW5kIGVuY29kaW5nc1xuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBiYXNlNjQgcmVnZXggd2l0aCBleGFjdCBsZW5ndGggYW5kIHBhZGRpbmdcbmZ1bmN0aW9uIGZpeGVkQmFzZTY0KGJvZHlMZW5ndGgsIHBhZGRpbmcpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXltBLVphLXowLTkrL117JHtib2R5TGVuZ3RofX0ke3BhZGRpbmd9JGApO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBiYXNlNjR1cmwgcmVnZXggd2l0aCBleGFjdCBsZW5ndGggKG5vIHBhZGRpbmcpXG5mdW5jdGlvbiBmaXhlZEJhc2U2NHVybChsZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXltBLVphLXowLTlfLV17JHtsZW5ndGh9fSRgKTtcbn1cbi8vIE1ENSAoMTYgYnl0ZXMpOiBiYXNlNjQgPSAyNCBjaGFycyB0b3RhbCAoMjIgKyBcIj09XCIpXG5leHBvcnQgY29uc3QgbWQ1X2hleCA9IC9eWzAtOWEtZkEtRl17MzJ9JC87XG5leHBvcnQgY29uc3QgbWQ1X2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoMjIsIFwiPT1cIik7XG5leHBvcnQgY29uc3QgbWQ1X2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoMjIpO1xuLy8gU0hBMSAoMjAgYnl0ZXMpOiBiYXNlNjQgPSAyOCBjaGFycyB0b3RhbCAoMjcgKyBcIj1cIilcbmV4cG9ydCBjb25zdCBzaGExX2hleCA9IC9eWzAtOWEtZkEtRl17NDB9JC87XG5leHBvcnQgY29uc3Qgc2hhMV9iYXNlNjQgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0KDI3LCBcIj1cIik7XG5leHBvcnQgY29uc3Qgc2hhMV9iYXNlNjR1cmwgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0dXJsKDI3KTtcbi8vIFNIQTI1NiAoMzIgYnl0ZXMpOiBiYXNlNjQgPSA0NCBjaGFycyB0b3RhbCAoNDMgKyBcIj1cIilcbmV4cG9ydCBjb25zdCBzaGEyNTZfaGV4ID0gL15bMC05YS1mQS1GXXs2NH0kLztcbmV4cG9ydCBjb25zdCBzaGEyNTZfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCg0MywgXCI9XCIpO1xuZXhwb3J0IGNvbnN0IHNoYTI1Nl9iYXNlNjR1cmwgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0dXJsKDQzKTtcbi8vIFNIQTM4NCAoNDggYnl0ZXMpOiBiYXNlNjQgPSA2NCBjaGFycyB0b3RhbCAobm8gcGFkZGluZylcbmV4cG9ydCBjb25zdCBzaGEzODRfaGV4ID0gL15bMC05YS1mQS1GXXs5Nn0kLztcbmV4cG9ydCBjb25zdCBzaGEzODRfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCg2NCwgXCJcIik7XG5leHBvcnQgY29uc3Qgc2hhMzg0X2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoNjQpO1xuLy8gU0hBNTEyICg2NCBieXRlcyk6IGJhc2U2NCA9IDg4IGNoYXJzIHRvdGFsICg4NiArIFwiPT1cIilcbmV4cG9ydCBjb25zdCBzaGE1MTJfaGV4ID0gL15bMC05YS1mQS1GXXsxMjh9JC87XG5leHBvcnQgY29uc3Qgc2hhNTEyX2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoODYsIFwiPT1cIik7XG5leHBvcnQgY29uc3Qgc2hhNTEyX2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoODYpO1xuIiwgIi8vIGltcG9ydCB7ICRab2RUeXBlIH0gZnJvbSBcIi4vc2NoZW1hcy5qc1wiO1xuaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi9jb3JlLmpzXCI7XG5pbXBvcnQgKiBhcyByZWdleGVzIGZyb20gXCIuL3JlZ2V4ZXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVjayA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgaW5zdC5fem9kID8/IChpbnN0Ll96b2QgPSB7fSk7XG4gICAgaW5zdC5fem9kLmRlZiA9IGRlZjtcbiAgICAoX2EgPSBpbnN0Ll96b2QpLm9uYXR0YWNoID8/IChfYS5vbmF0dGFjaCA9IFtdKTtcbn0pO1xuY29uc3QgbnVtZXJpY09yaWdpbk1hcCA9IHtcbiAgICBudW1iZXI6IFwibnVtYmVyXCIsXG4gICAgYmlnaW50OiBcImJpZ2ludFwiLFxuICAgIG9iamVjdDogXCJkYXRlXCJcbn07XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTGVzc1RoYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTGVzc1RoYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG9yaWdpbiA9IG51bWVyaWNPcmlnaW5NYXBbdHlwZW9mIGRlZi52YWx1ZV07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGNvbnN0IGN1cnIgPSAoZGVmLmluY2x1c2l2ZSA/IGJhZy5tYXhpbXVtIDogYmFnLmV4Y2x1c2l2ZU1heGltdW0pID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi52YWx1ZSA8IGN1cnIpIHtcbiAgICAgICAgICAgIGlmIChkZWYuaW5jbHVzaXZlKSBiYWcubWF4aW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgICAgIGVsc2UgYmFnLmV4Y2x1c2l2ZU1heGltdW0gPSBkZWYudmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUgPyBwYXlsb2FkLnZhbHVlIDw9IGRlZi52YWx1ZSA6IHBheWxvYWQudmFsdWUgPCBkZWYudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgbWF4aW11bTogdHlwZW9mIGRlZi52YWx1ZSA9PT0gXCJvYmplY3RcIiA/IGRlZi52YWx1ZS5nZXRUaW1lKCkgOiBkZWYudmFsdWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZGVmLmluY2x1c2l2ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrR3JlYXRlclRoYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrR3JlYXRlclRoYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG9yaWdpbiA9IG51bWVyaWNPcmlnaW5NYXBbdHlwZW9mIGRlZi52YWx1ZV07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGNvbnN0IGN1cnIgPSAoZGVmLmluY2x1c2l2ZSA/IGJhZy5taW5pbXVtIDogYmFnLmV4Y2x1c2l2ZU1pbmltdW0pID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi52YWx1ZSA+IGN1cnIpIHtcbiAgICAgICAgICAgIGlmIChkZWYuaW5jbHVzaXZlKSBiYWcubWluaW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgICAgIGVsc2UgYmFnLmV4Y2x1c2l2ZU1pbmltdW0gPSBkZWYudmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUgPyBwYXlsb2FkLnZhbHVlID49IGRlZi52YWx1ZSA6IHBheWxvYWQudmFsdWUgPiBkZWYudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICBtaW5pbXVtOiB0eXBlb2YgZGVmLnZhbHVlID09PSBcIm9iamVjdFwiID8gZGVmLnZhbHVlLmdldFRpbWUoKSA6IGRlZi52YWx1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBkZWYuaW5jbHVzaXZlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNdWx0aXBsZU9mID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja011bHRpcGxlT2ZcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGluc3QuX3pvZC5iYWcpLm11bHRpcGxlT2YgPz8gKF9hLm11bHRpcGxlT2YgPSBkZWYudmFsdWUpO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgIT09IHR5cGVvZiBkZWYudmFsdWUpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBtaXggbnVtYmVyIGFuZCBiaWdpbnQgaW4gbXVsdGlwbGVfb2YgY2hlY2suXCIpO1xuICAgICAgICBjb25zdCBpc011bHRpcGxlID0gdHlwZW9mIHBheWxvYWQudmFsdWUgPT09IFwiYmlnaW50XCIgPyBwYXlsb2FkLnZhbHVlICUgZGVmLnZhbHVlID09PSBCaWdJbnQoMCkgOiB1dGlsLmZsb2F0U2FmZVJlbWFpbmRlcihwYXlsb2FkLnZhbHVlLCBkZWYudmFsdWUpID09PSAwO1xuICAgICAgICBpZiAoaXNNdWx0aXBsZSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogdHlwZW9mIHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBjb2RlOiBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICAgICAgICAgICAgZGl2aXNvcjogZGVmLnZhbHVlLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja051bWJlckZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tOdW1iZXJGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG4gICAgZGVmLmZvcm1hdCA9IGRlZi5mb3JtYXQgfHwgXCJmbG9hdDY0XCI7XG4gICAgY29uc3QgaXNJbnQgPSBkZWYuZm9ybWF0Py5pbmNsdWRlcyhcImludFwiKTtcbiAgICBjb25zdCBvcmlnaW4gPSBpc0ludCA/IFwiaW50XCIgOiBcIm51bWJlclwiO1xuICAgIGNvbnN0IFttaW5pbXVtLCBtYXhpbXVtXSA9IHV0aWwuTlVNQkVSX0ZPUk1BVF9SQU5HRVNbZGVmLmZvcm1hdF07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5mb3JtYXQgPSBkZWYuZm9ybWF0O1xuICAgICAgICBiYWcubWluaW11bSA9IG1pbmltdW07XG4gICAgICAgIGJhZy5tYXhpbXVtID0gbWF4aW11bTtcbiAgICAgICAgaWYgKGlzSW50KSBiYWcucGF0dGVybiA9IHJlZ2V4ZXMuaW50ZWdlcjtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoaXNJbnQpIHtcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnZhbGlkX2Zvcm1hdCBpc3N1ZVxuICAgICAgICAgICAgICAgIC8vIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIC8vICAgZXhwZWN0ZWQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICAgICAgLy8gICBmb3JtYXQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICAgICAgLy8gICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgLy8gICBpbnB1dCxcbiAgICAgICAgICAgICAgICAvLyAgIGluc3QsXG4gICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgLy8gaW52YWxpZF90eXBlIGlzc3VlXG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBvcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZGVmLmZvcm1hdCxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIG5vdF9tdWx0aXBsZV9vZiBpc3N1ZVxuICAgICAgICAgICAgLy8gcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAvLyAgIGNvZGU6IFwibm90X211bHRpcGxlX29mXCIsXG4gICAgICAgICAgICAvLyAgIG9yaWdpbjogXCJudW1iZXJcIixcbiAgICAgICAgICAgIC8vICAgaW5wdXQsXG4gICAgICAgICAgICAvLyAgIGluc3QsXG4gICAgICAgICAgICAvLyAgIGRpdmlzb3I6IDEsXG4gICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0b29fYmlnXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnRlZ2VycyBtdXN0IGJlIHdpdGhpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvb19zbWFsbFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnRlZ2VycyBtdXN0IGJlIHdpdGhpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0IDwgbWluaW11bSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgbWluaW11bSxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ID4gbWF4aW11bSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgIG1heGltdW0sXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0JpZ0ludEZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tCaWdJbnRGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG4gICAgY29uc3QgW21pbmltdW0sIG1heGltdW1dID0gdXRpbC5CSUdJTlRfRk9STUFUX1JBTkdFU1tkZWYuZm9ybWF0XTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGRlZi5mb3JtYXQ7XG4gICAgICAgIGJhZy5taW5pbXVtID0gbWluaW11bTtcbiAgICAgICAgYmFnLm1heGltdW0gPSBtYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmIChpbnB1dCA8IG1pbmltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IG1pbmltdW0sXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCA+IG1heGltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICBtYXhpbXVtLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNYXhTaXplID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01heFNpemVcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLnNpemUgIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWF4aW11bSA8IGN1cnIpIGluc3QuX3pvZC5iYWcubWF4aW11bSA9IGRlZi5tYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaXplO1xuICAgICAgICBpZiAoc2l6ZSA8PSBkZWYubWF4aW11bSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogdXRpbC5nZXRTaXphYmxlT3JpZ2luKGlucHV0KSxcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heGltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWluU2l6ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNaW5TaXplXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5zaXplICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGN1cnIgPSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPz8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLm1pbmltdW0gPiBjdXJyKSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPSBkZWYubWluaW11bTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBzaXplID0gaW5wdXQuc2l6ZTtcbiAgICAgICAgaWYgKHNpemUgPj0gZGVmLm1pbmltdW0pIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IHV0aWwuZ2V0U2l6YWJsZU9yaWdpbihpbnB1dCksXG4gICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbmltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrU2l6ZUVxdWFscyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tTaXplRXF1YWxzXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5zaXplICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5taW5pbXVtID0gZGVmLnNpemU7XG4gICAgICAgIGJhZy5tYXhpbXVtID0gZGVmLnNpemU7XG4gICAgICAgIGJhZy5zaXplID0gZGVmLnNpemU7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGlucHV0LnNpemU7XG4gICAgICAgIGlmIChzaXplID09PSBkZWYuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0b29CaWcgPSBzaXplID4gZGVmLnNpemU7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiB1dGlsLmdldFNpemFibGVPcmlnaW4oaW5wdXQpLFxuICAgICAgICAgICAgLi4udG9vQmlnID8ge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5zaXplXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgbWluaW11bTogZGVmLnNpemVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNYXhMZW5ndGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWF4TGVuZ3RoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWF4aW11bSA8IGN1cnIpIGluc3QuX3pvZC5iYWcubWF4aW11bSA9IGRlZi5tYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSBkZWYubWF4aW11bSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcmlnaW4gPSB1dGlsLmdldExlbmd0aGFibGVPcmlnaW4oaW5wdXQpO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heGltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWluTGVuZ3RoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01pbkxlbmd0aFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGN1cnIgPSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPz8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLm1pbmltdW0gPiBjdXJyKSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPSBkZWYubWluaW11bTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPj0gZGVmLm1pbmltdW0pIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdXRpbC5nZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KTtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbmltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTGVuZ3RoRXF1YWxzID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0xlbmd0aEVxdWFsc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5taW5pbXVtID0gZGVmLmxlbmd0aDtcbiAgICAgICAgYmFnLm1heGltdW0gPSBkZWYubGVuZ3RoO1xuICAgICAgICBiYWcubGVuZ3RoID0gZGVmLmxlbmd0aDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPT09IGRlZi5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdXRpbC5nZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KTtcbiAgICAgICAgY29uc3QgdG9vQmlnID0gbGVuZ3RoID4gZGVmLmxlbmd0aDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAuLi50b29CaWcgPyB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLmxlbmd0aFxuICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5sZW5ndGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrU3RyaW5nRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hLCBfYjtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcuZm9ybWF0ID0gZGVmLmZvcm1hdDtcbiAgICAgICAgaWYgKGRlZi5wYXR0ZXJuKSB7XG4gICAgICAgICAgICBiYWcucGF0dGVybnMgPz8gKGJhZy5wYXR0ZXJucyA9IG5ldyBTZXQoKSk7XG4gICAgICAgICAgICBiYWcucGF0dGVybnMuYWRkKGRlZi5wYXR0ZXJuKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChkZWYucGF0dGVybikgKF9hID0gaW5zdC5fem9kKS5jaGVjayA/PyAoX2EuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgZGVmLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKGRlZi5wYXR0ZXJuLnRlc3QocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIC4uLmRlZi5wYXR0ZXJuID8ge1xuICAgICAgICAgICAgICAgIHBhdHRlcm46IGRlZi5wYXR0ZXJuLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0gOiB7fSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBlbHNlIChfYiA9IGluc3QuX3pvZCkuY2hlY2sgPz8gKF9iLmNoZWNrID0gKCk9Pnt9KTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1JlZ2V4ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1JlZ2V4XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgZGVmLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKGRlZi5wYXR0ZXJuLnRlc3QocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwicmVnZXhcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgcGF0dGVybjogZGVmLnBhdHRlcm4udG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTG93ZXJDYXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0xvd2VyQ2FzZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMubG93ZXJjYXNlKTtcbiAgICAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrVXBwZXJDYXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1VwcGVyQ2FzZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXBwZXJjYXNlKTtcbiAgICAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrSW5jbHVkZXMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrSW5jbHVkZXNcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IGVzY2FwZWRSZWdleCA9IHV0aWwuZXNjYXBlUmVnZXgoZGVmLmluY2x1ZGVzKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCh0eXBlb2YgZGVmLnBvc2l0aW9uID09PSBcIm51bWJlclwiID8gYF4ueyR7ZGVmLnBvc2l0aW9ufX0ke2VzY2FwZWRSZWdleH1gIDogZXNjYXBlZFJlZ2V4KTtcbiAgICBkZWYucGF0dGVybiA9IHBhdHRlcm47XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5wYXR0ZXJucyA/PyAoYmFnLnBhdHRlcm5zID0gbmV3IFNldCgpKTtcbiAgICAgICAgYmFnLnBhdHRlcm5zLmFkZChwYXR0ZXJuKTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUuaW5jbHVkZXMoZGVmLmluY2x1ZGVzLCBkZWYucG9zaXRpb24pKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImluY2x1ZGVzXCIsXG4gICAgICAgICAgICBpbmNsdWRlczogZGVmLmluY2x1ZGVzLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1N0YXJ0c1dpdGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrU3RhcnRzV2l0aFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3V0aWwuZXNjYXBlUmVnZXgoZGVmLnByZWZpeCl9LipgKTtcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSBwYXR0ZXJuKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLnBhdHRlcm5zID8/IChiYWcucGF0dGVybnMgPSBuZXcgU2V0KCkpO1xuICAgICAgICBiYWcucGF0dGVybnMuYWRkKHBhdHRlcm4pO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZS5zdGFydHNXaXRoKGRlZi5wcmVmaXgpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcInN0YXJ0c193aXRoXCIsXG4gICAgICAgICAgICBwcmVmaXg6IGRlZi5wcmVmaXgsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrRW5kc1dpdGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrRW5kc1dpdGhcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGAuKiR7dXRpbC5lc2NhcGVSZWdleChkZWYuc3VmZml4KX0kYCk7XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcGF0dGVybik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5wYXR0ZXJucyA/PyAoYmFnLnBhdHRlcm5zID0gbmV3IFNldCgpKTtcbiAgICAgICAgYmFnLnBhdHRlcm5zLmFkZChwYXR0ZXJuKTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUuZW5kc1dpdGgoZGVmLnN1ZmZpeCkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiZW5kc193aXRoXCIsXG4gICAgICAgICAgICBzdWZmaXg6IGRlZi5zdWZmaXgsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8gICAgJFpvZENoZWNrUHJvcGVydHkgICAgLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5mdW5jdGlvbiBoYW5kbGVDaGVja1Byb3BlcnR5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgcHJvcGVydHkpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3Vlcyhwcm9wZXJ0eSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tQcm9wZXJ0eSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tQcm9wZXJ0eVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5zY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IHBheWxvYWQudmFsdWVbZGVmLnByb3BlcnR5XSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwge30pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVDaGVja1Byb3BlcnR5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgZGVmLnByb3BlcnR5KSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlQ2hlY2tQcm9wZXJ0eVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGRlZi5wcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWltZVR5cGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWltZVR5cGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG1pbWVTZXQgPSBuZXcgU2V0KGRlZi5taW1lKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgaW5zdC5fem9kLmJhZy5taW1lID0gZGVmLm1pbWU7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChtaW1lU2V0LmhhcyhwYXlsb2FkLnZhbHVlLnR5cGUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IGRlZi5taW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUudHlwZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrT3ZlcndyaXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja092ZXJ3cml0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYudHgocGF5bG9hZC52YWx1ZSk7XG4gICAgfTtcbn0pO1xuIiwgImV4cG9ydCBjbGFzcyBEb2Mge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MgPSBbXSl7XG4gICAgICAgIHRoaXMuY29udGVudCA9IFtdO1xuICAgICAgICB0aGlzLmluZGVudCA9IDA7XG4gICAgICAgIGlmICh0aGlzKSB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cbiAgICBpbmRlbnRlZChmbikge1xuICAgICAgICB0aGlzLmluZGVudCArPSAxO1xuICAgICAgICBmbih0aGlzKTtcbiAgICAgICAgdGhpcy5pbmRlbnQgLT0gMTtcbiAgICB9XG4gICAgd3JpdGUoYXJnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGFyZyh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uOiBcInN5bmNcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhcmcodGhpcywge1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbjogXCJhc3luY1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZW50ID0gYXJnO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKCh4KT0+eCk7XG4gICAgICAgIGNvbnN0IG1pbkluZGVudCA9IE1hdGgubWluKC4uLmxpbmVzLm1hcCgoeCk9PngubGVuZ3RoIC0geC50cmltU3RhcnQoKS5sZW5ndGgpKTtcbiAgICAgICAgY29uc3QgZGVkZW50ZWQgPSBsaW5lcy5tYXAoKHgpPT54LnNsaWNlKG1pbkluZGVudCkpLm1hcCgoeCk9PlwiIFwiLnJlcGVhdCh0aGlzLmluZGVudCAqIDIpICsgeCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBkZWRlbnRlZCl7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICBjb25zdCBGID0gRnVuY3Rpb247XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzPy5hcmdzO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcz8uY29udGVudCA/PyBbXG4gICAgICAgICAgICBgYFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgICAgICAgIC4uLmNvbnRlbnQubWFwKCh4KT0+YCAgJHt4fWApXG4gICAgICAgIF07XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICAgICAgICByZXR1cm4gbmV3IEYoLi4uYXJncywgbGluZXMuam9pbihcIlxcblwiKSk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCB2ZXJzaW9uID0ge1xuICAgIG1ham9yOiA0LFxuICAgIG1pbm9yOiAzLFxuICAgIHBhdGNoOiA2XG59O1xuIiwgImltcG9ydCAqIGFzIGNoZWNrcyBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4vY29yZS5qc1wiO1xuaW1wb3J0IHsgRG9jIH0gZnJvbSBcIi4vZG9jLmpzXCI7XG5pbXBvcnQgeyBwYXJzZSwgcGFyc2VBc3luYywgc2FmZVBhcnNlLCBzYWZlUGFyc2VBc3luYyB9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5pbXBvcnQgKiBhcyByZWdleGVzIGZyb20gXCIuL3JlZ2V4ZXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL3ZlcnNpb25zLmpzXCI7XG5leHBvcnQgY29uc3QgJFpvZFR5cGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFR5cGVcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgaW5zdCA/PyAoaW5zdCA9IHt9KTtcbiAgICBpbnN0Ll96b2QuZGVmID0gZGVmOyAvLyBzZXQgX2RlZiBwcm9wZXJ0eVxuICAgIGluc3QuX3pvZC5iYWcgPSBpbnN0Ll96b2QuYmFnIHx8IHt9OyAvLyBpbml0aWFsaXplIF9iYWcgb2JqZWN0XG4gICAgaW5zdC5fem9kLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIGNvbnN0IGNoZWNrcyA9IFtcbiAgICAgICAgLi4uaW5zdC5fem9kLmRlZi5jaGVja3MgPz8gW11cbiAgICBdO1xuICAgIC8vIGlmIGluc3QgaXMgaXRzZWxmIGEgY2hlY2tzLiRab2RDaGVjaywgcnVuIGl0IGFzIGEgY2hlY2tcbiAgICBpZiAoaW5zdC5fem9kLnRyYWl0cy5oYXMoXCIkWm9kQ2hlY2tcIikpIHtcbiAgICAgICAgY2hlY2tzLnVuc2hpZnQoaW5zdCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2ggb2YgY2hlY2tzKXtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiBjaC5fem9kLm9uYXR0YWNoKXtcbiAgICAgICAgICAgIGZuKGluc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjaGVja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGRlZmVycmVkIGluaXRpYWxpemVyXG4gICAgICAgIC8vIGluc3QuX3pvZC5wYXJzZSBpcyBub3QgeWV0IGRlZmluZWRcbiAgICAgICAgKF9hID0gaW5zdC5fem9kKS5kZWZlcnJlZCA/PyAoX2EuZGVmZXJyZWQgPSBbXSk7XG4gICAgICAgIGluc3QuX3pvZC5kZWZlcnJlZD8ucHVzaCgoKT0+e1xuICAgICAgICAgICAgaW5zdC5fem9kLnJ1biA9IGluc3QuX3pvZC5wYXJzZTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcnVuQ2hlY2tzID0gKHBheWxvYWQsIGNoZWNrcywgY3R4KT0+e1xuICAgICAgICAgICAgbGV0IGlzQWJvcnRlZCA9IHV0aWwuYWJvcnRlZChwYXlsb2FkKTtcbiAgICAgICAgICAgIGxldCBhc3luY1Jlc3VsdDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2ggb2YgY2hlY2tzKXtcbiAgICAgICAgICAgICAgICBpZiAoY2guX3pvZC5kZWYud2hlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRSdW4gPSBjaC5fem9kLmRlZi53aGVuKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFJ1bikgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJMZW4gPSBwYXlsb2FkLmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgXyA9IGNoLl96b2QuY2hlY2socGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgaWYgKF8gaW5zdGFuY2VvZiBQcm9taXNlICYmIGN0eD8uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhc3luY1Jlc3VsdCB8fCBfIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3VsdCA9IChhc3luY1Jlc3VsdCA/PyBQcm9taXNlLnJlc29sdmUoKSkudGhlbihhc3luYyAoKT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgXztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRMZW4gPSBwYXlsb2FkLmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dExlbiA9PT0gY3VyckxlbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Fib3J0ZWQpIGlzQWJvcnRlZCA9IHV0aWwuYWJvcnRlZChwYXlsb2FkLCBjdXJyTGVuKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dExlbiA9IHBheWxvYWQuaXNzdWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRMZW4gPT09IGN1cnJMZW4pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQWJvcnRlZCkgaXNBYm9ydGVkID0gdXRpbC5hYm9ydGVkKHBheWxvYWQsIGN1cnJMZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhc3luY1Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhc3luY1Jlc3VsdC50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZUNhbmFyeVJlc3VsdCA9IChjYW5hcnksIHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgICAgIC8vIGFib3J0IGlmIHRoZSBjYW5hcnkgaXMgYWJvcnRlZFxuICAgICAgICAgICAgaWYgKHV0aWwuYWJvcnRlZChjYW5hcnkpKSB7XG4gICAgICAgICAgICAgICAgY2FuYXJ5LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYW5hcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBydW4gY2hlY2tzIGZpcnN0LCB0aGVuXG4gICAgICAgICAgICBjb25zdCBjaGVja1Jlc3VsdCA9IHJ1bkNoZWNrcyhwYXlsb2FkLCBjaGVja3MsIGN0eCk7XG4gICAgICAgICAgICBpZiAoY2hlY2tSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5hc3luYyA9PT0gZmFsc2UpIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrUmVzdWx0LnRoZW4oKGNoZWNrUmVzdWx0KT0+aW5zdC5fem9kLnBhcnNlKGNoZWNrUmVzdWx0LCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnN0Ll96b2QucGFyc2UoY2hlY2tSZXN1bHQsIGN0eCk7XG4gICAgICAgIH07XG4gICAgICAgIGluc3QuX3pvZC5ydW4gPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICAgICAgaWYgKGN0eC5za2lwQ2hlY2tzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3QuX3pvZC5wYXJzZShwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgICAgIC8vIHJ1biBjYW5hcnlcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsIHBhc3MgKG5vIGNoZWNrcylcbiAgICAgICAgICAgICAgICBjb25zdCBjYW5hcnkgPSBpbnN0Ll96b2QucGFyc2Uoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBza2lwQ2hlY2tzOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmFyeSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmFyeS50aGVuKChjYW5hcnkpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlQ2FuYXJ5UmVzdWx0KGNhbmFyeSwgcGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVDYW5hcnlSZXN1bHQoY2FuYXJ5LCBwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZm9yd2FyZFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5zdC5fem9kLnBhcnNlKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGlmIChjdHguYXN5bmMgPT09IGZhbHNlKSB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+cnVuQ2hlY2tzKHJlc3VsdCwgY2hlY2tzLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5DaGVja3MocmVzdWx0LCBjaGVja3MsIGN0eCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIExhenkgaW5pdGlhbGl6ZSB+c3RhbmRhcmQgdG8gYXZvaWQgY3JlYXRpbmcgb2JqZWN0cyBmb3IgZXZlcnkgc2NoZW1hXG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QsIFwifnN0YW5kYXJkXCIsICgpPT4oe1xuICAgICAgICAgICAgdmFsaWRhdGU6ICh2YWx1ZSk9PntcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gc2FmZVBhcnNlKGluc3QsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc3VjY2VzcyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlczogci5lcnJvcj8uaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2FmZVBhcnNlQXN5bmMoaW5zdCwgdmFsdWUpLnRoZW4oKHIpPT5yLnN1Y2Nlc3MgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIuZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IHIuZXJyb3I/Lmlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlbmRvcjogXCJ6b2RcIixcbiAgICAgICAgICAgIHZlcnNpb246IDFcbiAgICAgICAgfSkpO1xufSk7XG5leHBvcnQgeyBjbG9uZSB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCBjb25zdCAkWm9kU3RyaW5nID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTdHJpbmdcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSBbXG4gICAgICAgIC4uLmluc3Q/Ll96b2QuYmFnPy5wYXR0ZXJucyA/PyBbXVxuICAgIF0ucG9wKCkgPz8gcmVnZXhlcy5zdHJpbmcoaW5zdC5fem9kLmJhZyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF8pPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IFN0cmluZyhwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBjaGVjayBpbml0aWFsaXphdGlvbiBtdXN0IGNvbWUgZmlyc3RcbiAgICBjaGVja3MuJFpvZENoZWNrU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICAkWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RHVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RHVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5ndWlkKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgaWYgKGRlZi52ZXJzaW9uKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb25NYXAgPSB7XG4gICAgICAgICAgICB2MTogMSxcbiAgICAgICAgICAgIHYyOiAyLFxuICAgICAgICAgICAgdjM6IDMsXG4gICAgICAgICAgICB2NDogNCxcbiAgICAgICAgICAgIHY1OiA1LFxuICAgICAgICAgICAgdjY6IDYsXG4gICAgICAgICAgICB2NzogNyxcbiAgICAgICAgICAgIHY4OiA4XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHYgPSB2ZXJzaW9uTWFwW2RlZi52ZXJzaW9uXTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFVVSUQgdmVyc2lvbjogXCIke2RlZi52ZXJzaW9ufVwiYCk7XG4gICAgICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXVpZCh2KSk7XG4gICAgfSBlbHNlIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXVpZCgpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RFbWFpbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRW1haWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmVtYWlsKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVUkwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVHJpbSB3aGl0ZXNwYWNlIGZyb20gaW5wdXRcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBwYXlsb2FkLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAoZGVmLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICAgICAgZGVmLmhvc3RuYW1lLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWYuaG9zdG5hbWUudGVzdCh1cmwuaG9zdG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnZhbGlkIGhvc3RuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiBkZWYuaG9zdG5hbWUuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZi5wcm90b2NvbCkge1xuICAgICAgICAgICAgICAgIGRlZi5wcm90b2NvbC5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGlmICghZGVmLnByb3RvY29sLnRlc3QodXJsLnByb3RvY29sLmVuZHNXaXRoKFwiOlwiKSA/IHVybC5wcm90b2NvbC5zbGljZSgwLCAtMSkgOiB1cmwucHJvdG9jb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnZhbGlkIHByb3RvY29sXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiBkZWYucHJvdG9jb2wuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0IHRoZSBvdXRwdXQgdmFsdWUgYmFzZWQgb24gbm9ybWFsaXplIGZsYWdcbiAgICAgICAgICAgIGlmIChkZWYubm9ybWFsaXplKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIG5vcm1hbGl6ZWQgVVJMXG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHVybC5ocmVmO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgaW5wdXQgKHRyaW1tZWQpXG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHRyaW1tZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEVtb2ppID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RFbW9qaVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZW1vamkoKSk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTmFub0lEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROYW5vSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLm5hbm9pZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuY3VpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ1VJRDIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENVSUQyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jdWlkMik7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVUxJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVUxJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudWxpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kWElEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RYSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLnhpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kS1NVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEtTVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5rc3VpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVNPRGF0ZVRpbWUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElTT0RhdGVUaW1lXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5kYXRldGltZShkZWYpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJU09EYXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09EYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5kYXRlKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJU09UaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09UaW1lXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy50aW1lKGRlZikpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElTT0R1cmF0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09EdXJhdGlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZHVyYXRpb24pO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElQdjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElQdjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmlwdjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5iYWcuZm9ybWF0ID0gYGlwdjRgO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElQdjYgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElQdjZcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmlwdjYpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5iYWcuZm9ybWF0ID0gYGlwdjZgO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3IFVSTChgaHR0cDovL1ske3BheWxvYWQudmFsdWV9XWApO1xuICAgICAgICAvLyByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiaXB2NlwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RNQUMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE1BQ1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMubWFjKGRlZi5kZWxpbWl0ZXIpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuYmFnLmZvcm1hdCA9IGBtYWNgO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENJRFJ2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ0lEUnY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jaWRydjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENJRFJ2NiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ0lEUnY2XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jaWRydjYpOyAvLyBub3QgdXNlZCBmb3IgdmFsaWRhdGlvblxuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBheWxvYWQudmFsdWUuc3BsaXQoXCIvXCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICBjb25zdCBbYWRkcmVzcywgcHJlZml4XSA9IHBhcnRzO1xuICAgICAgICAgICAgaWYgKCFwcmVmaXgpIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4TnVtID0gTnVtYmVyKHByZWZpeCk7XG4gICAgICAgICAgICBpZiAoYCR7cHJlZml4TnVtfWAgIT09IHByZWZpeCkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICBpZiAocHJlZml4TnVtIDwgMCB8fCBwcmVmaXhOdW0gPiAxMjgpIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3IFVSTChgaHR0cDovL1ske2FkZHJlc3N9XWApO1xuICAgICAgICB9IGNhdGNoICB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImNpZHJ2NlwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgWm9kQmFzZTY0ICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJhc2U2NChkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IFwiXCIpIHJldHVybiB0cnVlO1xuICAgIGlmIChkYXRhLmxlbmd0aCAlIDQgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGF0b2IoZGF0YSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCAkWm9kQmFzZTY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RCYXNlNjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmJhc2U2NCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmJhZy5jb250ZW50RW5jb2RpbmcgPSBcImJhc2U2NFwiO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoaXNWYWxpZEJhc2U2NChwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJiYXNlNjRcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFpvZEJhc2U2NCAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCYXNlNjRVUkwoZGF0YSkge1xuICAgIGlmICghcmVnZXhlcy5iYXNlNjR1cmwudGVzdChkYXRhKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGJhc2U2NCA9IGRhdGEucmVwbGFjZSgvWy1fXS9nLCAoYyk9PmMgPT09IFwiLVwiID8gXCIrXCIgOiBcIi9cIik7XG4gICAgY29uc3QgcGFkZGVkID0gYmFzZTY0LnBhZEVuZChNYXRoLmNlaWwoYmFzZTY0Lmxlbmd0aCAvIDQpICogNCwgXCI9XCIpO1xuICAgIHJldHVybiBpc1ZhbGlkQmFzZTY0KHBhZGRlZCk7XG59XG5leHBvcnQgY29uc3QgJFpvZEJhc2U2NFVSTCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQmFzZTY0VVJMXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5iYXNlNjR1cmwpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5iYWcuY29udGVudEVuY29kaW5nID0gXCJiYXNlNjR1cmxcIjtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGlzVmFsaWRCYXNlNjRVUkwocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEUxNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEUxNjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmUxNjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICBab2RKV1QgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSldUKHRva2VuLCBhbGdvcml0aG0gPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdG9rZW5zUGFydHMgPSB0b2tlbi5zcGxpdChcIi5cIik7XG4gICAgICAgIGlmICh0b2tlbnNQYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgW2hlYWRlcl0gPSB0b2tlbnNQYXJ0cztcbiAgICAgICAgaWYgKCFoZWFkZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBwYXJzZWRIZWFkZXIgPSBKU09OLnBhcnNlKGF0b2IoaGVhZGVyKSk7XG4gICAgICAgIGlmIChcInR5cFwiIGluIHBhcnNlZEhlYWRlciAmJiBwYXJzZWRIZWFkZXI/LnR5cCAhPT0gXCJKV1RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXBhcnNlZEhlYWRlci5hbGcpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGFsZ29yaXRobSAmJiAoIShcImFsZ1wiIGluIHBhcnNlZEhlYWRlcikgfHwgcGFyc2VkSGVhZGVyLmFsZyAhPT0gYWxnb3JpdGhtKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoICB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgJFpvZEpXVCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSldUXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChpc1ZhbGlkSldUKHBheWxvYWQudmFsdWUsIGRlZi5hbGcpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImp3dFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDdXN0b21TdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEN1c3RvbVN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoZGVmLmZuKHBheWxvYWQudmFsdWUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBkZWYuZm9ybWF0LFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROdW1iZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE51bWJlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IGluc3QuX3pvZC5iYWcucGF0dGVybiA/PyByZWdleGVzLm51bWJlcjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHRyeSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gTnVtYmVyKHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc05hTihpbnB1dCkgJiYgTnVtYmVyLmlzRmluaXRlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVjZWl2ZWQgPSB0eXBlb2YgaW5wdXQgPT09IFwibnVtYmVyXCIgPyBOdW1iZXIuaXNOYU4oaW5wdXQpID8gXCJOYU5cIiA6ICFOdW1iZXIuaXNGaW5pdGUoaW5wdXQpID8gXCJJbmZpbml0eVwiIDogdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIC4uLnJlY2VpdmVkID8ge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkXG4gICAgICAgICAgICB9IDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVtYmVyRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdW1iZXJGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjaGVja3MuJFpvZENoZWNrTnVtYmVyRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICAkWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTsgLy8gbm8gZm9ybWF0IGNoZWNrc1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEJvb2xlYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJvb2xlYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSByZWdleGVzLmJvb2xlYW47XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IEJvb2xlYW4ocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJib29sZWFuXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQmlnSW50ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RCaWdJbnRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSByZWdleGVzLmJpZ2ludDtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHRyeSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gQmlnSW50KHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RCaWdJbnRGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJpZ0ludEZvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNoZWNrcy4kWm9kQ2hlY2tCaWdJbnRGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgICRab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG59KTtcbmV4cG9ydCBjb25zdCAkWm9kU3ltYm9sID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTeW1ib2xcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwic3ltYm9sXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVuZGVmaW5lZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVW5kZWZpbmVkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gcmVnZXhlcy51bmRlZmluZWQ7XG4gICAgaW5zdC5fem9kLnZhbHVlcyA9IG5ldyBTZXQoW1xuICAgICAgICB1bmRlZmluZWRcbiAgICBdKTtcbiAgICBpbnN0Ll96b2Qub3B0aW4gPSBcIm9wdGlvbmFsXCI7XG4gICAgaW5zdC5fem9kLm9wdG91dCA9IFwib3B0aW9uYWxcIjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJ1bmRlZmluZWRcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVsbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTnVsbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IHJlZ2V4ZXMubnVsbDtcbiAgICBpbnN0Ll96b2QudmFsdWVzID0gbmV3IFNldChbXG4gICAgICAgIG51bGxcbiAgICBdKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcIm51bGxcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQW55ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RBbnlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQpPT5wYXlsb2FkO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVua25vd24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVua25vd25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQpPT5wYXlsb2FkO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5ldmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROZXZlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJuZXZlclwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RWb2lkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RWb2lkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcInZvaWRcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG5ldyBEYXRlKHBheWxvYWQudmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX2Vycikge31cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGlzRGF0ZSA9IGlucHV0IGluc3RhbmNlb2YgRGF0ZTtcbiAgICAgICAgY29uc3QgaXNWYWxpZERhdGUgPSBpc0RhdGUgJiYgIU51bWJlci5pc05hTihpbnB1dC5nZXRUaW1lKCkpO1xuICAgICAgICBpZiAoaXNWYWxpZERhdGUpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImRhdGVcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIC4uLmlzRGF0ZSA/IHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogXCJJbnZhbGlkIERhdGVcIlxuICAgICAgICAgICAgfSA6IHt9LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlQXJyYXlSZXN1bHQocmVzdWx0LCBmaW5hbCwgaW5kZXgpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoaW5kZXgsIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICB9XG4gICAgZmluYWwudmFsdWVbaW5kZXhdID0gcmVzdWx0LnZhbHVlO1xufVxuZXhwb3J0IGNvbnN0ICRab2RBcnJheSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQXJyYXlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gQXJyYXkoaW5wdXQubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpbnB1dFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5lbGVtZW50Ll96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVBcnJheVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZUFycmF5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDsgLy9oYW5kbGVBcnJheVJlc3VsdHNBc3luYyhwYXJzZVJlc3VsdHMsIGZpbmFsKTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eVJlc3VsdChyZXN1bHQsIGZpbmFsLCBrZXksIGlucHV0LCBpc09wdGlvbmFsT3V0KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIEZvciBvcHRpb25hbC1vdXQgc2NoZW1hcywgaWdub3JlIGVycm9ycyBvbiBhYnNlbnQga2V5c1xuICAgICAgICBpZiAoaXNPcHRpb25hbE91dCAmJiAhKGtleSBpbiBpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChrZXkgaW4gaW5wdXQpIHtcbiAgICAgICAgICAgIGZpbmFsLnZhbHVlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmaW5hbC52YWx1ZVtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZURlZihkZWYpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGVmLnNoYXBlKTtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5cyl7XG4gICAgICAgIGlmICghZGVmLnNoYXBlPy5ba10/Ll96b2Q/LnRyYWl0cz8uaGFzKFwiJFpvZFR5cGVcIikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IGF0IGtleSBcIiR7a31cIjogZXhwZWN0ZWQgYSBab2Qgc2NoZW1hYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb2tleXMgPSB1dGlsLm9wdGlvbmFsS2V5cyhkZWYuc2hhcGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAga2V5cyxcbiAgICAgICAga2V5U2V0OiBuZXcgU2V0KGtleXMpLFxuICAgICAgICBudW1LZXlzOiBrZXlzLmxlbmd0aCxcbiAgICAgICAgb3B0aW9uYWxLZXlzOiBuZXcgU2V0KG9rZXlzKVxuICAgIH07XG59XG5mdW5jdGlvbiBoYW5kbGVDYXRjaGFsbChwcm9tcywgaW5wdXQsIHBheWxvYWQsIGN0eCwgZGVmLCBpbnN0KSB7XG4gICAgY29uc3QgdW5yZWNvZ25pemVkID0gW107XG4gICAgLy8gaXRlcmF0ZSBvdmVyIGlucHV0IGtleXNcbiAgICBjb25zdCBrZXlTZXQgPSBkZWYua2V5U2V0O1xuICAgIGNvbnN0IF9jYXRjaGFsbCA9IGRlZi5jYXRjaGFsbC5fem9kO1xuICAgIGNvbnN0IHQgPSBfY2F0Y2hhbGwuZGVmLnR5cGU7XG4gICAgY29uc3QgaXNPcHRpb25hbE91dCA9IF9jYXRjaGFsbC5vcHRvdXQgPT09IFwib3B0aW9uYWxcIjtcbiAgICBmb3IoY29uc3Qga2V5IGluIGlucHV0KXtcbiAgICAgICAgaWYgKGtleVNldC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgIGlmICh0ID09PSBcIm5ldmVyXCIpIHtcbiAgICAgICAgICAgIHVucmVjb2duaXplZC5wdXNoKGtleSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByID0gX2NhdGNoYWxsLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogaW5wdXRba2V5XSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBwcm9tcy5wdXNoKHIudGhlbigocik9PmhhbmRsZVByb3BlcnR5UmVzdWx0KHIsIHBheWxvYWQsIGtleSwgaW5wdXQsIGlzT3B0aW9uYWxPdXQpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0LCBpc09wdGlvbmFsT3V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodW5yZWNvZ25pemVkLmxlbmd0aCkge1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgICAgICAgICAgIGtleXM6IHVucmVjb2duaXplZCxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFwcm9tcy5sZW5ndGgpIHJldHVybiBwYXlsb2FkO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+e1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kT2JqZWN0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RPYmplY3RcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyByZXF1aXJlcyBjYXN0IGJlY2F1c2UgdGVjaG5pY2FsbHkgJFpvZE9iamVjdCBkb2Vzbid0IGV4dGVuZFxuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICAvLyBjb25zdCBzaCA9IGRlZi5zaGFwZTtcbiAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWYsIFwic2hhcGVcIik7XG4gICAgaWYgKCFkZXNjPy5nZXQpIHtcbiAgICAgICAgY29uc3Qgc2ggPSBkZWYuc2hhcGU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWYsIFwic2hhcGVcIiwge1xuICAgICAgICAgICAgZ2V0OiAoKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NoID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5zaFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlZiwgXCJzaGFwZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdTaFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdTaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IF9ub3JtYWxpemVkID0gdXRpbC5jYWNoZWQoKCk9Pm5vcm1hbGl6ZURlZihkZWYpKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PntcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBkZWYuc2hhcGU7XG4gICAgICAgIGNvbnN0IHByb3BWYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBzaGFwZSl7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHNoYXBlW2tleV0uX3pvZDtcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWVzW2tleV0gPz8gKHByb3BWYWx1ZXNba2V5XSA9IG5ldyBTZXQoKSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIGZpZWxkLnZhbHVlcylwcm9wVmFsdWVzW2tleV0uYWRkKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wVmFsdWVzO1xuICAgIH0pO1xuICAgIGNvbnN0IGlzT2JqZWN0ID0gdXRpbC5pc09iamVjdDtcbiAgICBjb25zdCBjYXRjaGFsbCA9IGRlZi5jYXRjaGFsbDtcbiAgICBsZXQgdmFsdWU7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgdmFsdWUgPz8gKHZhbHVlID0gX25vcm1hbGl6ZWQudmFsdWUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHt9O1xuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBjb25zdCBzaGFwZSA9IHZhbHVlLnNoYXBlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWx1ZS5rZXlzKXtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGlzT3B0aW9uYWxPdXQgPSBlbC5fem9kLm9wdG91dCA9PT0gXCJvcHRpb25hbFwiO1xuICAgICAgICAgICAgY29uc3QgciA9IGVsLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXRba2V5XSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyLnRoZW4oKHIpPT5oYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0LCBpc09wdGlvbmFsT3V0KSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0LCBpc09wdGlvbmFsT3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNhdGNoYWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpIDogcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlQ2F0Y2hhbGwocHJvbXMsIGlucHV0LCBwYXlsb2FkLCBjdHgsIF9ub3JtYWxpemVkLnZhbHVlLCBpbnN0KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE9iamVjdEpJVCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kT2JqZWN0SklUXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gcmVxdWlyZXMgY2FzdCBiZWNhdXNlIHRlY2huaWNhbGx5ICRab2RPYmplY3QgZG9lc24ndCBleHRlbmRcbiAgICAkWm9kT2JqZWN0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBzdXBlclBhcnNlID0gaW5zdC5fem9kLnBhcnNlO1xuICAgIGNvbnN0IF9ub3JtYWxpemVkID0gdXRpbC5jYWNoZWQoKCk9Pm5vcm1hbGl6ZURlZihkZWYpKTtcbiAgICBjb25zdCBnZW5lcmF0ZUZhc3RwYXNzID0gKHNoYXBlKT0+e1xuICAgICAgICBjb25zdCBkb2MgPSBuZXcgRG9jKFtcbiAgICAgICAgICAgIFwic2hhcGVcIixcbiAgICAgICAgICAgIFwicGF5bG9hZFwiLFxuICAgICAgICAgICAgXCJjdHhcIlxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVkLnZhbHVlO1xuICAgICAgICBjb25zdCBwYXJzZVN0ciA9IChrZXkpPT57XG4gICAgICAgICAgICBjb25zdCBrID0gdXRpbC5lc2Moa2V5KTtcbiAgICAgICAgICAgIHJldHVybiBgc2hhcGVbJHtrfV0uX3pvZC5ydW4oeyB2YWx1ZTogaW5wdXRbJHtrfV0sIGlzc3VlczogW10gfSwgY3R4KWA7XG4gICAgICAgIH07XG4gICAgICAgIGRvYy53cml0ZShgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO2ApO1xuICAgICAgICBjb25zdCBpZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIG5vcm1hbGl6ZWQua2V5cyl7XG4gICAgICAgICAgICBpZHNba2V5XSA9IGBrZXlfJHtjb3VudGVyKyt9YDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBOiBwcmVzZXJ2ZSBrZXkgb3JkZXIge1xuICAgICAgICBkb2Mud3JpdGUoYGNvbnN0IG5ld1Jlc3VsdCA9IHt9O2ApO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBub3JtYWxpemVkLmtleXMpe1xuICAgICAgICAgICAgY29uc3QgaWQgPSBpZHNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB1dGlsLmVzYyhrZXkpO1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGlzT3B0aW9uYWxPdXQgPSBzY2hlbWE/Ll96b2Q/Lm9wdG91dCA9PT0gXCJvcHRpb25hbFwiO1xuICAgICAgICAgICAgZG9jLndyaXRlKGBjb25zdCAke2lkfSA9ICR7cGFyc2VTdHIoa2V5KX07YCk7XG4gICAgICAgICAgICBpZiAoaXNPcHRpb25hbE91dCkge1xuICAgICAgICAgICAgICAgIC8vIEZvciBvcHRpb25hbC1vdXQgc2NoZW1hcywgaWdub3JlIGVycm9ycyBvbiBhYnNlbnQga2V5c1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZShgXG4gICAgICAgIGlmICgke2lkfS5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCR7a30gaW4gaW5wdXQpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzID0gcGF5bG9hZC5pc3N1ZXMuY29uY2F0KCR7aWR9Lmlzc3Vlcy5tYXAoaXNzID0+ICh7XG4gICAgICAgICAgICAgIC4uLmlzcyxcbiAgICAgICAgICAgICAgcGF0aDogaXNzLnBhdGggPyBbJHtrfSwgLi4uaXNzLnBhdGhdIDogWyR7a31dXG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCR7aWR9LnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoJHtrfSBpbiBpbnB1dCkge1xuICAgICAgICAgICAgbmV3UmVzdWx0WyR7a31dID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdSZXN1bHRbJHtrfV0gPSAke2lkfS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgIGApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGUoYFxuICAgICAgICBpZiAoJHtpZH0uaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgIHBheWxvYWQuaXNzdWVzID0gcGF5bG9hZC5pc3N1ZXMuY29uY2F0KCR7aWR9Lmlzc3Vlcy5tYXAoaXNzID0+ICh7XG4gICAgICAgICAgICAuLi5pc3MsXG4gICAgICAgICAgICBwYXRoOiBpc3MucGF0aCA/IFske2t9LCAuLi5pc3MucGF0aF0gOiBbJHtrfV1cbiAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoJHtpZH0udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgke2t9IGluIGlucHV0KSB7XG4gICAgICAgICAgICBuZXdSZXN1bHRbJHtrfV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1Jlc3VsdFske2t9XSA9ICR7aWR9LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZG9jLndyaXRlKGBwYXlsb2FkLnZhbHVlID0gbmV3UmVzdWx0O2ApO1xuICAgICAgICBkb2Mud3JpdGUoYHJldHVybiBwYXlsb2FkO2ApO1xuICAgICAgICBjb25zdCBmbiA9IGRvYy5jb21waWxlKCk7XG4gICAgICAgIHJldHVybiAocGF5bG9hZCwgY3R4KT0+Zm4oc2hhcGUsIHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbiAgICBsZXQgZmFzdHBhc3M7XG4gICAgY29uc3QgaXNPYmplY3QgPSB1dGlsLmlzT2JqZWN0O1xuICAgIGNvbnN0IGppdCA9ICFjb3JlLmdsb2JhbENvbmZpZy5qaXRsZXNzO1xuICAgIGNvbnN0IGFsbG93c0V2YWwgPSB1dGlsLmFsbG93c0V2YWw7XG4gICAgY29uc3QgZmFzdEVuYWJsZWQgPSBqaXQgJiYgYWxsb3dzRXZhbC52YWx1ZTsgLy8gJiYgIWRlZi5jYXRjaGFsbDtcbiAgICBjb25zdCBjYXRjaGFsbCA9IGRlZi5jYXRjaGFsbDtcbiAgICBsZXQgdmFsdWU7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgdmFsdWUgPz8gKHZhbHVlID0gX25vcm1hbGl6ZWQudmFsdWUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGppdCAmJiBmYXN0RW5hYmxlZCAmJiBjdHg/LmFzeW5jID09PSBmYWxzZSAmJiBjdHguaml0bGVzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gYWx3YXlzIHN5bmNocm9ub3VzXG4gICAgICAgICAgICBpZiAoIWZhc3RwYXNzKSBmYXN0cGFzcyA9IGdlbmVyYXRlRmFzdHBhc3MoZGVmLnNoYXBlKTtcbiAgICAgICAgICAgIHBheWxvYWQgPSBmYXN0cGFzcyhwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKCFjYXRjaGFsbCkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQ2F0Y2hhbGwoW10sIGlucHV0LCBwYXlsb2FkLCBjdHgsIHZhbHVlLCBpbnN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXJQYXJzZShwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBmaW5hbCwgaW5zdCwgY3R4KSB7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cyl7XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZmluYWwudmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gZmluYWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9uYWJvcnRlZCA9IHJlc3VsdHMuZmlsdGVyKChyKT0+IXV0aWwuYWJvcnRlZChyKSk7XG4gICAgaWYgKG5vbmFib3J0ZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbmFsLnZhbHVlID0gbm9uYWJvcnRlZFswXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG5vbmFib3J0ZWRbMF07XG4gICAgfVxuICAgIGZpbmFsLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgY29kZTogXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgICAgIGlucHV0OiBmaW5hbC52YWx1ZSxcbiAgICAgICAgaW5zdCxcbiAgICAgICAgZXJyb3JzOiByZXN1bHRzLm1hcCgocmVzdWx0KT0+cmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgIH0pO1xuICAgIHJldHVybiBmaW5hbDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kVW5pb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5vcHRpb25zLnNvbWUoKG8pPT5vLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikgPyBcIm9wdGlvbmFsXCIgOiB1bmRlZmluZWQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYub3B0aW9ucy5zb21lKChvKT0+by5fem9kLm9wdG91dCA9PT0gXCJvcHRpb25hbFwiKSA/IFwib3B0aW9uYWxcIiA6IHVuZGVmaW5lZCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PntcbiAgICAgICAgaWYgKGRlZi5vcHRpb25zLmV2ZXJ5KChvKT0+by5fem9kLnZhbHVlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2V0KGRlZi5vcHRpb25zLmZsYXRNYXAoKG9wdGlvbik9PkFycmF5LmZyb20ob3B0aW9uLl96b2QudmFsdWVzKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT57XG4gICAgICAgIGlmIChkZWYub3B0aW9ucy5ldmVyeSgobyk9Pm8uX3pvZC5wYXR0ZXJuKSkge1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybnMgPSBkZWYub3B0aW9ucy5tYXAoKG8pPT5vLl96b2QucGF0dGVybik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXigke3BhdHRlcm5zLm1hcCgocCk9PnV0aWwuY2xlYW5SZWdleChwLnNvdXJjZSkpLmpvaW4oXCJ8XCIpfSkkYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBjb25zdCBzaW5nbGUgPSBkZWYub3B0aW9ucy5sZW5ndGggPT09IDE7XG4gICAgY29uc3QgZmlyc3QgPSBkZWYub3B0aW9uc1swXS5fem9kLnJ1bjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoc2luZ2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3QocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYXN5bmMpIHJldHVybiBoYW5kbGVVbmlvblJlc3VsdHMocmVzdWx0cywgcGF5bG9hZCwgaW5zdCwgY3R4KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdHMpLnRoZW4oKHJlc3VsdHMpPT57XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlVW5pb25SZXN1bHRzKHJlc3VsdHMsIHBheWxvYWQsIGluc3QsIGN0eCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZUV4Y2x1c2l2ZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBmaW5hbCwgaW5zdCwgY3R4KSB7XG4gICAgY29uc3Qgc3VjY2Vzc2VzID0gcmVzdWx0cy5maWx0ZXIoKHIpPT5yLmlzc3Vlcy5sZW5ndGggPT09IDApO1xuICAgIGlmIChzdWNjZXNzZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbmFsLnZhbHVlID0gc3VjY2Vzc2VzWzBdLnZhbHVlO1xuICAgICAgICByZXR1cm4gZmluYWw7XG4gICAgfVxuICAgIGlmIChzdWNjZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIE5vIG1hdGNoZXMgLSBzYW1lIGFzIHJlZ3VsYXIgdW5pb25cbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgICAgICAgICBpbnB1dDogZmluYWwudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgZXJyb3JzOiByZXN1bHRzLm1hcCgocmVzdWx0KT0+cmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNdWx0aXBsZSBtYXRjaGVzIC0gZXhjbHVzaXZlIHVuaW9uIGZhaWx1cmVcbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgICAgICAgICBpbnB1dDogZmluYWwudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmaW5hbDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kWG9yID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RYb3JcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIGRlZi5pbmNsdXNpdmUgPSBmYWxzZTtcbiAgICBjb25zdCBzaW5nbGUgPSBkZWYub3B0aW9ucy5sZW5ndGggPT09IDE7XG4gICAgY29uc3QgZmlyc3QgPSBkZWYub3B0aW9uc1swXS5fem9kLnJ1bjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoc2luZ2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3QocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhc3luYykgcmV0dXJuIGhhbmRsZUV4Y2x1c2l2ZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBwYXlsb2FkLCBpbnN0LCBjdHgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVzdWx0cykudGhlbigocmVzdWx0cyk9PntcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVFeGNsdXNpdmVVbmlvblJlc3VsdHMocmVzdWx0cywgcGF5bG9hZCwgaW5zdCwgY3R4KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2REaXNjcmltaW5hdGVkVW5pb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZERpc2NyaW1pbmF0ZWRVbmlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5pbmNsdXNpdmUgPSBmYWxzZTtcbiAgICAkWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IF9zdXBlciA9IGluc3QuX3pvZC5wYXJzZTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PntcbiAgICAgICAgY29uc3QgcHJvcFZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCBwdiA9IG9wdGlvbi5fem9kLnByb3BWYWx1ZXM7XG4gICAgICAgICAgICBpZiAoIXB2IHx8IE9iamVjdC5rZXlzKHB2KS5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkaXNjcmltaW5hdGVkIHVuaW9uIG9wdGlvbiBhdCBpbmRleCBcIiR7ZGVmLm9wdGlvbnMuaW5kZXhPZihvcHRpb24pfVwiYCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhwdikpe1xuICAgICAgICAgICAgICAgIGlmICghcHJvcFZhbHVlc1trXSkgcHJvcFZhbHVlc1trXSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2KXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlc1trXS5hZGQodmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BWYWx1ZXM7XG4gICAgfSk7XG4gICAgY29uc3QgZGlzYyA9IHV0aWwuY2FjaGVkKCgpPT57XG4gICAgICAgIGNvbnN0IG9wdHMgPSBkZWYub3B0aW9ucztcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG8gb2Ygb3B0cyl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvLl96b2QucHJvcFZhbHVlcz8uW2RlZi5kaXNjcmltaW5hdG9yXTtcbiAgICAgICAgICAgIGlmICghdmFsdWVzIHx8IHZhbHVlcy5zaXplID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggXCIke2RlZi5vcHRpb25zLmluZGV4T2Yobyl9XCJgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpe1xuICAgICAgICAgICAgICAgIGlmIChtYXAuaGFzKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGRpc2NyaW1pbmF0b3IgdmFsdWUgXCIke1N0cmluZyh2KX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXAuc2V0KHYsIG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIXV0aWwuaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0ID0gZGlzYy52YWx1ZS5nZXQoaW5wdXQ/LltkZWYuZGlzY3JpbWluYXRvcl0pO1xuICAgICAgICBpZiAob3B0KSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0Ll96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi51bmlvbkZhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gbWF0Y2hpbmcgZGlzY3JpbWluYXRvclxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF91bmlvblwiLFxuICAgICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICAgIG5vdGU6IFwiTm8gbWF0Y2hpbmcgZGlzY3JpbWluYXRvclwiLFxuICAgICAgICAgICAgZGlzY3JpbWluYXRvcjogZGVmLmRpc2NyaW1pbmF0b3IsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICBkZWYuZGlzY3JpbWluYXRvclxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSW50ZXJzZWN0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJbnRlcnNlY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGVmLmxlZnQuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IGlucHV0LFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBjb25zdCByaWdodCA9IGRlZi5yaWdodC5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogaW5wdXQsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGNvbnN0IGFzeW5jID0gbGVmdCBpbnN0YW5jZW9mIFByb21pc2UgfHwgcmlnaHQgaW5zdGFuY2VvZiBQcm9taXNlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgXSkudGhlbigoW2xlZnQsIHJpZ2h0XSk9PntcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlSW50ZXJzZWN0aW9uUmVzdWx0cyhwYXlsb2FkLCBsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlSW50ZXJzZWN0aW9uUmVzdWx0cyhwYXlsb2FkLCBsZWZ0LCByaWdodCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gbWVyZ2VWYWx1ZXMoYSwgYikge1xuICAgIC8vIGNvbnN0IGFUeXBlID0gcGFyc2UudChhKTtcbiAgICAvLyBjb25zdCBiVHlwZSA9IHBhcnNlLnQoYik7XG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogYVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUgJiYgK2EgPT09ICtiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IGFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHV0aWwuaXNQbGFpbk9iamVjdChhKSAmJiB1dGlsLmlzUGxhaW5PYmplY3QoYikpIHtcbiAgICAgICAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5cyA9IE9iamVjdC5rZXlzKGEpLmZpbHRlcigoa2V5KT0+YktleXMuaW5kZXhPZihrZXkpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHtcbiAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAuLi5iXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXJlZEtleXMpe1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXJnZUVycm9yUGF0aDogW1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2hhcmVkVmFsdWUubWVyZ2VFcnJvclBhdGhcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogbmV3T2JqXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0FycmF5ID0gW107XG4gICAgICAgIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGEubGVuZ3RoOyBpbmRleCsrKXtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BID0gYVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBpdGVtQiA9IGJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2hhcmVkVmFsdWUubWVyZ2VFcnJvclBhdGhcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdBcnJheS5wdXNoKHNoYXJlZFZhbHVlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IG5ld0FycmF5XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtdXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUludGVyc2VjdGlvblJlc3VsdHMocmVzdWx0LCBsZWZ0LCByaWdodCkge1xuICAgIC8vIFRyYWNrIHdoaWNoIHNpZGUocykgcmVwb3J0IGVhY2gga2V5IGFzIHVucmVjb2duaXplZFxuICAgIGNvbnN0IHVucmVjS2V5cyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdW5yZWNJc3N1ZTtcbiAgICBmb3IgKGNvbnN0IGlzcyBvZiBsZWZ0Lmlzc3Vlcyl7XG4gICAgICAgIGlmIChpc3MuY29kZSA9PT0gXCJ1bnJlY29nbml6ZWRfa2V5c1wiKSB7XG4gICAgICAgICAgICB1bnJlY0lzc3VlID8/ICh1bnJlY0lzc3VlID0gaXNzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBpc3Mua2V5cyl7XG4gICAgICAgICAgICAgICAgaWYgKCF1bnJlY0tleXMuaGFzKGspKSB1bnJlY0tleXMuc2V0KGssIHt9KTtcbiAgICAgICAgICAgICAgICB1bnJlY0tleXMuZ2V0KGspLmwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKGlzcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBpc3Mgb2YgcmlnaHQuaXNzdWVzKXtcbiAgICAgICAgaWYgKGlzcy5jb2RlID09PSBcInVucmVjb2duaXplZF9rZXlzXCIpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBpc3Mua2V5cyl7XG4gICAgICAgICAgICAgICAgaWYgKCF1bnJlY0tleXMuaGFzKGspKSB1bnJlY0tleXMuc2V0KGssIHt9KTtcbiAgICAgICAgICAgICAgICB1bnJlY0tleXMuZ2V0KGspLnIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKGlzcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVwb3J0IG9ubHkga2V5cyB1bnJlY29nbml6ZWQgYnkgQk9USCBzaWRlc1xuICAgIGNvbnN0IGJvdGhLZXlzID0gW1xuICAgICAgICAuLi51bnJlY0tleXNcbiAgICBdLmZpbHRlcigoWywgZl0pPT5mLmwgJiYgZi5yKS5tYXAoKFtrXSk9PmspO1xuICAgIGlmIChib3RoS2V5cy5sZW5ndGggJiYgdW5yZWNJc3N1ZSkge1xuICAgICAgICByZXN1bHQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgLi4udW5yZWNJc3N1ZSxcbiAgICAgICAgICAgIGtleXM6IGJvdGhLZXlzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodXRpbC5hYm9ydGVkKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VWYWx1ZXMobGVmdC52YWx1ZSwgcmlnaHQudmFsdWUpO1xuICAgIGlmICghbWVyZ2VkLnZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5tZXJnYWJsZSBpbnRlcnNlY3Rpb24uIEVycm9yIHBhdGg6IGAgKyBgJHtKU09OLnN0cmluZ2lmeShtZXJnZWQubWVyZ2VFcnJvclBhdGgpfWApO1xuICAgIH1cbiAgICByZXN1bHQudmFsdWUgPSBtZXJnZWQuZGF0YTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0ICRab2RUdXBsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVHVwbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgaXRlbXMgPSBkZWYuaXRlbXM7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInR1cGxlXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gW107XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIGNvbnN0IHJldmVyc2VkSW5kZXggPSBbXG4gICAgICAgICAgICAuLi5pdGVtc1xuICAgICAgICBdLnJldmVyc2UoKS5maW5kSW5kZXgoKGl0ZW0pPT5pdGVtLl96b2Qub3B0aW4gIT09IFwib3B0aW9uYWxcIik7XG4gICAgICAgIGNvbnN0IG9wdFN0YXJ0ID0gcmV2ZXJzZWRJbmRleCA9PT0gLTEgPyAwIDogaXRlbXMubGVuZ3RoIC0gcmV2ZXJzZWRJbmRleDtcbiAgICAgICAgaWYgKCFkZWYucmVzdCkge1xuICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gaW5wdXQubGVuZ3RoID4gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBpbnB1dC5sZW5ndGggPCBvcHRTdGFydCAtIDE7XG4gICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRvb0JpZyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogaXRlbXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW46IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBpID0gLTE7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcyl7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBpZiAoaSA+PSBpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSBvcHRTdGFydCkgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVtLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXRbaV0sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVUdXBsZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYucmVzdCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdCA9IGlucHV0LnNsaWNlKGl0ZW1zLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHJlc3Qpe1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYucmVzdC5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbCxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9tcy5sZW5ndGgpIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgZmluYWwsIGluZGV4KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGluZGV4LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgfVxuICAgIGZpbmFsLnZhbHVlW2luZGV4XSA9IHJlc3VsdC52YWx1ZTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kUmVjb3JkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RSZWNvcmRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIXV0aWwuaXNQbGFpbk9iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInJlY29yZFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBkZWYua2V5VHlwZS5fem9kLnZhbHVlcztcbiAgICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHt9O1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHZhbHVlcyl7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGtleSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZEtleXMuYWRkKHR5cGVvZiBrZXkgPT09IFwibnVtYmVyXCIgPyBrZXkudG9TdHJpbmcoKSA6IGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi52YWx1ZVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0W2tleV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdW5yZWNvZ25pemVkO1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBpbnB1dCl7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWNvcmRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVucmVjb2duaXplZCA9IHVucmVjb2duaXplZCA/PyBbXTtcbiAgICAgICAgICAgICAgICAgICAgdW5yZWNvZ25pemVkLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW5yZWNvZ25pemVkICYmIHVucmVjb2duaXplZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgIGtleXM6IHVucmVjb2duaXplZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKGlucHV0KSl7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJfX3Byb3RvX19cIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGtleVJlc3VsdCA9IGRlZi5rZXlUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTnVtZXJpYyBzdHJpbmcgZmFsbGJhY2s6IGlmIGtleSBpcyBhIG51bWVyaWMgc3RyaW5nIGFuZCBmYWlsZWQsIHJldHJ5IHdpdGggTnVtYmVyKGtleSlcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgei5udW1iZXIoKSwgei5saXRlcmFsKFsxLCAyLCAzXSksIGFuZCB1bmlvbnMgY29udGFpbmluZyBudW1lcmljIGxpdGVyYWxzXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tOdW1lcmljS2V5ID0gdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiAmJiByZWdleGVzLm51bWJlci50ZXN0KGtleSkgJiYga2V5UmVzdWx0Lmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrTnVtZXJpY0tleSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeVJlc3VsdCA9IGRlZi5rZXlUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIoa2V5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlSZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5UmVzdWx0ID0gcmV0cnlSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtleVJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWYubW9kZSA9PT0gXCJsb29zZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHRocm91Z2ggdW5jaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleV0gPSBpbnB1dFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBcInN0cmljdFwiIGJlaGF2aW9yOiBlcnJvciBvbiBpbnZhbGlkIGtleVxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2tleVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjogXCJyZWNvcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGtleVJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDoga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dFtrZXldLFxuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZVtrZXlSZXN1bHQudmFsdWVdID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5UmVzdWx0LnZhbHVlXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE1hcCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTWFwXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJtYXBcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5wdXQpe1xuICAgICAgICAgICAgY29uc3Qga2V5UmVzdWx0ID0gZGVmLmtleVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAoa2V5UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSB8fCB2YWx1ZVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAga2V5UmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVJlc3VsdFxuICAgICAgICAgICAgICAgIF0pLnRoZW4oKFtrZXlSZXN1bHQsIHZhbHVlUmVzdWx0XSk9PntcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWFwUmVzdWx0KGtleVJlc3VsdCwgdmFsdWVSZXN1bHQsIHBheWxvYWQsIGtleSwgaW5wdXQsIGluc3QsIGN0eCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVNYXBSZXN1bHQoa2V5UmVzdWx0LCB2YWx1ZVJlc3VsdCwgcGF5bG9hZCwga2V5LCBpbnB1dCwgaW5zdCwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVNYXBSZXN1bHQoa2V5UmVzdWx0LCB2YWx1ZVJlc3VsdCwgZmluYWwsIGtleSwgaW5wdXQsIGluc3QsIGN0eCkge1xuICAgIGlmIChrZXlSZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodXRpbC5wcm9wZXJ0eUtleVR5cGVzLmhhcyh0eXBlb2Yga2V5KSkge1xuICAgICAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCBrZXlSZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2tleVwiLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJtYXBcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGlzc3Vlczoga2V5UmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsdWVSZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodXRpbC5wcm9wZXJ0eUtleVR5cGVzLmhhcyh0eXBlb2Yga2V5KSkge1xuICAgICAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCB2YWx1ZVJlc3VsdC5pc3N1ZXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwibWFwXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2VsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIGlzc3VlczogdmFsdWVSZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmFsLnZhbHVlLnNldChrZXlSZXN1bHQudmFsdWUsIHZhbHVlUmVzdWx0LnZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kU2V0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTZXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBwYXlsb2FkLnZhbHVlID0gbmV3IFNldCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpe1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlU2V0UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBoYW5kbGVTZXRSZXN1bHQocmVzdWx0LCBwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVTZXRSZXN1bHQocmVzdWx0LCBmaW5hbCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi5yZXN1bHQuaXNzdWVzKTtcbiAgICB9XG4gICAgZmluYWwudmFsdWUuYWRkKHJlc3VsdC52YWx1ZSk7XG59XG5leHBvcnQgY29uc3QgJFpvZEVudW0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEVudW1cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgdmFsdWVzID0gdXRpbC5nZXRFbnVtVmFsdWVzKGRlZi5lbnRyaWVzKTtcbiAgICBjb25zdCB2YWx1ZXNTZXQgPSBuZXcgU2V0KHZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnZhbHVlcyA9IHZhbHVlc1NldDtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IG5ldyBSZWdFeHAoYF4oJHt2YWx1ZXMuZmlsdGVyKChrKT0+dXRpbC5wcm9wZXJ0eUtleVR5cGVzLmhhcyh0eXBlb2YgaykpLm1hcCgobyk9PnR5cGVvZiBvID09PSBcInN0cmluZ1wiID8gdXRpbC5lc2NhcGVSZWdleChvKSA6IG8udG9TdHJpbmcoKSkuam9pbihcInxcIil9KSRgKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWVzU2V0LmhhcyhpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTGl0ZXJhbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpZiAoZGVmLnZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNyZWF0ZSBsaXRlcmFsIHNjaGVtYSB3aXRoIG5vIHZhbGlkIHZhbHVlc1wiKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFNldChkZWYudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QudmFsdWVzID0gdmFsdWVzO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gbmV3IFJlZ0V4cChgXigke2RlZi52YWx1ZXMubWFwKChvKT0+dHlwZW9mIG8gPT09IFwic3RyaW5nXCIgPyB1dGlsLmVzY2FwZVJlZ2V4KG8pIDogbyA/IHV0aWwuZXNjYXBlUmVnZXgoby50b1N0cmluZygpKSA6IFN0cmluZyhvKSkuam9pbihcInxcIil9KSRgKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWVzLmhhcyhpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IGRlZi52YWx1ZXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRmlsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRmlsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGUpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImZpbGVcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVHJhbnNmb3JtID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RUcmFuc2Zvcm1cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEVuY29kZUVycm9yKGluc3QuY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX291dCA9IGRlZi50cmFuc2Zvcm0ocGF5bG9hZC52YWx1ZSwgcGF5bG9hZCk7XG4gICAgICAgIGlmIChjdHguYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IF9vdXQgaW5zdGFuY2VvZiBQcm9taXNlID8gX291dCA6IFByb21pc2UucmVzb2x2ZShfb3V0KTtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQudGhlbigob3V0cHV0KT0+e1xuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX291dCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IF9vdXQ7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZU9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGggJiYgaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kT3B0aW9uYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICBpbnN0Ll96b2Qub3B0b3V0ID0gXCJvcHRpb25hbFwiO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT57XG4gICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzID8gbmV3IFNldChbXG4gICAgICAgICAgICAuLi5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzLFxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgIF0pIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicGF0dGVyblwiLCAoKT0+e1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gZGVmLmlubmVyVHlwZS5fem9kLnBhdHRlcm47XG4gICAgICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IFJlZ0V4cChgXigke3V0aWwuY2xlYW5SZWdleChwYXR0ZXJuLnNvdXJjZSl9KT8kYCkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGRlZi5pbm5lclR5cGUuX3pvZC5vcHRpbiA9PT0gXCJvcHRpb25hbFwiKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIHJlc3VsdC50aGVuKChyKT0+aGFuZGxlT3B0aW9uYWxSZXN1bHQociwgcGF5bG9hZC52YWx1ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgcGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEV4YWN0T3B0aW9uYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEV4YWN0T3B0aW9uYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBDYWxsIHBhcmVudCBpbml0IC0gaW5oZXJpdHMgb3B0aW4vb3B0b3V0ID0gXCJvcHRpb25hbFwiXG4gICAgJFpvZE9wdGlvbmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICAvLyBPdmVycmlkZSB2YWx1ZXMvcGF0dGVybiB0byBOT1QgYWRkIHVuZGVmaW5lZFxuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInBhdHRlcm5cIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuKTtcbiAgICAvLyBPdmVycmlkZSBwYXJzZSB0byBqdXN0IGRlbGVnYXRlIChubyB1bmRlZmluZWQgaGFuZGxpbmcpXG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE51bGxhYmxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdWxsYWJsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0aW4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0b3V0KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInBhdHRlcm5cIiwgKCk9PntcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IGRlZi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuO1xuICAgICAgICByZXR1cm4gcGF0dGVybiA/IG5ldyBSZWdFeHAoYF4oJHt1dGlsLmNsZWFuUmVnZXgocGF0dGVybi5zb3VyY2UpfXxudWxsKSRgKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+e1xuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyA/IG5ldyBTZXQoW1xuICAgICAgICAgICAgLi4uZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgXSkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gKGRlY29kZSk6IGFsbG93IG51bGwgdG8gcGFzcyB0aHJvdWdoXG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlID09PSBudWxsKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZERlZmF1bHQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZERlZmF1bHRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgLy8gaW5zdC5fem9kLnFpbiA9IFwidHJ1ZVwiO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3J3YXJkIGRpcmVjdGlvbiAoZGVjb2RlKTogYXBwbHkgZGVmYXVsdHMgZm9yIHVuZGVmaW5lZCBpbnB1dFxuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogJFpvZERlZmF1bHQgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBpbW1lZGlhdGVseSBpbiBmb3J3YXJkIGRpcmVjdGlvbi5cbiAgICAgICAgICAgICAqIEl0IGRvZXNuJ3QgcGFzcyB0aGUgZGVmYXVsdCB2YWx1ZSBpbnRvIHRoZSB2YWxpZGF0b3IgKFwicHJlZmF1bHRcIikuIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIHBhc3MgdGhlIGRlZmF1bHQgdmFsdWUgdGhyb3VnaCB2YWxpZGF0aW9uLiBUaGUgdmFsaWRpdHkgb2YgdGhlIGRlZmF1bHQgaXMgZW5mb3JjZWQgYnkgVHlwZVNjcmlwdCBzdGF0aWNhbGx5LiBPdGhlcndpc2UsIGl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGVuc3VyZSB0aGUgZGVmYXVsdCBpcyB2YWxpZC4gSW4gdGhlIGNhc2Ugb2YgcGlwZXMgd2l0aCBkaXZlcmdlbnQgaW4vb3V0IHR5cGVzLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGRlZmF1bHQgb24gdGhlIGBpbmAgc2NoZW1hIG9mIHlvdXIgWm9kUGlwZSB0byBzZXQgYSBcInByZWZhdWx0XCIgZm9yIHRoZSBwaXBlLiAgICovIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uOiBjb250aW51ZSB3aXRoIGRlZmF1bHQgaGFuZGxpbmdcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVEZWZhdWx0UmVzdWx0KHJlc3VsdCwgZGVmKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZURlZmF1bHRSZXN1bHQocmVzdWx0LCBkZWYpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZURlZmF1bHRSZXN1bHQocGF5bG9hZCwgZGVmKSB7XG4gICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5leHBvcnQgY29uc3QgJFpvZFByZWZhdWx0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RQcmVmYXVsdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub3B0aW4gPSBcIm9wdGlvbmFsXCI7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gKGRlY29kZSk6IGFwcGx5IHByZWZhdWx0IGZvciB1bmRlZmluZWQgaW5wdXRcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5vbk9wdGlvbmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROb25PcHRpb25hbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+e1xuICAgICAgICBjb25zdCB2ID0gZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcztcbiAgICAgICAgcmV0dXJuIHYgPyBuZXcgU2V0KFtcbiAgICAgICAgICAgIC4uLnZcbiAgICAgICAgXS5maWx0ZXIoKHgpPT54ICE9PSB1bmRlZmluZWQpKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZU5vbk9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgaW5zdCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVOb25PcHRpb25hbFJlc3VsdChyZXN1bHQsIGluc3QpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZU5vbk9wdGlvbmFsUmVzdWx0KHBheWxvYWQsIGluc3QpIHtcbiAgICBpZiAoIXBheWxvYWQuaXNzdWVzLmxlbmd0aCAmJiBwYXlsb2FkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5leHBvcnQgY29uc3QgJFpvZFN1Y2Nlc3MgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFN1Y2Nlc3NcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEVuY29kZUVycm9yKFwiWm9kU3VjY2Vzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PntcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0Lmlzc3Vlcy5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0Lmlzc3Vlcy5sZW5ndGggPT09IDA7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2F0Y2ggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENhdGNoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uIChkZWNvZGUpOiBhcHBseSBjYXRjaCBsb2dpY1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PntcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5hTiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTmFOXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc05hTihwYXlsb2FkLnZhbHVlKSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJuYW5cIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kUGlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUGlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QudmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW4uX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5vdXQuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicHJvcFZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QucHJvcFZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBkZWYub3V0Ll96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmlnaHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0LnRoZW4oKHJpZ2h0KT0+aGFuZGxlUGlwZVJlc3VsdChyaWdodCwgZGVmLmluLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVQaXBlUmVzdWx0KHJpZ2h0LCBkZWYuaW4sIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdCA9IGRlZi5pbi5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWZ0LnRoZW4oKGxlZnQpPT5oYW5kbGVQaXBlUmVzdWx0KGxlZnQsIGRlZi5vdXQsIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVQaXBlUmVzdWx0KGxlZnQsIGRlZi5vdXQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlUGlwZVJlc3VsdChsZWZ0LCBuZXh0LCBjdHgpIHtcbiAgICBpZiAobGVmdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZnVydGhlciBjaGVja3NcbiAgICAgICAgbGVmdC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Ll96b2QucnVuKHtcbiAgICAgICAgdmFsdWU6IGxlZnQudmFsdWUsXG4gICAgICAgIGlzc3VlczogbGVmdC5pc3N1ZXNcbiAgICB9LCBjdHgpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RDb2RlYyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ29kZWNcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbi5fem9kLnZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLmluLl96b2Qub3B0aW4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYub3V0Ll96b2Qub3B0b3V0KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PmRlZi5pbi5fem9kLnByb3BWYWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGN0eC5kaXJlY3Rpb24gfHwgXCJmb3J3YXJkXCI7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IFwiZm9yd2FyZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gZGVmLmluLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdC50aGVuKChsZWZ0KT0+aGFuZGxlQ29kZWNBUmVzdWx0KGxlZnQsIGRlZiwgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQ29kZWNBUmVzdWx0KGxlZnQsIGRlZiwgY3R4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZGVmLm91dC5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJpZ2h0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByaWdodC50aGVuKChyaWdodCk9PmhhbmRsZUNvZGVjQVJlc3VsdChyaWdodCwgZGVmLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVDb2RlY0FSZXN1bHQocmlnaHQsIGRlZiwgY3R4KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZUNvZGVjQVJlc3VsdChyZXN1bHQsIGRlZiwgY3R4KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZnVydGhlciBjaGVja3NcbiAgICAgICAgcmVzdWx0LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBjdHguZGlyZWN0aW9uIHx8IFwiZm9yd2FyZFwiO1xuICAgIGlmIChkaXJlY3Rpb24gPT09IFwiZm9yd2FyZFwiKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gZGVmLnRyYW5zZm9ybShyZXN1bHQudmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZC50aGVuKCh2YWx1ZSk9PmhhbmRsZUNvZGVjVHhSZXN1bHQocmVzdWx0LCB2YWx1ZSwgZGVmLm91dCwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZUNvZGVjVHhSZXN1bHQocmVzdWx0LCB0cmFuc2Zvcm1lZCwgZGVmLm91dCwgY3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IGRlZi5yZXZlcnNlVHJhbnNmb3JtKHJlc3VsdC52YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkLnRoZW4oKHZhbHVlKT0+aGFuZGxlQ29kZWNUeFJlc3VsdChyZXN1bHQsIHZhbHVlLCBkZWYuaW4sIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVDb2RlY1R4UmVzdWx0KHJlc3VsdCwgdHJhbnNmb3JtZWQsIGRlZi5pbiwgY3R4KTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVDb2RlY1R4UmVzdWx0KGxlZnQsIHZhbHVlLCBuZXh0U2NoZW1hLCBjdHgpIHtcbiAgICAvLyBDaGVjayBpZiB0cmFuc2Zvcm0gYWRkZWQgYW55IGlzc3Vlc1xuICAgIGlmIChsZWZ0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgbGVmdC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0U2NoZW1hLl96b2QucnVuKHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGlzc3VlczogbGVmdC5pc3N1ZXNcbiAgICB9LCBjdHgpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RSZWFkb25seSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUmVhZG9ubHlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QucHJvcFZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbm5lclR5cGU/Ll96b2Q/Lm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLmlubmVyVHlwZT8uX3pvZD8ub3B0b3V0KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihoYW5kbGVSZWFkb25seVJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlYWRvbmx5UmVzdWx0KHJlc3VsdCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlUmVhZG9ubHlSZXN1bHQocGF5bG9hZCkge1xuICAgIHBheWxvYWQudmFsdWUgPSBPYmplY3QuZnJlZXplKHBheWxvYWQudmFsdWUpO1xuICAgIHJldHVybiBwYXlsb2FkO1xufVxuZXhwb3J0IGNvbnN0ICRab2RUZW1wbGF0ZUxpdGVyYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFRlbXBsYXRlTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCByZWdleFBhcnRzID0gW107XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGRlZi5wYXJ0cyl7XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiBwYXJ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBpcyBab2Qgc2NoZW1hXG4gICAgICAgICAgICBpZiAoIXBhcnQuX3pvZC5wYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgKCFzb3VyY2UpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydCwgbm8gcGF0dGVybiBmb3VuZDogJHtbXG4gICAgICAgICAgICAgICAgICAgIC4uLnBhcnQuX3pvZC50cmFpdHNcbiAgICAgICAgICAgICAgICBdLnNoaWZ0KCl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBwYXJ0Ll96b2QucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCA/IHBhcnQuX3pvZC5wYXR0ZXJuLnNvdXJjZSA6IHBhcnQuX3pvZC5wYXR0ZXJuO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQ6ICR7cGFydC5fem9kLnRyYWl0c31gKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gc291cmNlLnN0YXJ0c1dpdGgoXCJeXCIpID8gMSA6IDA7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBzb3VyY2UuZW5kc1dpdGgoXCIkXCIpID8gc291cmNlLmxlbmd0aCAtIDEgOiBzb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgcmVnZXhQYXJ0cy5wdXNoKHNvdXJjZS5zbGljZShzdGFydCwgZW5kKSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gbnVsbCB8fCB1dGlsLnByaW1pdGl2ZVR5cGVzLmhhcyh0eXBlb2YgcGFydCkpIHtcbiAgICAgICAgICAgIHJlZ2V4UGFydHMucHVzaCh1dGlsLmVzY2FwZVJlZ2V4KGAke3BhcnR9YCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydDogJHtwYXJ0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7cmVnZXhQYXJ0cy5qb2luKFwiXCIpfSRgKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdC5fem9kLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKCFpbnN0Ll96b2QucGF0dGVybi50ZXN0KHBheWxvYWQudmFsdWUpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IGRlZi5mb3JtYXQgPz8gXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogaW5zdC5fem9kLnBhdHRlcm4uc291cmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRnVuY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEZ1bmN0aW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX2RlZiA9IGRlZjtcbiAgICBpbnN0Ll96b2QuZGVmID0gZGVmO1xuICAgIGluc3QuaW1wbGVtZW50ID0gKGZ1bmMpPT57XG4gICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbXBsZW1lbnQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBpbnN0Ll9kZWYuaW5wdXQgPyBwYXJzZShpbnN0Ll9kZWYuaW5wdXQsIGFyZ3MpIDogYXJncztcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZnVuYywgdGhpcywgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICBpZiAoaW5zdC5fZGVmLm91dHB1dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZShpbnN0Ll9kZWYub3V0cHV0LCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGluc3QuaW1wbGVtZW50QXN5bmMgPSAoZnVuYyk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImltcGxlbWVudEFzeW5jKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gaW5zdC5fZGVmLmlucHV0ID8gYXdhaXQgcGFyc2VBc3luYyhpbnN0Ll9kZWYuaW5wdXQsIGFyZ3MpIDogYXJncztcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJlZmxlY3QuYXBwbHkoZnVuYywgdGhpcywgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICBpZiAoaW5zdC5fZGVmLm91dHB1dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwYXJzZUFzeW5jKGluc3QuX2RlZi5vdXRwdXQsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH07XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiBvdXRwdXQgaXMgYSBwcm9taXNlIHR5cGUgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCB1c2UgYXN5bmMgaW1wbGVtZW50YXRpb25cbiAgICAgICAgY29uc3QgaGFzUHJvbWlzZU91dHB1dCA9IGluc3QuX2RlZi5vdXRwdXQgJiYgaW5zdC5fZGVmLm91dHB1dC5fem9kLmRlZi50eXBlID09PSBcInByb21pc2VcIjtcbiAgICAgICAgaWYgKGhhc1Byb21pc2VPdXRwdXQpIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBpbnN0LmltcGxlbWVudEFzeW5jKHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGluc3QuaW1wbGVtZW50KHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG4gICAgaW5zdC5pbnB1dCA9ICguLi5hcmdzKT0+e1xuICAgICAgICBjb25zdCBGID0gaW5zdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRih7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBuZXcgJFpvZFR1cGxlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogYXJnc1swXSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdDogYXJnc1sxXVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG91dHB1dDogaW5zdC5fZGVmLm91dHB1dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIGlucHV0OiBhcmdzWzBdLFxuICAgICAgICAgICAgb3V0cHV0OiBpbnN0Ll9kZWYub3V0cHV0XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaW5zdC5vdXRwdXQgPSAob3V0cHV0KT0+e1xuICAgICAgICBjb25zdCBGID0gaW5zdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBGKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIGlucHV0OiBpbnN0Ll9kZWYuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gaW5zdDtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RQcm9taXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RQcm9taXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocGF5bG9hZC52YWx1ZSkudGhlbigoaW5uZXIpPT5kZWYuaW5uZXJUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5uZXIsXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RMYXp5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RMYXp5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIC8vIGxldCBfaW5uZXJUeXBlITogYW55O1xuICAgIC8vIHV0aWwuZGVmaW5lTGF6eShkZWYsIFwiZ2V0dGVyXCIsICgpID0+IHtcbiAgICAvLyAgIGlmICghX2lubmVyVHlwZSkge1xuICAgIC8vICAgICBfaW5uZXJUeXBlID0gZGVmLmdldHRlcigpO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuICgpID0+IF9pbm5lclR5cGU7XG4gICAgLy8gfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJpbm5lclR5cGVcIiwgKCk9PmRlZi5nZXR0ZXIoKSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT5pbnN0Ll96b2QuaW5uZXJUeXBlPy5fem9kPy5wYXR0ZXJuKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGU/Ll96b2Q/LnByb3BWYWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGU/Ll96b2Q/Lm9wdGluID8/IHVuZGVmaW5lZCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGU/Ll96b2Q/Lm9wdG91dCA/PyB1bmRlZmluZWQpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlubmVyID0gaW5zdC5fem9kLmlubmVyVHlwZTtcbiAgICAgICAgcmV0dXJuIGlubmVyLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDdXN0b20gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEN1c3RvbVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNoZWNrcy4kWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgXyk9PntcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCByID0gZGVmLmZuKGlucHV0KTtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gci50aGVuKChyKT0+aGFuZGxlUmVmaW5lUmVzdWx0KHIsIHBheWxvYWQsIGlucHV0LCBpbnN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlUmVmaW5lUmVzdWx0KHIsIHBheWxvYWQsIGlucHV0LCBpbnN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVJlZmluZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGlucHV0LCBpbnN0KSB7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgY29uc3QgX2lzcyA9IHtcbiAgICAgICAgICAgIGNvZGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZi5wYXRoID8/IFtdXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgY29udGludWU6ICFpbnN0Ll96b2QuZGVmLmFib3J0XG4gICAgICAgIH07XG4gICAgICAgIGlmIChpbnN0Ll96b2QuZGVmLnBhcmFtcykgX2lzcy5wYXJhbXMgPSBpbnN0Ll96b2QuZGVmLnBhcmFtcztcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKF9pc3MpKTtcbiAgICB9XG59XG4iLCAidmFyIF9hO1xuZXhwb3J0IGNvbnN0ICRvdXRwdXQgPSBTeW1ib2woXCJab2RPdXRwdXRcIik7XG5leHBvcnQgY29uc3QgJGlucHV0ID0gU3ltYm9sKFwiWm9kSW5wdXRcIik7XG5leHBvcnQgY2xhc3MgJFpvZFJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLl9pZG1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgYWRkKHNjaGVtYSwgLi4uX21ldGEpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IF9tZXRhWzBdO1xuICAgICAgICB0aGlzLl9tYXAuc2V0KHNjaGVtYSwgbWV0YSk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiBtZXRhKSB7XG4gICAgICAgICAgICB0aGlzLl9pZG1hcC5zZXQobWV0YS5pZCwgc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuX2lkbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVtb3ZlKHNjaGVtYSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fbWFwLmdldChzY2hlbWEpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBcImlkXCIgaW4gbWV0YSkge1xuICAgICAgICAgICAgdGhpcy5faWRtYXAuZGVsZXRlKG1ldGEuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoc2NoZW1hKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldChzY2hlbWEpIHtcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuX21hcC5nZXQoc2NoZW1hKSBhcyBhbnk7XG4gICAgICAgIC8vIGluaGVyaXQgbWV0YWRhdGFcbiAgICAgICAgY29uc3QgcCA9IHNjaGVtYS5fem9kLnBhcmVudDtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIGNvbnN0IHBtID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0KHApID8/IHt9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGVsZXRlIHBtLmlkOyAvLyBkbyBub3QgaW5oZXJpdCBpZFxuICAgICAgICAgICAgY29uc3QgZiA9IHtcbiAgICAgICAgICAgICAgICAuLi5wbSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9tYXAuZ2V0KHNjaGVtYSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZikubGVuZ3RoID8gZiA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmdldChzY2hlbWEpO1xuICAgIH1cbiAgICBoYXMoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHNjaGVtYSk7XG4gICAgfVxufVxuLy8gcmVnaXN0cmllc1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdHJ5KCkge1xuICAgIHJldHVybiBuZXcgJFpvZFJlZ2lzdHJ5KCk7XG59XG4oX2EgPSBnbG9iYWxUaGlzKS5fX3pvZF9nbG9iYWxSZWdpc3RyeSA/PyAoX2EuX196b2RfZ2xvYmFsUmVnaXN0cnkgPSByZWdpc3RyeSgpKTtcbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IGdsb2JhbFRoaXMuX196b2RfZ2xvYmFsUmVnaXN0cnk7XG4iLCAiaW1wb3J0ICogYXMgY2hlY2tzIGZyb20gXCIuL2NoZWNrcy5qc1wiO1xuaW1wb3J0ICogYXMgcmVnaXN0cmllcyBmcm9tIFwiLi9yZWdpc3RyaWVzLmpzXCI7XG5pbXBvcnQgKiBhcyBzY2hlbWFzIGZyb20gXCIuL3NjaGVtYXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZFN0cmluZyhDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZW1haWwoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZW1haWxcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2d1aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZ3VpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdXVpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1dWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2NFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjYoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2NlwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjcoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF91cmwoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXJsXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9lbW9qaShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJlbW9qaVwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbmFub2lkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcIm5hbm9pZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfY3VpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjdWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jdWlkMihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjdWlkMlwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdWxpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1bGlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF94aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwieGlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9rc3VpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJrc3VpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaXB2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJpcHY0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9pcHY2KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImlwdjZcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX21hYyhDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJtYWNcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2NpZHJ2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjaWRydjRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2NpZHJ2NihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjaWRydjZcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2Jhc2U2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJiYXNlNjRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2Jhc2U2NHVybChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJiYXNlNjR1cmxcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2UxNjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZTE2NFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfand0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImp3dFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFRpbWVQcmVjaXNpb24gPSB7XG4gICAgQW55OiBudWxsLFxuICAgIE1pbnV0ZTogLTEsXG4gICAgU2Vjb25kOiAwLFxuICAgIE1pbGxpc2Vjb25kOiAzLFxuICAgIE1pY3Jvc2Vjb25kOiA2XG59O1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaXNvRGF0ZVRpbWUoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBvZmZzZXQ6IGZhbHNlLFxuICAgICAgICBsb2NhbDogZmFsc2UsXG4gICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaXNvRGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJkYXRlXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaXNvVGltZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ0aW1lXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9pc29EdXJhdGlvbihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJkdXJhdGlvblwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX251bWJlcihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2NvZXJjZWROdW1iZXIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2ludChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwic2FmZWludFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9mbG9hdDMyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2s6IFwibnVtYmVyX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJmbG9hdDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2Zsb2F0NjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcImZsb2F0NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaW50MzIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcImludDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3VpbnQzMihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwidWludDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2Jvb2xlYW4oQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZEJvb2xlYW4oQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9iaWdpbnQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkQmlnaW50KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9pbnQ2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgIGNoZWNrOiBcImJpZ2ludF9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwiaW50NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdWludDY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgY2hlY2s6IFwiYmlnaW50X2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJ1aW50NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3ltYm9sKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzeW1ib2xcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdW5kZWZpbmVkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmRlZmluZWRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbnVsbChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVsbFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9hbnkoQ2xhc3MpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJhbnlcIlxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdW5rbm93bihDbGFzcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVua25vd25cIlxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbmV2ZXIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm5ldmVyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3ZvaWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInZvaWRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkRGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX25hbihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibmFuXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2x0KHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMZXNzVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImxlc3NfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbHRlKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMZXNzVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImxlc3NfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgeyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6Lmx0ZSgpYCBpbnN0ZWFkLiAqLyBfbHRlIGFzIF9tYXggfTtcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2d0KHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tHcmVhdGVyVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImdyZWF0ZXJfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZ3RlKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tHcmVhdGVyVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImdyZWF0ZXJfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgeyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6Lmd0ZSgpYCBpbnN0ZWFkLiAqLyBfZ3RlIGFzIF9taW4gfTtcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3Bvc2l0aXZlKHBhcmFtcykge1xuICAgIHJldHVybiBfZ3QoMCwgcGFyYW1zKTtcbn1cbi8vIG5lZ2F0aXZlXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9uZWdhdGl2ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gX2x0KDAsIHBhcmFtcyk7XG59XG4vLyBub25wb3NpdGl2ZVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbm9ucG9zaXRpdmUocGFyYW1zKSB7XG4gICAgcmV0dXJuIF9sdGUoMCwgcGFyYW1zKTtcbn1cbi8vIG5vbm5lZ2F0aXZlXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9ub25uZWdhdGl2ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gX2d0ZSgwLCBwYXJhbXMpO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTXVsdGlwbGVPZih7XG4gICAgICAgIGNoZWNrOiBcIm11bHRpcGxlX29mXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHZhbHVlXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9tYXhTaXplKG1heGltdW0sIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01heFNpemUoe1xuICAgICAgICBjaGVjazogXCJtYXhfc2l6ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBtYXhpbXVtXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9taW5TaXplKG1pbmltdW0sIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01pblNpemUoe1xuICAgICAgICBjaGVjazogXCJtaW5fc2l6ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBtaW5pbXVtXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9zaXplKHNpemUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1NpemVFcXVhbHMoe1xuICAgICAgICBjaGVjazogXCJzaXplX2VxdWFsc1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBzaXplXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9tYXhMZW5ndGgobWF4aW11bSwgcGFyYW1zKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY2hlY2tzLiRab2RDaGVja01heExlbmd0aCh7XG4gICAgICAgIGNoZWNrOiBcIm1heF9sZW5ndGhcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbWF4aW11bVxuICAgIH0pO1xuICAgIHJldHVybiBjaDtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX21pbkxlbmd0aChtaW5pbXVtLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNaW5MZW5ndGgoe1xuICAgICAgICBjaGVjazogXCJtaW5fbGVuZ3RoXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIG1pbmltdW1cbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2xlbmd0aChsZW5ndGgsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0xlbmd0aEVxdWFscyh7XG4gICAgICAgIGNoZWNrOiBcImxlbmd0aF9lcXVhbHNcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbGVuZ3RoXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9yZWdleChwYXR0ZXJuLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tSZWdleCh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcInJlZ2V4XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHBhdHRlcm5cbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2xvd2VyY2FzZShwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMb3dlckNhc2Uoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJsb3dlcmNhc2VcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdXBwZXJjYXNlKHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1VwcGVyQ2FzZSh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcInVwcGVyY2FzZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9pbmNsdWRlcyhpbmNsdWRlcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrSW5jbHVkZXMoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJpbmNsdWRlc1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBpbmNsdWRlc1xuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3RhcnRzV2l0aChwcmVmaXgsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1N0YXJ0c1dpdGgoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJzdGFydHNfd2l0aFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBwcmVmaXhcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2VuZHNXaXRoKHN1ZmZpeCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrRW5kc1dpdGgoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJlbmRzX3dpdGhcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgc3VmZml4XG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9wcm9wZXJ0eShwcm9wZXJ0eSwgc2NoZW1hLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tQcm9wZXJ0eSh7XG4gICAgICAgIGNoZWNrOiBcInByb3BlcnR5XCIsXG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX21pbWUodHlwZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01pbWVUeXBlKHtcbiAgICAgICAgY2hlY2s6IFwibWltZV90eXBlXCIsXG4gICAgICAgIG1pbWU6IHR5cGVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9vdmVyd3JpdGUodHgpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tPdmVyd3JpdGUoe1xuICAgICAgICBjaGVjazogXCJvdmVyd3JpdGVcIixcbiAgICAgICAgdHhcbiAgICB9KTtcbn1cbi8vIG5vcm1hbGl6ZVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbm9ybWFsaXplKGZvcm0pIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC5ub3JtYWxpemUoZm9ybSkpO1xufVxuLy8gdHJpbVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdHJpbSgpIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC50cmltKCkpO1xufVxuLy8gdG9Mb3dlckNhc2Vcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3RvTG93ZXJDYXNlKCkge1xuICAgIHJldHVybiBfb3ZlcndyaXRlKChpbnB1dCk9PmlucHV0LnRvTG93ZXJDYXNlKCkpO1xufVxuLy8gdG9VcHBlckNhc2Vcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3RvVXBwZXJDYXNlKCkge1xuICAgIHJldHVybiBfb3ZlcndyaXRlKChpbnB1dCk9PmlucHV0LnRvVXBwZXJDYXNlKCkpO1xufVxuLy8gc2x1Z2lmeVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc2x1Z2lmeSgpIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT51dGlsLnNsdWdpZnkoaW5wdXQpKTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2FycmF5KENsYXNzLCBlbGVtZW50LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICAvLyBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgLy8gICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdW5pb24oQ2xhc3MsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfeG9yKENsYXNzLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmlvblwiLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9kaXNjcmltaW5hdGVkVW5pb24oQ2xhc3MsIGRpc2NyaW1pbmF0b3IsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGRpc2NyaW1pbmF0b3IsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2ludGVyc2VjdGlvbihDbGFzcywgbGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgbGVmdCxcbiAgICAgICAgcmlnaHRcbiAgICB9KTtcbn1cbi8vIGV4cG9ydCBmdW5jdGlvbiBfdHVwbGUoXG4vLyAgIENsYXNzOiB1dGlsLlNjaGVtYUNsYXNzPHNjaGVtYXMuJFpvZFR1cGxlPixcbi8vICAgaXRlbXM6IFtdLFxuLy8gICBwYXJhbXM/OiBzdHJpbmcgfCAkWm9kVHVwbGVQYXJhbXNcbi8vICk6IHNjaGVtYXMuJFpvZFR1cGxlPFtdLCBudWxsPjtcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3R1cGxlKENsYXNzLCBpdGVtcywgX3BhcmFtc09yUmVzdCwgX3BhcmFtcykge1xuICAgIGNvbnN0IGhhc1Jlc3QgPSBfcGFyYW1zT3JSZXN0IGluc3RhbmNlb2Ygc2NoZW1hcy4kWm9kVHlwZTtcbiAgICBjb25zdCBwYXJhbXMgPSBoYXNSZXN0ID8gX3BhcmFtcyA6IF9wYXJhbXNPclJlc3Q7XG4gICAgY29uc3QgcmVzdCA9IGhhc1Jlc3QgPyBfcGFyYW1zT3JSZXN0IDogbnVsbDtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgICAgICBpdGVtcyxcbiAgICAgICAgcmVzdCxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfcmVjb3JkKENsYXNzLCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInJlY29yZFwiLFxuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX21hcChDbGFzcywga2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJtYXBcIixcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9zZXQoQ2xhc3MsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZW51bShDbGFzcywgdmFsdWVzLCBwYXJhbXMpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gT2JqZWN0LmZyb21FbnRyaWVzKHZhbHVlcy5tYXAoKHYpPT5bXG4gICAgICAgICAgICB2LFxuICAgICAgICAgICAgdlxuICAgICAgICBdKSkgOiB2YWx1ZXM7XG4gICAgLy8gaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIC8vICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAvLyAgICAgZW50cmllc1t2YWx1ZV0gPSB2YWx1ZTtcbiAgICAvLyAgIH1cbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgT2JqZWN0LmFzc2lnbihlbnRyaWVzLCB2YWx1ZXMpO1xuICAgIC8vIH1cbiAgICAvLyBjb25zdCBlbnRyaWVzOiB1dGlsLkVudW1MaWtlID0ge307XG4gICAgLy8gZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgLy8gICBlbnRyaWVzW3ZhbF0gPSB2YWw7XG4gICAgLy8gfVxuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbi8qKiBAZGVwcmVjYXRlZCBUaGlzIEFQSSBoYXMgYmVlbiBtZXJnZWQgaW50byBgei5lbnVtKClgLiBVc2UgYHouZW51bSgpYCBpbnN0ZWFkLlxuICpcbiAqIGBgYHRzXG4gKiBlbnVtIENvbG9ycyB7IHJlZCwgZ3JlZW4sIGJsdWUgfVxuICogei5lbnVtKENvbG9ycyk7XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gX25hdGl2ZUVudW0oQ2xhc3MsIGVudHJpZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbGl0ZXJhbChDbGFzcywgdmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImxpdGVyYWxcIixcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgXSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZmlsZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF90cmFuc2Zvcm0oQ2xhc3MsIGZuKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidHJhbnNmb3JtXCIsXG4gICAgICAgIHRyYW5zZm9ybTogZm5cbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX29wdGlvbmFsKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJvcHRpb25hbFwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX251bGxhYmxlKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudWxsYWJsZVwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2RlZmF1bHQoQ2xhc3MsIGlubmVyVHlwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGRlZmF1bHRWYWx1ZSgpIDogdXRpbC5zaGFsbG93Q2xvbmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbm9ub3B0aW9uYWwoQ2xhc3MsIGlubmVyVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9zdWNjZXNzKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfY2F0Y2goQ2xhc3MsIGlubmVyVHlwZSwgY2F0Y2hWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImNhdGNoXCIsXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgY2F0Y2hWYWx1ZTogdHlwZW9mIGNhdGNoVmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGNhdGNoVmFsdWUgOiAoKT0+Y2F0Y2hWYWx1ZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfcGlwZShDbGFzcywgaW5fLCBvdXQpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBpbl8sXG4gICAgICAgIG91dFxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfcmVhZG9ubHkoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInJlYWRvbmx5XCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdGVtcGxhdGVMaXRlcmFsKENsYXNzLCBwYXJ0cywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidGVtcGxhdGVfbGl0ZXJhbFwiLFxuICAgICAgICBwYXJ0cyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbGF6eShDbGFzcywgZ2V0dGVyKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibGF6eVwiLFxuICAgICAgICBnZXR0ZXJcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3Byb21pc2UoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInByb21pc2VcIixcbiAgICAgICAgaW5uZXJUeXBlXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jdXN0b20oQ2xhc3MsIGZuLCBfcGFyYW1zKSB7XG4gICAgY29uc3Qgbm9ybSA9IHV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpO1xuICAgIG5vcm0uYWJvcnQgPz8gKG5vcm0uYWJvcnQgPSB0cnVlKTsgLy8gZGVmYXVsdCB0byBhYm9ydDpmYWxzZVxuICAgIGNvbnN0IHNjaGVtYSA9IG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIC4uLm5vcm1cbiAgICB9KTtcbiAgICByZXR1cm4gc2NoZW1hO1xufVxuLy8gc2FtZSBhcyBfY3VzdG9tIGJ1dCBkZWZhdWx0cyB0byBhYm9ydDpmYWxzZVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfcmVmaW5lKENsYXNzLCBmbiwgX3BhcmFtcykge1xuICAgIGNvbnN0IHNjaGVtYSA9IG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpXG4gICAgfSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3N1cGVyUmVmaW5lKGZuKSB7XG4gICAgY29uc3QgY2ggPSBfY2hlY2soKHBheWxvYWQpPT57XG4gICAgICAgIHBheWxvYWQuYWRkSXNzdWUgPSAoaXNzdWUpPT57XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKGlzc3VlLCBwYXlsb2FkLnZhbHVlLCBjaC5fem9kLmRlZikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgWm9kIDMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICBjb25zdCBfaXNzdWUgPSBpc3N1ZTtcbiAgICAgICAgICAgICAgICBpZiAoX2lzc3VlLmZhdGFsKSBfaXNzdWUuY29udGludWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuY29kZSA/PyAoX2lzc3VlLmNvZGUgPSBcImN1c3RvbVwiKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuaW5wdXQgPz8gKF9pc3N1ZS5pbnB1dCA9IHBheWxvYWQudmFsdWUpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5pbnN0ID8/IChfaXNzdWUuaW5zdCA9IGNoKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuY29udGludWUgPz8gKF9pc3N1ZS5jb250aW51ZSA9ICFjaC5fem9kLmRlZi5hYm9ydCk7IC8vIGFib3J0IGlzIGFsd2F5cyB1bmRlZmluZWQsIHNvIHRoaXMgaXMgYWx3YXlzIHRydWUuLi5cbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoX2lzc3VlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmbihwYXlsb2FkLnZhbHVlLCBwYXlsb2FkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2g7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jaGVjayhmbiwgcGFyYW1zKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY2hlY2tzLiRab2RDaGVjayh7XG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG4gICAgY2guX3pvZC5jaGVjayA9IGZuO1xuICAgIHJldHVybiBjaDtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmUoZGVzY3JpcHRpb24pIHtcbiAgICBjb25zdCBjaCA9IG5ldyBjaGVja3MuJFpvZENoZWNrKHtcbiAgICAgICAgY2hlY2s6IFwiZGVzY3JpYmVcIlxuICAgIH0pO1xuICAgIGNoLl96b2Qub25hdHRhY2ggPSBbXG4gICAgICAgIChpbnN0KT0+e1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZWdpc3RyaWVzLmdsb2JhbFJlZ2lzdHJ5LmdldChpbnN0KSA/PyB7fTtcbiAgICAgICAgICAgIHJlZ2lzdHJpZXMuZ2xvYmFsUmVnaXN0cnkuYWRkKGluc3QsIHtcbiAgICAgICAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICBdO1xuICAgIGNoLl96b2QuY2hlY2sgPSAoKT0+e307IC8vIG5vLW9wIGNoZWNrXG4gICAgcmV0dXJuIGNoO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBtZXRhKG1ldGFkYXRhKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY2hlY2tzLiRab2RDaGVjayh7XG4gICAgICAgIGNoZWNrOiBcIm1ldGFcIlxuICAgIH0pO1xuICAgIGNoLl96b2Qub25hdHRhY2ggPSBbXG4gICAgICAgIChpbnN0KT0+e1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZWdpc3RyaWVzLmdsb2JhbFJlZ2lzdHJ5LmdldChpbnN0KSA/PyB7fTtcbiAgICAgICAgICAgIHJlZ2lzdHJpZXMuZ2xvYmFsUmVnaXN0cnkuYWRkKGluc3QsIHtcbiAgICAgICAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICAgICAgICAuLi5tZXRhZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICBdO1xuICAgIGNoLl96b2QuY2hlY2sgPSAoKT0+e307IC8vIG5vLW9wIGNoZWNrXG4gICAgcmV0dXJuIGNoO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nYm9vbChDbGFzc2VzLCBfcGFyYW1zKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcyk7XG4gICAgbGV0IHRydXRoeUFycmF5ID0gcGFyYW1zLnRydXRoeSA/PyBbXG4gICAgICAgIFwidHJ1ZVwiLFxuICAgICAgICBcIjFcIixcbiAgICAgICAgXCJ5ZXNcIixcbiAgICAgICAgXCJvblwiLFxuICAgICAgICBcInlcIixcbiAgICAgICAgXCJlbmFibGVkXCJcbiAgICBdO1xuICAgIGxldCBmYWxzeUFycmF5ID0gcGFyYW1zLmZhbHN5ID8/IFtcbiAgICAgICAgXCJmYWxzZVwiLFxuICAgICAgICBcIjBcIixcbiAgICAgICAgXCJub1wiLFxuICAgICAgICBcIm9mZlwiLFxuICAgICAgICBcIm5cIixcbiAgICAgICAgXCJkaXNhYmxlZFwiXG4gICAgXTtcbiAgICBpZiAocGFyYW1zLmNhc2UgIT09IFwic2Vuc2l0aXZlXCIpIHtcbiAgICAgICAgdHJ1dGh5QXJyYXkgPSB0cnV0aHlBcnJheS5tYXAoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiA/IHYudG9Mb3dlckNhc2UoKSA6IHYpO1xuICAgICAgICBmYWxzeUFycmF5ID0gZmFsc3lBcnJheS5tYXAoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiA/IHYudG9Mb3dlckNhc2UoKSA6IHYpO1xuICAgIH1cbiAgICBjb25zdCB0cnV0aHlTZXQgPSBuZXcgU2V0KHRydXRoeUFycmF5KTtcbiAgICBjb25zdCBmYWxzeVNldCA9IG5ldyBTZXQoZmFsc3lBcnJheSk7XG4gICAgY29uc3QgX0NvZGVjID0gQ2xhc3Nlcy5Db2RlYyA/PyBzY2hlbWFzLiRab2RDb2RlYztcbiAgICBjb25zdCBfQm9vbGVhbiA9IENsYXNzZXMuQm9vbGVhbiA/PyBzY2hlbWFzLiRab2RCb29sZWFuO1xuICAgIGNvbnN0IF9TdHJpbmcgPSBDbGFzc2VzLlN0cmluZyA/PyBzY2hlbWFzLiRab2RTdHJpbmc7XG4gICAgY29uc3Qgc3RyaW5nU2NoZW1hID0gbmV3IF9TdHJpbmcoe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfSk7XG4gICAgY29uc3QgYm9vbGVhblNjaGVtYSA9IG5ldyBfQm9vbGVhbih7XG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfSk7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgX0NvZGVjKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBzdHJpbmdTY2hlbWEsXG4gICAgICAgIG91dDogYm9vbGVhblNjaGVtYSxcbiAgICAgICAgdHJhbnNmb3JtOiAoaW5wdXQsIHBheWxvYWQpPT57XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGlucHV0O1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5jYXNlICE9PSBcInNlbnNpdGl2ZVwiKSBkYXRhID0gZGF0YS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHRydXRoeVNldC5oYXMoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFsc3lTZXQuaGFzKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInN0cmluZ2Jvb2xcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50cnV0aHlTZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5mYWxzeVNldFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdDogY29kZWMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmV2ZXJzZVRyYW5zZm9ybTogKGlucHV0LCBfcGF5bG9hZCk9PntcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnV0aHlBcnJheVswXSB8fCBcInRydWVcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHN5QXJyYXlbMF0gfHwgXCJmYWxzZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvZGVjO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nRm9ybWF0KENsYXNzLCBmb3JtYXQsIGZuT3JSZWdleCwgX3BhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgcGFyYW1zID0gdXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcyk7XG4gICAgY29uc3QgZGVmID0ge1xuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKSxcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIGZuOiB0eXBlb2YgZm5PclJlZ2V4ID09PSBcImZ1bmN0aW9uXCIgPyBmbk9yUmVnZXggOiAodmFsKT0+Zm5PclJlZ2V4LnRlc3QodmFsKSxcbiAgICAgICAgLi4ucGFyYW1zXG4gICAgfTtcbiAgICBpZiAoZm5PclJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGRlZi5wYXR0ZXJuID0gZm5PclJlZ2V4O1xuICAgIH1cbiAgICBjb25zdCBpbnN0ID0gbmV3IENsYXNzKGRlZik7XG4gICAgcmV0dXJuIGluc3Q7XG59XG4iLCAiaW1wb3J0IHsgZ2xvYmFsUmVnaXN0cnkgfSBmcm9tIFwiLi9yZWdpc3RyaWVzLmpzXCI7XG4vLyBmdW5jdGlvbiBpbml0aWFsaXplQ29udGV4dDxUIGV4dGVuZHMgc2NoZW1hcy4kWm9kVHlwZT4oaW5wdXRzOiBKU09OU2NoZW1hR2VuZXJhdG9yUGFyYW1zPFQ+KTogVG9KU09OU2NoZW1hQ29udGV4dDxUPiB7XG4vLyAgIHJldHVybiB7XG4vLyAgICAgcHJvY2Vzc29yOiBpbnB1dHMucHJvY2Vzc29yLFxuLy8gICAgIG1ldGFkYXRhUmVnaXN0cnk6IGlucHV0cy5tZXRhZGF0YSA/PyBnbG9iYWxSZWdpc3RyeSxcbi8vICAgICB0YXJnZXQ6IGlucHV0cy50YXJnZXQgPz8gXCJkcmFmdC0yMDIwLTEyXCIsXG4vLyAgICAgdW5yZXByZXNlbnRhYmxlOiBpbnB1dHMudW5yZXByZXNlbnRhYmxlID8/IFwidGhyb3dcIixcbi8vICAgfTtcbi8vIH1cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ29udGV4dChwYXJhbXMpIHtcbiAgICAvLyBOb3JtYWxpemUgdGFyZ2V0OiBjb252ZXJ0IG9sZCBub24taHlwaGVuYXRlZCB2ZXJzaW9ucyB0byBoeXBoZW5hdGVkIHZlcnNpb25zXG4gICAgbGV0IHRhcmdldCA9IHBhcmFtcz8udGFyZ2V0ID8/IFwiZHJhZnQtMjAyMC0xMlwiO1xuICAgIGlmICh0YXJnZXQgPT09IFwiZHJhZnQtNFwiKSB0YXJnZXQgPSBcImRyYWZ0LTA0XCI7XG4gICAgaWYgKHRhcmdldCA9PT0gXCJkcmFmdC03XCIpIHRhcmdldCA9IFwiZHJhZnQtMDdcIjtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9jZXNzb3JzOiBwYXJhbXMucHJvY2Vzc29ycyA/PyB7fSxcbiAgICAgICAgbWV0YWRhdGFSZWdpc3RyeTogcGFyYW1zPy5tZXRhZGF0YSA/PyBnbG9iYWxSZWdpc3RyeSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICB1bnJlcHJlc2VudGFibGU6IHBhcmFtcz8udW5yZXByZXNlbnRhYmxlID8/IFwidGhyb3dcIixcbiAgICAgICAgb3ZlcnJpZGU6IHBhcmFtcz8ub3ZlcnJpZGUgPz8gKCgpPT57fSksXG4gICAgICAgIGlvOiBwYXJhbXM/LmlvID8/IFwib3V0cHV0XCIsXG4gICAgICAgIGNvdW50ZXI6IDAsXG4gICAgICAgIHNlZW46IG5ldyBNYXAoKSxcbiAgICAgICAgY3ljbGVzOiBwYXJhbXM/LmN5Y2xlcyA/PyBcInJlZlwiLFxuICAgICAgICByZXVzZWQ6IHBhcmFtcz8ucmV1c2VkID8/IFwiaW5saW5lXCIsXG4gICAgICAgIGV4dGVybmFsOiBwYXJhbXM/LmV4dGVybmFsID8/IHVuZGVmaW5lZFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcHJvY2VzcyhzY2hlbWEsIGN0eCwgX3BhcmFtcyA9IHtcbiAgICBwYXRoOiBbXSxcbiAgICBzY2hlbWFQYXRoOiBbXVxufSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgLy8gY2hlY2sgZm9yIHNjaGVtYSBpbiBzZWVuc1xuICAgIGNvbnN0IHNlZW4gPSBjdHguc2Vlbi5nZXQoc2NoZW1hKTtcbiAgICBpZiAoc2Vlbikge1xuICAgICAgICBzZWVuLmNvdW50Kys7XG4gICAgICAgIC8vIGNoZWNrIGlmIGN5Y2xlXG4gICAgICAgIGNvbnN0IGlzQ3ljbGUgPSBfcGFyYW1zLnNjaGVtYVBhdGguaW5jbHVkZXMoc2NoZW1hKTtcbiAgICAgICAgaWYgKGlzQ3ljbGUpIHtcbiAgICAgICAgICAgIHNlZW4uY3ljbGUgPSBfcGFyYW1zLnBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZW4uc2NoZW1hO1xuICAgIH1cbiAgICAvLyBpbml0aWFsaXplXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBzY2hlbWE6IHt9LFxuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgY3ljbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgcGF0aDogX3BhcmFtcy5wYXRoXG4gICAgfTtcbiAgICBjdHguc2Vlbi5zZXQoc2NoZW1hLCByZXN1bHQpO1xuICAgIC8vIGN1c3RvbSBtZXRob2Qgb3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3JcbiAgICBjb25zdCBvdmVycmlkZVNjaGVtYSA9IHNjaGVtYS5fem9kLnRvSlNPTlNjaGVtYT8uKCk7XG4gICAgaWYgKG92ZXJyaWRlU2NoZW1hKSB7XG4gICAgICAgIHJlc3VsdC5zY2hlbWEgPSBvdmVycmlkZVNjaGVtYTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICAuLi5fcGFyYW1zLFxuICAgICAgICAgICAgc2NoZW1hUGF0aDogW1xuICAgICAgICAgICAgICAgIC4uLl9wYXJhbXMuc2NoZW1hUGF0aCxcbiAgICAgICAgICAgICAgICBzY2hlbWFcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBwYXRoOiBfcGFyYW1zLnBhdGhcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNjaGVtYS5fem9kLnByb2Nlc3NKU09OU2NoZW1hKSB7XG4gICAgICAgICAgICBzY2hlbWEuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYShjdHgsIHJlc3VsdC5zY2hlbWEsIHBhcmFtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBfanNvbiA9IHJlc3VsdC5zY2hlbWE7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzb3IgPSBjdHgucHJvY2Vzc29yc1tkZWYudHlwZV07XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3RvSlNPTlNjaGVtYV06IE5vbi1yZXByZXNlbnRhYmxlIHR5cGUgZW5jb3VudGVyZWQ6ICR7ZGVmLnR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzb3Ioc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjaGVtYS5fem9kLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgLy8gQWxzbyBzZXQgcmVmIGlmIHByb2Nlc3NvciBkaWRuJ3QgKGZvciBpbmhlcml0YW5jZSlcbiAgICAgICAgICAgIGlmICghcmVzdWx0LnJlZikgcmVzdWx0LnJlZiA9IHBhcmVudDtcbiAgICAgICAgICAgIHByb2Nlc3MocGFyZW50LCBjdHgsIHBhcmFtcyk7XG4gICAgICAgICAgICBjdHguc2Vlbi5nZXQocGFyZW50KS5pc1BhcmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbWV0YWRhdGFcbiAgICBjb25zdCBtZXRhID0gY3R4Lm1ldGFkYXRhUmVnaXN0cnkuZ2V0KHNjaGVtYSk7XG4gICAgaWYgKG1ldGEpIE9iamVjdC5hc3NpZ24ocmVzdWx0LnNjaGVtYSwgbWV0YSk7XG4gICAgaWYgKGN0eC5pbyA9PT0gXCJpbnB1dFwiICYmIGlzVHJhbnNmb3JtaW5nKHNjaGVtYSkpIHtcbiAgICAgICAgLy8gZXhhbXBsZXMvZGVmYXVsdHMgb25seSBhcHBseSB0byBvdXRwdXQgdHlwZSBvZiBwaXBlXG4gICAgICAgIGRlbGV0ZSByZXN1bHQuc2NoZW1hLmV4YW1wbGVzO1xuICAgICAgICBkZWxldGUgcmVzdWx0LnNjaGVtYS5kZWZhdWx0O1xuICAgIH1cbiAgICAvLyBzZXQgcHJlZmF1bHQgYXMgZGVmYXVsdFxuICAgIGlmIChjdHguaW8gPT09IFwiaW5wdXRcIiAmJiByZXN1bHQuc2NoZW1hLl9wcmVmYXVsdCkgKF9hID0gcmVzdWx0LnNjaGVtYSkuZGVmYXVsdCA/PyAoX2EuZGVmYXVsdCA9IHJlc3VsdC5zY2hlbWEuX3ByZWZhdWx0KTtcbiAgICBkZWxldGUgcmVzdWx0LnNjaGVtYS5fcHJlZmF1bHQ7XG4gICAgLy8gcHVsbGluZyBmcmVzaCBmcm9tIGN0eC5zZWVuIGluIGNhc2UgaXQgd2FzIG92ZXJ3cml0dGVuXG4gICAgY29uc3QgX3Jlc3VsdCA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHJldHVybiBfcmVzdWx0LnNjaGVtYTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGVmcyhjdHgsIHNjaGVtYSkge1xuICAgIC8vIGl0ZXJhdGUgb3ZlciBzZWVuIG1hcDtcbiAgICBjb25zdCByb290ID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoXCJVbnByb2Nlc3NlZCBzY2hlbWEuIFRoaXMgaXMgYSBidWcgaW4gWm9kLlwiKTtcbiAgICAvLyBUcmFjayBpZHMgdG8gZGV0ZWN0IGR1cGxpY2F0ZXMgYWNyb3NzIGRpZmZlcmVudCBzY2hlbWFzXG4gICAgY29uc3QgaWRUb1NjaGVtYSA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGN0eC5zZWVuLmVudHJpZXMoKSl7XG4gICAgICAgIGNvbnN0IGlkID0gY3R4Lm1ldGFkYXRhUmVnaXN0cnkuZ2V0KGVudHJ5WzBdKT8uaWQ7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBpZFRvU2NoZW1hLmdldChpZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcgIT09IGVudHJ5WzBdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgc2NoZW1hIGlkIFwiJHtpZH1cIiBkZXRlY3RlZCBkdXJpbmcgSlNPTiBTY2hlbWEgY29udmVyc2lvbi4gVHdvIGRpZmZlcmVudCBzY2hlbWFzIGNhbm5vdCBzaGFyZSB0aGUgc2FtZSBpZCB3aGVuIGNvbnZlcnRlZCB0b2dldGhlci5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkVG9TY2hlbWEuc2V0KGlkLCBlbnRyeVswXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcmV0dXJucyBhIHJlZiB0byB0aGUgc2NoZW1hXG4gICAgLy8gZGVmSWQgd2lsbCBiZSBlbXB0eSBpZiB0aGUgcmVmIHBvaW50cyB0byBhbiBleHRlcm5hbCBzY2hlbWEgKG9yICMpXG4gICAgY29uc3QgbWFrZVVSSSA9IChlbnRyeSk9PntcbiAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBzZWVuIG9iamVjdHMgYmVjYXVzZSBzb21ldGltZXNcbiAgICAgICAgLy8gbXVsdGlwbGUgc2NoZW1hcyBtYXAgdG8gdGhlIHNhbWUgc2VlbiBvYmplY3QuXG4gICAgICAgIC8vIGUuZy4gbGF6eVxuICAgICAgICAvLyBleHRlcm5hbCBpcyBjb25maWd1cmVkXG4gICAgICAgIGNvbnN0IGRlZnNTZWdtZW50ID0gY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0yMDIwLTEyXCIgPyBcIiRkZWZzXCIgOiBcImRlZmluaXRpb25zXCI7XG4gICAgICAgIGlmIChjdHguZXh0ZXJuYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVybmFsSWQgPSBjdHguZXh0ZXJuYWwucmVnaXN0cnkuZ2V0KGVudHJ5WzBdKT8uaWQ7IC8vID8/IFwiX19zaGFyZWRcIjsvLyBgX19zY2hlbWEke2N0eC5jb3VudGVyKyt9YDtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHNjaGVtYSBpcyBpbiB0aGUgZXh0ZXJuYWwgcmVnaXN0cnlcbiAgICAgICAgICAgIGNvbnN0IHVyaUdlbmVyYXRvciA9IGN0eC5leHRlcm5hbC51cmkgPz8gKChpZCk9PmlkKTtcbiAgICAgICAgICAgIGlmIChleHRlcm5hbElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiB1cmlHZW5lcmF0b3IoZXh0ZXJuYWxJZClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBhZGQgdG8gX19zaGFyZWRcbiAgICAgICAgICAgIGNvbnN0IGlkID0gZW50cnlbMV0uZGVmSWQgPz8gZW50cnlbMV0uc2NoZW1hLmlkID8/IGBzY2hlbWEke2N0eC5jb3VudGVyKyt9YDtcbiAgICAgICAgICAgIGVudHJ5WzFdLmRlZklkID0gaWQ7IC8vIHNldCBkZWZJZCBzbyBpdCB3aWxsIGJlIHJldXNlZCBpZiBuZWVkZWRcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGVmSWQ6IGlkLFxuICAgICAgICAgICAgICAgIHJlZjogYCR7dXJpR2VuZXJhdG9yKFwiX19zaGFyZWRcIil9Iy8ke2RlZnNTZWdtZW50fS8ke2lkfWBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5WzFdID09PSByb290KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlZjogXCIjXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2VsZi1jb250YWluZWQgc2NoZW1hXG4gICAgICAgIGNvbnN0IHVyaVByZWZpeCA9IGAjYDtcbiAgICAgICAgY29uc3QgZGVmVXJpUHJlZml4ID0gYCR7dXJpUHJlZml4fS8ke2RlZnNTZWdtZW50fS9gO1xuICAgICAgICBjb25zdCBkZWZJZCA9IGVudHJ5WzFdLnNjaGVtYS5pZCA/PyBgX19zY2hlbWEke2N0eC5jb3VudGVyKyt9YDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlZklkLFxuICAgICAgICAgICAgcmVmOiBkZWZVcmlQcmVmaXggKyBkZWZJZFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLy8gc3RvcmVkIGNhY2hlZCB2ZXJzaW9uIGluIGBkZWZgIHByb3BlcnR5XG4gICAgLy8gcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzLCBzZXQgJHJlZlxuICAgIGNvbnN0IGV4dHJhY3RUb0RlZiA9IChlbnRyeSk9PntcbiAgICAgICAgLy8gaWYgdGhlIHNjaGVtYSBpcyBhbHJlYWR5IGEgcmVmZXJlbmNlLCBkbyBub3QgZXh0cmFjdCBpdFxuICAgICAgICBpZiAoZW50cnlbMV0uc2NoZW1hLiRyZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWVuID0gZW50cnlbMV07XG4gICAgICAgIGNvbnN0IHsgcmVmLCBkZWZJZCB9ID0gbWFrZVVSSShlbnRyeSk7XG4gICAgICAgIHNlZW4uZGVmID0ge1xuICAgICAgICAgICAgLi4uc2Vlbi5zY2hlbWFcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVmSWQgd29uJ3QgYmUgc2V0IGlmIHRoZSBzY2hlbWEgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc2NoZW1hXG4gICAgICAgIC8vIG9yIGlmIHRoZSBzY2hlbWEgaXMgdGhlIHJvb3Qgc2NoZW1hXG4gICAgICAgIGlmIChkZWZJZCkgc2Vlbi5kZWZJZCA9IGRlZklkO1xuICAgICAgICAvLyB3aXBlIGF3YXkgYWxsIHByb3BlcnRpZXMgZXhjZXB0ICRyZWZcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2Vlbi5zY2hlbWE7XG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2NoZW1hKXtcbiAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBzY2hlbWEuJHJlZiA9IHJlZjtcbiAgICB9O1xuICAgIC8vIHRocm93IG9uIGN5Y2xlc1xuICAgIC8vIGJyZWFrIGN5Y2xlc1xuICAgIGlmIChjdHguY3ljbGVzID09PSBcInRocm93XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjdHguc2Vlbi5lbnRyaWVzKCkpe1xuICAgICAgICAgICAgY29uc3Qgc2VlbiA9IGVudHJ5WzFdO1xuICAgICAgICAgICAgaWYgKHNlZW4uY3ljbGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDeWNsZSBkZXRlY3RlZDogXCIgKyBgIy8ke3NlZW4uY3ljbGU/LmpvaW4oXCIvXCIpfS88cm9vdD5gICsgJ1xcblxcblNldCB0aGUgYGN5Y2xlc2AgcGFyYW1ldGVyIHRvIGBcInJlZlwiYCB0byByZXNvbHZlIGN5Y2xpY2FsIHNjaGVtYXMgd2l0aCBkZWZzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGV4dHJhY3Qgc2NoZW1hcyBpbnRvICRkZWZzXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBjdHguc2Vlbi5lbnRyaWVzKCkpe1xuICAgICAgICBjb25zdCBzZWVuID0gZW50cnlbMV07XG4gICAgICAgIC8vIGNvbnZlcnQgcm9vdCBzY2hlbWEgdG8gIyAkcmVmXG4gICAgICAgIGlmIChzY2hlbWEgPT09IGVudHJ5WzBdKSB7XG4gICAgICAgICAgICBleHRyYWN0VG9EZWYoZW50cnkpOyAvLyB0aGlzIGhhcyBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGUgcm9vdCBzY2hlbWFcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4dHJhY3Qgc2NoZW1hcyB0aGF0IGFyZSBpbiB0aGUgZXh0ZXJuYWwgcmVnaXN0cnlcbiAgICAgICAgaWYgKGN0eC5leHRlcm5hbCkge1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gY3R4LmV4dGVybmFsLnJlZ2lzdHJ5LmdldChlbnRyeVswXSk/LmlkO1xuICAgICAgICAgICAgaWYgKHNjaGVtYSAhPT0gZW50cnlbMF0gJiYgZXh0KSB7XG4gICAgICAgICAgICAgICAgZXh0cmFjdFRvRGVmKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBleHRyYWN0IHNjaGVtYXMgd2l0aCBgaWRgIG1ldGFcbiAgICAgICAgY29uc3QgaWQgPSBjdHgubWV0YWRhdGFSZWdpc3RyeS5nZXQoZW50cnlbMF0pPy5pZDtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBleHRyYWN0VG9EZWYoZW50cnkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYnJlYWsgY3ljbGVzXG4gICAgICAgIGlmIChzZWVuLmN5Y2xlKSB7XG4gICAgICAgICAgICAvLyBhbnlcbiAgICAgICAgICAgIGV4dHJhY3RUb0RlZihlbnRyeSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleHRyYWN0IHJldXNlZCBzY2hlbWFzXG4gICAgICAgIGlmIChzZWVuLmNvdW50ID4gMSkge1xuICAgICAgICAgICAgaWYgKGN0eC5yZXVzZWQgPT09IFwicmVmXCIpIHtcbiAgICAgICAgICAgICAgICBleHRyYWN0VG9EZWYoZW50cnkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplKGN0eCwgc2NoZW1hKSB7XG4gICAgY29uc3Qgcm9vdCA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKFwiVW5wcm9jZXNzZWQgc2NoZW1hLiBUaGlzIGlzIGEgYnVnIGluIFpvZC5cIik7XG4gICAgLy8gZmxhdHRlbiByZWZzIC0gaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gcGFyZW50IHNjaGVtYXNcbiAgICBjb25zdCBmbGF0dGVuUmVmID0gKHpvZFNjaGVtYSk9PntcbiAgICAgICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldCh6b2RTY2hlbWEpO1xuICAgICAgICAvLyBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICBpZiAoc2Vlbi5yZWYgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2Vlbi5kZWYgPz8gc2Vlbi5zY2hlbWE7XG4gICAgICAgIGNvbnN0IF9jYWNoZWQgPSB7XG4gICAgICAgICAgICAuLi5zY2hlbWFcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVmID0gc2Vlbi5yZWY7XG4gICAgICAgIHNlZW4ucmVmID0gbnVsbDsgLy8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb25cbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgZmxhdHRlblJlZihyZWYpO1xuICAgICAgICAgICAgY29uc3QgcmVmU2VlbiA9IGN0eC5zZWVuLmdldChyZWYpO1xuICAgICAgICAgICAgY29uc3QgcmVmU2NoZW1hID0gcmVmU2Vlbi5zY2hlbWE7XG4gICAgICAgICAgICAvLyBtZXJnZSByZWZlcmVuY2VkIHNjaGVtYSBpbnRvIGN1cnJlbnRcbiAgICAgICAgICAgIGlmIChyZWZTY2hlbWEuJHJlZiAmJiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wN1wiIHx8IGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMDRcIiB8fCBjdHgudGFyZ2V0ID09PSBcIm9wZW5hcGktMy4wXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gb2xkZXIgZHJhZnRzIGNhbid0IGNvbWJpbmUgJHJlZiB3aXRoIG90aGVyIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICBzY2hlbWEuYWxsT2YgPSBzY2hlbWEuYWxsT2YgPz8gW107XG4gICAgICAgICAgICAgICAgc2NoZW1hLmFsbE9mLnB1c2gocmVmU2NoZW1hKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzY2hlbWEsIHJlZlNjaGVtYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXN0b3JlIGNoaWxkJ3Mgb3duIHByb3BlcnRpZXMgKGNoaWxkIHdpbnMpXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNjaGVtYSwgX2NhY2hlZCk7XG4gICAgICAgICAgICBjb25zdCBpc1BhcmVudFJlZiA9IHpvZFNjaGVtYS5fem9kLnBhcmVudCA9PT0gcmVmO1xuICAgICAgICAgICAgLy8gRm9yIHBhcmVudCBjaGFpbiwgY2hpbGQgaXMgYSByZWZpbmVtZW50IC0gcmVtb3ZlIHBhcmVudC1vbmx5IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGlmIChpc1BhcmVudFJlZikge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2NoZW1hKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCIkcmVmXCIgfHwga2V5ID09PSBcImFsbE9mXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gX2NhY2hlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdoZW4gcmVmIHdhcyBleHRyYWN0ZWQgdG8gJGRlZnMsIHJlbW92ZSBwcm9wZXJ0aWVzIHRoYXQgbWF0Y2ggdGhlIGRlZmluaXRpb25cbiAgICAgICAgICAgIGlmIChyZWZTY2hlbWEuJHJlZiAmJiByZWZTZWVuLmRlZikge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2NoZW1hKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCIkcmVmXCIgfHwga2V5ID09PSBcImFsbE9mXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIHJlZlNlZW4uZGVmICYmIEpTT04uc3RyaW5naWZ5KHNjaGVtYVtrZXldKSA9PT0gSlNPTi5zdHJpbmdpZnkocmVmU2Vlbi5kZWZba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBwYXJlbnQgd2FzIGV4dHJhY3RlZCAoaGFzICRyZWYpLCBwcm9wYWdhdGUgJHJlZiB0byB0aGlzIHNjaGVtYVxuICAgICAgICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgbGlrZTogcmVhZG9ubHkoKS5tZXRhKHtpZH0pLmRlc2NyaWJlKClcbiAgICAgICAgLy8gd2hlcmUgcHJvY2Vzc29yIHNldHMgcmVmIHRvIGlubmVyVHlwZSBidXQgcGFyZW50IHNob3VsZCBiZSByZWZlcmVuY2VkXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHpvZFNjaGVtYS5fem9kLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQgIT09IHJlZikge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHBhcmVudCBpcyBwcm9jZXNzZWQgZmlyc3Qgc28gaXRzIGRlZiBoYXMgaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGZsYXR0ZW5SZWYocGFyZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFNlZW4gPSBjdHguc2Vlbi5nZXQocGFyZW50KTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRTZWVuPy5zY2hlbWEuJHJlZikge1xuICAgICAgICAgICAgICAgIHNjaGVtYS4kcmVmID0gcGFyZW50U2Vlbi5zY2hlbWEuJHJlZjtcbiAgICAgICAgICAgICAgICAvLyBEZS1kdXBsaWNhdGUgd2l0aCBwYXJlbnQncyBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFNlZW4uZGVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2NoZW1hKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiJHJlZlwiIHx8IGtleSA9PT0gXCJhbGxPZlwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gcGFyZW50U2Vlbi5kZWYgJiYgSlNPTi5zdHJpbmdpZnkoc2NoZW1hW2tleV0pID09PSBKU09OLnN0cmluZ2lmeShwYXJlbnRTZWVuLmRlZltrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBleGVjdXRlIG92ZXJyaWRlc1xuICAgICAgICBjdHgub3ZlcnJpZGUoe1xuICAgICAgICAgICAgem9kU2NoZW1hOiB6b2RTY2hlbWEsXG4gICAgICAgICAgICBqc29uU2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICBwYXRoOiBzZWVuLnBhdGggPz8gW11cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIFtcbiAgICAgICAgLi4uY3R4LnNlZW4uZW50cmllcygpXG4gICAgXS5yZXZlcnNlKCkpe1xuICAgICAgICBmbGF0dGVuUmVmKGVudHJ5WzBdKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgaWYgKGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMjAyMC0xMlwiKSB7XG4gICAgICAgIHJlc3VsdC4kc2NoZW1hID0gXCJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC8yMDIwLTEyL3NjaGVtYVwiO1xuICAgIH0gZWxzZSBpZiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wN1wiKSB7XG4gICAgICAgIHJlc3VsdC4kc2NoZW1hID0gXCJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSNcIjtcbiAgICB9IGVsc2UgaWYgKGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMDRcIikge1xuICAgICAgICByZXN1bHQuJHNjaGVtYSA9IFwiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjXCI7XG4gICAgfSBlbHNlIGlmIChjdHgudGFyZ2V0ID09PSBcIm9wZW5hcGktMy4wXCIpIHtcbiAgICAvLyBPcGVuQVBJIDMuMCBzY2hlbWEgb2JqZWN0cyBzaG91bGQgbm90IGluY2x1ZGUgYSAkc2NoZW1hIHByb3BlcnR5XG4gICAgfSBlbHNlIHtcbiAgICAvLyBBcmJpdHJhcnkgc3RyaW5nIHZhbHVlcyBhcmUgYWxsb3dlZCBidXQgd29uJ3QgaGF2ZSBhICRzY2hlbWEgcHJvcGVydHkgc2V0XG4gICAgfVxuICAgIGlmIChjdHguZXh0ZXJuYWw/LnVyaSkge1xuICAgICAgICBjb25zdCBpZCA9IGN0eC5leHRlcm5hbC5yZWdpc3RyeS5nZXQoc2NoZW1hKT8uaWQ7XG4gICAgICAgIGlmICghaWQpIHRocm93IG5ldyBFcnJvcihcIlNjaGVtYSBpcyBtaXNzaW5nIGFuIGBpZGAgcHJvcGVydHlcIik7XG4gICAgICAgIHJlc3VsdC4kaWQgPSBjdHguZXh0ZXJuYWwudXJpKGlkKTtcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHJvb3QuZGVmID8/IHJvb3Quc2NoZW1hKTtcbiAgICAvLyBidWlsZCBkZWZzIG9iamVjdFxuICAgIGNvbnN0IGRlZnMgPSBjdHguZXh0ZXJuYWw/LmRlZnMgPz8ge307XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBjdHguc2Vlbi5lbnRyaWVzKCkpe1xuICAgICAgICBjb25zdCBzZWVuID0gZW50cnlbMV07XG4gICAgICAgIGlmIChzZWVuLmRlZiAmJiBzZWVuLmRlZklkKSB7XG4gICAgICAgICAgICBkZWZzW3NlZW4uZGVmSWRdID0gc2Vlbi5kZWY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gc2V0IGRlZmluaXRpb25zIGluIHJlc3VsdFxuICAgIGlmIChjdHguZXh0ZXJuYWwpIHt9IGVsc2Uge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVmcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMjAyMC0xMlwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LiRkZWZzID0gZGVmcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlZmluaXRpb25zID0gZGVmcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB0aGlzIFwiZmluYWxpemVzXCIgdGhpcyBzY2hlbWEgYW5kIGVuc3VyZXMgYWxsIGN5Y2xlcyBhcmUgcmVtb3ZlZFxuICAgICAgICAvLyBlYWNoIGNhbGwgdG8gZmluYWxpemUoKSBpcyBmdW5jdGlvbmFsbHkgaW5kZXBlbmRlbnRcbiAgICAgICAgLy8gdGhvdWdoIHRoZSBzZWVuIG1hcCBpcyBzaGFyZWRcbiAgICAgICAgY29uc3QgZmluYWxpemVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpbmFsaXplZCwgXCJ+c3RhbmRhcmRcIiwge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWFbXCJ+c3RhbmRhcmRcIl0sXG4gICAgICAgICAgICAgICAganNvblNjaGVtYToge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dDogY3JlYXRlU3RhbmRhcmRKU09OU2NoZW1hTWV0aG9kKHNjaGVtYSwgXCJpbnB1dFwiLCBjdHgucHJvY2Vzc29ycyksXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dDogY3JlYXRlU3RhbmRhcmRKU09OU2NoZW1hTWV0aG9kKHNjaGVtYSwgXCJvdXRwdXRcIiwgY3R4LnByb2Nlc3NvcnMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmluYWxpemVkO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgY29udmVydGluZyBzY2hlbWEgdG8gSlNPTi5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNUcmFuc2Zvcm1pbmcoX3NjaGVtYSwgX2N0eCkge1xuICAgIGNvbnN0IGN0eCA9IF9jdHggPz8ge1xuICAgICAgICBzZWVuOiBuZXcgU2V0KClcbiAgICB9O1xuICAgIGlmIChjdHguc2Vlbi5oYXMoX3NjaGVtYSkpIHJldHVybiBmYWxzZTtcbiAgICBjdHguc2Vlbi5hZGQoX3NjaGVtYSk7XG4gICAgY29uc3QgZGVmID0gX3NjaGVtYS5fem9kLmRlZjtcbiAgICBpZiAoZGVmLnR5cGUgPT09IFwidHJhbnNmb3JtXCIpIHJldHVybiB0cnVlO1xuICAgIGlmIChkZWYudHlwZSA9PT0gXCJhcnJheVwiKSByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmVsZW1lbnQsIGN0eCk7XG4gICAgaWYgKGRlZi50eXBlID09PSBcInNldFwiKSByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLnZhbHVlVHlwZSwgY3R4KTtcbiAgICBpZiAoZGVmLnR5cGUgPT09IFwibGF6eVwiKSByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmdldHRlcigpLCBjdHgpO1xuICAgIGlmIChkZWYudHlwZSA9PT0gXCJwcm9taXNlXCIgfHwgZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIiB8fCBkZWYudHlwZSA9PT0gXCJub25vcHRpb25hbFwiIHx8IGRlZi50eXBlID09PSBcIm51bGxhYmxlXCIgfHwgZGVmLnR5cGUgPT09IFwicmVhZG9ubHlcIiB8fCBkZWYudHlwZSA9PT0gXCJkZWZhdWx0XCIgfHwgZGVmLnR5cGUgPT09IFwicHJlZmF1bHRcIikge1xuICAgICAgICByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmlubmVyVHlwZSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKGRlZi50eXBlID09PSBcImludGVyc2VjdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpc1RyYW5zZm9ybWluZyhkZWYubGVmdCwgY3R4KSB8fCBpc1RyYW5zZm9ybWluZyhkZWYucmlnaHQsIGN0eCk7XG4gICAgfVxuICAgIGlmIChkZWYudHlwZSA9PT0gXCJyZWNvcmRcIiB8fCBkZWYudHlwZSA9PT0gXCJtYXBcIikge1xuICAgICAgICByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmtleVR5cGUsIGN0eCkgfHwgaXNUcmFuc2Zvcm1pbmcoZGVmLnZhbHVlVHlwZSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKGRlZi50eXBlID09PSBcInBpcGVcIikge1xuICAgICAgICByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmluLCBjdHgpIHx8IGlzVHJhbnNmb3JtaW5nKGRlZi5vdXQsIGN0eCk7XG4gICAgfVxuICAgIGlmIChkZWYudHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBmb3IoY29uc3Qga2V5IGluIGRlZi5zaGFwZSl7XG4gICAgICAgICAgICBpZiAoaXNUcmFuc2Zvcm1pbmcoZGVmLnNoYXBlW2tleV0sIGN0eCkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRlZi50eXBlID09PSBcInVuaW9uXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZGVmLm9wdGlvbnMpe1xuICAgICAgICAgICAgaWYgKGlzVHJhbnNmb3JtaW5nKG9wdGlvbiwgY3R4KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGVmLnR5cGUgPT09IFwidHVwbGVcIikge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGVmLml0ZW1zKXtcbiAgICAgICAgICAgIGlmIChpc1RyYW5zZm9ybWluZyhpdGVtLCBjdHgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLnJlc3QgJiYgaXNUcmFuc2Zvcm1pbmcoZGVmLnJlc3QsIGN0eCkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHRvSlNPTlNjaGVtYSBtZXRob2QgZm9yIGEgc2NoZW1hIGluc3RhbmNlLlxuICogVGhpcyBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIG9mIGluaXRpYWxpemluZyBjb250ZXh0LCBwcm9jZXNzaW5nLCBleHRyYWN0aW5nIGRlZnMsIGFuZCBmaW5hbGl6aW5nLlxuICovIGV4cG9ydCBjb25zdCBjcmVhdGVUb0pTT05TY2hlbWFNZXRob2QgPSAoc2NoZW1hLCBwcm9jZXNzb3JzID0ge30pPT4ocGFyYW1zKT0+e1xuICAgICAgICBjb25zdCBjdHggPSBpbml0aWFsaXplQ29udGV4dCh7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBwcm9jZXNzb3JzXG4gICAgICAgIH0pO1xuICAgICAgICBwcm9jZXNzKHNjaGVtYSwgY3R4KTtcbiAgICAgICAgZXh0cmFjdERlZnMoY3R4LCBzY2hlbWEpO1xuICAgICAgICByZXR1cm4gZmluYWxpemUoY3R4LCBzY2hlbWEpO1xuICAgIH07XG5leHBvcnQgY29uc3QgY3JlYXRlU3RhbmRhcmRKU09OU2NoZW1hTWV0aG9kID0gKHNjaGVtYSwgaW8sIHByb2Nlc3NvcnMgPSB7fSk9PihwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IHsgbGlicmFyeU9wdGlvbnMsIHRhcmdldCB9ID0gcGFyYW1zID8/IHt9O1xuICAgICAgICBjb25zdCBjdHggPSBpbml0aWFsaXplQ29udGV4dCh7XG4gICAgICAgICAgICAuLi5saWJyYXJ5T3B0aW9ucyA/PyB7fSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIGlvLFxuICAgICAgICAgICAgcHJvY2Vzc29yc1xuICAgICAgICB9KTtcbiAgICAgICAgcHJvY2VzcyhzY2hlbWEsIGN0eCk7XG4gICAgICAgIGV4dHJhY3REZWZzKGN0eCwgc2NoZW1hKTtcbiAgICAgICAgcmV0dXJuIGZpbmFsaXplKGN0eCwgc2NoZW1hKTtcbiAgICB9O1xuIiwgImltcG9ydCB7IGV4dHJhY3REZWZzLCBmaW5hbGl6ZSwgaW5pdGlhbGl6ZUNvbnRleHQsIHByb2Nlc3MgfSBmcm9tIFwiLi90by1qc29uLXNjaGVtYS5qc1wiO1xuaW1wb3J0IHsgZ2V0RW51bVZhbHVlcyB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmNvbnN0IGZvcm1hdE1hcCA9IHtcbiAgICBndWlkOiBcInV1aWRcIixcbiAgICB1cmw6IFwidXJpXCIsXG4gICAgZGF0ZXRpbWU6IFwiZGF0ZS10aW1lXCIsXG4gICAganNvbl9zdHJpbmc6IFwianNvbi1zdHJpbmdcIixcbiAgICByZWdleDogXCJcIlxufTtcbi8vID09PT09PT09PT09PT09PT09PT09IFNJTVBMRSBUWVBFIFBST0NFU1NPUlMgPT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBzdHJpbmdQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGNvbnN0IGpzb24gPSBfanNvbjtcbiAgICBqc29uLnR5cGUgPSBcInN0cmluZ1wiO1xuICAgIGNvbnN0IHsgbWluaW11bSwgbWF4aW11bSwgZm9ybWF0LCBwYXR0ZXJucywgY29udGVudEVuY29kaW5nIH0gPSBzY2hlbWEuX3pvZC5iYWc7XG4gICAgaWYgKHR5cGVvZiBtaW5pbXVtID09PSBcIm51bWJlclwiKSBqc29uLm1pbkxlbmd0aCA9IG1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBtYXhpbXVtID09PSBcIm51bWJlclwiKSBqc29uLm1heExlbmd0aCA9IG1heGltdW07XG4gICAgLy8gY3VzdG9tIHBhdHRlcm4gb3ZlcnJpZGVzIGZvcm1hdFxuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgICAganNvbi5mb3JtYXQgPSBmb3JtYXRNYXBbZm9ybWF0XSA/PyBmb3JtYXQ7XG4gICAgICAgIGlmIChqc29uLmZvcm1hdCA9PT0gXCJcIikgZGVsZXRlIGpzb24uZm9ybWF0OyAvLyBlbXB0eSBmb3JtYXQgaXMgbm90IHZhbGlkXG4gICAgICAgIC8vIEpTT04gU2NoZW1hIGZvcm1hdDogXCJ0aW1lXCIgcmVxdWlyZXMgYSBmdWxsIHRpbWUgd2l0aCBvZmZzZXQgb3IgWlxuICAgICAgICAvLyB6Lmlzby50aW1lKCkgZG9lcyBub3QgaW5jbHVkZSB0aW1lem9uZSBpbmZvcm1hdGlvbiwgc28gZm9ybWF0OiBcInRpbWVcIiBzaG91bGQgbmV2ZXIgYmUgdXNlZFxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcInRpbWVcIikge1xuICAgICAgICAgICAgZGVsZXRlIGpzb24uZm9ybWF0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb250ZW50RW5jb2RpbmcpIGpzb24uY29udGVudEVuY29kaW5nID0gY29udGVudEVuY29kaW5nO1xuICAgIGlmIChwYXR0ZXJucyAmJiBwYXR0ZXJucy5zaXplID4gMCkge1xuICAgICAgICBjb25zdCByZWdleGVzID0gW1xuICAgICAgICAgICAgLi4ucGF0dGVybnNcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHJlZ2V4ZXMubGVuZ3RoID09PSAxKSBqc29uLnBhdHRlcm4gPSByZWdleGVzWzBdLnNvdXJjZTtcbiAgICAgICAgZWxzZSBpZiAocmVnZXhlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBqc29uLmFsbE9mID0gW1xuICAgICAgICAgICAgICAgIC4uLnJlZ2V4ZXMubWFwKChyZWdleCk9Pih7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHgudGFyZ2V0ID09PSBcImRyYWZ0LTA3XCIgfHwgY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wNFwiIHx8IGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIiA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9IDoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiByZWdleC5zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBudW1iZXJQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGNvbnN0IGpzb24gPSBfanNvbjtcbiAgICBjb25zdCB7IG1pbmltdW0sIG1heGltdW0sIGZvcm1hdCwgbXVsdGlwbGVPZiwgZXhjbHVzaXZlTWF4aW11bSwgZXhjbHVzaXZlTWluaW11bSB9ID0gc2NoZW1hLl96b2QuYmFnO1xuICAgIGlmICh0eXBlb2YgZm9ybWF0ID09PSBcInN0cmluZ1wiICYmIGZvcm1hdC5pbmNsdWRlcyhcImludFwiKSkganNvbi50eXBlID0gXCJpbnRlZ2VyXCI7XG4gICAgZWxzZSBqc29uLnR5cGUgPSBcIm51bWJlclwiO1xuICAgIGlmICh0eXBlb2YgZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBpZiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wNFwiIHx8IGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICAgICAganNvbi5taW5pbXVtID0gZXhjbHVzaXZlTWluaW11bTtcbiAgICAgICAgICAgIGpzb24uZXhjbHVzaXZlTWluaW11bSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqc29uLmV4Y2x1c2l2ZU1pbmltdW0gPSBleGNsdXNpdmVNaW5pbXVtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBqc29uLm1pbmltdW0gPSBtaW5pbXVtO1xuICAgICAgICBpZiAodHlwZW9mIGV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIgJiYgY3R4LnRhcmdldCAhPT0gXCJkcmFmdC0wNFwiKSB7XG4gICAgICAgICAgICBpZiAoZXhjbHVzaXZlTWluaW11bSA+PSBtaW5pbXVtKSBkZWxldGUganNvbi5taW5pbXVtO1xuICAgICAgICAgICAgZWxzZSBkZWxldGUganNvbi5leGNsdXNpdmVNaW5pbXVtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBpZiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wNFwiIHx8IGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICAgICAganNvbi5tYXhpbXVtID0gZXhjbHVzaXZlTWF4aW11bTtcbiAgICAgICAgICAgIGpzb24uZXhjbHVzaXZlTWF4aW11bSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqc29uLmV4Y2x1c2l2ZU1heGltdW0gPSBleGNsdXNpdmVNYXhpbXVtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBqc29uLm1heGltdW0gPSBtYXhpbXVtO1xuICAgICAgICBpZiAodHlwZW9mIGV4Y2x1c2l2ZU1heGltdW0gPT09IFwibnVtYmVyXCIgJiYgY3R4LnRhcmdldCAhPT0gXCJkcmFmdC0wNFwiKSB7XG4gICAgICAgICAgICBpZiAoZXhjbHVzaXZlTWF4aW11bSA8PSBtYXhpbXVtKSBkZWxldGUganNvbi5tYXhpbXVtO1xuICAgICAgICAgICAgZWxzZSBkZWxldGUganNvbi5leGNsdXNpdmVNYXhpbXVtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbXVsdGlwbGVPZiA9PT0gXCJudW1iZXJcIikganNvbi5tdWx0aXBsZU9mID0gbXVsdGlwbGVPZjtcbn07XG5leHBvcnQgY29uc3QgYm9vbGVhblByb2Nlc3NvciA9IChfc2NoZW1hLCBfY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGpzb24udHlwZSA9IFwiYm9vbGVhblwiO1xufTtcbmV4cG9ydCBjb25zdCBiaWdpbnRQcm9jZXNzb3IgPSAoX3NjaGVtYSwgY3R4LCBfanNvbiwgX3BhcmFtcyk9PntcbiAgICBpZiAoY3R4LnVucmVwcmVzZW50YWJsZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJpZ0ludCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWFcIik7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzeW1ib2xQcm9jZXNzb3IgPSAoX3NjaGVtYSwgY3R4LCBfanNvbiwgX3BhcmFtcyk9PntcbiAgICBpZiAoY3R4LnVucmVwcmVzZW50YWJsZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bWJvbHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbnVsbFByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIGpzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICBqc29uLnR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICBqc29uLm51bGxhYmxlID0gdHJ1ZTtcbiAgICAgICAganNvbi5lbnVtID0gW1xuICAgICAgICAgICAgbnVsbFxuICAgICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb24udHlwZSA9IFwibnVsbFwiO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdW5kZWZpbmVkUHJvY2Vzc29yID0gKF9zY2hlbWEsIGN0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmRlZmluZWQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgdm9pZFByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVm9pZCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWFcIik7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBuZXZlclByb2Nlc3NvciA9IChfc2NoZW1hLCBfY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGpzb24ubm90ID0ge307XG59O1xuZXhwb3J0IGNvbnN0IGFueVByb2Nlc3NvciA9IChfc2NoZW1hLCBfY3R4LCBfanNvbiwgX3BhcmFtcyk9Pntcbi8vIGVtcHR5IHNjaGVtYSBhY2NlcHRzIGFueXRoaW5nXG59O1xuZXhwb3J0IGNvbnN0IHVua25vd25Qcm9jZXNzb3IgPSAoX3NjaGVtYSwgX2N0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4vLyBlbXB0eSBzY2hlbWEgYWNjZXB0cyBhbnl0aGluZ1xufTtcbmV4cG9ydCBjb25zdCBkYXRlUHJvY2Vzc29yID0gKF9zY2hlbWEsIGN0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRlIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGVudW1Qcm9jZXNzb3IgPSAoc2NoZW1hLCBfY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCB2YWx1ZXMgPSBnZXRFbnVtVmFsdWVzKGRlZi5lbnRyaWVzKTtcbiAgICAvLyBOdW1iZXIgZW51bXMgY2FuIGhhdmUgYm90aCBzdHJpbmcgYW5kIG51bWJlciB2YWx1ZXNcbiAgICBpZiAodmFsdWVzLmV2ZXJ5KCh2KT0+dHlwZW9mIHYgPT09IFwibnVtYmVyXCIpKSBqc29uLnR5cGUgPSBcIm51bWJlclwiO1xuICAgIGlmICh2YWx1ZXMuZXZlcnkoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikpIGpzb24udHlwZSA9IFwic3RyaW5nXCI7XG4gICAganNvbi5lbnVtID0gdmFsdWVzO1xufTtcbmV4cG9ydCBjb25zdCBsaXRlcmFsUHJvY2Vzc29yID0gKHNjaGVtYSwgY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCB2YWxzID0gW107XG4gICAgZm9yIChjb25zdCB2YWwgb2YgZGVmLnZhbHVlcyl7XG4gICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxpdGVyYWwgYHVuZGVmaW5lZGAgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdCBhZGQgdG8gdmFsc1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCaWdJbnQgbGl0ZXJhbHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWxzLnB1c2goTnVtYmVyKHZhbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFscy5wdXNoKHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gZG8gbm90aGluZyAoYW4gdW5kZWZpbmVkIGxpdGVyYWwgd2FzIHN0cmlwcGVkKVxuICAgIH0gZWxzZSBpZiAodmFscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgdmFsID0gdmFsc1swXTtcbiAgICAgICAganNvbi50eXBlID0gdmFsID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdmFsO1xuICAgICAgICBpZiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wNFwiIHx8IGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICAgICAganNvbi5lbnVtID0gW1xuICAgICAgICAgICAgICAgIHZhbFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGpzb24uY29uc3QgPSB2YWw7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodmFscy5ldmVyeSgodik9PnR5cGVvZiB2ID09PSBcIm51bWJlclwiKSkganNvbi50eXBlID0gXCJudW1iZXJcIjtcbiAgICAgICAgaWYgKHZhbHMuZXZlcnkoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikpIGpzb24udHlwZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIGlmICh2YWxzLmV2ZXJ5KCh2KT0+dHlwZW9mIHYgPT09IFwiYm9vbGVhblwiKSkganNvbi50eXBlID0gXCJib29sZWFuXCI7XG4gICAgICAgIGlmICh2YWxzLmV2ZXJ5KCh2KT0+diA9PT0gbnVsbCkpIGpzb24udHlwZSA9IFwibnVsbFwiO1xuICAgICAgICBqc29uLmVudW0gPSB2YWxzO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbmFuUHJvY2Vzc29yID0gKF9zY2hlbWEsIGN0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOYU4gY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdGVtcGxhdGVMaXRlcmFsUHJvY2Vzc29yID0gKHNjaGVtYSwgX2N0eCwganNvbiwgX3BhcmFtcyk9PntcbiAgICBjb25zdCBfanNvbiA9IGpzb247XG4gICAgY29uc3QgcGF0dGVybiA9IHNjaGVtYS5fem9kLnBhdHRlcm47XG4gICAgaWYgKCFwYXR0ZXJuKSB0aHJvdyBuZXcgRXJyb3IoXCJQYXR0ZXJuIG5vdCBmb3VuZCBpbiB0ZW1wbGF0ZSBsaXRlcmFsXCIpO1xuICAgIF9qc29uLnR5cGUgPSBcInN0cmluZ1wiO1xuICAgIF9qc29uLnBhdHRlcm4gPSBwYXR0ZXJuLnNvdXJjZTtcbn07XG5leHBvcnQgY29uc3QgZmlsZVByb2Nlc3NvciA9IChzY2hlbWEsIF9jdHgsIGpzb24sIF9wYXJhbXMpPT57XG4gICAgY29uc3QgX2pzb24gPSBqc29uO1xuICAgIGNvbnN0IGZpbGUgPSB7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJiaW5hcnlcIixcbiAgICAgICAgY29udGVudEVuY29kaW5nOiBcImJpbmFyeVwiXG4gICAgfTtcbiAgICBjb25zdCB7IG1pbmltdW0sIG1heGltdW0sIG1pbWUgfSA9IHNjaGVtYS5fem9kLmJhZztcbiAgICBpZiAobWluaW11bSAhPT0gdW5kZWZpbmVkKSBmaWxlLm1pbkxlbmd0aCA9IG1pbmltdW07XG4gICAgaWYgKG1heGltdW0gIT09IHVuZGVmaW5lZCkgZmlsZS5tYXhMZW5ndGggPSBtYXhpbXVtO1xuICAgIGlmIChtaW1lKSB7XG4gICAgICAgIGlmIChtaW1lLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgZmlsZS5jb250ZW50TWVkaWFUeXBlID0gbWltZVswXTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2pzb24sIGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihfanNvbiwgZmlsZSk7IC8vIHNoYXJlZCBwcm9wcyBhdCByb290XG4gICAgICAgICAgICBfanNvbi5hbnlPZiA9IG1pbWUubWFwKChtKT0+KHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudE1lZGlhVHlwZTogbVxuICAgICAgICAgICAgICAgIH0pKTsgLy8gb25seSBjb250ZW50TWVkaWFUeXBlIGRpZmZlcnNcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oX2pzb24sIGZpbGUpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc3VjY2Vzc1Byb2Nlc3NvciA9IChfc2NoZW1hLCBfY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGpzb24udHlwZSA9IFwiYm9vbGVhblwiO1xufTtcbmV4cG9ydCBjb25zdCBjdXN0b21Qcm9jZXNzb3IgPSAoX3NjaGVtYSwgY3R4LCBfanNvbiwgX3BhcmFtcyk9PntcbiAgICBpZiAoY3R4LnVucmVwcmVzZW50YWJsZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkN1c3RvbSB0eXBlcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWFcIik7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBmdW5jdGlvblByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnVuY3Rpb24gdHlwZXMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtUHJvY2Vzc29yID0gKF9zY2hlbWEsIGN0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc2Zvcm1zIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IG1hcFByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWFwIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNldFByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2V0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT0gQ09NUE9TSVRFIFRZUEUgUFJPQ0VTU09SUyA9PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGNvbnN0IGFycmF5UHJvY2Vzc29yID0gKHNjaGVtYSwgY3R4LCBfanNvbiwgcGFyYW1zKT0+e1xuICAgIGNvbnN0IGpzb24gPSBfanNvbjtcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgeyBtaW5pbXVtLCBtYXhpbXVtIH0gPSBzY2hlbWEuX3pvZC5iYWc7XG4gICAgaWYgKHR5cGVvZiBtaW5pbXVtID09PSBcIm51bWJlclwiKSBqc29uLm1pbkl0ZW1zID0gbWluaW11bTtcbiAgICBpZiAodHlwZW9mIG1heGltdW0gPT09IFwibnVtYmVyXCIpIGpzb24ubWF4SXRlbXMgPSBtYXhpbXVtO1xuICAgIGpzb24udHlwZSA9IFwiYXJyYXlcIjtcbiAgICBqc29uLml0ZW1zID0gcHJvY2VzcyhkZWYuZWxlbWVudCwgY3R4LCB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICBcIml0ZW1zXCJcbiAgICAgICAgXVxuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCBvYmplY3RQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QganNvbiA9IF9qc29uO1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBqc29uLnR5cGUgPSBcIm9iamVjdFwiO1xuICAgIGpzb24ucHJvcGVydGllcyA9IHt9O1xuICAgIGNvbnN0IHNoYXBlID0gZGVmLnNoYXBlO1xuICAgIGZvcihjb25zdCBrZXkgaW4gc2hhcGUpe1xuICAgICAgICBqc29uLnByb3BlcnRpZXNba2V5XSA9IHByb2Nlc3Moc2hhcGVba2V5XSwgY3R4LCB7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyByZXF1aXJlZCBrZXlzXG4gICAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoc2hhcGUpKTtcbiAgICBjb25zdCByZXF1aXJlZEtleXMgPSBuZXcgU2V0KFtcbiAgICAgICAgLi4uYWxsS2V5c1xuICAgIF0uZmlsdGVyKChrZXkpPT57XG4gICAgICAgIGNvbnN0IHYgPSBkZWYuc2hhcGVba2V5XS5fem9kO1xuICAgICAgICBpZiAoY3R4LmlvID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB2Lm9wdGluID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdi5vcHRvdXQgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBpZiAocmVxdWlyZWRLZXlzLnNpemUgPiAwKSB7XG4gICAgICAgIGpzb24ucmVxdWlyZWQgPSBBcnJheS5mcm9tKHJlcXVpcmVkS2V5cyk7XG4gICAgfVxuICAgIC8vIGNhdGNoYWxsXG4gICAgaWYgKGRlZi5jYXRjaGFsbD8uX3pvZC5kZWYudHlwZSA9PT0gXCJuZXZlclwiKSB7XG4gICAgICAgIC8vIHN0cmljdFxuICAgICAgICBqc29uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghZGVmLmNhdGNoYWxsKSB7XG4gICAgICAgIC8vIHJlZ3VsYXJcbiAgICAgICAgaWYgKGN0eC5pbyA9PT0gXCJvdXRwdXRcIikganNvbi5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZGVmLmNhdGNoYWxsKSB7XG4gICAgICAgIGpzb24uYWRkaXRpb25hbFByb3BlcnRpZXMgPSBwcm9jZXNzKGRlZi5jYXRjaGFsbCwgY3R4LCB7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdW5pb25Qcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIGpzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgLy8gRXhjbHVzaXZlIHVuaW9ucyAoaW5jbHVzaXZlID09PSBmYWxzZSkgdXNlIG9uZU9mIChleGFjdGx5IG9uZSBtYXRjaCkgaW5zdGVhZCBvZiBhbnlPZiAob25lIG9yIG1vcmUgbWF0Y2hlcylcbiAgICAvLyBUaGlzIGluY2x1ZGVzIGJvdGggei54b3IoKSBhbmQgZGlzY3JpbWluYXRlZCB1bmlvbnNcbiAgICBjb25zdCBpc0V4Y2x1c2l2ZSA9IGRlZi5pbmNsdXNpdmUgPT09IGZhbHNlO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBkZWYub3B0aW9ucy5tYXAoKHgsIGkpPT5wcm9jZXNzKHgsIGN0eCwge1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgICAgIC4uLnBhcmFtcy5wYXRoLFxuICAgICAgICAgICAgICAgIGlzRXhjbHVzaXZlID8gXCJvbmVPZlwiIDogXCJhbnlPZlwiLFxuICAgICAgICAgICAgICAgIGlcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkpO1xuICAgIGlmIChpc0V4Y2x1c2l2ZSkge1xuICAgICAgICBqc29uLm9uZU9mID0gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgICBqc29uLmFueU9mID0gb3B0aW9ucztcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGludGVyc2VjdGlvblByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwganNvbiwgcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCBhID0gcHJvY2VzcyhkZWYubGVmdCwgY3R4LCB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICBcImFsbE9mXCIsXG4gICAgICAgICAgICAwXG4gICAgICAgIF1cbiAgICB9KTtcbiAgICBjb25zdCBiID0gcHJvY2VzcyhkZWYucmlnaHQsIGN0eCwge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgIC4uLnBhcmFtcy5wYXRoLFxuICAgICAgICAgICAgXCJhbGxPZlwiLFxuICAgICAgICAgICAgMVxuICAgICAgICBdXG4gICAgfSk7XG4gICAgY29uc3QgaXNTaW1wbGVJbnRlcnNlY3Rpb24gPSAodmFsKT0+XCJhbGxPZlwiIGluIHZhbCAmJiBPYmplY3Qua2V5cyh2YWwpLmxlbmd0aCA9PT0gMTtcbiAgICBjb25zdCBhbGxPZiA9IFtcbiAgICAgICAgLi4uaXNTaW1wbGVJbnRlcnNlY3Rpb24oYSkgPyBhLmFsbE9mIDogW1xuICAgICAgICAgICAgYVxuICAgICAgICBdLFxuICAgICAgICAuLi5pc1NpbXBsZUludGVyc2VjdGlvbihiKSA/IGIuYWxsT2YgOiBbXG4gICAgICAgICAgICBiXG4gICAgICAgIF1cbiAgICBdO1xuICAgIGpzb24uYWxsT2YgPSBhbGxPZjtcbn07XG5leHBvcnQgY29uc3QgdHVwbGVQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QganNvbiA9IF9qc29uO1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBqc29uLnR5cGUgPSBcImFycmF5XCI7XG4gICAgY29uc3QgcHJlZml4UGF0aCA9IGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMjAyMC0xMlwiID8gXCJwcmVmaXhJdGVtc1wiIDogXCJpdGVtc1wiO1xuICAgIGNvbnN0IHJlc3RQYXRoID0gY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0yMDIwLTEyXCIgPyBcIml0ZW1zXCIgOiBjdHgudGFyZ2V0ID09PSBcIm9wZW5hcGktMy4wXCIgPyBcIml0ZW1zXCIgOiBcImFkZGl0aW9uYWxJdGVtc1wiO1xuICAgIGNvbnN0IHByZWZpeEl0ZW1zID0gZGVmLml0ZW1zLm1hcCgoeCwgaSk9PnByb2Nlc3MoeCwgY3R4LCB7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICAgICAgcHJlZml4UGF0aCxcbiAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pKTtcbiAgICBjb25zdCByZXN0ID0gZGVmLnJlc3QgPyBwcm9jZXNzKGRlZi5yZXN0LCBjdHgsIHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAuLi5wYXJhbXMucGF0aCxcbiAgICAgICAgICAgIHJlc3RQYXRoLFxuICAgICAgICAgICAgLi4uY3R4LnRhcmdldCA9PT0gXCJvcGVuYXBpLTMuMFwiID8gW1xuICAgICAgICAgICAgICAgIGRlZi5pdGVtcy5sZW5ndGhcbiAgICAgICAgICAgIF0gOiBbXVxuICAgICAgICBdXG4gICAgfSkgOiBudWxsO1xuICAgIGlmIChjdHgudGFyZ2V0ID09PSBcImRyYWZ0LTIwMjAtMTJcIikge1xuICAgICAgICBqc29uLnByZWZpeEl0ZW1zID0gcHJlZml4SXRlbXM7XG4gICAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgICAgICBqc29uLml0ZW1zID0gcmVzdDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3R4LnRhcmdldCA9PT0gXCJvcGVuYXBpLTMuMFwiKSB7XG4gICAgICAgIGpzb24uaXRlbXMgPSB7XG4gICAgICAgICAgICBhbnlPZjogcHJlZml4SXRlbXNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHJlc3QpIHtcbiAgICAgICAgICAgIGpzb24uaXRlbXMuYW55T2YucHVzaChyZXN0KTtcbiAgICAgICAgfVxuICAgICAgICBqc29uLm1pbkl0ZW1zID0gcHJlZml4SXRlbXMubGVuZ3RoO1xuICAgICAgICBpZiAoIXJlc3QpIHtcbiAgICAgICAgICAgIGpzb24ubWF4SXRlbXMgPSBwcmVmaXhJdGVtcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBqc29uLml0ZW1zID0gcHJlZml4SXRlbXM7XG4gICAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgICAgICBqc29uLmFkZGl0aW9uYWxJdGVtcyA9IHJlc3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbGVuZ3RoXG4gICAgY29uc3QgeyBtaW5pbXVtLCBtYXhpbXVtIH0gPSBzY2hlbWEuX3pvZC5iYWc7XG4gICAgaWYgKHR5cGVvZiBtaW5pbXVtID09PSBcIm51bWJlclwiKSBqc29uLm1pbkl0ZW1zID0gbWluaW11bTtcbiAgICBpZiAodHlwZW9mIG1heGltdW0gPT09IFwibnVtYmVyXCIpIGpzb24ubWF4SXRlbXMgPSBtYXhpbXVtO1xufTtcbmV4cG9ydCBjb25zdCByZWNvcmRQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QganNvbiA9IF9qc29uO1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBqc29uLnR5cGUgPSBcIm9iamVjdFwiO1xuICAgIC8vIEZvciBsb29zZVJlY29yZCB3aXRoIHJlZ2V4IHBhdHRlcm5zLCB1c2UgcGF0dGVyblByb3BlcnRpZXNcbiAgICAvLyBUaGlzIGNvcnJlY3RseSByZXByZXNlbnRzIFwib25seSB2YWxpZGF0ZSBrZXlzIG1hdGNoaW5nIHRoZSBwYXR0ZXJuXCIgc2VtYW50aWNzXG4gICAgLy8gYW5kIGNvbXBvc2VzIHdlbGwgd2l0aCBhbGxPZiAoaW50ZXJzZWN0aW9ucylcbiAgICBjb25zdCBrZXlUeXBlID0gZGVmLmtleVR5cGU7XG4gICAgY29uc3Qga2V5QmFnID0ga2V5VHlwZS5fem9kLmJhZztcbiAgICBjb25zdCBwYXR0ZXJucyA9IGtleUJhZz8ucGF0dGVybnM7XG4gICAgaWYgKGRlZi5tb2RlID09PSBcImxvb3NlXCIgJiYgcGF0dGVybnMgJiYgcGF0dGVybnMuc2l6ZSA+IDApIHtcbiAgICAgICAgLy8gVXNlIHBhdHRlcm5Qcm9wZXJ0aWVzIGZvciBsb29zZVJlY29yZCB3aXRoIHJlZ2V4IHBhdHRlcm5zXG4gICAgICAgIGNvbnN0IHZhbHVlU2NoZW1hID0gcHJvY2VzcyhkZWYudmFsdWVUeXBlLCBjdHgsIHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICAuLi5wYXJhbXMucGF0aCxcbiAgICAgICAgICAgICAgICBcInBhdHRlcm5Qcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAgXCIqXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSk7XG4gICAgICAgIGpzb24ucGF0dGVyblByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKXtcbiAgICAgICAgICAgIGpzb24ucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybi5zb3VyY2VdID0gdmFsdWVTY2hlbWE7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiB1c2UgcHJvcGVydHlOYW1lcyArIGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gICAgICAgIGlmIChjdHgudGFyZ2V0ID09PSBcImRyYWZ0LTA3XCIgfHwgY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0yMDIwLTEyXCIpIHtcbiAgICAgICAgICAgIGpzb24ucHJvcGVydHlOYW1lcyA9IHByb2Nlc3MoZGVmLmtleVR5cGUsIGN0eCwge1xuICAgICAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgICAgIC4uLnBhcmFtcy5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBcInByb3BlcnR5TmFtZXNcIlxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGpzb24uYWRkaXRpb25hbFByb3BlcnRpZXMgPSBwcm9jZXNzKGRlZi52YWx1ZVR5cGUsIGN0eCwge1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgICAgIC4uLnBhcmFtcy5wYXRoLFxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQWRkIHJlcXVpcmVkIGZvciBrZXlzIHdpdGggZGlzY3JldGUgdmFsdWVzIChlbnVtLCBsaXRlcmFsLCBldGMuKVxuICAgIGNvbnN0IGtleVZhbHVlcyA9IGtleVR5cGUuX3pvZC52YWx1ZXM7XG4gICAgaWYgKGtleVZhbHVlcykge1xuICAgICAgICBjb25zdCB2YWxpZEtleVZhbHVlcyA9IFtcbiAgICAgICAgICAgIC4uLmtleVZhbHVlc1xuICAgICAgICBdLmZpbHRlcigodik9PnR5cGVvZiB2ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2ID09PSBcIm51bWJlclwiKTtcbiAgICAgICAgaWYgKHZhbGlkS2V5VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGpzb24ucmVxdWlyZWQgPSB2YWxpZEtleVZhbHVlcztcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbnVsbGFibGVQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIGpzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgaW5uZXIgPSBwcm9jZXNzKGRlZi5pbm5lclR5cGUsIGN0eCwgcGFyYW1zKTtcbiAgICBjb25zdCBzZWVuID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgaWYgKGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICBzZWVuLnJlZiA9IGRlZi5pbm5lclR5cGU7XG4gICAgICAgIGpzb24ubnVsbGFibGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb24uYW55T2YgPSBbXG4gICAgICAgICAgICBpbm5lcixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm51bGxcIlxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgbm9ub3B0aW9uYWxQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QgZGVmID0gc2NoZW1hLl96b2QuZGVmO1xuICAgIHByb2Nlc3MoZGVmLmlubmVyVHlwZSwgY3R4LCBwYXJhbXMpO1xuICAgIGNvbnN0IHNlZW4gPSBjdHguc2Vlbi5nZXQoc2NoZW1hKTtcbiAgICBzZWVuLnJlZiA9IGRlZi5pbm5lclR5cGU7XG59O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIGpzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgcHJvY2VzcyhkZWYuaW5uZXJUeXBlLCBjdHgsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHNlZW4ucmVmID0gZGVmLmlubmVyVHlwZTtcbiAgICBqc29uLmRlZmF1bHQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlZi5kZWZhdWx0VmFsdWUpKTtcbn07XG5leHBvcnQgY29uc3QgcHJlZmF1bHRQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIGpzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgcHJvY2VzcyhkZWYuaW5uZXJUeXBlLCBjdHgsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHNlZW4ucmVmID0gZGVmLmlubmVyVHlwZTtcbiAgICBpZiAoY3R4LmlvID09PSBcImlucHV0XCIpIGpzb24uX3ByZWZhdWx0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZWYuZGVmYXVsdFZhbHVlKSk7XG59O1xuZXhwb3J0IGNvbnN0IGNhdGNoUHJvY2Vzc29yID0gKHNjaGVtYSwgY3R4LCBqc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QgZGVmID0gc2NoZW1hLl96b2QuZGVmO1xuICAgIHByb2Nlc3MoZGVmLmlubmVyVHlwZSwgY3R4LCBwYXJhbXMpO1xuICAgIGNvbnN0IHNlZW4gPSBjdHguc2Vlbi5nZXQoc2NoZW1hKTtcbiAgICBzZWVuLnJlZiA9IGRlZi5pbm5lclR5cGU7XG4gICAgbGV0IGNhdGNoVmFsdWU7XG4gICAgdHJ5IHtcbiAgICAgICAgY2F0Y2hWYWx1ZSA9IGRlZi5jYXRjaFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfSBjYXRjaCAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEeW5hbWljIGNhdGNoIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG4gICAganNvbi5kZWZhdWx0ID0gY2F0Y2hWYWx1ZTtcbn07XG5leHBvcnQgY29uc3QgcGlwZVByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwgX2pzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gY3R4LmlvID09PSBcImlucHV0XCIgPyBkZWYuaW4uX3pvZC5kZWYudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGRlZi5vdXQgOiBkZWYuaW4gOiBkZWYub3V0O1xuICAgIHByb2Nlc3MoaW5uZXJUeXBlLCBjdHgsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHNlZW4ucmVmID0gaW5uZXJUeXBlO1xufTtcbmV4cG9ydCBjb25zdCByZWFkb25seVByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwganNvbiwgcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBwcm9jZXNzKGRlZi5pbm5lclR5cGUsIGN0eCwgcGFyYW1zKTtcbiAgICBjb25zdCBzZWVuID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgc2Vlbi5yZWYgPSBkZWYuaW5uZXJUeXBlO1xuICAgIGpzb24ucmVhZE9ubHkgPSB0cnVlO1xufTtcbmV4cG9ydCBjb25zdCBwcm9taXNlUHJvY2Vzc29yID0gKHNjaGVtYSwgY3R4LCBfanNvbiwgcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBwcm9jZXNzKGRlZi5pbm5lclR5cGUsIGN0eCwgcGFyYW1zKTtcbiAgICBjb25zdCBzZWVuID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgc2Vlbi5yZWYgPSBkZWYuaW5uZXJUeXBlO1xufTtcbmV4cG9ydCBjb25zdCBvcHRpb25hbFByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwgX2pzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgcHJvY2VzcyhkZWYuaW5uZXJUeXBlLCBjdHgsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHNlZW4ucmVmID0gZGVmLmlubmVyVHlwZTtcbn07XG5leHBvcnQgY29uc3QgbGF6eVByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwgX2pzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBpbm5lclR5cGUgPSBzY2hlbWEuX3pvZC5pbm5lclR5cGU7XG4gICAgcHJvY2Vzcyhpbm5lclR5cGUsIGN0eCwgcGFyYW1zKTtcbiAgICBjb25zdCBzZWVuID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgc2Vlbi5yZWYgPSBpbm5lclR5cGU7XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT0gQUxMIFBST0NFU1NPUlMgPT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBhbGxQcm9jZXNzb3JzID0ge1xuICAgIHN0cmluZzogc3RyaW5nUHJvY2Vzc29yLFxuICAgIG51bWJlcjogbnVtYmVyUHJvY2Vzc29yLFxuICAgIGJvb2xlYW46IGJvb2xlYW5Qcm9jZXNzb3IsXG4gICAgYmlnaW50OiBiaWdpbnRQcm9jZXNzb3IsXG4gICAgc3ltYm9sOiBzeW1ib2xQcm9jZXNzb3IsXG4gICAgbnVsbDogbnVsbFByb2Nlc3NvcixcbiAgICB1bmRlZmluZWQ6IHVuZGVmaW5lZFByb2Nlc3NvcixcbiAgICB2b2lkOiB2b2lkUHJvY2Vzc29yLFxuICAgIG5ldmVyOiBuZXZlclByb2Nlc3NvcixcbiAgICBhbnk6IGFueVByb2Nlc3NvcixcbiAgICB1bmtub3duOiB1bmtub3duUHJvY2Vzc29yLFxuICAgIGRhdGU6IGRhdGVQcm9jZXNzb3IsXG4gICAgZW51bTogZW51bVByb2Nlc3NvcixcbiAgICBsaXRlcmFsOiBsaXRlcmFsUHJvY2Vzc29yLFxuICAgIG5hbjogbmFuUHJvY2Vzc29yLFxuICAgIHRlbXBsYXRlX2xpdGVyYWw6IHRlbXBsYXRlTGl0ZXJhbFByb2Nlc3NvcixcbiAgICBmaWxlOiBmaWxlUHJvY2Vzc29yLFxuICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NQcm9jZXNzb3IsXG4gICAgY3VzdG9tOiBjdXN0b21Qcm9jZXNzb3IsXG4gICAgZnVuY3Rpb246IGZ1bmN0aW9uUHJvY2Vzc29yLFxuICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtUHJvY2Vzc29yLFxuICAgIG1hcDogbWFwUHJvY2Vzc29yLFxuICAgIHNldDogc2V0UHJvY2Vzc29yLFxuICAgIGFycmF5OiBhcnJheVByb2Nlc3NvcixcbiAgICBvYmplY3Q6IG9iamVjdFByb2Nlc3NvcixcbiAgICB1bmlvbjogdW5pb25Qcm9jZXNzb3IsXG4gICAgaW50ZXJzZWN0aW9uOiBpbnRlcnNlY3Rpb25Qcm9jZXNzb3IsXG4gICAgdHVwbGU6IHR1cGxlUHJvY2Vzc29yLFxuICAgIHJlY29yZDogcmVjb3JkUHJvY2Vzc29yLFxuICAgIG51bGxhYmxlOiBudWxsYWJsZVByb2Nlc3NvcixcbiAgICBub25vcHRpb25hbDogbm9ub3B0aW9uYWxQcm9jZXNzb3IsXG4gICAgZGVmYXVsdDogZGVmYXVsdFByb2Nlc3NvcixcbiAgICBwcmVmYXVsdDogcHJlZmF1bHRQcm9jZXNzb3IsXG4gICAgY2F0Y2g6IGNhdGNoUHJvY2Vzc29yLFxuICAgIHBpcGU6IHBpcGVQcm9jZXNzb3IsXG4gICAgcmVhZG9ubHk6IHJlYWRvbmx5UHJvY2Vzc29yLFxuICAgIHByb21pc2U6IHByb21pc2VQcm9jZXNzb3IsXG4gICAgb3B0aW9uYWw6IG9wdGlvbmFsUHJvY2Vzc29yLFxuICAgIGxhenk6IGxhenlQcm9jZXNzb3Jcbn07XG5leHBvcnQgZnVuY3Rpb24gdG9KU09OU2NoZW1hKGlucHV0LCBwYXJhbXMpIHtcbiAgICBpZiAoXCJfaWRtYXBcIiBpbiBpbnB1dCkge1xuICAgICAgICAvLyBSZWdpc3RyeSBjYXNlXG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gaW5wdXQ7XG4gICAgICAgIGNvbnN0IGN0eCA9IGluaXRpYWxpemVDb250ZXh0KHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHByb2Nlc3NvcnM6IGFsbFByb2Nlc3NvcnNcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRlZnMgPSB7fTtcbiAgICAgICAgLy8gRmlyc3QgcGFzczogcHJvY2VzcyBhbGwgc2NoZW1hcyB0byBidWlsZCB0aGUgc2VlbiBtYXBcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiByZWdpc3RyeS5faWRtYXAuZW50cmllcygpKXtcbiAgICAgICAgICAgIGNvbnN0IFtfLCBzY2hlbWFdID0gZW50cnk7XG4gICAgICAgICAgICBwcm9jZXNzKHNjaGVtYSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY2hlbWFzID0ge307XG4gICAgICAgIGNvbnN0IGV4dGVybmFsID0ge1xuICAgICAgICAgICAgcmVnaXN0cnksXG4gICAgICAgICAgICB1cmk6IHBhcmFtcz8udXJpLFxuICAgICAgICAgICAgZGVmc1xuICAgICAgICB9O1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbnRleHQgd2l0aCBleHRlcm5hbCBjb25maWd1cmF0aW9uXG4gICAgICAgIGN0eC5leHRlcm5hbCA9IGV4dGVybmFsO1xuICAgICAgICAvLyBTZWNvbmQgcGFzczogZW1pdCBlYWNoIHNjaGVtYVxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlZ2lzdHJ5Ll9pZG1hcC5lbnRyaWVzKCkpe1xuICAgICAgICAgICAgY29uc3QgW2tleSwgc2NoZW1hXSA9IGVudHJ5O1xuICAgICAgICAgICAgZXh0cmFjdERlZnMoY3R4LCBzY2hlbWEpO1xuICAgICAgICAgICAgc2NoZW1hc1trZXldID0gZmluYWxpemUoY3R4LCBzY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkZWZzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZzU2VnbWVudCA9IGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMjAyMC0xMlwiID8gXCIkZGVmc1wiIDogXCJkZWZpbml0aW9uc1wiO1xuICAgICAgICAgICAgc2NoZW1hcy5fX3NoYXJlZCA9IHtcbiAgICAgICAgICAgICAgICBbZGVmc1NlZ21lbnRdOiBkZWZzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2hlbWFzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIFNpbmdsZSBzY2hlbWEgY2FzZVxuICAgIGNvbnN0IGN0eCA9IGluaXRpYWxpemVDb250ZXh0KHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwcm9jZXNzb3JzOiBhbGxQcm9jZXNzb3JzXG4gICAgfSk7XG4gICAgcHJvY2VzcyhpbnB1dCwgY3R4KTtcbiAgICBleHRyYWN0RGVmcyhjdHgsIGlucHV0KTtcbiAgICByZXR1cm4gZmluYWxpemUoY3R4LCBpbnB1dCk7XG59XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0ICogYXMgc2NoZW1hcyBmcm9tIFwiLi9zY2hlbWFzLmpzXCI7XG5leHBvcnQgY29uc3QgWm9kSVNPRGF0ZVRpbWUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRGF0ZVRpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09EYXRlVGltZS5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZGF0ZXRpbWUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0RhdGVUaW1lKFpvZElTT0RhdGVUaW1lLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElTT0RhdGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZElTT0RhdGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHNjaGVtYXMuWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0RhdGUoWm9kSVNPRGF0ZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RJU09UaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZElTT1RpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09UaW1lLmluaXQoaW5zdCwgZGVmKTtcbiAgICBzY2hlbWFzLlpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB0aW1lKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pc29UaW1lKFpvZElTT1RpbWUsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVNPRHVyYXRpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRHVyYXRpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09EdXJhdGlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZHVyYXRpb24ocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0R1cmF0aW9uKFpvZElTT0R1cmF0aW9uLCBwYXJhbXMpO1xufVxuIiwgImltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4uL2NvcmUvaW5kZXguanNcIjtcbmltcG9ydCB7ICRab2RFcnJvciB9IGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuLi9jb3JlL3V0aWwuanNcIjtcbmNvbnN0IGluaXRpYWxpemVyID0gKGluc3QsIGlzc3Vlcyk9PntcbiAgICAkWm9kRXJyb3IuaW5pdChpbnN0LCBpc3N1ZXMpO1xuICAgIGluc3QubmFtZSA9IFwiWm9kRXJyb3JcIjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpbnN0LCB7XG4gICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgdmFsdWU6IChtYXBwZXIpPT5jb3JlLmZvcm1hdEVycm9yKGluc3QsIG1hcHBlcilcbiAgICAgICAgfSxcbiAgICAgICAgZmxhdHRlbjoge1xuICAgICAgICAgICAgdmFsdWU6IChtYXBwZXIpPT5jb3JlLmZsYXR0ZW5FcnJvcihpbnN0LCBtYXBwZXIpXG4gICAgICAgIH0sXG4gICAgICAgIGFkZElzc3VlOiB7XG4gICAgICAgICAgICB2YWx1ZTogKGlzc3VlKT0+e1xuICAgICAgICAgICAgICAgIGluc3QuaXNzdWVzLnB1c2goaXNzdWUpO1xuICAgICAgICAgICAgICAgIGluc3QubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGluc3QuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGFkZElzc3Vlczoge1xuICAgICAgICAgICAgdmFsdWU6IChpc3N1ZXMpPT57XG4gICAgICAgICAgICAgICAgaW5zdC5pc3N1ZXMucHVzaCguLi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIGluc3QubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGluc3QuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzRW1wdHk6IHtcbiAgICAgICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3QuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiaXNFbXB0eVwiLCB7XG4vLyAgIGdldCgpIHtcbi8vICAgICByZXR1cm4gaW5zdC5pc3N1ZXMubGVuZ3RoID09PSAwO1xuLy8gICB9LFxuLy8gfSk7XG59O1xuZXhwb3J0IGNvbnN0IFpvZEVycm9yID0gY29yZS4kY29uc3RydWN0b3IoXCJab2RFcnJvclwiLCBpbml0aWFsaXplcik7XG5leHBvcnQgY29uc3QgWm9kUmVhbEVycm9yID0gY29yZS4kY29uc3RydWN0b3IoXCJab2RFcnJvclwiLCBpbml0aWFsaXplciwge1xuICAgIFBhcmVudDogRXJyb3Jcbn0pOyAvLyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6LmNvcmUuJFpvZEVycm9yTWFwQ3R4YCBpbnN0ZWFkLiAqL1xuIC8vIGV4cG9ydCB0eXBlIEVycm9yTWFwQ3R4ID0gY29yZS4kWm9kRXJyb3JNYXBDdHg7XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgWm9kUmVhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5leHBvcnQgY29uc3QgcGFyc2UgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fcGFyc2UoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBwYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3BhcnNlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlUGFyc2UgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZVBhcnNlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZVBhcnNlQXN5bmMoWm9kUmVhbEVycm9yKTtcbi8vIENvZGVjIGZ1bmN0aW9uc1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9lbmNvZGUoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBkZWNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZGVjb2RlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgZW5jb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZW5jb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBkZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9kZWNvZGVBc3luYyhab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZUVuY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVEZWNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZURlY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9zYWZlRW5jb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZURlY29kZUFzeW5jKFpvZFJlYWxFcnJvcik7XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyBwcm9jZXNzb3JzIGZyb20gXCIuLi9jb3JlL2pzb24tc2NoZW1hLXByb2Nlc3NvcnMuanNcIjtcbmltcG9ydCB7IGNyZWF0ZVN0YW5kYXJkSlNPTlNjaGVtYU1ldGhvZCwgY3JlYXRlVG9KU09OU2NoZW1hTWV0aG9kIH0gZnJvbSBcIi4uL2NvcmUvdG8tanNvbi1zY2hlbWEuanNcIjtcbmltcG9ydCAqIGFzIGNoZWNrcyBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCAqIGFzIGlzbyBmcm9tIFwiLi9pc28uanNcIjtcbmltcG9ydCAqIGFzIHBhcnNlIGZyb20gXCIuL3BhcnNlLmpzXCI7XG5leHBvcnQgY29uc3QgWm9kVHlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RUeXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0W1wifnN0YW5kYXJkXCJdLCB7XG4gICAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgICAgIGlucHV0OiBjcmVhdGVTdGFuZGFyZEpTT05TY2hlbWFNZXRob2QoaW5zdCwgXCJpbnB1dFwiKSxcbiAgICAgICAgICAgIG91dHB1dDogY3JlYXRlU3RhbmRhcmRKU09OU2NoZW1hTWV0aG9kKGluc3QsIFwib3V0cHV0XCIpXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0LnRvSlNPTlNjaGVtYSA9IGNyZWF0ZVRvSlNPTlNjaGVtYU1ldGhvZChpbnN0LCB7fSk7XG4gICAgaW5zdC5kZWYgPSBkZWY7XG4gICAgaW5zdC50eXBlID0gZGVmLnR5cGU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiX2RlZlwiLCB7XG4gICAgICAgIHZhbHVlOiBkZWZcbiAgICB9KTtcbiAgICAvLyBiYXNlIG1ldGhvZHNcbiAgICBpbnN0LmNoZWNrID0gKC4uLmNoZWNrcyk9PntcbiAgICAgICAgcmV0dXJuIGluc3QuY2xvbmUodXRpbC5tZXJnZURlZnMoZGVmLCB7XG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi5kZWYuY2hlY2tzID8/IFtdLFxuICAgICAgICAgICAgICAgIC4uLmNoZWNrcy5tYXAoKGNoKT0+dHlwZW9mIGNoID09PSBcImZ1bmN0aW9uXCIgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfem9kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6IGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjazogXCJjdXN0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25hdHRhY2g6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gOiBjaClcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSksIHtcbiAgICAgICAgICAgIHBhcmVudDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluc3Qud2l0aCA9IGluc3QuY2hlY2s7XG4gICAgaW5zdC5jbG9uZSA9IChkZWYsIHBhcmFtcyk9PmNvcmUuY2xvbmUoaW5zdCwgZGVmLCBwYXJhbXMpO1xuICAgIGluc3QuYnJhbmQgPSAoKT0+aW5zdDtcbiAgICBpbnN0LnJlZ2lzdGVyID0gKHJlZywgbWV0YSk9PntcbiAgICAgICAgcmVnLmFkZChpbnN0LCBtZXRhKTtcbiAgICAgICAgcmV0dXJuIGluc3Q7XG4gICAgfTtcbiAgICAvLyBwYXJzaW5nXG4gICAgaW5zdC5wYXJzZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5wYXJzZShpbnN0LCBkYXRhLCBwYXJhbXMsIHtcbiAgICAgICAgICAgIGNhbGxlZTogaW5zdC5wYXJzZVxuICAgICAgICB9KTtcbiAgICBpbnN0LnNhZmVQYXJzZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlUGFyc2UoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnBhcnNlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2UucGFyc2VBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMsIHtcbiAgICAgICAgICAgIGNhbGxlZTogaW5zdC5wYXJzZUFzeW5jXG4gICAgICAgIH0pO1xuICAgIGluc3Quc2FmZVBhcnNlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZVBhcnNlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNwYSA9IGluc3Quc2FmZVBhcnNlQXN5bmM7XG4gICAgLy8gZW5jb2RpbmcvZGVjb2RpbmdcbiAgICBpbnN0LmVuY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5lbmNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LmRlY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5kZWNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LmVuY29kZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLmVuY29kZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5kZWNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5kZWNvZGVBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3Quc2FmZUVuY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRW5jb2RlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zYWZlRGVjb2RlID0gKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnNhZmVEZWNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNhZmVFbmNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRW5jb2RlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNhZmVEZWNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRGVjb2RlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICAvLyByZWZpbmVtZW50c1xuICAgIGluc3QucmVmaW5lID0gKGNoZWNrLCBwYXJhbXMpPT5pbnN0LmNoZWNrKHJlZmluZShjaGVjaywgcGFyYW1zKSk7XG4gICAgaW5zdC5zdXBlclJlZmluZSA9IChyZWZpbmVtZW50KT0+aW5zdC5jaGVjayhzdXBlclJlZmluZShyZWZpbmVtZW50KSk7XG4gICAgaW5zdC5vdmVyd3JpdGUgPSAoZm4pPT5pbnN0LmNoZWNrKGNoZWNrcy5vdmVyd3JpdGUoZm4pKTtcbiAgICAvLyB3cmFwcGVyc1xuICAgIGluc3Qub3B0aW9uYWwgPSAoKT0+b3B0aW9uYWwoaW5zdCk7XG4gICAgaW5zdC5leGFjdE9wdGlvbmFsID0gKCk9PmV4YWN0T3B0aW9uYWwoaW5zdCk7XG4gICAgaW5zdC5udWxsYWJsZSA9ICgpPT5udWxsYWJsZShpbnN0KTtcbiAgICBpbnN0Lm51bGxpc2ggPSAoKT0+b3B0aW9uYWwobnVsbGFibGUoaW5zdCkpO1xuICAgIGluc3Qubm9ub3B0aW9uYWwgPSAocGFyYW1zKT0+bm9ub3B0aW9uYWwoaW5zdCwgcGFyYW1zKTtcbiAgICBpbnN0LmFycmF5ID0gKCk9PmFycmF5KGluc3QpO1xuICAgIGluc3Qub3IgPSAoYXJnKT0+dW5pb24oW1xuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGFyZ1xuICAgICAgICBdKTtcbiAgICBpbnN0LmFuZCA9IChhcmcpPT5pbnRlcnNlY3Rpb24oaW5zdCwgYXJnKTtcbiAgICBpbnN0LnRyYW5zZm9ybSA9ICh0eCk9PnBpcGUoaW5zdCwgdHJhbnNmb3JtKHR4KSk7XG4gICAgaW5zdC5kZWZhdWx0ID0gKGRlZik9Pl9kZWZhdWx0KGluc3QsIGRlZik7XG4gICAgaW5zdC5wcmVmYXVsdCA9IChkZWYpPT5wcmVmYXVsdChpbnN0LCBkZWYpO1xuICAgIC8vIGluc3QuY29hbGVzY2UgPSAoZGVmLCBwYXJhbXMpID0+IGNvYWxlc2NlKGluc3QsIGRlZiwgcGFyYW1zKTtcbiAgICBpbnN0LmNhdGNoID0gKHBhcmFtcyk9Pl9jYXRjaChpbnN0LCBwYXJhbXMpO1xuICAgIGluc3QucGlwZSA9ICh0YXJnZXQpPT5waXBlKGluc3QsIHRhcmdldCk7XG4gICAgaW5zdC5yZWFkb25seSA9ICgpPT5yZWFkb25seShpbnN0KTtcbiAgICAvLyBtZXRhXG4gICAgaW5zdC5kZXNjcmliZSA9IChkZXNjcmlwdGlvbik9PntcbiAgICAgICAgY29uc3QgY2wgPSBpbnN0LmNsb25lKCk7XG4gICAgICAgIGNvcmUuZ2xvYmFsUmVnaXN0cnkuYWRkKGNsLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiZGVzY3JpcHRpb25cIiwge1xuICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmUuZ2xvYmFsUmVnaXN0cnkuZ2V0KGluc3QpPy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgaW5zdC5tZXRhID0gKC4uLmFyZ3MpPT57XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmUuZ2xvYmFsUmVnaXN0cnkuZ2V0KGluc3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsID0gaW5zdC5jbG9uZSgpO1xuICAgICAgICBjb3JlLmdsb2JhbFJlZ2lzdHJ5LmFkZChjbCwgYXJnc1swXSk7XG4gICAgICAgIHJldHVybiBjbDtcbiAgICB9O1xuICAgIC8vIGhlbHBlcnNcbiAgICBpbnN0LmlzT3B0aW9uYWwgPSAoKT0+aW5zdC5zYWZlUGFyc2UodW5kZWZpbmVkKS5zdWNjZXNzO1xuICAgIGluc3QuaXNOdWxsYWJsZSA9ICgpPT5pbnN0LnNhZmVQYXJzZShudWxsKS5zdWNjZXNzO1xuICAgIGluc3QuYXBwbHkgPSAoZm4pPT5mbihpbnN0KTtcbiAgICByZXR1cm4gaW5zdDtcbn0pO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3QgX1pvZFN0cmluZyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJfWm9kU3RyaW5nXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnN0cmluZ1Byb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0LmZvcm1hdCA9IGJhZy5mb3JtYXQgPz8gbnVsbDtcbiAgICBpbnN0Lm1pbkxlbmd0aCA9IGJhZy5taW5pbXVtID8/IG51bGw7XG4gICAgaW5zdC5tYXhMZW5ndGggPSBiYWcubWF4aW11bSA/PyBudWxsO1xuICAgIC8vIHZhbGlkYXRpb25zXG4gICAgaW5zdC5yZWdleCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MucmVnZXgoLi4uYXJncykpO1xuICAgIGluc3QuaW5jbHVkZXMgPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLmluY2x1ZGVzKC4uLmFyZ3MpKTtcbiAgICBpbnN0LnN0YXJ0c1dpdGggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLnN0YXJ0c1dpdGgoLi4uYXJncykpO1xuICAgIGluc3QuZW5kc1dpdGggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLmVuZHNXaXRoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm1pbiA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubWluTGVuZ3RoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm1heCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubWF4TGVuZ3RoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lmxlbmd0aCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubGVuZ3RoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm5vbmVtcHR5ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5taW5MZW5ndGgoMSwgLi4uYXJncykpO1xuICAgIGluc3QubG93ZXJjYXNlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmxvd2VyY2FzZShwYXJhbXMpKTtcbiAgICBpbnN0LnVwcGVyY2FzZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy51cHBlcmNhc2UocGFyYW1zKSk7XG4gICAgLy8gdHJhbnNmb3Jtc1xuICAgIGluc3QudHJpbSA9ICgpPT5pbnN0LmNoZWNrKGNoZWNrcy50cmltKCkpO1xuICAgIGluc3Qubm9ybWFsaXplID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5ub3JtYWxpemUoLi4uYXJncykpO1xuICAgIGluc3QudG9Mb3dlckNhc2UgPSAoKT0+aW5zdC5jaGVjayhjaGVja3MudG9Mb3dlckNhc2UoKSk7XG4gICAgaW5zdC50b1VwcGVyQ2FzZSA9ICgpPT5pbnN0LmNoZWNrKGNoZWNrcy50b1VwcGVyQ2FzZSgpKTtcbiAgICBpbnN0LnNsdWdpZnkgPSAoKT0+aW5zdC5jaGVjayhjaGVja3Muc2x1Z2lmeSgpKTtcbn0pO1xuZXhwb3J0IGNvbnN0IFpvZFN0cmluZyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RTdHJpbmdcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RTdHJpbmcuaW5pdChpbnN0LCBkZWYpO1xuICAgIF9ab2RTdHJpbmcuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZW1haWwgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9lbWFpbChab2RFbWFpbCwgcGFyYW1zKSk7XG4gICAgaW5zdC51cmwgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91cmwoWm9kVVJMLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmp3dCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2p3dChab2RKV1QsIHBhcmFtcykpO1xuICAgIGluc3QuZW1vamkgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9lbW9qaShab2RFbW9qaSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZ3VpZChab2RHVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LnV1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91dWlkKFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZHY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZHY0KFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZHY2ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZHY2KFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZHY3ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZHY3KFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QubmFub2lkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbmFub2lkKFpvZE5hbm9JRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZ3VpZChab2RHVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LmN1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9jdWlkKFpvZENVSUQsIHBhcmFtcykpO1xuICAgIGluc3QuY3VpZDIgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9jdWlkMihab2RDVUlEMiwgcGFyYW1zKSk7XG4gICAgaW5zdC51bGlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdWxpZChab2RVTElELCBwYXJhbXMpKTtcbiAgICBpbnN0LmJhc2U2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2Jhc2U2NChab2RCYXNlNjQsIHBhcmFtcykpO1xuICAgIGluc3QuYmFzZTY0dXJsID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fYmFzZTY0dXJsKFpvZEJhc2U2NFVSTCwgcGFyYW1zKSk7XG4gICAgaW5zdC54aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl94aWQoWm9kWElELCBwYXJhbXMpKTtcbiAgICBpbnN0LmtzdWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fa3N1aWQoWm9kS1NVSUQsIHBhcmFtcykpO1xuICAgIGluc3QuaXB2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2lwdjQoWm9kSVB2NCwgcGFyYW1zKSk7XG4gICAgaW5zdC5pcHY2ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5faXB2Nihab2RJUHY2LCBwYXJhbXMpKTtcbiAgICBpbnN0LmNpZHJ2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2NpZHJ2NChab2RDSURSdjQsIHBhcmFtcykpO1xuICAgIGluc3QuY2lkcnY2ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fY2lkcnY2KFpvZENJRFJ2NiwgcGFyYW1zKSk7XG4gICAgaW5zdC5lMTY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZTE2NChab2RFMTY0LCBwYXJhbXMpKTtcbiAgICAvLyBpc29cbiAgICBpbnN0LmRhdGV0aW1lID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaXNvLmRhdGV0aW1lKHBhcmFtcykpO1xuICAgIGluc3QuZGF0ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGlzby5kYXRlKHBhcmFtcykpO1xuICAgIGluc3QudGltZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGlzby50aW1lKHBhcmFtcykpO1xuICAgIGluc3QuZHVyYXRpb24gPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpc28uZHVyYXRpb24ocGFyYW1zKSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZyhab2RTdHJpbmcsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgX1pvZFN0cmluZy5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCBab2RFbWFpbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RFbWFpbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRW1haWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBlbWFpbChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZW1haWwoWm9kRW1haWwsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kR1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RHVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RHVUlELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZ3VpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZ3VpZChab2RHVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVVVJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kVVVJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3V1aWQoWm9kVVVJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3V1aWR2NChab2RVVUlELCBwYXJhbXMpO1xufVxuLy8gWm9kVVVJRHY2XG5leHBvcnQgZnVuY3Rpb24gdXVpZHY2KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91dWlkdjYoWm9kVVVJRCwgcGFyYW1zKTtcbn1cbi8vIFpvZFVVSUR2N1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NyhwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXVpZHY3KFpvZFVVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVVJMID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kVVJMLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdXJsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91cmwoWm9kVVJMLCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGh0dHBVcmwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VybChab2RVUkwsIHtcbiAgICAgICAgcHJvdG9jb2w6IC9eaHR0cHM/JC8sXG4gICAgICAgIGhvc3RuYW1lOiBjb3JlLnJlZ2V4ZXMuZG9tYWluLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRW1vamkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRW1vamlcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEVtb2ppLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZW1vamkocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Vtb2ppKFpvZEVtb2ppLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZE5hbm9JRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROYW5vSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZE5hbm9JRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG5hbm9pZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fbmFub2lkKFpvZE5hbm9JRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RDVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZENVSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjdWlkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9jdWlkKFpvZENVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ1VJRDIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ1VJRDJcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZENVSUQyLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gY3VpZDIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2N1aWQyKFpvZENVSUQyLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVMSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVUxJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kVUxJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHVsaWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VsaWQoWm9kVUxJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RYSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kWElEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RYSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB4aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3hpZChab2RYSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kS1NVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kS1NVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEtTVUlELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24ga3N1aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2tzdWlkKFpvZEtTVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElQdjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVB2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kSVB2NC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlwdjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lwdjQoWm9kSVB2NCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RNQUMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTUFDXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RNQUMuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBtYWMocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX21hYyhab2RNQUMsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVB2NiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJUHY2XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RJUHY2LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gaXB2NihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faXB2Nihab2RJUHY2LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZENJRFJ2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDSURSdjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDSURSdjQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjaWRydjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2NpZHJ2NChab2RDSURSdjQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ0lEUnY2ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENJRFJ2NlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZENJRFJ2Ni5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGNpZHJ2NihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fY2lkcnY2KFpvZENJRFJ2NiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCYXNlNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmFzZTY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RCYXNlNjQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Jhc2U2NChab2RCYXNlNjQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQmFzZTY0VVJMID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJhc2U2NFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQmFzZTY0VVJMLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0dXJsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9iYXNlNjR1cmwoWm9kQmFzZTY0VVJMLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEUxNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRTE2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRTE2NC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGUxNjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2UxNjQoWm9kRTE2NCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RKV1QgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSldUXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RKV1QuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBqd3QocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2p3dChab2RKV1QsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ3VzdG9tU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEN1c3RvbVN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQ3VzdG9tU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRm9ybWF0KGZvcm1hdCwgZm5PclJlZ2V4LCBfcGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgZm9ybWF0LCBmbk9yUmVnZXgsIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhvc3RuYW1lKF9wYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgXCJob3N0bmFtZVwiLCBjb3JlLnJlZ2V4ZXMuaG9zdG5hbWUsIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhleChfcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZ0Zvcm1hdChab2RDdXN0b21TdHJpbmdGb3JtYXQsIFwiaGV4XCIsIGNvcmUucmVnZXhlcy5oZXgsIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc2goYWxnLCBwYXJhbXMpIHtcbiAgICBjb25zdCBlbmMgPSBwYXJhbXM/LmVuYyA/PyBcImhleFwiO1xuICAgIGNvbnN0IGZvcm1hdCA9IGAke2FsZ31fJHtlbmN9YDtcbiAgICBjb25zdCByZWdleCA9IGNvcmUucmVnZXhlc1tmb3JtYXRdO1xuICAgIGlmICghcmVnZXgpIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGhhc2ggZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgZm9ybWF0LCByZWdleCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2ROdW1iZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTnVtYmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm51bWJlclByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5ndCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QuZ3RlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWluID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHQgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmx0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0LmludCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGludChwYXJhbXMpKTtcbiAgICBpbnN0LnNhZmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpbnQocGFyYW1zKSk7XG4gICAgaW5zdC5wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndCgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KDAsIHBhcmFtcykpO1xuICAgIGluc3Qubm9ucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKDAsIHBhcmFtcykpO1xuICAgIGluc3QubXVsdGlwbGVPZiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5zdGVwID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5tdWx0aXBsZU9mKHZhbHVlLCBwYXJhbXMpKTtcbiAgICAvLyBpbnN0LmZpbml0ZSA9IChwYXJhbXMpID0+IGluc3QuY2hlY2soY29yZS5maW5pdGUocGFyYW1zKSk7XG4gICAgaW5zdC5maW5pdGUgPSAoKT0+aW5zdDtcbiAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgIGluc3QubWluVmFsdWUgPSBNYXRoLm1heChiYWcubWluaW11bSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIGJhZy5leGNsdXNpdmVNaW5pbXVtID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgPz8gbnVsbDtcbiAgICBpbnN0Lm1heFZhbHVlID0gTWF0aC5taW4oYmFnLm1heGltdW0gPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBiYWcuZXhjbHVzaXZlTWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpID8/IG51bGw7XG4gICAgaW5zdC5pc0ludCA9IChiYWcuZm9ybWF0ID8/IFwiXCIpLmluY2x1ZGVzKFwiaW50XCIpIHx8IE51bWJlci5pc1NhZmVJbnRlZ2VyKGJhZy5tdWx0aXBsZU9mID8/IDAuNSk7XG4gICAgaW5zdC5pc0Zpbml0ZSA9IHRydWU7XG4gICAgaW5zdC5mb3JtYXQgPSBiYWcuZm9ybWF0ID8/IG51bGw7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBudW1iZXIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX251bWJlcihab2ROdW1iZXIsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kTnVtYmVyRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE51bWJlckZvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bWJlckZvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGludChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faW50KFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdDMyKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9mbG9hdDMyKFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdDY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9mbG9hdDY0KFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnQzMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faW50MzIoWm9kTnVtYmVyRm9ybWF0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVpbnQzMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdWludDMyKFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCb29sZWFuID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJvb2xlYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RCb29sZWFuLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmJvb2xlYW5Qcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYm9vbGVhbihab2RCb29sZWFuLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEJpZ0ludCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RCaWdJbnRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuYmlnaW50UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0Lmd0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1pbiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd0ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndCh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndGUgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW4gPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5sdCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHQodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHRlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KEJpZ0ludCgwKSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ub25wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZShCaWdJbnQoMCksIHBhcmFtcykpO1xuICAgIGluc3QubXVsdGlwbGVPZiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSk7XG4gICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0Lm1pblZhbHVlID0gYmFnLm1pbmltdW0gPz8gbnVsbDtcbiAgICBpbnN0Lm1heFZhbHVlID0gYmFnLm1heGltdW0gPz8gbnVsbDtcbiAgICBpbnN0LmZvcm1hdCA9IGJhZy5mb3JtYXQgPz8gbnVsbDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGJpZ2ludChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYmlnaW50KFpvZEJpZ0ludCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCaWdJbnRGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmlnSW50Rm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQmlnSW50Rm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG4vLyBpbnQ2NFxuZXhwb3J0IGZ1bmN0aW9uIGludDY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pbnQ2NChab2RCaWdJbnRGb3JtYXQsIHBhcmFtcyk7XG59XG4vLyB1aW50NjRcbmV4cG9ydCBmdW5jdGlvbiB1aW50NjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VpbnQ2NChab2RCaWdJbnRGb3JtYXQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kU3ltYm9sID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN5bWJvbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN5bWJvbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5zeW1ib2xQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc3ltYm9sKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9zeW1ib2woWm9kU3ltYm9sLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVuZGVmaW5lZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVbmRlZmluZWRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RVbmRlZmluZWQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudW5kZWZpbmVkUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbn0pO1xuZnVuY3Rpb24gX3VuZGVmaW5lZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdW5kZWZpbmVkKFpvZFVuZGVmaW5lZCwgcGFyYW1zKTtcbn1cbmV4cG9ydCB7IF91bmRlZmluZWQgYXMgdW5kZWZpbmVkIH07XG5leHBvcnQgY29uc3QgWm9kTnVsbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROdWxsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTnVsbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5udWxsUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbn0pO1xuZnVuY3Rpb24gX251bGwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX251bGwoWm9kTnVsbCwgcGFyYW1zKTtcbn1cbmV4cG9ydCB7IF9udWxsIGFzIG51bGwgfTtcbmV4cG9ydCBjb25zdCBab2RBbnkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQW55XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQW55LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmFueVByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBhbnkoKSB7XG4gICAgcmV0dXJuIGNvcmUuX2FueShab2RBbnkpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVua25vd24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVW5rbm93blwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFVua25vd24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudW5rbm93blByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB1bmtub3duKCkge1xuICAgIHJldHVybiBjb3JlLl91bmtub3duKFpvZFVua25vd24pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE5ldmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE5ldmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTmV2ZXIuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMubmV2ZXJQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbmV2ZXIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX25ldmVyKFpvZE5ldmVyLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFZvaWQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVm9pZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFZvaWQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudm9pZFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmZ1bmN0aW9uIF92b2lkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl92b2lkKFpvZFZvaWQsIHBhcmFtcyk7XG59XG5leHBvcnQgeyBfdm9pZCBhcyB2b2lkIH07XG5leHBvcnQgY29uc3QgWm9kRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRGF0ZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5kYXRlUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0Lm1pbiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBjb25zdCBjID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0Lm1pbkRhdGUgPSBjLm1pbmltdW0gPyBuZXcgRGF0ZShjLm1pbmltdW0pIDogbnVsbDtcbiAgICBpbnN0Lm1heERhdGUgPSBjLm1heGltdW0gPyBuZXcgRGF0ZShjLm1heGltdW0pIDogbnVsbDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2RhdGUoWm9kRGF0ZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RBcnJheSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RBcnJheVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEFycmF5LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmFycmF5UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LmVsZW1lbnQgPSBkZWYuZWxlbWVudDtcbiAgICBpbnN0Lm1pbiA9IChtaW5MZW5ndGgsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm1pbkxlbmd0aChtaW5MZW5ndGgsIHBhcmFtcykpO1xuICAgIGluc3Qubm9uZW1wdHkgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubWluTGVuZ3RoKDEsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKG1heExlbmd0aCwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubWF4TGVuZ3RoKG1heExlbmd0aCwgcGFyYW1zKSk7XG4gICAgaW5zdC5sZW5ndGggPSAobGVuLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sZW5ndGgobGVuLCBwYXJhbXMpKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0LmVsZW1lbnQ7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBhcnJheShlbGVtZW50LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYXJyYXkoWm9kQXJyYXksIGVsZW1lbnQsIHBhcmFtcyk7XG59XG4vLyAua2V5b2ZcbmV4cG9ydCBmdW5jdGlvbiBrZXlvZihzY2hlbWEpIHtcbiAgICBjb25zdCBzaGFwZSA9IHNjaGVtYS5fem9kLmRlZi5zaGFwZTtcbiAgICByZXR1cm4gX2VudW0oT2JqZWN0LmtleXMoc2hhcGUpKTtcbn1cbmV4cG9ydCBjb25zdCBab2RPYmplY3QgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kT2JqZWN0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kT2JqZWN0SklULmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm9iamVjdFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QsIFwic2hhcGVcIiwgKCk9PntcbiAgICAgICAgcmV0dXJuIGRlZi5zaGFwZTtcbiAgICB9KTtcbiAgICBpbnN0LmtleW9mID0gKCk9Pl9lbnVtKE9iamVjdC5rZXlzKGluc3QuX3pvZC5kZWYuc2hhcGUpKTtcbiAgICBpbnN0LmNhdGNoYWxsID0gKGNhdGNoYWxsKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IGNhdGNoYWxsXG4gICAgICAgIH0pO1xuICAgIGluc3QucGFzc3Rocm91Z2ggPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IHVua25vd24oKVxuICAgICAgICB9KTtcbiAgICBpbnN0Lmxvb3NlID0gKCk9Pmluc3QuY2xvbmUoe1xuICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiB1bmtub3duKClcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zdHJpY3QgPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IG5ldmVyKClcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zdHJpcCA9ICgpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIGluc3QuZXh0ZW5kID0gKGluY29taW5nKT0+e1xuICAgICAgICByZXR1cm4gdXRpbC5leHRlbmQoaW5zdCwgaW5jb21pbmcpO1xuICAgIH07XG4gICAgaW5zdC5zYWZlRXh0ZW5kID0gKGluY29taW5nKT0+e1xuICAgICAgICByZXR1cm4gdXRpbC5zYWZlRXh0ZW5kKGluc3QsIGluY29taW5nKTtcbiAgICB9O1xuICAgIGluc3QubWVyZ2UgPSAob3RoZXIpPT51dGlsLm1lcmdlKGluc3QsIG90aGVyKTtcbiAgICBpbnN0LnBpY2sgPSAobWFzayk9PnV0aWwucGljayhpbnN0LCBtYXNrKTtcbiAgICBpbnN0Lm9taXQgPSAobWFzayk9PnV0aWwub21pdChpbnN0LCBtYXNrKTtcbiAgICBpbnN0LnBhcnRpYWwgPSAoLi4uYXJncyk9PnV0aWwucGFydGlhbChab2RPcHRpb25hbCwgaW5zdCwgYXJnc1swXSk7XG4gICAgaW5zdC5yZXF1aXJlZCA9ICguLi5hcmdzKT0+dXRpbC5yZXF1aXJlZChab2ROb25PcHRpb25hbCwgaW5zdCwgYXJnc1swXSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Qoc2hhcGUsIHBhcmFtcykge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgc2hhcGU6IHNoYXBlID8/IHt9LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdChkZWYpO1xufVxuLy8gc3RyaWN0T2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0T2JqZWN0KHNoYXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBjYXRjaGFsbDogbmV2ZXIoKSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gbG9vc2VPYmplY3RcbmV4cG9ydCBmdW5jdGlvbiBsb29zZU9iamVjdChzaGFwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgY2F0Y2hhbGw6IHVua25vd24oKSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudW5pb25Qcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3Qub3B0aW9ucyA9IGRlZi5vcHRpb25zO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdW5pb24ob3B0aW9ucywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmlvbih7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFhvciA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RYb3JcIiwgKGluc3QsIGRlZik9PntcbiAgICBab2RVbmlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kWG9yLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnVuaW9uUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0Lm9wdGlvbnMgPSBkZWYub3B0aW9ucztcbn0pO1xuLyoqIENyZWF0ZXMgYW4gZXhjbHVzaXZlIHVuaW9uIChYT1IpIHdoZXJlIGV4YWN0bHkgb25lIG9wdGlvbiBtdXN0IG1hdGNoLlxuICogVW5saWtlIHJlZ3VsYXIgdW5pb25zIHRoYXQgc3VjY2VlZCB3aGVuIGFueSBvcHRpb24gbWF0Y2hlcywgeG9yIGZhaWxzIGlmXG4gKiB6ZXJvIG9yIG1vcmUgdGhhbiBvbmUgb3B0aW9uIG1hdGNoZXMgdGhlIGlucHV0LiAqLyBleHBvcnQgZnVuY3Rpb24geG9yKG9wdGlvbnMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kWG9yKHtcbiAgICAgICAgdHlwZTogXCJ1bmlvblwiLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRGlzY3JpbWluYXRlZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIFpvZFVuaW9uLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2REaXNjcmltaW5hdGVkVW5pb24uaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZGlzY3JpbWluYXRlZFVuaW9uKGRpc2NyaW1pbmF0b3IsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgIC8vIGNvbnN0IFtvcHRpb25zLCBwYXJhbXNdID0gYXJncztcbiAgICByZXR1cm4gbmV3IFpvZERpc2NyaW1pbmF0ZWRVbmlvbih7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgZGlzY3JpbWluYXRvcixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEludGVyc2VjdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJbnRlcnNlY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJbnRlcnNlY3Rpb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuaW50ZXJzZWN0aW9uUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdGlvbihsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kVHVwbGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVHVwbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUdXBsZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy50dXBsZVByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5yZXN0ID0gKHJlc3QpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICByZXN0OiByZXN0XG4gICAgICAgIH0pO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdHVwbGUoaXRlbXMsIF9wYXJhbXNPclJlc3QsIF9wYXJhbXMpIHtcbiAgICBjb25zdCBoYXNSZXN0ID0gX3BhcmFtc09yUmVzdCBpbnN0YW5jZW9mIGNvcmUuJFpvZFR5cGU7XG4gICAgY29uc3QgcGFyYW1zID0gaGFzUmVzdCA/IF9wYXJhbXMgOiBfcGFyYW1zT3JSZXN0O1xuICAgIGNvbnN0IHJlc3QgPSBoYXNSZXN0ID8gX3BhcmFtc09yUmVzdCA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgIHR5cGU6IFwidHVwbGVcIixcbiAgICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAgICByZXN0LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUmVjb3JkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFJlY29yZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFJlY29yZC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5yZWNvcmRQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3Qua2V5VHlwZSA9IGRlZi5rZXlUeXBlO1xuICAgIGluc3QudmFsdWVUeXBlID0gZGVmLnZhbHVlVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJyZWNvcmRcIixcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIHR5cGUgYWxrc2pmID0gY29yZS5vdXRwdXQ8Y29yZS4kWm9kUmVjb3JkS2V5PjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJ0aWFsUmVjb3JkKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgY29uc3QgayA9IGNvcmUuY2xvbmUoa2V5VHlwZSk7XG4gICAgay5fem9kLnZhbHVlcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgICAgIGtleVR5cGU6IGssXG4gICAgICAgIHZhbHVlVHlwZTogdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9vc2VSZWNvcmQoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZTogdmFsdWVUeXBlLFxuICAgICAgICBtb2RlOiBcImxvb3NlXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RNYXAgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTWFwXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTWFwLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm1hcFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5rZXlUeXBlID0gZGVmLmtleVR5cGU7XG4gICAgaW5zdC52YWx1ZVR5cGUgPSBkZWYudmFsdWVUeXBlO1xuICAgIGluc3QubWluID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX21pblNpemUoLi4uYXJncykpO1xuICAgIGluc3Qubm9uZW1wdHkgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9taW5TaXplKDEsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX21heFNpemUoLi4uYXJncykpO1xuICAgIGluc3Quc2l6ZSA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjb3JlLl9zaXplKC4uLmFyZ3MpKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kTWFwKHtcbiAgICAgICAgdHlwZTogXCJtYXBcIixcbiAgICAgICAga2V5VHlwZToga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RTZXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU2V0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU2V0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnNldFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5taW4gPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY29yZS5fbWluU2l6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC5ub25lbXB0eSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21pblNpemUoMSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY29yZS5fbWF4U2l6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC5zaXplID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX3NpemUoLi4uYXJncykpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc2V0KHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICB2YWx1ZVR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEVudW0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRW51bVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEVudW0uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuZW51bVByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5lbnVtID0gZGVmLmVudHJpZXM7XG4gICAgaW5zdC5vcHRpb25zID0gT2JqZWN0LnZhbHVlcyhkZWYuZW50cmllcyk7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZGVmLmVudHJpZXMpKTtcbiAgICBpbnN0LmV4dHJhY3QgPSAodmFsdWVzLCBwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IG5ld0VudHJpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuICAgICAgICAgICAgaWYgKGtleXMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIG5ld0VudHJpZXNbdmFsdWVdID0gZGVmLmVudHJpZXNbdmFsdWVdO1xuICAgICAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgS2V5ICR7dmFsdWV9IG5vdCBmb3VuZCBpbiBlbnVtYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgICAgIC4uLmRlZixcbiAgICAgICAgICAgIGNoZWNrczogW10sXG4gICAgICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICAgICAgZW50cmllczogbmV3RW50cmllc1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluc3QuZXhjbHVkZSA9ICh2YWx1ZXMsIHBhcmFtcyk9PntcbiAgICAgICAgY29uc3QgbmV3RW50cmllcyA9IHtcbiAgICAgICAgICAgIC4uLmRlZi5lbnRyaWVzXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbiAgICAgICAgICAgIGlmIChrZXlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3RW50cmllc1t2YWx1ZV07XG4gICAgICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBLZXkgJHt2YWx1ZX0gbm90IGZvdW5kIGluIGVudW1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICAgICAgLi4uZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgICAgICBlbnRyaWVzOiBuZXdFbnRyaWVzXG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIF9lbnVtKHZhbHVlcywgcGFyYW1zKSB7XG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZXMubWFwKCh2KT0+W1xuICAgICAgICAgICAgdixcbiAgICAgICAgICAgIHZcbiAgICAgICAgXSkpIDogdmFsdWVzO1xuICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgeyBfZW51bSBhcyBlbnVtIH07XG4vKiogQGRlcHJlY2F0ZWQgVGhpcyBBUEkgaGFzIGJlZW4gbWVyZ2VkIGludG8gYHouZW51bSgpYC4gVXNlIGB6LmVudW0oKWAgaW5zdGVhZC5cbiAqXG4gKiBgYGB0c1xuICogZW51bSBDb2xvcnMgeyByZWQsIGdyZWVuLCBibHVlIH1cbiAqIHouZW51bShDb2xvcnMpO1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUVudW0oZW50cmllcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgIGVudHJpZXMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZExpdGVyYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RMaXRlcmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmxpdGVyYWxQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3QudmFsdWVzID0gbmV3IFNldChkZWYudmFsdWVzKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICBpZiAoZGVmLnZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzY2hlbWEgY29udGFpbnMgbXVsdGlwbGUgdmFsaWQgbGl0ZXJhbCB2YWx1ZXMuIFVzZSBgLnZhbHVlc2AgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVmLnZhbHVlc1swXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbCh2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RMaXRlcmFsKHtcbiAgICAgICAgdHlwZTogXCJsaXRlcmFsXCIsXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgIF0sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RGaWxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEZpbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RGaWxlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmZpbGVQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3QubWluID0gKHNpemUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbWluU2l6ZShzaXplLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9IChzaXplLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21heFNpemUoc2l6ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW1lID0gKHR5cGVzLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21pbWUoQXJyYXkuaXNBcnJheSh0eXBlcykgPyB0eXBlcyA6IFtcbiAgICAgICAgICAgIHR5cGVzXG4gICAgICAgIF0sIHBhcmFtcykpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZmlsZShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZmlsZShab2RGaWxlLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFRyYW5zZm9ybSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RUcmFuc2Zvcm1cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUcmFuc2Zvcm0uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudHJhbnNmb3JtUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKF9jdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RFbmNvZGVFcnJvcihpbnN0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuYWRkSXNzdWUgPSAoaXNzdWUpPT57XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKGlzc3VlLCBwYXlsb2FkLnZhbHVlLCBkZWYpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIFpvZCAzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgICAgY29uc3QgX2lzc3VlID0gaXNzdWU7XG4gICAgICAgICAgICAgICAgaWYgKF9pc3N1ZS5mYXRhbCkgX2lzc3VlLmNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmNvZGUgPz8gKF9pc3N1ZS5jb2RlID0gXCJjdXN0b21cIik7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmlucHV0ID8/IChfaXNzdWUuaW5wdXQgPSBwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuaW5zdCA/PyAoX2lzc3VlLmluc3QgPSBpbnN0KTtcbiAgICAgICAgICAgICAgICAvLyBfaXNzdWUuY29udGludWUgPz89IHRydWU7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKF9pc3N1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBkZWYudHJhbnNmb3JtKHBheWxvYWQudmFsdWUsIHBheWxvYWQpO1xuICAgICAgICBpZiAob3V0cHV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dC50aGVuKChvdXRwdXQpPT57XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBvdXRwdXQ7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICByZXR1cm4gbmV3IFpvZFRyYW5zZm9ybSh7XG4gICAgICAgIHR5cGU6IFwidHJhbnNmb3JtXCIsXG4gICAgICAgIHRyYW5zZm9ybTogZm5cbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RPcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RPcHRpb25hbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE9wdGlvbmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm9wdGlvbmFsUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kT3B0aW9uYWwoe1xuICAgICAgICB0eXBlOiBcIm9wdGlvbmFsXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRXhhY3RPcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RFeGFjdE9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRXhhY3RPcHRpb25hbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5vcHRpb25hbFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBleGFjdE9wdGlvbmFsKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kRXhhY3RPcHRpb25hbCh7XG4gICAgICAgIHR5cGU6IFwib3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2ROdWxsYWJsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROdWxsYWJsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bGxhYmxlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm51bGxhYmxlUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG51bGxhYmxlKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kTnVsbGFibGUoe1xuICAgICAgICB0eXBlOiBcIm51bGxhYmxlXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG4vLyBudWxsaXNoXG5leHBvcnQgZnVuY3Rpb24gbnVsbGlzaChpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gb3B0aW9uYWwobnVsbGFibGUoaW5uZXJUeXBlKSk7XG59XG5leHBvcnQgY29uc3QgWm9kRGVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REZWZhdWx0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRGVmYXVsdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5kZWZhdWx0UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbiAgICBpbnN0LnJlbW92ZURlZmF1bHQgPSBpbnN0LnVud3JhcDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIF9kZWZhdWx0KGlubmVyVHlwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBab2REZWZhdWx0KHtcbiAgICAgICAgdHlwZTogXCJkZWZhdWx0XCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlLFxuICAgICAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0VmFsdWUoKSA6IHV0aWwuc2hhbGxvd0Nsb25lKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RQcmVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RQcmVmYXVsdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFByZWZhdWx0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnByZWZhdWx0UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZhdWx0KGlubmVyVHlwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RQcmVmYXVsdCh7XG4gICAgICAgIHR5cGU6IFwicHJlZmF1bHRcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGUsXG4gICAgICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGRlZmF1bHRWYWx1ZSgpIDogdXRpbC5zaGFsbG93Q2xvbmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE5vbk9wdGlvbmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE5vbk9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTm9uT3B0aW9uYWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMubm9ub3B0aW9uYWxQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbm9ub3B0aW9uYWwoaW5uZXJUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE5vbk9wdGlvbmFsKHtcbiAgICAgICAgdHlwZTogXCJub25vcHRpb25hbFwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFN1Y2Nlc3MgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU3VjY2Vzc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN1Y2Nlc3MuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuc3VjY2Vzc1Byb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzdWNjZXNzKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kU3VjY2Vzcyh7XG4gICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZENhdGNoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENhdGNoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQ2F0Y2guaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuY2F0Y2hQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xuICAgIGluc3QucmVtb3ZlQ2F0Y2ggPSBpbnN0LnVud3JhcDtcbn0pO1xuZnVuY3Rpb24gX2NhdGNoKGlubmVyVHlwZSwgY2F0Y2hWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICB0eXBlOiBcImNhdGNoXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlLFxuICAgICAgICBjYXRjaFZhbHVlOiB0eXBlb2YgY2F0Y2hWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gY2F0Y2hWYWx1ZSA6ICgpPT5jYXRjaFZhbHVlXG4gICAgfSk7XG59XG5leHBvcnQgeyBfY2F0Y2ggYXMgY2F0Y2ggfTtcbmV4cG9ydCBjb25zdCBab2ROYU4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTmFOXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTmFOLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm5hblByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBuYW4ocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX25hbihab2ROYU4sIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kUGlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RQaXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUGlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5waXBlUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LmluID0gZGVmLmluO1xuICAgIGluc3Qub3V0ID0gZGVmLm91dDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHBpcGUoaW5fLCBvdXQpIHtcbiAgICByZXR1cm4gbmV3IFpvZFBpcGUoe1xuICAgICAgICB0eXBlOiBcInBpcGVcIixcbiAgICAgICAgaW46IGluXyxcbiAgICAgICAgb3V0OiBvdXRcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RDb2RlYyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDb2RlY1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIFpvZFBpcGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZENvZGVjLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGNvZGVjKGluXywgb3V0LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZENvZGVjKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBpbl8sXG4gICAgICAgIG91dDogb3V0LFxuICAgICAgICB0cmFuc2Zvcm06IHBhcmFtcy5kZWNvZGUsXG4gICAgICAgIHJldmVyc2VUcmFuc2Zvcm06IHBhcmFtcy5lbmNvZGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RSZWFkb25seSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RSZWFkb25seVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFJlYWRvbmx5LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnJlYWRvbmx5UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRvbmx5KGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kUmVhZG9ubHkoe1xuICAgICAgICB0eXBlOiBcInJlYWRvbmx5XCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kVGVtcGxhdGVMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFRlbXBsYXRlTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFRlbXBsYXRlTGl0ZXJhbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy50ZW1wbGF0ZUxpdGVyYWxQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVMaXRlcmFsKHBhcnRzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZFRlbXBsYXRlTGl0ZXJhbCh7XG4gICAgICAgIHR5cGU6IFwidGVtcGxhdGVfbGl0ZXJhbFwiLFxuICAgICAgICBwYXJ0cyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZExhenkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTGF6eVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZExhenkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMubGF6eVByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5nZXR0ZXIoKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGxhenkoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIG5ldyBab2RMYXp5KHtcbiAgICAgICAgdHlwZTogXCJsYXp5XCIsXG4gICAgICAgIGdldHRlcjogZ2V0dGVyXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUHJvbWlzZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RQcm9taXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUHJvbWlzZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5wcm9taXNlUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2UoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RQcm9taXNlKHtcbiAgICAgICAgdHlwZTogXCJwcm9taXNlXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRnVuY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRnVuY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RGdW5jdGlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5mdW5jdGlvblByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBfZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgaW5wdXQ6IEFycmF5LmlzQXJyYXkocGFyYW1zPy5pbnB1dCkgPyB0dXBsZShwYXJhbXM/LmlucHV0KSA6IHBhcmFtcz8uaW5wdXQgPz8gYXJyYXkodW5rbm93bigpKSxcbiAgICAgICAgb3V0cHV0OiBwYXJhbXM/Lm91dHB1dCA/PyB1bmtub3duKClcbiAgICB9KTtcbn1cbmV4cG9ydCB7IF9mdW5jdGlvbiBhcyBmdW5jdGlvbiB9O1xuZXhwb3J0IGNvbnN0IFpvZEN1c3RvbSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDdXN0b21cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDdXN0b20uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuY3VzdG9tUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbn0pO1xuLy8gY3VzdG9tIGNoZWNrc1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrKGZuKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY29yZS4kWm9kQ2hlY2soe1xuICAgICAgICBjaGVjazogXCJjdXN0b21cIlxuICAgIH0pO1xuICAgIGNoLl96b2QuY2hlY2sgPSBmbjtcbiAgICByZXR1cm4gY2g7XG59XG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tKGZuLCBfcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2N1c3RvbShab2RDdXN0b20sIGZuID8/ICgoKT0+dHJ1ZSksIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZmluZShmbiwgX3BhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIGNvcmUuX3JlZmluZShab2RDdXN0b20sIGZuLCBfcGFyYW1zKTtcbn1cbi8vIHN1cGVyUmVmaW5lXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJSZWZpbmUoZm4pIHtcbiAgICByZXR1cm4gY29yZS5fc3VwZXJSZWZpbmUoZm4pO1xufVxuLy8gUmUtZXhwb3J0IGRlc2NyaWJlIGFuZCBtZXRhIGZyb20gY29yZVxuZXhwb3J0IGNvbnN0IGRlc2NyaWJlID0gY29yZS5kZXNjcmliZTtcbmV4cG9ydCBjb25zdCBtZXRhID0gY29yZS5tZXRhO1xuZnVuY3Rpb24gX2luc3RhbmNlb2YoY2xzLCBwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGluc3QgPSBuZXcgWm9kQ3VzdG9tKHtcbiAgICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgICAgY2hlY2s6IFwiY3VzdG9tXCIsXG4gICAgICAgIGZuOiAoZGF0YSk9PmRhdGEgaW5zdGFuY2VvZiBjbHMsXG4gICAgICAgIGFib3J0OiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmJhZy5DbGFzcyA9IGNscztcbiAgICAvLyBPdmVycmlkZSBjaGVjayB0byBlbWl0IGludmFsaWRfdHlwZSBpbnN0ZWFkIG9mIGN1c3RvbVxuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoIShwYXlsb2FkLnZhbHVlIGluc3RhbmNlb2YgY2xzKSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogY2xzLm5hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYucGF0aCA/PyBbXVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaW5zdDtcbn1cbmV4cG9ydCB7IF9pbnN0YW5jZW9mIGFzIGluc3RhbmNlb2YgfTtcbi8vIHN0cmluZ2Jvb2xcbmV4cG9ydCBjb25zdCBzdHJpbmdib29sID0gKC4uLmFyZ3MpPT5jb3JlLl9zdHJpbmdib29sKHtcbiAgICAgICAgQ29kZWM6IFpvZENvZGVjLFxuICAgICAgICBCb29sZWFuOiBab2RCb29sZWFuLFxuICAgICAgICBTdHJpbmc6IFpvZFN0cmluZ1xuICAgIH0sIC4uLmFyZ3MpO1xuZXhwb3J0IGZ1bmN0aW9uIGpzb24ocGFyYW1zKSB7XG4gICAgY29uc3QganNvblNjaGVtYSA9IGxhenkoKCk9PntcbiAgICAgICAgcmV0dXJuIHVuaW9uKFtcbiAgICAgICAgICAgIHN0cmluZyhwYXJhbXMpLFxuICAgICAgICAgICAgbnVtYmVyKCksXG4gICAgICAgICAgICBib29sZWFuKCksXG4gICAgICAgICAgICBfbnVsbCgpLFxuICAgICAgICAgICAgYXJyYXkoanNvblNjaGVtYSksXG4gICAgICAgICAgICByZWNvcmQoc3RyaW5nKCksIGpzb25TY2hlbWEpXG4gICAgICAgIF0pO1xuICAgIH0pO1xuICAgIHJldHVybiBqc29uU2NoZW1hO1xufVxuLy8gcHJlcHJvY2Vzc1xuLy8gLyoqIEBkZXByZWNhdGVkIFVzZSBgei5waXBlKClgIGFuZCBgei50cmFuc2Zvcm0oKWAgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwcm9jZXNzKGZuLCBzY2hlbWEpIHtcbiAgICByZXR1cm4gcGlwZSh0cmFuc2Zvcm0oZm4pLCBzY2hlbWEpO1xufVxuIiwgImltcG9ydCB7IGRlZmluZUhvb2ssIGdldFdyaXRhYmxlIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUnO1xuaW1wb3J0ICogYXMgeiBmcm9tICd6b2QnO1xuLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3MvaG9va3MudHNcIjp7XCJjb2xsZWN0V2l0aEhvb2tcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvaG9va3MvL2NvbGxlY3RXaXRoSG9va1wifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3MvaG9va3MudHNcIjp7XCJ3cml0ZUV2ZW50XCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3dvcmtmbG93cy9ob29rcy8vd3JpdGVFdmVudFwifX19fSovO1xuZXhwb3J0IGNvbnN0IEhvb2sgPSBkZWZpbmVIb29rKHtcbiAgICBzY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgZGF0YTogei5zdHJpbmcoKSxcbiAgICAgICAgZG9uZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbWV0YWRhdGE6IHoudW5rbm93bigpXG4gICAgfSlcbn0pO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RXaXRoSG9vayh0b2tlbiwgY3VzdG9tRGF0YSkge1xuICAgIGNvbnN0IGhvb2sgPSBIb29rLmNyZWF0ZSh7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgY3VzdG9tRGF0YVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29sbGVjdGVkID0gW107XG4gICAgY29uc3Qgd2YgPSBnZXRXcml0YWJsZSgpO1xuICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rQ3JlYXRlZCcpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgaG9vayl7XG4gICAgICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rUmVzdW1lZCcsIGV2ZW50KTtcbiAgICAgICAgY29sbGVjdGVkLnB1c2goZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQuZG9uZSkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbGxlY3RlZFxuICAgIH07XG59XG5jb2xsZWN0V2l0aEhvb2sud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzL2hvb2tzLy9jb2xsZWN0V2l0aEhvb2tcIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvaG9va3MvL2NvbGxlY3RXaXRoSG9va1wiLCBjb2xsZWN0V2l0aEhvb2spO1xudmFyIHdyaXRlRXZlbnQgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3dvcmtmbG93cy9ob29rcy8vd3JpdGVFdmVudFwiKTtcbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9ub29wLnRzXCI6e1wiYnJva2VuV2ZcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi93b3JrZmxvd3Mvbm9vcC8vYnJva2VuV2ZcIn19fSxcInN0ZXBzXCI6e1wid29ya2Zsb3dzL25vb3AudHNcIjp7XCJub29wXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3dvcmtmbG93cy9ub29wLy9ub29wXCJ9fX19Ki87XG5leHBvcnQgdmFyIG5vb3AgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3dvcmtmbG93cy9ub29wLy9ub29wXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJyb2tlbldmKCkge1xuICAgIGNvbnN0IG51bWJlcnMgPSBbXTtcbiAgICB7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCA1OyBpKyspe1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChub29wKGkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnYXdhaXQgNScpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgMTU7IGkrKyl7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKG5vb3AoMTAwICsgaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdhd2FpdCAxNScpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ2RvbmUuJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbnVtYmVyc1xuICAgIH07XG59XG5icm9rZW5XZi53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3Mvbm9vcC8vYnJva2VuV2ZcIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3Mvbm9vcC8vYnJva2VuV2ZcIiwgYnJva2VuV2YpO1xuIiwgIi8qKl9faW50ZXJuYWxfd29ya2Zsb3dze1wid29ya2Zsb3dzXCI6e1wid29ya2Zsb3dzL251bGwtYnl0ZS50c1wiOntcIm51bGxCeXRlV29ya2Zsb3dcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvbnVsbC1ieXRlLy9udWxsQnl0ZVdvcmtmbG93XCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9udWxsLWJ5dGUudHNcIjp7XCJudWxsQnl0ZVN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vd29ya2Zsb3dzL251bGwtYnl0ZS8vbnVsbEJ5dGVTdGVwXCJ9fX19Ki87XG52YXIgbnVsbEJ5dGVTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi93b3JrZmxvd3MvbnVsbC1ieXRlLy9udWxsQnl0ZVN0ZXBcIik7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnVsbEJ5dGVXb3JrZmxvdygpIHtcbiAgICBjb25zdCBhID0gYXdhaXQgbnVsbEJ5dGVTdGVwKCk7XG4gICAgcmV0dXJuIGE7XG59XG5udWxsQnl0ZVdvcmtmbG93LndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly8uL3dvcmtmbG93cy9udWxsLWJ5dGUvL251bGxCeXRlV29ya2Zsb3dcIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvbnVsbC1ieXRlLy9udWxsQnl0ZVdvcmtmbG93XCIsIG51bGxCeXRlV29ya2Zsb3cpO1xuIiwgImltcG9ydCB7IEZhdGFsRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvY29yZSc7XG4vKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzXCI6e1wicmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93XCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvLy4vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwvL3JldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvd1wifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50c1wiOntcInN0ZXBUaGF0RmFpbHNcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwvL3N0ZXBUaGF0RmFpbHNcIn0sXCJzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLy9zdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yXCJ9fX19Ki87XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93KCkge1xuICAgIGNvbnN0IHJldHJ5YWJsZVJlc3VsdCA9IGF3YWl0IHN0ZXBUaGF0VGhyb3dzUmV0cnlhYmxlRXJyb3IoKTtcbiAgICBsZXQgZ290RmF0YWxFcnJvciA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0ZXBUaGF0RmFpbHMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoRmF0YWxFcnJvci5pcyhlcnJvcikpIHtcbiAgICAgICAgICAgIGdvdEZhdGFsRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJldHJ5YWJsZVJlc3VsdCxcbiAgICAgICAgZ290RmF0YWxFcnJvclxuICAgIH07XG59XG5yZXRyeWFibGVBbmRGYXRhbEVycm9yV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwvL3JldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLy9yZXRyeWFibGVBbmRGYXRhbEVycm9yV29ya2Zsb3dcIiwgcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93KTtcbnZhciBzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC8vc3RlcFRoYXRUaHJvd3NSZXRyeWFibGVFcnJvclwiKTtcbnZhciBzdGVwVGhhdEZhaWxzID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC8vc3RlcFRoYXRGYWlsc1wiKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQSx3RUFBQUEsU0FBQTtBQUFBO0FBRUksUUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQWFSLElBQUFBLFFBQU8sVUFBVSxTQUFTLEtBQUssU0FBUztBQUN4QyxnQkFBVSxXQUFXLENBQUM7QUFDdEIsVUFBSSxPQUFPLE9BQU87QUFDbEIsVUFBSSxTQUFTLFlBQVksSUFBSSxTQUFTLEdBQUc7QUFDckMsZUFBT0MsT0FBTSxHQUFHO0FBQUEsTUFDcEIsV0FBVyxTQUFTLFlBQVksU0FBUyxHQUFHLEdBQUc7QUFDM0MsZUFBTyxRQUFRLE9BQU8sUUFBUSxHQUFHLElBQUksU0FBUyxHQUFHO0FBQUEsTUFDckQ7QUFDQSxZQUFNLElBQUksTUFBTSwwREFBMEQsS0FBSyxVQUFVLEdBQUcsQ0FBQztBQUFBLElBQ2pHO0FBT0ksYUFBU0EsT0FBTSxLQUFLO0FBQ3BCLFlBQU0sT0FBTyxHQUFHO0FBQ2hCLFVBQUksSUFBSSxTQUFTLEtBQUs7QUFDbEI7QUFBQSxNQUNKO0FBQ0EsVUFBSSxRQUFRLG1JQUFtSSxLQUFLLEdBQUc7QUFDdkosVUFBSSxDQUFDLE9BQU87QUFDUjtBQUFBLE1BQ0o7QUFDQSxVQUFJLElBQUksV0FBVyxNQUFNLENBQUMsQ0FBQztBQUMzQixVQUFJLFFBQVEsTUFBTSxDQUFDLEtBQUssTUFBTSxZQUFZO0FBQzFDLGNBQU8sTUFBSztBQUFBLFFBQ1IsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FB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O0FBQ2hFLE9BQUssU0FBUyxDQUFDLFdBQVMsS0FBSyxNQUFXLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFDbEUsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLE9BQU8sQ0FBQyxXQUFTLEtBQUssTUFBVyxNQUFNLFNBQVMsTUFBTSxDQUFDO0FBQzVELE9BQUssUUFBUSxDQUFDLFdBQVMsS0FBSyxNQUFXLE9BQU8sVUFBVSxNQUFNLENBQUM7QUFDL0QsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLFNBQVMsQ0FBQyxXQUFTLEtBQUssTUFBVyxRQUFRLFdBQVcsTUFBTSxDQUFDO0FBQ2xFLE9BQUssWUFBWSxDQUFDLFdBQVMsS0FBSyxNQUFXLFdBQVcsY0FBYyxNQUFNLENBQUM7QUFDM0UsT0FBSyxNQUFNLENBQUMsV0FBUyxLQUFLLE1BQVcsS0FBSyxRQUFRLE1BQU0sQ0FBQztBQUN6RCxPQUFLLFFBQVEsQ0FBQyxXQUFTLEtBQUssTUFBVyxPQUFPLFVBQVUsTUFBTSxDQUFDO0FBQy9ELE9BQUssT0FBTyxDQUFDLFdBQVMsS0FBSyxNQUFXLE1BQU0sU0FBUyxNQUFNLENBQUM7QUFDNUQsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLFNBQVMsQ0FBQyxXQUFTLEtBQUssTUFBVyxRQUFRLFdBQVcsTUFBTSxDQUFDO0FBQ2xFLE9BQUssU0FBUyxDQUFDLFdBQVMsS0FBSyxNQUFXLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFDbEUsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUU1RCxPQUFLLFdBQVcsQ0FBQyxXQUFTLEtBQUssTUFBVUMsVUFBUyxNQUFNLENBQUM7QUFDekQsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVVDLE1BQUssTUFBTSxDQUFDO0FBQ2pELE9BQUssT0FBTyxDQUFDLFdBQVMsS0FBSyxNQUFVQyxNQUFLLE1BQU0sQ0FBQztBQUNqRCxPQUFLLFdBQVcsQ0FBQyxXQUFTLEtBQUssTUFBVUMsVUFBUyxNQUFNLENBQUM7QUFDN0QsQ0FBQztBQUNNLFNBQVNDLFFBQU8sUUFBUTtBQUMzQixTQUFZLFFBQVEsV0FBVyxNQUFNO0FBQ3pDO0FBRmdCLE9BQUFBLFNBQUE7QUFHVCxJQUFNLGtCQUFnQyxnQkFBSyxhQUFhLG1CQUFtQixDQUFDLE1BQU0sUUFBTTtBQUMzRixFQUFLLGlCQUFpQixLQUFLLE1BQU0sR0FBRztBQUNwQyxhQUFXLEtBQUssTUFBTSxHQUFHO0FBQzdCLENBQUM7QUFDTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFlTSxJQUFNLFNBQXVCLGdCQUFLLGFBQWEsVUFBVSxDQUFDLE1BQU0sUUFBTTtBQUV6RSxFQUFLLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFDM0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFXTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFlBQTBCLGdCQUFLLGFBQWEsYUFBYSxDQUFDLE1BQU0sUUFBTTtBQUUvRSxFQUFLLFdBQVcsS0FBSyxNQUFNLEdBQUc7QUFDOUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFNBQXVCLGdCQUFLLGFBQWEsVUFBVSxDQUFDLE1BQU0sUUFBTTtBQUV6RSxFQUFLLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFDM0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFZTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxH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QWE7QUFDN0IsU0FBTztBQUNYO0FBSHNCO0FBSXRCLGlCQUFpQixhQUFhO0FBQzlCLFdBQVcsb0JBQW9CLElBQUkscURBQXFELGdCQUFnQjs7O0FDTHhHLGVBQXNCLGlDQUFpQztBQUNuRCxRQUFNLGtCQUFrQixNQUFNLDZCQUE2QjtBQUMzRCxNQUFJLGdCQUFnQjtBQUNwQixNQUFJO0FBQ0EsVUFBTSxjQUFjO0FBQUEsRUFDeEIsU0FBUyxPQUFPO0FBQ1osUUFBSSxXQUFXLEdBQUcsS0FBSyxHQUFHO0FBQ3RCLHNCQUFnQjtBQUFBLElBQ3BCO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLEVBQ0o7QUFDSjtBQWRzQjtBQWV0QiwrQkFBK0IsYUFBYTtBQUM1QyxXQUFXLG9CQUFvQixJQUFJLDZFQUE2RSw4QkFBOEI7QUFDOUksSUFBSSwrQkFBK0IsV0FBVyx1QkFBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUscUVBQXFFO0FBQ3BKLElBQUksZ0JBQWdCLFdBQVcsdUJBQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLHNEQUFzRDsiLAogICJuYW1lcyI6IFsibW9kdWxlIiwgInBhcnNlIiwgIm1zIiwgIm1zIiwgImluaXRpYWxpemVyIiwgIl9hIiwgImFycmF5IiwgIm9iamVjdCIsICJDbGFzcyIsICJfYSIsICJjb25maWciLCAiYmFzZTY0IiwgImJhc2U2NHVybCIsICJpc3N1ZSIsICJlcnJvciIsICJ2ZXJzaW9uIiwgInRpbWUiLCAiX2EiLCAiX2EiLCAiaW5zdCIsICJfYSIsICJjaGVja3MiLCAiY2hlY2tSZXN1bHQiLCAiY2FuYXJ5IiwgInJlc3VsdCIsICJfIiwgImJhc2U2NCIsICJyZXN1bHQiLCAiciIsICJpc09iamVjdCIsICJhbGxvd3NFdmFsIiwgInJlc3VsdHMiLCAibGVmdCIsICJyaWdodCIsICJvdXRwdXQiLCAicmVzdWx0IiwgInJlc3VsdCIsICJyaWdodCIsICJsZWZ0IiwgInIiLCAibWV0YSIsICJDbGFzcyIsICJDbGFzcyIsICJfZW1vamkiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiaXNzdWUiLCAicHJvY2VzcyIsICJfYSIsICJtZXRhIiwgImlkIiwgInNjaGVtYSIsICJwcm9jZXNzIiwgInByb2Nlc3MiLCAicHJvY2VzcyIsICJkYXRldGltZSIsICJkYXRlIiwgInRpbWUiLCAiZHVyYXRpb24iLCAiaW5pdGlhbGl6ZXIiLCAiaXNzdWUiLCAiaXNzdWVzIiwgInBhcnNlIiwgInBhcnNlQXN5bmMiLCAic2FmZVBhcnNlIiwgInNhZmVQYXJzZUFzeW5jIiwgImRlZiIsICJtZXRhIiwgInBhcnNlIiwgInNhZmVQYXJzZSIsICJwYXJzZUFzeW5jIiwgInNhZmVQYXJzZUFzeW5jIiwgIl9lbW9qaSIsICJkYXRldGltZSIsICJkYXRlIiwgInRpbWUiLCAiZHVyYXRpb24iLCAic3RyaW5nIiwgImJvb2xlYW4iLCAiaXNzdWUiLCAib3V0cHV0IiwgInN0cmluZyIsICJib29sZWFuIl0KfQo=
|
|
73255
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJ3b3JrZmxvd3MvYWRkaXRpb24udHMiLCAiLi4vdXRpbHMvc3JjL3RpbWUudHMiLCAiLi4vZXJyb3JzL3NyYy9pbmRleC50cyIsICIuLi9jb3JlL3NyYy9zeW1ib2xzLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L2NyZWF0ZS1ob29rLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L2RlZmluZS1ob29rLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L3dyaXRhYmxlLXN0cmVhbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9jb3JlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3V0aWwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjMuNi9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvZXJyb3JzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3BhcnNlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3JlZ2V4ZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjMuNi9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvY2hlY2tzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL2RvYy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS92ZXJzaW9ucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9zY2hlbWFzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3JlZ2lzdHJpZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjMuNi9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvYXBpLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3RvLWpzb24tc2NoZW1hLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL2pzb24tc2NoZW1hLXByb2Nlc3NvcnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjMuNi9ub2RlX21vZHVsZXMvem9kL3Y0L2NsYXNzaWMvaXNvLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4zLjYvbm9kZV9tb2R1bGVzL3pvZC92NC9jbGFzc2ljL2Vycm9ycy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9wYXJzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMy42L25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9zY2hlbWFzLmpzIiwgIndvcmtmbG93cy9ob29rcy50cyIsICJ3b3JrZmxvd3Mvbm9vcC50cyIsICJ3b3JrZmxvd3MvbnVsbC1ieXRlLnRzIiwgIndvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEhlbHBlcnMuXG4gKi8gdmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICsgSlNPTi5zdHJpbmdpZnkodmFsKSk7XG59O1xuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCh0eXBlKXtcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgY2FzZSAneXJzJzpcbiAgICAgICAgY2FzZSAneXInOlxuICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIHJldHVybiBuICogeTtcbiAgICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHc7XG4gICAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgIHJldHVybiBuICogZDtcbiAgICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgY2FzZSAnaHJzJzpcbiAgICAgICAgY2FzZSAnaHInOlxuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiBuICogaDtcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIHJldHVybiBuICogbTtcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgIGNhc2UgJ3NlY3MnOlxuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgIHJldHVybiBuICogcztcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICBjYXNlICdtc2Vjcyc6XG4gICAgICAgIGNhc2UgJ21zZWMnOlxuICAgICAgICBjYXNlICdtcyc6XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICAgIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICAgIH1cbiAgICByZXR1cm4gbXMgKyAnbXMnO1xufVxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gICAgfVxuICAgIHJldHVybiBtcyArICcgbXMnO1xufVxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqLyBmdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gICAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9hZGRpdGlvbi50c1wiOntcImFkZGl0aW9uXCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvLy4vd29ya2Zsb3dzL2FkZGl0aW9uLy9hZGRpdGlvblwifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3MvYWRkaXRpb24udHNcIjp7XCJhZGRcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vd29ya2Zsb3dzL2FkZGl0aW9uLy9hZGRcIn19fX0qLztcbnZhciBhZGQgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3dvcmtmbG93cy9hZGRpdGlvbi8vYWRkXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZGl0aW9uKG51bSwgbnVtMikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkZChudW0sIG51bTIpO1xuICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgcmVzdWx0XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmFkZGl0aW9uLndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly8uL3dvcmtmbG93cy9hZGRpdGlvbi8vYWRkaXRpb25cIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvYWRkaXRpb24vL2FkZGl0aW9uXCIsIGFkZGl0aW9uKTtcbiIsICJpbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IG1zIGZyb20gJ21zJztcblxuLyoqXG4gKiBQYXJzZXMgYSBkdXJhdGlvbiBwYXJhbWV0ZXIgKHN0cmluZywgbnVtYmVyLCBvciBEYXRlKSBhbmQgcmV0dXJucyBhIERhdGUgb2JqZWN0XG4gKiByZXByZXNlbnRpbmcgd2hlbiB0aGUgZHVyYXRpb24gc2hvdWxkIGVsYXBzZS5cbiAqXG4gKiAtIEZvciBzdHJpbmdzOiBQYXJzZXMgZHVyYXRpb24gc3RyaW5ncyBsaWtlIFwiMXNcIiwgXCI1bVwiLCBcIjFoXCIsIGV0Yy4gdXNpbmcgdGhlIGBtc2AgbGlicmFyeVxuICogLSBGb3IgbnVtYmVyczogVHJlYXRzIGFzIG1pbGxpc2Vjb25kcyBmcm9tIG5vd1xuICogLSBGb3IgRGF0ZSBvYmplY3RzOiBSZXR1cm5zIHRoZSBkYXRlIGRpcmVjdGx5IChoYW5kbGVzIGJvdGggRGF0ZSBpbnN0YW5jZXMgYW5kIGRhdGUtbGlrZSBvYmplY3RzIGZyb20gZGVzZXJpYWxpemF0aW9uKVxuICpcbiAqIEBwYXJhbSBwYXJhbSAtIFRoZSBkdXJhdGlvbiBwYXJhbWV0ZXIgKFN0cmluZ1ZhbHVlLCBEYXRlLCBvciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzKVxuICogQHJldHVybnMgQSBEYXRlIG9iamVjdCByZXByZXNlbnRpbmcgd2hlbiB0aGUgZHVyYXRpb24gc2hvdWxkIGVsYXBzZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCBvciBjYW5ub3QgYmUgcGFyc2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUR1cmF0aW9uVG9EYXRlKHBhcmFtOiBTdHJpbmdWYWx1ZSB8IERhdGUgfCBudW1iZXIpOiBEYXRlIHtcbiAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gbXMocGFyYW0pO1xuICAgIGlmICh0eXBlb2YgZHVyYXRpb25NcyAhPT0gJ251bWJlcicgfHwgZHVyYXRpb25NcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgZHVyYXRpb246IFwiJHtwYXJhbX1cIi4gRXhwZWN0ZWQgYSB2YWxpZCBkdXJhdGlvbiBzdHJpbmcgbGlrZSBcIjFzXCIsIFwiMW1cIiwgXCIxaFwiLCBldGMuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkgKyBkdXJhdGlvbk1zKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHBhcmFtIDwgMCB8fCAhTnVtYmVyLmlzRmluaXRlKHBhcmFtKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBkdXJhdGlvbjogJHtwYXJhbX0uIEV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgcGFyYW0pO1xuICB9IGVsc2UgaWYgKFxuICAgIHBhcmFtIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIChwYXJhbSAmJlxuICAgICAgdHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIChwYXJhbSBhcyBhbnkpLmdldFRpbWUgPT09ICdmdW5jdGlvbicpXG4gICkge1xuICAgIC8vIEhhbmRsZSBib3RoIERhdGUgaW5zdGFuY2VzIGFuZCBkYXRlLWxpa2Ugb2JqZWN0cyAoZnJvbSBkZXNlcmlhbGl6YXRpb24pXG4gICAgcmV0dXJuIHBhcmFtIGluc3RhbmNlb2YgRGF0ZSA/IHBhcmFtIDogbmV3IERhdGUoKHBhcmFtIGFzIGFueSkuZ2V0VGltZSgpKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBkdXJhdGlvbiBwYXJhbWV0ZXIuIEV4cGVjdGVkIGEgZHVyYXRpb24gc3RyaW5nLCBudW1iZXIgKG1pbGxpc2Vjb25kcyksIG9yIERhdGUgb2JqZWN0LmBcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcGFyc2VEdXJhdGlvblRvRGF0ZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuXG5jb25zdCBCQVNFX1VSTCA9ICdodHRwczovL3VzZXdvcmtmbG93LmRldi9lcnInO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhbiBFcnJvciB3aXRob3V0IHJlbHlpbmcgb24gTm9kZS5qcyB1dGlsaXRpZXMuXG4gKiBUaGlzIGlzIG5lZWRlZCBmb3IgZXJyb3IgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIFZNIGNvbnRleHRzIHdoZXJlXG4gKiBOb2RlLmpzIGltcG9ydHMgYXJlIG5vdCBhdmFpbGFibGUuXG4gKi9cbmZ1bmN0aW9uIGlzRXJyb3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB7IG5hbWU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICduYW1lJyBpbiB2YWx1ZSAmJlxuICAgICdtZXNzYWdlJyBpbiB2YWx1ZVxuICApO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQWxsIHRoZSBzbHVncyBvZiB0aGUgZXJyb3JzIHVzZWQgZm9yIGRvY3VtZW50YXRpb24gbGlua3MuXG4gKi9cbmV4cG9ydCBjb25zdCBFUlJPUl9TTFVHUyA9IHtcbiAgTk9ERV9KU19NT0RVTEVfSU5fV09SS0ZMT1c6ICdub2RlLWpzLW1vZHVsZS1pbi13b3JrZmxvdycsXG4gIFNUQVJUX0lOVkFMSURfV09SS0ZMT1dfRlVOQ1RJT046ICdzdGFydC1pbnZhbGlkLXdvcmtmbG93LWZ1bmN0aW9uJyxcbiAgU0VSSUFMSVpBVElPTl9GQUlMRUQ6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcsXG4gIFdFQkhPT0tfSU5WQUxJRF9SRVNQT05EX1dJVEhfVkFMVUU6ICd3ZWJob29rLWludmFsaWQtcmVzcG9uZC13aXRoLXZhbHVlJyxcbiAgV0VCSE9PS19SRVNQT05TRV9OT1RfU0VOVDogJ3dlYmhvb2stcmVzcG9uc2Utbm90LXNlbnQnLFxuICBGRVRDSF9JTl9XT1JLRkxPV19GVU5DVElPTjogJ2ZldGNoLWluLXdvcmtmbG93JyxcbiAgVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1c6ICd0aW1lb3V0LWluLXdvcmtmbG93JyxcbiAgSE9PS19DT05GTElDVDogJ2hvb2stY29uZmxpY3QnLFxuICBDT1JSVVBURURfRVZFTlRfTE9HOiAnY29ycnVwdGVkLWV2ZW50LWxvZycsXG4gIFJFUExBWV9ESVZFUkdFTkNFOiAncmVwbGF5LWRpdmVyZ2VuY2UnLFxuICBTVEVQX05PVF9SRUdJU1RFUkVEOiAnc3RlcC1ub3QtcmVnaXN0ZXJlZCcsXG4gIFdPUktGTE9XX05PVF9SRUdJU1RFUkVEOiAnd29ya2Zsb3ctbm90LXJlZ2lzdGVyZWQnLFxuICBSVU5USU1FX0RFQ1JZUFRJT05fRkFJTEVEOiAncnVudGltZS1kZWNyeXB0aW9uLWZhaWxlZCcsXG59IGFzIGNvbnN0O1xuXG50eXBlIEVycm9yU2x1ZyA9ICh0eXBlb2YgRVJST1JfU0xVR1MpW2tleW9mIHR5cGVvZiBFUlJPUl9TTFVHU107XG5cbmludGVyZmFjZSBXb3JrZmxvd0Vycm9yT3B0aW9ucyBleHRlbmRzIEVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc2x1ZyBvZiB0aGUgZXJyb3IuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgbGluayB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbi5cbiAgICovXG4gIHNsdWc/OiBFcnJvclNsdWc7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBXb3JrZmxvdy1yZWxhdGVkIGVycm9ycy5cbiAqXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biBieSB0aGUgV29ya2Zsb3cgU0RLIHdoZW4gaW50ZXJuYWwgb3BlcmF0aW9ucyBmYWlsLlxuICogWW91IGNhbiB1c2UgdGhpcyBjbGFzcyB3aXRoIGBpbnN0YW5jZW9mYCB0byBjYXRjaCBhbnkgV29ya2Zsb3cgU0RLIGVycm9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgYXdhaXQgZ2V0UnVuKHJ1bklkKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdXb3JrZmxvdyBTREsgZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY2F1c2U/OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFdvcmtmbG93RXJyb3JPcHRpb25zKSB7XG4gICAgY29uc3QgbXNnRG9jcyA9IG9wdGlvbnM/LnNsdWdcbiAgICAgID8gYCR7bWVzc2FnZX1cXG5cXG5MZWFybiBtb3JlOiAke0JBU0VfVVJMfS8ke29wdGlvbnMuc2x1Z31gXG4gICAgICA6IG1lc3NhZ2U7XG4gICAgc3VwZXIobXNnRG9jcywgeyBjYXVzZTogb3B0aW9ucz8uY2F1c2UgfSk7XG4gICAgdGhpcy5jYXVzZSA9IG9wdGlvbnM/LmNhdXNlO1xuXG4gICAgaWYgKG9wdGlvbnM/LmNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBgJHt0aGlzLnN0YWNrfVxcbkNhdXNlZCBieTogJHtvcHRpb25zLmNhdXNlLnN0YWNrfWA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd0Vycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgd29ybGQgKHN0b3JhZ2UgYmFja2VuZCkgb3BlcmF0aW9uIGZhaWxzIHVuZXhwZWN0ZWRseS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBjYXRjaC1hbGwgZXJyb3IgZm9yIHdvcmxkIGltcGxlbWVudGF0aW9ucy4gU3BlY2lmaWMsXG4gKiB3ZWxsLWtub3duIGZhaWx1cmUgbW9kZXMgaGF2ZSBkZWRpY2F0ZWQgZXJyb3IgdHlwZXMgKGUuZy5cbiAqIEVudGl0eUNvbmZsaWN0RXJyb3IsIFJ1bkV4cGlyZWRFcnJvciwgVGhyb3R0bGVFcnJvcikuIFRoaXMgZXJyb3JcbiAqIGNvdmVycyBldmVyeXRoaW5nIGVsc2Ug4oCUIHZhbGlkYXRpb24gZmFpbHVyZXMsIG1pc3NpbmcgZW50aXRpZXNcbiAqIHdpdGhvdXQgYSBkZWRpY2F0ZWQgdHlwZSwgb3IgdW5leHBlY3RlZCBIVFRQIGVycm9ycyBmcm9tIHdvcmxkLXZlcmNlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93V29ybGRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBzdGF0dXM/OiBudW1iZXI7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgLyoqIFJldHJ5LUFmdGVyIHZhbHVlIGluIHNlY29uZHMsIHByZXNlbnQgb24gNDI5IGFuZCA0MjUgcmVzcG9uc2VzICovXG4gIHJldHJ5QWZ0ZXI/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBzdGF0dXM/OiBudW1iZXI7XG4gICAgICB1cmw/OiBzdHJpbmc7XG4gICAgICBjb2RlPzogc3RyaW5nO1xuICAgICAgcmV0cnlBZnRlcj86IG51bWJlcjtcbiAgICAgIGNhdXNlPzogdW5rbm93bjtcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIHtcbiAgICAgIGNhdXNlOiBvcHRpb25zPy5jYXVzZSxcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dXb3JsZEVycm9yJztcbiAgICB0aGlzLnN0YXR1cyA9IG9wdGlvbnM/LnN0YXR1cztcbiAgICB0aGlzLmNvZGUgPSBvcHRpb25zPy5jb2RlO1xuICAgIHRoaXMudXJsID0gb3B0aW9ucz8udXJsO1xuICAgIHRoaXMucmV0cnlBZnRlciA9IG9wdGlvbnM/LnJldHJ5QWZ0ZXI7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dXb3JsZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgd29ya2Zsb3cgcnVuIGZhaWxzIGR1cmluZyBleGVjdXRpb24uXG4gKlxuICogVGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCB0aGUgd29ya2Zsb3cgZW5jb3VudGVyZWQgYSBmYXRhbCBlcnJvciBhbmQgY2Fubm90XG4gKiBjb250aW51ZS4gSXQgaXMgdGhyb3duIHdoZW4gYXdhaXRpbmcgYHJ1bi5yZXR1cm5WYWx1ZWAgb24gYSBydW4gd2hvc2Ugc3RhdHVzXG4gKiBpcyBgJ2ZhaWxlZCdgLiBUaGUgYGNhdXNlYCBwcm9wZXJ0eSBjb250YWlucyB0aGUgdW5kZXJseWluZyBlcnJvciB3aXRoIGl0c1xuICogbWVzc2FnZSwgc3RhY2sgdHJhY2UsIGFuZCBvcHRpb25hbCBlcnJvciBjb2RlLlxuICpcbiAqIFVzZSB0aGUgc3RhdGljIGBXb3JrZmxvd1J1bkZhaWxlZEVycm9yLmlzKClgIG1ldGhvZCBmb3IgdHlwZS1zYWZlIGNoZWNraW5nXG4gKiBpbiBjYXRjaCBibG9ja3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBXb3JrZmxvd1J1bkZhaWxlZEVycm9yIH0gZnJvbSBcIndvcmtmbG93L2ludGVybmFsL2Vycm9yc1wiO1xuICpcbiAqIHRyeSB7XG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bi5yZXR1cm5WYWx1ZTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChXb3JrZmxvd1J1bkZhaWxlZEVycm9yLmlzKGVycm9yKSkge1xuICogICAgIGNvbnNvbGUuZXJyb3IoYFJ1biAke2Vycm9yLnJ1bklkfSBmYWlsZWQ6YCwgZXJyb3IuY2F1c2UubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5GYWlsZWRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBydW5JZDogc3RyaW5nO1xuICBkZWNsYXJlIGNhdXNlOiBFcnJvciAmIHsgY29kZT86IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIGVycm9yOiBTdHJ1Y3R1cmVkRXJyb3IpIHtcbiAgICAvLyBDcmVhdGUgYSBwcm9wZXIgRXJyb3IgaW5zdGFuY2UgZnJvbSB0aGUgU3RydWN0dXJlZEVycm9yIHRvIHNldCBhcyBjYXVzZVxuICAgIC8vIE5PVEU6IGN1c3RvbSBlcnJvciB0eXBlcyBkbyBub3QgZ2V0IHNlcmlhbGl6ZWQvZGVzZXJpYWxpemVkLiBFdmVyeXRoaW5nIGlzIGFuIEVycm9yXG4gICAgY29uc3QgY2F1c2VFcnJvciA9IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICAgIGNhdXNlRXJyb3Iuc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgICB9XG4gICAgaWYgKGVycm9yLmNvZGUpIHtcbiAgICAgIChjYXVzZUVycm9yIGFzIGFueSkuY29kZSA9IGVycm9yLmNvZGU7XG4gICAgfVxuXG4gICAgc3VwZXIoYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCwge1xuICAgICAgY2F1c2U6IGNhdXNlRXJyb3IsXG4gICAgfSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93UnVuRmFpbGVkRXJyb3InO1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVuRmFpbGVkRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5GYWlsZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGdldCByZXN1bHRzIGZyb20gYW4gaW5jb21wbGV0ZSB3b3JrZmxvdyBydW4uXG4gKlxuICogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB5b3UgdHJ5IHRvIGFjY2VzcyB0aGUgcmVzdWx0IG9mIGEgd29ya2Zsb3dcbiAqIHRoYXQgaXMgc3RpbGwgcnVubmluZyBvciBoYXNuJ3QgY29tcGxldGVkIHlldC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgc3RhdHVzOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBoYXMgbm90IGNvbXBsZXRlZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvcic7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBXb3JrZmxvdyBydW50aW1lIGVuY291bnRlcnMgYW4gaW50ZXJuYWwgZXJyb3IuXG4gKlxuICogVGhpcyBlcnJvciBpbmRpY2F0ZXMgYW4gaXNzdWUgd2l0aCB3b3JrZmxvdyBleGVjdXRpb24sIHN1Y2ggYXNcbiAqIHNlcmlhbGl6YXRpb24gZmFpbHVyZXMsIHN0YXJ0aW5nIGFuIGludmFsaWQgd29ya2Zsb3cgZnVuY3Rpb24sIG9yXG4gKiBvdGhlciBydW50aW1lIHByb2JsZW1zLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW50aW1lRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogV29ya2Zsb3dFcnJvck9wdGlvbnMpIHtcbiAgICBzdXBlcihtZXNzYWdlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd1J1bnRpbWVFcnJvcic7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bnRpbWVFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bnRpbWVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcGVyc2lzdGVkIHdvcmtmbG93IGV2ZW50IGxvZyBjYW5ub3QgYmUgcmVwbGF5ZWQgYmVjYXVzZSBpdFxuICogY29udGFpbnMgb3JwaGFuZWQsIGR1cGxpY2F0ZSwgb3IgbWlzbWF0Y2hlZCBldmVudHMuXG4gKlxuICogVGhpcyBpcyBhIHJ1bnRpbWUvaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZSByYXRoZXIgdGhhbiB1c2VyIGNvZGUgdGhyb3dpbmcuXG4gKiBXaGVuIHRoaXMgcmVhY2hlcyBydW4gZmFpbHVyZSBoYW5kbGluZywgaXQgaXMgcmVjb3JkZWQgd2l0aCB0aGUgZGlzdGluY3RcbiAqIGBDT1JSVVBURURfRVZFTlRfTE9HYCBjb2RlIHNvIHdvcmxkcyBhbmQgYmFja2VuZHMgY2FuIHRyYWNrIGl0IHNlcGFyYXRlbHlcbiAqIGZyb20gZ2VuZXJpYyBydW50aW1lIGZhaWx1cmVzLlxuICovXG5leHBvcnQgY2xhc3MgQ29ycnVwdGVkRXZlbnRMb2dFcnJvciBleHRlbmRzIFdvcmtmbG93UnVudGltZUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgc3VwZXIobWVzc2FnZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLkNPUlJVUFRFRF9FVkVOVF9MT0csXG4gICAgfSk7XG4gICAgdGhpcy5uYW1lID0gJ0NvcnJ1cHRlZEV2ZW50TG9nRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29ycnVwdGVkRXZlbnRMb2dFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdDb3JydXB0ZWRFdmVudExvZ0Vycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbmFsIHN0cnVjdHVyZWQgY29udGV4dCBhdHRhY2hlZCB0byBhIHtAbGluayBSdW50aW1lRGVjcnlwdGlvbkVycm9yfSxcbiAqIGNhcnJpZWQgb3ZlciBmcm9tIHRoZSB1bmRlcmx5aW5nIGRlY3J5cHQgY2FsbCBzaXRlIHRvIGhlbHAgZGlhZ25vc2UgdGhlXG4gKiBmYWlsdXJlIHdpdGhvdXQgcG9raW5nIHRocm91Z2ggc3RhY2tzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JDb250ZXh0IHtcbiAgLyoqIFRoZSBvcGVyYXRpb24gdGhhdCBmYWlsZWQg4oCUIHVzZWZ1bCB0byB0ZWxsIGVuY3J5cHQgdnMgZGVjcnlwdCBhcGFydC4gKi9cbiAgb3BlcmF0aW9uPzogJ2VuY3J5cHQnIHwgJ2RlY3J5cHQnO1xuICAvKiogQnl0ZSBsZW5ndGggb2YgdGhlIGlucHV0IHBheWxvYWQgYXQgdGhlIHRpbWUgb2YgdGhlIGZhaWx1cmUuICovXG4gIGJ5dGVMZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgaW5wdXQgcGF5bG9hZCwgZGVjb2RlZCBhcyBVVEYtOCBpZiBwcmludGFibGUuXG4gICAqIFVzZWZ1bCBmb3IgdGVsbGluZyBhcGFydCB0cnVuY2F0ZWQtYnV0LXZhbGlkLWxvb2tpbmcgZW5jcnlwdGVkIHBheWxvYWRzXG4gICAqIGZyb20gY29tcGxldGVseSB1bnJlbGF0ZWQgY29ycnVwdGlvbiAoZS5nLiBhbiBIVE1MIGVycm9yIHBhZ2Ugc3VyZmFjZWRcbiAgICogYXMgYSAyMDAgT0spLlxuICAgKi9cbiAgZm9ybWF0UHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBTREsncyBidWlsdC1pbiBBRVMtR0NNIGVuY3J5cHRpb24gbGF5ZXIgZmFpbHMgdG8gZW5jcnlwdFxuICogb3IgZGVjcnlwdCBhIHdvcmtmbG93IHBheWxvYWQuXG4gKlxuICogVGhpcyBpcyBhbiBpbnRlcm5hbCBTREsgZmFpbHVyZSDigJQgdXNlciBjb2RlIG5ldmVyIGludm9rZXMgdGhlIFNESydzXG4gKiBlbmNyeXB0aW9uIHByaW1pdGl2ZXMgZGlyZWN0bHkuIENvbW1vbiBjYXVzZXM6XG4gKlxuICogLSBBIGNpcGhlcnRleHQgLyBhdXRoIHRhZyBtaXNtYXRjaCwgdHlwaWNhbGx5IHN1cmZhY2VkIGFzIHRoZSBuYXRpdmUgV2ViXG4gKiAgIENyeXB0byBgT3BlcmF0aW9uRXJyb3I6IFRoZSBvcGVyYXRpb24gZmFpbGVkIGZvciBhbiBvcGVyYXRpb24tc3BlY2lmaWNcbiAqICAgcmVhc29uYC4gVXN1YWxseSBjYXVzZWQgYnkgY2lwaGVydGV4dCBtdXRhdGlvbiBvciB0cnVuY2F0aW9uIGluIHRyYW5zaXRcbiAqICAgYmV0d2VlbiBzdG9yYWdlIGFuZCByZWFkICh0cnVuY2F0ZWQgSFRUUCByZXNwb25zZSwgZWRnZS1jYWNoZSBtaXNzXG4gKiAgIHJldHVybmluZyBhIHBhcnRpYWwgMjAwLCBwcm94eSBkcm9wIGR1cmluZyBzdHJlYW1pbmcsIGV0Yy4pLlxuICogLSBBIGtleSByZXNvbHV0aW9uIG1pc21hdGNoICh3cm9uZyBkZXBsb3ltZW50LCBtaXNzaW5nIGtleSBtYXRlcmlhbCkuXG4gKiAtIEEgbWFsZm9ybWVkIGVuY3J5cHRlZCBlbnZlbG9wZSAodG9vIHNob3J0IHRvIGNvbnRhaW4gdGhlIEdDTSBub25jZVxuICogICBhbmQgdGFnKS5cbiAqXG4gKiBFeHRlbmRzIHtAbGluayBXb3JrZmxvd1J1bnRpbWVFcnJvcn0gc28gdGhlIHJ1bi1mYWlsdXJlIGNsYXNzaWZpZXJcbiAqIHJvdXRlcyBpdCB0byBgUlVOVElNRV9FUlJPUmAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRGVjcnlwdGlvbkVycm9yIGV4dGVuZHMgV29ya2Zsb3dSdW50aW1lRXJyb3Ige1xuICAvKiogT3B0aW9uYWwgc3RydWN0dXJlZCBjb250ZXh0IGFib3V0IHRoZSBmYWlsZWQgZW5jcnlwdC9kZWNyeXB0IGNhbGwuICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgY29udGV4dD86IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBvcHRpb25zPzogRXJyb3JPcHRpb25zICYgeyBjb250ZXh0PzogUnVudGltZURlY3J5cHRpb25FcnJvckNvbnRleHQgfVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCB7XG4gICAgICBjYXVzZTogb3B0aW9ucz8uY2F1c2UsXG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5SVU5USU1FX0RFQ1JZUFRJT05fRkFJTEVELFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICBpZiAob3B0aW9ucz8uY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVudGltZURlY3J5cHRpb25FcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBjdXJyZW50IHdvcmtmbG93IHJlcGxheSBjYW5ub3QgZm9sbG93IHRoZSBwYXRoIGRlc2NyaWJlZCBieVxuICogdGhlIHJlY29yZGVkIGV2ZW50IGxvZy4gQSBzaW5nbGUgZGl2ZXJnZW5jZSBkb2VzIG5vdCBwcm92ZSB0aGF0IHRoZVxuICogcGVyc2lzdGVkIGhpc3RvcnkgaXMgaW52YWxpZDogYSBzdWJzZXF1ZW50IHJlcGxheSBtYXkgb2JzZXJ2ZSBvciBzY2hlZHVsZVxuICogd29yayBjb3JyZWN0bHksIHNvIHRoZSBydW50aW1lIG1heSByZWRlbGl2ZXIgYmVmb3JlIGRlY2xhcmluZyBjb3JydXB0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUmVwbGF5RGl2ZXJnZW5jZUVycm9yIGV4dGVuZHMgV29ya2Zsb3dSdW50aW1lRXJyb3Ige1xuICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zOiBFcnJvck9wdGlvbnMgJiB7IGV2ZW50SWQ6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIobWVzc2FnZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlJFUExBWV9ESVZFUkdFTkNFLFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdSZXBsYXlEaXZlcmdlbmNlRXJyb3InO1xuICAgIHRoaXMuZXZlbnRJZCA9IG9wdGlvbnMuZXZlbnRJZDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlcGxheURpdmVyZ2VuY2VFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSZXBsYXlEaXZlcmdlbmNlRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzdGVwIGZ1bmN0aW9uIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXG4gKlxuICogVGhpcyBpcyBhbiBpbmZyYXN0cnVjdHVyZSBlcnJvciDigJQgbm90IGEgdXNlciBjb2RlIGVycm9yLiBJdCB0eXBpY2FsbHkgbWVhbnNcbiAqIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIGJ1bmRsaW5nL2J1aWxkIHRvb2xpbmcgdGhhdCBjYXVzZWQgdGhlIHN0ZXBcbiAqIHRvIG5vdCBnZXQgYnVpbHQgY29ycmVjdGx5LlxuICpcbiAqIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgc3RlcCBmYWlscyAobGlrZSBhIEZhdGFsRXJyb3IpIGFuZCBjb250cm9sIGlzIHBhc3NlZCBiYWNrXG4gKiB0byB0aGUgd29ya2Zsb3cgZnVuY3Rpb24sIHdoaWNoIGNhbiBvcHRpb25hbGx5IGhhbmRsZSB0aGUgZmFpbHVyZSBncmFjZWZ1bGx5LlxuICovXG5leHBvcnQgY2xhc3MgU3RlcE5vdFJlZ2lzdGVyZWRFcnJvciBleHRlbmRzIFdvcmtmbG93UnVudGltZUVycm9yIHtcbiAgc3RlcE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzdGVwTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGN1cnJlbnQgZGVwbG95bWVudC4gVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIGJ1aWxkIG9yIGJ1bmRsaW5nIGlzc3VlIHRoYXQgY2F1c2VkIHRoZSBzdGVwIHRvIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgZGVwbG95bWVudC5gLFxuICAgICAgeyBzbHVnOiBFUlJPUl9TTFVHUy5TVEVQX05PVF9SRUdJU1RFUkVEIH1cbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdTdGVwTm90UmVnaXN0ZXJlZEVycm9yJztcbiAgICB0aGlzLnN0ZXBOYW1lID0gc3RlcE5hbWU7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdGVwTm90UmVnaXN0ZXJlZEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1N0ZXBOb3RSZWdpc3RlcmVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSB3b3JrZmxvdyBmdW5jdGlvbiBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgY3VycmVudCBkZXBsb3ltZW50LlxuICpcbiAqIFRoaXMgaXMgYW4gaW5mcmFzdHJ1Y3R1cmUgZXJyb3Ig4oCUIG5vdCBhIHVzZXIgY29kZSBlcnJvci4gSXQgdHlwaWNhbGx5IG1lYW5zOlxuICogLSBBIHJ1biB3YXMgc3RhcnRlZCBhZ2FpbnN0IGEgZGVwbG95bWVudCB0aGF0IGRvZXMgbm90IGhhdmUgdGhlIHdvcmtmbG93XG4gKiAgIChlLmcuLCB0aGUgd29ya2Zsb3cgd2FzIHJlbmFtZWQgb3IgbW92ZWQgYW5kIGEgbmV3IHJ1biB0YXJnZXRlZCB0aGUgbGF0ZXN0IGRlcGxveW1lbnQpXG4gKiAtIFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIGJ1bmRsaW5nL2J1aWxkIHRvb2xpbmcgdGhhdCBjYXVzZWQgdGhlIHdvcmtmbG93XG4gKiAgIHRvIG5vdCBnZXQgYnVpbHQgY29ycmVjdGx5XG4gKlxuICogV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBydW4gZmFpbHMgd2l0aCBhIGBSVU5USU1FX0VSUk9SYCBlcnJvciBjb2RlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd1J1bnRpbWVFcnJvciB7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHdvcmtmbG93TmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgV29ya2Zsb3cgXCIke3dvcmtmbG93TmFtZX1cIiBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgY3VycmVudCBkZXBsb3ltZW50LiBUaGlzIHVzdWFsbHkgbWVhbnMgYSBydW4gd2FzIHN0YXJ0ZWQgYWdhaW5zdCBhIGRlcGxveW1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlIHRoaXMgd29ya2Zsb3csIG9yIHRoZXJlIHdhcyBhIGJ1aWxkL2J1bmRsaW5nIGlzc3VlLmAsXG4gICAgICB7IHNsdWc6IEVSUk9SX1NMVUdTLldPUktGTE9XX05PVF9SRUdJU1RFUkVEIH1cbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcic7XG4gICAgdGhpcy53b3JrZmxvd05hbWUgPSB3b3JrZmxvd05hbWU7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgb24gYSB3b3JrZmxvdyBydW4gdGhhdCBkb2VzIG5vdCBleGlzdC5cbiAqXG4gKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSBjYWxsIG1ldGhvZHMgb24gYSBydW4gb2JqZWN0IChlLmcuIGBydW4uc3RhdHVzYCxcbiAqIGBydW4uY2FuY2VsKClgLCBgcnVuLnJldHVyblZhbHVlYCkgYnV0IHRoZSB1bmRlcmx5aW5nIHJ1biBJRCBkb2VzIG5vdCBtYXRjaFxuICogYW55IGtub3duIHdvcmtmbG93IHJ1bi4gTm90ZSB0aGF0IGBnZXRSdW4oaWQpYCBpdHNlbGYgaXMgc3luY2hyb25vdXMgYW5kIHdpbGxcbiAqIG5vdCB0aHJvdyDigJQgdGhpcyBlcnJvciBpcyByYWlzZWQgd2hlbiBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgZGlzY292ZXIgdGhlIHJ1blxuICogaXMgbWlzc2luZy5cbiAqXG4gKiBVc2UgdGhlIHN0YXRpYyBgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKClgIG1ldGhvZCBmb3IgdHlwZS1zYWZlIGNoZWNraW5nXG4gKiBpbiBjYXRjaCBibG9ja3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgfSBmcm9tIFwid29ya2Zsb3cvaW50ZXJuYWwvZXJyb3JzXCI7XG4gKlxuICogdHJ5IHtcbiAqICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgcnVuLnN0YXR1cztcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IuaXMoZXJyb3IpKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihgUnVuICR7ZXJyb3IucnVuSWR9IGRvZXMgbm90IGV4aXN0YCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIG5vdCBmb3VuZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yJztcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgaG9vayB0b2tlbiBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIGFjdGl2ZSB3b3JrZmxvdyBydW4uXG4gKlxuICogVGhpcyBpcyBhIHVzZXIgZXJyb3Ig4oCUIGl0IG1lYW5zIHRoZSBzYW1lIGN1c3RvbSB0b2tlbiB3YXMgcGFzc2VkIHRvXG4gKiBgY3JlYXRlSG9va2AgaW4gdHdvIG9yIG1vcmUgY29uY3VycmVudCBydW5zLiBVc2UgYSB1bmlxdWUgdG9rZW4gcGVyIHJ1blxuICogKG9yIG9taXQgdGhlIHRva2VuIHRvIGxldCB0aGUgcnVudGltZSBnZW5lcmF0ZSBvbmUgYXV0b21hdGljYWxseSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb29rQ29uZmxpY3RFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICB0b2tlbjogc3RyaW5nO1xuICAvLyBUT0RPOiBNYWtlIHRoaXMgcmVxdWlyZWQgb25jZSBhbGwgcGVyc2lzdGVkIGhvb2tfY29uZmxpY3QgZXZlbnRzIGFuZCBXb3JsZFxuICAvLyBpbXBsZW1lbnRhdGlvbnMgYWx3YXlzIGluY2x1ZGUgdGhlIGFjdGl2ZSBob29rIG93bmVyJ3MgcnVuIElELlxuICBjb25mbGljdGluZ1J1bklkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHRva2VuOiBzdHJpbmcsIGNvbmZsaWN0aW5nUnVuSWQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGBIb29rIHRva2VuIFwiJHt0b2tlbn1cIiBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHdvcmtmbG93JHtjb25mbGljdGluZ1J1bklkID8gYCAocnVuIFwiJHtjb25mbGljdGluZ1J1bklkfVwiKWAgOiAnJ31gLFxuICAgICAge1xuICAgICAgICBzbHVnOiBFUlJPUl9TTFVHUy5IT09LX0NPTkZMSUNULFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ0hvb2tDb25mbGljdEVycm9yJztcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb25mbGljdGluZ1J1bklkID0gY29uZmxpY3RpbmdSdW5JZDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBIb29rQ29uZmxpY3RFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdIb29rQ29uZmxpY3RFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBjYWxsaW5nIGByZXN1bWVIb29rKClgIG9yIGByZXN1bWVXZWJob29rKClgIHdpdGggYSB0b2tlbiB0aGF0XG4gKiBkb2VzIG5vdCBtYXRjaCBhbnkgYWN0aXZlIGhvb2suXG4gKlxuICogQ29tbW9uIGNhdXNlczpcbiAqIC0gVGhlIGhvb2sgaGFzIGV4cGlyZWQgKHBhc3QgaXRzIFRUTClcbiAqIC0gVGhlIGhvb2sgd2FzIGFscmVhZHkgZGlzcG9zZWQgYWZ0ZXIgYmVpbmcgY29uc3VtZWRcbiAqIC0gVGhlIHdvcmtmbG93IGhhcyBub3Qgc3RhcnRlZCB5ZXQsIHNvIHRoZSBob29rIGRvZXMgbm90IGV4aXN0XG4gKlxuICogQSBjb21tb24gcGF0dGVybiBpcyB0byBjYXRjaCB0aGlzIGVycm9yIGFuZCBzdGFydCBhIG5ldyB3b3JrZmxvdyBydW4gd2hlblxuICogdGhlIGhvb2sgZG9lcyBub3QgZXhpc3QgeWV0ICh0aGUgXCJyZXN1bWUgb3Igc3RhcnRcIiBwYXR0ZXJuKS5cbiAqXG4gKiBVc2UgdGhlIHN0YXRpYyBgSG9va05vdEZvdW5kRXJyb3IuaXMoKWAgbWV0aG9kIGZvciB0eXBlLXNhZmUgY2hlY2tpbmcgaW5cbiAqIGNhdGNoIGJsb2Nrcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEhvb2tOb3RGb3VuZEVycm9yIH0gZnJvbSBcIndvcmtmbG93L2ludGVybmFsL2Vycm9yc1wiO1xuICpcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IHJlc3VtZUhvb2sodG9rZW4sIHBheWxvYWQpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycm9yKSkge1xuICogICAgIC8vIEhvb2sgZG9lc24ndCBleGlzdCDigJQgc3RhcnQgYSBuZXcgd29ya2Zsb3cgcnVuIGluc3RlYWRcbiAqICAgICBhd2FpdCBzdGFydFdvcmtmbG93KFwibXlXb3JrZmxvd1wiLCBwYXlsb2FkKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBIb29rTm90Rm91bmRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICB0b2tlbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHRva2VuOiBzdHJpbmcpIHtcbiAgICBzdXBlcignSG9vayBub3QgZm91bmQnLCB7fSk7XG4gICAgdGhpcy5uYW1lID0gJ0hvb2tOb3RGb3VuZEVycm9yJztcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBIb29rTm90Rm91bmRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdIb29rTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhbiBvcGVyYXRpb24gY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gZW50aXR5LlxuICogVGhpcyBpbmNsdWRlcyBhdHRlbXB0cyB0byBtb2RpZnkgYW4gZW50aXR5IGFscmVhZHkgaW4gYSB0ZXJtaW5hbCBzdGF0ZSxcbiAqIGNyZWF0ZSBhbiBlbnRpdHkgdGhhdCBhbHJlYWR5IGV4aXN0cywgb3IgYW55IG90aGVyIDQwOS1zdHlsZSBjb25mbGljdC5cbiAqXG4gKiBUaGUgd29ya2Zsb3cgcnVudGltZSBoYW5kbGVzIHRoaXMgZXJyb3IgYXV0b21hdGljYWxseS4gVXNlcnMgaW50ZXJhY3RpbmdcbiAqIHdpdGggd29ybGQgc3RvcmFnZSBiYWNrZW5kcyBkaXJlY3RseSBtYXkgZW5jb3VudGVyIGl0LlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5Q29uZmxpY3RFcnJvciBleHRlbmRzIFdvcmtmbG93V29ybGRFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdFbnRpdHlDb25mbGljdEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEVudGl0eUNvbmZsaWN0RXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnRW50aXR5Q29uZmxpY3RFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHJ1biBpcyBubyBsb25nZXIgYXZhaWxhYmxlIOKAlCBlaXRoZXIgYmVjYXVzZSBpdCBoYXMgYmVlblxuICogY2xlYW5lZCB1cCwgZXhwaXJlZCwgb3IgYWxyZWFkeSByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgKGNvbXBsZXRlZC9mYWlsZWQpLlxuICpcbiAqIFRoZSB3b3JrZmxvdyBydW50aW1lIGhhbmRsZXMgdGhpcyBlcnJvciBhdXRvbWF0aWNhbGx5LiBVc2VycyBpbnRlcmFjdGluZ1xuICogd2l0aCB3b3JsZCBzdG9yYWdlIGJhY2tlbmRzIGRpcmVjdGx5IG1heSBlbmNvdW50ZXIgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5FeHBpcmVkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnUnVuRXhwaXJlZEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1bkV4cGlyZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSdW5FeHBpcmVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgYSByZXF1aXJlZCB0aW1lc3RhbXBcbiAqIChlLmcuIHJldHJ5QWZ0ZXIpIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC5cbiAqXG4gKiBUaGUgd29ya2Zsb3cgcnVudGltZSBoYW5kbGVzIHRoaXMgZXJyb3IgYXV0b21hdGljYWxseS4gVXNlcnMgaW50ZXJhY3RpbmdcbiAqIHdpdGggd29ybGQgc3RvcmFnZSBiYWNrZW5kcyBkaXJlY3RseSBtYXkgZW5jb3VudGVyIGl0LlxuICpcbiAqIEBwcm9wZXJ0eSByZXRyeUFmdGVyIC0gRGVsYXkgaW4gc2Vjb25kcyBiZWZvcmUgdGhlIG9wZXJhdGlvbiBjYW4gYmUgcmV0cmllZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRvb0Vhcmx5RXJyb3IgZXh0ZW5kcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJldHJ5QWZ0ZXI/OiBudW1iZXIgfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIHsgcmV0cnlBZnRlcjogb3B0aW9ucz8ucmV0cnlBZnRlciB9KTtcbiAgICB0aGlzLm5hbWUgPSAnVG9vRWFybHlFcnJvcic7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUb29FYXJseUVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1Rvb0Vhcmx5RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSByZXF1ZXN0IGlzIHJhdGUgbGltaXRlZCBieSB0aGUgd29ya2Zsb3cgYmFja2VuZC5cbiAqXG4gKiBUaGUgd29ya2Zsb3cgcnVudGltZSBoYW5kbGVzIHRoaXMgZXJyb3IgYXV0b21hdGljYWxseSB3aXRoIHJldHJ5IGxvZ2ljLlxuICogVXNlcnMgaW50ZXJhY3Rpbmcgd2l0aCB3b3JsZCBzdG9yYWdlIGJhY2tlbmRzIGRpcmVjdGx5IG1heSBlbmNvdW50ZXIgaXRcbiAqIGlmIHJldHJpZXMgYXJlIGV4aGF1c3RlZC5cbiAqXG4gKiBAcHJvcGVydHkgcmV0cnlBZnRlciAtIERlbGF5IGluIHNlY29uZHMgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSByZXRyaWVkLlxuICovXG5leHBvcnQgY2xhc3MgVGhyb3R0bGVFcnJvciBleHRlbmRzIFdvcmtmbG93V29ybGRFcnJvciB7XG4gIHJldHJ5QWZ0ZXI/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogeyByZXRyeUFmdGVyPzogbnVtYmVyIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVGhyb3R0bGVFcnJvcic7XG4gICAgdGhpcy5yZXRyeUFmdGVyID0gb3B0aW9ucz8ucmV0cnlBZnRlcjtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRocm90dGxlRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnVGhyb3R0bGVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhd2FpdGluZyBgcnVuLnJldHVyblZhbHVlYCBvbiBhIHdvcmtmbG93IHJ1biB0aGF0IHdhcyBjYW5jZWxsZWQuXG4gKlxuICogVGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCB0aGUgd29ya2Zsb3cgd2FzIGV4cGxpY2l0bHkgY2FuY2VsbGVkICh2aWFcbiAqIGBydW4uY2FuY2VsKClgKSBhbmQgd2lsbCBub3QgcHJvZHVjZSBhIHJldHVybiB2YWx1ZS4gWW91IGNhbiBjaGVjayBmb3JcbiAqIGNhbmNlbGxhdGlvbiBiZWZvcmUgYXdhaXRpbmcgdGhlIHJldHVybiB2YWx1ZSBieSBpbnNwZWN0aW5nIGBydW4uc3RhdHVzYC5cbiAqXG4gKiBVc2UgdGhlIHN0YXRpYyBgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvci5pcygpYCBtZXRob2QgZm9yIHR5cGUtc2FmZVxuICogY2hlY2tpbmcgaW4gY2F0Y2ggYmxvY2tzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvciB9IGZyb20gXCJ3b3JrZmxvdy9pbnRlcm5hbC9lcnJvcnNcIjtcbiAqXG4gKiB0cnkge1xuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4ucmV0dXJuVmFsdWU7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvci5pcyhlcnJvcikpIHtcbiAqICAgICBjb25zb2xlLmxvZyhgUnVuICR7ZXJyb3IucnVuSWR9IHdhcyBjYW5jZWxsZWRgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGNhbmNlbGxlZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcic7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gb3BlcmF0ZSBvbiBhIHdvcmtmbG93IHJ1biB0aGF0IHJlcXVpcmVzIGEgbmV3ZXIgV29ybGQgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIGEgcnVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciBzcGVjIHZlcnNpb24gdGhhbiB0aGVcbiAqIGN1cnJlbnQgV29ybGQgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMuIFRvIHJlc29sdmUgdGhpcywgdXBncmFkZSB5b3VyXG4gKiBgd29ya2Zsb3dgIHBhY2thZ2VzIHRvIGEgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIHRoZSByZXF1aXJlZCBzcGVjIHZlcnNpb24uXG4gKlxuICogVXNlIHRoZSBzdGF0aWMgYFJ1bk5vdFN1cHBvcnRlZEVycm9yLmlzKClgIG1ldGhvZCBmb3IgdHlwZS1zYWZlIGNoZWNraW5nIGluXG4gKiBjYXRjaCBibG9ja3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBSdW5Ob3RTdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJ3b3JrZmxvdy9pbnRlcm5hbC9lcnJvcnNcIjtcbiAqXG4gKiB0cnkge1xuICogICBjb25zdCBzdGF0dXMgPSBhd2FpdCBydW4uc3RhdHVzO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKFJ1bk5vdFN1cHBvcnRlZEVycm9yLmlzKGVycm9yKSkge1xuICogICAgIGNvbnNvbGUuZXJyb3IoXG4gKiAgICAgICBgUnVuIHJlcXVpcmVzIHNwZWMgdiR7ZXJyb3IucnVuU3BlY1ZlcnNpb259LCBgICtcbiAqICAgICAgIGBidXQgd29ybGQgc3VwcG9ydHMgdiR7ZXJyb3Iud29ybGRTcGVjVmVyc2lvbn1gXG4gKiAgICAgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5Ob3RTdXBwb3J0ZWRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICByZWFkb25seSBydW5TcGVjVmVyc2lvbjogbnVtYmVyO1xuICByZWFkb25seSB3b3JsZFNwZWNWZXJzaW9uOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocnVuU3BlY1ZlcnNpb246IG51bWJlciwgd29ybGRTcGVjVmVyc2lvbjogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgUnVuIHJlcXVpcmVzIHNwZWMgdmVyc2lvbiAke3J1blNwZWNWZXJzaW9ufSwgYnV0IHdvcmxkIHN1cHBvcnRzIHZlcnNpb24gJHt3b3JsZFNwZWNWZXJzaW9ufS4gYCArXG4gICAgICAgIGBQbGVhc2UgdXBncmFkZSAnd29ya2Zsb3cnIHBhY2thZ2UuYFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bk5vdFN1cHBvcnRlZEVycm9yJztcbiAgICB0aGlzLnJ1blNwZWNWZXJzaW9uID0gcnVuU3BlY1ZlcnNpb247XG4gICAgdGhpcy53b3JsZFNwZWNWZXJzaW9uID0gd29ybGRTcGVjVmVyc2lvbjtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1bk5vdFN1cHBvcnRlZEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1J1bk5vdFN1cHBvcnRlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEEgZmF0YWwgZXJyb3IgaXMgYW4gZXJyb3IgdGhhdCBjYW5ub3QgYmUgcmV0cmllZC5cbiAqIEl0IHdpbGwgY2F1c2UgdGhlIHN0ZXAgdG8gZmFpbCBhbmQgdGhlIGVycm9yIHdpbGxcbiAqIGJlIGJ1YmJsZWQgdXAgdG8gdGhlIHdvcmtmbG93IGxvZ2ljLlxuICovXG5leHBvcnQgY2xhc3MgRmF0YWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgZmF0YWwgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdGYXRhbEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEZhdGFsRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnRmF0YWxFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeWFibGVFcnJvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgdGhlIHN0ZXAuXG4gICAqIENhbiBhbHNvIGJlIGEgZHVyYXRpb24gc3RyaW5nIChlLmcuLCBcIjVzXCIsIFwiMm1cIikgb3IgYSBEYXRlIG9iamVjdC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgc3RlcCB3aWxsIGJlIHJldHJpZWQgYWZ0ZXIgMSBzZWNvbmQgKDEwMDAgbWlsbGlzZWNvbmRzKS5cbiAgICovXG4gIHJldHJ5QWZ0ZXI/OiBudW1iZXIgfCBTdHJpbmdWYWx1ZSB8IERhdGU7XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdGhhdCBjYW4gaGFwcGVuIGR1cmluZyBhIHN0ZXAgZXhlY3V0aW9uLCBhbGxvd2luZ1xuICogZm9yIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJldHJ5IGJlaGF2aW9yLlxuICovXG5leHBvcnQgY2xhc3MgUmV0cnlhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgRGF0ZSB3aGVuIHRoZSBzdGVwIHNob3VsZCBiZSByZXRyaWVkLlxuICAgKi9cbiAgcmV0cnlBZnRlcjogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM6IFJldHJ5YWJsZUVycm9yT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1JldHJ5YWJsZUVycm9yJztcblxuICAgIGlmIChvcHRpb25zLnJldHJ5QWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZXRyeUFmdGVyID0gcGFyc2VEdXJhdGlvblRvRGF0ZShvcHRpb25zLnJldHJ5QWZ0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIDEgc2Vjb25kICgxMDAwIG1pbGxpc2Vjb25kcylcbiAgICAgIHRoaXMucmV0cnlBZnRlciA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZXRyeWFibGVFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSZXRyeWFibGVFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRSA9XG4gICdZb3VyIGN1cnJlbnQgdmVyY2VsIGFjY291bnQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZS4gVXNlIGB2ZXJjZWwgbG9naW5gIG9yIGB2ZXJjZWwgc3dpdGNoYCB0byBlbnN1cmUgeW91IGFyZSBsaW5rZWQgdG8gdGhlIHJpZ2h0IGFjY291bnQuJztcblxuZXhwb3J0IHsgUlVOX0VSUk9SX0NPREVTLCB0eXBlIFJ1bkVycm9yQ29kZSB9IGZyb20gJy4vZXJyb3ItY29kZXMuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyb3NzLXJlYWxtIGNsYXNzIHJlZ2lzdHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gYEZhdGFsRXJyb3JgLCBgUmV0cnlhYmxlRXJyb3JgLCBhbmQgYEhvb2tDb25mbGljdEVycm9yYCBhcmUgbm90IGJ1aWx0LWlucywgc28gZGlmZmVyZW50IHJlYWxtc1xuLy8gKGUuZy4gdGhlIHdvcmtmbG93IFZNIGNvbnRleHQgdnMuIHRoZSBob3N0IGNvbnRleHQgdGhhdCBydW5zIHRoZSBxdWV1ZVxuLy8gaGFuZGxlcikgYnVuZGxlIGFuZCBsb2FkIHRoZWlyIG93biBjb3BpZXMgb2YgdGhpcyBtb2R1bGUg4oCUIG1lYW5pbmcgZWFjaFxuLy8gcmVhbG0gaGFzIGl0cyBvd24gZGlzdGluY3QgY2xhc3MgaWRlbnRpdHkuIENyb3NzLXJlYWxtIGBpbnN0YW5jZW9mYCBmYWlsc1xuLy8gYmVjYXVzZSB0aGUgcHJvdG90eXBlIGNoYWlucyBuZXZlciBtZWV0LlxuLy9cbi8vIFRvIGxldCBzZXJpYWxpemF0aW9uIHJldml2ZXJzIHJlY29uc3RydWN0IGEgdmFsdWUgYXMgdGhlICpjb25zdW1lcidzKlxuLy8gRmF0YWxFcnJvciAoc28gdXNlci1jb2RlIGBlcnIgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCBwYXNzZXMpLCBlYWNoIGJ1bmRsZWRcbi8vIGNvcHkgb2YgdGhpcyBtb2R1bGUgc2VsZi1yZWdpc3RlcnMgaXRzIGNsYXNzIG9uIGBnbG9iYWxUaGlzYCB2aWEgYSBrbm93blxuLy8gU3ltYm9sLmZvciBrZXkuIFJldml2ZXJzIGluIGBAd29ya2Zsb3cvY29yZWAgbG9vayB1cCB0aGUgY2xhc3MgdmlhIHRoZVxuLy8gY29uc3VtZXIncyBnbG9iYWxUaGlzIGF0IGh5ZHJhdGlvbiB0aW1lLlxuLy9cbi8vIEZpcnN0IHJlZ2lzdHJhdGlvbiBpbiBhIGdpdmVuIHJlYWxtIHdpbnMuIFRoZSBkZXNjcmlwdG9yIGlzIG5vbi13cml0YWJsZVxuLy8gYW5kIG5vbi1jb25maWd1cmFibGUgdG8gbWFrZSBhY2NpZGVudGFsIGNsb2JiZXJpbmcgbG91ZC5cbmNvbnN0IEZBVEFMX0VSUk9SX0tFWSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL0ZhdGFsRXJyb3InKTtcbmNvbnN0IFJFVFJZQUJMRV9FUlJPUl9LRVkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpO1xuY29uc3QgSE9PS19DT05GTElDVF9FUlJPUl9LRVkgPSBTeW1ib2wuZm9yKFxuICAnQHdvcmtmbG93L2Vycm9ycy8vSG9va0NvbmZsaWN0RXJyb3InXG4pO1xuXG5pZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gIGlmICghT2JqZWN0Lmhhc093bihnbG9iYWxUaGlzLCBGQVRBTF9FUlJPUl9LRVkpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIEZBVEFMX0VSUk9SX0tFWSwge1xuICAgICAgdmFsdWU6IEZhdGFsRXJyb3IsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgaWYgKCFPYmplY3QuaGFzT3duKGdsb2JhbFRoaXMsIFJFVFJZQUJMRV9FUlJPUl9LRVkpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIFJFVFJZQUJMRV9FUlJPUl9LRVksIHtcbiAgICAgIHZhbHVlOiBSZXRyeWFibGVFcnJvcixcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuICBpZiAoIU9iamVjdC5oYXNPd24oZ2xvYmFsVGhpcywgSE9PS19DT05GTElDVF9FUlJPUl9LRVkpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIEhPT0tfQ09ORkxJQ1RfRVJST1JfS0VZLCB7XG4gICAgICB2YWx1ZTogSG9va0NvbmZsaWN0RXJyb3IsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgV09SS0ZMT1dfVVNFX1NURVAgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19VU0VfU1RFUCcpO1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0NSRUFURV9IT09LID0gU3ltYm9sLmZvcignV09SS0ZMT1dfQ1JFQVRFX0hPT0snKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19TTEVFUCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NMRUVQJyk7XG5leHBvcnQgY29uc3QgV09SS0ZMT1dfQ09OVEVYVCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0NPTlRFWFQnKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19HRVRfU1RSRUFNX0lEID0gU3ltYm9sLmZvcignV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCcpO1xuZXhwb3J0IGNvbnN0IFNUQUJMRV9VTElEID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU1RBQkxFX1VMSUQnKTtcbmV4cG9ydCBjb25zdCBTVFJFQU1fTkFNRV9TWU1CT0wgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpO1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9UWVBFX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyk7XG5leHBvcnQgY29uc3QgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX0ZSQU1JTkcnKTtcbi8qKlxuICogU3RhbXBlZCBvbiBhIHJlYWwgYFdyaXRhYmxlU3RyZWFtYCAodGhlIHVzZXItdmlzaWJsZSBgc2VyaWFsaXplLndyaXRhYmxlYFxuICogcmV0dXJuZWQgZnJvbSBhIHN0ZXAtc2lkZSByZXZpdmVyIG9yIHN0ZXAtY29udGV4dCBgZ2V0V3JpdGFibGUoKWApIHRvXG4gKiByZWNvcmQgdGhlIGBydW5JZGAgb2YgdGhlIHdvcmtmbG93IHJ1biB0aGF0IG93bnMgdGhlIHVuZGVybHlpbmcgc2VydmVyXG4gKiBzdHJlYW0uIFVzZWQgdG9nZXRoZXIgd2l0aCBgU1RSRUFNX05BTUVfU1lNQk9MYC5cbiAqXG4gKiBXaGVuIGBnZXRFeHRlcm5hbFJlZHVjZXJzLldyaXRhYmxlU3RyZWFtYCAodGhlIGRlaHlkcmF0aW9uIHBhdGggdXNlZCBieVxuICogYHN0YXJ0KClgKSBzZWVzIGJvdGggc3ltYm9scyBvbiBhIHdyaXRhYmxlLCBpdCBpbmNsdWRlcyB0aGUgYHJ1bklkYCBpblxuICogdGhlIGRlc2NyaXB0b3IgaXQgZW1pdHMuIFRoZSBjaGlsZCBydW4ncyBzdGVwLXNpZGUgcmV2aXZlciB0aGVuIG9wZW5zXG4gKiBhIHNlcnZlciB3cml0YWJsZSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgKHJ1bklkLCBuYW1lKWAgYW5kIHJlc29sdmVzXG4gKiB0aGF0IHJ1bidzIGVuY3J5cHRpb24ga2V5IGRpcmVjdGx5IOKAlCBzbyB0aGUgY2hpbGQncyB3cml0ZXMgbGFuZCBvblxuICogdGhlIHBhcmVudCdzIHN0cmVhbSBhcy1pcywgd2l0aCBubyBjbGllbnQgcHJvY2VzcyBpbiB0aGUgbG9vcC4gVGhhdFxuICoga2VlcHMgdGhlIGZvcndhcmRpbmcgYWxpdmUgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBjaGlsZCBydW4sXG4gKiBub3QganVzdCBmb3IgdGhlIHBhcmVudCBzdGVwIHRoYXQgaW5pdGlhdGVkIGBzdGFydCgpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCA9IFN5bWJvbC5mb3IoXG4gICdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX1JVTl9JRCdcbik7XG4vKipcbiAqIFN0YW1wZWQgYWxvbmdzaWRlIGBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xgIHdoZW4gdGhlIGRlcGxveW1lbnQgdGhhdFxuICogb3ducyBhIGZvcndhcmRlZCB3cml0YWJsZSBzdHJlYW0gaXMga25vd24uIENyb3NzLWRlcGxveW1lbnQgY29uc3VtZXJzIHVzZVxuICogaXQgdG8gcmVzb2x2ZSB0aGUgb3duaW5nIHJ1bidzIGVuY3J5cHRpb24ga2V5IHdpdGhvdXQgbG9hZGluZyB0aGUgcnVuIGZpcnN0LlxuICovXG5leHBvcnQgY29uc3QgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCA9IFN5bWJvbC5mb3IoXG4gICdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSUQnXG4pO1xuZXhwb3J0IGNvbnN0IEJPRFlfSU5JVF9TWU1CT0wgPSBTeW1ib2wuZm9yKCdCT0RZX0lOSVQnKTtcbmV4cG9ydCBjb25zdCBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFID0gU3ltYm9sLmZvcihcbiAgJ1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUnXG4pO1xuXG4vKipcbiAqIFN5bWJvbCB1c2VkIHRvIHN0b3JlIHRoZSBjbGFzcyByZWdpc3RyeSBvbiBnbG9iYWxUaGlzIGluIHdvcmtmbG93IG1vZGUuXG4gKiBUaGlzIGFsbG93cyB0aGUgZGVzZXJpYWxpemVyIHRvIGZpbmQgY2xhc3NlcyBieSBjbGFzc0lkIGluIHRoZSBWTSBjb250ZXh0LlxuICovXG5leHBvcnQgY29uc3QgV09SS0ZMT1dfQ0xBU1NfUkVHSVNUUlkgPSBTeW1ib2wuZm9yKCd3b3JrZmxvdy1jbGFzcy1yZWdpc3RyeScpO1xuIiwgImltcG9ydCB7IGNyZWF0ZVdvcmtmbG93VXJsIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB0eXBlIHtcbiAgSG9vayxcbiAgSG9va09wdGlvbnMsXG4gIFJlcXVlc3RXaXRoUmVzcG9uc2UsXG4gIFdlYmhvb2ssXG4gIFdlYmhvb2tPcHRpb25zLFxufSBmcm9tICcuLi9jcmVhdGUtaG9vay5qcyc7XG5pbXBvcnQgeyBXT1JLRkxPV19DUkVBVEVfSE9PSyB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gJy4vZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2s8VCA9IGFueT4ob3B0aW9ucz86IEhvb2tPcHRpb25zKTogSG9vazxUPiB7XG4gIC8vIEluc2lkZSB0aGUgd29ya2Zsb3cgVk0sIHRoZSBob29rIGZ1bmN0aW9uIGlzIHN0b3JlZCBpbiB0aGUgZ2xvYmFsVGhpcyBvYmplY3QgYmVoaW5kIGEgc3ltYm9sXG4gIGNvbnN0IGNyZWF0ZUhvb2tGbiA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgV09SS0ZMT1dfQ1JFQVRFX0hPT0tcbiAgXSBhcyB0eXBlb2YgY3JlYXRlSG9vazxUPjtcbiAgaWYgKCFjcmVhdGVIb29rRm4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYGNyZWF0ZUhvb2soKWAgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBhIHdvcmtmbG93IGZ1bmN0aW9uJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUhvb2tGbihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2soXG4gIG9wdGlvbnM6IFdlYmhvb2tPcHRpb25zICYgeyByZXNwb25kV2l0aDogJ21hbnVhbCcgfVxuKTogV2ViaG9vazxSZXF1ZXN0V2l0aFJlc3BvbnNlPjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rKG9wdGlvbnM/OiBXZWJob29rT3B0aW9ucyk6IFdlYmhvb2s8UmVxdWVzdD47XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViaG9vayhcbiAgb3B0aW9ucz86IFdlYmhvb2tPcHRpb25zXG4pOiBXZWJob29rPFJlcXVlc3Q+IHwgV2ViaG9vazxSZXF1ZXN0V2l0aFJlc3BvbnNlPiB7XG4gIGNvbnN0IHsgcmVzcG9uZFdpdGgsIHRva2VuLCAuLi5yZXN0IH0gPSAob3B0aW9ucyA/PyB7fSkgYXMgV2ViaG9va09wdGlvbnMgJiB7XG4gICAgdG9rZW4/OiBzdHJpbmc7XG4gIH07XG5cbiAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYGNyZWF0ZVdlYmhvb2soKWAgZG9lcyBub3QgYWNjZXB0IGEgYHRva2VuYCBvcHRpb24uIFdlYmhvb2sgdG9rZW5zIGFyZSBhbHdheXMgcmFuZG9tbHkgZ2VuZXJhdGVkLiBVc2UgYGNyZWF0ZUhvb2soKWAgd2l0aCBgcmVzdW1lSG9vaygpYCBmb3IgZGV0ZXJtaW5pc3RpYyB0b2tlbiBwYXR0ZXJucy4nXG4gICAgKTtcbiAgfVxuXG4gIGxldCBtZXRhZGF0YTogUGljazxXZWJob29rT3B0aW9ucywgJ3Jlc3BvbmRXaXRoJz4gfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgcmVzcG9uZFdpdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbWV0YWRhdGEgPSB7IHJlc3BvbmRXaXRoIH07XG4gIH1cblxuICBjb25zdCBob29rID0gY3JlYXRlSG9vayh7IC4uLnJlc3QsIG1ldGFkYXRhLCBpc1dlYmhvb2s6IHRydWUgfSkgYXNcbiAgICB8IFdlYmhvb2s8UmVxdWVzdD5cbiAgICB8IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT47XG5cbiAgY29uc3QgeyB1cmwgfSA9IGdldFdvcmtmbG93TWV0YWRhdGEoKTtcbiAgaG9vay51cmwgPSBjcmVhdGVXb3JrZmxvd1VybCh1cmwsIHsgdHlwZTogJ3dlYmhvb2snLCB0b2tlbjogaG9vay50b2tlbiB9KTtcblxuICByZXR1cm4gaG9vaztcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEhvb2sgYXMgSG9va0VudGl0eSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgY3JlYXRlSG9vayB9IGZyb20gJy4vY3JlYXRlLWhvb2suanMnO1xuXG4vKipcbiAqIE5PVEU6IFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBkZWZpbmVIb29rKClgIHRoYXQgaXMgdXNlZCBpbiB3b3JrZmxvdyBjb250ZXh0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUhvb2s8VElucHV0LCBUT3V0cHV0ID0gVElucHV0PigpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGUob3B0aW9ucz86IEhvb2tPcHRpb25zKTogSG9vazxUT3V0cHV0PiB7XG4gICAgICByZXR1cm4gY3JlYXRlSG9vazxUT3V0cHV0PihvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgcmVzdW1lKF90b2tlbjogc3RyaW5nLCBfcGF5bG9hZDogVElucHV0KTogUHJvbWlzZTxIb29rRW50aXR5IHwgbnVsbD4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnYGRlZmluZUhvb2soKS5yZXN1bWUoKWAgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gZXh0ZXJuYWwgY29udGV4dHMgKGUuZy4gQVBJIHJvdXRlcykuJ1xuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgV29ya2Zsb3dXcml0YWJsZVN0cmVhbU9wdGlvbnMgfSBmcm9tICcuLi9zdGVwL3dyaXRhYmxlLXN0cmVhbS5qcyc7XG5pbXBvcnQgeyBTVFJFQU1fTkFNRV9TWU1CT0wsIFdPUktGTE9XX0dFVF9TVFJFQU1fSUQgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdyaXRhYmxlPFcgPSBhbnk+KFxuICBvcHRpb25zOiBXb3JrZmxvd1dyaXRhYmxlU3RyZWFtT3B0aW9ucyA9IHt9XG4pOiBXcml0YWJsZVN0cmVhbTxXPiB7XG4gIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBvcHRpb25zO1xuICBjb25zdCBuYW1lID0gKGdsb2JhbFRoaXMgYXMgYW55KVtXT1JLRkxPV19HRVRfU1RSRUFNX0lEXShuYW1lc3BhY2UpO1xuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICB2YWx1ZTogbmFtZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbn1cbiIsICIvKiogQSBzcGVjaWFsIGNvbnN0YW50IHdpdGggdHlwZSBgbmV2ZXJgICovIGV4cG9ydCBjb25zdCBORVZFUiA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0YXR1czogXCJhYm9ydGVkXCJcbn0pO1xuZXhwb3J0IC8qQF9fTk9fU0lERV9FRkZFQ1RTX18qLyBmdW5jdGlvbiAkY29uc3RydWN0b3IobmFtZSwgaW5pdGlhbGl6ZXIsIHBhcmFtcykge1xuICAgIGZ1bmN0aW9uIGluaXQoaW5zdCwgZGVmKSB7XG4gICAgICAgIGlmICghaW5zdC5fem9kKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJfem9kXCIsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBkZWYsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cjogXyxcbiAgICAgICAgICAgICAgICAgICAgdHJhaXRzOiBuZXcgU2V0KClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5zdC5fem9kLnRyYWl0cy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0Ll96b2QudHJhaXRzLmFkZChuYW1lKTtcbiAgICAgICAgaW5pdGlhbGl6ZXIoaW5zdCwgZGVmKTtcbiAgICAgICAgLy8gc3VwcG9ydCBwcm90b3R5cGUgbW9kaWZpY2F0aW9uc1xuICAgICAgICBjb25zdCBwcm90byA9IF8ucHJvdG90eXBlO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvdG8pO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBrID0ga2V5c1tpXTtcbiAgICAgICAgICAgIGlmICghKGsgaW4gaW5zdCkpIHtcbiAgICAgICAgICAgICAgICBpbnN0W2tdID0gcHJvdG9ba10uYmluZChpbnN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkb2Vzbid0IHdvcmsgaWYgUGFyZW50IGhhcyBhIGNvbnN0cnVjdG9yIHdpdGggYXJndW1lbnRzXG4gICAgY29uc3QgUGFyZW50ID0gcGFyYW1zPy5QYXJlbnQgPz8gT2JqZWN0O1xuICAgIGNsYXNzIERlZmluaXRpb24gZXh0ZW5kcyBQYXJlbnQge1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVmaW5pdGlvbiwgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IG5hbWVcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBfKGRlZikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGluc3QgPSBwYXJhbXM/LlBhcmVudCA/IG5ldyBEZWZpbml0aW9uKCkgOiB0aGlzO1xuICAgICAgICBpbml0KGluc3QsIGRlZik7XG4gICAgICAgIChfYSA9IGluc3QuX3pvZCkuZGVmZXJyZWQgPz8gKF9hLmRlZmVycmVkID0gW10pO1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGluc3QuX3pvZC5kZWZlcnJlZCl7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgXCJpbml0XCIsIHtcbiAgICAgICAgdmFsdWU6IGluaXRcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgICAgIHZhbHVlOiAoaW5zdCk9PntcbiAgICAgICAgICAgIGlmIChwYXJhbXM/LlBhcmVudCAmJiBpbnN0IGluc3RhbmNlb2YgcGFyYW1zLlBhcmVudCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gaW5zdD8uX3pvZD8udHJhaXRzPy5oYXMobmFtZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IG5hbWVcbiAgICB9KTtcbiAgICByZXR1cm4gXztcbn1cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFVUSUxJVElFUyAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGNvbnN0ICRicmFuZCA9IFN5bWJvbChcInpvZF9icmFuZFwiKTtcbmV4cG9ydCBjbGFzcyAkWm9kQXN5bmNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcihgRW5jb3VudGVyZWQgUHJvbWlzZSBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2UuIFVzZSAucGFyc2VBc3luYygpIGluc3RlYWQuYCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzICRab2RFbmNvZGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKXtcbiAgICAgICAgc3VwZXIoYEVuY291bnRlcmVkIHVuaWRpcmVjdGlvbmFsIHRyYW5zZm9ybSBkdXJpbmcgZW5jb2RlOiAke25hbWV9YCk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWm9kRW5jb2RlRXJyb3JcIjtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZ2xvYmFsQ29uZmlnID0ge307XG5leHBvcnQgZnVuY3Rpb24gY29uZmlnKG5ld0NvbmZpZykge1xuICAgIGlmIChuZXdDb25maWcpIE9iamVjdC5hc3NpZ24oZ2xvYmFsQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIHJldHVybiBnbG9iYWxDb25maWc7XG59XG4iLCAiLy8gZnVuY3Rpb25zXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsKSB7XG4gICAgcmV0dXJuIHZhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3RFcXVhbCh2YWwpIHtcbiAgICByZXR1cm4gdmFsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzKF9hcmcpIHt9XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIoX3gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHZhbHVlIGluIGV4aGF1c3RpdmUgY2hlY2tcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KF8pIHt9XG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bVZhbHVlcyhlbnRyaWVzKSB7XG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlcyA9IE9iamVjdC52YWx1ZXMoZW50cmllcykuZmlsdGVyKCh2KT0+dHlwZW9mIHYgPT09IFwibnVtYmVyXCIpO1xuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZpbHRlcigoW2ssIF9dKT0+bnVtZXJpY1ZhbHVlcy5pbmRleE9mKCtrKSA9PT0gLTEpLm1hcCgoW18sIHZdKT0+dik7XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBqb2luVmFsdWVzKGFycmF5LCBzZXBhcmF0b3IgPSBcInxcIikge1xuICAgIHJldHVybiBhcnJheS5tYXAoKHZhbCk9PnN0cmluZ2lmeVByaW1pdGl2ZSh2YWwpKS5qb2luKHNlcGFyYXRvcik7XG59XG5leHBvcnQgZnVuY3Rpb24ganNvblN0cmluZ2lmeVJlcGxhY2VyKF8sIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlZChnZXR0ZXIpIHtcbiAgICBjb25zdCBzZXQgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgdmFsdWUgKCkge1xuICAgICAgICAgICAgaWYgKCFzZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldHRlcigpO1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInZhbHVlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWNoZWQgdmFsdWUgYWxyZWFkeSBzZXRcIik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bGxpc2goaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblJlZ2V4KHNvdXJjZSkge1xuICAgIGNvbnN0IHN0YXJ0ID0gc291cmNlLnN0YXJ0c1dpdGgoXCJeXCIpID8gMSA6IDA7XG4gICAgY29uc3QgZW5kID0gc291cmNlLmVuZHNXaXRoKFwiJFwiKSA/IHNvdXJjZS5sZW5ndGggLSAxIDogc291cmNlLmxlbmd0aDtcbiAgICByZXR1cm4gc291cmNlLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZsb2F0U2FmZVJlbWFpbmRlcih2YWwsIHN0ZXApIHtcbiAgICBjb25zdCB2YWxEZWNDb3VudCA9ICh2YWwudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoO1xuICAgIGNvbnN0IHN0ZXBTdHJpbmcgPSBzdGVwLnRvU3RyaW5nKCk7XG4gICAgbGV0IHN0ZXBEZWNDb3VudCA9IChzdGVwU3RyaW5nLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgaWYgKHN0ZXBEZWNDb3VudCA9PT0gMCAmJiAvXFxkP2UtXFxkPy8udGVzdChzdGVwU3RyaW5nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN0ZXBTdHJpbmcubWF0Y2goL1xcZD9lLShcXGQ/KS8pO1xuICAgICAgICBpZiAobWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgc3RlcERlY0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZWNDb3VudCA9IHZhbERlY0NvdW50ID4gc3RlcERlY0NvdW50ID8gdmFsRGVjQ291bnQgOiBzdGVwRGVjQ291bnQ7XG4gICAgY29uc3QgdmFsSW50ID0gTnVtYmVyLnBhcnNlSW50KHZhbC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgY29uc3Qgc3RlcEludCA9IE51bWJlci5wYXJzZUludChzdGVwLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICByZXR1cm4gdmFsSW50ICUgc3RlcEludCAvIDEwICoqIGRlY0NvdW50O1xufVxuY29uc3QgRVZBTFVBVElORyA9IFN5bWJvbChcImV2YWx1YXRpbmdcIik7XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lTGF6eShvYmplY3QsIGtleSwgZ2V0dGVyKSB7XG4gICAgbGV0IHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBFVkFMVUFUSU5HKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkLCByZXR1cm4gdW5kZWZpbmVkIHRvIGJyZWFrIHRoZSBjeWNsZVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gRVZBTFVBVElORztcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldHRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgKHYpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gb2JqZWN0W2tleV0gPSB2O1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RDbG9uZShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzaWduUHJvcCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVmcyguLi5kZWZzKSB7XG4gICAgY29uc3QgbWVyZ2VkRGVzY3JpcHRvcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKXtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhkZWYpO1xuICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlZERlc2NyaXB0b3JzLCBkZXNjcmlwdG9ycyk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSwgbWVyZ2VkRGVzY3JpcHRvcnMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lRGVmKHNjaGVtYSkge1xuICAgIHJldHVybiBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50QXRQYXRoKG9iaiwgcGF0aCkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIG9iajtcbiAgICByZXR1cm4gcGF0aC5yZWR1Y2UoKGFjYywga2V5KT0+YWNjPy5ba2V5XSwgb2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlQWxsT2JqZWN0KHByb21pc2VzT2JqKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb21pc2VzT2JqKTtcbiAgICBjb25zdCBwcm9taXNlcyA9IGtleXMubWFwKChrZXkpPT5wcm9taXNlc09ialtrZXldKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHJlc3VsdHMpPT57XG4gICAgICAgIGNvbnN0IHJlc29sdmVkT2JqID0ge307XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHJlc29sdmVkT2JqW2tleXNbaV1dID0gcmVzdWx0c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRPYmo7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nKGxlbmd0aCA9IDEwKSB7XG4gICAgY29uc3QgY2hhcnMgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXtcbiAgICAgICAgc3RyICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCldO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVzYyhzdHIpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3RyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzbHVnaWZ5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0LnRvTG93ZXJDYXNlKCkudHJpbSgpLnJlcGxhY2UoL1teXFx3XFxzLV0vZywgXCJcIikucmVwbGFjZSgvW1xcc18tXSsvZywgXCItXCIpLnJlcGxhY2UoL14tK3wtKyQvZywgXCJcIik7XG59XG5leHBvcnQgY29uc3QgY2FwdHVyZVN0YWNrVHJhY2UgPSBcImNhcHR1cmVTdGFja1RyYWNlXCIgaW4gRXJyb3IgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA6ICguLi5fYXJncyk9Pnt9O1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKTtcbn1cbmV4cG9ydCBjb25zdCBhbGxvd3NFdmFsID0gY2FjaGVkKCgpPT57XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvcj8udXNlckFnZW50Py5pbmNsdWRlcyhcIkNsb3VkZmxhcmVcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBGID0gRnVuY3Rpb247XG4gICAgICAgIG5ldyBGKFwiXCIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG8pIHtcbiAgICBpZiAoaXNPYmplY3QobykgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gbW9kaWZpZWQgY29uc3RydWN0b3JcbiAgICBjb25zdCBjdG9yID0gby5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoY3RvciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN0b3IgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG4gICAgLy8gbW9kaWZpZWQgcHJvdG90eXBlXG4gICAgY29uc3QgcHJvdCA9IGN0b3IucHJvdG90eXBlO1xuICAgIGlmIChpc09iamVjdChwcm90KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAvLyBjdG9yIGRvZXNuJ3QgaGF2ZSBzdGF0aWMgYGlzUHJvdG90eXBlT2ZgXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90LCBcImlzUHJvdG90eXBlT2ZcIikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0Nsb25lKG8pIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChvKSkgcmV0dXJuIHtcbiAgICAgICAgLi4ub1xuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBbXG4gICAgICAgIC4uLm9cbiAgICBdO1xuICAgIHJldHVybiBvO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bUtleXMoZGF0YSkge1xuICAgIGxldCBrZXlDb3VudCA9IDA7XG4gICAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKXtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlDb3VudDtcbn1cbmV4cG9ydCBjb25zdCBnZXRQYXJzZWRUeXBlID0gKGRhdGEpPT57XG4gICAgY29uc3QgdCA9IHR5cGVvZiBkYXRhO1xuICAgIHN3aXRjaCh0KXtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGEpID8gXCJuYW5cIiA6IFwibnVtYmVyXCI7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIjtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN5bWJvbFwiO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImFycmF5XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnRoZW4gJiYgdHlwZW9mIGRhdGEudGhlbiA9PT0gXCJmdW5jdGlvblwiICYmIGRhdGEuY2F0Y2ggJiYgdHlwZW9mIGRhdGEuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBcInByb21pc2VcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJtYXBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgU2V0ICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzZXRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImRhdGVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImZpbGVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIm9iamVjdFwiO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZTogJHt0fWApO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcHJvcGVydHlLZXlUeXBlcyA9IG5ldyBTZXQoW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcInN5bWJvbFwiXG5dKTtcbmV4cG9ydCBjb25zdCBwcmltaXRpdmVUeXBlcyA9IG5ldyBTZXQoW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcImJpZ2ludFwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwic3ltYm9sXCIsXG4gICAgXCJ1bmRlZmluZWRcIlxuXSk7XG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnZXgoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG59XG4vLyB6b2Qtc3BlY2lmaWMgdXRpbHNcbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShpbnN0LCBkZWYsIHBhcmFtcykge1xuICAgIGNvbnN0IGNsID0gbmV3IGluc3QuX3pvZC5jb25zdHIoZGVmID8/IGluc3QuX3pvZC5kZWYpO1xuICAgIGlmICghZGVmIHx8IHBhcmFtcz8ucGFyZW50KSBjbC5fem9kLnBhcmVudCA9IGluc3Q7XG4gICAgcmV0dXJuIGNsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKSB7XG4gICAgY29uc3QgcGFyYW1zID0gX3BhcmFtcztcbiAgICBpZiAoIXBhcmFtcykgcmV0dXJuIHt9O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInN0cmluZ1wiKSByZXR1cm4ge1xuICAgICAgICBlcnJvcjogKCk9PnBhcmFtc1xuICAgIH07XG4gICAgaWYgKHBhcmFtcz8ubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChwYXJhbXM/LmVycm9yICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGJvdGggYG1lc3NhZ2VgIGFuZCBgZXJyb3JgIHBhcmFtc1wiKTtcbiAgICAgICAgcGFyYW1zLmVycm9yID0gcGFyYW1zLm1lc3NhZ2U7XG4gICAgfVxuICAgIGRlbGV0ZSBwYXJhbXMubWVzc2FnZTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5lcnJvciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBlcnJvcjogKCk9PnBhcmFtcy5lcnJvclxuICAgIH07XG4gICAgcmV0dXJuIHBhcmFtcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFuc3BhcmVudFByb3h5KGdldHRlcikge1xuICAgIGxldCB0YXJnZXQ7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICBnZXQgKF8sIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IChfLCBwcm9wLCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzIChfLCBwcm9wKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBkZWxldGVQcm9wZXJ0eSAoXywgcHJvcCkge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBvd25LZXlzIChfKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIChfLCBwcm9wKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBkZWZpbmVQcm9wZXJ0eSAoXywgcHJvcCwgZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5UHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkgKyBcIm5cIjtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxLZXlzKHNoYXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNoYXBlKS5maWx0ZXIoKGspPT57XG4gICAgICAgIHJldHVybiBzaGFwZVtrXS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIgJiYgc2hhcGVba10uX3pvZC5vcHRvdXQgPT09IFwib3B0aW9uYWxcIjtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBOVU1CRVJfRk9STUFUX1JBTkdFUyA9IHtcbiAgICBzYWZlaW50OiBbXG4gICAgICAgIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgIF0sXG4gICAgaW50MzI6IFtcbiAgICAgICAgLTIxNDc0ODM2NDgsXG4gICAgICAgIDIxNDc0ODM2NDdcbiAgICBdLFxuICAgIHVpbnQzMjogW1xuICAgICAgICAwLFxuICAgICAgICA0Mjk0OTY3Mjk1XG4gICAgXSxcbiAgICBmbG9hdDMyOiBbXG4gICAgICAgIC0zLjQwMjgyMzQ2NjM4NTI4ODZlMzgsXG4gICAgICAgIDMuNDAyODIzNDY2Mzg1Mjg4NmUzOFxuICAgIF0sXG4gICAgZmxvYXQ2NDogW1xuICAgICAgICAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgTnVtYmVyLk1BWF9WQUxVRVxuICAgIF1cbn07XG5leHBvcnQgY29uc3QgQklHSU5UX0ZPUk1BVF9SQU5HRVMgPSB7XG4gICAgaW50NjQ6IFtcbiAgICAgICAgLyogQF9fUFVSRV9fKi8gQmlnSW50KFwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiksXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludChcIjkyMjMzNzIwMzY4NTQ3NzU4MDdcIilcbiAgICBdLFxuICAgIHVpbnQ2NDogW1xuICAgICAgICAvKiBAX19QVVJFX18qLyBCaWdJbnQoMCksXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludChcIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XCIpXG4gICAgXVxufTtcbmV4cG9ydCBmdW5jdGlvbiBwaWNrKHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGN1cnJEZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgY2hlY2tzID0gY3VyckRlZi5jaGVja3M7XG4gICAgY29uc3QgaGFzQ2hlY2tzID0gY2hlY2tzICYmIGNoZWNrcy5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNDaGVja3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiLnBpY2soKSBjYW5ub3QgYmUgdXNlZCBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzXCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBtYXNrKXtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gY3VyckRlZi5zaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gY3VyckRlZi5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIG5ld1NoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gbmV3U2hhcGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrczogW11cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoc2NoZW1hLCBkZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9taXQoc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgY3VyckRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCBjaGVja3MgPSBjdXJyRGVmLmNoZWNrcztcbiAgICBjb25zdCBoYXNDaGVja3MgPSBjaGVja3MgJiYgY2hlY2tzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc0NoZWNrcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIub21pdCgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHNcIik7XG4gICAgfVxuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge1xuICAgICAgICAgICAgICAgIC4uLnNjaGVtYS5fem9kLmRlZi5zaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIGN1cnJEZWYuc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hc2tba2V5XSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1NoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgbmV3U2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBuZXdTaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHNjaGVtYSwgc2hhcGUpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qoc2hhcGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgdG8gZXh0ZW5kOiBleHBlY3RlZCBhIHBsYWluIG9iamVjdFwiKTtcbiAgICB9XG4gICAgY29uc3QgY2hlY2tzID0gc2NoZW1hLl96b2QuZGVmLmNoZWNrcztcbiAgICBjb25zdCBoYXNDaGVja3MgPSBjaGVja3MgJiYgY2hlY2tzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc0NoZWNrcykge1xuICAgICAgICAvLyBPbmx5IHRocm93IGlmIG5ldyBzaGFwZSBvdmVybGFwcyB3aXRoIGV4aXN0aW5nIHNoYXBlXG4gICAgICAgIC8vIFVzZSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgdG8gY2hlY2sga2V5IGV4aXN0ZW5jZSB3aXRob3V0IGFjY2Vzc2luZyB2YWx1ZXNcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTaGFwZSA9IHNjaGVtYS5fem9kLmRlZi5zaGFwZTtcbiAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBzaGFwZSl7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihleGlzdGluZ1NoYXBlLCBrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgb3ZlcndyaXRlIGtleXMgb24gb2JqZWN0IHNjaGVtYXMgY29udGFpbmluZyByZWZpbmVtZW50cy4gVXNlIGAuc2FmZUV4dGVuZCgpYCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLnNoYXBlLFxuICAgICAgICAgICAgICAgIC4uLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2FmZUV4dGVuZChzY2hlbWEsIHNoYXBlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHNoYXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHRvIHNhZmVFeHRlbmQ6IGV4cGVjdGVkIGEgcGxhaW4gb2JqZWN0XCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLnNoYXBlLFxuICAgICAgICAgICAgICAgIC4uLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UoYSwgYikge1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhhLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uYS5fem9kLmRlZi5zaGFwZSxcbiAgICAgICAgICAgICAgICAuLi5iLl96b2QuZGVmLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGNhdGNoYWxsICgpIHtcbiAgICAgICAgICAgIHJldHVybiBiLl96b2QuZGVmLmNhdGNoYWxsO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKGEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbChDbGFzcywgc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgY3VyckRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCBjaGVja3MgPSBjdXJyRGVmLmNoZWNrcztcbiAgICBjb25zdCBoYXNDaGVja3MgPSBjaGVja3MgJiYgY2hlY2tzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc0NoZWNrcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIucGFydGlhbCgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHNcIik7XG4gICAgfVxuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNoYXBlID0gc2NoZW1hLl96b2QuZGVmLnNoYXBlO1xuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4ub2xkU2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobWFzaykge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBvbGRTaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9sZFNoYXBlW2tleV0hLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBDbGFzcyA/IG5ldyBDbGFzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm9wdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lclR5cGU6IG9sZFNoYXBlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSkgOiBvbGRTaGFwZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBvbGRTaGFwZSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChvbGRTaGFwZVtrZXldIS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gQ2xhc3MgPyBuZXcgQ2xhc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJvcHRpb25hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlOiBvbGRTaGFwZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH0pIDogb2xkU2hhcGVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgc2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQoQ2xhc3MsIHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNoYXBlID0gc2NoZW1hLl96b2QuZGVmLnNoYXBlO1xuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4ub2xkU2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobWFzaykge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBzaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHdpdGggbm9uLW9wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBuZXcgQ2xhc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJub25vcHRpb25hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlOiBvbGRTaGFwZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBvbGRTaGFwZSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0ZSB3aXRoIG5vbi1vcHRpb25hbFxuICAgICAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gbmV3IENsYXNzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHlwZTogb2xkU2hhcGVba2V5XVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgc2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG4vLyBpbnZhbGlkX3R5cGUgfCB0b29fYmlnIHwgdG9vX3NtYWxsIHwgaW52YWxpZF9mb3JtYXQgfCBub3RfbXVsdGlwbGVfb2YgfCB1bnJlY29nbml6ZWRfa2V5cyB8IGludmFsaWRfdW5pb24gfCBpbnZhbGlkX2tleSB8IGludmFsaWRfZWxlbWVudCB8IGludmFsaWRfdmFsdWUgfCBjdXN0b21cbmV4cG9ydCBmdW5jdGlvbiBhYm9ydGVkKHgsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgaWYgKHguYWJvcnRlZCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgZm9yKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IHguaXNzdWVzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgaWYgKHguaXNzdWVzW2ldPy5jb250aW51ZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeElzc3VlcyhwYXRoLCBpc3N1ZXMpIHtcbiAgICByZXR1cm4gaXNzdWVzLm1hcCgoaXNzKT0+e1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGlzcykucGF0aCA/PyAoX2EucGF0aCA9IFtdKTtcbiAgICAgICAgaXNzLnBhdGgudW5zaGlmdChwYXRoKTtcbiAgICAgICAgcmV0dXJuIGlzcztcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogbWVzc2FnZT8ubWVzc2FnZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb25maWcpIHtcbiAgICBjb25zdCBmdWxsID0ge1xuICAgICAgICAuLi5pc3MsXG4gICAgICAgIHBhdGg6IGlzcy5wYXRoID8/IFtdXG4gICAgfTtcbiAgICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAoIWlzcy5tZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB1bndyYXBNZXNzYWdlKGlzcy5pbnN0Py5fem9kLmRlZj8uZXJyb3I/Lihpc3MpKSA/PyB1bndyYXBNZXNzYWdlKGN0eD8uZXJyb3I/Lihpc3MpKSA/PyB1bndyYXBNZXNzYWdlKGNvbmZpZy5jdXN0b21FcnJvcj8uKGlzcykpID8/IHVud3JhcE1lc3NhZ2UoY29uZmlnLmxvY2FsZUVycm9yPy4oaXNzKSkgPz8gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICAgIGZ1bGwubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuICAgIC8vIGRlbGV0ZSAoZnVsbCBhcyBhbnkpLmRlZjtcbiAgICBkZWxldGUgZnVsbC5pbnN0O1xuICAgIGRlbGV0ZSBmdWxsLmNvbnRpbnVlO1xuICAgIGlmICghY3R4Py5yZXBvcnRJbnB1dCkge1xuICAgICAgICBkZWxldGUgZnVsbC5pbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2l6YWJsZU9yaWdpbihpbnB1dCkge1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIFwic2V0XCI7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTWFwKSByZXR1cm4gXCJtYXBcIjtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZSkgcmV0dXJuIFwiZmlsZVwiO1xuICAgIHJldHVybiBcInVua25vd25cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSByZXR1cm4gXCJhcnJheVwiO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInN0cmluZ1wiO1xuICAgIHJldHVybiBcInVua25vd25cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZWRUeXBlKGRhdGEpIHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7XG4gICAgc3dpdGNoKHQpe1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihkYXRhKSA/IFwibmFuXCIgOiBcIm51bWJlclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBkYXRhO1xuICAgICAgICAgICAgICAgIGlmIChvYmogJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgXCJjb25zdHJ1Y3RvclwiIGluIG9iaiAmJiBvYmouY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNzdWUoLi4uYXJncykge1xuICAgIGNvbnN0IFtpc3MsIGlucHV0LCBpbnN0XSA9IGFyZ3M7XG4gICAgaWYgKHR5cGVvZiBpc3MgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGlzcyxcbiAgICAgICAgICAgIGNvZGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXNzXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkVudW0ob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChbaywgX10pPT57XG4gICAgICAgIC8vIHJldHVybiB0cnVlIGlmIE5hTiwgbWVhbmluZyBpdCdzIG5vdCBhIG51bWJlciwgdGh1cyBhIHN0cmluZyBrZXlcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQoaywgMTApKTtcbiAgICB9KS5tYXAoKGVsKT0+ZWxbMV0pO1xufVxuLy8gQ29kZWMgdXRpbGl0eSBmdW5jdGlvbnNcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0KSB7XG4gICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyaW5nLmxlbmd0aCk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGJpbmFyeVN0cmluZy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGJ5dGVzW2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50OEFycmF5VG9CYXNlNjQoYnl0ZXMpIHtcbiAgICBsZXQgYmluYXJ5U3RyaW5nID0gXCJcIjtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICBiaW5hcnlTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBidG9hKGJpbmFyeVN0cmluZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0dXJsVG9VaW50OEFycmF5KGJhc2U2NHVybCkge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJhc2U2NHVybC5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKTtcbiAgICBjb25zdCBwYWRkaW5nID0gXCI9XCIucmVwZWF0KCg0IC0gYmFzZTY0Lmxlbmd0aCAlIDQpICUgNCk7XG4gICAgcmV0dXJuIGJhc2U2NFRvVWludDhBcnJheShiYXNlNjQgKyBwYWRkaW5nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50OEFycmF5VG9CYXNlNjR1cmwoYnl0ZXMpIHtcbiAgICByZXR1cm4gdWludDhBcnJheVRvQmFzZTY0KGJ5dGVzKS5yZXBsYWNlKC9cXCsvZywgXCItXCIpLnJlcGxhY2UoL1xcLy9nLCBcIl9cIikucmVwbGFjZSgvPS9nLCBcIlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoZXhUb1VpbnQ4QXJyYXkoaGV4KSB7XG4gICAgY29uc3QgY2xlYW5IZXggPSBoZXgucmVwbGFjZSgvXjB4LywgXCJcIik7XG4gICAgaWYgKGNsZWFuSGV4Lmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoZXggc3RyaW5nIGxlbmd0aFwiKTtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjbGVhbkhleC5sZW5ndGggLyAyKTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgY2xlYW5IZXgubGVuZ3RoOyBpICs9IDIpe1xuICAgICAgICBieXRlc1tpIC8gMl0gPSBOdW1iZXIucGFyc2VJbnQoY2xlYW5IZXguc2xpY2UoaSwgaSArIDIpLCAxNik7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50OEFycmF5VG9IZXgoYnl0ZXMpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShieXRlcykubWFwKChiKT0+Yi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpO1xufVxuLy8gaW5zdGFuY2VvZlxuZXhwb3J0IGNsYXNzIENsYXNzIHtcbiAgICBjb25zdHJ1Y3RvciguLi5fYXJncyl7fVxufVxuIiwgImltcG9ydCB7ICRjb25zdHJ1Y3RvciB9IGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuY29uc3QgaW5pdGlhbGl6ZXIgPSAoaW5zdCwgZGVmKT0+e1xuICAgIGluc3QubmFtZSA9IFwiJFpvZEVycm9yXCI7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiX3pvZFwiLCB7XG4gICAgICAgIHZhbHVlOiBpbnN0Ll96b2QsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiaXNzdWVzXCIsIHtcbiAgICAgICAgdmFsdWU6IGRlZixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICBpbnN0Lm1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShkZWYsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJ0b1N0cmluZ1wiLCB7XG4gICAgICAgIHZhbHVlOiAoKT0+aW5zdC5tZXNzYWdlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCAkWm9kRXJyb3IgPSAkY29uc3RydWN0b3IoXCIkWm9kRXJyb3JcIiwgaW5pdGlhbGl6ZXIpO1xuZXhwb3J0IGNvbnN0ICRab2RSZWFsRXJyb3IgPSAkY29uc3RydWN0b3IoXCIkWm9kRXJyb3JcIiwgaW5pdGlhbGl6ZXIsIHtcbiAgICBQYXJlbnQ6IEVycm9yXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuRXJyb3IoZXJyb3IsIG1hcHBlciA9IChpc3N1ZSk9Pmlzc3VlLm1lc3NhZ2UpIHtcbiAgICBjb25zdCBmaWVsZEVycm9ycyA9IHt9O1xuICAgIGNvbnN0IGZvcm1FcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICBpZiAoc3ViLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dID0gZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dIHx8IFtdO1xuICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybUVycm9ycy5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtRXJyb3JzLFxuICAgICAgICBmaWVsZEVycm9yc1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyb3IsIG1hcHBlciA9IChpc3N1ZSk9Pmlzc3VlLm1lc3NhZ2UpIHtcbiAgICBjb25zdCBmaWVsZEVycm9ycyA9IHtcbiAgICAgICAgX2Vycm9yczogW11cbiAgICB9O1xuICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IChlcnJvcik9PntcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiICYmIGlzc3VlLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpc3N1ZS5lcnJvcnMubWFwKChpc3N1ZXMpPT5wcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2tleVwiKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBpc3N1ZS5pc3N1ZXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2VsZW1lbnRcIikge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogaXNzdWUuaXNzdWVzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLnBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnMuX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgY3VyciA9IGZpZWxkRXJyb3JzO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZShpIDwgaXNzdWUucGF0aC5sZW5ndGgpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGlzc3VlLnBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gaXNzdWUucGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXJyb3JzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lcnJvcnM6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0uX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcHJvY2Vzc0Vycm9yKGVycm9yKTtcbiAgICByZXR1cm4gZmllbGRFcnJvcnM7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJlZWlmeUVycm9yKGVycm9yLCBtYXBwZXIgPSAoaXNzdWUpPT5pc3N1ZS5tZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBlcnJvcnM6IFtdXG4gICAgfTtcbiAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSAoZXJyb3IsIHBhdGggPSBbXSk9PntcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiICYmIGlzc3VlLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyByZWd1bGFyIHVuaW9uIGVycm9yXG4gICAgICAgICAgICAgICAgaXNzdWUuZXJyb3JzLm1hcCgoaXNzdWVzKT0+cHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9LCBpc3N1ZS5wYXRoKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9rZXlcIikge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogaXNzdWUuaXNzdWVzXG4gICAgICAgICAgICAgICAgfSwgaXNzdWUucGF0aCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9lbGVtZW50XCIpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGlzc3VlLmlzc3Vlc1xuICAgICAgICAgICAgICAgIH0sIGlzc3VlLnBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmdWxscGF0aCA9IFtcbiAgICAgICAgICAgICAgICAgICAgLi4ucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgLi4uaXNzdWUucGF0aFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKGZ1bGxwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY3VyciA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUoaSA8IGZ1bGxwYXRoLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZnVsbHBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gZnVsbHBhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyci5wcm9wZXJ0aWVzID8/IChjdXJyLnByb3BlcnRpZXMgPSB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoX2EgPSBjdXJyLnByb3BlcnRpZXMpW2VsXSA/PyAoX2FbZWxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnIucHJvcGVydGllc1tlbF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyLml0ZW1zID8/IChjdXJyLml0ZW1zID0gW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgKF9iID0gY3Vyci5pdGVtcylbZWxdID8/IChfYltlbF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5pdGVtc1tlbF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyLmVycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKiBGb3JtYXQgYSBab2RFcnJvciBhcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBpbiB0aGUgZm9sbG93aW5nIGZvcm0uXG4gKlxuICogRnJvbVxuICpcbiAqIGBgYHRzXG4gKiBab2RFcnJvciB7XG4gKiAgIGlzc3VlczogW1xuICogICAgIHtcbiAqICAgICAgIGV4cGVjdGVkOiAnc3RyaW5nJyxcbiAqICAgICAgIGNvZGU6ICdpbnZhbGlkX3R5cGUnLFxuICogICAgICAgcGF0aDogWyAndXNlcm5hbWUnIF0sXG4gKiAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgc3RyaW5nJ1xuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgZXhwZWN0ZWQ6ICdudW1iZXInLFxuICogICAgICAgY29kZTogJ2ludmFsaWRfdHlwZScsXG4gKiAgICAgICBwYXRoOiBbICdmYXZvcml0ZU51bWJlcnMnLCAxIF0sXG4gKiAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgbnVtYmVyJ1xuICogICAgIH1cbiAqICAgXTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIHRvXG4gKlxuICogYGBgXG4gKiB1c2VybmFtZVxuICogICBcdTI3MTYgRXhwZWN0ZWQgbnVtYmVyLCByZWNlaXZlZCBzdHJpbmcgYXQgXCJ1c2VybmFtZVxuICogZmF2b3JpdGVOdW1iZXJzWzBdXG4gKiAgIFx1MjcxNiBJbnZhbGlkIGlucHV0OiBleHBlY3RlZCBudW1iZXJcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiB0b0RvdFBhdGgoX3BhdGgpIHtcbiAgICBjb25zdCBzZWdzID0gW107XG4gICAgY29uc3QgcGF0aCA9IF9wYXRoLm1hcCgoc2VnKT0+dHlwZW9mIHNlZyA9PT0gXCJvYmplY3RcIiA/IHNlZy5rZXkgOiBzZWcpO1xuICAgIGZvciAoY29uc3Qgc2VnIG9mIHBhdGgpe1xuICAgICAgICBpZiAodHlwZW9mIHNlZyA9PT0gXCJudW1iZXJcIikgc2Vncy5wdXNoKGBbJHtzZWd9XWApO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2VnID09PSBcInN5bWJvbFwiKSBzZWdzLnB1c2goYFske0pTT04uc3RyaW5naWZ5KFN0cmluZyhzZWcpKX1dYCk7XG4gICAgICAgIGVsc2UgaWYgKC9bXlxcdyRdLy50ZXN0KHNlZykpIHNlZ3MucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoc2VnKX1dYCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNlZ3MubGVuZ3RoKSBzZWdzLnB1c2goXCIuXCIpO1xuICAgICAgICAgICAgc2Vncy5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlZ3Muam9pbihcIlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcmV0dGlmeUVycm9yKGVycm9yKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAvLyBzb3J0IGJ5IHBhdGggbGVuZ3RoXG4gICAgY29uc3QgaXNzdWVzID0gW1xuICAgICAgICAuLi5lcnJvci5pc3N1ZXNcbiAgICBdLnNvcnQoKGEsIGIpPT4oYS5wYXRoID8/IFtdKS5sZW5ndGggLSAoYi5wYXRoID8/IFtdKS5sZW5ndGgpO1xuICAgIC8vIFByb2Nlc3MgZWFjaCBpc3N1ZVxuICAgIGZvciAoY29uc3QgaXNzdWUgb2YgaXNzdWVzKXtcbiAgICAgICAgbGluZXMucHVzaChgXHUyNzE2ICR7aXNzdWUubWVzc2FnZX1gKTtcbiAgICAgICAgaWYgKGlzc3VlLnBhdGg/Lmxlbmd0aCkgbGluZXMucHVzaChgICBcdTIxOTIgYXQgJHt0b0RvdFBhdGgoaXNzdWUucGF0aCl9YCk7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgTWFwIHRvIGZvcm1hdHRlZCBzdHJpbmdcbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn1cbiIsICJpbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuZXhwb3J0IGNvbnN0IF9wYXJzZSA9IChfRXJyKT0+KHNjaGVtYSwgdmFsdWUsIF9jdHgsIF9wYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyAoX3BhcmFtcz8uRXJyID8/IF9FcnIpKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSk7XG4gICAgICAgICAgICB1dGlsLmNhcHR1cmVTdGFja1RyYWNlKGUsIF9wYXJhbXM/LmNhbGxlZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBwYXJzZSA9IC8qIEBfX1BVUkVfXyovIF9wYXJzZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3BhcnNlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4LCBwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IChwYXJhbXM/LkVyciA/PyBfRXJyKShyZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSkpO1xuICAgICAgICAgICAgdXRpbC5jYXB0dXJlU3RhY2tUcmFjZShlLCBwYXJhbXM/LmNhbGxlZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBwYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3BhcnNlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlUGFyc2UgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8ge1xuICAgICAgICAgICAgLi4uX2N0eCxcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc3N1ZXMubGVuZ3RoID8ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbmV3IChfRXJyID8/IGVycm9ycy4kWm9kRXJyb3IpKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSlcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiByZXN1bHQudmFsdWVcbiAgICAgICAgfTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVQYXJzZSA9IC8qIEBfX1BVUkVfXyovIF9zYWZlUGFyc2UoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlUGFyc2VBc3luYyA9IChfRXJyKT0+YXN5bmMgKHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc3N1ZXMubGVuZ3RoID8ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbmV3IF9FcnIocmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IHJlc3VsdC52YWx1ZVxuICAgICAgICB9O1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18qLyBfc2FmZVBhcnNlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9lbmNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfcGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IC8qIEBfX1BVUkVfXyovIF9lbmNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9kZWNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3BhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3QgZGVjb2RlID0gLyogQF9fUFVSRV9fKi8gX2RlY29kZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX2VuY29kZUFzeW5jID0gKF9FcnIpPT5hc3luYyAoc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3BhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGVuY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX2VuY29kZUFzeW5jKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfZGVjb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3BhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBkZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9kZWNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3NhZmVFbmNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIGN0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRW5jb2RlID0gLyogQF9fUFVSRV9fKi8gX3NhZmVFbmNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRGVjb2RlID0gKF9FcnIpPT4oc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgcmV0dXJuIF9zYWZlUGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlID0gLyogQF9fUFVSRV9fKi8gX3NhZmVEZWNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRW5jb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9zYWZlRW5jb2RlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRGVjb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3NhZmVQYXJzZUFzeW5jKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZURlY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3NhZmVEZWNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG4iLCAiaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi91dGlsLmpzXCI7XG5leHBvcnQgY29uc3QgY3VpZCA9IC9eW2NDXVteXFxzLV17OCx9JC87XG5leHBvcnQgY29uc3QgY3VpZDIgPSAvXlswLTlhLXpdKyQvO1xuZXhwb3J0IGNvbnN0IHVsaWQgPSAvXlswLTlBLUhKS01OUC1UVi1aYS1oamttbnAtdHYtel17MjZ9JC87XG5leHBvcnQgY29uc3QgeGlkID0gL15bMC05YS12QS1WXXsyMH0kLztcbmV4cG9ydCBjb25zdCBrc3VpZCA9IC9eW0EtWmEtejAtOV17Mjd9JC87XG5leHBvcnQgY29uc3QgbmFub2lkID0gL15bYS16QS1aMC05Xy1dezIxfSQvO1xuLyoqIElTTyA4NjAxLTEgZHVyYXRpb24gcmVnZXguIERvZXMgbm90IHN1cHBvcnQgdGhlIDg2MDEtMiBleHRlbnNpb25zIGxpa2UgbmVnYXRpdmUgZHVyYXRpb25zIG9yIGZyYWN0aW9uYWwvbmVnYXRpdmUgY29tcG9uZW50cy4gKi8gZXhwb3J0IGNvbnN0IGR1cmF0aW9uID0gL15QKD86KFxcZCtXKXwoPyEuKlcpKD89XFxkfFRcXGQpKFxcZCtZKT8oXFxkK00pPyhcXGQrRCk/KFQoPz1cXGQpKFxcZCtIKT8oXFxkK00pPyhcXGQrKFsuLF1cXGQrKT9TKT8pPykkLztcbi8qKiBJbXBsZW1lbnRzIElTTyA4NjAxLTIgZXh0ZW5zaW9ucyBsaWtlIGV4cGxpY2l0ICstIHByZWZpeGVzLCBtaXhpbmcgd2Vla3Mgd2l0aCBvdGhlciB1bml0cywgYW5kIGZyYWN0aW9uYWwvbmVnYXRpdmUgY29tcG9uZW50cy4gKi8gZXhwb3J0IGNvbnN0IGV4dGVuZGVkRHVyYXRpb24gPSAvXlstK10/UCg/ISQpKD86KD86Wy0rXT9cXGQrWSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtZJCkpPyg/Oig/OlstK10/XFxkK00pfCg/OlstK10/XFxkK1suLF1cXGQrTSQpKT8oPzooPzpbLStdP1xcZCtXKXwoPzpbLStdP1xcZCtbLixdXFxkK1ckKSk/KD86KD86Wy0rXT9cXGQrRCl8KD86Wy0rXT9cXGQrWy4sXVxcZCtEJCkpPyg/OlQoPz1bXFxkKy1dKSg/Oig/OlstK10/XFxkK0gpfCg/OlstK10/XFxkK1suLF1cXGQrSCQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86Wy0rXT9cXGQrKD86Wy4sXVxcZCspP1MpPyk/PyQvO1xuLyoqIEEgcmVnZXggZm9yIGFueSBVVUlELWxpa2UgaWRlbnRpZmllcjogOC00LTQtNC0xMiBoZXggcGF0dGVybiAqLyBleHBvcnQgY29uc3QgZ3VpZCA9IC9eKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSkkLztcbi8qKiBSZXR1cm5zIGEgcmVnZXggZm9yIHZhbGlkYXRpbmcgYW4gUkZDIDk1NjIvNDEyMiBVVUlELlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIE9wdGlvbmFsbHkgc3BlY2lmeSBhIHZlcnNpb24gMS04LiBJZiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZCwgYWxsIHZlcnNpb25zIGFyZSBzdXBwb3J0ZWQuICovIGV4cG9ydCBjb25zdCB1dWlkID0gKHZlcnNpb24pPT57XG4gICAgaWYgKCF2ZXJzaW9uKSByZXR1cm4gL14oWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzEtOF1bMC05YS1mQS1GXXszfS1bODlhYkFCXVswLTlhLWZBLUZdezN9LVswLTlhLWZBLUZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmKSQvO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LSR7dmVyc2lvbn1bMC05YS1mQS1GXXszfS1bODlhYkFCXVswLTlhLWZBLUZdezN9LVswLTlhLWZBLUZdezEyfSkkYCk7XG59O1xuZXhwb3J0IGNvbnN0IHV1aWQ0ID0gLypAX19QVVJFX18qLyB1dWlkKDQpO1xuZXhwb3J0IGNvbnN0IHV1aWQ2ID0gLypAX19QVVJFX18qLyB1dWlkKDYpO1xuZXhwb3J0IGNvbnN0IHV1aWQ3ID0gLypAX19QVVJFX18qLyB1dWlkKDcpO1xuLyoqIFByYWN0aWNhbCBlbWFpbCB2YWxpZGF0aW9uICovIGV4cG9ydCBjb25zdCBlbWFpbCA9IC9eKD8hXFwuKSg/IS4qXFwuXFwuKShbQS1aYS16MC05XycrXFwtXFwuXSopW0EtWmEtejAtOV8rLV1AKFtBLVphLXowLTldW0EtWmEtejAtOVxcLV0qXFwuKStbQS1aYS16XXsyLH0kLztcbi8qKiBFcXVpdmFsZW50IHRvIHRoZSBIVE1MNSBpbnB1dFt0eXBlPWVtYWlsXSB2YWxpZGF0aW9uIGltcGxlbWVudGVkIGJ5IGJyb3dzZXJzLiBTb3VyY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9lbWFpbCAqLyBleHBvcnQgY29uc3QgaHRtbDVFbWFpbCA9IC9eW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSokLztcbi8qKiBUaGUgY2xhc3NpYyBlbWFpbHJlZ2V4LmNvbSByZWdleCBmb3IgUkZDIDUzMjItY29tcGxpYW50IGVtYWlscyAqLyBleHBvcnQgY29uc3QgcmZjNTMyMkVtYWlsID0gL14oKFtePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC87XG4vKiogQSBsb29zZSByZWdleCB0aGF0IGFsbG93cyBVbmljb2RlIGNoYXJhY3RlcnMsIGVuZm9yY2VzIGxlbmd0aCBsaW1pdHMsIGFuZCB0aGF0J3MgYWJvdXQgaXQuICovIGV4cG9ydCBjb25zdCB1bmljb2RlRW1haWwgPSAvXlteXFxzQFwiXXsxLDY0fUBbXlxcc0BdezEsMjU1fSQvdTtcbmV4cG9ydCBjb25zdCBpZG5FbWFpbCA9IHVuaWNvZGVFbWFpbDtcbmV4cG9ydCBjb25zdCBicm93c2VyRW1haWwgPSAvXlthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC87XG4vLyBmcm9tIGh0dHBzOi8vdGhla2V2aW5zY290dC5jb20vZW1vamlzLWluLWphdmFzY3JpcHQvI3dyaXRpbmctYS1yZWd1bGFyLWV4cHJlc3Npb25cbmNvbnN0IF9lbW9qaSA9IGBeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7XG5leHBvcnQgZnVuY3Rpb24gZW1vamkoKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoX2Vtb2ppLCBcInVcIik7XG59XG5leHBvcnQgY29uc3QgaXB2NCA9IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC87XG5leHBvcnQgY29uc3QgaXB2NiA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318OikpJC87XG5leHBvcnQgY29uc3QgbWFjID0gKGRlbGltaXRlcik9PntcbiAgICBjb25zdCBlc2NhcGVkRGVsaW0gPSB1dGlsLmVzY2FwZVJlZ2V4KGRlbGltaXRlciA/PyBcIjpcIik7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4oPzpbMC05QS1GXXsyfSR7ZXNjYXBlZERlbGltfSl7NX1bMC05QS1GXXsyfSR8Xig/OlswLTlhLWZdezJ9JHtlc2NhcGVkRGVsaW19KXs1fVswLTlhLWZdezJ9JGApO1xufTtcbmV4cG9ydCBjb25zdCBjaWRydjQgPSAvXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLyhbMC05XXxbMS0yXVswLTldfDNbMC0yXSkkLztcbmV4cG9ydCBjb25zdCBjaWRydjYgPSAvXigoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXw6OnwoWzAtOWEtZkEtRl17MSw0fSk/OjooWzAtOWEtZkEtRl17MSw0fTo/KXswLDZ9KVxcLygxMlswLThdfDFbMDFdWzAtOV18WzEtOV0/WzAtOV0pJC87XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83ODYwMzkyL2RldGVybWluZS1pZi1zdHJpbmctaXMtaW4tYmFzZTY0LXVzaW5nLWphdmFzY3JpcHRcbmV4cG9ydCBjb25zdCBiYXNlNjQgPSAvXiR8Xig/OlswLTlhLXpBLVorL117NH0pKig/Oig/OlswLTlhLXpBLVorL117Mn09PSl8KD86WzAtOWEtekEtWisvXXszfT0pKT8kLztcbmV4cG9ydCBjb25zdCBiYXNlNjR1cmwgPSAvXltBLVphLXowLTlfLV0qJC87XG4vLyBiYXNlZCBvbiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDYxNzkvcmVndWxhci1leHByZXNzaW9uLXRvLW1hdGNoLWRucy1ob3N0bmFtZS1vci1pcC1hZGRyZXNzXG4vLyBleHBvcnQgY29uc3QgaG9zdG5hbWU6IFJlZ0V4cCA9IC9eKFthLXpBLVowLTktXStcXC4pKlthLXpBLVowLTktXSskLztcbmV4cG9ydCBjb25zdCBob3N0bmFtZSA9IC9eKD89LnsxLDI1M31cXC4/JClbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlstMC05YS16QS1aXXswLDYxfVswLTlhLXpBLVpdKT8pKlxcLj8kLztcbmV4cG9ydCBjb25zdCBkb21haW4gPSAvXihbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT9cXC4pK1thLXpBLVpdezIsfSQvO1xuLy8gaHR0cHM6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy92YWxpZGF0ZS1waG9uZS1udW1iZXIjcjQtMyAocmVnZXggc2FucyBzcGFjZXMpXG4vLyBFLjE2NDogbGVhZGluZyBkaWdpdCBtdXN0IGJlIDEtOTsgdG90YWwgZGlnaXRzIChleGNsdWRpbmcgJysnKSBiZXR3ZWVuIDctMTVcbmV4cG9ydCBjb25zdCBlMTY0ID0gL15cXCtbMS05XVxcZHs2LDE0fSQvO1xuLy8gY29uc3QgZGF0ZVNvdXJjZSA9IGAoKFxcXFxkXFxcXGRbMjQ2OF1bMDQ4XXxcXFxcZFxcXFxkWzEzNTc5XVsyNl18XFxcXGRcXFxcZDBbNDhdfFswMjQ2OF1bMDQ4XTAwfFsxMzU3OV1bMjZdMDApLTAyLTI5fFxcXFxkezR9LSgoMFsxMzU3OF18MVswMl0pLSgwWzEtOV18WzEyXVxcXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXFxcZHwzMCl8KDAyKS0oMFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuY29uc3QgZGF0ZVNvdXJjZSA9IGAoPzooPzpcXFxcZFxcXFxkWzI0NjhdWzA0OF18XFxcXGRcXFxcZFsxMzU3OV1bMjZdfFxcXFxkXFxcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXFxcZHs0fS0oPzooPzowWzEzNTc4XXwxWzAyXSktKD86MFsxLTldfFsxMl1cXFxcZHwzWzAxXSl8KD86MFs0NjldfDExKS0oPzowWzEtOV18WzEyXVxcXFxkfDMwKXwoPzowMiktKD86MFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuZXhwb3J0IGNvbnN0IGRhdGUgPSAvKkBfX1BVUkVfXyovIG5ldyBSZWdFeHAoYF4ke2RhdGVTb3VyY2V9JGApO1xuZnVuY3Rpb24gdGltZVNvdXJjZShhcmdzKSB7XG4gICAgY29uc3QgaGhtbSA9IGAoPzpbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkYDtcbiAgICBjb25zdCByZWdleCA9IHR5cGVvZiBhcmdzLnByZWNpc2lvbiA9PT0gXCJudW1iZXJcIiA/IGFyZ3MucHJlY2lzaW9uID09PSAtMSA/IGAke2hobW19YCA6IGFyZ3MucHJlY2lzaW9uID09PSAwID8gYCR7aGhtbX06WzAtNV1cXFxcZGAgOiBgJHtoaG1tfTpbMC01XVxcXFxkXFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1gIDogYCR7aGhtbX0oPzo6WzAtNV1cXFxcZCg/OlxcXFwuXFxcXGQrKT8pP2A7XG4gICAgcmV0dXJuIHJlZ2V4O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRpbWUoYXJncykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHt0aW1lU291cmNlKGFyZ3MpfSRgKTtcbn1cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzE0MzIzMVxuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lKGFyZ3MpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZVNvdXJjZSh7XG4gICAgICAgIHByZWNpc2lvbjogYXJncy5wcmVjaXNpb25cbiAgICB9KTtcbiAgICBjb25zdCBvcHRzID0gW1xuICAgICAgICBcIlpcIlxuICAgIF07XG4gICAgaWYgKGFyZ3MubG9jYWwpIG9wdHMucHVzaChcIlwiKTtcbiAgICAvLyBpZiAoYXJncy5vZmZzZXQpIG9wdHMucHVzaChgKFsrLV1cXFxcZHsyfTpcXFxcZHsyfSlgKTtcbiAgICBpZiAoYXJncy5vZmZzZXQpIG9wdHMucHVzaChgKFsrLV0oPzpbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkKWApO1xuICAgIGNvbnN0IHRpbWVSZWdleCA9IGAke3RpbWV9KD86JHtvcHRzLmpvaW4oXCJ8XCIpfSlgO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtkYXRlU291cmNlfVQoPzoke3RpbWVSZWdleH0pJGApO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZyA9IChwYXJhbXMpPT57XG4gICAgY29uc3QgcmVnZXggPSBwYXJhbXMgPyBgW1xcXFxzXFxcXFNdeyR7cGFyYW1zPy5taW5pbXVtID8/IDB9LCR7cGFyYW1zPy5tYXhpbXVtID8/IFwiXCJ9fWAgOiBgW1xcXFxzXFxcXFNdKmA7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4fSRgKTtcbn07XG5leHBvcnQgY29uc3QgYmlnaW50ID0gL14tP1xcZCtuPyQvO1xuZXhwb3J0IGNvbnN0IGludGVnZXIgPSAvXi0/XFxkKyQvO1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IC9eLT9cXGQrKD86XFwuXFxkKyk/JC87XG5leHBvcnQgY29uc3QgYm9vbGVhbiA9IC9eKD86dHJ1ZXxmYWxzZSkkL2k7XG5jb25zdCBfbnVsbCA9IC9ebnVsbCQvaTtcbmV4cG9ydCB7IF9udWxsIGFzIG51bGwgfTtcbmNvbnN0IF91bmRlZmluZWQgPSAvXnVuZGVmaW5lZCQvaTtcbmV4cG9ydCB7IF91bmRlZmluZWQgYXMgdW5kZWZpbmVkIH07XG4vLyByZWdleCBmb3Igc3RyaW5nIHdpdGggbm8gdXBwZXJjYXNlIGxldHRlcnNcbmV4cG9ydCBjb25zdCBsb3dlcmNhc2UgPSAvXlteQS1aXSokLztcbi8vIHJlZ2V4IGZvciBzdHJpbmcgd2l0aCBubyBsb3dlcmNhc2UgbGV0dGVyc1xuZXhwb3J0IGNvbnN0IHVwcGVyY2FzZSA9IC9eW15hLXpdKiQvO1xuLy8gcmVnZXggZm9yIGhleGFkZWNpbWFsIHN0cmluZ3MgKGFueSBsZW5ndGgpXG5leHBvcnQgY29uc3QgaGV4ID0gL15bMC05YS1mQS1GXSokLztcbi8vIEhhc2ggcmVnZXhlcyBmb3IgZGlmZmVyZW50IGFsZ29yaXRobXMgYW5kIGVuY29kaW5nc1xuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBiYXNlNjQgcmVnZXggd2l0aCBleGFjdCBsZW5ndGggYW5kIHBhZGRpbmdcbmZ1bmN0aW9uIGZpeGVkQmFzZTY0KGJvZHlMZW5ndGgsIHBhZGRpbmcpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXltBLVphLXowLTkrL117JHtib2R5TGVuZ3RofX0ke3BhZGRpbmd9JGApO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBiYXNlNjR1cmwgcmVnZXggd2l0aCBleGFjdCBsZW5ndGggKG5vIHBhZGRpbmcpXG5mdW5jdGlvbiBmaXhlZEJhc2U2NHVybChsZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXltBLVphLXowLTlfLV17JHtsZW5ndGh9fSRgKTtcbn1cbi8vIE1ENSAoMTYgYnl0ZXMpOiBiYXNlNjQgPSAyNCBjaGFycyB0b3RhbCAoMjIgKyBcIj09XCIpXG5leHBvcnQgY29uc3QgbWQ1X2hleCA9IC9eWzAtOWEtZkEtRl17MzJ9JC87XG5leHBvcnQgY29uc3QgbWQ1X2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoMjIsIFwiPT1cIik7XG5leHBvcnQgY29uc3QgbWQ1X2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoMjIpO1xuLy8gU0hBMSAoMjAgYnl0ZXMpOiBiYXNlNjQgPSAyOCBjaGFycyB0b3RhbCAoMjcgKyBcIj1cIilcbmV4cG9ydCBjb25zdCBzaGExX2hleCA9IC9eWzAtOWEtZkEtRl17NDB9JC87XG5leHBvcnQgY29uc3Qgc2hhMV9iYXNlNjQgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0KDI3LCBcIj1cIik7XG5leHBvcnQgY29uc3Qgc2hhMV9iYXNlNjR1cmwgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0dXJsKDI3KTtcbi8vIFNIQTI1NiAoMzIgYnl0ZXMpOiBiYXNlNjQgPSA0NCBjaGFycyB0b3RhbCAoNDMgKyBcIj1cIilcbmV4cG9ydCBjb25zdCBzaGEyNTZfaGV4ID0gL15bMC05YS1mQS1GXXs2NH0kLztcbmV4cG9ydCBjb25zdCBzaGEyNTZfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCg0MywgXCI9XCIpO1xuZXhwb3J0IGNvbnN0IHNoYTI1Nl9iYXNlNjR1cmwgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0dXJsKDQzKTtcbi8vIFNIQTM4NCAoNDggYnl0ZXMpOiBiYXNlNjQgPSA2NCBjaGFycyB0b3RhbCAobm8gcGFkZGluZylcbmV4cG9ydCBjb25zdCBzaGEzODRfaGV4ID0gL15bMC05YS1mQS1GXXs5Nn0kLztcbmV4cG9ydCBjb25zdCBzaGEzODRfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCg2NCwgXCJcIik7XG5leHBvcnQgY29uc3Qgc2hhMzg0X2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoNjQpO1xuLy8gU0hBNTEyICg2NCBieXRlcyk6IGJhc2U2NCA9IDg4IGNoYXJzIHRvdGFsICg4NiArIFwiPT1cIilcbmV4cG9ydCBjb25zdCBzaGE1MTJfaGV4ID0gL15bMC05YS1mQS1GXXsxMjh9JC87XG5leHBvcnQgY29uc3Qgc2hhNTEyX2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoODYsIFwiPT1cIik7XG5leHBvcnQgY29uc3Qgc2hhNTEyX2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoODYpO1xuIiwgIi8vIGltcG9ydCB7ICRab2RUeXBlIH0gZnJvbSBcIi4vc2NoZW1hcy5qc1wiO1xuaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi9jb3JlLmpzXCI7XG5pbXBvcnQgKiBhcyByZWdleGVzIGZyb20gXCIuL3JlZ2V4ZXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVjayA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgaW5zdC5fem9kID8/IChpbnN0Ll96b2QgPSB7fSk7XG4gICAgaW5zdC5fem9kLmRlZiA9IGRlZjtcbiAgICAoX2EgPSBpbnN0Ll96b2QpLm9uYXR0YWNoID8/IChfYS5vbmF0dGFjaCA9IFtdKTtcbn0pO1xuY29uc3QgbnVtZXJpY09yaWdpbk1hcCA9IHtcbiAgICBudW1iZXI6IFwibnVtYmVyXCIsXG4gICAgYmlnaW50OiBcImJpZ2ludFwiLFxuICAgIG9iamVjdDogXCJkYXRlXCJcbn07XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTGVzc1RoYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTGVzc1RoYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG9yaWdpbiA9IG51bWVyaWNPcmlnaW5NYXBbdHlwZW9mIGRlZi52YWx1ZV07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGNvbnN0IGN1cnIgPSAoZGVmLmluY2x1c2l2ZSA/IGJhZy5tYXhpbXVtIDogYmFnLmV4Y2x1c2l2ZU1heGltdW0pID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi52YWx1ZSA8IGN1cnIpIHtcbiAgICAgICAgICAgIGlmIChkZWYuaW5jbHVzaXZlKSBiYWcubWF4aW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgICAgIGVsc2UgYmFnLmV4Y2x1c2l2ZU1heGltdW0gPSBkZWYudmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUgPyBwYXlsb2FkLnZhbHVlIDw9IGRlZi52YWx1ZSA6IHBheWxvYWQudmFsdWUgPCBkZWYudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgbWF4aW11bTogdHlwZW9mIGRlZi52YWx1ZSA9PT0gXCJvYmplY3RcIiA/IGRlZi52YWx1ZS5nZXRUaW1lKCkgOiBkZWYudmFsdWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZGVmLmluY2x1c2l2ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrR3JlYXRlclRoYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrR3JlYXRlclRoYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG9yaWdpbiA9IG51bWVyaWNPcmlnaW5NYXBbdHlwZW9mIGRlZi52YWx1ZV07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGNvbnN0IGN1cnIgPSAoZGVmLmluY2x1c2l2ZSA/IGJhZy5taW5pbXVtIDogYmFnLmV4Y2x1c2l2ZU1pbmltdW0pID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi52YWx1ZSA+IGN1cnIpIHtcbiAgICAgICAgICAgIGlmIChkZWYuaW5jbHVzaXZlKSBiYWcubWluaW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgICAgIGVsc2UgYmFnLmV4Y2x1c2l2ZU1pbmltdW0gPSBkZWYudmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUgPyBwYXlsb2FkLnZhbHVlID49IGRlZi52YWx1ZSA6IHBheWxvYWQudmFsdWUgPiBkZWYudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICBtaW5pbXVtOiB0eXBlb2YgZGVmLnZhbHVlID09PSBcIm9iamVjdFwiID8gZGVmLnZhbHVlLmdldFRpbWUoKSA6IGRlZi52YWx1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBkZWYuaW5jbHVzaXZlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNdWx0aXBsZU9mID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja011bHRpcGxlT2ZcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGluc3QuX3pvZC5iYWcpLm11bHRpcGxlT2YgPz8gKF9hLm11bHRpcGxlT2YgPSBkZWYudmFsdWUpO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgIT09IHR5cGVvZiBkZWYudmFsdWUpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBtaXggbnVtYmVyIGFuZCBiaWdpbnQgaW4gbXVsdGlwbGVfb2YgY2hlY2suXCIpO1xuICAgICAgICBjb25zdCBpc011bHRpcGxlID0gdHlwZW9mIHBheWxvYWQudmFsdWUgPT09IFwiYmlnaW50XCIgPyBwYXlsb2FkLnZhbHVlICUgZGVmLnZhbHVlID09PSBCaWdJbnQoMCkgOiB1dGlsLmZsb2F0U2FmZVJlbWFpbmRlcihwYXlsb2FkLnZhbHVlLCBkZWYudmFsdWUpID09PSAwO1xuICAgICAgICBpZiAoaXNNdWx0aXBsZSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogdHlwZW9mIHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBjb2RlOiBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICAgICAgICAgICAgZGl2aXNvcjogZGVmLnZhbHVlLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja051bWJlckZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tOdW1iZXJGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG4gICAgZGVmLmZvcm1hdCA9IGRlZi5mb3JtYXQgfHwgXCJmbG9hdDY0XCI7XG4gICAgY29uc3QgaXNJbnQgPSBkZWYuZm9ybWF0Py5pbmNsdWRlcyhcImludFwiKTtcbiAgICBjb25zdCBvcmlnaW4gPSBpc0ludCA/IFwiaW50XCIgOiBcIm51bWJlclwiO1xuICAgIGNvbnN0IFttaW5pbXVtLCBtYXhpbXVtXSA9IHV0aWwuTlVNQkVSX0ZPUk1BVF9SQU5HRVNbZGVmLmZvcm1hdF07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5mb3JtYXQgPSBkZWYuZm9ybWF0O1xuICAgICAgICBiYWcubWluaW11bSA9IG1pbmltdW07XG4gICAgICAgIGJhZy5tYXhpbXVtID0gbWF4aW11bTtcbiAgICAgICAgaWYgKGlzSW50KSBiYWcucGF0dGVybiA9IHJlZ2V4ZXMuaW50ZWdlcjtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoaXNJbnQpIHtcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnZhbGlkX2Zvcm1hdCBpc3N1ZVxuICAgICAgICAgICAgICAgIC8vIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIC8vICAgZXhwZWN0ZWQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICAgICAgLy8gICBmb3JtYXQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICAgICAgLy8gICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgLy8gICBpbnB1dCxcbiAgICAgICAgICAgICAgICAvLyAgIGluc3QsXG4gICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgLy8gaW52YWxpZF90eXBlIGlzc3VlXG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBvcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZGVmLmZvcm1hdCxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIG5vdF9tdWx0aXBsZV9vZiBpc3N1ZVxuICAgICAgICAgICAgLy8gcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAvLyAgIGNvZGU6IFwibm90X211bHRpcGxlX29mXCIsXG4gICAgICAgICAgICAvLyAgIG9yaWdpbjogXCJudW1iZXJcIixcbiAgICAgICAgICAgIC8vICAgaW5wdXQsXG4gICAgICAgICAgICAvLyAgIGluc3QsXG4gICAgICAgICAgICAvLyAgIGRpdmlzb3I6IDEsXG4gICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0b29fYmlnXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnRlZ2VycyBtdXN0IGJlIHdpdGhpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvb19zbWFsbFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnRlZ2VycyBtdXN0IGJlIHdpdGhpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0IDwgbWluaW11bSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgbWluaW11bSxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ID4gbWF4aW11bSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgIG1heGltdW0sXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0JpZ0ludEZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tCaWdJbnRGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG4gICAgY29uc3QgW21pbmltdW0sIG1heGltdW1dID0gdXRpbC5CSUdJTlRfRk9STUFUX1JBTkdFU1tkZWYuZm9ybWF0XTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGRlZi5mb3JtYXQ7XG4gICAgICAgIGJhZy5taW5pbXVtID0gbWluaW11bTtcbiAgICAgICAgYmFnLm1heGltdW0gPSBtYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmIChpbnB1dCA8IG1pbmltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IG1pbmltdW0sXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCA+IG1heGltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICBtYXhpbXVtLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNYXhTaXplID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01heFNpemVcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLnNpemUgIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWF4aW11bSA8IGN1cnIpIGluc3QuX3pvZC5iYWcubWF4aW11bSA9IGRlZi5tYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaXplO1xuICAgICAgICBpZiAoc2l6ZSA8PSBkZWYubWF4aW11bSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogdXRpbC5nZXRTaXphYmxlT3JpZ2luKGlucHV0KSxcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heGltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWluU2l6ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNaW5TaXplXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5zaXplICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGN1cnIgPSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPz8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLm1pbmltdW0gPiBjdXJyKSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPSBkZWYubWluaW11bTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBzaXplID0gaW5wdXQuc2l6ZTtcbiAgICAgICAgaWYgKHNpemUgPj0gZGVmLm1pbmltdW0pIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IHV0aWwuZ2V0U2l6YWJsZU9yaWdpbihpbnB1dCksXG4gICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbmltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrU2l6ZUVxdWFscyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tTaXplRXF1YWxzXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5zaXplICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5taW5pbXVtID0gZGVmLnNpemU7XG4gICAgICAgIGJhZy5tYXhpbXVtID0gZGVmLnNpemU7XG4gICAgICAgIGJhZy5zaXplID0gZGVmLnNpemU7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGlucHV0LnNpemU7XG4gICAgICAgIGlmIChzaXplID09PSBkZWYuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0b29CaWcgPSBzaXplID4gZGVmLnNpemU7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiB1dGlsLmdldFNpemFibGVPcmlnaW4oaW5wdXQpLFxuICAgICAgICAgICAgLi4udG9vQmlnID8ge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5zaXplXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgbWluaW11bTogZGVmLnNpemVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNYXhMZW5ndGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWF4TGVuZ3RoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWF4aW11bSA8IGN1cnIpIGluc3QuX3pvZC5iYWcubWF4aW11bSA9IGRlZi5tYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSBkZWYubWF4aW11bSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcmlnaW4gPSB1dGlsLmdldExlbmd0aGFibGVPcmlnaW4oaW5wdXQpO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heGltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWluTGVuZ3RoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01pbkxlbmd0aFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGN1cnIgPSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPz8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLm1pbmltdW0gPiBjdXJyKSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPSBkZWYubWluaW11bTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPj0gZGVmLm1pbmltdW0pIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdXRpbC5nZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KTtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbmltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTGVuZ3RoRXF1YWxzID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0xlbmd0aEVxdWFsc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5taW5pbXVtID0gZGVmLmxlbmd0aDtcbiAgICAgICAgYmFnLm1heGltdW0gPSBkZWYubGVuZ3RoO1xuICAgICAgICBiYWcubGVuZ3RoID0gZGVmLmxlbmd0aDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPT09IGRlZi5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdXRpbC5nZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KTtcbiAgICAgICAgY29uc3QgdG9vQmlnID0gbGVuZ3RoID4gZGVmLmxlbmd0aDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAuLi50b29CaWcgPyB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLmxlbmd0aFxuICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5sZW5ndGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrU3RyaW5nRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hLCBfYjtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcuZm9ybWF0ID0gZGVmLmZvcm1hdDtcbiAgICAgICAgaWYgKGRlZi5wYXR0ZXJuKSB7XG4gICAgICAgICAgICBiYWcucGF0dGVybnMgPz8gKGJhZy5wYXR0ZXJucyA9IG5ldyBTZXQoKSk7XG4gICAgICAgICAgICBiYWcucGF0dGVybnMuYWRkKGRlZi5wYXR0ZXJuKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChkZWYucGF0dGVybikgKF9hID0gaW5zdC5fem9kKS5jaGVjayA/PyAoX2EuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgZGVmLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKGRlZi5wYXR0ZXJuLnRlc3QocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIC4uLmRlZi5wYXR0ZXJuID8ge1xuICAgICAgICAgICAgICAgIHBhdHRlcm46IGRlZi5wYXR0ZXJuLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0gOiB7fSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBlbHNlIChfYiA9IGluc3QuX3pvZCkuY2hlY2sgPz8gKF9iLmNoZWNrID0gKCk9Pnt9KTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1JlZ2V4ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1JlZ2V4XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgZGVmLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKGRlZi5wYXR0ZXJuLnRlc3QocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwicmVnZXhcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgcGF0dGVybjogZGVmLnBhdHRlcm4udG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTG93ZXJDYXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0xvd2VyQ2FzZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMubG93ZXJjYXNlKTtcbiAgICAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrVXBwZXJDYXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1VwcGVyQ2FzZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXBwZXJjYXNlKTtcbiAgICAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrSW5jbHVkZXMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrSW5jbHVkZXNcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IGVzY2FwZWRSZWdleCA9IHV0aWwuZXNjYXBlUmVnZXgoZGVmLmluY2x1ZGVzKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCh0eXBlb2YgZGVmLnBvc2l0aW9uID09PSBcIm51bWJlclwiID8gYF4ueyR7ZGVmLnBvc2l0aW9ufX0ke2VzY2FwZWRSZWdleH1gIDogZXNjYXBlZFJlZ2V4KTtcbiAgICBkZWYucGF0dGVybiA9IHBhdHRlcm47XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5wYXR0ZXJucyA/PyAoYmFnLnBhdHRlcm5zID0gbmV3IFNldCgpKTtcbiAgICAgICAgYmFnLnBhdHRlcm5zLmFkZChwYXR0ZXJuKTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUuaW5jbHVkZXMoZGVmLmluY2x1ZGVzLCBkZWYucG9zaXRpb24pKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImluY2x1ZGVzXCIsXG4gICAgICAgICAgICBpbmNsdWRlczogZGVmLmluY2x1ZGVzLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1N0YXJ0c1dpdGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrU3RhcnRzV2l0aFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3V0aWwuZXNjYXBlUmVnZXgoZGVmLnByZWZpeCl9LipgKTtcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSBwYXR0ZXJuKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLnBhdHRlcm5zID8/IChiYWcucGF0dGVybnMgPSBuZXcgU2V0KCkpO1xuICAgICAgICBiYWcucGF0dGVybnMuYWRkKHBhdHRlcm4pO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZS5zdGFydHNXaXRoKGRlZi5wcmVmaXgpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcInN0YXJ0c193aXRoXCIsXG4gICAgICAgICAgICBwcmVmaXg6IGRlZi5wcmVmaXgsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrRW5kc1dpdGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrRW5kc1dpdGhcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGAuKiR7dXRpbC5lc2NhcGVSZWdleChkZWYuc3VmZml4KX0kYCk7XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcGF0dGVybik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5wYXR0ZXJucyA/PyAoYmFnLnBhdHRlcm5zID0gbmV3IFNldCgpKTtcbiAgICAgICAgYmFnLnBhdHRlcm5zLmFkZChwYXR0ZXJuKTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUuZW5kc1dpdGgoZGVmLnN1ZmZpeCkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiZW5kc193aXRoXCIsXG4gICAgICAgICAgICBzdWZmaXg6IGRlZi5zdWZmaXgsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8gICAgJFpvZENoZWNrUHJvcGVydHkgICAgLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5mdW5jdGlvbiBoYW5kbGVDaGVja1Byb3BlcnR5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgcHJvcGVydHkpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3Vlcyhwcm9wZXJ0eSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tQcm9wZXJ0eSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tQcm9wZXJ0eVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5zY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IHBheWxvYWQudmFsdWVbZGVmLnByb3BlcnR5XSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwge30pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVDaGVja1Byb3BlcnR5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgZGVmLnByb3BlcnR5KSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlQ2hlY2tQcm9wZXJ0eVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGRlZi5wcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWltZVR5cGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWltZVR5cGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG1pbWVTZXQgPSBuZXcgU2V0KGRlZi5taW1lKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgaW5zdC5fem9kLmJhZy5taW1lID0gZGVmLm1pbWU7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChtaW1lU2V0LmhhcyhwYXlsb2FkLnZhbHVlLnR5cGUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IGRlZi5taW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUudHlwZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrT3ZlcndyaXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja092ZXJ3cml0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYudHgocGF5bG9hZC52YWx1ZSk7XG4gICAgfTtcbn0pO1xuIiwgImV4cG9ydCBjbGFzcyBEb2Mge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MgPSBbXSl7XG4gICAgICAgIHRoaXMuY29udGVudCA9IFtdO1xuICAgICAgICB0aGlzLmluZGVudCA9IDA7XG4gICAgICAgIGlmICh0aGlzKSB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cbiAgICBpbmRlbnRlZChmbikge1xuICAgICAgICB0aGlzLmluZGVudCArPSAxO1xuICAgICAgICBmbih0aGlzKTtcbiAgICAgICAgdGhpcy5pbmRlbnQgLT0gMTtcbiAgICB9XG4gICAgd3JpdGUoYXJnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGFyZyh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uOiBcInN5bmNcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhcmcodGhpcywge1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbjogXCJhc3luY1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZW50ID0gYXJnO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKCh4KT0+eCk7XG4gICAgICAgIGNvbnN0IG1pbkluZGVudCA9IE1hdGgubWluKC4uLmxpbmVzLm1hcCgoeCk9PngubGVuZ3RoIC0geC50cmltU3RhcnQoKS5sZW5ndGgpKTtcbiAgICAgICAgY29uc3QgZGVkZW50ZWQgPSBsaW5lcy5tYXAoKHgpPT54LnNsaWNlKG1pbkluZGVudCkpLm1hcCgoeCk9PlwiIFwiLnJlcGVhdCh0aGlzLmluZGVudCAqIDIpICsgeCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBkZWRlbnRlZCl7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICBjb25zdCBGID0gRnVuY3Rpb247XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzPy5hcmdzO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcz8uY29udGVudCA/PyBbXG4gICAgICAgICAgICBgYFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgICAgICAgIC4uLmNvbnRlbnQubWFwKCh4KT0+YCAgJHt4fWApXG4gICAgICAgIF07XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICAgICAgICByZXR1cm4gbmV3IEYoLi4uYXJncywgbGluZXMuam9pbihcIlxcblwiKSk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCB2ZXJzaW9uID0ge1xuICAgIG1ham9yOiA0LFxuICAgIG1pbm9yOiAzLFxuICAgIHBhdGNoOiA2XG59O1xuIiwgImltcG9ydCAqIGFzIGNoZWNrcyBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4vY29yZS5qc1wiO1xuaW1wb3J0IHsgRG9jIH0gZnJvbSBcIi4vZG9jLmpzXCI7XG5pbXBvcnQgeyBwYXJzZSwgcGFyc2VBc3luYywgc2FmZVBhcnNlLCBzYWZlUGFyc2VBc3luYyB9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5pbXBvcnQgKiBhcyByZWdleGVzIGZyb20gXCIuL3JlZ2V4ZXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL3ZlcnNpb25zLmpzXCI7XG5leHBvcnQgY29uc3QgJFpvZFR5cGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFR5cGVcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgaW5zdCA/PyAoaW5zdCA9IHt9KTtcbiAgICBpbnN0Ll96b2QuZGVmID0gZGVmOyAvLyBzZXQgX2RlZiBwcm9wZXJ0eVxuICAgIGluc3QuX3pvZC5iYWcgPSBpbnN0Ll96b2QuYmFnIHx8IHt9OyAvLyBpbml0aWFsaXplIF9iYWcgb2JqZWN0XG4gICAgaW5zdC5fem9kLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIGNvbnN0IGNoZWNrcyA9IFtcbiAgICAgICAgLi4uaW5zdC5fem9kLmRlZi5jaGVja3MgPz8gW11cbiAgICBdO1xuICAgIC8vIGlmIGluc3QgaXMgaXRzZWxmIGEgY2hlY2tzLiRab2RDaGVjaywgcnVuIGl0IGFzIGEgY2hlY2tcbiAgICBpZiAoaW5zdC5fem9kLnRyYWl0cy5oYXMoXCIkWm9kQ2hlY2tcIikpIHtcbiAgICAgICAgY2hlY2tzLnVuc2hpZnQoaW5zdCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2ggb2YgY2hlY2tzKXtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiBjaC5fem9kLm9uYXR0YWNoKXtcbiAgICAgICAgICAgIGZuKGluc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjaGVja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGRlZmVycmVkIGluaXRpYWxpemVyXG4gICAgICAgIC8vIGluc3QuX3pvZC5wYXJzZSBpcyBub3QgeWV0IGRlZmluZWRcbiAgICAgICAgKF9hID0gaW5zdC5fem9kKS5kZWZlcnJlZCA/PyAoX2EuZGVmZXJyZWQgPSBbXSk7XG4gICAgICAgIGluc3QuX3pvZC5kZWZlcnJlZD8ucHVzaCgoKT0+e1xuICAgICAgICAgICAgaW5zdC5fem9kLnJ1biA9IGluc3QuX3pvZC5wYXJzZTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcnVuQ2hlY2tzID0gKHBheWxvYWQsIGNoZWNrcywgY3R4KT0+e1xuICAgICAgICAgICAgbGV0IGlzQWJvcnRlZCA9IHV0aWwuYWJvcnRlZChwYXlsb2FkKTtcbiAgICAgICAgICAgIGxldCBhc3luY1Jlc3VsdDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2ggb2YgY2hlY2tzKXtcbiAgICAgICAgICAgICAgICBpZiAoY2guX3pvZC5kZWYud2hlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRSdW4gPSBjaC5fem9kLmRlZi53aGVuKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFJ1bikgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJMZW4gPSBwYXlsb2FkLmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgXyA9IGNoLl96b2QuY2hlY2socGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgaWYgKF8gaW5zdGFuY2VvZiBQcm9taXNlICYmIGN0eD8uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhc3luY1Jlc3VsdCB8fCBfIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3VsdCA9IChhc3luY1Jlc3VsdCA/PyBQcm9taXNlLnJlc29sdmUoKSkudGhlbihhc3luYyAoKT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgXztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRMZW4gPSBwYXlsb2FkLmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dExlbiA9PT0gY3VyckxlbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Fib3J0ZWQpIGlzQWJvcnRlZCA9IHV0aWwuYWJvcnRlZChwYXlsb2FkLCBjdXJyTGVuKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dExlbiA9IHBheWxvYWQuaXNzdWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRMZW4gPT09IGN1cnJMZW4pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQWJvcnRlZCkgaXNBYm9ydGVkID0gdXRpbC5hYm9ydGVkKHBheWxvYWQsIGN1cnJMZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhc3luY1Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhc3luY1Jlc3VsdC50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZUNhbmFyeVJlc3VsdCA9IChjYW5hcnksIHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgICAgIC8vIGFib3J0IGlmIHRoZSBjYW5hcnkgaXMgYWJvcnRlZFxuICAgICAgICAgICAgaWYgKHV0aWwuYWJvcnRlZChjYW5hcnkpKSB7XG4gICAgICAgICAgICAgICAgY2FuYXJ5LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYW5hcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBydW4gY2hlY2tzIGZpcnN0LCB0aGVuXG4gICAgICAgICAgICBjb25zdCBjaGVja1Jlc3VsdCA9IHJ1bkNoZWNrcyhwYXlsb2FkLCBjaGVja3MsIGN0eCk7XG4gICAgICAgICAgICBpZiAoY2hlY2tSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5hc3luYyA9PT0gZmFsc2UpIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrUmVzdWx0LnRoZW4oKGNoZWNrUmVzdWx0KT0+aW5zdC5fem9kLnBhcnNlKGNoZWNrUmVzdWx0LCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnN0Ll96b2QucGFyc2UoY2hlY2tSZXN1bHQsIGN0eCk7XG4gICAgICAgIH07XG4gICAgICAgIGluc3QuX3pvZC5ydW4gPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICAgICAgaWYgKGN0eC5za2lwQ2hlY2tzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3QuX3pvZC5wYXJzZShwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgICAgIC8vIHJ1biBjYW5hcnlcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsIHBhc3MgKG5vIGNoZWNrcylcbiAgICAgICAgICAgICAgICBjb25zdCBjYW5hcnkgPSBpbnN0Ll96b2QucGFyc2Uoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBza2lwQ2hlY2tzOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmFyeSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmFyeS50aGVuKChjYW5hcnkpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlQ2FuYXJ5UmVzdWx0KGNhbmFyeSwgcGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVDYW5hcnlSZXN1bHQoY2FuYXJ5LCBwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZm9yd2FyZFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5zdC5fem9kLnBhcnNlKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGlmIChjdHguYXN5bmMgPT09IGZhbHNlKSB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+cnVuQ2hlY2tzKHJlc3VsdCwgY2hlY2tzLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5DaGVja3MocmVzdWx0LCBjaGVja3MsIGN0eCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIExhenkgaW5pdGlhbGl6ZSB+c3RhbmRhcmQgdG8gYXZvaWQgY3JlYXRpbmcgb2JqZWN0cyBmb3IgZXZlcnkgc2NoZW1hXG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QsIFwifnN0YW5kYXJkXCIsICgpPT4oe1xuICAgICAgICAgICAgdmFsaWRhdGU6ICh2YWx1ZSk9PntcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gc2FmZVBhcnNlKGluc3QsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc3VjY2VzcyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlczogci5lcnJvcj8uaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2FmZVBhcnNlQXN5bmMoaW5zdCwgdmFsdWUpLnRoZW4oKHIpPT5yLnN1Y2Nlc3MgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIuZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IHIuZXJyb3I/Lmlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlbmRvcjogXCJ6b2RcIixcbiAgICAgICAgICAgIHZlcnNpb246IDFcbiAgICAgICAgfSkpO1xufSk7XG5leHBvcnQgeyBjbG9uZSB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCBjb25zdCAkWm9kU3RyaW5nID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTdHJpbmdcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSBbXG4gICAgICAgIC4uLmluc3Q/Ll96b2QuYmFnPy5wYXR0ZXJucyA/PyBbXVxuICAgIF0ucG9wKCkgPz8gcmVnZXhlcy5zdHJpbmcoaW5zdC5fem9kLmJhZyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF8pPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IFN0cmluZyhwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBjaGVjayBpbml0aWFsaXphdGlvbiBtdXN0IGNvbWUgZmlyc3RcbiAgICBjaGVja3MuJFpvZENoZWNrU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICAkWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RHVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RHVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5ndWlkKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgaWYgKGRlZi52ZXJzaW9uKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb25NYXAgPSB7XG4gICAgICAgICAgICB2MTogMSxcbiAgICAgICAgICAgIHYyOiAyLFxuICAgICAgICAgICAgdjM6IDMsXG4gICAgICAgICAgICB2NDogNCxcbiAgICAgICAgICAgIHY1OiA1LFxuICAgICAgICAgICAgdjY6IDYsXG4gICAgICAgICAgICB2NzogNyxcbiAgICAgICAgICAgIHY4OiA4XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHYgPSB2ZXJzaW9uTWFwW2RlZi52ZXJzaW9uXTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFVVSUQgdmVyc2lvbjogXCIke2RlZi52ZXJzaW9ufVwiYCk7XG4gICAgICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXVpZCh2KSk7XG4gICAgfSBlbHNlIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXVpZCgpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RFbWFpbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRW1haWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmVtYWlsKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVUkwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVHJpbSB3aGl0ZXNwYWNlIGZyb20gaW5wdXRcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBwYXlsb2FkLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAoZGVmLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICAgICAgZGVmLmhvc3RuYW1lLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWYuaG9zdG5hbWUudGVzdCh1cmwuaG9zdG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnZhbGlkIGhvc3RuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiBkZWYuaG9zdG5hbWUuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZi5wcm90b2NvbCkge1xuICAgICAgICAgICAgICAgIGRlZi5wcm90b2NvbC5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGlmICghZGVmLnByb3RvY29sLnRlc3QodXJsLnByb3RvY29sLmVuZHNXaXRoKFwiOlwiKSA/IHVybC5wcm90b2NvbC5zbGljZSgwLCAtMSkgOiB1cmwucHJvdG9jb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnZhbGlkIHByb3RvY29sXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiBkZWYucHJvdG9jb2wuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0IHRoZSBvdXRwdXQgdmFsdWUgYmFzZWQgb24gbm9ybWFsaXplIGZsYWdcbiAgICAgICAgICAgIGlmIChkZWYubm9ybWFsaXplKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIG5vcm1hbGl6ZWQgVVJMXG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHVybC5ocmVmO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgaW5wdXQgKHRyaW1tZWQpXG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHRyaW1tZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEVtb2ppID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RFbW9qaVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZW1vamkoKSk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTmFub0lEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROYW5vSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLm5hbm9pZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuY3VpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ1VJRDIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENVSUQyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jdWlkMik7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVUxJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVUxJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudWxpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kWElEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RYSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLnhpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kS1NVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEtTVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5rc3VpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVNPRGF0ZVRpbWUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElTT0RhdGVUaW1lXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5kYXRldGltZShkZWYpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJU09EYXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09EYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5kYXRlKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJU09UaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09UaW1lXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy50aW1lKGRlZikpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElTT0R1cmF0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09EdXJhdGlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZHVyYXRpb24pO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElQdjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElQdjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmlwdjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5iYWcuZm9ybWF0ID0gYGlwdjRgO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElQdjYgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElQdjZcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmlwdjYpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5iYWcuZm9ybWF0ID0gYGlwdjZgO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3IFVSTChgaHR0cDovL1ske3BheWxvYWQudmFsdWV9XWApO1xuICAgICAgICAvLyByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiaXB2NlwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RNQUMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE1BQ1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMubWFjKGRlZi5kZWxpbWl0ZXIpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuYmFnLmZvcm1hdCA9IGBtYWNgO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENJRFJ2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ0lEUnY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jaWRydjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENJRFJ2NiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ0lEUnY2XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jaWRydjYpOyAvLyBub3QgdXNlZCBmb3IgdmFsaWRhdGlvblxuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBheWxvYWQudmFsdWUuc3BsaXQoXCIvXCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICBjb25zdCBbYWRkcmVzcywgcHJlZml4XSA9IHBhcnRzO1xuICAgICAgICAgICAgaWYgKCFwcmVmaXgpIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4TnVtID0gTnVtYmVyKHByZWZpeCk7XG4gICAgICAgICAgICBpZiAoYCR7cHJlZml4TnVtfWAgIT09IHByZWZpeCkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICBpZiAocHJlZml4TnVtIDwgMCB8fCBwcmVmaXhOdW0gPiAxMjgpIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3IFVSTChgaHR0cDovL1ske2FkZHJlc3N9XWApO1xuICAgICAgICB9IGNhdGNoICB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImNpZHJ2NlwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgWm9kQmFzZTY0ICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJhc2U2NChkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IFwiXCIpIHJldHVybiB0cnVlO1xuICAgIGlmIChkYXRhLmxlbmd0aCAlIDQgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGF0b2IoZGF0YSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCAkWm9kQmFzZTY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RCYXNlNjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmJhc2U2NCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmJhZy5jb250ZW50RW5jb2RpbmcgPSBcImJhc2U2NFwiO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoaXNWYWxpZEJhc2U2NChwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJiYXNlNjRcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFpvZEJhc2U2NCAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCYXNlNjRVUkwoZGF0YSkge1xuICAgIGlmICghcmVnZXhlcy5iYXNlNjR1cmwudGVzdChkYXRhKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGJhc2U2NCA9IGRhdGEucmVwbGFjZSgvWy1fXS9nLCAoYyk9PmMgPT09IFwiLVwiID8gXCIrXCIgOiBcIi9cIik7XG4gICAgY29uc3QgcGFkZGVkID0gYmFzZTY0LnBhZEVuZChNYXRoLmNlaWwoYmFzZTY0Lmxlbmd0aCAvIDQpICogNCwgXCI9XCIpO1xuICAgIHJldHVybiBpc1ZhbGlkQmFzZTY0KHBhZGRlZCk7XG59XG5leHBvcnQgY29uc3QgJFpvZEJhc2U2NFVSTCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQmFzZTY0VVJMXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5iYXNlNjR1cmwpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5iYWcuY29udGVudEVuY29kaW5nID0gXCJiYXNlNjR1cmxcIjtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGlzVmFsaWRCYXNlNjRVUkwocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEUxNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEUxNjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmUxNjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICBab2RKV1QgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSldUKHRva2VuLCBhbGdvcml0aG0gPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdG9rZW5zUGFydHMgPSB0b2tlbi5zcGxpdChcIi5cIik7XG4gICAgICAgIGlmICh0b2tlbnNQYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgW2hlYWRlcl0gPSB0b2tlbnNQYXJ0cztcbiAgICAgICAgaWYgKCFoZWFkZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBwYXJzZWRIZWFkZXIgPSBKU09OLnBhcnNlKGF0b2IoaGVhZGVyKSk7XG4gICAgICAgIGlmIChcInR5cFwiIGluIHBhcnNlZEhlYWRlciAmJiBwYXJzZWRIZWFkZXI/LnR5cCAhPT0gXCJKV1RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXBhcnNlZEhlYWRlci5hbGcpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGFsZ29yaXRobSAmJiAoIShcImFsZ1wiIGluIHBhcnNlZEhlYWRlcikgfHwgcGFyc2VkSGVhZGVyLmFsZyAhPT0gYWxnb3JpdGhtKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoICB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgJFpvZEpXVCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSldUXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChpc1ZhbGlkSldUKHBheWxvYWQudmFsdWUsIGRlZi5hbGcpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImp3dFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDdXN0b21TdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEN1c3RvbVN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoZGVmLmZuKHBheWxvYWQudmFsdWUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBkZWYuZm9ybWF0LFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROdW1iZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE51bWJlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IGluc3QuX3pvZC5iYWcucGF0dGVybiA/PyByZWdleGVzLm51bWJlcjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHRyeSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gTnVtYmVyKHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc05hTihpbnB1dCkgJiYgTnVtYmVyLmlzRmluaXRlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVjZWl2ZWQgPSB0eXBlb2YgaW5wdXQgPT09IFwibnVtYmVyXCIgPyBOdW1iZXIuaXNOYU4oaW5wdXQpID8gXCJOYU5cIiA6ICFOdW1iZXIuaXNGaW5pdGUoaW5wdXQpID8gXCJJbmZpbml0eVwiIDogdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIC4uLnJlY2VpdmVkID8ge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkXG4gICAgICAgICAgICB9IDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVtYmVyRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdW1iZXJGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjaGVja3MuJFpvZENoZWNrTnVtYmVyRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICAkWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTsgLy8gbm8gZm9ybWF0IGNoZWNrc1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEJvb2xlYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJvb2xlYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSByZWdleGVzLmJvb2xlYW47XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IEJvb2xlYW4ocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJib29sZWFuXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQmlnSW50ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RCaWdJbnRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSByZWdleGVzLmJpZ2ludDtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHRyeSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gQmlnSW50KHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RCaWdJbnRGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJpZ0ludEZvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNoZWNrcy4kWm9kQ2hlY2tCaWdJbnRGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgICRab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG59KTtcbmV4cG9ydCBjb25zdCAkWm9kU3ltYm9sID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTeW1ib2xcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwic3ltYm9sXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVuZGVmaW5lZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVW5kZWZpbmVkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gcmVnZXhlcy51bmRlZmluZWQ7XG4gICAgaW5zdC5fem9kLnZhbHVlcyA9IG5ldyBTZXQoW1xuICAgICAgICB1bmRlZmluZWRcbiAgICBdKTtcbiAgICBpbnN0Ll96b2Qub3B0aW4gPSBcIm9wdGlvbmFsXCI7XG4gICAgaW5zdC5fem9kLm9wdG91dCA9IFwib3B0aW9uYWxcIjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJ1bmRlZmluZWRcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVsbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTnVsbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IHJlZ2V4ZXMubnVsbDtcbiAgICBpbnN0Ll96b2QudmFsdWVzID0gbmV3IFNldChbXG4gICAgICAgIG51bGxcbiAgICBdKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcIm51bGxcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQW55ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RBbnlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQpPT5wYXlsb2FkO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVua25vd24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVua25vd25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQpPT5wYXlsb2FkO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5ldmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROZXZlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJuZXZlclwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RWb2lkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RWb2lkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcInZvaWRcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG5ldyBEYXRlKHBheWxvYWQudmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX2Vycikge31cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGlzRGF0ZSA9IGlucHV0IGluc3RhbmNlb2YgRGF0ZTtcbiAgICAgICAgY29uc3QgaXNWYWxpZERhdGUgPSBpc0RhdGUgJiYgIU51bWJlci5pc05hTihpbnB1dC5nZXRUaW1lKCkpO1xuICAgICAgICBpZiAoaXNWYWxpZERhdGUpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImRhdGVcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIC4uLmlzRGF0ZSA/IHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogXCJJbnZhbGlkIERhdGVcIlxuICAgICAgICAgICAgfSA6IHt9LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlQXJyYXlSZXN1bHQocmVzdWx0LCBmaW5hbCwgaW5kZXgpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoaW5kZXgsIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICB9XG4gICAgZmluYWwudmFsdWVbaW5kZXhdID0gcmVzdWx0LnZhbHVlO1xufVxuZXhwb3J0IGNvbnN0ICRab2RBcnJheSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQXJyYXlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gQXJyYXkoaW5wdXQubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpbnB1dFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5lbGVtZW50Ll96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVBcnJheVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZUFycmF5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDsgLy9oYW5kbGVBcnJheVJlc3VsdHNBc3luYyhwYXJzZVJlc3VsdHMsIGZpbmFsKTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eVJlc3VsdChyZXN1bHQsIGZpbmFsLCBrZXksIGlucHV0LCBpc09wdGlvbmFsT3V0KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIEZvciBvcHRpb25hbC1vdXQgc2NoZW1hcywgaWdub3JlIGVycm9ycyBvbiBhYnNlbnQga2V5c1xuICAgICAgICBpZiAoaXNPcHRpb25hbE91dCAmJiAhKGtleSBpbiBpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChrZXkgaW4gaW5wdXQpIHtcbiAgICAgICAgICAgIGZpbmFsLnZhbHVlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmaW5hbC52YWx1ZVtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZURlZihkZWYpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGVmLnNoYXBlKTtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5cyl7XG4gICAgICAgIGlmICghZGVmLnNoYXBlPy5ba10/Ll96b2Q/LnRyYWl0cz8uaGFzKFwiJFpvZFR5cGVcIikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IGF0IGtleSBcIiR7a31cIjogZXhwZWN0ZWQgYSBab2Qgc2NoZW1hYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb2tleXMgPSB1dGlsLm9wdGlvbmFsS2V5cyhkZWYuc2hhcGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAga2V5cyxcbiAgICAgICAga2V5U2V0OiBuZXcgU2V0KGtleXMpLFxuICAgICAgICBudW1LZXlzOiBrZXlzLmxlbmd0aCxcbiAgICAgICAgb3B0aW9uYWxLZXlzOiBuZXcgU2V0KG9rZXlzKVxuICAgIH07XG59XG5mdW5jdGlvbiBoYW5kbGVDYXRjaGFsbChwcm9tcywgaW5wdXQsIHBheWxvYWQsIGN0eCwgZGVmLCBpbnN0KSB7XG4gICAgY29uc3QgdW5yZWNvZ25pemVkID0gW107XG4gICAgLy8gaXRlcmF0ZSBvdmVyIGlucHV0IGtleXNcbiAgICBjb25zdCBrZXlTZXQgPSBkZWYua2V5U2V0O1xuICAgIGNvbnN0IF9jYXRjaGFsbCA9IGRlZi5jYXRjaGFsbC5fem9kO1xuICAgIGNvbnN0IHQgPSBfY2F0Y2hhbGwuZGVmLnR5cGU7XG4gICAgY29uc3QgaXNPcHRpb25hbE91dCA9IF9jYXRjaGFsbC5vcHRvdXQgPT09IFwib3B0aW9uYWxcIjtcbiAgICBmb3IoY29uc3Qga2V5IGluIGlucHV0KXtcbiAgICAgICAgaWYgKGtleVNldC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgIGlmICh0ID09PSBcIm5ldmVyXCIpIHtcbiAgICAgICAgICAgIHVucmVjb2duaXplZC5wdXNoKGtleSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByID0gX2NhdGNoYWxsLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogaW5wdXRba2V5XSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBwcm9tcy5wdXNoKHIudGhlbigocik9PmhhbmRsZVByb3BlcnR5UmVzdWx0KHIsIHBheWxvYWQsIGtleSwgaW5wdXQsIGlzT3B0aW9uYWxPdXQpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0LCBpc09wdGlvbmFsT3V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodW5yZWNvZ25pemVkLmxlbmd0aCkge1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgICAgICAgICAgIGtleXM6IHVucmVjb2duaXplZCxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFwcm9tcy5sZW5ndGgpIHJldHVybiBwYXlsb2FkO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+e1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kT2JqZWN0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RPYmplY3RcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyByZXF1aXJlcyBjYXN0IGJlY2F1c2UgdGVjaG5pY2FsbHkgJFpvZE9iamVjdCBkb2Vzbid0IGV4dGVuZFxuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICAvLyBjb25zdCBzaCA9IGRlZi5zaGFwZTtcbiAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWYsIFwic2hhcGVcIik7XG4gICAgaWYgKCFkZXNjPy5nZXQpIHtcbiAgICAgICAgY29uc3Qgc2ggPSBkZWYuc2hhcGU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWYsIFwic2hhcGVcIiwge1xuICAgICAgICAgICAgZ2V0OiAoKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NoID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5zaFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlZiwgXCJzaGFwZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdTaFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdTaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IF9ub3JtYWxpemVkID0gdXRpbC5jYWNoZWQoKCk9Pm5vcm1hbGl6ZURlZihkZWYpKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PntcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBkZWYuc2hhcGU7XG4gICAgICAgIGNvbnN0IHByb3BWYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBzaGFwZSl7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHNoYXBlW2tleV0uX3pvZDtcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWVzW2tleV0gPz8gKHByb3BWYWx1ZXNba2V5XSA9IG5ldyBTZXQoKSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIGZpZWxkLnZhbHVlcylwcm9wVmFsdWVzW2tleV0uYWRkKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wVmFsdWVzO1xuICAgIH0pO1xuICAgIGNvbnN0IGlzT2JqZWN0ID0gdXRpbC5pc09iamVjdDtcbiAgICBjb25zdCBjYXRjaGFsbCA9IGRlZi5jYXRjaGFsbDtcbiAgICBsZXQgdmFsdWU7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgdmFsdWUgPz8gKHZhbHVlID0gX25vcm1hbGl6ZWQudmFsdWUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHt9O1xuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBjb25zdCBzaGFwZSA9IHZhbHVlLnNoYXBlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWx1ZS5rZXlzKXtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGlzT3B0aW9uYWxPdXQgPSBlbC5fem9kLm9wdG91dCA9PT0gXCJvcHRpb25hbFwiO1xuICAgICAgICAgICAgY29uc3QgciA9IGVsLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXRba2V5XSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyLnRoZW4oKHIpPT5oYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0LCBpc09wdGlvbmFsT3V0KSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0LCBpc09wdGlvbmFsT3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNhdGNoYWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpIDogcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlQ2F0Y2hhbGwocHJvbXMsIGlucHV0LCBwYXlsb2FkLCBjdHgsIF9ub3JtYWxpemVkLnZhbHVlLCBpbnN0KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE9iamVjdEpJVCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kT2JqZWN0SklUXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gcmVxdWlyZXMgY2FzdCBiZWNhdXNlIHRlY2huaWNhbGx5ICRab2RPYmplY3QgZG9lc24ndCBleHRlbmRcbiAgICAkWm9kT2JqZWN0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBzdXBlclBhcnNlID0gaW5zdC5fem9kLnBhcnNlO1xuICAgIGNvbnN0IF9ub3JtYWxpemVkID0gdXRpbC5jYWNoZWQoKCk9Pm5vcm1hbGl6ZURlZihkZWYpKTtcbiAgICBjb25zdCBnZW5lcmF0ZUZhc3RwYXNzID0gKHNoYXBlKT0+e1xuICAgICAgICBjb25zdCBkb2MgPSBuZXcgRG9jKFtcbiAgICAgICAgICAgIFwic2hhcGVcIixcbiAgICAgICAgICAgIFwicGF5bG9hZFwiLFxuICAgICAgICAgICAgXCJjdHhcIlxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVkLnZhbHVlO1xuICAgICAgICBjb25zdCBwYXJzZVN0ciA9IChrZXkpPT57XG4gICAgICAgICAgICBjb25zdCBrID0gdXRpbC5lc2Moa2V5KTtcbiAgICAgICAgICAgIHJldHVybiBgc2hhcGVbJHtrfV0uX3pvZC5ydW4oeyB2YWx1ZTogaW5wdXRbJHtrfV0sIGlzc3VlczogW10gfSwgY3R4KWA7XG4gICAgICAgIH07XG4gICAgICAgIGRvYy53cml0ZShgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO2ApO1xuICAgICAgICBjb25zdCBpZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIG5vcm1hbGl6ZWQua2V5cyl7XG4gICAgICAgICAgICBpZHNba2V5XSA9IGBrZXlfJHtjb3VudGVyKyt9YDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBOiBwcmVzZXJ2ZSBrZXkgb3JkZXIge1xuICAgICAgICBkb2Mud3JpdGUoYGNvbnN0IG5ld1Jlc3VsdCA9IHt9O2ApO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBub3JtYWxpemVkLmtleXMpe1xuICAgICAgICAgICAgY29uc3QgaWQgPSBpZHNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB1dGlsLmVzYyhrZXkpO1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGlzT3B0aW9uYWxPdXQgPSBzY2hlbWE/Ll96b2Q/Lm9wdG91dCA9PT0gXCJvcHRpb25hbFwiO1xuICAgICAgICAgICAgZG9jLndyaXRlKGBjb25zdCAke2lkfSA9ICR7cGFyc2VTdHIoa2V5KX07YCk7XG4gICAgICAgICAgICBpZiAoaXNPcHRpb25hbE91dCkge1xuICAgICAgICAgICAgICAgIC8vIEZvciBvcHRpb25hbC1vdXQgc2NoZW1hcywgaWdub3JlIGVycm9ycyBvbiBhYnNlbnQga2V5c1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZShgXG4gICAgICAgIGlmICgke2lkfS5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCR7a30gaW4gaW5wdXQpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzID0gcGF5bG9hZC5pc3N1ZXMuY29uY2F0KCR7aWR9Lmlzc3Vlcy5tYXAoaXNzID0+ICh7XG4gICAgICAgICAgICAgIC4uLmlzcyxcbiAgICAgICAgICAgICAgcGF0aDogaXNzLnBhdGggPyBbJHtrfSwgLi4uaXNzLnBhdGhdIDogWyR7a31dXG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCR7aWR9LnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoJHtrfSBpbiBpbnB1dCkge1xuICAgICAgICAgICAgbmV3UmVzdWx0WyR7a31dID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdSZXN1bHRbJHtrfV0gPSAke2lkfS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgIGApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGUoYFxuICAgICAgICBpZiAoJHtpZH0uaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgIHBheWxvYWQuaXNzdWVzID0gcGF5bG9hZC5pc3N1ZXMuY29uY2F0KCR7aWR9Lmlzc3Vlcy5tYXAoaXNzID0+ICh7XG4gICAgICAgICAgICAuLi5pc3MsXG4gICAgICAgICAgICBwYXRoOiBpc3MucGF0aCA/IFske2t9LCAuLi5pc3MucGF0aF0gOiBbJHtrfV1cbiAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoJHtpZH0udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgke2t9IGluIGlucHV0KSB7XG4gICAgICAgICAgICBuZXdSZXN1bHRbJHtrfV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1Jlc3VsdFske2t9XSA9ICR7aWR9LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZG9jLndyaXRlKGBwYXlsb2FkLnZhbHVlID0gbmV3UmVzdWx0O2ApO1xuICAgICAgICBkb2Mud3JpdGUoYHJldHVybiBwYXlsb2FkO2ApO1xuICAgICAgICBjb25zdCBmbiA9IGRvYy5jb21waWxlKCk7XG4gICAgICAgIHJldHVybiAocGF5bG9hZCwgY3R4KT0+Zm4oc2hhcGUsIHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbiAgICBsZXQgZmFzdHBhc3M7XG4gICAgY29uc3QgaXNPYmplY3QgPSB1dGlsLmlzT2JqZWN0O1xuICAgIGNvbnN0IGppdCA9ICFjb3JlLmdsb2JhbENvbmZpZy5qaXRsZXNzO1xuICAgIGNvbnN0IGFsbG93c0V2YWwgPSB1dGlsLmFsbG93c0V2YWw7XG4gICAgY29uc3QgZmFzdEVuYWJsZWQgPSBqaXQgJiYgYWxsb3dzRXZhbC52YWx1ZTsgLy8gJiYgIWRlZi5jYXRjaGFsbDtcbiAgICBjb25zdCBjYXRjaGFsbCA9IGRlZi5jYXRjaGFsbDtcbiAgICBsZXQgdmFsdWU7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgdmFsdWUgPz8gKHZhbHVlID0gX25vcm1hbGl6ZWQudmFsdWUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGppdCAmJiBmYXN0RW5hYmxlZCAmJiBjdHg/LmFzeW5jID09PSBmYWxzZSAmJiBjdHguaml0bGVzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gYWx3YXlzIHN5bmNocm9ub3VzXG4gICAgICAgICAgICBpZiAoIWZhc3RwYXNzKSBmYXN0cGFzcyA9IGdlbmVyYXRlRmFzdHBhc3MoZGVmLnNoYXBlKTtcbiAgICAgICAgICAgIHBheWxvYWQgPSBmYXN0cGFzcyhwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKCFjYXRjaGFsbCkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQ2F0Y2hhbGwoW10sIGlucHV0LCBwYXlsb2FkLCBjdHgsIHZhbHVlLCBpbnN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXJQYXJzZShwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBmaW5hbCwgaW5zdCwgY3R4KSB7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cyl7XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZmluYWwudmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gZmluYWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9uYWJvcnRlZCA9IHJlc3VsdHMuZmlsdGVyKChyKT0+IXV0aWwuYWJvcnRlZChyKSk7XG4gICAgaWYgKG5vbmFib3J0ZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbmFsLnZhbHVlID0gbm9uYWJvcnRlZFswXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG5vbmFib3J0ZWRbMF07XG4gICAgfVxuICAgIGZpbmFsLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgY29kZTogXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgICAgIGlucHV0OiBmaW5hbC52YWx1ZSxcbiAgICAgICAgaW5zdCxcbiAgICAgICAgZXJyb3JzOiByZXN1bHRzLm1hcCgocmVzdWx0KT0+cmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgIH0pO1xuICAgIHJldHVybiBmaW5hbDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kVW5pb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5vcHRpb25zLnNvbWUoKG8pPT5vLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikgPyBcIm9wdGlvbmFsXCIgOiB1bmRlZmluZWQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYub3B0aW9ucy5zb21lKChvKT0+by5fem9kLm9wdG91dCA9PT0gXCJvcHRpb25hbFwiKSA/IFwib3B0aW9uYWxcIiA6IHVuZGVmaW5lZCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PntcbiAgICAgICAgaWYgKGRlZi5vcHRpb25zLmV2ZXJ5KChvKT0+by5fem9kLnZhbHVlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2V0KGRlZi5vcHRpb25zLmZsYXRNYXAoKG9wdGlvbik9PkFycmF5LmZyb20ob3B0aW9uLl96b2QudmFsdWVzKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT57XG4gICAgICAgIGlmIChkZWYub3B0aW9ucy5ldmVyeSgobyk9Pm8uX3pvZC5wYXR0ZXJuKSkge1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybnMgPSBkZWYub3B0aW9ucy5tYXAoKG8pPT5vLl96b2QucGF0dGVybik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXigke3BhdHRlcm5zLm1hcCgocCk9PnV0aWwuY2xlYW5SZWdleChwLnNvdXJjZSkpLmpvaW4oXCJ8XCIpfSkkYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBjb25zdCBzaW5nbGUgPSBkZWYub3B0aW9ucy5sZW5ndGggPT09IDE7XG4gICAgY29uc3QgZmlyc3QgPSBkZWYub3B0aW9uc1swXS5fem9kLnJ1bjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoc2luZ2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3QocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYXN5bmMpIHJldHVybiBoYW5kbGVVbmlvblJlc3VsdHMocmVzdWx0cywgcGF5bG9hZCwgaW5zdCwgY3R4KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdHMpLnRoZW4oKHJlc3VsdHMpPT57XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlVW5pb25SZXN1bHRzKHJlc3VsdHMsIHBheWxvYWQsIGluc3QsIGN0eCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZUV4Y2x1c2l2ZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBmaW5hbCwgaW5zdCwgY3R4KSB7XG4gICAgY29uc3Qgc3VjY2Vzc2VzID0gcmVzdWx0cy5maWx0ZXIoKHIpPT5yLmlzc3Vlcy5sZW5ndGggPT09IDApO1xuICAgIGlmIChzdWNjZXNzZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbmFsLnZhbHVlID0gc3VjY2Vzc2VzWzBdLnZhbHVlO1xuICAgICAgICByZXR1cm4gZmluYWw7XG4gICAgfVxuICAgIGlmIChzdWNjZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIE5vIG1hdGNoZXMgLSBzYW1lIGFzIHJlZ3VsYXIgdW5pb25cbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgICAgICAgICBpbnB1dDogZmluYWwudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgZXJyb3JzOiByZXN1bHRzLm1hcCgocmVzdWx0KT0+cmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNdWx0aXBsZSBtYXRjaGVzIC0gZXhjbHVzaXZlIHVuaW9uIGZhaWx1cmVcbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgICAgICAgICBpbnB1dDogZmluYWwudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmaW5hbDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kWG9yID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RYb3JcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIGRlZi5pbmNsdXNpdmUgPSBmYWxzZTtcbiAgICBjb25zdCBzaW5nbGUgPSBkZWYub3B0aW9ucy5sZW5ndGggPT09IDE7XG4gICAgY29uc3QgZmlyc3QgPSBkZWYub3B0aW9uc1swXS5fem9kLnJ1bjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoc2luZ2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3QocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhc3luYykgcmV0dXJuIGhhbmRsZUV4Y2x1c2l2ZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBwYXlsb2FkLCBpbnN0LCBjdHgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVzdWx0cykudGhlbigocmVzdWx0cyk9PntcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVFeGNsdXNpdmVVbmlvblJlc3VsdHMocmVzdWx0cywgcGF5bG9hZCwgaW5zdCwgY3R4KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2REaXNjcmltaW5hdGVkVW5pb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZERpc2NyaW1pbmF0ZWRVbmlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5pbmNsdXNpdmUgPSBmYWxzZTtcbiAgICAkWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IF9zdXBlciA9IGluc3QuX3pvZC5wYXJzZTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PntcbiAgICAgICAgY29uc3QgcHJvcFZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCBwdiA9IG9wdGlvbi5fem9kLnByb3BWYWx1ZXM7XG4gICAgICAgICAgICBpZiAoIXB2IHx8IE9iamVjdC5rZXlzKHB2KS5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkaXNjcmltaW5hdGVkIHVuaW9uIG9wdGlvbiBhdCBpbmRleCBcIiR7ZGVmLm9wdGlvbnMuaW5kZXhPZihvcHRpb24pfVwiYCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhwdikpe1xuICAgICAgICAgICAgICAgIGlmICghcHJvcFZhbHVlc1trXSkgcHJvcFZhbHVlc1trXSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2KXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlc1trXS5hZGQodmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BWYWx1ZXM7XG4gICAgfSk7XG4gICAgY29uc3QgZGlzYyA9IHV0aWwuY2FjaGVkKCgpPT57XG4gICAgICAgIGNvbnN0IG9wdHMgPSBkZWYub3B0aW9ucztcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG8gb2Ygb3B0cyl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvLl96b2QucHJvcFZhbHVlcz8uW2RlZi5kaXNjcmltaW5hdG9yXTtcbiAgICAgICAgICAgIGlmICghdmFsdWVzIHx8IHZhbHVlcy5zaXplID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggXCIke2RlZi5vcHRpb25zLmluZGV4T2Yobyl9XCJgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpe1xuICAgICAgICAgICAgICAgIGlmIChtYXAuaGFzKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGRpc2NyaW1pbmF0b3IgdmFsdWUgXCIke1N0cmluZyh2KX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXAuc2V0KHYsIG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIXV0aWwuaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0ID0gZGlzYy52YWx1ZS5nZXQoaW5wdXQ/LltkZWYuZGlzY3JpbWluYXRvcl0pO1xuICAgICAgICBpZiAob3B0KSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0Ll96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi51bmlvbkZhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gbWF0Y2hpbmcgZGlzY3JpbWluYXRvclxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF91bmlvblwiLFxuICAgICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICAgIG5vdGU6IFwiTm8gbWF0Y2hpbmcgZGlzY3JpbWluYXRvclwiLFxuICAgICAgICAgICAgZGlzY3JpbWluYXRvcjogZGVmLmRpc2NyaW1pbmF0b3IsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICBkZWYuZGlzY3JpbWluYXRvclxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSW50ZXJzZWN0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJbnRlcnNlY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGVmLmxlZnQuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IGlucHV0LFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBjb25zdCByaWdodCA9IGRlZi5yaWdodC5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogaW5wdXQsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGNvbnN0IGFzeW5jID0gbGVmdCBpbnN0YW5jZW9mIFByb21pc2UgfHwgcmlnaHQgaW5zdGFuY2VvZiBQcm9taXNlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgXSkudGhlbigoW2xlZnQsIHJpZ2h0XSk9PntcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlSW50ZXJzZWN0aW9uUmVzdWx0cyhwYXlsb2FkLCBsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlSW50ZXJzZWN0aW9uUmVzdWx0cyhwYXlsb2FkLCBsZWZ0LCByaWdodCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gbWVyZ2VWYWx1ZXMoYSwgYikge1xuICAgIC8vIGNvbnN0IGFUeXBlID0gcGFyc2UudChhKTtcbiAgICAvLyBjb25zdCBiVHlwZSA9IHBhcnNlLnQoYik7XG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogYVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUgJiYgK2EgPT09ICtiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IGFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHV0aWwuaXNQbGFpbk9iamVjdChhKSAmJiB1dGlsLmlzUGxhaW5PYmplY3QoYikpIHtcbiAgICAgICAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5cyA9IE9iamVjdC5rZXlzKGEpLmZpbHRlcigoa2V5KT0+YktleXMuaW5kZXhPZihrZXkpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHtcbiAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAuLi5iXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXJlZEtleXMpe1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXJnZUVycm9yUGF0aDogW1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2hhcmVkVmFsdWUubWVyZ2VFcnJvclBhdGhcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogbmV3T2JqXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0FycmF5ID0gW107XG4gICAgICAgIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGEubGVuZ3RoOyBpbmRleCsrKXtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BID0gYVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBpdGVtQiA9IGJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2hhcmVkVmFsdWUubWVyZ2VFcnJvclBhdGhcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdBcnJheS5wdXNoKHNoYXJlZFZhbHVlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IG5ld0FycmF5XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtdXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUludGVyc2VjdGlvblJlc3VsdHMocmVzdWx0LCBsZWZ0LCByaWdodCkge1xuICAgIC8vIFRyYWNrIHdoaWNoIHNpZGUocykgcmVwb3J0IGVhY2gga2V5IGFzIHVucmVjb2duaXplZFxuICAgIGNvbnN0IHVucmVjS2V5cyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdW5yZWNJc3N1ZTtcbiAgICBmb3IgKGNvbnN0IGlzcyBvZiBsZWZ0Lmlzc3Vlcyl7XG4gICAgICAgIGlmIChpc3MuY29kZSA9PT0gXCJ1bnJlY29nbml6ZWRfa2V5c1wiKSB7XG4gICAgICAgICAgICB1bnJlY0lzc3VlID8/ICh1bnJlY0lzc3VlID0gaXNzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBpc3Mua2V5cyl7XG4gICAgICAgICAgICAgICAgaWYgKCF1bnJlY0tleXMuaGFzKGspKSB1bnJlY0tleXMuc2V0KGssIHt9KTtcbiAgICAgICAgICAgICAgICB1bnJlY0tleXMuZ2V0KGspLmwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKGlzcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBpc3Mgb2YgcmlnaHQuaXNzdWVzKXtcbiAgICAgICAgaWYgKGlzcy5jb2RlID09PSBcInVucmVjb2duaXplZF9rZXlzXCIpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBpc3Mua2V5cyl7XG4gICAgICAgICAgICAgICAgaWYgKCF1bnJlY0tleXMuaGFzKGspKSB1bnJlY0tleXMuc2V0KGssIHt9KTtcbiAgICAgICAgICAgICAgICB1bnJlY0tleXMuZ2V0KGspLnIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKGlzcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVwb3J0IG9ubHkga2V5cyB1bnJlY29nbml6ZWQgYnkgQk9USCBzaWRlc1xuICAgIGNvbnN0IGJvdGhLZXlzID0gW1xuICAgICAgICAuLi51bnJlY0tleXNcbiAgICBdLmZpbHRlcigoWywgZl0pPT5mLmwgJiYgZi5yKS5tYXAoKFtrXSk9PmspO1xuICAgIGlmIChib3RoS2V5cy5sZW5ndGggJiYgdW5yZWNJc3N1ZSkge1xuICAgICAgICByZXN1bHQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgLi4udW5yZWNJc3N1ZSxcbiAgICAgICAgICAgIGtleXM6IGJvdGhLZXlzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodXRpbC5hYm9ydGVkKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VWYWx1ZXMobGVmdC52YWx1ZSwgcmlnaHQudmFsdWUpO1xuICAgIGlmICghbWVyZ2VkLnZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5tZXJnYWJsZSBpbnRlcnNlY3Rpb24uIEVycm9yIHBhdGg6IGAgKyBgJHtKU09OLnN0cmluZ2lmeShtZXJnZWQubWVyZ2VFcnJvclBhdGgpfWApO1xuICAgIH1cbiAgICByZXN1bHQudmFsdWUgPSBtZXJnZWQuZGF0YTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0ICRab2RUdXBsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVHVwbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgaXRlbXMgPSBkZWYuaXRlbXM7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInR1cGxlXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gW107XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIGNvbnN0IHJldmVyc2VkSW5kZXggPSBbXG4gICAgICAgICAgICAuLi5pdGVtc1xuICAgICAgICBdLnJldmVyc2UoKS5maW5kSW5kZXgoKGl0ZW0pPT5pdGVtLl96b2Qub3B0aW4gIT09IFwib3B0aW9uYWxcIik7XG4gICAgICAgIGNvbnN0IG9wdFN0YXJ0ID0gcmV2ZXJzZWRJbmRleCA9PT0gLTEgPyAwIDogaXRlbXMubGVuZ3RoIC0gcmV2ZXJzZWRJbmRleDtcbiAgICAgICAgaWYgKCFkZWYucmVzdCkge1xuICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gaW5wdXQubGVuZ3RoID4gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBpbnB1dC5sZW5ndGggPCBvcHRTdGFydCAtIDE7XG4gICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRvb0JpZyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogaXRlbXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW46IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBpID0gLTE7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcyl7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBpZiAoaSA+PSBpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSBvcHRTdGFydCkgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVtLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXRbaV0sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVUdXBsZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYucmVzdCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdCA9IGlucHV0LnNsaWNlKGl0ZW1zLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHJlc3Qpe1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYucmVzdC5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbCxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9tcy5sZW5ndGgpIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgZmluYWwsIGluZGV4KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGluZGV4LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgfVxuICAgIGZpbmFsLnZhbHVlW2luZGV4XSA9IHJlc3VsdC52YWx1ZTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kUmVjb3JkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RSZWNvcmRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIXV0aWwuaXNQbGFpbk9iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInJlY29yZFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBkZWYua2V5VHlwZS5fem9kLnZhbHVlcztcbiAgICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHt9O1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHZhbHVlcyl7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGtleSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZEtleXMuYWRkKHR5cGVvZiBrZXkgPT09IFwibnVtYmVyXCIgPyBrZXkudG9TdHJpbmcoKSA6IGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi52YWx1ZVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0W2tleV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdW5yZWNvZ25pemVkO1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBpbnB1dCl7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWNvcmRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVucmVjb2duaXplZCA9IHVucmVjb2duaXplZCA/PyBbXTtcbiAgICAgICAgICAgICAgICAgICAgdW5yZWNvZ25pemVkLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW5yZWNvZ25pemVkICYmIHVucmVjb2duaXplZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgIGtleXM6IHVucmVjb2duaXplZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKGlucHV0KSl7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJfX3Byb3RvX19cIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGtleVJlc3VsdCA9IGRlZi5rZXlUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTnVtZXJpYyBzdHJpbmcgZmFsbGJhY2s6IGlmIGtleSBpcyBhIG51bWVyaWMgc3RyaW5nIGFuZCBmYWlsZWQsIHJldHJ5IHdpdGggTnVtYmVyKGtleSlcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgei5udW1iZXIoKSwgei5saXRlcmFsKFsxLCAyLCAzXSksIGFuZCB1bmlvbnMgY29udGFpbmluZyBudW1lcmljIGxpdGVyYWxzXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tOdW1lcmljS2V5ID0gdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiAmJiByZWdleGVzLm51bWJlci50ZXN0KGtleSkgJiYga2V5UmVzdWx0Lmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrTnVtZXJpY0tleSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeVJlc3VsdCA9IGRlZi5rZXlUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIoa2V5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlSZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5UmVzdWx0ID0gcmV0cnlSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtleVJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWYubW9kZSA9PT0gXCJsb29zZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHRocm91Z2ggdW5jaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleV0gPSBpbnB1dFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBcInN0cmljdFwiIGJlaGF2aW9yOiBlcnJvciBvbiBpbnZhbGlkIGtleVxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2tleVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjogXCJyZWNvcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGtleVJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDoga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dFtrZXldLFxuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZVtrZXlSZXN1bHQudmFsdWVdID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5UmVzdWx0LnZhbHVlXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE1hcCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTWFwXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJtYXBcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5wdXQpe1xuICAgICAgICAgICAgY29uc3Qga2V5UmVzdWx0ID0gZGVmLmtleVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAoa2V5UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSB8fCB2YWx1ZVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAga2V5UmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVJlc3VsdFxuICAgICAgICAgICAgICAgIF0pLnRoZW4oKFtrZXlSZXN1bHQsIHZhbHVlUmVzdWx0XSk9PntcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWFwUmVzdWx0KGtleVJlc3VsdCwgdmFsdWVSZXN1bHQsIHBheWxvYWQsIGtleSwgaW5wdXQsIGluc3QsIGN0eCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVNYXBSZXN1bHQoa2V5UmVzdWx0LCB2YWx1ZVJlc3VsdCwgcGF5bG9hZCwga2V5LCBpbnB1dCwgaW5zdCwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVNYXBSZXN1bHQoa2V5UmVzdWx0LCB2YWx1ZVJlc3VsdCwgZmluYWwsIGtleSwgaW5wdXQsIGluc3QsIGN0eCkge1xuICAgIGlmIChrZXlSZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodXRpbC5wcm9wZXJ0eUtleVR5cGVzLmhhcyh0eXBlb2Yga2V5KSkge1xuICAgICAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCBrZXlSZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2tleVwiLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJtYXBcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGlzc3Vlczoga2V5UmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsdWVSZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodXRpbC5wcm9wZXJ0eUtleVR5cGVzLmhhcyh0eXBlb2Yga2V5KSkge1xuICAgICAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCB2YWx1ZVJlc3VsdC5pc3N1ZXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwibWFwXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2VsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIGlzc3VlczogdmFsdWVSZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmFsLnZhbHVlLnNldChrZXlSZXN1bHQudmFsdWUsIHZhbHVlUmVzdWx0LnZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kU2V0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTZXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBwYXlsb2FkLnZhbHVlID0gbmV3IFNldCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpe1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlU2V0UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBoYW5kbGVTZXRSZXN1bHQocmVzdWx0LCBwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVTZXRSZXN1bHQocmVzdWx0LCBmaW5hbCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi5yZXN1bHQuaXNzdWVzKTtcbiAgICB9XG4gICAgZmluYWwudmFsdWUuYWRkKHJlc3VsdC52YWx1ZSk7XG59XG5leHBvcnQgY29uc3QgJFpvZEVudW0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEVudW1cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgdmFsdWVzID0gdXRpbC5nZXRFbnVtVmFsdWVzKGRlZi5lbnRyaWVzKTtcbiAgICBjb25zdCB2YWx1ZXNTZXQgPSBuZXcgU2V0KHZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnZhbHVlcyA9IHZhbHVlc1NldDtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IG5ldyBSZWdFeHAoYF4oJHt2YWx1ZXMuZmlsdGVyKChrKT0+dXRpbC5wcm9wZXJ0eUtleVR5cGVzLmhhcyh0eXBlb2YgaykpLm1hcCgobyk9PnR5cGVvZiBvID09PSBcInN0cmluZ1wiID8gdXRpbC5lc2NhcGVSZWdleChvKSA6IG8udG9TdHJpbmcoKSkuam9pbihcInxcIil9KSRgKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWVzU2V0LmhhcyhpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTGl0ZXJhbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpZiAoZGVmLnZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNyZWF0ZSBsaXRlcmFsIHNjaGVtYSB3aXRoIG5vIHZhbGlkIHZhbHVlc1wiKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFNldChkZWYudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QudmFsdWVzID0gdmFsdWVzO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gbmV3IFJlZ0V4cChgXigke2RlZi52YWx1ZXMubWFwKChvKT0+dHlwZW9mIG8gPT09IFwic3RyaW5nXCIgPyB1dGlsLmVzY2FwZVJlZ2V4KG8pIDogbyA/IHV0aWwuZXNjYXBlUmVnZXgoby50b1N0cmluZygpKSA6IFN0cmluZyhvKSkuam9pbihcInxcIil9KSRgKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWVzLmhhcyhpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IGRlZi52YWx1ZXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRmlsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRmlsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGUpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImZpbGVcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVHJhbnNmb3JtID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RUcmFuc2Zvcm1cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEVuY29kZUVycm9yKGluc3QuY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX291dCA9IGRlZi50cmFuc2Zvcm0ocGF5bG9hZC52YWx1ZSwgcGF5bG9hZCk7XG4gICAgICAgIGlmIChjdHguYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IF9vdXQgaW5zdGFuY2VvZiBQcm9taXNlID8gX291dCA6IFByb21pc2UucmVzb2x2ZShfb3V0KTtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQudGhlbigob3V0cHV0KT0+e1xuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX291dCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IF9vdXQ7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZU9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGggJiYgaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kT3B0aW9uYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICBpbnN0Ll96b2Qub3B0b3V0ID0gXCJvcHRpb25hbFwiO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT57XG4gICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzID8gbmV3IFNldChbXG4gICAgICAgICAgICAuLi5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzLFxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgIF0pIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicGF0dGVyblwiLCAoKT0+e1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gZGVmLmlubmVyVHlwZS5fem9kLnBhdHRlcm47XG4gICAgICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IFJlZ0V4cChgXigke3V0aWwuY2xlYW5SZWdleChwYXR0ZXJuLnNvdXJjZSl9KT8kYCkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGRlZi5pbm5lclR5cGUuX3pvZC5vcHRpbiA9PT0gXCJvcHRpb25hbFwiKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIHJlc3VsdC50aGVuKChyKT0+aGFuZGxlT3B0aW9uYWxSZXN1bHQociwgcGF5bG9hZC52YWx1ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgcGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEV4YWN0T3B0aW9uYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEV4YWN0T3B0aW9uYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBDYWxsIHBhcmVudCBpbml0IC0gaW5oZXJpdHMgb3B0aW4vb3B0b3V0ID0gXCJvcHRpb25hbFwiXG4gICAgJFpvZE9wdGlvbmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICAvLyBPdmVycmlkZSB2YWx1ZXMvcGF0dGVybiB0byBOT1QgYWRkIHVuZGVmaW5lZFxuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInBhdHRlcm5cIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuKTtcbiAgICAvLyBPdmVycmlkZSBwYXJzZSB0byBqdXN0IGRlbGVnYXRlIChubyB1bmRlZmluZWQgaGFuZGxpbmcpXG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE51bGxhYmxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdWxsYWJsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0aW4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0b3V0KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInBhdHRlcm5cIiwgKCk9PntcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IGRlZi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuO1xuICAgICAgICByZXR1cm4gcGF0dGVybiA/IG5ldyBSZWdFeHAoYF4oJHt1dGlsLmNsZWFuUmVnZXgocGF0dGVybi5zb3VyY2UpfXxudWxsKSRgKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+e1xuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyA/IG5ldyBTZXQoW1xuICAgICAgICAgICAgLi4uZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgXSkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gKGRlY29kZSk6IGFsbG93IG51bGwgdG8gcGFzcyB0aHJvdWdoXG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlID09PSBudWxsKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZERlZmF1bHQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZERlZmF1bHRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgLy8gaW5zdC5fem9kLnFpbiA9IFwidHJ1ZVwiO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3J3YXJkIGRpcmVjdGlvbiAoZGVjb2RlKTogYXBwbHkgZGVmYXVsdHMgZm9yIHVuZGVmaW5lZCBpbnB1dFxuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogJFpvZERlZmF1bHQgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBpbW1lZGlhdGVseSBpbiBmb3J3YXJkIGRpcmVjdGlvbi5cbiAgICAgICAgICAgICAqIEl0IGRvZXNuJ3QgcGFzcyB0aGUgZGVmYXVsdCB2YWx1ZSBpbnRvIHRoZSB2YWxpZGF0b3IgKFwicHJlZmF1bHRcIikuIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIHBhc3MgdGhlIGRlZmF1bHQgdmFsdWUgdGhyb3VnaCB2YWxpZGF0aW9uLiBUaGUgdmFsaWRpdHkgb2YgdGhlIGRlZmF1bHQgaXMgZW5mb3JjZWQgYnkgVHlwZVNjcmlwdCBzdGF0aWNhbGx5LiBPdGhlcndpc2UsIGl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGVuc3VyZSB0aGUgZGVmYXVsdCBpcyB2YWxpZC4gSW4gdGhlIGNhc2Ugb2YgcGlwZXMgd2l0aCBkaXZlcmdlbnQgaW4vb3V0IHR5cGVzLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGRlZmF1bHQgb24gdGhlIGBpbmAgc2NoZW1hIG9mIHlvdXIgWm9kUGlwZSB0byBzZXQgYSBcInByZWZhdWx0XCIgZm9yIHRoZSBwaXBlLiAgICovIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uOiBjb250aW51ZSB3aXRoIGRlZmF1bHQgaGFuZGxpbmdcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVEZWZhdWx0UmVzdWx0KHJlc3VsdCwgZGVmKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZURlZmF1bHRSZXN1bHQocmVzdWx0LCBkZWYpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZURlZmF1bHRSZXN1bHQocGF5bG9hZCwgZGVmKSB7XG4gICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5leHBvcnQgY29uc3QgJFpvZFByZWZhdWx0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RQcmVmYXVsdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub3B0aW4gPSBcIm9wdGlvbmFsXCI7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gKGRlY29kZSk6IGFwcGx5IHByZWZhdWx0IGZvciB1bmRlZmluZWQgaW5wdXRcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5vbk9wdGlvbmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROb25PcHRpb25hbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+e1xuICAgICAgICBjb25zdCB2ID0gZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcztcbiAgICAgICAgcmV0dXJuIHYgPyBuZXcgU2V0KFtcbiAgICAgICAgICAgIC4uLnZcbiAgICAgICAgXS5maWx0ZXIoKHgpPT54ICE9PSB1bmRlZmluZWQpKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZU5vbk9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgaW5zdCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVOb25PcHRpb25hbFJlc3VsdChyZXN1bHQsIGluc3QpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZU5vbk9wdGlvbmFsUmVzdWx0KHBheWxvYWQsIGluc3QpIHtcbiAgICBpZiAoIXBheWxvYWQuaXNzdWVzLmxlbmd0aCAmJiBwYXlsb2FkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5leHBvcnQgY29uc3QgJFpvZFN1Y2Nlc3MgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFN1Y2Nlc3NcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEVuY29kZUVycm9yKFwiWm9kU3VjY2Vzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PntcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0Lmlzc3Vlcy5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0Lmlzc3Vlcy5sZW5ndGggPT09IDA7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2F0Y2ggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENhdGNoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uIChkZWNvZGUpOiBhcHBseSBjYXRjaCBsb2dpY1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PntcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5hTiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTmFOXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc05hTihwYXlsb2FkLnZhbHVlKSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJuYW5cIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kUGlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUGlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QudmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW4uX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5vdXQuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicHJvcFZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QucHJvcFZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBkZWYub3V0Ll96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmlnaHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0LnRoZW4oKHJpZ2h0KT0+aGFuZGxlUGlwZVJlc3VsdChyaWdodCwgZGVmLmluLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVQaXBlUmVzdWx0KHJpZ2h0LCBkZWYuaW4sIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdCA9IGRlZi5pbi5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWZ0LnRoZW4oKGxlZnQpPT5oYW5kbGVQaXBlUmVzdWx0KGxlZnQsIGRlZi5vdXQsIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVQaXBlUmVzdWx0KGxlZnQsIGRlZi5vdXQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlUGlwZVJlc3VsdChsZWZ0LCBuZXh0LCBjdHgpIHtcbiAgICBpZiAobGVmdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZnVydGhlciBjaGVja3NcbiAgICAgICAgbGVmdC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Ll96b2QucnVuKHtcbiAgICAgICAgdmFsdWU6IGxlZnQudmFsdWUsXG4gICAgICAgIGlzc3VlczogbGVmdC5pc3N1ZXNcbiAgICB9LCBjdHgpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RDb2RlYyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ29kZWNcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbi5fem9kLnZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLmluLl96b2Qub3B0aW4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYub3V0Ll96b2Qub3B0b3V0KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PmRlZi5pbi5fem9kLnByb3BWYWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGN0eC5kaXJlY3Rpb24gfHwgXCJmb3J3YXJkXCI7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IFwiZm9yd2FyZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gZGVmLmluLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdC50aGVuKChsZWZ0KT0+aGFuZGxlQ29kZWNBUmVzdWx0KGxlZnQsIGRlZiwgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQ29kZWNBUmVzdWx0KGxlZnQsIGRlZiwgY3R4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZGVmLm91dC5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJpZ2h0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByaWdodC50aGVuKChyaWdodCk9PmhhbmRsZUNvZGVjQVJlc3VsdChyaWdodCwgZGVmLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVDb2RlY0FSZXN1bHQocmlnaHQsIGRlZiwgY3R4KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZUNvZGVjQVJlc3VsdChyZXN1bHQsIGRlZiwgY3R4KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZnVydGhlciBjaGVja3NcbiAgICAgICAgcmVzdWx0LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBjdHguZGlyZWN0aW9uIHx8IFwiZm9yd2FyZFwiO1xuICAgIGlmIChkaXJlY3Rpb24gPT09IFwiZm9yd2FyZFwiKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gZGVmLnRyYW5zZm9ybShyZXN1bHQudmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZC50aGVuKCh2YWx1ZSk9PmhhbmRsZUNvZGVjVHhSZXN1bHQocmVzdWx0LCB2YWx1ZSwgZGVmLm91dCwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZUNvZGVjVHhSZXN1bHQocmVzdWx0LCB0cmFuc2Zvcm1lZCwgZGVmLm91dCwgY3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IGRlZi5yZXZlcnNlVHJhbnNmb3JtKHJlc3VsdC52YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkLnRoZW4oKHZhbHVlKT0+aGFuZGxlQ29kZWNUeFJlc3VsdChyZXN1bHQsIHZhbHVlLCBkZWYuaW4sIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVDb2RlY1R4UmVzdWx0KHJlc3VsdCwgdHJhbnNmb3JtZWQsIGRlZi5pbiwgY3R4KTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVDb2RlY1R4UmVzdWx0KGxlZnQsIHZhbHVlLCBuZXh0U2NoZW1hLCBjdHgpIHtcbiAgICAvLyBDaGVjayBpZiB0cmFuc2Zvcm0gYWRkZWQgYW55IGlzc3Vlc1xuICAgIGlmIChsZWZ0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgbGVmdC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0U2NoZW1hLl96b2QucnVuKHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGlzc3VlczogbGVmdC5pc3N1ZXNcbiAgICB9LCBjdHgpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RSZWFkb25seSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUmVhZG9ubHlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QucHJvcFZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbm5lclR5cGU/Ll96b2Q/Lm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLmlubmVyVHlwZT8uX3pvZD8ub3B0b3V0KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihoYW5kbGVSZWFkb25seVJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlYWRvbmx5UmVzdWx0KHJlc3VsdCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlUmVhZG9ubHlSZXN1bHQocGF5bG9hZCkge1xuICAgIHBheWxvYWQudmFsdWUgPSBPYmplY3QuZnJlZXplKHBheWxvYWQudmFsdWUpO1xuICAgIHJldHVybiBwYXlsb2FkO1xufVxuZXhwb3J0IGNvbnN0ICRab2RUZW1wbGF0ZUxpdGVyYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFRlbXBsYXRlTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCByZWdleFBhcnRzID0gW107XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGRlZi5wYXJ0cyl7XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiBwYXJ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBpcyBab2Qgc2NoZW1hXG4gICAgICAgICAgICBpZiAoIXBhcnQuX3pvZC5wYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgKCFzb3VyY2UpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydCwgbm8gcGF0dGVybiBmb3VuZDogJHtbXG4gICAgICAgICAgICAgICAgICAgIC4uLnBhcnQuX3pvZC50cmFpdHNcbiAgICAgICAgICAgICAgICBdLnNoaWZ0KCl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBwYXJ0Ll96b2QucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCA/IHBhcnQuX3pvZC5wYXR0ZXJuLnNvdXJjZSA6IHBhcnQuX3pvZC5wYXR0ZXJuO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQ6ICR7cGFydC5fem9kLnRyYWl0c31gKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gc291cmNlLnN0YXJ0c1dpdGgoXCJeXCIpID8gMSA6IDA7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBzb3VyY2UuZW5kc1dpdGgoXCIkXCIpID8gc291cmNlLmxlbmd0aCAtIDEgOiBzb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgcmVnZXhQYXJ0cy5wdXNoKHNvdXJjZS5zbGljZShzdGFydCwgZW5kKSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gbnVsbCB8fCB1dGlsLnByaW1pdGl2ZVR5cGVzLmhhcyh0eXBlb2YgcGFydCkpIHtcbiAgICAgICAgICAgIHJlZ2V4UGFydHMucHVzaCh1dGlsLmVzY2FwZVJlZ2V4KGAke3BhcnR9YCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydDogJHtwYXJ0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7cmVnZXhQYXJ0cy5qb2luKFwiXCIpfSRgKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdC5fem9kLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKCFpbnN0Ll96b2QucGF0dGVybi50ZXN0KHBheWxvYWQudmFsdWUpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IGRlZi5mb3JtYXQgPz8gXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogaW5zdC5fem9kLnBhdHRlcm4uc291cmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRnVuY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEZ1bmN0aW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX2RlZiA9IGRlZjtcbiAgICBpbnN0Ll96b2QuZGVmID0gZGVmO1xuICAgIGluc3QuaW1wbGVtZW50ID0gKGZ1bmMpPT57XG4gICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbXBsZW1lbnQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBpbnN0Ll9kZWYuaW5wdXQgPyBwYXJzZShpbnN0Ll9kZWYuaW5wdXQsIGFyZ3MpIDogYXJncztcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZnVuYywgdGhpcywgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICBpZiAoaW5zdC5fZGVmLm91dHB1dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZShpbnN0Ll9kZWYub3V0cHV0LCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGluc3QuaW1wbGVtZW50QXN5bmMgPSAoZnVuYyk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImltcGxlbWVudEFzeW5jKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gaW5zdC5fZGVmLmlucHV0ID8gYXdhaXQgcGFyc2VBc3luYyhpbnN0Ll9kZWYuaW5wdXQsIGFyZ3MpIDogYXJncztcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJlZmxlY3QuYXBwbHkoZnVuYywgdGhpcywgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICBpZiAoaW5zdC5fZGVmLm91dHB1dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwYXJzZUFzeW5jKGluc3QuX2RlZi5vdXRwdXQsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH07XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiBvdXRwdXQgaXMgYSBwcm9taXNlIHR5cGUgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCB1c2UgYXN5bmMgaW1wbGVtZW50YXRpb25cbiAgICAgICAgY29uc3QgaGFzUHJvbWlzZU91dHB1dCA9IGluc3QuX2RlZi5vdXRwdXQgJiYgaW5zdC5fZGVmLm91dHB1dC5fem9kLmRlZi50eXBlID09PSBcInByb21pc2VcIjtcbiAgICAgICAgaWYgKGhhc1Byb21pc2VPdXRwdXQpIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBpbnN0LmltcGxlbWVudEFzeW5jKHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGluc3QuaW1wbGVtZW50KHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG4gICAgaW5zdC5pbnB1dCA9ICguLi5hcmdzKT0+e1xuICAgICAgICBjb25zdCBGID0gaW5zdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRih7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBuZXcgJFpvZFR1cGxlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogYXJnc1swXSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdDogYXJnc1sxXVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG91dHB1dDogaW5zdC5fZGVmLm91dHB1dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIGlucHV0OiBhcmdzWzBdLFxuICAgICAgICAgICAgb3V0cHV0OiBpbnN0Ll9kZWYub3V0cHV0XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaW5zdC5vdXRwdXQgPSAob3V0cHV0KT0+e1xuICAgICAgICBjb25zdCBGID0gaW5zdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBGKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIGlucHV0OiBpbnN0Ll9kZWYuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gaW5zdDtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RQcm9taXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RQcm9taXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocGF5bG9hZC52YWx1ZSkudGhlbigoaW5uZXIpPT5kZWYuaW5uZXJUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5uZXIsXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RMYXp5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RMYXp5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIC8vIGxldCBfaW5uZXJUeXBlITogYW55O1xuICAgIC8vIHV0aWwuZGVmaW5lTGF6eShkZWYsIFwiZ2V0dGVyXCIsICgpID0+IHtcbiAgICAvLyAgIGlmICghX2lubmVyVHlwZSkge1xuICAgIC8vICAgICBfaW5uZXJUeXBlID0gZGVmLmdldHRlcigpO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuICgpID0+IF9pbm5lclR5cGU7XG4gICAgLy8gfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJpbm5lclR5cGVcIiwgKCk9PmRlZi5nZXR0ZXIoKSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT5pbnN0Ll96b2QuaW5uZXJUeXBlPy5fem9kPy5wYXR0ZXJuKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGU/Ll96b2Q/LnByb3BWYWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGU/Ll96b2Q/Lm9wdGluID8/IHVuZGVmaW5lZCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGU/Ll96b2Q/Lm9wdG91dCA/PyB1bmRlZmluZWQpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlubmVyID0gaW5zdC5fem9kLmlubmVyVHlwZTtcbiAgICAgICAgcmV0dXJuIGlubmVyLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDdXN0b20gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEN1c3RvbVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNoZWNrcy4kWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgXyk9PntcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCByID0gZGVmLmZuKGlucHV0KTtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gci50aGVuKChyKT0+aGFuZGxlUmVmaW5lUmVzdWx0KHIsIHBheWxvYWQsIGlucHV0LCBpbnN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlUmVmaW5lUmVzdWx0KHIsIHBheWxvYWQsIGlucHV0LCBpbnN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVJlZmluZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGlucHV0LCBpbnN0KSB7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgY29uc3QgX2lzcyA9IHtcbiAgICAgICAgICAgIGNvZGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZi5wYXRoID8/IFtdXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgY29udGludWU6ICFpbnN0Ll96b2QuZGVmLmFib3J0XG4gICAgICAgIH07XG4gICAgICAgIGlmIChpbnN0Ll96b2QuZGVmLnBhcmFtcykgX2lzcy5wYXJhbXMgPSBpbnN0Ll96b2QuZGVmLnBhcmFtcztcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKF9pc3MpKTtcbiAgICB9XG59XG4iLCAidmFyIF9hO1xuZXhwb3J0IGNvbnN0ICRvdXRwdXQgPSBTeW1ib2woXCJab2RPdXRwdXRcIik7XG5leHBvcnQgY29uc3QgJGlucHV0ID0gU3ltYm9sKFwiWm9kSW5wdXRcIik7XG5leHBvcnQgY2xhc3MgJFpvZFJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLl9pZG1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgYWRkKHNjaGVtYSwgLi4uX21ldGEpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IF9tZXRhWzBdO1xuICAgICAgICB0aGlzLl9tYXAuc2V0KHNjaGVtYSwgbWV0YSk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiBtZXRhKSB7XG4gICAgICAgICAgICB0aGlzLl9pZG1hcC5zZXQobWV0YS5pZCwgc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuX2lkbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVtb3ZlKHNjaGVtYSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fbWFwLmdldChzY2hlbWEpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBcImlkXCIgaW4gbWV0YSkge1xuICAgICAgICAgICAgdGhpcy5faWRtYXAuZGVsZXRlKG1ldGEuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoc2NoZW1hKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldChzY2hlbWEpIHtcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuX21hcC5nZXQoc2NoZW1hKSBhcyBhbnk7XG4gICAgICAgIC8vIGluaGVyaXQgbWV0YWRhdGFcbiAgICAgICAgY29uc3QgcCA9IHNjaGVtYS5fem9kLnBhcmVudDtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIGNvbnN0IHBtID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0KHApID8/IHt9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGVsZXRlIHBtLmlkOyAvLyBkbyBub3QgaW5oZXJpdCBpZFxuICAgICAgICAgICAgY29uc3QgZiA9IHtcbiAgICAgICAgICAgICAgICAuLi5wbSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9tYXAuZ2V0KHNjaGVtYSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZikubGVuZ3RoID8gZiA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmdldChzY2hlbWEpO1xuICAgIH1cbiAgICBoYXMoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHNjaGVtYSk7XG4gICAgfVxufVxuLy8gcmVnaXN0cmllc1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdHJ5KCkge1xuICAgIHJldHVybiBuZXcgJFpvZFJlZ2lzdHJ5KCk7XG59XG4oX2EgPSBnbG9iYWxUaGlzKS5fX3pvZF9nbG9iYWxSZWdpc3RyeSA/PyAoX2EuX196b2RfZ2xvYmFsUmVnaXN0cnkgPSByZWdpc3RyeSgpKTtcbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IGdsb2JhbFRoaXMuX196b2RfZ2xvYmFsUmVnaXN0cnk7XG4iLCAiaW1wb3J0ICogYXMgY2hlY2tzIGZyb20gXCIuL2NoZWNrcy5qc1wiO1xuaW1wb3J0ICogYXMgcmVnaXN0cmllcyBmcm9tIFwiLi9yZWdpc3RyaWVzLmpzXCI7XG5pbXBvcnQgKiBhcyBzY2hlbWFzIGZyb20gXCIuL3NjaGVtYXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZFN0cmluZyhDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZW1haWwoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZW1haWxcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2d1aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZ3VpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdXVpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1dWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2NFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjYoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2NlwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjcoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF91cmwoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXJsXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9lbW9qaShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJlbW9qaVwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbmFub2lkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcIm5hbm9pZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfY3VpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjdWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jdWlkMihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjdWlkMlwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdWxpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1bGlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF94aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwieGlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9rc3VpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJrc3VpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaXB2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJpcHY0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9pcHY2KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImlwdjZcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX21hYyhDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJtYWNcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2NpZHJ2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjaWRydjRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2NpZHJ2NihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjaWRydjZcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2Jhc2U2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJiYXNlNjRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2Jhc2U2NHVybChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJiYXNlNjR1cmxcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2UxNjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZTE2NFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfand0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImp3dFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFRpbWVQcmVjaXNpb24gPSB7XG4gICAgQW55OiBudWxsLFxuICAgIE1pbnV0ZTogLTEsXG4gICAgU2Vjb25kOiAwLFxuICAgIE1pbGxpc2Vjb25kOiAzLFxuICAgIE1pY3Jvc2Vjb25kOiA2XG59O1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaXNvRGF0ZVRpbWUoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBvZmZzZXQ6IGZhbHNlLFxuICAgICAgICBsb2NhbDogZmFsc2UsXG4gICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaXNvRGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJkYXRlXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaXNvVGltZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ0aW1lXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9pc29EdXJhdGlvbihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJkdXJhdGlvblwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX251bWJlcihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2NvZXJjZWROdW1iZXIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2ludChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwic2FmZWludFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9mbG9hdDMyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2s6IFwibnVtYmVyX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJmbG9hdDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2Zsb2F0NjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcImZsb2F0NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfaW50MzIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcImludDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3VpbnQzMihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwidWludDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2Jvb2xlYW4oQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZEJvb2xlYW4oQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9iaWdpbnQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkQmlnaW50KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9pbnQ2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgIGNoZWNrOiBcImJpZ2ludF9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwiaW50NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdWludDY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgY2hlY2s6IFwiYmlnaW50X2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJ1aW50NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3ltYm9sKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzeW1ib2xcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdW5kZWZpbmVkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmRlZmluZWRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbnVsbChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVsbFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9hbnkoQ2xhc3MpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJhbnlcIlxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdW5rbm93bihDbGFzcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVua25vd25cIlxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbmV2ZXIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm5ldmVyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3ZvaWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInZvaWRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkRGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX25hbihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibmFuXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2x0KHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMZXNzVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImxlc3NfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbHRlKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMZXNzVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImxlc3NfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgeyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6Lmx0ZSgpYCBpbnN0ZWFkLiAqLyBfbHRlIGFzIF9tYXggfTtcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2d0KHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tHcmVhdGVyVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImdyZWF0ZXJfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZ3RlKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tHcmVhdGVyVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImdyZWF0ZXJfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgeyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6Lmd0ZSgpYCBpbnN0ZWFkLiAqLyBfZ3RlIGFzIF9taW4gfTtcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3Bvc2l0aXZlKHBhcmFtcykge1xuICAgIHJldHVybiBfZ3QoMCwgcGFyYW1zKTtcbn1cbi8vIG5lZ2F0aXZlXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9uZWdhdGl2ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gX2x0KDAsIHBhcmFtcyk7XG59XG4vLyBub25wb3NpdGl2ZVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbm9ucG9zaXRpdmUocGFyYW1zKSB7XG4gICAgcmV0dXJuIF9sdGUoMCwgcGFyYW1zKTtcbn1cbi8vIG5vbm5lZ2F0aXZlXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9ub25uZWdhdGl2ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gX2d0ZSgwLCBwYXJhbXMpO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTXVsdGlwbGVPZih7XG4gICAgICAgIGNoZWNrOiBcIm11bHRpcGxlX29mXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHZhbHVlXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9tYXhTaXplKG1heGltdW0sIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01heFNpemUoe1xuICAgICAgICBjaGVjazogXCJtYXhfc2l6ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBtYXhpbXVtXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9taW5TaXplKG1pbmltdW0sIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01pblNpemUoe1xuICAgICAgICBjaGVjazogXCJtaW5fc2l6ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBtaW5pbXVtXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9zaXplKHNpemUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1NpemVFcXVhbHMoe1xuICAgICAgICBjaGVjazogXCJzaXplX2VxdWFsc1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBzaXplXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9tYXhMZW5ndGgobWF4aW11bSwgcGFyYW1zKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY2hlY2tzLiRab2RDaGVja01heExlbmd0aCh7XG4gICAgICAgIGNoZWNrOiBcIm1heF9sZW5ndGhcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbWF4aW11bVxuICAgIH0pO1xuICAgIHJldHVybiBjaDtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX21pbkxlbmd0aChtaW5pbXVtLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNaW5MZW5ndGgoe1xuICAgICAgICBjaGVjazogXCJtaW5fbGVuZ3RoXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIG1pbmltdW1cbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2xlbmd0aChsZW5ndGgsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0xlbmd0aEVxdWFscyh7XG4gICAgICAgIGNoZWNrOiBcImxlbmd0aF9lcXVhbHNcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbGVuZ3RoXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9yZWdleChwYXR0ZXJuLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tSZWdleCh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcInJlZ2V4XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHBhdHRlcm5cbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2xvd2VyY2FzZShwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMb3dlckNhc2Uoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJsb3dlcmNhc2VcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdXBwZXJjYXNlKHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1VwcGVyQ2FzZSh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcInVwcGVyY2FzZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9pbmNsdWRlcyhpbmNsdWRlcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrSW5jbHVkZXMoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJpbmNsdWRlc1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBpbmNsdWRlc1xuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3RhcnRzV2l0aChwcmVmaXgsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1N0YXJ0c1dpdGgoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJzdGFydHNfd2l0aFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBwcmVmaXhcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2VuZHNXaXRoKHN1ZmZpeCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrRW5kc1dpdGgoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJlbmRzX3dpdGhcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgc3VmZml4XG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9wcm9wZXJ0eShwcm9wZXJ0eSwgc2NoZW1hLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tQcm9wZXJ0eSh7XG4gICAgICAgIGNoZWNrOiBcInByb3BlcnR5XCIsXG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX21pbWUodHlwZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01pbWVUeXBlKHtcbiAgICAgICAgY2hlY2s6IFwibWltZV90eXBlXCIsXG4gICAgICAgIG1pbWU6IHR5cGVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9vdmVyd3JpdGUodHgpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tPdmVyd3JpdGUoe1xuICAgICAgICBjaGVjazogXCJvdmVyd3JpdGVcIixcbiAgICAgICAgdHhcbiAgICB9KTtcbn1cbi8vIG5vcm1hbGl6ZVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbm9ybWFsaXplKGZvcm0pIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC5ub3JtYWxpemUoZm9ybSkpO1xufVxuLy8gdHJpbVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdHJpbSgpIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC50cmltKCkpO1xufVxuLy8gdG9Mb3dlckNhc2Vcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3RvTG93ZXJDYXNlKCkge1xuICAgIHJldHVybiBfb3ZlcndyaXRlKChpbnB1dCk9PmlucHV0LnRvTG93ZXJDYXNlKCkpO1xufVxuLy8gdG9VcHBlckNhc2Vcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3RvVXBwZXJDYXNlKCkge1xuICAgIHJldHVybiBfb3ZlcndyaXRlKChpbnB1dCk9PmlucHV0LnRvVXBwZXJDYXNlKCkpO1xufVxuLy8gc2x1Z2lmeVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc2x1Z2lmeSgpIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT51dGlsLnNsdWdpZnkoaW5wdXQpKTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2FycmF5KENsYXNzLCBlbGVtZW50LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICAvLyBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgLy8gICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdW5pb24oQ2xhc3MsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfeG9yKENsYXNzLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmlvblwiLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9kaXNjcmltaW5hdGVkVW5pb24oQ2xhc3MsIGRpc2NyaW1pbmF0b3IsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGRpc2NyaW1pbmF0b3IsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2ludGVyc2VjdGlvbihDbGFzcywgbGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgbGVmdCxcbiAgICAgICAgcmlnaHRcbiAgICB9KTtcbn1cbi8vIGV4cG9ydCBmdW5jdGlvbiBfdHVwbGUoXG4vLyAgIENsYXNzOiB1dGlsLlNjaGVtYUNsYXNzPHNjaGVtYXMuJFpvZFR1cGxlPixcbi8vICAgaXRlbXM6IFtdLFxuLy8gICBwYXJhbXM/OiBzdHJpbmcgfCAkWm9kVHVwbGVQYXJhbXNcbi8vICk6IHNjaGVtYXMuJFpvZFR1cGxlPFtdLCBudWxsPjtcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3R1cGxlKENsYXNzLCBpdGVtcywgX3BhcmFtc09yUmVzdCwgX3BhcmFtcykge1xuICAgIGNvbnN0IGhhc1Jlc3QgPSBfcGFyYW1zT3JSZXN0IGluc3RhbmNlb2Ygc2NoZW1hcy4kWm9kVHlwZTtcbiAgICBjb25zdCBwYXJhbXMgPSBoYXNSZXN0ID8gX3BhcmFtcyA6IF9wYXJhbXNPclJlc3Q7XG4gICAgY29uc3QgcmVzdCA9IGhhc1Jlc3QgPyBfcGFyYW1zT3JSZXN0IDogbnVsbDtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgICAgICBpdGVtcyxcbiAgICAgICAgcmVzdCxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfcmVjb3JkKENsYXNzLCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInJlY29yZFwiLFxuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX21hcChDbGFzcywga2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJtYXBcIixcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9zZXQoQ2xhc3MsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZW51bShDbGFzcywgdmFsdWVzLCBwYXJhbXMpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gT2JqZWN0LmZyb21FbnRyaWVzKHZhbHVlcy5tYXAoKHYpPT5bXG4gICAgICAgICAgICB2LFxuICAgICAgICAgICAgdlxuICAgICAgICBdKSkgOiB2YWx1ZXM7XG4gICAgLy8gaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIC8vICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAvLyAgICAgZW50cmllc1t2YWx1ZV0gPSB2YWx1ZTtcbiAgICAvLyAgIH1cbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgT2JqZWN0LmFzc2lnbihlbnRyaWVzLCB2YWx1ZXMpO1xuICAgIC8vIH1cbiAgICAvLyBjb25zdCBlbnRyaWVzOiB1dGlsLkVudW1MaWtlID0ge307XG4gICAgLy8gZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgLy8gICBlbnRyaWVzW3ZhbF0gPSB2YWw7XG4gICAgLy8gfVxuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbi8qKiBAZGVwcmVjYXRlZCBUaGlzIEFQSSBoYXMgYmVlbiBtZXJnZWQgaW50byBgei5lbnVtKClgLiBVc2UgYHouZW51bSgpYCBpbnN0ZWFkLlxuICpcbiAqIGBgYHRzXG4gKiBlbnVtIENvbG9ycyB7IHJlZCwgZ3JlZW4sIGJsdWUgfVxuICogei5lbnVtKENvbG9ycyk7XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gX25hdGl2ZUVudW0oQ2xhc3MsIGVudHJpZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbGl0ZXJhbChDbGFzcywgdmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImxpdGVyYWxcIixcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgXSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfZmlsZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF90cmFuc2Zvcm0oQ2xhc3MsIGZuKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidHJhbnNmb3JtXCIsXG4gICAgICAgIHRyYW5zZm9ybTogZm5cbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX29wdGlvbmFsKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJvcHRpb25hbFwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX251bGxhYmxlKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudWxsYWJsZVwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX2RlZmF1bHQoQ2xhc3MsIGlubmVyVHlwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGRlZmF1bHRWYWx1ZSgpIDogdXRpbC5zaGFsbG93Q2xvbmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbm9ub3B0aW9uYWwoQ2xhc3MsIGlubmVyVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9zdWNjZXNzKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfY2F0Y2goQ2xhc3MsIGlubmVyVHlwZSwgY2F0Y2hWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImNhdGNoXCIsXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgY2F0Y2hWYWx1ZTogdHlwZW9mIGNhdGNoVmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGNhdGNoVmFsdWUgOiAoKT0+Y2F0Y2hWYWx1ZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfcGlwZShDbGFzcywgaW5fLCBvdXQpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBpbl8sXG4gICAgICAgIG91dFxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfcmVhZG9ubHkoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInJlYWRvbmx5XCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfdGVtcGxhdGVMaXRlcmFsKENsYXNzLCBwYXJ0cywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidGVtcGxhdGVfbGl0ZXJhbFwiLFxuICAgICAgICBwYXJ0cyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfbGF6eShDbGFzcywgZ2V0dGVyKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibGF6eVwiLFxuICAgICAgICBnZXR0ZXJcbiAgICB9KTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3Byb21pc2UoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInByb21pc2VcIixcbiAgICAgICAgaW5uZXJUeXBlXG4gICAgfSk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jdXN0b20oQ2xhc3MsIGZuLCBfcGFyYW1zKSB7XG4gICAgY29uc3Qgbm9ybSA9IHV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpO1xuICAgIG5vcm0uYWJvcnQgPz8gKG5vcm0uYWJvcnQgPSB0cnVlKTsgLy8gZGVmYXVsdCB0byBhYm9ydDpmYWxzZVxuICAgIGNvbnN0IHNjaGVtYSA9IG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIC4uLm5vcm1cbiAgICB9KTtcbiAgICByZXR1cm4gc2NoZW1hO1xufVxuLy8gc2FtZSBhcyBfY3VzdG9tIGJ1dCBkZWZhdWx0cyB0byBhYm9ydDpmYWxzZVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfcmVmaW5lKENsYXNzLCBmbiwgX3BhcmFtcykge1xuICAgIGNvbnN0IHNjaGVtYSA9IG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpXG4gICAgfSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gX3N1cGVyUmVmaW5lKGZuKSB7XG4gICAgY29uc3QgY2ggPSBfY2hlY2soKHBheWxvYWQpPT57XG4gICAgICAgIHBheWxvYWQuYWRkSXNzdWUgPSAoaXNzdWUpPT57XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKGlzc3VlLCBwYXlsb2FkLnZhbHVlLCBjaC5fem9kLmRlZikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgWm9kIDMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICBjb25zdCBfaXNzdWUgPSBpc3N1ZTtcbiAgICAgICAgICAgICAgICBpZiAoX2lzc3VlLmZhdGFsKSBfaXNzdWUuY29udGludWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuY29kZSA/PyAoX2lzc3VlLmNvZGUgPSBcImN1c3RvbVwiKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuaW5wdXQgPz8gKF9pc3N1ZS5pbnB1dCA9IHBheWxvYWQudmFsdWUpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5pbnN0ID8/IChfaXNzdWUuaW5zdCA9IGNoKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuY29udGludWUgPz8gKF9pc3N1ZS5jb250aW51ZSA9ICFjaC5fem9kLmRlZi5hYm9ydCk7IC8vIGFib3J0IGlzIGFsd2F5cyB1bmRlZmluZWQsIHNvIHRoaXMgaXMgYWx3YXlzIHRydWUuLi5cbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoX2lzc3VlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmbihwYXlsb2FkLnZhbHVlLCBwYXlsb2FkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2g7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZXhwb3J0IGZ1bmN0aW9uIF9jaGVjayhmbiwgcGFyYW1zKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY2hlY2tzLiRab2RDaGVjayh7XG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG4gICAgY2guX3pvZC5jaGVjayA9IGZuO1xuICAgIHJldHVybiBjaDtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmUoZGVzY3JpcHRpb24pIHtcbiAgICBjb25zdCBjaCA9IG5ldyBjaGVja3MuJFpvZENoZWNrKHtcbiAgICAgICAgY2hlY2s6IFwiZGVzY3JpYmVcIlxuICAgIH0pO1xuICAgIGNoLl96b2Qub25hdHRhY2ggPSBbXG4gICAgICAgIChpbnN0KT0+e1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZWdpc3RyaWVzLmdsb2JhbFJlZ2lzdHJ5LmdldChpbnN0KSA/PyB7fTtcbiAgICAgICAgICAgIHJlZ2lzdHJpZXMuZ2xvYmFsUmVnaXN0cnkuYWRkKGluc3QsIHtcbiAgICAgICAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICBdO1xuICAgIGNoLl96b2QuY2hlY2sgPSAoKT0+e307IC8vIG5vLW9wIGNoZWNrXG4gICAgcmV0dXJuIGNoO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBtZXRhKG1ldGFkYXRhKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY2hlY2tzLiRab2RDaGVjayh7XG4gICAgICAgIGNoZWNrOiBcIm1ldGFcIlxuICAgIH0pO1xuICAgIGNoLl96b2Qub25hdHRhY2ggPSBbXG4gICAgICAgIChpbnN0KT0+e1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZWdpc3RyaWVzLmdsb2JhbFJlZ2lzdHJ5LmdldChpbnN0KSA/PyB7fTtcbiAgICAgICAgICAgIHJlZ2lzdHJpZXMuZ2xvYmFsUmVnaXN0cnkuYWRkKGluc3QsIHtcbiAgICAgICAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICAgICAgICAuLi5tZXRhZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICBdO1xuICAgIGNoLl96b2QuY2hlY2sgPSAoKT0+e307IC8vIG5vLW9wIGNoZWNrXG4gICAgcmV0dXJuIGNoO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nYm9vbChDbGFzc2VzLCBfcGFyYW1zKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcyk7XG4gICAgbGV0IHRydXRoeUFycmF5ID0gcGFyYW1zLnRydXRoeSA/PyBbXG4gICAgICAgIFwidHJ1ZVwiLFxuICAgICAgICBcIjFcIixcbiAgICAgICAgXCJ5ZXNcIixcbiAgICAgICAgXCJvblwiLFxuICAgICAgICBcInlcIixcbiAgICAgICAgXCJlbmFibGVkXCJcbiAgICBdO1xuICAgIGxldCBmYWxzeUFycmF5ID0gcGFyYW1zLmZhbHN5ID8/IFtcbiAgICAgICAgXCJmYWxzZVwiLFxuICAgICAgICBcIjBcIixcbiAgICAgICAgXCJub1wiLFxuICAgICAgICBcIm9mZlwiLFxuICAgICAgICBcIm5cIixcbiAgICAgICAgXCJkaXNhYmxlZFwiXG4gICAgXTtcbiAgICBpZiAocGFyYW1zLmNhc2UgIT09IFwic2Vuc2l0aXZlXCIpIHtcbiAgICAgICAgdHJ1dGh5QXJyYXkgPSB0cnV0aHlBcnJheS5tYXAoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiA/IHYudG9Mb3dlckNhc2UoKSA6IHYpO1xuICAgICAgICBmYWxzeUFycmF5ID0gZmFsc3lBcnJheS5tYXAoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiA/IHYudG9Mb3dlckNhc2UoKSA6IHYpO1xuICAgIH1cbiAgICBjb25zdCB0cnV0aHlTZXQgPSBuZXcgU2V0KHRydXRoeUFycmF5KTtcbiAgICBjb25zdCBmYWxzeVNldCA9IG5ldyBTZXQoZmFsc3lBcnJheSk7XG4gICAgY29uc3QgX0NvZGVjID0gQ2xhc3Nlcy5Db2RlYyA/PyBzY2hlbWFzLiRab2RDb2RlYztcbiAgICBjb25zdCBfQm9vbGVhbiA9IENsYXNzZXMuQm9vbGVhbiA/PyBzY2hlbWFzLiRab2RCb29sZWFuO1xuICAgIGNvbnN0IF9TdHJpbmcgPSBDbGFzc2VzLlN0cmluZyA/PyBzY2hlbWFzLiRab2RTdHJpbmc7XG4gICAgY29uc3Qgc3RyaW5nU2NoZW1hID0gbmV3IF9TdHJpbmcoe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfSk7XG4gICAgY29uc3QgYm9vbGVhblNjaGVtYSA9IG5ldyBfQm9vbGVhbih7XG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfSk7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgX0NvZGVjKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBzdHJpbmdTY2hlbWEsXG4gICAgICAgIG91dDogYm9vbGVhblNjaGVtYSxcbiAgICAgICAgdHJhbnNmb3JtOiAoaW5wdXQsIHBheWxvYWQpPT57XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGlucHV0O1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5jYXNlICE9PSBcInNlbnNpdGl2ZVwiKSBkYXRhID0gZGF0YS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHRydXRoeVNldC5oYXMoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFsc3lTZXQuaGFzKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInN0cmluZ2Jvb2xcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50cnV0aHlTZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5mYWxzeVNldFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdDogY29kZWMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmV2ZXJzZVRyYW5zZm9ybTogKGlucHV0LCBfcGF5bG9hZCk9PntcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnV0aHlBcnJheVswXSB8fCBcInRydWVcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHN5QXJyYXlbMF0gfHwgXCJmYWxzZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvZGVjO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nRm9ybWF0KENsYXNzLCBmb3JtYXQsIGZuT3JSZWdleCwgX3BhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgcGFyYW1zID0gdXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcyk7XG4gICAgY29uc3QgZGVmID0ge1xuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKSxcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIGZuOiB0eXBlb2YgZm5PclJlZ2V4ID09PSBcImZ1bmN0aW9uXCIgPyBmbk9yUmVnZXggOiAodmFsKT0+Zm5PclJlZ2V4LnRlc3QodmFsKSxcbiAgICAgICAgLi4ucGFyYW1zXG4gICAgfTtcbiAgICBpZiAoZm5PclJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGRlZi5wYXR0ZXJuID0gZm5PclJlZ2V4O1xuICAgIH1cbiAgICBjb25zdCBpbnN0ID0gbmV3IENsYXNzKGRlZik7XG4gICAgcmV0dXJuIGluc3Q7XG59XG4iLCAiaW1wb3J0IHsgZ2xvYmFsUmVnaXN0cnkgfSBmcm9tIFwiLi9yZWdpc3RyaWVzLmpzXCI7XG4vLyBmdW5jdGlvbiBpbml0aWFsaXplQ29udGV4dDxUIGV4dGVuZHMgc2NoZW1hcy4kWm9kVHlwZT4oaW5wdXRzOiBKU09OU2NoZW1hR2VuZXJhdG9yUGFyYW1zPFQ+KTogVG9KU09OU2NoZW1hQ29udGV4dDxUPiB7XG4vLyAgIHJldHVybiB7XG4vLyAgICAgcHJvY2Vzc29yOiBpbnB1dHMucHJvY2Vzc29yLFxuLy8gICAgIG1ldGFkYXRhUmVnaXN0cnk6IGlucHV0cy5tZXRhZGF0YSA/PyBnbG9iYWxSZWdpc3RyeSxcbi8vICAgICB0YXJnZXQ6IGlucHV0cy50YXJnZXQgPz8gXCJkcmFmdC0yMDIwLTEyXCIsXG4vLyAgICAgdW5yZXByZXNlbnRhYmxlOiBpbnB1dHMudW5yZXByZXNlbnRhYmxlID8/IFwidGhyb3dcIixcbi8vICAgfTtcbi8vIH1cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ29udGV4dChwYXJhbXMpIHtcbiAgICAvLyBOb3JtYWxpemUgdGFyZ2V0OiBjb252ZXJ0IG9sZCBub24taHlwaGVuYXRlZCB2ZXJzaW9ucyB0byBoeXBoZW5hdGVkIHZlcnNpb25zXG4gICAgbGV0IHRhcmdldCA9IHBhcmFtcz8udGFyZ2V0ID8/IFwiZHJhZnQtMjAyMC0xMlwiO1xuICAgIGlmICh0YXJnZXQgPT09IFwiZHJhZnQtNFwiKSB0YXJnZXQgPSBcImRyYWZ0LTA0XCI7XG4gICAgaWYgKHRhcmdldCA9PT0gXCJkcmFmdC03XCIpIHRhcmdldCA9IFwiZHJhZnQtMDdcIjtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9jZXNzb3JzOiBwYXJhbXMucHJvY2Vzc29ycyA/PyB7fSxcbiAgICAgICAgbWV0YWRhdGFSZWdpc3RyeTogcGFyYW1zPy5tZXRhZGF0YSA/PyBnbG9iYWxSZWdpc3RyeSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICB1bnJlcHJlc2VudGFibGU6IHBhcmFtcz8udW5yZXByZXNlbnRhYmxlID8/IFwidGhyb3dcIixcbiAgICAgICAgb3ZlcnJpZGU6IHBhcmFtcz8ub3ZlcnJpZGUgPz8gKCgpPT57fSksXG4gICAgICAgIGlvOiBwYXJhbXM/LmlvID8/IFwib3V0cHV0XCIsXG4gICAgICAgIGNvdW50ZXI6IDAsXG4gICAgICAgIHNlZW46IG5ldyBNYXAoKSxcbiAgICAgICAgY3ljbGVzOiBwYXJhbXM/LmN5Y2xlcyA/PyBcInJlZlwiLFxuICAgICAgICByZXVzZWQ6IHBhcmFtcz8ucmV1c2VkID8/IFwiaW5saW5lXCIsXG4gICAgICAgIGV4dGVybmFsOiBwYXJhbXM/LmV4dGVybmFsID8/IHVuZGVmaW5lZFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcHJvY2VzcyhzY2hlbWEsIGN0eCwgX3BhcmFtcyA9IHtcbiAgICBwYXRoOiBbXSxcbiAgICBzY2hlbWFQYXRoOiBbXVxufSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgLy8gY2hlY2sgZm9yIHNjaGVtYSBpbiBzZWVuc1xuICAgIGNvbnN0IHNlZW4gPSBjdHguc2Vlbi5nZXQoc2NoZW1hKTtcbiAgICBpZiAoc2Vlbikge1xuICAgICAgICBzZWVuLmNvdW50Kys7XG4gICAgICAgIC8vIGNoZWNrIGlmIGN5Y2xlXG4gICAgICAgIGNvbnN0IGlzQ3ljbGUgPSBfcGFyYW1zLnNjaGVtYVBhdGguaW5jbHVkZXMoc2NoZW1hKTtcbiAgICAgICAgaWYgKGlzQ3ljbGUpIHtcbiAgICAgICAgICAgIHNlZW4uY3ljbGUgPSBfcGFyYW1zLnBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZW4uc2NoZW1hO1xuICAgIH1cbiAgICAvLyBpbml0aWFsaXplXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBzY2hlbWE6IHt9LFxuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgY3ljbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgcGF0aDogX3BhcmFtcy5wYXRoXG4gICAgfTtcbiAgICBjdHguc2Vlbi5zZXQoc2NoZW1hLCByZXN1bHQpO1xuICAgIC8vIGN1c3RvbSBtZXRob2Qgb3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3JcbiAgICBjb25zdCBvdmVycmlkZVNjaGVtYSA9IHNjaGVtYS5fem9kLnRvSlNPTlNjaGVtYT8uKCk7XG4gICAgaWYgKG92ZXJyaWRlU2NoZW1hKSB7XG4gICAgICAgIHJlc3VsdC5zY2hlbWEgPSBvdmVycmlkZVNjaGVtYTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICAuLi5fcGFyYW1zLFxuICAgICAgICAgICAgc2NoZW1hUGF0aDogW1xuICAgICAgICAgICAgICAgIC4uLl9wYXJhbXMuc2NoZW1hUGF0aCxcbiAgICAgICAgICAgICAgICBzY2hlbWFcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBwYXRoOiBfcGFyYW1zLnBhdGhcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNjaGVtYS5fem9kLnByb2Nlc3NKU09OU2NoZW1hKSB7XG4gICAgICAgICAgICBzY2hlbWEuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYShjdHgsIHJlc3VsdC5zY2hlbWEsIHBhcmFtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBfanNvbiA9IHJlc3VsdC5zY2hlbWE7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzb3IgPSBjdHgucHJvY2Vzc29yc1tkZWYudHlwZV07XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3RvSlNPTlNjaGVtYV06IE5vbi1yZXByZXNlbnRhYmxlIHR5cGUgZW5jb3VudGVyZWQ6ICR7ZGVmLnR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzb3Ioc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjaGVtYS5fem9kLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgLy8gQWxzbyBzZXQgcmVmIGlmIHByb2Nlc3NvciBkaWRuJ3QgKGZvciBpbmhlcml0YW5jZSlcbiAgICAgICAgICAgIGlmICghcmVzdWx0LnJlZikgcmVzdWx0LnJlZiA9IHBhcmVudDtcbiAgICAgICAgICAgIHByb2Nlc3MocGFyZW50LCBjdHgsIHBhcmFtcyk7XG4gICAgICAgICAgICBjdHguc2Vlbi5nZXQocGFyZW50KS5pc1BhcmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbWV0YWRhdGFcbiAgICBjb25zdCBtZXRhID0gY3R4Lm1ldGFkYXRhUmVnaXN0cnkuZ2V0KHNjaGVtYSk7XG4gICAgaWYgKG1ldGEpIE9iamVjdC5hc3NpZ24ocmVzdWx0LnNjaGVtYSwgbWV0YSk7XG4gICAgaWYgKGN0eC5pbyA9PT0gXCJpbnB1dFwiICYmIGlzVHJhbnNmb3JtaW5nKHNjaGVtYSkpIHtcbiAgICAgICAgLy8gZXhhbXBsZXMvZGVmYXVsdHMgb25seSBhcHBseSB0byBvdXRwdXQgdHlwZSBvZiBwaXBlXG4gICAgICAgIGRlbGV0ZSByZXN1bHQuc2NoZW1hLmV4YW1wbGVzO1xuICAgICAgICBkZWxldGUgcmVzdWx0LnNjaGVtYS5kZWZhdWx0O1xuICAgIH1cbiAgICAvLyBzZXQgcHJlZmF1bHQgYXMgZGVmYXVsdFxuICAgIGlmIChjdHguaW8gPT09IFwiaW5wdXRcIiAmJiByZXN1bHQuc2NoZW1hLl9wcmVmYXVsdCkgKF9hID0gcmVzdWx0LnNjaGVtYSkuZGVmYXVsdCA/PyAoX2EuZGVmYXVsdCA9IHJlc3VsdC5zY2hlbWEuX3ByZWZhdWx0KTtcbiAgICBkZWxldGUgcmVzdWx0LnNjaGVtYS5fcHJlZmF1bHQ7XG4gICAgLy8gcHVsbGluZyBmcmVzaCBmcm9tIGN0eC5zZWVuIGluIGNhc2UgaXQgd2FzIG92ZXJ3cml0dGVuXG4gICAgY29uc3QgX3Jlc3VsdCA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHJldHVybiBfcmVzdWx0LnNjaGVtYTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGVmcyhjdHgsIHNjaGVtYSkge1xuICAgIC8vIGl0ZXJhdGUgb3ZlciBzZWVuIG1hcDtcbiAgICBjb25zdCByb290ID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoXCJVbnByb2Nlc3NlZCBzY2hlbWEuIFRoaXMgaXMgYSBidWcgaW4gWm9kLlwiKTtcbiAgICAvLyBUcmFjayBpZHMgdG8gZGV0ZWN0IGR1cGxpY2F0ZXMgYWNyb3NzIGRpZmZlcmVudCBzY2hlbWFzXG4gICAgY29uc3QgaWRUb1NjaGVtYSA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGN0eC5zZWVuLmVudHJpZXMoKSl7XG4gICAgICAgIGNvbnN0IGlkID0gY3R4Lm1ldGFkYXRhUmVnaXN0cnkuZ2V0KGVudHJ5WzBdKT8uaWQ7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBpZFRvU2NoZW1hLmdldChpZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcgIT09IGVudHJ5WzBdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgc2NoZW1hIGlkIFwiJHtpZH1cIiBkZXRlY3RlZCBkdXJpbmcgSlNPTiBTY2hlbWEgY29udmVyc2lvbi4gVHdvIGRpZmZlcmVudCBzY2hlbWFzIGNhbm5vdCBzaGFyZSB0aGUgc2FtZSBpZCB3aGVuIGNvbnZlcnRlZCB0b2dldGhlci5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkVG9TY2hlbWEuc2V0KGlkLCBlbnRyeVswXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcmV0dXJucyBhIHJlZiB0byB0aGUgc2NoZW1hXG4gICAgLy8gZGVmSWQgd2lsbCBiZSBlbXB0eSBpZiB0aGUgcmVmIHBvaW50cyB0byBhbiBleHRlcm5hbCBzY2hlbWEgKG9yICMpXG4gICAgY29uc3QgbWFrZVVSSSA9IChlbnRyeSk9PntcbiAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBzZWVuIG9iamVjdHMgYmVjYXVzZSBzb21ldGltZXNcbiAgICAgICAgLy8gbXVsdGlwbGUgc2NoZW1hcyBtYXAgdG8gdGhlIHNhbWUgc2VlbiBvYmplY3QuXG4gICAgICAgIC8vIGUuZy4gbGF6eVxuICAgICAgICAvLyBleHRlcm5hbCBpcyBjb25maWd1cmVkXG4gICAgICAgIGNvbnN0IGRlZnNTZWdtZW50ID0gY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0yMDIwLTEyXCIgPyBcIiRkZWZzXCIgOiBcImRlZmluaXRpb25zXCI7XG4gICAgICAgIGlmIChjdHguZXh0ZXJuYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVybmFsSWQgPSBjdHguZXh0ZXJuYWwucmVnaXN0cnkuZ2V0KGVudHJ5WzBdKT8uaWQ7IC8vID8/IFwiX19zaGFyZWRcIjsvLyBgX19zY2hlbWEke2N0eC5jb3VudGVyKyt9YDtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHNjaGVtYSBpcyBpbiB0aGUgZXh0ZXJuYWwgcmVnaXN0cnlcbiAgICAgICAgICAgIGNvbnN0IHVyaUdlbmVyYXRvciA9IGN0eC5leHRlcm5hbC51cmkgPz8gKChpZCk9PmlkKTtcbiAgICAgICAgICAgIGlmIChleHRlcm5hbElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiB1cmlHZW5lcmF0b3IoZXh0ZXJuYWxJZClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBhZGQgdG8gX19zaGFyZWRcbiAgICAgICAgICAgIGNvbnN0IGlkID0gZW50cnlbMV0uZGVmSWQgPz8gZW50cnlbMV0uc2NoZW1hLmlkID8/IGBzY2hlbWEke2N0eC5jb3VudGVyKyt9YDtcbiAgICAgICAgICAgIGVudHJ5WzFdLmRlZklkID0gaWQ7IC8vIHNldCBkZWZJZCBzbyBpdCB3aWxsIGJlIHJldXNlZCBpZiBuZWVkZWRcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGVmSWQ6IGlkLFxuICAgICAgICAgICAgICAgIHJlZjogYCR7dXJpR2VuZXJhdG9yKFwiX19zaGFyZWRcIil9Iy8ke2RlZnNTZWdtZW50fS8ke2lkfWBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5WzFdID09PSByb290KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlZjogXCIjXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2VsZi1jb250YWluZWQgc2NoZW1hXG4gICAgICAgIGNvbnN0IHVyaVByZWZpeCA9IGAjYDtcbiAgICAgICAgY29uc3QgZGVmVXJpUHJlZml4ID0gYCR7dXJpUHJlZml4fS8ke2RlZnNTZWdtZW50fS9gO1xuICAgICAgICBjb25zdCBkZWZJZCA9IGVudHJ5WzFdLnNjaGVtYS5pZCA/PyBgX19zY2hlbWEke2N0eC5jb3VudGVyKyt9YDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlZklkLFxuICAgICAgICAgICAgcmVmOiBkZWZVcmlQcmVmaXggKyBkZWZJZFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLy8gc3RvcmVkIGNhY2hlZCB2ZXJzaW9uIGluIGBkZWZgIHByb3BlcnR5XG4gICAgLy8gcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzLCBzZXQgJHJlZlxuICAgIGNvbnN0IGV4dHJhY3RUb0RlZiA9IChlbnRyeSk9PntcbiAgICAgICAgLy8gaWYgdGhlIHNjaGVtYSBpcyBhbHJlYWR5IGEgcmVmZXJlbmNlLCBkbyBub3QgZXh0cmFjdCBpdFxuICAgICAgICBpZiAoZW50cnlbMV0uc2NoZW1hLiRyZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWVuID0gZW50cnlbMV07XG4gICAgICAgIGNvbnN0IHsgcmVmLCBkZWZJZCB9ID0gbWFrZVVSSShlbnRyeSk7XG4gICAgICAgIHNlZW4uZGVmID0ge1xuICAgICAgICAgICAgLi4uc2Vlbi5zY2hlbWFcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVmSWQgd29uJ3QgYmUgc2V0IGlmIHRoZSBzY2hlbWEgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc2NoZW1hXG4gICAgICAgIC8vIG9yIGlmIHRoZSBzY2hlbWEgaXMgdGhlIHJvb3Qgc2NoZW1hXG4gICAgICAgIGlmIChkZWZJZCkgc2Vlbi5kZWZJZCA9IGRlZklkO1xuICAgICAgICAvLyB3aXBlIGF3YXkgYWxsIHByb3BlcnRpZXMgZXhjZXB0ICRyZWZcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2Vlbi5zY2hlbWE7XG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2NoZW1hKXtcbiAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBzY2hlbWEuJHJlZiA9IHJlZjtcbiAgICB9O1xuICAgIC8vIHRocm93IG9uIGN5Y2xlc1xuICAgIC8vIGJyZWFrIGN5Y2xlc1xuICAgIGlmIChjdHguY3ljbGVzID09PSBcInRocm93XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjdHguc2Vlbi5lbnRyaWVzKCkpe1xuICAgICAgICAgICAgY29uc3Qgc2VlbiA9IGVudHJ5WzFdO1xuICAgICAgICAgICAgaWYgKHNlZW4uY3ljbGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDeWNsZSBkZXRlY3RlZDogXCIgKyBgIy8ke3NlZW4uY3ljbGU/LmpvaW4oXCIvXCIpfS88cm9vdD5gICsgJ1xcblxcblNldCB0aGUgYGN5Y2xlc2AgcGFyYW1ldGVyIHRvIGBcInJlZlwiYCB0byByZXNvbHZlIGN5Y2xpY2FsIHNjaGVtYXMgd2l0aCBkZWZzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGV4dHJhY3Qgc2NoZW1hcyBpbnRvICRkZWZzXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBjdHguc2Vlbi5lbnRyaWVzKCkpe1xuICAgICAgICBjb25zdCBzZWVuID0gZW50cnlbMV07XG4gICAgICAgIC8vIGNvbnZlcnQgcm9vdCBzY2hlbWEgdG8gIyAkcmVmXG4gICAgICAgIGlmIChzY2hlbWEgPT09IGVudHJ5WzBdKSB7XG4gICAgICAgICAgICBleHRyYWN0VG9EZWYoZW50cnkpOyAvLyB0aGlzIGhhcyBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGUgcm9vdCBzY2hlbWFcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4dHJhY3Qgc2NoZW1hcyB0aGF0IGFyZSBpbiB0aGUgZXh0ZXJuYWwgcmVnaXN0cnlcbiAgICAgICAgaWYgKGN0eC5leHRlcm5hbCkge1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gY3R4LmV4dGVybmFsLnJlZ2lzdHJ5LmdldChlbnRyeVswXSk/LmlkO1xuICAgICAgICAgICAgaWYgKHNjaGVtYSAhPT0gZW50cnlbMF0gJiYgZXh0KSB7XG4gICAgICAgICAgICAgICAgZXh0cmFjdFRvRGVmKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBleHRyYWN0IHNjaGVtYXMgd2l0aCBgaWRgIG1ldGFcbiAgICAgICAgY29uc3QgaWQgPSBjdHgubWV0YWRhdGFSZWdpc3RyeS5nZXQoZW50cnlbMF0pPy5pZDtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBleHRyYWN0VG9EZWYoZW50cnkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYnJlYWsgY3ljbGVzXG4gICAgICAgIGlmIChzZWVuLmN5Y2xlKSB7XG4gICAgICAgICAgICAvLyBhbnlcbiAgICAgICAgICAgIGV4dHJhY3RUb0RlZihlbnRyeSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleHRyYWN0IHJldXNlZCBzY2hlbWFzXG4gICAgICAgIGlmIChzZWVuLmNvdW50ID4gMSkge1xuICAgICAgICAgICAgaWYgKGN0eC5yZXVzZWQgPT09IFwicmVmXCIpIHtcbiAgICAgICAgICAgICAgICBleHRyYWN0VG9EZWYoZW50cnkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplKGN0eCwgc2NoZW1hKSB7XG4gICAgY29uc3Qgcm9vdCA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKFwiVW5wcm9jZXNzZWQgc2NoZW1hLiBUaGlzIGlzIGEgYnVnIGluIFpvZC5cIik7XG4gICAgLy8gZmxhdHRlbiByZWZzIC0gaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gcGFyZW50IHNjaGVtYXNcbiAgICBjb25zdCBmbGF0dGVuUmVmID0gKHpvZFNjaGVtYSk9PntcbiAgICAgICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldCh6b2RTY2hlbWEpO1xuICAgICAgICAvLyBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICBpZiAoc2Vlbi5yZWYgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2Vlbi5kZWYgPz8gc2Vlbi5zY2hlbWE7XG4gICAgICAgIGNvbnN0IF9jYWNoZWQgPSB7XG4gICAgICAgICAgICAuLi5zY2hlbWFcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVmID0gc2Vlbi5yZWY7XG4gICAgICAgIHNlZW4ucmVmID0gbnVsbDsgLy8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb25cbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgZmxhdHRlblJlZihyZWYpO1xuICAgICAgICAgICAgY29uc3QgcmVmU2VlbiA9IGN0eC5zZWVuLmdldChyZWYpO1xuICAgICAgICAgICAgY29uc3QgcmVmU2NoZW1hID0gcmVmU2Vlbi5zY2hlbWE7XG4gICAgICAgICAgICAvLyBtZXJnZSByZWZlcmVuY2VkIHNjaGVtYSBpbnRvIGN1cnJlbnRcbiAgICAgICAgICAgIGlmIChyZWZTY2hlbWEuJHJlZiAmJiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wN1wiIHx8IGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMDRcIiB8fCBjdHgudGFyZ2V0ID09PSBcIm9wZW5hcGktMy4wXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gb2xkZXIgZHJhZnRzIGNhbid0IGNvbWJpbmUgJHJlZiB3aXRoIG90aGVyIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICBzY2hlbWEuYWxsT2YgPSBzY2hlbWEuYWxsT2YgPz8gW107XG4gICAgICAgICAgICAgICAgc2NoZW1hLmFsbE9mLnB1c2gocmVmU2NoZW1hKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzY2hlbWEsIHJlZlNjaGVtYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXN0b3JlIGNoaWxkJ3Mgb3duIHByb3BlcnRpZXMgKGNoaWxkIHdpbnMpXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNjaGVtYSwgX2NhY2hlZCk7XG4gICAgICAgICAgICBjb25zdCBpc1BhcmVudFJlZiA9IHpvZFNjaGVtYS5fem9kLnBhcmVudCA9PT0gcmVmO1xuICAgICAgICAgICAgLy8gRm9yIHBhcmVudCBjaGFpbiwgY2hpbGQgaXMgYSByZWZpbmVtZW50IC0gcmVtb3ZlIHBhcmVudC1vbmx5IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGlmIChpc1BhcmVudFJlZikge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2NoZW1hKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCIkcmVmXCIgfHwga2V5ID09PSBcImFsbE9mXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gX2NhY2hlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdoZW4gcmVmIHdhcyBleHRyYWN0ZWQgdG8gJGRlZnMsIHJlbW92ZSBwcm9wZXJ0aWVzIHRoYXQgbWF0Y2ggdGhlIGRlZmluaXRpb25cbiAgICAgICAgICAgIGlmIChyZWZTY2hlbWEuJHJlZiAmJiByZWZTZWVuLmRlZikge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2NoZW1hKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCIkcmVmXCIgfHwga2V5ID09PSBcImFsbE9mXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIHJlZlNlZW4uZGVmICYmIEpTT04uc3RyaW5naWZ5KHNjaGVtYVtrZXldKSA9PT0gSlNPTi5zdHJpbmdpZnkocmVmU2Vlbi5kZWZba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBwYXJlbnQgd2FzIGV4dHJhY3RlZCAoaGFzICRyZWYpLCBwcm9wYWdhdGUgJHJlZiB0byB0aGlzIHNjaGVtYVxuICAgICAgICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgbGlrZTogcmVhZG9ubHkoKS5tZXRhKHtpZH0pLmRlc2NyaWJlKClcbiAgICAgICAgLy8gd2hlcmUgcHJvY2Vzc29yIHNldHMgcmVmIHRvIGlubmVyVHlwZSBidXQgcGFyZW50IHNob3VsZCBiZSByZWZlcmVuY2VkXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHpvZFNjaGVtYS5fem9kLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQgIT09IHJlZikge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHBhcmVudCBpcyBwcm9jZXNzZWQgZmlyc3Qgc28gaXRzIGRlZiBoYXMgaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGZsYXR0ZW5SZWYocGFyZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFNlZW4gPSBjdHguc2Vlbi5nZXQocGFyZW50KTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRTZWVuPy5zY2hlbWEuJHJlZikge1xuICAgICAgICAgICAgICAgIHNjaGVtYS4kcmVmID0gcGFyZW50U2Vlbi5zY2hlbWEuJHJlZjtcbiAgICAgICAgICAgICAgICAvLyBEZS1kdXBsaWNhdGUgd2l0aCBwYXJlbnQncyBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFNlZW4uZGVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2NoZW1hKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiJHJlZlwiIHx8IGtleSA9PT0gXCJhbGxPZlwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gcGFyZW50U2Vlbi5kZWYgJiYgSlNPTi5zdHJpbmdpZnkoc2NoZW1hW2tleV0pID09PSBKU09OLnN0cmluZ2lmeShwYXJlbnRTZWVuLmRlZltrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBleGVjdXRlIG92ZXJyaWRlc1xuICAgICAgICBjdHgub3ZlcnJpZGUoe1xuICAgICAgICAgICAgem9kU2NoZW1hOiB6b2RTY2hlbWEsXG4gICAgICAgICAgICBqc29uU2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICBwYXRoOiBzZWVuLnBhdGggPz8gW11cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIFtcbiAgICAgICAgLi4uY3R4LnNlZW4uZW50cmllcygpXG4gICAgXS5yZXZlcnNlKCkpe1xuICAgICAgICBmbGF0dGVuUmVmKGVudHJ5WzBdKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgaWYgKGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMjAyMC0xMlwiKSB7XG4gICAgICAgIHJlc3VsdC4kc2NoZW1hID0gXCJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC8yMDIwLTEyL3NjaGVtYVwiO1xuICAgIH0gZWxzZSBpZiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wN1wiKSB7XG4gICAgICAgIHJlc3VsdC4kc2NoZW1hID0gXCJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSNcIjtcbiAgICB9IGVsc2UgaWYgKGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMDRcIikge1xuICAgICAgICByZXN1bHQuJHNjaGVtYSA9IFwiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjXCI7XG4gICAgfSBlbHNlIGlmIChjdHgudGFyZ2V0ID09PSBcIm9wZW5hcGktMy4wXCIpIHtcbiAgICAvLyBPcGVuQVBJIDMuMCBzY2hlbWEgb2JqZWN0cyBzaG91bGQgbm90IGluY2x1ZGUgYSAkc2NoZW1hIHByb3BlcnR5XG4gICAgfSBlbHNlIHtcbiAgICAvLyBBcmJpdHJhcnkgc3RyaW5nIHZhbHVlcyBhcmUgYWxsb3dlZCBidXQgd29uJ3QgaGF2ZSBhICRzY2hlbWEgcHJvcGVydHkgc2V0XG4gICAgfVxuICAgIGlmIChjdHguZXh0ZXJuYWw/LnVyaSkge1xuICAgICAgICBjb25zdCBpZCA9IGN0eC5leHRlcm5hbC5yZWdpc3RyeS5nZXQoc2NoZW1hKT8uaWQ7XG4gICAgICAgIGlmICghaWQpIHRocm93IG5ldyBFcnJvcihcIlNjaGVtYSBpcyBtaXNzaW5nIGFuIGBpZGAgcHJvcGVydHlcIik7XG4gICAgICAgIHJlc3VsdC4kaWQgPSBjdHguZXh0ZXJuYWwudXJpKGlkKTtcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHJvb3QuZGVmID8/IHJvb3Quc2NoZW1hKTtcbiAgICAvLyBidWlsZCBkZWZzIG9iamVjdFxuICAgIGNvbnN0IGRlZnMgPSBjdHguZXh0ZXJuYWw/LmRlZnMgPz8ge307XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBjdHguc2Vlbi5lbnRyaWVzKCkpe1xuICAgICAgICBjb25zdCBzZWVuID0gZW50cnlbMV07XG4gICAgICAgIGlmIChzZWVuLmRlZiAmJiBzZWVuLmRlZklkKSB7XG4gICAgICAgICAgICBkZWZzW3NlZW4uZGVmSWRdID0gc2Vlbi5kZWY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gc2V0IGRlZmluaXRpb25zIGluIHJlc3VsdFxuICAgIGlmIChjdHguZXh0ZXJuYWwpIHt9IGVsc2Uge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVmcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMjAyMC0xMlwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LiRkZWZzID0gZGVmcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlZmluaXRpb25zID0gZGVmcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB0aGlzIFwiZmluYWxpemVzXCIgdGhpcyBzY2hlbWEgYW5kIGVuc3VyZXMgYWxsIGN5Y2xlcyBhcmUgcmVtb3ZlZFxuICAgICAgICAvLyBlYWNoIGNhbGwgdG8gZmluYWxpemUoKSBpcyBmdW5jdGlvbmFsbHkgaW5kZXBlbmRlbnRcbiAgICAgICAgLy8gdGhvdWdoIHRoZSBzZWVuIG1hcCBpcyBzaGFyZWRcbiAgICAgICAgY29uc3QgZmluYWxpemVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpbmFsaXplZCwgXCJ+c3RhbmRhcmRcIiwge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWFbXCJ+c3RhbmRhcmRcIl0sXG4gICAgICAgICAgICAgICAganNvblNjaGVtYToge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dDogY3JlYXRlU3RhbmRhcmRKU09OU2NoZW1hTWV0aG9kKHNjaGVtYSwgXCJpbnB1dFwiLCBjdHgucHJvY2Vzc29ycyksXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dDogY3JlYXRlU3RhbmRhcmRKU09OU2NoZW1hTWV0aG9kKHNjaGVtYSwgXCJvdXRwdXRcIiwgY3R4LnByb2Nlc3NvcnMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmluYWxpemVkO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgY29udmVydGluZyBzY2hlbWEgdG8gSlNPTi5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNUcmFuc2Zvcm1pbmcoX3NjaGVtYSwgX2N0eCkge1xuICAgIGNvbnN0IGN0eCA9IF9jdHggPz8ge1xuICAgICAgICBzZWVuOiBuZXcgU2V0KClcbiAgICB9O1xuICAgIGlmIChjdHguc2Vlbi5oYXMoX3NjaGVtYSkpIHJldHVybiBmYWxzZTtcbiAgICBjdHguc2Vlbi5hZGQoX3NjaGVtYSk7XG4gICAgY29uc3QgZGVmID0gX3NjaGVtYS5fem9kLmRlZjtcbiAgICBpZiAoZGVmLnR5cGUgPT09IFwidHJhbnNmb3JtXCIpIHJldHVybiB0cnVlO1xuICAgIGlmIChkZWYudHlwZSA9PT0gXCJhcnJheVwiKSByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmVsZW1lbnQsIGN0eCk7XG4gICAgaWYgKGRlZi50eXBlID09PSBcInNldFwiKSByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLnZhbHVlVHlwZSwgY3R4KTtcbiAgICBpZiAoZGVmLnR5cGUgPT09IFwibGF6eVwiKSByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmdldHRlcigpLCBjdHgpO1xuICAgIGlmIChkZWYudHlwZSA9PT0gXCJwcm9taXNlXCIgfHwgZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIiB8fCBkZWYudHlwZSA9PT0gXCJub25vcHRpb25hbFwiIHx8IGRlZi50eXBlID09PSBcIm51bGxhYmxlXCIgfHwgZGVmLnR5cGUgPT09IFwicmVhZG9ubHlcIiB8fCBkZWYudHlwZSA9PT0gXCJkZWZhdWx0XCIgfHwgZGVmLnR5cGUgPT09IFwicHJlZmF1bHRcIikge1xuICAgICAgICByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmlubmVyVHlwZSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKGRlZi50eXBlID09PSBcImludGVyc2VjdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpc1RyYW5zZm9ybWluZyhkZWYubGVmdCwgY3R4KSB8fCBpc1RyYW5zZm9ybWluZyhkZWYucmlnaHQsIGN0eCk7XG4gICAgfVxuICAgIGlmIChkZWYudHlwZSA9PT0gXCJyZWNvcmRcIiB8fCBkZWYudHlwZSA9PT0gXCJtYXBcIikge1xuICAgICAgICByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmtleVR5cGUsIGN0eCkgfHwgaXNUcmFuc2Zvcm1pbmcoZGVmLnZhbHVlVHlwZSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKGRlZi50eXBlID09PSBcInBpcGVcIikge1xuICAgICAgICByZXR1cm4gaXNUcmFuc2Zvcm1pbmcoZGVmLmluLCBjdHgpIHx8IGlzVHJhbnNmb3JtaW5nKGRlZi5vdXQsIGN0eCk7XG4gICAgfVxuICAgIGlmIChkZWYudHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBmb3IoY29uc3Qga2V5IGluIGRlZi5zaGFwZSl7XG4gICAgICAgICAgICBpZiAoaXNUcmFuc2Zvcm1pbmcoZGVmLnNoYXBlW2tleV0sIGN0eCkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRlZi50eXBlID09PSBcInVuaW9uXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZGVmLm9wdGlvbnMpe1xuICAgICAgICAgICAgaWYgKGlzVHJhbnNmb3JtaW5nKG9wdGlvbiwgY3R4KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGVmLnR5cGUgPT09IFwidHVwbGVcIikge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGVmLml0ZW1zKXtcbiAgICAgICAgICAgIGlmIChpc1RyYW5zZm9ybWluZyhpdGVtLCBjdHgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLnJlc3QgJiYgaXNUcmFuc2Zvcm1pbmcoZGVmLnJlc3QsIGN0eCkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHRvSlNPTlNjaGVtYSBtZXRob2QgZm9yIGEgc2NoZW1hIGluc3RhbmNlLlxuICogVGhpcyBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIG9mIGluaXRpYWxpemluZyBjb250ZXh0LCBwcm9jZXNzaW5nLCBleHRyYWN0aW5nIGRlZnMsIGFuZCBmaW5hbGl6aW5nLlxuICovIGV4cG9ydCBjb25zdCBjcmVhdGVUb0pTT05TY2hlbWFNZXRob2QgPSAoc2NoZW1hLCBwcm9jZXNzb3JzID0ge30pPT4ocGFyYW1zKT0+e1xuICAgICAgICBjb25zdCBjdHggPSBpbml0aWFsaXplQ29udGV4dCh7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBwcm9jZXNzb3JzXG4gICAgICAgIH0pO1xuICAgICAgICBwcm9jZXNzKHNjaGVtYSwgY3R4KTtcbiAgICAgICAgZXh0cmFjdERlZnMoY3R4LCBzY2hlbWEpO1xuICAgICAgICByZXR1cm4gZmluYWxpemUoY3R4LCBzY2hlbWEpO1xuICAgIH07XG5leHBvcnQgY29uc3QgY3JlYXRlU3RhbmRhcmRKU09OU2NoZW1hTWV0aG9kID0gKHNjaGVtYSwgaW8sIHByb2Nlc3NvcnMgPSB7fSk9PihwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IHsgbGlicmFyeU9wdGlvbnMsIHRhcmdldCB9ID0gcGFyYW1zID8/IHt9O1xuICAgICAgICBjb25zdCBjdHggPSBpbml0aWFsaXplQ29udGV4dCh7XG4gICAgICAgICAgICAuLi5saWJyYXJ5T3B0aW9ucyA/PyB7fSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIGlvLFxuICAgICAgICAgICAgcHJvY2Vzc29yc1xuICAgICAgICB9KTtcbiAgICAgICAgcHJvY2VzcyhzY2hlbWEsIGN0eCk7XG4gICAgICAgIGV4dHJhY3REZWZzKGN0eCwgc2NoZW1hKTtcbiAgICAgICAgcmV0dXJuIGZpbmFsaXplKGN0eCwgc2NoZW1hKTtcbiAgICB9O1xuIiwgImltcG9ydCB7IGV4dHJhY3REZWZzLCBmaW5hbGl6ZSwgaW5pdGlhbGl6ZUNvbnRleHQsIHByb2Nlc3MgfSBmcm9tIFwiLi90by1qc29uLXNjaGVtYS5qc1wiO1xuaW1wb3J0IHsgZ2V0RW51bVZhbHVlcyB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmNvbnN0IGZvcm1hdE1hcCA9IHtcbiAgICBndWlkOiBcInV1aWRcIixcbiAgICB1cmw6IFwidXJpXCIsXG4gICAgZGF0ZXRpbWU6IFwiZGF0ZS10aW1lXCIsXG4gICAganNvbl9zdHJpbmc6IFwianNvbi1zdHJpbmdcIixcbiAgICByZWdleDogXCJcIlxufTtcbi8vID09PT09PT09PT09PT09PT09PT09IFNJTVBMRSBUWVBFIFBST0NFU1NPUlMgPT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBzdHJpbmdQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGNvbnN0IGpzb24gPSBfanNvbjtcbiAgICBqc29uLnR5cGUgPSBcInN0cmluZ1wiO1xuICAgIGNvbnN0IHsgbWluaW11bSwgbWF4aW11bSwgZm9ybWF0LCBwYXR0ZXJucywgY29udGVudEVuY29kaW5nIH0gPSBzY2hlbWEuX3pvZC5iYWc7XG4gICAgaWYgKHR5cGVvZiBtaW5pbXVtID09PSBcIm51bWJlclwiKSBqc29uLm1pbkxlbmd0aCA9IG1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBtYXhpbXVtID09PSBcIm51bWJlclwiKSBqc29uLm1heExlbmd0aCA9IG1heGltdW07XG4gICAgLy8gY3VzdG9tIHBhdHRlcm4gb3ZlcnJpZGVzIGZvcm1hdFxuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgICAganNvbi5mb3JtYXQgPSBmb3JtYXRNYXBbZm9ybWF0XSA/PyBmb3JtYXQ7XG4gICAgICAgIGlmIChqc29uLmZvcm1hdCA9PT0gXCJcIikgZGVsZXRlIGpzb24uZm9ybWF0OyAvLyBlbXB0eSBmb3JtYXQgaXMgbm90IHZhbGlkXG4gICAgICAgIC8vIEpTT04gU2NoZW1hIGZvcm1hdDogXCJ0aW1lXCIgcmVxdWlyZXMgYSBmdWxsIHRpbWUgd2l0aCBvZmZzZXQgb3IgWlxuICAgICAgICAvLyB6Lmlzby50aW1lKCkgZG9lcyBub3QgaW5jbHVkZSB0aW1lem9uZSBpbmZvcm1hdGlvbiwgc28gZm9ybWF0OiBcInRpbWVcIiBzaG91bGQgbmV2ZXIgYmUgdXNlZFxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcInRpbWVcIikge1xuICAgICAgICAgICAgZGVsZXRlIGpzb24uZm9ybWF0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb250ZW50RW5jb2RpbmcpIGpzb24uY29udGVudEVuY29kaW5nID0gY29udGVudEVuY29kaW5nO1xuICAgIGlmIChwYXR0ZXJucyAmJiBwYXR0ZXJucy5zaXplID4gMCkge1xuICAgICAgICBjb25zdCByZWdleGVzID0gW1xuICAgICAgICAgICAgLi4ucGF0dGVybnNcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHJlZ2V4ZXMubGVuZ3RoID09PSAxKSBqc29uLnBhdHRlcm4gPSByZWdleGVzWzBdLnNvdXJjZTtcbiAgICAgICAgZWxzZSBpZiAocmVnZXhlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBqc29uLmFsbE9mID0gW1xuICAgICAgICAgICAgICAgIC4uLnJlZ2V4ZXMubWFwKChyZWdleCk9Pih7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHgudGFyZ2V0ID09PSBcImRyYWZ0LTA3XCIgfHwgY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wNFwiIHx8IGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIiA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9IDoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiByZWdleC5zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBudW1iZXJQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGNvbnN0IGpzb24gPSBfanNvbjtcbiAgICBjb25zdCB7IG1pbmltdW0sIG1heGltdW0sIGZvcm1hdCwgbXVsdGlwbGVPZiwgZXhjbHVzaXZlTWF4aW11bSwgZXhjbHVzaXZlTWluaW11bSB9ID0gc2NoZW1hLl96b2QuYmFnO1xuICAgIGlmICh0eXBlb2YgZm9ybWF0ID09PSBcInN0cmluZ1wiICYmIGZvcm1hdC5pbmNsdWRlcyhcImludFwiKSkganNvbi50eXBlID0gXCJpbnRlZ2VyXCI7XG4gICAgZWxzZSBqc29uLnR5cGUgPSBcIm51bWJlclwiO1xuICAgIGlmICh0eXBlb2YgZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBpZiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wNFwiIHx8IGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICAgICAganNvbi5taW5pbXVtID0gZXhjbHVzaXZlTWluaW11bTtcbiAgICAgICAgICAgIGpzb24uZXhjbHVzaXZlTWluaW11bSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqc29uLmV4Y2x1c2l2ZU1pbmltdW0gPSBleGNsdXNpdmVNaW5pbXVtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBqc29uLm1pbmltdW0gPSBtaW5pbXVtO1xuICAgICAgICBpZiAodHlwZW9mIGV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIgJiYgY3R4LnRhcmdldCAhPT0gXCJkcmFmdC0wNFwiKSB7XG4gICAgICAgICAgICBpZiAoZXhjbHVzaXZlTWluaW11bSA+PSBtaW5pbXVtKSBkZWxldGUganNvbi5taW5pbXVtO1xuICAgICAgICAgICAgZWxzZSBkZWxldGUganNvbi5leGNsdXNpdmVNaW5pbXVtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBpZiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wNFwiIHx8IGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICAgICAganNvbi5tYXhpbXVtID0gZXhjbHVzaXZlTWF4aW11bTtcbiAgICAgICAgICAgIGpzb24uZXhjbHVzaXZlTWF4aW11bSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqc29uLmV4Y2x1c2l2ZU1heGltdW0gPSBleGNsdXNpdmVNYXhpbXVtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBqc29uLm1heGltdW0gPSBtYXhpbXVtO1xuICAgICAgICBpZiAodHlwZW9mIGV4Y2x1c2l2ZU1heGltdW0gPT09IFwibnVtYmVyXCIgJiYgY3R4LnRhcmdldCAhPT0gXCJkcmFmdC0wNFwiKSB7XG4gICAgICAgICAgICBpZiAoZXhjbHVzaXZlTWF4aW11bSA8PSBtYXhpbXVtKSBkZWxldGUganNvbi5tYXhpbXVtO1xuICAgICAgICAgICAgZWxzZSBkZWxldGUganNvbi5leGNsdXNpdmVNYXhpbXVtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbXVsdGlwbGVPZiA9PT0gXCJudW1iZXJcIikganNvbi5tdWx0aXBsZU9mID0gbXVsdGlwbGVPZjtcbn07XG5leHBvcnQgY29uc3QgYm9vbGVhblByb2Nlc3NvciA9IChfc2NoZW1hLCBfY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGpzb24udHlwZSA9IFwiYm9vbGVhblwiO1xufTtcbmV4cG9ydCBjb25zdCBiaWdpbnRQcm9jZXNzb3IgPSAoX3NjaGVtYSwgY3R4LCBfanNvbiwgX3BhcmFtcyk9PntcbiAgICBpZiAoY3R4LnVucmVwcmVzZW50YWJsZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJpZ0ludCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWFcIik7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzeW1ib2xQcm9jZXNzb3IgPSAoX3NjaGVtYSwgY3R4LCBfanNvbiwgX3BhcmFtcyk9PntcbiAgICBpZiAoY3R4LnVucmVwcmVzZW50YWJsZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bWJvbHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbnVsbFByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIGpzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICBqc29uLnR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICBqc29uLm51bGxhYmxlID0gdHJ1ZTtcbiAgICAgICAganNvbi5lbnVtID0gW1xuICAgICAgICAgICAgbnVsbFxuICAgICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb24udHlwZSA9IFwibnVsbFwiO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdW5kZWZpbmVkUHJvY2Vzc29yID0gKF9zY2hlbWEsIGN0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmRlZmluZWQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgdm9pZFByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVm9pZCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWFcIik7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBuZXZlclByb2Nlc3NvciA9IChfc2NoZW1hLCBfY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGpzb24ubm90ID0ge307XG59O1xuZXhwb3J0IGNvbnN0IGFueVByb2Nlc3NvciA9IChfc2NoZW1hLCBfY3R4LCBfanNvbiwgX3BhcmFtcyk9Pntcbi8vIGVtcHR5IHNjaGVtYSBhY2NlcHRzIGFueXRoaW5nXG59O1xuZXhwb3J0IGNvbnN0IHVua25vd25Qcm9jZXNzb3IgPSAoX3NjaGVtYSwgX2N0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4vLyBlbXB0eSBzY2hlbWEgYWNjZXB0cyBhbnl0aGluZ1xufTtcbmV4cG9ydCBjb25zdCBkYXRlUHJvY2Vzc29yID0gKF9zY2hlbWEsIGN0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRlIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGVudW1Qcm9jZXNzb3IgPSAoc2NoZW1hLCBfY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCB2YWx1ZXMgPSBnZXRFbnVtVmFsdWVzKGRlZi5lbnRyaWVzKTtcbiAgICAvLyBOdW1iZXIgZW51bXMgY2FuIGhhdmUgYm90aCBzdHJpbmcgYW5kIG51bWJlciB2YWx1ZXNcbiAgICBpZiAodmFsdWVzLmV2ZXJ5KCh2KT0+dHlwZW9mIHYgPT09IFwibnVtYmVyXCIpKSBqc29uLnR5cGUgPSBcIm51bWJlclwiO1xuICAgIGlmICh2YWx1ZXMuZXZlcnkoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikpIGpzb24udHlwZSA9IFwic3RyaW5nXCI7XG4gICAganNvbi5lbnVtID0gdmFsdWVzO1xufTtcbmV4cG9ydCBjb25zdCBsaXRlcmFsUHJvY2Vzc29yID0gKHNjaGVtYSwgY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCB2YWxzID0gW107XG4gICAgZm9yIChjb25zdCB2YWwgb2YgZGVmLnZhbHVlcyl7XG4gICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxpdGVyYWwgYHVuZGVmaW5lZGAgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdCBhZGQgdG8gdmFsc1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCaWdJbnQgbGl0ZXJhbHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWxzLnB1c2goTnVtYmVyKHZhbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFscy5wdXNoKHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gZG8gbm90aGluZyAoYW4gdW5kZWZpbmVkIGxpdGVyYWwgd2FzIHN0cmlwcGVkKVxuICAgIH0gZWxzZSBpZiAodmFscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgdmFsID0gdmFsc1swXTtcbiAgICAgICAganNvbi50eXBlID0gdmFsID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdmFsO1xuICAgICAgICBpZiAoY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0wNFwiIHx8IGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICAgICAganNvbi5lbnVtID0gW1xuICAgICAgICAgICAgICAgIHZhbFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGpzb24uY29uc3QgPSB2YWw7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodmFscy5ldmVyeSgodik9PnR5cGVvZiB2ID09PSBcIm51bWJlclwiKSkganNvbi50eXBlID0gXCJudW1iZXJcIjtcbiAgICAgICAgaWYgKHZhbHMuZXZlcnkoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikpIGpzb24udHlwZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIGlmICh2YWxzLmV2ZXJ5KCh2KT0+dHlwZW9mIHYgPT09IFwiYm9vbGVhblwiKSkganNvbi50eXBlID0gXCJib29sZWFuXCI7XG4gICAgICAgIGlmICh2YWxzLmV2ZXJ5KCh2KT0+diA9PT0gbnVsbCkpIGpzb24udHlwZSA9IFwibnVsbFwiO1xuICAgICAgICBqc29uLmVudW0gPSB2YWxzO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbmFuUHJvY2Vzc29yID0gKF9zY2hlbWEsIGN0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOYU4gY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdGVtcGxhdGVMaXRlcmFsUHJvY2Vzc29yID0gKHNjaGVtYSwgX2N0eCwganNvbiwgX3BhcmFtcyk9PntcbiAgICBjb25zdCBfanNvbiA9IGpzb247XG4gICAgY29uc3QgcGF0dGVybiA9IHNjaGVtYS5fem9kLnBhdHRlcm47XG4gICAgaWYgKCFwYXR0ZXJuKSB0aHJvdyBuZXcgRXJyb3IoXCJQYXR0ZXJuIG5vdCBmb3VuZCBpbiB0ZW1wbGF0ZSBsaXRlcmFsXCIpO1xuICAgIF9qc29uLnR5cGUgPSBcInN0cmluZ1wiO1xuICAgIF9qc29uLnBhdHRlcm4gPSBwYXR0ZXJuLnNvdXJjZTtcbn07XG5leHBvcnQgY29uc3QgZmlsZVByb2Nlc3NvciA9IChzY2hlbWEsIF9jdHgsIGpzb24sIF9wYXJhbXMpPT57XG4gICAgY29uc3QgX2pzb24gPSBqc29uO1xuICAgIGNvbnN0IGZpbGUgPSB7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJiaW5hcnlcIixcbiAgICAgICAgY29udGVudEVuY29kaW5nOiBcImJpbmFyeVwiXG4gICAgfTtcbiAgICBjb25zdCB7IG1pbmltdW0sIG1heGltdW0sIG1pbWUgfSA9IHNjaGVtYS5fem9kLmJhZztcbiAgICBpZiAobWluaW11bSAhPT0gdW5kZWZpbmVkKSBmaWxlLm1pbkxlbmd0aCA9IG1pbmltdW07XG4gICAgaWYgKG1heGltdW0gIT09IHVuZGVmaW5lZCkgZmlsZS5tYXhMZW5ndGggPSBtYXhpbXVtO1xuICAgIGlmIChtaW1lKSB7XG4gICAgICAgIGlmIChtaW1lLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgZmlsZS5jb250ZW50TWVkaWFUeXBlID0gbWltZVswXTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2pzb24sIGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihfanNvbiwgZmlsZSk7IC8vIHNoYXJlZCBwcm9wcyBhdCByb290XG4gICAgICAgICAgICBfanNvbi5hbnlPZiA9IG1pbWUubWFwKChtKT0+KHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudE1lZGlhVHlwZTogbVxuICAgICAgICAgICAgICAgIH0pKTsgLy8gb25seSBjb250ZW50TWVkaWFUeXBlIGRpZmZlcnNcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oX2pzb24sIGZpbGUpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc3VjY2Vzc1Byb2Nlc3NvciA9IChfc2NoZW1hLCBfY3R4LCBqc29uLCBfcGFyYW1zKT0+e1xuICAgIGpzb24udHlwZSA9IFwiYm9vbGVhblwiO1xufTtcbmV4cG9ydCBjb25zdCBjdXN0b21Qcm9jZXNzb3IgPSAoX3NjaGVtYSwgY3R4LCBfanNvbiwgX3BhcmFtcyk9PntcbiAgICBpZiAoY3R4LnVucmVwcmVzZW50YWJsZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkN1c3RvbSB0eXBlcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWFcIik7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBmdW5jdGlvblByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnVuY3Rpb24gdHlwZXMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hXCIpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtUHJvY2Vzc29yID0gKF9zY2hlbWEsIGN0eCwgX2pzb24sIF9wYXJhbXMpPT57XG4gICAgaWYgKGN0eC51bnJlcHJlc2VudGFibGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc2Zvcm1zIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IG1hcFByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWFwIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNldFByb2Nlc3NvciA9IChfc2NoZW1hLCBjdHgsIF9qc29uLCBfcGFyYW1zKT0+e1xuICAgIGlmIChjdHgudW5yZXByZXNlbnRhYmxlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2V0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT0gQ09NUE9TSVRFIFRZUEUgUFJPQ0VTU09SUyA9PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGNvbnN0IGFycmF5UHJvY2Vzc29yID0gKHNjaGVtYSwgY3R4LCBfanNvbiwgcGFyYW1zKT0+e1xuICAgIGNvbnN0IGpzb24gPSBfanNvbjtcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgeyBtaW5pbXVtLCBtYXhpbXVtIH0gPSBzY2hlbWEuX3pvZC5iYWc7XG4gICAgaWYgKHR5cGVvZiBtaW5pbXVtID09PSBcIm51bWJlclwiKSBqc29uLm1pbkl0ZW1zID0gbWluaW11bTtcbiAgICBpZiAodHlwZW9mIG1heGltdW0gPT09IFwibnVtYmVyXCIpIGpzb24ubWF4SXRlbXMgPSBtYXhpbXVtO1xuICAgIGpzb24udHlwZSA9IFwiYXJyYXlcIjtcbiAgICBqc29uLml0ZW1zID0gcHJvY2VzcyhkZWYuZWxlbWVudCwgY3R4LCB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICBcIml0ZW1zXCJcbiAgICAgICAgXVxuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCBvYmplY3RQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QganNvbiA9IF9qc29uO1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBqc29uLnR5cGUgPSBcIm9iamVjdFwiO1xuICAgIGpzb24ucHJvcGVydGllcyA9IHt9O1xuICAgIGNvbnN0IHNoYXBlID0gZGVmLnNoYXBlO1xuICAgIGZvcihjb25zdCBrZXkgaW4gc2hhcGUpe1xuICAgICAgICBqc29uLnByb3BlcnRpZXNba2V5XSA9IHByb2Nlc3Moc2hhcGVba2V5XSwgY3R4LCB7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyByZXF1aXJlZCBrZXlzXG4gICAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoc2hhcGUpKTtcbiAgICBjb25zdCByZXF1aXJlZEtleXMgPSBuZXcgU2V0KFtcbiAgICAgICAgLi4uYWxsS2V5c1xuICAgIF0uZmlsdGVyKChrZXkpPT57XG4gICAgICAgIGNvbnN0IHYgPSBkZWYuc2hhcGVba2V5XS5fem9kO1xuICAgICAgICBpZiAoY3R4LmlvID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB2Lm9wdGluID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdi5vcHRvdXQgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBpZiAocmVxdWlyZWRLZXlzLnNpemUgPiAwKSB7XG4gICAgICAgIGpzb24ucmVxdWlyZWQgPSBBcnJheS5mcm9tKHJlcXVpcmVkS2V5cyk7XG4gICAgfVxuICAgIC8vIGNhdGNoYWxsXG4gICAgaWYgKGRlZi5jYXRjaGFsbD8uX3pvZC5kZWYudHlwZSA9PT0gXCJuZXZlclwiKSB7XG4gICAgICAgIC8vIHN0cmljdFxuICAgICAgICBqc29uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghZGVmLmNhdGNoYWxsKSB7XG4gICAgICAgIC8vIHJlZ3VsYXJcbiAgICAgICAgaWYgKGN0eC5pbyA9PT0gXCJvdXRwdXRcIikganNvbi5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZGVmLmNhdGNoYWxsKSB7XG4gICAgICAgIGpzb24uYWRkaXRpb25hbFByb3BlcnRpZXMgPSBwcm9jZXNzKGRlZi5jYXRjaGFsbCwgY3R4LCB7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdW5pb25Qcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIGpzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgLy8gRXhjbHVzaXZlIHVuaW9ucyAoaW5jbHVzaXZlID09PSBmYWxzZSkgdXNlIG9uZU9mIChleGFjdGx5IG9uZSBtYXRjaCkgaW5zdGVhZCBvZiBhbnlPZiAob25lIG9yIG1vcmUgbWF0Y2hlcylcbiAgICAvLyBUaGlzIGluY2x1ZGVzIGJvdGggei54b3IoKSBhbmQgZGlzY3JpbWluYXRlZCB1bmlvbnNcbiAgICBjb25zdCBpc0V4Y2x1c2l2ZSA9IGRlZi5pbmNsdXNpdmUgPT09IGZhbHNlO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBkZWYub3B0aW9ucy5tYXAoKHgsIGkpPT5wcm9jZXNzKHgsIGN0eCwge1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgICAgIC4uLnBhcmFtcy5wYXRoLFxuICAgICAgICAgICAgICAgIGlzRXhjbHVzaXZlID8gXCJvbmVPZlwiIDogXCJhbnlPZlwiLFxuICAgICAgICAgICAgICAgIGlcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkpO1xuICAgIGlmIChpc0V4Y2x1c2l2ZSkge1xuICAgICAgICBqc29uLm9uZU9mID0gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgICBqc29uLmFueU9mID0gb3B0aW9ucztcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGludGVyc2VjdGlvblByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwganNvbiwgcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCBhID0gcHJvY2VzcyhkZWYubGVmdCwgY3R4LCB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICBcImFsbE9mXCIsXG4gICAgICAgICAgICAwXG4gICAgICAgIF1cbiAgICB9KTtcbiAgICBjb25zdCBiID0gcHJvY2VzcyhkZWYucmlnaHQsIGN0eCwge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgIC4uLnBhcmFtcy5wYXRoLFxuICAgICAgICAgICAgXCJhbGxPZlwiLFxuICAgICAgICAgICAgMVxuICAgICAgICBdXG4gICAgfSk7XG4gICAgY29uc3QgaXNTaW1wbGVJbnRlcnNlY3Rpb24gPSAodmFsKT0+XCJhbGxPZlwiIGluIHZhbCAmJiBPYmplY3Qua2V5cyh2YWwpLmxlbmd0aCA9PT0gMTtcbiAgICBjb25zdCBhbGxPZiA9IFtcbiAgICAgICAgLi4uaXNTaW1wbGVJbnRlcnNlY3Rpb24oYSkgPyBhLmFsbE9mIDogW1xuICAgICAgICAgICAgYVxuICAgICAgICBdLFxuICAgICAgICAuLi5pc1NpbXBsZUludGVyc2VjdGlvbihiKSA/IGIuYWxsT2YgOiBbXG4gICAgICAgICAgICBiXG4gICAgICAgIF1cbiAgICBdO1xuICAgIGpzb24uYWxsT2YgPSBhbGxPZjtcbn07XG5leHBvcnQgY29uc3QgdHVwbGVQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QganNvbiA9IF9qc29uO1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBqc29uLnR5cGUgPSBcImFycmF5XCI7XG4gICAgY29uc3QgcHJlZml4UGF0aCA9IGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMjAyMC0xMlwiID8gXCJwcmVmaXhJdGVtc1wiIDogXCJpdGVtc1wiO1xuICAgIGNvbnN0IHJlc3RQYXRoID0gY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0yMDIwLTEyXCIgPyBcIml0ZW1zXCIgOiBjdHgudGFyZ2V0ID09PSBcIm9wZW5hcGktMy4wXCIgPyBcIml0ZW1zXCIgOiBcImFkZGl0aW9uYWxJdGVtc1wiO1xuICAgIGNvbnN0IHByZWZpeEl0ZW1zID0gZGVmLml0ZW1zLm1hcCgoeCwgaSk9PnByb2Nlc3MoeCwgY3R4LCB7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4ucGFyYW1zLnBhdGgsXG4gICAgICAgICAgICAgICAgcHJlZml4UGF0aCxcbiAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pKTtcbiAgICBjb25zdCByZXN0ID0gZGVmLnJlc3QgPyBwcm9jZXNzKGRlZi5yZXN0LCBjdHgsIHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAuLi5wYXJhbXMucGF0aCxcbiAgICAgICAgICAgIHJlc3RQYXRoLFxuICAgICAgICAgICAgLi4uY3R4LnRhcmdldCA9PT0gXCJvcGVuYXBpLTMuMFwiID8gW1xuICAgICAgICAgICAgICAgIGRlZi5pdGVtcy5sZW5ndGhcbiAgICAgICAgICAgIF0gOiBbXVxuICAgICAgICBdXG4gICAgfSkgOiBudWxsO1xuICAgIGlmIChjdHgudGFyZ2V0ID09PSBcImRyYWZ0LTIwMjAtMTJcIikge1xuICAgICAgICBqc29uLnByZWZpeEl0ZW1zID0gcHJlZml4SXRlbXM7XG4gICAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgICAgICBqc29uLml0ZW1zID0gcmVzdDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3R4LnRhcmdldCA9PT0gXCJvcGVuYXBpLTMuMFwiKSB7XG4gICAgICAgIGpzb24uaXRlbXMgPSB7XG4gICAgICAgICAgICBhbnlPZjogcHJlZml4SXRlbXNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHJlc3QpIHtcbiAgICAgICAgICAgIGpzb24uaXRlbXMuYW55T2YucHVzaChyZXN0KTtcbiAgICAgICAgfVxuICAgICAgICBqc29uLm1pbkl0ZW1zID0gcHJlZml4SXRlbXMubGVuZ3RoO1xuICAgICAgICBpZiAoIXJlc3QpIHtcbiAgICAgICAgICAgIGpzb24ubWF4SXRlbXMgPSBwcmVmaXhJdGVtcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBqc29uLml0ZW1zID0gcHJlZml4SXRlbXM7XG4gICAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgICAgICBqc29uLmFkZGl0aW9uYWxJdGVtcyA9IHJlc3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbGVuZ3RoXG4gICAgY29uc3QgeyBtaW5pbXVtLCBtYXhpbXVtIH0gPSBzY2hlbWEuX3pvZC5iYWc7XG4gICAgaWYgKHR5cGVvZiBtaW5pbXVtID09PSBcIm51bWJlclwiKSBqc29uLm1pbkl0ZW1zID0gbWluaW11bTtcbiAgICBpZiAodHlwZW9mIG1heGltdW0gPT09IFwibnVtYmVyXCIpIGpzb24ubWF4SXRlbXMgPSBtYXhpbXVtO1xufTtcbmV4cG9ydCBjb25zdCByZWNvcmRQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QganNvbiA9IF9qc29uO1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBqc29uLnR5cGUgPSBcIm9iamVjdFwiO1xuICAgIC8vIEZvciBsb29zZVJlY29yZCB3aXRoIHJlZ2V4IHBhdHRlcm5zLCB1c2UgcGF0dGVyblByb3BlcnRpZXNcbiAgICAvLyBUaGlzIGNvcnJlY3RseSByZXByZXNlbnRzIFwib25seSB2YWxpZGF0ZSBrZXlzIG1hdGNoaW5nIHRoZSBwYXR0ZXJuXCIgc2VtYW50aWNzXG4gICAgLy8gYW5kIGNvbXBvc2VzIHdlbGwgd2l0aCBhbGxPZiAoaW50ZXJzZWN0aW9ucylcbiAgICBjb25zdCBrZXlUeXBlID0gZGVmLmtleVR5cGU7XG4gICAgY29uc3Qga2V5QmFnID0ga2V5VHlwZS5fem9kLmJhZztcbiAgICBjb25zdCBwYXR0ZXJucyA9IGtleUJhZz8ucGF0dGVybnM7XG4gICAgaWYgKGRlZi5tb2RlID09PSBcImxvb3NlXCIgJiYgcGF0dGVybnMgJiYgcGF0dGVybnMuc2l6ZSA+IDApIHtcbiAgICAgICAgLy8gVXNlIHBhdHRlcm5Qcm9wZXJ0aWVzIGZvciBsb29zZVJlY29yZCB3aXRoIHJlZ2V4IHBhdHRlcm5zXG4gICAgICAgIGNvbnN0IHZhbHVlU2NoZW1hID0gcHJvY2VzcyhkZWYudmFsdWVUeXBlLCBjdHgsIHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICAuLi5wYXJhbXMucGF0aCxcbiAgICAgICAgICAgICAgICBcInBhdHRlcm5Qcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAgXCIqXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSk7XG4gICAgICAgIGpzb24ucGF0dGVyblByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKXtcbiAgICAgICAgICAgIGpzb24ucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybi5zb3VyY2VdID0gdmFsdWVTY2hlbWE7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiB1c2UgcHJvcGVydHlOYW1lcyArIGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gICAgICAgIGlmIChjdHgudGFyZ2V0ID09PSBcImRyYWZ0LTA3XCIgfHwgY3R4LnRhcmdldCA9PT0gXCJkcmFmdC0yMDIwLTEyXCIpIHtcbiAgICAgICAgICAgIGpzb24ucHJvcGVydHlOYW1lcyA9IHByb2Nlc3MoZGVmLmtleVR5cGUsIGN0eCwge1xuICAgICAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgICAgIC4uLnBhcmFtcy5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBcInByb3BlcnR5TmFtZXNcIlxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGpzb24uYWRkaXRpb25hbFByb3BlcnRpZXMgPSBwcm9jZXNzKGRlZi52YWx1ZVR5cGUsIGN0eCwge1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgICAgIC4uLnBhcmFtcy5wYXRoLFxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQWRkIHJlcXVpcmVkIGZvciBrZXlzIHdpdGggZGlzY3JldGUgdmFsdWVzIChlbnVtLCBsaXRlcmFsLCBldGMuKVxuICAgIGNvbnN0IGtleVZhbHVlcyA9IGtleVR5cGUuX3pvZC52YWx1ZXM7XG4gICAgaWYgKGtleVZhbHVlcykge1xuICAgICAgICBjb25zdCB2YWxpZEtleVZhbHVlcyA9IFtcbiAgICAgICAgICAgIC4uLmtleVZhbHVlc1xuICAgICAgICBdLmZpbHRlcigodik9PnR5cGVvZiB2ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2ID09PSBcIm51bWJlclwiKTtcbiAgICAgICAgaWYgKHZhbGlkS2V5VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGpzb24ucmVxdWlyZWQgPSB2YWxpZEtleVZhbHVlcztcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbnVsbGFibGVQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIGpzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgaW5uZXIgPSBwcm9jZXNzKGRlZi5pbm5lclR5cGUsIGN0eCwgcGFyYW1zKTtcbiAgICBjb25zdCBzZWVuID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgaWYgKGN0eC50YXJnZXQgPT09IFwib3BlbmFwaS0zLjBcIikge1xuICAgICAgICBzZWVuLnJlZiA9IGRlZi5pbm5lclR5cGU7XG4gICAgICAgIGpzb24ubnVsbGFibGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb24uYW55T2YgPSBbXG4gICAgICAgICAgICBpbm5lcixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm51bGxcIlxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgbm9ub3B0aW9uYWxQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIF9qc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QgZGVmID0gc2NoZW1hLl96b2QuZGVmO1xuICAgIHByb2Nlc3MoZGVmLmlubmVyVHlwZSwgY3R4LCBwYXJhbXMpO1xuICAgIGNvbnN0IHNlZW4gPSBjdHguc2Vlbi5nZXQoc2NoZW1hKTtcbiAgICBzZWVuLnJlZiA9IGRlZi5pbm5lclR5cGU7XG59O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIGpzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgcHJvY2VzcyhkZWYuaW5uZXJUeXBlLCBjdHgsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHNlZW4ucmVmID0gZGVmLmlubmVyVHlwZTtcbiAgICBqc29uLmRlZmF1bHQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlZi5kZWZhdWx0VmFsdWUpKTtcbn07XG5leHBvcnQgY29uc3QgcHJlZmF1bHRQcm9jZXNzb3IgPSAoc2NoZW1hLCBjdHgsIGpzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgcHJvY2VzcyhkZWYuaW5uZXJUeXBlLCBjdHgsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHNlZW4ucmVmID0gZGVmLmlubmVyVHlwZTtcbiAgICBpZiAoY3R4LmlvID09PSBcImlucHV0XCIpIGpzb24uX3ByZWZhdWx0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZWYuZGVmYXVsdFZhbHVlKSk7XG59O1xuZXhwb3J0IGNvbnN0IGNhdGNoUHJvY2Vzc29yID0gKHNjaGVtYSwgY3R4LCBqc29uLCBwYXJhbXMpPT57XG4gICAgY29uc3QgZGVmID0gc2NoZW1hLl96b2QuZGVmO1xuICAgIHByb2Nlc3MoZGVmLmlubmVyVHlwZSwgY3R4LCBwYXJhbXMpO1xuICAgIGNvbnN0IHNlZW4gPSBjdHguc2Vlbi5nZXQoc2NoZW1hKTtcbiAgICBzZWVuLnJlZiA9IGRlZi5pbm5lclR5cGU7XG4gICAgbGV0IGNhdGNoVmFsdWU7XG4gICAgdHJ5IHtcbiAgICAgICAgY2F0Y2hWYWx1ZSA9IGRlZi5jYXRjaFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfSBjYXRjaCAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEeW5hbWljIGNhdGNoIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBKU09OIFNjaGVtYVwiKTtcbiAgICB9XG4gICAganNvbi5kZWZhdWx0ID0gY2F0Y2hWYWx1ZTtcbn07XG5leHBvcnQgY29uc3QgcGlwZVByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwgX2pzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gY3R4LmlvID09PSBcImlucHV0XCIgPyBkZWYuaW4uX3pvZC5kZWYudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGRlZi5vdXQgOiBkZWYuaW4gOiBkZWYub3V0O1xuICAgIHByb2Nlc3MoaW5uZXJUeXBlLCBjdHgsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHNlZW4ucmVmID0gaW5uZXJUeXBlO1xufTtcbmV4cG9ydCBjb25zdCByZWFkb25seVByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwganNvbiwgcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBwcm9jZXNzKGRlZi5pbm5lclR5cGUsIGN0eCwgcGFyYW1zKTtcbiAgICBjb25zdCBzZWVuID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgc2Vlbi5yZWYgPSBkZWYuaW5uZXJUeXBlO1xuICAgIGpzb24ucmVhZE9ubHkgPSB0cnVlO1xufTtcbmV4cG9ydCBjb25zdCBwcm9taXNlUHJvY2Vzc29yID0gKHNjaGVtYSwgY3R4LCBfanNvbiwgcGFyYW1zKT0+e1xuICAgIGNvbnN0IGRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBwcm9jZXNzKGRlZi5pbm5lclR5cGUsIGN0eCwgcGFyYW1zKTtcbiAgICBjb25zdCBzZWVuID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgc2Vlbi5yZWYgPSBkZWYuaW5uZXJUeXBlO1xufTtcbmV4cG9ydCBjb25zdCBvcHRpb25hbFByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwgX2pzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBkZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgcHJvY2VzcyhkZWYuaW5uZXJUeXBlLCBjdHgsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VlbiA9IGN0eC5zZWVuLmdldChzY2hlbWEpO1xuICAgIHNlZW4ucmVmID0gZGVmLmlubmVyVHlwZTtcbn07XG5leHBvcnQgY29uc3QgbGF6eVByb2Nlc3NvciA9IChzY2hlbWEsIGN0eCwgX2pzb24sIHBhcmFtcyk9PntcbiAgICBjb25zdCBpbm5lclR5cGUgPSBzY2hlbWEuX3pvZC5pbm5lclR5cGU7XG4gICAgcHJvY2Vzcyhpbm5lclR5cGUsIGN0eCwgcGFyYW1zKTtcbiAgICBjb25zdCBzZWVuID0gY3R4LnNlZW4uZ2V0KHNjaGVtYSk7XG4gICAgc2Vlbi5yZWYgPSBpbm5lclR5cGU7XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT0gQUxMIFBST0NFU1NPUlMgPT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBhbGxQcm9jZXNzb3JzID0ge1xuICAgIHN0cmluZzogc3RyaW5nUHJvY2Vzc29yLFxuICAgIG51bWJlcjogbnVtYmVyUHJvY2Vzc29yLFxuICAgIGJvb2xlYW46IGJvb2xlYW5Qcm9jZXNzb3IsXG4gICAgYmlnaW50OiBiaWdpbnRQcm9jZXNzb3IsXG4gICAgc3ltYm9sOiBzeW1ib2xQcm9jZXNzb3IsXG4gICAgbnVsbDogbnVsbFByb2Nlc3NvcixcbiAgICB1bmRlZmluZWQ6IHVuZGVmaW5lZFByb2Nlc3NvcixcbiAgICB2b2lkOiB2b2lkUHJvY2Vzc29yLFxuICAgIG5ldmVyOiBuZXZlclByb2Nlc3NvcixcbiAgICBhbnk6IGFueVByb2Nlc3NvcixcbiAgICB1bmtub3duOiB1bmtub3duUHJvY2Vzc29yLFxuICAgIGRhdGU6IGRhdGVQcm9jZXNzb3IsXG4gICAgZW51bTogZW51bVByb2Nlc3NvcixcbiAgICBsaXRlcmFsOiBsaXRlcmFsUHJvY2Vzc29yLFxuICAgIG5hbjogbmFuUHJvY2Vzc29yLFxuICAgIHRlbXBsYXRlX2xpdGVyYWw6IHRlbXBsYXRlTGl0ZXJhbFByb2Nlc3NvcixcbiAgICBmaWxlOiBmaWxlUHJvY2Vzc29yLFxuICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NQcm9jZXNzb3IsXG4gICAgY3VzdG9tOiBjdXN0b21Qcm9jZXNzb3IsXG4gICAgZnVuY3Rpb246IGZ1bmN0aW9uUHJvY2Vzc29yLFxuICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtUHJvY2Vzc29yLFxuICAgIG1hcDogbWFwUHJvY2Vzc29yLFxuICAgIHNldDogc2V0UHJvY2Vzc29yLFxuICAgIGFycmF5OiBhcnJheVByb2Nlc3NvcixcbiAgICBvYmplY3Q6IG9iamVjdFByb2Nlc3NvcixcbiAgICB1bmlvbjogdW5pb25Qcm9jZXNzb3IsXG4gICAgaW50ZXJzZWN0aW9uOiBpbnRlcnNlY3Rpb25Qcm9jZXNzb3IsXG4gICAgdHVwbGU6IHR1cGxlUHJvY2Vzc29yLFxuICAgIHJlY29yZDogcmVjb3JkUHJvY2Vzc29yLFxuICAgIG51bGxhYmxlOiBudWxsYWJsZVByb2Nlc3NvcixcbiAgICBub25vcHRpb25hbDogbm9ub3B0aW9uYWxQcm9jZXNzb3IsXG4gICAgZGVmYXVsdDogZGVmYXVsdFByb2Nlc3NvcixcbiAgICBwcmVmYXVsdDogcHJlZmF1bHRQcm9jZXNzb3IsXG4gICAgY2F0Y2g6IGNhdGNoUHJvY2Vzc29yLFxuICAgIHBpcGU6IHBpcGVQcm9jZXNzb3IsXG4gICAgcmVhZG9ubHk6IHJlYWRvbmx5UHJvY2Vzc29yLFxuICAgIHByb21pc2U6IHByb21pc2VQcm9jZXNzb3IsXG4gICAgb3B0aW9uYWw6IG9wdGlvbmFsUHJvY2Vzc29yLFxuICAgIGxhenk6IGxhenlQcm9jZXNzb3Jcbn07XG5leHBvcnQgZnVuY3Rpb24gdG9KU09OU2NoZW1hKGlucHV0LCBwYXJhbXMpIHtcbiAgICBpZiAoXCJfaWRtYXBcIiBpbiBpbnB1dCkge1xuICAgICAgICAvLyBSZWdpc3RyeSBjYXNlXG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gaW5wdXQ7XG4gICAgICAgIGNvbnN0IGN0eCA9IGluaXRpYWxpemVDb250ZXh0KHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHByb2Nlc3NvcnM6IGFsbFByb2Nlc3NvcnNcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRlZnMgPSB7fTtcbiAgICAgICAgLy8gRmlyc3QgcGFzczogcHJvY2VzcyBhbGwgc2NoZW1hcyB0byBidWlsZCB0aGUgc2VlbiBtYXBcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiByZWdpc3RyeS5faWRtYXAuZW50cmllcygpKXtcbiAgICAgICAgICAgIGNvbnN0IFtfLCBzY2hlbWFdID0gZW50cnk7XG4gICAgICAgICAgICBwcm9jZXNzKHNjaGVtYSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY2hlbWFzID0ge307XG4gICAgICAgIGNvbnN0IGV4dGVybmFsID0ge1xuICAgICAgICAgICAgcmVnaXN0cnksXG4gICAgICAgICAgICB1cmk6IHBhcmFtcz8udXJpLFxuICAgICAgICAgICAgZGVmc1xuICAgICAgICB9O1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbnRleHQgd2l0aCBleHRlcm5hbCBjb25maWd1cmF0aW9uXG4gICAgICAgIGN0eC5leHRlcm5hbCA9IGV4dGVybmFsO1xuICAgICAgICAvLyBTZWNvbmQgcGFzczogZW1pdCBlYWNoIHNjaGVtYVxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlZ2lzdHJ5Ll9pZG1hcC5lbnRyaWVzKCkpe1xuICAgICAgICAgICAgY29uc3QgW2tleSwgc2NoZW1hXSA9IGVudHJ5O1xuICAgICAgICAgICAgZXh0cmFjdERlZnMoY3R4LCBzY2hlbWEpO1xuICAgICAgICAgICAgc2NoZW1hc1trZXldID0gZmluYWxpemUoY3R4LCBzY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkZWZzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZzU2VnbWVudCA9IGN0eC50YXJnZXQgPT09IFwiZHJhZnQtMjAyMC0xMlwiID8gXCIkZGVmc1wiIDogXCJkZWZpbml0aW9uc1wiO1xuICAgICAgICAgICAgc2NoZW1hcy5fX3NoYXJlZCA9IHtcbiAgICAgICAgICAgICAgICBbZGVmc1NlZ21lbnRdOiBkZWZzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2hlbWFzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIFNpbmdsZSBzY2hlbWEgY2FzZVxuICAgIGNvbnN0IGN0eCA9IGluaXRpYWxpemVDb250ZXh0KHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwcm9jZXNzb3JzOiBhbGxQcm9jZXNzb3JzXG4gICAgfSk7XG4gICAgcHJvY2VzcyhpbnB1dCwgY3R4KTtcbiAgICBleHRyYWN0RGVmcyhjdHgsIGlucHV0KTtcbiAgICByZXR1cm4gZmluYWxpemUoY3R4LCBpbnB1dCk7XG59XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0ICogYXMgc2NoZW1hcyBmcm9tIFwiLi9zY2hlbWFzLmpzXCI7XG5leHBvcnQgY29uc3QgWm9kSVNPRGF0ZVRpbWUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRGF0ZVRpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09EYXRlVGltZS5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZGF0ZXRpbWUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0RhdGVUaW1lKFpvZElTT0RhdGVUaW1lLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElTT0RhdGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZElTT0RhdGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHNjaGVtYXMuWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0RhdGUoWm9kSVNPRGF0ZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RJU09UaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZElTT1RpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09UaW1lLmluaXQoaW5zdCwgZGVmKTtcbiAgICBzY2hlbWFzLlpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB0aW1lKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pc29UaW1lKFpvZElTT1RpbWUsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVNPRHVyYXRpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRHVyYXRpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09EdXJhdGlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZHVyYXRpb24ocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0R1cmF0aW9uKFpvZElTT0R1cmF0aW9uLCBwYXJhbXMpO1xufVxuIiwgImltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4uL2NvcmUvaW5kZXguanNcIjtcbmltcG9ydCB7ICRab2RFcnJvciB9IGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuLi9jb3JlL3V0aWwuanNcIjtcbmNvbnN0IGluaXRpYWxpemVyID0gKGluc3QsIGlzc3Vlcyk9PntcbiAgICAkWm9kRXJyb3IuaW5pdChpbnN0LCBpc3N1ZXMpO1xuICAgIGluc3QubmFtZSA9IFwiWm9kRXJyb3JcIjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpbnN0LCB7XG4gICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgdmFsdWU6IChtYXBwZXIpPT5jb3JlLmZvcm1hdEVycm9yKGluc3QsIG1hcHBlcilcbiAgICAgICAgfSxcbiAgICAgICAgZmxhdHRlbjoge1xuICAgICAgICAgICAgdmFsdWU6IChtYXBwZXIpPT5jb3JlLmZsYXR0ZW5FcnJvcihpbnN0LCBtYXBwZXIpXG4gICAgICAgIH0sXG4gICAgICAgIGFkZElzc3VlOiB7XG4gICAgICAgICAgICB2YWx1ZTogKGlzc3VlKT0+e1xuICAgICAgICAgICAgICAgIGluc3QuaXNzdWVzLnB1c2goaXNzdWUpO1xuICAgICAgICAgICAgICAgIGluc3QubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGluc3QuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGFkZElzc3Vlczoge1xuICAgICAgICAgICAgdmFsdWU6IChpc3N1ZXMpPT57XG4gICAgICAgICAgICAgICAgaW5zdC5pc3N1ZXMucHVzaCguLi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIGluc3QubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGluc3QuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzRW1wdHk6IHtcbiAgICAgICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3QuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiaXNFbXB0eVwiLCB7XG4vLyAgIGdldCgpIHtcbi8vICAgICByZXR1cm4gaW5zdC5pc3N1ZXMubGVuZ3RoID09PSAwO1xuLy8gICB9LFxuLy8gfSk7XG59O1xuZXhwb3J0IGNvbnN0IFpvZEVycm9yID0gY29yZS4kY29uc3RydWN0b3IoXCJab2RFcnJvclwiLCBpbml0aWFsaXplcik7XG5leHBvcnQgY29uc3QgWm9kUmVhbEVycm9yID0gY29yZS4kY29uc3RydWN0b3IoXCJab2RFcnJvclwiLCBpbml0aWFsaXplciwge1xuICAgIFBhcmVudDogRXJyb3Jcbn0pOyAvLyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6LmNvcmUuJFpvZEVycm9yTWFwQ3R4YCBpbnN0ZWFkLiAqL1xuIC8vIGV4cG9ydCB0eXBlIEVycm9yTWFwQ3R4ID0gY29yZS4kWm9kRXJyb3JNYXBDdHg7XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgWm9kUmVhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5leHBvcnQgY29uc3QgcGFyc2UgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fcGFyc2UoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBwYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3BhcnNlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlUGFyc2UgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZVBhcnNlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZVBhcnNlQXN5bmMoWm9kUmVhbEVycm9yKTtcbi8vIENvZGVjIGZ1bmN0aW9uc1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9lbmNvZGUoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBkZWNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZGVjb2RlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgZW5jb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZW5jb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBkZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9kZWNvZGVBc3luYyhab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZUVuY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVEZWNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZURlY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9zYWZlRW5jb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZURlY29kZUFzeW5jKFpvZFJlYWxFcnJvcik7XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyBwcm9jZXNzb3JzIGZyb20gXCIuLi9jb3JlL2pzb24tc2NoZW1hLXByb2Nlc3NvcnMuanNcIjtcbmltcG9ydCB7IGNyZWF0ZVN0YW5kYXJkSlNPTlNjaGVtYU1ldGhvZCwgY3JlYXRlVG9KU09OU2NoZW1hTWV0aG9kIH0gZnJvbSBcIi4uL2NvcmUvdG8tanNvbi1zY2hlbWEuanNcIjtcbmltcG9ydCAqIGFzIGNoZWNrcyBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCAqIGFzIGlzbyBmcm9tIFwiLi9pc28uanNcIjtcbmltcG9ydCAqIGFzIHBhcnNlIGZyb20gXCIuL3BhcnNlLmpzXCI7XG5leHBvcnQgY29uc3QgWm9kVHlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RUeXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0W1wifnN0YW5kYXJkXCJdLCB7XG4gICAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgICAgIGlucHV0OiBjcmVhdGVTdGFuZGFyZEpTT05TY2hlbWFNZXRob2QoaW5zdCwgXCJpbnB1dFwiKSxcbiAgICAgICAgICAgIG91dHB1dDogY3JlYXRlU3RhbmRhcmRKU09OU2NoZW1hTWV0aG9kKGluc3QsIFwib3V0cHV0XCIpXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0LnRvSlNPTlNjaGVtYSA9IGNyZWF0ZVRvSlNPTlNjaGVtYU1ldGhvZChpbnN0LCB7fSk7XG4gICAgaW5zdC5kZWYgPSBkZWY7XG4gICAgaW5zdC50eXBlID0gZGVmLnR5cGU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiX2RlZlwiLCB7XG4gICAgICAgIHZhbHVlOiBkZWZcbiAgICB9KTtcbiAgICAvLyBiYXNlIG1ldGhvZHNcbiAgICBpbnN0LmNoZWNrID0gKC4uLmNoZWNrcyk9PntcbiAgICAgICAgcmV0dXJuIGluc3QuY2xvbmUodXRpbC5tZXJnZURlZnMoZGVmLCB7XG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi5kZWYuY2hlY2tzID8/IFtdLFxuICAgICAgICAgICAgICAgIC4uLmNoZWNrcy5tYXAoKGNoKT0+dHlwZW9mIGNoID09PSBcImZ1bmN0aW9uXCIgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfem9kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6IGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjazogXCJjdXN0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25hdHRhY2g6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gOiBjaClcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSksIHtcbiAgICAgICAgICAgIHBhcmVudDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluc3Qud2l0aCA9IGluc3QuY2hlY2s7XG4gICAgaW5zdC5jbG9uZSA9IChkZWYsIHBhcmFtcyk9PmNvcmUuY2xvbmUoaW5zdCwgZGVmLCBwYXJhbXMpO1xuICAgIGluc3QuYnJhbmQgPSAoKT0+aW5zdDtcbiAgICBpbnN0LnJlZ2lzdGVyID0gKHJlZywgbWV0YSk9PntcbiAgICAgICAgcmVnLmFkZChpbnN0LCBtZXRhKTtcbiAgICAgICAgcmV0dXJuIGluc3Q7XG4gICAgfTtcbiAgICAvLyBwYXJzaW5nXG4gICAgaW5zdC5wYXJzZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5wYXJzZShpbnN0LCBkYXRhLCBwYXJhbXMsIHtcbiAgICAgICAgICAgIGNhbGxlZTogaW5zdC5wYXJzZVxuICAgICAgICB9KTtcbiAgICBpbnN0LnNhZmVQYXJzZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlUGFyc2UoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnBhcnNlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2UucGFyc2VBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMsIHtcbiAgICAgICAgICAgIGNhbGxlZTogaW5zdC5wYXJzZUFzeW5jXG4gICAgICAgIH0pO1xuICAgIGluc3Quc2FmZVBhcnNlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZVBhcnNlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNwYSA9IGluc3Quc2FmZVBhcnNlQXN5bmM7XG4gICAgLy8gZW5jb2RpbmcvZGVjb2RpbmdcbiAgICBpbnN0LmVuY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5lbmNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LmRlY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5kZWNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LmVuY29kZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLmVuY29kZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5kZWNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5kZWNvZGVBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3Quc2FmZUVuY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRW5jb2RlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zYWZlRGVjb2RlID0gKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnNhZmVEZWNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNhZmVFbmNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRW5jb2RlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNhZmVEZWNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRGVjb2RlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICAvLyByZWZpbmVtZW50c1xuICAgIGluc3QucmVmaW5lID0gKGNoZWNrLCBwYXJhbXMpPT5pbnN0LmNoZWNrKHJlZmluZShjaGVjaywgcGFyYW1zKSk7XG4gICAgaW5zdC5zdXBlclJlZmluZSA9IChyZWZpbmVtZW50KT0+aW5zdC5jaGVjayhzdXBlclJlZmluZShyZWZpbmVtZW50KSk7XG4gICAgaW5zdC5vdmVyd3JpdGUgPSAoZm4pPT5pbnN0LmNoZWNrKGNoZWNrcy5vdmVyd3JpdGUoZm4pKTtcbiAgICAvLyB3cmFwcGVyc1xuICAgIGluc3Qub3B0aW9uYWwgPSAoKT0+b3B0aW9uYWwoaW5zdCk7XG4gICAgaW5zdC5leGFjdE9wdGlvbmFsID0gKCk9PmV4YWN0T3B0aW9uYWwoaW5zdCk7XG4gICAgaW5zdC5udWxsYWJsZSA9ICgpPT5udWxsYWJsZShpbnN0KTtcbiAgICBpbnN0Lm51bGxpc2ggPSAoKT0+b3B0aW9uYWwobnVsbGFibGUoaW5zdCkpO1xuICAgIGluc3Qubm9ub3B0aW9uYWwgPSAocGFyYW1zKT0+bm9ub3B0aW9uYWwoaW5zdCwgcGFyYW1zKTtcbiAgICBpbnN0LmFycmF5ID0gKCk9PmFycmF5KGluc3QpO1xuICAgIGluc3Qub3IgPSAoYXJnKT0+dW5pb24oW1xuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGFyZ1xuICAgICAgICBdKTtcbiAgICBpbnN0LmFuZCA9IChhcmcpPT5pbnRlcnNlY3Rpb24oaW5zdCwgYXJnKTtcbiAgICBpbnN0LnRyYW5zZm9ybSA9ICh0eCk9PnBpcGUoaW5zdCwgdHJhbnNmb3JtKHR4KSk7XG4gICAgaW5zdC5kZWZhdWx0ID0gKGRlZik9Pl9kZWZhdWx0KGluc3QsIGRlZik7XG4gICAgaW5zdC5wcmVmYXVsdCA9IChkZWYpPT5wcmVmYXVsdChpbnN0LCBkZWYpO1xuICAgIC8vIGluc3QuY29hbGVzY2UgPSAoZGVmLCBwYXJhbXMpID0+IGNvYWxlc2NlKGluc3QsIGRlZiwgcGFyYW1zKTtcbiAgICBpbnN0LmNhdGNoID0gKHBhcmFtcyk9Pl9jYXRjaChpbnN0LCBwYXJhbXMpO1xuICAgIGluc3QucGlwZSA9ICh0YXJnZXQpPT5waXBlKGluc3QsIHRhcmdldCk7XG4gICAgaW5zdC5yZWFkb25seSA9ICgpPT5yZWFkb25seShpbnN0KTtcbiAgICAvLyBtZXRhXG4gICAgaW5zdC5kZXNjcmliZSA9IChkZXNjcmlwdGlvbik9PntcbiAgICAgICAgY29uc3QgY2wgPSBpbnN0LmNsb25lKCk7XG4gICAgICAgIGNvcmUuZ2xvYmFsUmVnaXN0cnkuYWRkKGNsLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiZGVzY3JpcHRpb25cIiwge1xuICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmUuZ2xvYmFsUmVnaXN0cnkuZ2V0KGluc3QpPy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgaW5zdC5tZXRhID0gKC4uLmFyZ3MpPT57XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmUuZ2xvYmFsUmVnaXN0cnkuZ2V0KGluc3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsID0gaW5zdC5jbG9uZSgpO1xuICAgICAgICBjb3JlLmdsb2JhbFJlZ2lzdHJ5LmFkZChjbCwgYXJnc1swXSk7XG4gICAgICAgIHJldHVybiBjbDtcbiAgICB9O1xuICAgIC8vIGhlbHBlcnNcbiAgICBpbnN0LmlzT3B0aW9uYWwgPSAoKT0+aW5zdC5zYWZlUGFyc2UodW5kZWZpbmVkKS5zdWNjZXNzO1xuICAgIGluc3QuaXNOdWxsYWJsZSA9ICgpPT5pbnN0LnNhZmVQYXJzZShudWxsKS5zdWNjZXNzO1xuICAgIGluc3QuYXBwbHkgPSAoZm4pPT5mbihpbnN0KTtcbiAgICByZXR1cm4gaW5zdDtcbn0pO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3QgX1pvZFN0cmluZyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJfWm9kU3RyaW5nXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnN0cmluZ1Byb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0LmZvcm1hdCA9IGJhZy5mb3JtYXQgPz8gbnVsbDtcbiAgICBpbnN0Lm1pbkxlbmd0aCA9IGJhZy5taW5pbXVtID8/IG51bGw7XG4gICAgaW5zdC5tYXhMZW5ndGggPSBiYWcubWF4aW11bSA/PyBudWxsO1xuICAgIC8vIHZhbGlkYXRpb25zXG4gICAgaW5zdC5yZWdleCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MucmVnZXgoLi4uYXJncykpO1xuICAgIGluc3QuaW5jbHVkZXMgPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLmluY2x1ZGVzKC4uLmFyZ3MpKTtcbiAgICBpbnN0LnN0YXJ0c1dpdGggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLnN0YXJ0c1dpdGgoLi4uYXJncykpO1xuICAgIGluc3QuZW5kc1dpdGggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLmVuZHNXaXRoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm1pbiA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubWluTGVuZ3RoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm1heCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubWF4TGVuZ3RoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lmxlbmd0aCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubGVuZ3RoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm5vbmVtcHR5ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5taW5MZW5ndGgoMSwgLi4uYXJncykpO1xuICAgIGluc3QubG93ZXJjYXNlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmxvd2VyY2FzZShwYXJhbXMpKTtcbiAgICBpbnN0LnVwcGVyY2FzZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy51cHBlcmNhc2UocGFyYW1zKSk7XG4gICAgLy8gdHJhbnNmb3Jtc1xuICAgIGluc3QudHJpbSA9ICgpPT5pbnN0LmNoZWNrKGNoZWNrcy50cmltKCkpO1xuICAgIGluc3Qubm9ybWFsaXplID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5ub3JtYWxpemUoLi4uYXJncykpO1xuICAgIGluc3QudG9Mb3dlckNhc2UgPSAoKT0+aW5zdC5jaGVjayhjaGVja3MudG9Mb3dlckNhc2UoKSk7XG4gICAgaW5zdC50b1VwcGVyQ2FzZSA9ICgpPT5pbnN0LmNoZWNrKGNoZWNrcy50b1VwcGVyQ2FzZSgpKTtcbiAgICBpbnN0LnNsdWdpZnkgPSAoKT0+aW5zdC5jaGVjayhjaGVja3Muc2x1Z2lmeSgpKTtcbn0pO1xuZXhwb3J0IGNvbnN0IFpvZFN0cmluZyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RTdHJpbmdcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RTdHJpbmcuaW5pdChpbnN0LCBkZWYpO1xuICAgIF9ab2RTdHJpbmcuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZW1haWwgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9lbWFpbChab2RFbWFpbCwgcGFyYW1zKSk7XG4gICAgaW5zdC51cmwgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91cmwoWm9kVVJMLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmp3dCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2p3dChab2RKV1QsIHBhcmFtcykpO1xuICAgIGluc3QuZW1vamkgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9lbW9qaShab2RFbW9qaSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZ3VpZChab2RHVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LnV1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91dWlkKFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZHY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZHY0KFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZHY2ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZHY2KFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZHY3ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZHY3KFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QubmFub2lkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbmFub2lkKFpvZE5hbm9JRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZ3VpZChab2RHVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LmN1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9jdWlkKFpvZENVSUQsIHBhcmFtcykpO1xuICAgIGluc3QuY3VpZDIgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9jdWlkMihab2RDVUlEMiwgcGFyYW1zKSk7XG4gICAgaW5zdC51bGlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdWxpZChab2RVTElELCBwYXJhbXMpKTtcbiAgICBpbnN0LmJhc2U2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2Jhc2U2NChab2RCYXNlNjQsIHBhcmFtcykpO1xuICAgIGluc3QuYmFzZTY0dXJsID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fYmFzZTY0dXJsKFpvZEJhc2U2NFVSTCwgcGFyYW1zKSk7XG4gICAgaW5zdC54aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl94aWQoWm9kWElELCBwYXJhbXMpKTtcbiAgICBpbnN0LmtzdWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fa3N1aWQoWm9kS1NVSUQsIHBhcmFtcykpO1xuICAgIGluc3QuaXB2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2lwdjQoWm9kSVB2NCwgcGFyYW1zKSk7XG4gICAgaW5zdC5pcHY2ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5faXB2Nihab2RJUHY2LCBwYXJhbXMpKTtcbiAgICBpbnN0LmNpZHJ2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2NpZHJ2NChab2RDSURSdjQsIHBhcmFtcykpO1xuICAgIGluc3QuY2lkcnY2ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fY2lkcnY2KFpvZENJRFJ2NiwgcGFyYW1zKSk7XG4gICAgaW5zdC5lMTY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZTE2NChab2RFMTY0LCBwYXJhbXMpKTtcbiAgICAvLyBpc29cbiAgICBpbnN0LmRhdGV0aW1lID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaXNvLmRhdGV0aW1lKHBhcmFtcykpO1xuICAgIGluc3QuZGF0ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGlzby5kYXRlKHBhcmFtcykpO1xuICAgIGluc3QudGltZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGlzby50aW1lKHBhcmFtcykpO1xuICAgIGluc3QuZHVyYXRpb24gPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpc28uZHVyYXRpb24ocGFyYW1zKSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZyhab2RTdHJpbmcsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgX1pvZFN0cmluZy5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCBab2RFbWFpbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RFbWFpbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRW1haWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBlbWFpbChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZW1haWwoWm9kRW1haWwsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kR1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RHVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RHVUlELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZ3VpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZ3VpZChab2RHVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVVVJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kVVVJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3V1aWQoWm9kVVVJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3V1aWR2NChab2RVVUlELCBwYXJhbXMpO1xufVxuLy8gWm9kVVVJRHY2XG5leHBvcnQgZnVuY3Rpb24gdXVpZHY2KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91dWlkdjYoWm9kVVVJRCwgcGFyYW1zKTtcbn1cbi8vIFpvZFVVSUR2N1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NyhwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXVpZHY3KFpvZFVVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVVJMID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kVVJMLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdXJsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91cmwoWm9kVVJMLCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGh0dHBVcmwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VybChab2RVUkwsIHtcbiAgICAgICAgcHJvdG9jb2w6IC9eaHR0cHM/JC8sXG4gICAgICAgIGhvc3RuYW1lOiBjb3JlLnJlZ2V4ZXMuZG9tYWluLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRW1vamkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRW1vamlcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEVtb2ppLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZW1vamkocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Vtb2ppKFpvZEVtb2ppLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZE5hbm9JRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROYW5vSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZE5hbm9JRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG5hbm9pZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fbmFub2lkKFpvZE5hbm9JRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RDVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZENVSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjdWlkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9jdWlkKFpvZENVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ1VJRDIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ1VJRDJcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZENVSUQyLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gY3VpZDIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2N1aWQyKFpvZENVSUQyLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVMSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVUxJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kVUxJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHVsaWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VsaWQoWm9kVUxJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RYSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kWElEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RYSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB4aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3hpZChab2RYSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kS1NVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kS1NVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEtTVUlELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24ga3N1aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2tzdWlkKFpvZEtTVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElQdjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVB2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kSVB2NC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlwdjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lwdjQoWm9kSVB2NCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RNQUMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTUFDXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RNQUMuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBtYWMocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX21hYyhab2RNQUMsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVB2NiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJUHY2XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RJUHY2LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gaXB2NihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faXB2Nihab2RJUHY2LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZENJRFJ2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDSURSdjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDSURSdjQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjaWRydjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2NpZHJ2NChab2RDSURSdjQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ0lEUnY2ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENJRFJ2NlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZENJRFJ2Ni5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGNpZHJ2NihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fY2lkcnY2KFpvZENJRFJ2NiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCYXNlNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmFzZTY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RCYXNlNjQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Jhc2U2NChab2RCYXNlNjQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQmFzZTY0VVJMID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJhc2U2NFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQmFzZTY0VVJMLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0dXJsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9iYXNlNjR1cmwoWm9kQmFzZTY0VVJMLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEUxNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRTE2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRTE2NC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGUxNjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2UxNjQoWm9kRTE2NCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RKV1QgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSldUXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RKV1QuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBqd3QocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2p3dChab2RKV1QsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ3VzdG9tU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEN1c3RvbVN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQ3VzdG9tU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRm9ybWF0KGZvcm1hdCwgZm5PclJlZ2V4LCBfcGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgZm9ybWF0LCBmbk9yUmVnZXgsIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhvc3RuYW1lKF9wYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgXCJob3N0bmFtZVwiLCBjb3JlLnJlZ2V4ZXMuaG9zdG5hbWUsIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhleChfcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZ0Zvcm1hdChab2RDdXN0b21TdHJpbmdGb3JtYXQsIFwiaGV4XCIsIGNvcmUucmVnZXhlcy5oZXgsIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc2goYWxnLCBwYXJhbXMpIHtcbiAgICBjb25zdCBlbmMgPSBwYXJhbXM/LmVuYyA/PyBcImhleFwiO1xuICAgIGNvbnN0IGZvcm1hdCA9IGAke2FsZ31fJHtlbmN9YDtcbiAgICBjb25zdCByZWdleCA9IGNvcmUucmVnZXhlc1tmb3JtYXRdO1xuICAgIGlmICghcmVnZXgpIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGhhc2ggZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgZm9ybWF0LCByZWdleCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2ROdW1iZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTnVtYmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm51bWJlclByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5ndCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QuZ3RlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWluID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHQgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmx0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0LmludCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGludChwYXJhbXMpKTtcbiAgICBpbnN0LnNhZmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpbnQocGFyYW1zKSk7XG4gICAgaW5zdC5wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndCgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KDAsIHBhcmFtcykpO1xuICAgIGluc3Qubm9ucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKDAsIHBhcmFtcykpO1xuICAgIGluc3QubXVsdGlwbGVPZiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5zdGVwID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5tdWx0aXBsZU9mKHZhbHVlLCBwYXJhbXMpKTtcbiAgICAvLyBpbnN0LmZpbml0ZSA9IChwYXJhbXMpID0+IGluc3QuY2hlY2soY29yZS5maW5pdGUocGFyYW1zKSk7XG4gICAgaW5zdC5maW5pdGUgPSAoKT0+aW5zdDtcbiAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgIGluc3QubWluVmFsdWUgPSBNYXRoLm1heChiYWcubWluaW11bSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIGJhZy5leGNsdXNpdmVNaW5pbXVtID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgPz8gbnVsbDtcbiAgICBpbnN0Lm1heFZhbHVlID0gTWF0aC5taW4oYmFnLm1heGltdW0gPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBiYWcuZXhjbHVzaXZlTWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpID8/IG51bGw7XG4gICAgaW5zdC5pc0ludCA9IChiYWcuZm9ybWF0ID8/IFwiXCIpLmluY2x1ZGVzKFwiaW50XCIpIHx8IE51bWJlci5pc1NhZmVJbnRlZ2VyKGJhZy5tdWx0aXBsZU9mID8/IDAuNSk7XG4gICAgaW5zdC5pc0Zpbml0ZSA9IHRydWU7XG4gICAgaW5zdC5mb3JtYXQgPSBiYWcuZm9ybWF0ID8/IG51bGw7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBudW1iZXIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX251bWJlcihab2ROdW1iZXIsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kTnVtYmVyRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE51bWJlckZvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bWJlckZvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGludChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faW50KFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdDMyKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9mbG9hdDMyKFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdDY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9mbG9hdDY0KFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnQzMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faW50MzIoWm9kTnVtYmVyRm9ybWF0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVpbnQzMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdWludDMyKFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCb29sZWFuID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJvb2xlYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RCb29sZWFuLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmJvb2xlYW5Qcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYm9vbGVhbihab2RCb29sZWFuLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEJpZ0ludCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RCaWdJbnRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuYmlnaW50UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0Lmd0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1pbiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd0ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndCh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndGUgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW4gPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5sdCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHQodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHRlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KEJpZ0ludCgwKSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ub25wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZShCaWdJbnQoMCksIHBhcmFtcykpO1xuICAgIGluc3QubXVsdGlwbGVPZiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSk7XG4gICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0Lm1pblZhbHVlID0gYmFnLm1pbmltdW0gPz8gbnVsbDtcbiAgICBpbnN0Lm1heFZhbHVlID0gYmFnLm1heGltdW0gPz8gbnVsbDtcbiAgICBpbnN0LmZvcm1hdCA9IGJhZy5mb3JtYXQgPz8gbnVsbDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGJpZ2ludChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYmlnaW50KFpvZEJpZ0ludCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCaWdJbnRGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmlnSW50Rm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQmlnSW50Rm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG4vLyBpbnQ2NFxuZXhwb3J0IGZ1bmN0aW9uIGludDY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pbnQ2NChab2RCaWdJbnRGb3JtYXQsIHBhcmFtcyk7XG59XG4vLyB1aW50NjRcbmV4cG9ydCBmdW5jdGlvbiB1aW50NjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VpbnQ2NChab2RCaWdJbnRGb3JtYXQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kU3ltYm9sID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN5bWJvbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN5bWJvbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5zeW1ib2xQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc3ltYm9sKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9zeW1ib2woWm9kU3ltYm9sLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVuZGVmaW5lZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVbmRlZmluZWRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RVbmRlZmluZWQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudW5kZWZpbmVkUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbn0pO1xuZnVuY3Rpb24gX3VuZGVmaW5lZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdW5kZWZpbmVkKFpvZFVuZGVmaW5lZCwgcGFyYW1zKTtcbn1cbmV4cG9ydCB7IF91bmRlZmluZWQgYXMgdW5kZWZpbmVkIH07XG5leHBvcnQgY29uc3QgWm9kTnVsbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROdWxsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTnVsbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5udWxsUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbn0pO1xuZnVuY3Rpb24gX251bGwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX251bGwoWm9kTnVsbCwgcGFyYW1zKTtcbn1cbmV4cG9ydCB7IF9udWxsIGFzIG51bGwgfTtcbmV4cG9ydCBjb25zdCBab2RBbnkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQW55XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQW55LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmFueVByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBhbnkoKSB7XG4gICAgcmV0dXJuIGNvcmUuX2FueShab2RBbnkpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVua25vd24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVW5rbm93blwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFVua25vd24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudW5rbm93blByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB1bmtub3duKCkge1xuICAgIHJldHVybiBjb3JlLl91bmtub3duKFpvZFVua25vd24pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE5ldmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE5ldmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTmV2ZXIuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMubmV2ZXJQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbmV2ZXIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX25ldmVyKFpvZE5ldmVyLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFZvaWQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVm9pZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFZvaWQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudm9pZFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmZ1bmN0aW9uIF92b2lkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl92b2lkKFpvZFZvaWQsIHBhcmFtcyk7XG59XG5leHBvcnQgeyBfdm9pZCBhcyB2b2lkIH07XG5leHBvcnQgY29uc3QgWm9kRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRGF0ZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5kYXRlUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0Lm1pbiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBjb25zdCBjID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0Lm1pbkRhdGUgPSBjLm1pbmltdW0gPyBuZXcgRGF0ZShjLm1pbmltdW0pIDogbnVsbDtcbiAgICBpbnN0Lm1heERhdGUgPSBjLm1heGltdW0gPyBuZXcgRGF0ZShjLm1heGltdW0pIDogbnVsbDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2RhdGUoWm9kRGF0ZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RBcnJheSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RBcnJheVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEFycmF5LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmFycmF5UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LmVsZW1lbnQgPSBkZWYuZWxlbWVudDtcbiAgICBpbnN0Lm1pbiA9IChtaW5MZW5ndGgsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm1pbkxlbmd0aChtaW5MZW5ndGgsIHBhcmFtcykpO1xuICAgIGluc3Qubm9uZW1wdHkgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubWluTGVuZ3RoKDEsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKG1heExlbmd0aCwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubWF4TGVuZ3RoKG1heExlbmd0aCwgcGFyYW1zKSk7XG4gICAgaW5zdC5sZW5ndGggPSAobGVuLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sZW5ndGgobGVuLCBwYXJhbXMpKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0LmVsZW1lbnQ7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBhcnJheShlbGVtZW50LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYXJyYXkoWm9kQXJyYXksIGVsZW1lbnQsIHBhcmFtcyk7XG59XG4vLyAua2V5b2ZcbmV4cG9ydCBmdW5jdGlvbiBrZXlvZihzY2hlbWEpIHtcbiAgICBjb25zdCBzaGFwZSA9IHNjaGVtYS5fem9kLmRlZi5zaGFwZTtcbiAgICByZXR1cm4gX2VudW0oT2JqZWN0LmtleXMoc2hhcGUpKTtcbn1cbmV4cG9ydCBjb25zdCBab2RPYmplY3QgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kT2JqZWN0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kT2JqZWN0SklULmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm9iamVjdFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QsIFwic2hhcGVcIiwgKCk9PntcbiAgICAgICAgcmV0dXJuIGRlZi5zaGFwZTtcbiAgICB9KTtcbiAgICBpbnN0LmtleW9mID0gKCk9Pl9lbnVtKE9iamVjdC5rZXlzKGluc3QuX3pvZC5kZWYuc2hhcGUpKTtcbiAgICBpbnN0LmNhdGNoYWxsID0gKGNhdGNoYWxsKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IGNhdGNoYWxsXG4gICAgICAgIH0pO1xuICAgIGluc3QucGFzc3Rocm91Z2ggPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IHVua25vd24oKVxuICAgICAgICB9KTtcbiAgICBpbnN0Lmxvb3NlID0gKCk9Pmluc3QuY2xvbmUoe1xuICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiB1bmtub3duKClcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zdHJpY3QgPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IG5ldmVyKClcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zdHJpcCA9ICgpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIGluc3QuZXh0ZW5kID0gKGluY29taW5nKT0+e1xuICAgICAgICByZXR1cm4gdXRpbC5leHRlbmQoaW5zdCwgaW5jb21pbmcpO1xuICAgIH07XG4gICAgaW5zdC5zYWZlRXh0ZW5kID0gKGluY29taW5nKT0+e1xuICAgICAgICByZXR1cm4gdXRpbC5zYWZlRXh0ZW5kKGluc3QsIGluY29taW5nKTtcbiAgICB9O1xuICAgIGluc3QubWVyZ2UgPSAob3RoZXIpPT51dGlsLm1lcmdlKGluc3QsIG90aGVyKTtcbiAgICBpbnN0LnBpY2sgPSAobWFzayk9PnV0aWwucGljayhpbnN0LCBtYXNrKTtcbiAgICBpbnN0Lm9taXQgPSAobWFzayk9PnV0aWwub21pdChpbnN0LCBtYXNrKTtcbiAgICBpbnN0LnBhcnRpYWwgPSAoLi4uYXJncyk9PnV0aWwucGFydGlhbChab2RPcHRpb25hbCwgaW5zdCwgYXJnc1swXSk7XG4gICAgaW5zdC5yZXF1aXJlZCA9ICguLi5hcmdzKT0+dXRpbC5yZXF1aXJlZChab2ROb25PcHRpb25hbCwgaW5zdCwgYXJnc1swXSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Qoc2hhcGUsIHBhcmFtcykge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgc2hhcGU6IHNoYXBlID8/IHt9LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdChkZWYpO1xufVxuLy8gc3RyaWN0T2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0T2JqZWN0KHNoYXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBjYXRjaGFsbDogbmV2ZXIoKSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gbG9vc2VPYmplY3RcbmV4cG9ydCBmdW5jdGlvbiBsb29zZU9iamVjdChzaGFwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgY2F0Y2hhbGw6IHVua25vd24oKSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudW5pb25Qcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3Qub3B0aW9ucyA9IGRlZi5vcHRpb25zO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdW5pb24ob3B0aW9ucywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmlvbih7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFhvciA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RYb3JcIiwgKGluc3QsIGRlZik9PntcbiAgICBab2RVbmlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kWG9yLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnVuaW9uUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0Lm9wdGlvbnMgPSBkZWYub3B0aW9ucztcbn0pO1xuLyoqIENyZWF0ZXMgYW4gZXhjbHVzaXZlIHVuaW9uIChYT1IpIHdoZXJlIGV4YWN0bHkgb25lIG9wdGlvbiBtdXN0IG1hdGNoLlxuICogVW5saWtlIHJlZ3VsYXIgdW5pb25zIHRoYXQgc3VjY2VlZCB3aGVuIGFueSBvcHRpb24gbWF0Y2hlcywgeG9yIGZhaWxzIGlmXG4gKiB6ZXJvIG9yIG1vcmUgdGhhbiBvbmUgb3B0aW9uIG1hdGNoZXMgdGhlIGlucHV0LiAqLyBleHBvcnQgZnVuY3Rpb24geG9yKG9wdGlvbnMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kWG9yKHtcbiAgICAgICAgdHlwZTogXCJ1bmlvblwiLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRGlzY3JpbWluYXRlZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIFpvZFVuaW9uLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2REaXNjcmltaW5hdGVkVW5pb24uaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZGlzY3JpbWluYXRlZFVuaW9uKGRpc2NyaW1pbmF0b3IsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgIC8vIGNvbnN0IFtvcHRpb25zLCBwYXJhbXNdID0gYXJncztcbiAgICByZXR1cm4gbmV3IFpvZERpc2NyaW1pbmF0ZWRVbmlvbih7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgZGlzY3JpbWluYXRvcixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEludGVyc2VjdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJbnRlcnNlY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJbnRlcnNlY3Rpb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuaW50ZXJzZWN0aW9uUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdGlvbihsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kVHVwbGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVHVwbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUdXBsZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy50dXBsZVByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5yZXN0ID0gKHJlc3QpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICByZXN0OiByZXN0XG4gICAgICAgIH0pO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdHVwbGUoaXRlbXMsIF9wYXJhbXNPclJlc3QsIF9wYXJhbXMpIHtcbiAgICBjb25zdCBoYXNSZXN0ID0gX3BhcmFtc09yUmVzdCBpbnN0YW5jZW9mIGNvcmUuJFpvZFR5cGU7XG4gICAgY29uc3QgcGFyYW1zID0gaGFzUmVzdCA/IF9wYXJhbXMgOiBfcGFyYW1zT3JSZXN0O1xuICAgIGNvbnN0IHJlc3QgPSBoYXNSZXN0ID8gX3BhcmFtc09yUmVzdCA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgIHR5cGU6IFwidHVwbGVcIixcbiAgICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAgICByZXN0LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUmVjb3JkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFJlY29yZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFJlY29yZC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5yZWNvcmRQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3Qua2V5VHlwZSA9IGRlZi5rZXlUeXBlO1xuICAgIGluc3QudmFsdWVUeXBlID0gZGVmLnZhbHVlVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJyZWNvcmRcIixcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIHR5cGUgYWxrc2pmID0gY29yZS5vdXRwdXQ8Y29yZS4kWm9kUmVjb3JkS2V5PjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJ0aWFsUmVjb3JkKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgY29uc3QgayA9IGNvcmUuY2xvbmUoa2V5VHlwZSk7XG4gICAgay5fem9kLnZhbHVlcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgICAgIGtleVR5cGU6IGssXG4gICAgICAgIHZhbHVlVHlwZTogdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9vc2VSZWNvcmQoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZTogdmFsdWVUeXBlLFxuICAgICAgICBtb2RlOiBcImxvb3NlXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RNYXAgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTWFwXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTWFwLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm1hcFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5rZXlUeXBlID0gZGVmLmtleVR5cGU7XG4gICAgaW5zdC52YWx1ZVR5cGUgPSBkZWYudmFsdWVUeXBlO1xuICAgIGluc3QubWluID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX21pblNpemUoLi4uYXJncykpO1xuICAgIGluc3Qubm9uZW1wdHkgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9taW5TaXplKDEsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX21heFNpemUoLi4uYXJncykpO1xuICAgIGluc3Quc2l6ZSA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjb3JlLl9zaXplKC4uLmFyZ3MpKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kTWFwKHtcbiAgICAgICAgdHlwZTogXCJtYXBcIixcbiAgICAgICAga2V5VHlwZToga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RTZXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU2V0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU2V0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnNldFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5taW4gPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY29yZS5fbWluU2l6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC5ub25lbXB0eSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21pblNpemUoMSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY29yZS5fbWF4U2l6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC5zaXplID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX3NpemUoLi4uYXJncykpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc2V0KHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICB2YWx1ZVR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEVudW0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRW51bVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEVudW0uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuZW51bVByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC5lbnVtID0gZGVmLmVudHJpZXM7XG4gICAgaW5zdC5vcHRpb25zID0gT2JqZWN0LnZhbHVlcyhkZWYuZW50cmllcyk7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZGVmLmVudHJpZXMpKTtcbiAgICBpbnN0LmV4dHJhY3QgPSAodmFsdWVzLCBwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IG5ld0VudHJpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuICAgICAgICAgICAgaWYgKGtleXMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIG5ld0VudHJpZXNbdmFsdWVdID0gZGVmLmVudHJpZXNbdmFsdWVdO1xuICAgICAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgS2V5ICR7dmFsdWV9IG5vdCBmb3VuZCBpbiBlbnVtYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgICAgIC4uLmRlZixcbiAgICAgICAgICAgIGNoZWNrczogW10sXG4gICAgICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICAgICAgZW50cmllczogbmV3RW50cmllc1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluc3QuZXhjbHVkZSA9ICh2YWx1ZXMsIHBhcmFtcyk9PntcbiAgICAgICAgY29uc3QgbmV3RW50cmllcyA9IHtcbiAgICAgICAgICAgIC4uLmRlZi5lbnRyaWVzXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbiAgICAgICAgICAgIGlmIChrZXlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3RW50cmllc1t2YWx1ZV07XG4gICAgICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBLZXkgJHt2YWx1ZX0gbm90IGZvdW5kIGluIGVudW1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICAgICAgLi4uZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgICAgICBlbnRyaWVzOiBuZXdFbnRyaWVzXG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIF9lbnVtKHZhbHVlcywgcGFyYW1zKSB7XG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZXMubWFwKCh2KT0+W1xuICAgICAgICAgICAgdixcbiAgICAgICAgICAgIHZcbiAgICAgICAgXSkpIDogdmFsdWVzO1xuICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgeyBfZW51bSBhcyBlbnVtIH07XG4vKiogQGRlcHJlY2F0ZWQgVGhpcyBBUEkgaGFzIGJlZW4gbWVyZ2VkIGludG8gYHouZW51bSgpYC4gVXNlIGB6LmVudW0oKWAgaW5zdGVhZC5cbiAqXG4gKiBgYGB0c1xuICogZW51bSBDb2xvcnMgeyByZWQsIGdyZWVuLCBibHVlIH1cbiAqIHouZW51bShDb2xvcnMpO1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUVudW0oZW50cmllcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgIGVudHJpZXMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZExpdGVyYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RMaXRlcmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmxpdGVyYWxQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3QudmFsdWVzID0gbmV3IFNldChkZWYudmFsdWVzKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICBpZiAoZGVmLnZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzY2hlbWEgY29udGFpbnMgbXVsdGlwbGUgdmFsaWQgbGl0ZXJhbCB2YWx1ZXMuIFVzZSBgLnZhbHVlc2AgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVmLnZhbHVlc1swXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbCh2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RMaXRlcmFsKHtcbiAgICAgICAgdHlwZTogXCJsaXRlcmFsXCIsXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgIF0sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RGaWxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEZpbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RGaWxlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLmZpbGVQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3QubWluID0gKHNpemUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbWluU2l6ZShzaXplLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9IChzaXplLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21heFNpemUoc2l6ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW1lID0gKHR5cGVzLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21pbWUoQXJyYXkuaXNBcnJheSh0eXBlcykgPyB0eXBlcyA6IFtcbiAgICAgICAgICAgIHR5cGVzXG4gICAgICAgIF0sIHBhcmFtcykpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZmlsZShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZmlsZShab2RGaWxlLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFRyYW5zZm9ybSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RUcmFuc2Zvcm1cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUcmFuc2Zvcm0uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMudHJhbnNmb3JtUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKF9jdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RFbmNvZGVFcnJvcihpbnN0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuYWRkSXNzdWUgPSAoaXNzdWUpPT57XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKGlzc3VlLCBwYXlsb2FkLnZhbHVlLCBkZWYpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIFpvZCAzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgICAgY29uc3QgX2lzc3VlID0gaXNzdWU7XG4gICAgICAgICAgICAgICAgaWYgKF9pc3N1ZS5mYXRhbCkgX2lzc3VlLmNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmNvZGUgPz8gKF9pc3N1ZS5jb2RlID0gXCJjdXN0b21cIik7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmlucHV0ID8/IChfaXNzdWUuaW5wdXQgPSBwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuaW5zdCA/PyAoX2lzc3VlLmluc3QgPSBpbnN0KTtcbiAgICAgICAgICAgICAgICAvLyBfaXNzdWUuY29udGludWUgPz89IHRydWU7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKF9pc3N1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBkZWYudHJhbnNmb3JtKHBheWxvYWQudmFsdWUsIHBheWxvYWQpO1xuICAgICAgICBpZiAob3V0cHV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dC50aGVuKChvdXRwdXQpPT57XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBvdXRwdXQ7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICByZXR1cm4gbmV3IFpvZFRyYW5zZm9ybSh7XG4gICAgICAgIHR5cGU6IFwidHJhbnNmb3JtXCIsXG4gICAgICAgIHRyYW5zZm9ybTogZm5cbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RPcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RPcHRpb25hbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE9wdGlvbmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm9wdGlvbmFsUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kT3B0aW9uYWwoe1xuICAgICAgICB0eXBlOiBcIm9wdGlvbmFsXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRXhhY3RPcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RFeGFjdE9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRXhhY3RPcHRpb25hbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5vcHRpb25hbFByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBleGFjdE9wdGlvbmFsKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kRXhhY3RPcHRpb25hbCh7XG4gICAgICAgIHR5cGU6IFwib3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2ROdWxsYWJsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROdWxsYWJsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bGxhYmxlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm51bGxhYmxlUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG51bGxhYmxlKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kTnVsbGFibGUoe1xuICAgICAgICB0eXBlOiBcIm51bGxhYmxlXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG4vLyBudWxsaXNoXG5leHBvcnQgZnVuY3Rpb24gbnVsbGlzaChpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gb3B0aW9uYWwobnVsbGFibGUoaW5uZXJUeXBlKSk7XG59XG5leHBvcnQgY29uc3QgWm9kRGVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REZWZhdWx0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRGVmYXVsdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5kZWZhdWx0UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbiAgICBpbnN0LnJlbW92ZURlZmF1bHQgPSBpbnN0LnVud3JhcDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIF9kZWZhdWx0KGlubmVyVHlwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBab2REZWZhdWx0KHtcbiAgICAgICAgdHlwZTogXCJkZWZhdWx0XCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlLFxuICAgICAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0VmFsdWUoKSA6IHV0aWwuc2hhbGxvd0Nsb25lKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RQcmVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RQcmVmYXVsdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFByZWZhdWx0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnByZWZhdWx0UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZhdWx0KGlubmVyVHlwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RQcmVmYXVsdCh7XG4gICAgICAgIHR5cGU6IFwicHJlZmF1bHRcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGUsXG4gICAgICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGRlZmF1bHRWYWx1ZSgpIDogdXRpbC5zaGFsbG93Q2xvbmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE5vbk9wdGlvbmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE5vbk9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTm9uT3B0aW9uYWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMubm9ub3B0aW9uYWxQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbm9ub3B0aW9uYWwoaW5uZXJUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE5vbk9wdGlvbmFsKHtcbiAgICAgICAgdHlwZTogXCJub25vcHRpb25hbFwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFN1Y2Nlc3MgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU3VjY2Vzc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN1Y2Nlc3MuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuc3VjY2Vzc1Byb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzdWNjZXNzKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kU3VjY2Vzcyh7XG4gICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZENhdGNoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENhdGNoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQ2F0Y2guaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuY2F0Y2hQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xuICAgIGluc3QucmVtb3ZlQ2F0Y2ggPSBpbnN0LnVud3JhcDtcbn0pO1xuZnVuY3Rpb24gX2NhdGNoKGlubmVyVHlwZSwgY2F0Y2hWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICB0eXBlOiBcImNhdGNoXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlLFxuICAgICAgICBjYXRjaFZhbHVlOiB0eXBlb2YgY2F0Y2hWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gY2F0Y2hWYWx1ZSA6ICgpPT5jYXRjaFZhbHVlXG4gICAgfSk7XG59XG5leHBvcnQgeyBfY2F0Y2ggYXMgY2F0Y2ggfTtcbmV4cG9ydCBjb25zdCBab2ROYU4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTmFOXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTmFOLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLm5hblByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBuYW4ocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX25hbihab2ROYU4sIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kUGlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RQaXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUGlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5waXBlUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LmluID0gZGVmLmluO1xuICAgIGluc3Qub3V0ID0gZGVmLm91dDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHBpcGUoaW5fLCBvdXQpIHtcbiAgICByZXR1cm4gbmV3IFpvZFBpcGUoe1xuICAgICAgICB0eXBlOiBcInBpcGVcIixcbiAgICAgICAgaW46IGluXyxcbiAgICAgICAgb3V0OiBvdXRcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RDb2RlYyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDb2RlY1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIFpvZFBpcGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZENvZGVjLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGNvZGVjKGluXywgb3V0LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZENvZGVjKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBpbl8sXG4gICAgICAgIG91dDogb3V0LFxuICAgICAgICB0cmFuc2Zvcm06IHBhcmFtcy5kZWNvZGUsXG4gICAgICAgIHJldmVyc2VUcmFuc2Zvcm06IHBhcmFtcy5lbmNvZGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RSZWFkb25seSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RSZWFkb25seVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFJlYWRvbmx5LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEgPSAoY3R4LCBqc29uLCBwYXJhbXMpPT5wcm9jZXNzb3JzLnJlYWRvbmx5UHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRvbmx5KGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kUmVhZG9ubHkoe1xuICAgICAgICB0eXBlOiBcInJlYWRvbmx5XCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kVGVtcGxhdGVMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFRlbXBsYXRlTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFRlbXBsYXRlTGl0ZXJhbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy50ZW1wbGF0ZUxpdGVyYWxQcm9jZXNzb3IoaW5zdCwgY3R4LCBqc29uLCBwYXJhbXMpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVMaXRlcmFsKHBhcnRzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZFRlbXBsYXRlTGl0ZXJhbCh7XG4gICAgICAgIHR5cGU6IFwidGVtcGxhdGVfbGl0ZXJhbFwiLFxuICAgICAgICBwYXJ0cyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZExhenkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTGF6eVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZExhenkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMubGF6eVByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5nZXR0ZXIoKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGxhenkoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIG5ldyBab2RMYXp5KHtcbiAgICAgICAgdHlwZTogXCJsYXp5XCIsXG4gICAgICAgIGdldHRlcjogZ2V0dGVyXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUHJvbWlzZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RQcm9taXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUHJvbWlzZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5wcm9taXNlUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2UoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RQcm9taXNlKHtcbiAgICAgICAgdHlwZTogXCJwcm9taXNlXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRnVuY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRnVuY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RGdW5jdGlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hID0gKGN0eCwganNvbiwgcGFyYW1zKT0+cHJvY2Vzc29ycy5mdW5jdGlvblByb2Nlc3NvcihpbnN0LCBjdHgsIGpzb24sIHBhcmFtcyk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBfZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgaW5wdXQ6IEFycmF5LmlzQXJyYXkocGFyYW1zPy5pbnB1dCkgPyB0dXBsZShwYXJhbXM/LmlucHV0KSA6IHBhcmFtcz8uaW5wdXQgPz8gYXJyYXkodW5rbm93bigpKSxcbiAgICAgICAgb3V0cHV0OiBwYXJhbXM/Lm91dHB1dCA/PyB1bmtub3duKClcbiAgICB9KTtcbn1cbmV4cG9ydCB7IF9mdW5jdGlvbiBhcyBmdW5jdGlvbiB9O1xuZXhwb3J0IGNvbnN0IFpvZEN1c3RvbSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDdXN0b21cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDdXN0b20uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSA9IChjdHgsIGpzb24sIHBhcmFtcyk9PnByb2Nlc3NvcnMuY3VzdG9tUHJvY2Vzc29yKGluc3QsIGN0eCwganNvbiwgcGFyYW1zKTtcbn0pO1xuLy8gY3VzdG9tIGNoZWNrc1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrKGZuKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY29yZS4kWm9kQ2hlY2soe1xuICAgICAgICBjaGVjazogXCJjdXN0b21cIlxuICAgIH0pO1xuICAgIGNoLl96b2QuY2hlY2sgPSBmbjtcbiAgICByZXR1cm4gY2g7XG59XG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tKGZuLCBfcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2N1c3RvbShab2RDdXN0b20sIGZuID8/ICgoKT0+dHJ1ZSksIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZmluZShmbiwgX3BhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIGNvcmUuX3JlZmluZShab2RDdXN0b20sIGZuLCBfcGFyYW1zKTtcbn1cbi8vIHN1cGVyUmVmaW5lXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJSZWZpbmUoZm4pIHtcbiAgICByZXR1cm4gY29yZS5fc3VwZXJSZWZpbmUoZm4pO1xufVxuLy8gUmUtZXhwb3J0IGRlc2NyaWJlIGFuZCBtZXRhIGZyb20gY29yZVxuZXhwb3J0IGNvbnN0IGRlc2NyaWJlID0gY29yZS5kZXNjcmliZTtcbmV4cG9ydCBjb25zdCBtZXRhID0gY29yZS5tZXRhO1xuZnVuY3Rpb24gX2luc3RhbmNlb2YoY2xzLCBwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGluc3QgPSBuZXcgWm9kQ3VzdG9tKHtcbiAgICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgICAgY2hlY2s6IFwiY3VzdG9tXCIsXG4gICAgICAgIGZuOiAoZGF0YSk9PmRhdGEgaW5zdGFuY2VvZiBjbHMsXG4gICAgICAgIGFib3J0OiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmJhZy5DbGFzcyA9IGNscztcbiAgICAvLyBPdmVycmlkZSBjaGVjayB0byBlbWl0IGludmFsaWRfdHlwZSBpbnN0ZWFkIG9mIGN1c3RvbVxuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoIShwYXlsb2FkLnZhbHVlIGluc3RhbmNlb2YgY2xzKSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogY2xzLm5hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYucGF0aCA/PyBbXVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaW5zdDtcbn1cbmV4cG9ydCB7IF9pbnN0YW5jZW9mIGFzIGluc3RhbmNlb2YgfTtcbi8vIHN0cmluZ2Jvb2xcbmV4cG9ydCBjb25zdCBzdHJpbmdib29sID0gKC4uLmFyZ3MpPT5jb3JlLl9zdHJpbmdib29sKHtcbiAgICAgICAgQ29kZWM6IFpvZENvZGVjLFxuICAgICAgICBCb29sZWFuOiBab2RCb29sZWFuLFxuICAgICAgICBTdHJpbmc6IFpvZFN0cmluZ1xuICAgIH0sIC4uLmFyZ3MpO1xuZXhwb3J0IGZ1bmN0aW9uIGpzb24ocGFyYW1zKSB7XG4gICAgY29uc3QganNvblNjaGVtYSA9IGxhenkoKCk9PntcbiAgICAgICAgcmV0dXJuIHVuaW9uKFtcbiAgICAgICAgICAgIHN0cmluZyhwYXJhbXMpLFxuICAgICAgICAgICAgbnVtYmVyKCksXG4gICAgICAgICAgICBib29sZWFuKCksXG4gICAgICAgICAgICBfbnVsbCgpLFxuICAgICAgICAgICAgYXJyYXkoanNvblNjaGVtYSksXG4gICAgICAgICAgICByZWNvcmQoc3RyaW5nKCksIGpzb25TY2hlbWEpXG4gICAgICAgIF0pO1xuICAgIH0pO1xuICAgIHJldHVybiBqc29uU2NoZW1hO1xufVxuLy8gcHJlcHJvY2Vzc1xuLy8gLyoqIEBkZXByZWNhdGVkIFVzZSBgei5waXBlKClgIGFuZCBgei50cmFuc2Zvcm0oKWAgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwcm9jZXNzKGZuLCBzY2hlbWEpIHtcbiAgICByZXR1cm4gcGlwZSh0cmFuc2Zvcm0oZm4pLCBzY2hlbWEpO1xufVxuIiwgImltcG9ydCB7IGRlZmluZUhvb2ssIGdldFdyaXRhYmxlIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUnO1xuaW1wb3J0ICogYXMgeiBmcm9tICd6b2QnO1xuLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3MvaG9va3MudHNcIjp7XCJjb2xsZWN0V2l0aEhvb2tcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvaG9va3MvL2NvbGxlY3RXaXRoSG9va1wifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3MvaG9va3MudHNcIjp7XCJ3cml0ZUV2ZW50XCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3dvcmtmbG93cy9ob29rcy8vd3JpdGVFdmVudFwifX19fSovO1xuZXhwb3J0IGNvbnN0IEhvb2sgPSBkZWZpbmVIb29rKHtcbiAgICBzY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgZGF0YTogei5zdHJpbmcoKSxcbiAgICAgICAgZG9uZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbWV0YWRhdGE6IHoudW5rbm93bigpXG4gICAgfSlcbn0pO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RXaXRoSG9vayh0b2tlbiwgY3VzdG9tRGF0YSkge1xuICAgIGNvbnN0IGhvb2sgPSBIb29rLmNyZWF0ZSh7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgY3VzdG9tRGF0YVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29sbGVjdGVkID0gW107XG4gICAgY29uc3Qgd2YgPSBnZXRXcml0YWJsZSgpO1xuICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rQ3JlYXRlZCcpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgaG9vayl7XG4gICAgICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rUmVzdW1lZCcsIGV2ZW50KTtcbiAgICAgICAgY29sbGVjdGVkLnB1c2goZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQuZG9uZSkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbGxlY3RlZFxuICAgIH07XG59XG5jb2xsZWN0V2l0aEhvb2sud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzL2hvb2tzLy9jb2xsZWN0V2l0aEhvb2tcIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvaG9va3MvL2NvbGxlY3RXaXRoSG9va1wiLCBjb2xsZWN0V2l0aEhvb2spO1xudmFyIHdyaXRlRXZlbnQgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3dvcmtmbG93cy9ob29rcy8vd3JpdGVFdmVudFwiKTtcbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9ub29wLnRzXCI6e1wiYnJva2VuV2ZcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi93b3JrZmxvd3Mvbm9vcC8vYnJva2VuV2ZcIn19fSxcInN0ZXBzXCI6e1wid29ya2Zsb3dzL25vb3AudHNcIjp7XCJub29wXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3dvcmtmbG93cy9ub29wLy9ub29wXCJ9fX19Ki87XG5leHBvcnQgdmFyIG5vb3AgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3dvcmtmbG93cy9ub29wLy9ub29wXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJyb2tlbldmKCkge1xuICAgIGNvbnN0IG51bWJlcnMgPSBbXTtcbiAgICB7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCA1OyBpKyspe1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChub29wKGkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnYXdhaXQgNScpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgMTU7IGkrKyl7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKG5vb3AoMTAwICsgaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdhd2FpdCAxNScpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ2RvbmUuJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbnVtYmVyc1xuICAgIH07XG59XG5icm9rZW5XZi53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3Mvbm9vcC8vYnJva2VuV2ZcIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3Mvbm9vcC8vYnJva2VuV2ZcIiwgYnJva2VuV2YpO1xuIiwgIi8qKl9faW50ZXJuYWxfd29ya2Zsb3dze1wid29ya2Zsb3dzXCI6e1wid29ya2Zsb3dzL251bGwtYnl0ZS50c1wiOntcIm51bGxCeXRlV29ya2Zsb3dcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvbnVsbC1ieXRlLy9udWxsQnl0ZVdvcmtmbG93XCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9udWxsLWJ5dGUudHNcIjp7XCJudWxsQnl0ZVN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vd29ya2Zsb3dzL251bGwtYnl0ZS8vbnVsbEJ5dGVTdGVwXCJ9fX19Ki87XG52YXIgbnVsbEJ5dGVTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi93b3JrZmxvd3MvbnVsbC1ieXRlLy9udWxsQnl0ZVN0ZXBcIik7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnVsbEJ5dGVXb3JrZmxvdygpIHtcbiAgICBjb25zdCBhID0gYXdhaXQgbnVsbEJ5dGVTdGVwKCk7XG4gICAgcmV0dXJuIGE7XG59XG5udWxsQnl0ZVdvcmtmbG93LndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly8uL3dvcmtmbG93cy9udWxsLWJ5dGUvL251bGxCeXRlV29ya2Zsb3dcIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvbnVsbC1ieXRlLy9udWxsQnl0ZVdvcmtmbG93XCIsIG51bGxCeXRlV29ya2Zsb3cpO1xuIiwgImltcG9ydCB7IEZhdGFsRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvY29yZSc7XG4vKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzXCI6e1wicmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93XCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvLy4vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwvL3JldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvd1wifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50c1wiOntcInN0ZXBUaGF0RmFpbHNcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwvL3N0ZXBUaGF0RmFpbHNcIn0sXCJzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLy9zdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yXCJ9fX19Ki87XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93KCkge1xuICAgIGNvbnN0IHJldHJ5YWJsZVJlc3VsdCA9IGF3YWl0IHN0ZXBUaGF0VGhyb3dzUmV0cnlhYmxlRXJyb3IoKTtcbiAgICBsZXQgZ290RmF0YWxFcnJvciA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0ZXBUaGF0RmFpbHMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoRmF0YWxFcnJvci5pcyhlcnJvcikpIHtcbiAgICAgICAgICAgIGdvdEZhdGFsRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJldHJ5YWJsZVJlc3VsdCxcbiAgICAgICAgZ290RmF0YWxFcnJvclxuICAgIH07XG59XG5yZXRyeWFibGVBbmRGYXRhbEVycm9yV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwvL3JldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLy9yZXRyeWFibGVBbmRGYXRhbEVycm9yV29ya2Zsb3dcIiwgcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93KTtcbnZhciBzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC8vc3RlcFRoYXRUaHJvd3NSZXRyeWFibGVFcnJvclwiKTtcbnZhciBzdGVwVGhhdEZhaWxzID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC8vc3RlcFRoYXRGYWlsc1wiKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQSx3RUFBQUEsU0FBQTtBQUFBO0FBRUksUUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQWFSLElBQUFBLFFBQU8sVUFBVSxTQUFTLEtBQUssU0FBUztBQUN4QyxnQkFBVSxXQUFXLENBQUM7QUFDdEIsVUFBSSxPQUFPLE9BQU87QUFDbEIsVUFBSSxTQUFTLFlBQVksSUFBSSxTQUFTLEdBQUc7QUFDckMsZUFBT0MsT0FBTSxHQUFHO0FBQUEsTUFDcEIsV0FBVyxTQUFTLFlBQVksU0FBUyxHQUFHLEdBQUc7QUFDM0MsZUFBTyxRQUFRLE9BQU8sUUFBUSxHQUFHLElBQUksU0FBUyxHQUFHO0FBQUEsTUFDckQ7QUFDQSxZQUFNLElBQUksTUFBTSwwREFBMEQsS0FBSyxVQUFVLEdBQUcsQ0FBQztBQUFBLElBQ2pHO0FBT0ksYUFBU0EsT0FBTSxLQUFLO0FBQ3BCLFlBQU0sT0FBTyxHQUFHO0FBQ2hCLFVBQUksSUFBSSxTQUFTLEtBQUs7QUFDbEI7QUFBQSxNQUNKO0FBQ0EsVUFBSSxRQUFRLG1JQUFtSSxLQUFLLEdBQUc7QUFDdkosVUFBSSxDQUFDLE9BQU87QUFDUjtBQUFBLE1BQ0o7QUFDQSxVQUFJLElBQUksV0FBVyxNQUFNLENBQUMsQ0FBQztBQUMzQixVQUFJLFFBQVEsTUFBTSxDQUFDLEtBQUssTUFBTSxZQUFZO0FBQzFDLGNBQU8sTUFBSztB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QVMsQ0FBQyxXQUFTLEtBQUssTUFBVyxRQUFRLFNBQVMsTUFBTSxDQUFDO0FBQ2hFLE9BQUssU0FBUyxDQUFDLFdBQVMsS0FBSyxNQUFXLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFDbEUsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLE9BQU8sQ0FBQyxXQUFTLEtBQUssTUFBVyxNQUFNLFNBQVMsTUFBTSxDQUFDO0FBQzVELE9BQUssUUFBUSxDQUFDLFdBQVMsS0FBSyxNQUFXLE9BQU8sVUFBVSxNQUFNLENBQUM7QUFDL0QsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLFNBQVMsQ0FBQyxXQUFTLEtBQUssTUFBVyxRQUFRLFdBQVcsTUFBTSxDQUFDO0FBQ2xFLE9BQUssWUFBWSxDQUFDLFdBQVMsS0FBSyxNQUFXLFdBQVcsY0FBYyxNQUFNLENBQUM7QUFDM0UsT0FBSyxNQUFNLENBQUMsV0FBUyxLQUFLLE1BQVcsS0FBSyxRQUFRLE1BQU0sQ0FBQztBQUN6RCxPQUFLLFFBQVEsQ0FBQyxXQUFTLEtBQUssTUFBVyxPQUFPLFVBQVUsTUFBTSxDQUFDO0FBQy9ELE9BQUssT0FBTyxDQUFDLFdBQVMsS0FBSyxNQUFXLE1BQU0sU0FBUyxNQUFNLENBQUM7QUFDNUQsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLFNBQVMsQ0FBQyxXQUFTLEtBQUssTUFBVyxRQUFRLFdBQVcsTUFBTSxDQUFDO0FBQ2xFLE9BQUssU0FBUyxDQUFDLFdBQVMsS0FBSyxNQUFXLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFDbEUsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUU1RCxPQUFLLFdBQVcsQ0FBQyxXQUFTLEtBQUssTUFBVUMsVUFBUyxNQUFNLENBQUM7QUFDekQsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVVDLE1BQUssTUFBTSxDQUFDO0FBQ2pELE9BQUssT0FBTyxDQUFDLFdBQVMsS0FBSyxNQUFVQyxNQUFLLE1BQU0sQ0FBQztBQUNqRCxPQUFLLFdBQVcsQ0FBQyxXQUFTLEtBQUssTUFBVUMsVUFBUyxNQUFNLENBQUM7QUFDN0QsQ0FBQztBQUNNLFNBQVNDLFFBQU8sUUFBUTtBQUMzQixTQUFZLFFBQVEsV0FBVyxNQUFNO0FBQ3pDO0FBRmdCLE9BQUFBLFNBQUE7QUFHVCxJQUFNLGtCQUFnQyxnQkFBSyxhQUFhLG1CQUFtQixDQUFDLE1BQU0sUUFBTTtBQUMzRixFQUFLLGlCQUFpQixLQUFLLE1BQU0sR0FBRztBQUNwQyxhQUFXLEtBQUssTUFBTSxHQUFHO0FBQzdCLENBQUM7QUFDTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFlTSxJQUFNLFNBQXVCLGdCQUFLLGFBQWEsVUFBVSxDQUFDLE1BQU0sUUFBTTtBQUV6RSxFQUFLLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFDM0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFXTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFlBQTBCLGdCQUFLLGFBQWEsYUFBYSxDQUFDLE1BQU0sUUFBTTtBQUUvRSxFQUFLLFdBQVcsS0FBSyxNQUFNLEdBQUc7QUFDOUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFNBQXVCLGdCQUFLLGFBQWEsVUFBVSxDQUFDLE1BQU0sUUFBTTtBQUV6RSxFQUFLLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFDM0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFZTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNB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QUFDMUcsZUFBc0IsbUJBQW1CO0FBQ3JDLFFBQU0sSUFBSSxNQUFNLGFBQWE7QUFDN0IsU0FBTztBQUNYO0FBSHNCO0FBSXRCLGlCQUFpQixhQUFhO0FBQzlCLFdBQVcsb0JBQW9CLElBQUkscURBQXFELGdCQUFnQjs7O0FDTHhHLGVBQXNCLGlDQUFpQztBQUNuRCxRQUFNLGtCQUFrQixNQUFNLDZCQUE2QjtBQUMzRCxNQUFJLGdCQUFnQjtBQUNwQixNQUFJO0FBQ0EsVUFBTSxjQUFjO0FBQUEsRUFDeEIsU0FBUyxPQUFPO0FBQ1osUUFBSSxXQUFXLEdBQUcsS0FBSyxHQUFHO0FBQ3RCLHNCQUFnQjtBQUFBLElBQ3BCO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLEVBQ0o7QUFDSjtBQWRzQjtBQWV0QiwrQkFBK0IsYUFBYTtBQUM1QyxXQUFXLG9CQUFvQixJQUFJLDZFQUE2RSw4QkFBOEI7QUFDOUksSUFBSSwrQkFBK0IsV0FBVyx1QkFBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUscUVBQXFFO0FBQ3BKLElBQUksZ0JBQWdCLFdBQVcsdUJBQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLHNEQUFzRDsiLAogICJuYW1lcyI6IFsibW9kdWxlIiwgInBhcnNlIiwgIm1zIiwgIm1zIiwgImluaXRpYWxpemVyIiwgIl9hIiwgImFycmF5IiwgIm9iamVjdCIsICJDbGFzcyIsICJfYSIsICJjb25maWciLCAiYmFzZTY0IiwgImJhc2U2NHVybCIsICJpc3N1ZSIsICJlcnJvciIsICJ2ZXJzaW9uIiwgInRpbWUiLCAiX2EiLCAiX2EiLCAiaW5zdCIsICJfYSIsICJjaGVja3MiLCAiY2hlY2tSZXN1bHQiLCAiY2FuYXJ5IiwgInJlc3VsdCIsICJfIiwgImJhc2U2NCIsICJyZXN1bHQiLCAiciIsICJpc09iamVjdCIsICJhbGxvd3NFdmFsIiwgInJlc3VsdHMiLCAibGVmdCIsICJyaWdodCIsICJvdXRwdXQiLCAicmVzdWx0IiwgInJlc3VsdCIsICJyaWdodCIsICJsZWZ0IiwgInIiLCAibWV0YSIsICJDbGFzcyIsICJDbGFzcyIsICJfZW1vamkiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiaXNzdWUiLCAicHJvY2VzcyIsICJfYSIsICJtZXRhIiwgImlkIiwgInNjaGVtYSIsICJwcm9jZXNzIiwgInByb2Nlc3MiLCAicHJvY2VzcyIsICJkYXRldGltZSIsICJkYXRlIiwgInRpbWUiLCAiZHVyYXRpb24iLCAiaW5pdGlhbGl6ZXIiLCAiaXNzdWUiLCAiaXNzdWVzIiwgInBhcnNlIiwgInBhcnNlQXN5bmMiLCAic2FmZVBhcnNlIiwgInNhZmVQYXJzZUFzeW5jIiwgImRlZiIsICJtZXRhIiwgInBhcnNlIiwgInNhZmVQYXJzZSIsICJwYXJzZUFzeW5jIiwgInNhZmVQYXJzZUFzeW5jIiwgIl9lbW9qaSIsICJkYXRldGltZSIsICJkYXRlIiwgInRpbWUiLCAiZHVyYXRpb24iLCAic3RyaW5nIiwgImJvb2xlYW4iLCAiaXNzdWUiLCAib3V0cHV0IiwgInN0cmluZyIsICJib29sZWFuIl0KfQo=
|
|
73192
73256
|
`;
|
|
73193
|
-
var
|
|
73194
|
-
var
|
|
73195
|
-
var
|
|
73257
|
+
var POST = workflowEntrypoint(workflowCode);
|
|
73258
|
+
var GET = POST;
|
|
73259
|
+
var HEAD = POST;
|
|
73260
|
+
var OPTIONS = POST;
|
|
73196
73261
|
// Annotate the CommonJS export names for ESM import in node:
|
|
73197
73262
|
0 && (module.exports = {
|
|
73263
|
+
GET,
|
|
73198
73264
|
HEAD,
|
|
73265
|
+
OPTIONS,
|
|
73199
73266
|
POST
|
|
73200
73267
|
});
|
|
73201
73268
|
/*! Bundled license information:
|