pup-recorder 0.2.2 → 0.2.3
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.
- package/build.ts +1 -2
- package/dist/app.cjs +15 -1342
- package/dist/chunk-SD4UOGME.js +2 -0
- package/dist/cli.js +2 -30
- package/dist/index.js +2 -470
- package/package.json +1 -1
- package/Cargo.lock +0 -281
- package/Cargo.toml +0 -23
- package/dist/chunk-CNRKD76V.js +0 -555
- package/rust-toolchain.toml +0 -10
package/dist/app.cjs
CHANGED
|
@@ -1,786 +1,4 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
require('source-map-support/register.js');
|
|
4
|
-
var electron = require('electron');
|
|
5
|
-
var module$1 = require('module');
|
|
6
|
-
var path = require('path');
|
|
7
|
-
var commander = require('commander');
|
|
8
|
-
var z = require('zod');
|
|
9
|
-
var assert = require('assert');
|
|
10
|
-
var promises = require('fs/promises');
|
|
11
|
-
var nodeAv = require('node-av');
|
|
12
|
-
var constants = require('node-av/constants');
|
|
13
|
-
var crypto = require('crypto');
|
|
14
|
-
var os = require('os');
|
|
15
|
-
var promises$1 = require('timers/promises');
|
|
16
|
-
var url = require('url');
|
|
17
|
-
|
|
18
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
|
-
|
|
20
|
-
var z__default = /*#__PURE__*/_interopDefault(z);
|
|
21
|
-
|
|
22
|
-
var __create = Object.create;
|
|
23
|
-
var __defProp = Object.defineProperty;
|
|
24
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
25
|
-
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
26
|
-
var __typeError = (msg) => {
|
|
27
|
-
throw TypeError(msg);
|
|
28
|
-
};
|
|
29
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
30
|
-
var __decoratorStart = (base) => [, , , __create(null)];
|
|
31
|
-
var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
32
|
-
var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
|
|
33
|
-
var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
|
|
34
|
-
var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
|
|
35
|
-
var __runInitializers = (array, flags, self, value) => {
|
|
36
|
-
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self) ;
|
|
37
|
-
return value;
|
|
38
|
-
};
|
|
39
|
-
var __decorateElement = (array, flags, name, decorators, target, extra) => {
|
|
40
|
-
var it, done, ctx, access, k = flags & 7, s = false, p = false;
|
|
41
|
-
var j = 2 , key = __decoratorStrings[k + 5];
|
|
42
|
-
var extraInitializers = array[j] || (array[j] = []);
|
|
43
|
-
var desc = ((target = target.prototype), __getOwnPropDesc(target , name));
|
|
44
|
-
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
45
|
-
ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
|
|
46
|
-
{
|
|
47
|
-
ctx.static = s, ctx.private = p, access = ctx.access = { has: (x) => name in x };
|
|
48
|
-
access.get = (x) => x[name];
|
|
49
|
-
}
|
|
50
|
-
it = (0, decorators[i])(desc[key] , ctx), done._ = 1;
|
|
51
|
-
__expectFn(it) && (desc[key] = it );
|
|
52
|
-
}
|
|
53
|
-
return desc && __defProp(target, name, desc), target;
|
|
54
|
-
};
|
|
55
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
56
|
-
var __using = (stack, value, async) => {
|
|
57
|
-
if (value != null) {
|
|
58
|
-
if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
|
|
59
|
-
var dispose, inner;
|
|
60
|
-
if (async) dispose = value[__knownSymbol("asyncDispose")];
|
|
61
|
-
if (dispose === void 0) {
|
|
62
|
-
dispose = value[__knownSymbol("dispose")];
|
|
63
|
-
if (async) inner = dispose;
|
|
64
|
-
}
|
|
65
|
-
if (typeof dispose !== "function") __typeError("Object not disposable");
|
|
66
|
-
if (inner) dispose = function() {
|
|
67
|
-
try {
|
|
68
|
-
inner.call(this);
|
|
69
|
-
} catch (e) {
|
|
70
|
-
return Promise.reject(e);
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
stack.push([async, dispose, value]);
|
|
74
|
-
} else if (async) {
|
|
75
|
-
stack.push([async]);
|
|
76
|
-
}
|
|
77
|
-
return value;
|
|
78
|
-
};
|
|
79
|
-
var __callDispose = (stack, error, hasError) => {
|
|
80
|
-
var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
|
|
81
|
-
return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
|
|
82
|
-
};
|
|
83
|
-
var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
|
|
84
|
-
var next = (it) => {
|
|
85
|
-
while (it = stack.pop()) {
|
|
86
|
-
try {
|
|
87
|
-
var result = it[1] && it[1].call(it[2]);
|
|
88
|
-
if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
|
|
89
|
-
} catch (e) {
|
|
90
|
-
fail(e);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (hasError) throw error;
|
|
94
|
-
};
|
|
95
|
-
return next();
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// ../../node_modules/.bun/tsup@8.5.1+07a0d61bb07514ee/node_modules/tsup/assets/cjs_shims.js
|
|
99
|
-
var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
|
|
100
|
-
var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
|
|
101
|
-
|
|
102
|
-
// src/base/env.ts
|
|
103
|
-
function penv(name, parser, defaultValue) {
|
|
104
|
-
try {
|
|
105
|
-
return parser(process.env[name]);
|
|
106
|
-
} catch {
|
|
107
|
-
return defaultValue;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// src/base/parser.ts
|
|
112
|
-
function parseNumber(x) {
|
|
113
|
-
if (typeof x === "number") {
|
|
114
|
-
return x;
|
|
115
|
-
}
|
|
116
|
-
const num = Number(x);
|
|
117
|
-
if (Number.isNaN(num)) {
|
|
118
|
-
throw new Error(`Value ${x} is not a valid number`);
|
|
119
|
-
}
|
|
120
|
-
return num;
|
|
121
|
-
}
|
|
122
|
-
function parseString(x) {
|
|
123
|
-
if (typeof x === "string") return x;
|
|
124
|
-
return String(x);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// src/base/constants.ts
|
|
128
|
-
var require2 = module$1.createRequire(importMetaUrl);
|
|
129
|
-
var env = process.env;
|
|
130
|
-
var pupLogLevel = penv("PUP_LOG_LEVEL", parseNumber, 2);
|
|
131
|
-
var pupUseInnerProxy = env["PUP_USE_INNER_PROXY"] === "1";
|
|
132
|
-
env["PUP_DISABLE_GPU"] === "1";
|
|
133
|
-
var pupPkgRoot = path.dirname(require2.resolve("pup-recorder/package.json"));
|
|
134
|
-
path.join(pupPkgRoot, "dist", "app.cjs");
|
|
135
|
-
|
|
136
|
-
// src/base/logging.ts
|
|
137
|
-
var DEBUG = "<pup@debug>";
|
|
138
|
-
var INFO = "<pup@info>";
|
|
139
|
-
var WARN = "<pup@warn>";
|
|
140
|
-
var ERROR = "<pup@error>";
|
|
141
|
-
var FATAL = "<pup@fatal>";
|
|
142
|
-
function stackHook(target, _context) {
|
|
143
|
-
return function(...messages) {
|
|
144
|
-
const processed = messages.map((msg) => {
|
|
145
|
-
return msg instanceof Error ? msg.stack ?? String(msg) : msg;
|
|
146
|
-
});
|
|
147
|
-
return target.call(this, ...processed);
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
var _fatal_dec, _error_dec, _warn_dec, _info_dec, _debug_dec, _init;
|
|
151
|
-
_debug_dec = [stackHook], _info_dec = [stackHook], _warn_dec = [stackHook], _error_dec = [stackHook], _fatal_dec = [stackHook];
|
|
152
|
-
var Logger = class {
|
|
153
|
-
constructor(_level = pupLogLevel) {
|
|
154
|
-
this._level = _level;
|
|
155
|
-
__runInitializers(_init, 5, this);
|
|
156
|
-
__publicField(this, "_impl");
|
|
157
|
-
this.impl = console;
|
|
158
|
-
}
|
|
159
|
-
get level() {
|
|
160
|
-
return this._level;
|
|
161
|
-
}
|
|
162
|
-
set level(value) {
|
|
163
|
-
this._level = value;
|
|
164
|
-
this.impl = this._impl ?? console;
|
|
165
|
-
}
|
|
166
|
-
get impl() {
|
|
167
|
-
return this._impl;
|
|
168
|
-
}
|
|
169
|
-
set impl(value) {
|
|
170
|
-
const debug = value.debug ?? console.debug;
|
|
171
|
-
const info = value.info ?? console.info;
|
|
172
|
-
const warn = value.warn ?? console.warn;
|
|
173
|
-
const error = value.error ?? console.error;
|
|
174
|
-
const lv = this._level;
|
|
175
|
-
this._impl = {
|
|
176
|
-
debug: lv >= 3 ? debug : void 0,
|
|
177
|
-
info: lv >= 2 ? info : void 0,
|
|
178
|
-
warn: lv >= 1 ? warn : void 0,
|
|
179
|
-
error: lv >= 0 ? error : void 0
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
debug(...messages) {
|
|
183
|
-
this.impl?.debug?.(DEBUG, ...messages);
|
|
184
|
-
}
|
|
185
|
-
info(...messages) {
|
|
186
|
-
this.impl?.info?.(INFO, ...messages);
|
|
187
|
-
}
|
|
188
|
-
warn(...messages) {
|
|
189
|
-
this.impl?.warn?.(WARN, ...messages);
|
|
190
|
-
}
|
|
191
|
-
error(...messages) {
|
|
192
|
-
this.impl?.error?.(ERROR, ...messages);
|
|
193
|
-
}
|
|
194
|
-
fatal(...messages) {
|
|
195
|
-
this.impl?.error?.(FATAL, ...messages);
|
|
196
|
-
process.exit(1);
|
|
197
|
-
}
|
|
198
|
-
dispatch(message) {
|
|
199
|
-
if (message.startsWith(DEBUG)) {
|
|
200
|
-
this.debug(message.slice(DEBUG.length + 1));
|
|
201
|
-
} else if (message.startsWith(INFO)) {
|
|
202
|
-
this.info(message.slice(INFO.length + 1));
|
|
203
|
-
} else if (message.startsWith(WARN)) {
|
|
204
|
-
this.warn(message.slice(WARN.length + 1));
|
|
205
|
-
} else if (message.startsWith(ERROR)) {
|
|
206
|
-
this.error(message.slice(ERROR.length + 1));
|
|
207
|
-
} else {
|
|
208
|
-
this.info(message);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
attach(proc, name) {
|
|
212
|
-
return new Promise((resolve, reject) => {
|
|
213
|
-
this.debug(`${name}.attach`);
|
|
214
|
-
let fatal = "";
|
|
215
|
-
const dispatch = (data) => {
|
|
216
|
-
const message = data.toString();
|
|
217
|
-
if (message.startsWith(FATAL)) {
|
|
218
|
-
fatal += message.slice(FATAL.length + 1);
|
|
219
|
-
} else {
|
|
220
|
-
this.dispatch(message);
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
proc.stderr?.on("data", dispatch);
|
|
224
|
-
proc.stdout?.on("data", dispatch);
|
|
225
|
-
proc.on("message", dispatch).on("error", (err) => {
|
|
226
|
-
fatal += err.message;
|
|
227
|
-
proc.kill();
|
|
228
|
-
}).once("close", (code, signal) => {
|
|
229
|
-
if (code || signal || fatal) {
|
|
230
|
-
fatal ||= `command failed: ${proc.spawnargs.join(" ")}`;
|
|
231
|
-
this.debug(`${name}.close`, { code, signal, fatal });
|
|
232
|
-
reject(new Error(fatal));
|
|
233
|
-
} else {
|
|
234
|
-
this.debug(`${name}.close`);
|
|
235
|
-
resolve();
|
|
236
|
-
}
|
|
237
|
-
}).on("unhandledRejection", (reason) => {
|
|
238
|
-
this.error(`${name}.unhandled`, reason);
|
|
239
|
-
}).on("uncaughtExceptionMonitor", (err) => {
|
|
240
|
-
this.error(`${name}.unhandled`, err);
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
_init = __decoratorStart();
|
|
246
|
-
__decorateElement(_init, 1, "debug", _debug_dec, Logger);
|
|
247
|
-
__decorateElement(_init, 1, "info", _info_dec, Logger);
|
|
248
|
-
__decorateElement(_init, 1, "warn", _warn_dec, Logger);
|
|
249
|
-
__decorateElement(_init, 1, "error", _error_dec, Logger);
|
|
250
|
-
__decorateElement(_init, 1, "fatal", _fatal_dec, Logger);
|
|
251
|
-
__decoratorMetadata(_init, Logger);
|
|
252
|
-
var logger = new Logger();
|
|
253
|
-
|
|
254
|
-
// src/base/noerr.ts
|
|
255
|
-
function noerr(fn, defaultValue) {
|
|
256
|
-
return (...args) => {
|
|
257
|
-
try {
|
|
258
|
-
const ret = fn(...args);
|
|
259
|
-
if (ret instanceof Promise) {
|
|
260
|
-
return ret.catch(() => defaultValue);
|
|
261
|
-
}
|
|
262
|
-
return ret;
|
|
263
|
-
} catch {
|
|
264
|
-
return defaultValue;
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// src/base/process.ts
|
|
270
|
-
var PUP_ARGS_KEY = "--pup-priv-args";
|
|
271
|
-
function pargs() {
|
|
272
|
-
const argv = process.argv;
|
|
273
|
-
let priv = argv.find((arg) => arg.startsWith(PUP_ARGS_KEY));
|
|
274
|
-
if (!priv) {
|
|
275
|
-
logger.debug("procargv", argv);
|
|
276
|
-
return process.argv;
|
|
277
|
-
}
|
|
278
|
-
const args = ["exec", ...argv.slice(-1)];
|
|
279
|
-
priv = Buffer.from(priv.split("=")[1], "base64").toString();
|
|
280
|
-
args.push(...JSON.parse(priv));
|
|
281
|
-
logger.debug("pupargs", args);
|
|
282
|
-
return args;
|
|
283
|
-
}
|
|
284
|
-
var DEFAULT_WIDTH = 1920;
|
|
285
|
-
var DEFAULT_HEIGHT = 1080;
|
|
286
|
-
var DEFAULT_FPS = 30;
|
|
287
|
-
var DEFAULT_DURATION = 5;
|
|
288
|
-
var DEFAULT_OUT_DIR = "out";
|
|
289
|
-
var VIDEO_FORMATS = ["mp4", "webm"];
|
|
290
|
-
function isVideoFormat(s) {
|
|
291
|
-
return VIDEO_FORMATS.includes(s);
|
|
292
|
-
}
|
|
293
|
-
var RenderSchema = z__default.default.object({
|
|
294
|
-
duration: z__default.default.number().optional().default(DEFAULT_DURATION).describe("Duration in seconds"),
|
|
295
|
-
width: z__default.default.number().optional().default(DEFAULT_WIDTH).describe("Video width"),
|
|
296
|
-
height: z__default.default.number().optional().default(DEFAULT_HEIGHT).describe("Video height"),
|
|
297
|
-
fps: z__default.default.number().optional().default(DEFAULT_FPS).describe("Frames per second"),
|
|
298
|
-
formats: z__default.default.array(z__default.default.enum(VIDEO_FORMATS)).optional().default(["mp4"]).describe(`Output video formats, allow ${VIDEO_FORMATS.join(", ")}`),
|
|
299
|
-
withAudio: z__default.default.boolean().optional().default(false).describe("Capture and encode audio"),
|
|
300
|
-
outDir: z__default.default.string().optional().default(DEFAULT_OUT_DIR).describe("Output directory"),
|
|
301
|
-
useInnerProxy: z__default.default.boolean().optional().default(false).describe("Use bilibili inner proxy for resource access"),
|
|
302
|
-
deterministic: z__default.default.boolean().optional().default(false).describe("Render by frame rather than recording")
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
// src/common.ts
|
|
306
|
-
async function makeCLI(name, callback) {
|
|
307
|
-
const shape = RenderSchema.shape;
|
|
308
|
-
commander.program.name(name).argument("<source>", "file://, http(s)://, \u6216 data: URI").option("-W, --width <number>", shape.width.description, `${DEFAULT_WIDTH}`).option("-H, --height <number>", shape.height.description, `${DEFAULT_HEIGHT}`).option("-f, --fps <number>", shape.fps.description, `${DEFAULT_FPS}`).option("-t, --duration <number>", shape.duration.description, `${DEFAULT_DURATION}`).option("-o, --out-dir <path>", shape.outDir.description, `${DEFAULT_OUT_DIR}`).option("-F, --formats <formats>", shape.formats.description, "mp4").option("-a, --with-audio", shape.withAudio.description, false).option("--use-inner-proxy", shape.useInnerProxy.description, pupUseInnerProxy).option("-d, --deterministic", shape.deterministic.description, false).action(async (source, opts) => {
|
|
309
|
-
try {
|
|
310
|
-
await callback(source, {
|
|
311
|
-
width: noerr(parseNumber, DEFAULT_WIDTH)(opts.width),
|
|
312
|
-
height: noerr(parseNumber, DEFAULT_HEIGHT)(opts.height),
|
|
313
|
-
fps: noerr(parseNumber, DEFAULT_FPS)(opts.fps),
|
|
314
|
-
duration: noerr(parseNumber, DEFAULT_DURATION)(opts.duration),
|
|
315
|
-
outDir: opts.outDir ?? DEFAULT_OUT_DIR,
|
|
316
|
-
formats: parseString(opts.formats).split(",").map((s) => s.trim()).filter(isVideoFormat),
|
|
317
|
-
withAudio: opts.withAudio ?? false,
|
|
318
|
-
useInnerProxy: opts.useInnerProxy ?? pupUseInnerProxy,
|
|
319
|
-
deterministic: opts.deterministic ?? false
|
|
320
|
-
});
|
|
321
|
-
} catch (e) {
|
|
322
|
-
logger.fatal(e);
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
await commander.program.parseAsync(pargs());
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
// src/base/limiter.ts
|
|
329
|
-
var ConcurrencyLimiter = class {
|
|
330
|
-
constructor(maxConcurrency) {
|
|
331
|
-
this.maxConcurrency = maxConcurrency;
|
|
332
|
-
}
|
|
333
|
-
_active = 0;
|
|
334
|
-
_queue = [];
|
|
335
|
-
_ended = false;
|
|
336
|
-
get active() {
|
|
337
|
-
return this._active;
|
|
338
|
-
}
|
|
339
|
-
get pending() {
|
|
340
|
-
return this._queue.length;
|
|
341
|
-
}
|
|
342
|
-
get stats() {
|
|
343
|
-
return `active: ${this.active}, pending: ${this.pending}`;
|
|
344
|
-
}
|
|
345
|
-
async schedule(fn) {
|
|
346
|
-
if (this._ended) {
|
|
347
|
-
throw new Error("ended");
|
|
348
|
-
}
|
|
349
|
-
return new Promise((resolve, reject) => {
|
|
350
|
-
const run = () => {
|
|
351
|
-
this._active++;
|
|
352
|
-
fn().then((v) => {
|
|
353
|
-
this._active--;
|
|
354
|
-
resolve(v);
|
|
355
|
-
this.next();
|
|
356
|
-
}).catch((e) => {
|
|
357
|
-
this._active--;
|
|
358
|
-
reject(e);
|
|
359
|
-
this.next();
|
|
360
|
-
});
|
|
361
|
-
};
|
|
362
|
-
this._queue.push(run);
|
|
363
|
-
this.next();
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
async end() {
|
|
367
|
-
if (this._ended) {
|
|
368
|
-
return;
|
|
369
|
-
}
|
|
370
|
-
this._ended = true;
|
|
371
|
-
while (this._active > 0 || this.pending > 0) {
|
|
372
|
-
await new Promise((r) => setTimeout(r, 50));
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
next() {
|
|
376
|
-
if (this._active < this.maxConcurrency) {
|
|
377
|
-
this._queue.shift()?.();
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
};
|
|
381
|
-
var SAMPLE_FMT_NAME = {
|
|
382
|
-
[constants.AV_SAMPLE_FMT_FLT]: "flt",
|
|
383
|
-
[constants.AV_SAMPLE_FMT_FLTP]: "fltp"
|
|
384
|
-
};
|
|
385
|
-
var AudioEncoder = class _AudioEncoder {
|
|
386
|
-
_ctx;
|
|
387
|
-
_stream;
|
|
388
|
-
_outRate;
|
|
389
|
-
_outFmt;
|
|
390
|
-
_frameSize;
|
|
391
|
-
_pkt;
|
|
392
|
-
_filterFrame;
|
|
393
|
-
_graph;
|
|
394
|
-
_bufSrc;
|
|
395
|
-
_bufSink;
|
|
396
|
-
_inRate;
|
|
397
|
-
pts = 0n;
|
|
398
|
-
constructor(ctx, stream, outFmt) {
|
|
399
|
-
this._ctx = ctx;
|
|
400
|
-
this._stream = stream;
|
|
401
|
-
this._outRate = ctx.sampleRate;
|
|
402
|
-
this._outFmt = outFmt;
|
|
403
|
-
this._frameSize = ctx.frameSize;
|
|
404
|
-
this._pkt = new nodeAv.Packet();
|
|
405
|
-
this._pkt.alloc();
|
|
406
|
-
this._filterFrame = new nodeAv.Frame();
|
|
407
|
-
this._filterFrame.alloc();
|
|
408
|
-
}
|
|
409
|
-
static async create(opts) {
|
|
410
|
-
const { outSampleRate, outSampleFmt, codecName, globalHeader, bitrate, muxer } = opts;
|
|
411
|
-
const codec = nodeAv.Codec.findEncoderByName(codecName);
|
|
412
|
-
if (!codec) throw new Error(`Audio encoder not found: ${codecName}`);
|
|
413
|
-
const ctx = new nodeAv.CodecContext();
|
|
414
|
-
ctx.allocContext3(codec);
|
|
415
|
-
ctx.codecId = codec.id;
|
|
416
|
-
ctx.sampleFormat = outSampleFmt;
|
|
417
|
-
ctx.sampleRate = outSampleRate;
|
|
418
|
-
ctx.channelLayout = constants.AV_CHANNEL_LAYOUT_STEREO;
|
|
419
|
-
ctx.timeBase = new nodeAv.Rational(1, outSampleRate);
|
|
420
|
-
ctx.bitRate = BigInt(bitrate);
|
|
421
|
-
if (globalHeader) ctx.setFlags(constants.AV_CODEC_FLAG_GLOBAL_HEADER);
|
|
422
|
-
nodeAv.FFmpegError.throwIfError(await ctx.open2(codec, null), "audioCtx.open2");
|
|
423
|
-
const stream = muxer.addStream(ctx);
|
|
424
|
-
return new _AudioEncoder(ctx, stream, outSampleFmt);
|
|
425
|
-
}
|
|
426
|
-
/** Called once when audio-meta arrives with the page's actual sample rate. */
|
|
427
|
-
setInputRate(inSampleRate) {
|
|
428
|
-
this._disposeGraph();
|
|
429
|
-
this._inRate = inSampleRate;
|
|
430
|
-
const graph = new nodeAv.FilterGraph();
|
|
431
|
-
graph.alloc();
|
|
432
|
-
const abuffer = nodeAv.Filter.getByName("abuffer");
|
|
433
|
-
const srcArgs = `sample_rate=${inSampleRate}:sample_fmt=flt:channel_layout=stereo:time_base=1/${inSampleRate}`;
|
|
434
|
-
const bufSrc = graph.createFilter(abuffer, "src", srcArgs);
|
|
435
|
-
if (!bufSrc) throw new Error("Failed to create abuffer");
|
|
436
|
-
const abuffersink = nodeAv.Filter.getByName("abuffersink");
|
|
437
|
-
const bufSink = graph.createFilter(abuffersink, "sink");
|
|
438
|
-
if (!bufSink) throw new Error("Failed to create abuffersink");
|
|
439
|
-
const fmtName = SAMPLE_FMT_NAME[this._outFmt] ?? "flt";
|
|
440
|
-
const filterDesc = `aformat=sample_fmts=${fmtName}:sample_rates=${this._outRate}:channel_layouts=stereo,asetnsamples=n=${this._frameSize}:p=1`;
|
|
441
|
-
const outputs = nodeAv.FilterInOut.createList([{ name: "in", filterCtx: bufSrc, padIdx: 0 }]);
|
|
442
|
-
const inputs = nodeAv.FilterInOut.createList([{ name: "out", filterCtx: bufSink, padIdx: 0 }]);
|
|
443
|
-
nodeAv.FFmpegError.throwIfError(graph.parsePtr(filterDesc, inputs, outputs), "graph.parsePtr");
|
|
444
|
-
nodeAv.FFmpegError.throwIfError(graph.configSync(), "graph.config");
|
|
445
|
-
this._graph = graph;
|
|
446
|
-
this._bufSrc = bufSrc;
|
|
447
|
-
this._bufSink = bufSink;
|
|
448
|
-
}
|
|
449
|
-
get stream() {
|
|
450
|
-
return this._stream;
|
|
451
|
-
}
|
|
452
|
-
get timeBase() {
|
|
453
|
-
return this._ctx.timeBase;
|
|
454
|
-
}
|
|
455
|
-
async encode(pcm, muxer) {
|
|
456
|
-
var _stack = [];
|
|
457
|
-
try {
|
|
458
|
-
if (!this._bufSrc || !this._bufSink || !this._inRate) return;
|
|
459
|
-
const src = new Float32Array(pcm.buffer, pcm.byteOffset, pcm.byteLength / 4);
|
|
460
|
-
for (let i = 0; i < src.length; i++) {
|
|
461
|
-
if (!isFinite(src[i])) src[i] = 0;
|
|
462
|
-
}
|
|
463
|
-
const nSamples = src.length >> 1;
|
|
464
|
-
const frame = __using(_stack, nodeAv.Frame.fromAudioBuffer(Buffer.from(src.buffer, src.byteOffset, src.byteLength), {
|
|
465
|
-
nbSamples: nSamples,
|
|
466
|
-
format: constants.AV_SAMPLE_FMT_FLT,
|
|
467
|
-
sampleRate: this._inRate,
|
|
468
|
-
channelLayout: constants.AV_CHANNEL_LAYOUT_STEREO,
|
|
469
|
-
pts: this.pts,
|
|
470
|
-
timeBase: { num: 1, den: this._inRate }
|
|
471
|
-
}));
|
|
472
|
-
this.pts += BigInt(nSamples);
|
|
473
|
-
nodeAv.FFmpegError.throwIfError(await this._bufSrc.buffersrcAddFrame(frame), "buffersrcAddFrame");
|
|
474
|
-
await this._drainFilter(muxer);
|
|
475
|
-
} catch (_) {
|
|
476
|
-
var _error = _, _hasError = true;
|
|
477
|
-
} finally {
|
|
478
|
-
__callDispose(_stack, _error, _hasError);
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
async flush(muxer) {
|
|
482
|
-
if (this._bufSrc && this._bufSink) {
|
|
483
|
-
await this._bufSrc.buffersrcAddFrame(null);
|
|
484
|
-
await this._drainFilter(muxer);
|
|
485
|
-
}
|
|
486
|
-
await this._ctx.sendFrame(null);
|
|
487
|
-
await this._drainCodec(muxer);
|
|
488
|
-
}
|
|
489
|
-
[Symbol.dispose]() {
|
|
490
|
-
this._pkt.free();
|
|
491
|
-
this._filterFrame.free();
|
|
492
|
-
this._disposeGraph();
|
|
493
|
-
this._ctx.freeContext();
|
|
494
|
-
}
|
|
495
|
-
/** Drain filter → send to codec → drain codec packets. */
|
|
496
|
-
async _drainFilter(muxer) {
|
|
497
|
-
const outFrame = this._filterFrame;
|
|
498
|
-
while (true) {
|
|
499
|
-
const r = await this._bufSink.buffersinkGetFrame(outFrame);
|
|
500
|
-
if (r === constants.AVERROR_EAGAIN || r === constants.AVERROR_EOF) break;
|
|
501
|
-
nodeAv.FFmpegError.throwIfError(r, "buffersinkGetFrame");
|
|
502
|
-
nodeAv.FFmpegError.throwIfError(await this._ctx.sendFrame(outFrame), "audioCtx.sendFrame");
|
|
503
|
-
outFrame.unref();
|
|
504
|
-
await this._drainCodec(muxer);
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
/** Drain codec packets to muxer. */
|
|
508
|
-
async _drainCodec(muxer) {
|
|
509
|
-
const pkt = this._pkt;
|
|
510
|
-
while (true) {
|
|
511
|
-
const r = await this._ctx.receivePacket(pkt);
|
|
512
|
-
if (r === constants.AVERROR_EAGAIN || r === constants.AVERROR_EOF) break;
|
|
513
|
-
nodeAv.FFmpegError.throwIfError(r, "audio.receivePacket");
|
|
514
|
-
pkt.streamIndex = this._stream.index;
|
|
515
|
-
pkt.rescaleTs(this._ctx.timeBase, this._stream.timeBase);
|
|
516
|
-
await muxer.writePacket(pkt);
|
|
517
|
-
pkt.unref();
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
_disposeGraph() {
|
|
521
|
-
this._graph?.[Symbol.dispose]();
|
|
522
|
-
this._graph = void 0;
|
|
523
|
-
this._bufSrc = void 0;
|
|
524
|
-
this._bufSink = void 0;
|
|
525
|
-
}
|
|
526
|
-
};
|
|
527
|
-
var FormatMuxer = class {
|
|
528
|
-
_ctx;
|
|
529
|
-
_opened = false;
|
|
530
|
-
constructor(outPath) {
|
|
531
|
-
this._ctx = new nodeAv.FormatContext();
|
|
532
|
-
nodeAv.FFmpegError.throwIfError(this._ctx.allocOutputContext2(null, null, outPath), "allocOutputContext2");
|
|
533
|
-
}
|
|
534
|
-
addStream(codecCtx, codecTag) {
|
|
535
|
-
const stream = this._ctx.newStream(null);
|
|
536
|
-
stream.timeBase = codecCtx.timeBase;
|
|
537
|
-
nodeAv.FFmpegError.throwIfError(stream.codecpar.fromContext(codecCtx), "codecpar.fromContext");
|
|
538
|
-
if (codecTag) stream.codecpar.codecTag = codecTag;
|
|
539
|
-
return stream;
|
|
540
|
-
}
|
|
541
|
-
async open() {
|
|
542
|
-
if (this._opened) return;
|
|
543
|
-
nodeAv.FFmpegError.throwIfError(await this._ctx.openOutput(), "openOutput");
|
|
544
|
-
nodeAv.FFmpegError.throwIfError(await this._ctx.writeHeader(null), "writeHeader");
|
|
545
|
-
this._opened = true;
|
|
546
|
-
}
|
|
547
|
-
async writePacket(pkt) {
|
|
548
|
-
nodeAv.FFmpegError.throwIfError(await this._ctx.interleavedWriteFrame(pkt), "interleavedWriteFrame");
|
|
549
|
-
}
|
|
550
|
-
async finish() {
|
|
551
|
-
if (!this._opened) return;
|
|
552
|
-
await this._ctx.writeTrailer();
|
|
553
|
-
await this._ctx.closeOutput();
|
|
554
|
-
this._opened = false;
|
|
555
|
-
}
|
|
556
|
-
async [Symbol.asyncDispose]() {
|
|
557
|
-
await this.finish();
|
|
558
|
-
await this._ctx[Symbol.asyncDispose]();
|
|
559
|
-
}
|
|
560
|
-
};
|
|
561
|
-
var VideoEncoder = class _VideoEncoder {
|
|
562
|
-
_ctx;
|
|
563
|
-
_sws;
|
|
564
|
-
_src;
|
|
565
|
-
_dst;
|
|
566
|
-
_pkt;
|
|
567
|
-
_stream;
|
|
568
|
-
pts = 0n;
|
|
569
|
-
constructor(ctx, sws, src, dst, pkt, stream) {
|
|
570
|
-
this._ctx = ctx;
|
|
571
|
-
this._sws = sws;
|
|
572
|
-
this._src = src;
|
|
573
|
-
this._dst = dst;
|
|
574
|
-
this._pkt = pkt;
|
|
575
|
-
this._stream = stream;
|
|
576
|
-
}
|
|
577
|
-
static async create(opts) {
|
|
578
|
-
const { width, height, fps, codecName, pixFmt, codecTag, globalHeader, codecOpts, bitrate, muxer } = opts;
|
|
579
|
-
const codec = nodeAv.Codec.findEncoderByName(codecName);
|
|
580
|
-
if (!codec) throw new Error(`Video encoder not found: ${codecName}`);
|
|
581
|
-
const ctx = new nodeAv.CodecContext();
|
|
582
|
-
ctx.allocContext3(codec);
|
|
583
|
-
ctx.codecId = codec.id;
|
|
584
|
-
ctx.width = width;
|
|
585
|
-
ctx.height = height;
|
|
586
|
-
ctx.pixelFormat = pixFmt;
|
|
587
|
-
ctx.timeBase = new nodeAv.Rational(1, fps);
|
|
588
|
-
ctx.framerate = new nodeAv.Rational(fps, 1);
|
|
589
|
-
ctx.gopSize = fps;
|
|
590
|
-
ctx.bitRate = BigInt(bitrate);
|
|
591
|
-
ctx.setOption("threads", "4");
|
|
592
|
-
if (globalHeader) ctx.setFlags(constants.AV_CODEC_FLAG_GLOBAL_HEADER);
|
|
593
|
-
for (const [k, v] of Object.entries(codecOpts)) ctx.setOption(k, v);
|
|
594
|
-
if (codecTag) ctx.codecTag = codecTag;
|
|
595
|
-
nodeAv.FFmpegError.throwIfError(await ctx.open2(codec, null), "videoCtx.open2");
|
|
596
|
-
const sws = new nodeAv.SoftwareScaleContext();
|
|
597
|
-
sws.getContext(width, height, constants.AV_PIX_FMT_BGRA, width, height, pixFmt, constants.SWS_BILINEAR);
|
|
598
|
-
const dst = new nodeAv.Frame();
|
|
599
|
-
dst.alloc();
|
|
600
|
-
dst.format = pixFmt;
|
|
601
|
-
dst.width = width;
|
|
602
|
-
dst.height = height;
|
|
603
|
-
nodeAv.FFmpegError.throwIfError(dst.getBuffer(0), "dstFrame.getBuffer");
|
|
604
|
-
const src = new nodeAv.Frame();
|
|
605
|
-
src.alloc();
|
|
606
|
-
src.format = constants.AV_PIX_FMT_BGRA;
|
|
607
|
-
src.width = width;
|
|
608
|
-
src.height = height;
|
|
609
|
-
nodeAv.FFmpegError.throwIfError(src.getBuffer(0), "srcFrame.getBuffer");
|
|
610
|
-
const pkt = new nodeAv.Packet();
|
|
611
|
-
pkt.alloc();
|
|
612
|
-
const stream = muxer.addStream(ctx, codecTag);
|
|
613
|
-
return new _VideoEncoder(ctx, sws, src, dst, pkt, stream);
|
|
614
|
-
}
|
|
615
|
-
get stream() {
|
|
616
|
-
return this._stream;
|
|
617
|
-
}
|
|
618
|
-
get timeBase() {
|
|
619
|
-
return this._ctx.timeBase;
|
|
620
|
-
}
|
|
621
|
-
async encode(bgra, muxer) {
|
|
622
|
-
const { _src: src, _dst: dst, _sws: sws } = this;
|
|
623
|
-
nodeAv.FFmpegError.throwIfError(src.makeWritable(), "src.makeWritable");
|
|
624
|
-
nodeAv.FFmpegError.throwIfError(src.fromBuffer(bgra), "src.fromBuffer");
|
|
625
|
-
src.pts = this.pts;
|
|
626
|
-
nodeAv.FFmpegError.throwIfError(dst.makeWritable(), "dst.makeWritable");
|
|
627
|
-
nodeAv.FFmpegError.throwIfError(await sws.scaleFrame(dst, src), "sws.scaleFrame");
|
|
628
|
-
dst.pts = this.pts++;
|
|
629
|
-
nodeAv.FFmpegError.throwIfError(await this._ctx.sendFrame(dst), "videoCtx.sendFrame");
|
|
630
|
-
await this.drain(muxer);
|
|
631
|
-
}
|
|
632
|
-
async flush(muxer) {
|
|
633
|
-
await this._ctx.sendFrame(null);
|
|
634
|
-
await this.drain(muxer);
|
|
635
|
-
}
|
|
636
|
-
[Symbol.dispose]() {
|
|
637
|
-
this._pkt.free();
|
|
638
|
-
this._src.free();
|
|
639
|
-
this._dst.free();
|
|
640
|
-
this._sws[Symbol.dispose]();
|
|
641
|
-
this._ctx.freeContext();
|
|
642
|
-
}
|
|
643
|
-
async drain(muxer) {
|
|
644
|
-
const pkt = this._pkt;
|
|
645
|
-
while (true) {
|
|
646
|
-
const r = await this._ctx.receivePacket(pkt);
|
|
647
|
-
if (r === constants.AVERROR_EAGAIN || r === constants.AVERROR_EOF) break;
|
|
648
|
-
nodeAv.FFmpegError.throwIfError(r, "video.receivePacket");
|
|
649
|
-
pkt.streamIndex = this._stream.index;
|
|
650
|
-
pkt.rescaleTs(this._ctx.timeBase, this._stream.timeBase);
|
|
651
|
-
await muxer.writePacket(pkt);
|
|
652
|
-
pkt.unref();
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
};
|
|
656
|
-
|
|
657
|
-
// src/base/encoder/encoder.ts
|
|
658
|
-
nodeAv.Log.setCallback((level, message) => {
|
|
659
|
-
const msg = message.trimEnd();
|
|
660
|
-
if (!msg) return;
|
|
661
|
-
if (level <= constants.AV_LOG_ERROR) logger.error(msg);
|
|
662
|
-
else if (level <= constants.AV_LOG_WARNING) logger.warn(msg);
|
|
663
|
-
});
|
|
664
|
-
var FORMAT_SPECS = {
|
|
665
|
-
mp4: {
|
|
666
|
-
videoCodecName: constants.FF_ENCODER_LIBX265,
|
|
667
|
-
pixFmt: constants.AV_PIX_FMT_YUVA420P,
|
|
668
|
-
codecTag: "hvc1",
|
|
669
|
-
globalHeader: true,
|
|
670
|
-
videoOpts: { preset: "ultrafast", "x265-params": "log-level=1" },
|
|
671
|
-
audioCodecName: constants.FF_ENCODER_AAC,
|
|
672
|
-
audioSampleFmt: constants.AV_SAMPLE_FMT_FLTP,
|
|
673
|
-
outSampleRate: 44100
|
|
674
|
-
},
|
|
675
|
-
webm: {
|
|
676
|
-
videoCodecName: "libvpx-vp9",
|
|
677
|
-
pixFmt: constants.AV_PIX_FMT_YUVA420P,
|
|
678
|
-
globalHeader: false,
|
|
679
|
-
videoOpts: { quality: "realtime", "cpu-used": "8" },
|
|
680
|
-
audioCodecName: "libopus",
|
|
681
|
-
audioSampleFmt: constants.AV_SAMPLE_FMT_FLT,
|
|
682
|
-
outSampleRate: 48e3
|
|
683
|
-
}
|
|
684
|
-
};
|
|
685
|
-
var EncoderPipeline = class _EncoderPipeline {
|
|
686
|
-
_states;
|
|
687
|
-
constructor(states) {
|
|
688
|
-
this._states = states;
|
|
689
|
-
}
|
|
690
|
-
static async create({
|
|
691
|
-
width,
|
|
692
|
-
height,
|
|
693
|
-
fps,
|
|
694
|
-
formats,
|
|
695
|
-
outDir,
|
|
696
|
-
withAudio = false,
|
|
697
|
-
videoBitrate = 8e6,
|
|
698
|
-
audioBitrate = 128e3
|
|
699
|
-
}) {
|
|
700
|
-
const states = await Promise.all(
|
|
701
|
-
formats.map(async (format) => {
|
|
702
|
-
const spec = FORMAT_SPECS[format];
|
|
703
|
-
const outPath = path.join(outDir, `output.${format}`);
|
|
704
|
-
const muxer = new FormatMuxer(outPath);
|
|
705
|
-
const video = await VideoEncoder.create({
|
|
706
|
-
width,
|
|
707
|
-
height,
|
|
708
|
-
fps,
|
|
709
|
-
codecName: spec.videoCodecName,
|
|
710
|
-
pixFmt: spec.pixFmt,
|
|
711
|
-
codecTag: spec.codecTag,
|
|
712
|
-
globalHeader: spec.globalHeader,
|
|
713
|
-
codecOpts: spec.videoOpts,
|
|
714
|
-
bitrate: videoBitrate,
|
|
715
|
-
muxer
|
|
716
|
-
});
|
|
717
|
-
let audio;
|
|
718
|
-
if (withAudio) {
|
|
719
|
-
audio = await AudioEncoder.create({
|
|
720
|
-
outSampleRate: spec.outSampleRate,
|
|
721
|
-
outSampleFmt: spec.audioSampleFmt,
|
|
722
|
-
codecName: spec.audioCodecName,
|
|
723
|
-
globalHeader: spec.globalHeader,
|
|
724
|
-
bitrate: audioBitrate,
|
|
725
|
-
muxer
|
|
726
|
-
});
|
|
727
|
-
}
|
|
728
|
-
await muxer.open();
|
|
729
|
-
const limiter = new ConcurrencyLimiter(1);
|
|
730
|
-
return { format, outPath, muxer, video, audio, limiter };
|
|
731
|
-
})
|
|
732
|
-
);
|
|
733
|
-
return new _EncoderPipeline(states);
|
|
734
|
-
}
|
|
735
|
-
setupAudio(sampleRate) {
|
|
736
|
-
for (const s of this._states) {
|
|
737
|
-
s.audio?.setInputRate(sampleRate);
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
async encodeFrame(bgra, _timestampUs) {
|
|
741
|
-
await Promise.all(this._states.map((s) => s.limiter.schedule(() => s.video.encode(bgra, s.muxer))));
|
|
742
|
-
}
|
|
743
|
-
async encodeAudio(pcm) {
|
|
744
|
-
await Promise.all(
|
|
745
|
-
this._states.map((s) => {
|
|
746
|
-
if (!s.audio) return Promise.resolve();
|
|
747
|
-
return s.limiter.schedule(() => s.audio.encode(pcm, s.muxer));
|
|
748
|
-
})
|
|
749
|
-
);
|
|
750
|
-
}
|
|
751
|
-
async finish() {
|
|
752
|
-
const result = {};
|
|
753
|
-
await Promise.all(
|
|
754
|
-
this._states.map(async (s) => {
|
|
755
|
-
var _stack = [];
|
|
756
|
-
try {
|
|
757
|
-
await s.limiter.end();
|
|
758
|
-
await s.audio?.flush(s.muxer);
|
|
759
|
-
await s.video.flush(s.muxer);
|
|
760
|
-
result[s.format] = s.outPath;
|
|
761
|
-
const _a = __using(_stack, s.audio);
|
|
762
|
-
const _v = __using(_stack, s.video);
|
|
763
|
-
const _m = __using(_stack, s.muxer, true);
|
|
764
|
-
} catch (_) {
|
|
765
|
-
var _error = _, _hasError = true;
|
|
766
|
-
} finally {
|
|
767
|
-
var _promise = __callDispose(_stack, _error, _hasError);
|
|
768
|
-
_promise && await _promise;
|
|
769
|
-
}
|
|
770
|
-
})
|
|
771
|
-
);
|
|
772
|
-
return result;
|
|
773
|
-
}
|
|
774
|
-
};
|
|
775
|
-
|
|
776
|
-
// src/base/image.ts
|
|
777
|
-
function isEmpty(image) {
|
|
778
|
-
const size = image.getSize();
|
|
779
|
-
if (size.width === 0 || size.height === 0) return true;
|
|
780
|
-
return image.isEmpty();
|
|
781
|
-
}
|
|
782
|
-
var TAG = "[AudioCapture]";
|
|
783
|
-
var AUDIO_CAPTURE_SCRIPT = `
|
|
1
|
+
'use strict';require('source-map-support/register.js');var electron=require('electron'),module$1=require('module'),path=require('path'),commander=require('commander'),y=require('zod'),assert=require('assert'),promises=require('fs/promises'),nodeAv=require('node-av'),constants=require('node-av/constants'),crypto=require('crypto'),os=require('os'),promises$1=require('timers/promises'),url=require('url');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var y__default=/*#__PURE__*/_interopDefault(y);var Ot=Object.create;var xe=Object.defineProperty;var Nt=Object.getOwnPropertyDescriptor;var J=(r,e)=>(e=Symbol[r])?e:Symbol.for("Symbol."+r),S=r=>{throw TypeError(r)};var Ne=(r,e,t)=>e in r?xe(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var Be=r=>[,,,Ot(null)],De=["class","method","getter","setter","accessor","field","value","get","set"],U=r=>r!==void 0&&typeof r!="function"?S("Function expected"):r,Bt=(r,e,t,o,i)=>({kind:De[r],name:e,metadata:o,addInitializer:n=>t._?S("Already initialized"):i.push(U(n||null))}),Fe=(r,e)=>Ne(e,J("metadata"),r[3]),Ve=(r,e,t,o)=>{for(var i=0,n=r[e>>1],a=n&&n.length;i<a;i++)n[i].call(t);return o},O=(r,e,t,o,i,n)=>{var c,s,d,u,m=e&7,l=false,p=false,x=2,_=De[m+5],F=r[x]||(r[x]=[]),w=((i=i.prototype),Nt(i,t));for(var v=o.length-1;v>=0;v--)d=Bt(m,t,s={},r[3],F),(d.static=l,d.private=p,u=d.access={has:b=>t in b},(u.get=b=>b[t]),m>2),c=(0, o[v])(w[_],d),s._=1,U(c)&&(w[_]=c);return w&&xe(i,t,w),i},$e=(r,e,t)=>Ne(r,e+"",t);var N=(r,e,t)=>{if(e!=null){typeof e!="object"&&typeof e!="function"&&S("Object expected");var o,i;t&&(o=e[J("asyncDispose")]),o===void 0&&(o=e[J("dispose")],t&&(i=o)),typeof o!="function"&&S("Object not disposable"),i&&(o=function(){try{i.call(this);}catch(n){return Promise.reject(n)}}),r.push([t,o,e]);}else t&&r.push([t]);return e},Q=(r,e,t)=>{var o=typeof SuppressedError=="function"?SuppressedError:function(a,c,s,d){return d=Error(s),d.name="SuppressedError",d.error=a,d.suppressed=c,d},i=a=>e=t?new o(a,e,"An error was suppressed during disposal"):(t=true,a),n=a=>{for(;a=r.pop();)try{var c=a[1]&&a[1].call(a[2]);if(a[0])return Promise.resolve(c).then(n,s=>(i(s),n()))}catch(s){i(s);}if(t)throw e};return n()};var $t=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,h=$t();function Ue(r,e,t){try{return e(process.env[r])}catch{return t}}function I(r){if(typeof r=="number")return r;let e=Number(r);if(Number.isNaN(e))throw new Error(`Value ${r} is not a valid number`);return e}function We(r){return typeof r=="string"?r:String(r)}var Gt=module$1.createRequire(h),He=process.env,Ge=Ue("PUP_LOG_LEVEL",I,2),ve=He.PUP_USE_INNER_PROXY==="1";He.PUP_DISABLE_GPU==="1";var jt=path.dirname(Gt.resolve("pup-recorder/package.json"));path.join(jt,"dist","app.cjs");var Ee="<pup@debug>",Ae="<pup@info>",Pe="<pup@warn>",Re="<pup@error>",Ce="<pup@fatal>";function W(r,e){return function(...t){let o=t.map(i=>i instanceof Error?i.stack??String(i):i);return r.call(this,...o)}}var je,qe,ze,Ye,Ke,k;Ke=[W],Ye=[W],ze=[W],qe=[W],je=[W];var R=class{constructor(e=Ge){this._level=e;Ve(k,5,this);$e(this,"_impl");this.impl=console;}get level(){return this._level}set level(e){this._level=e,this.impl=this._impl??console;}get impl(){return this._impl}set impl(e){let t=e.debug??console.debug,o=e.info??console.info,i=e.warn??console.warn,n=e.error??console.error,a=this._level;this._impl={debug:a>=3?t:void 0,info:a>=2?o:void 0,warn:a>=1?i:void 0,error:a>=0?n:void 0};}debug(...e){this.impl?.debug?.(Ee,...e);}info(...e){this.impl?.info?.(Ae,...e);}warn(...e){this.impl?.warn?.(Pe,...e);}error(...e){this.impl?.error?.(Re,...e);}fatal(...e){this.impl?.error?.(Ce,...e),process.exit(1);}dispatch(e){e.startsWith(Ee)?this.debug(e.slice(Ee.length+1)):e.startsWith(Ae)?this.info(e.slice(Ae.length+1)):e.startsWith(Pe)?this.warn(e.slice(Pe.length+1)):e.startsWith(Re)?this.error(e.slice(Re.length+1)):this.info(e);}attach(e,t){return new Promise((o,i)=>{this.debug(`${t}.attach`);let n="",a=c=>{let s=c.toString();s.startsWith(Ce)?n+=s.slice(Ce.length+1):this.dispatch(s);};e.stderr?.on("data",a),e.stdout?.on("data",a),e.on("message",a).on("error",c=>{n+=c.message,e.kill();}).once("close",(c,s)=>{c||s||n?(n||=`command failed: ${e.spawnargs.join(" ")}`,this.debug(`${t}.close`,{code:c,signal:s,fatal:n}),i(new Error(n))):(this.debug(`${t}.close`),o());}).on("unhandledRejection",c=>{this.error(`${t}.unhandled`,c);}).on("uncaughtExceptionMonitor",c=>{this.error(`${t}.unhandled`,c);});})}};k=Be(),O(k,1,"debug",Ke,R),O(k,1,"info",Ye,R),O(k,1,"warn",ze,R),O(k,1,"error",qe,R),O(k,1,"fatal",je,R),Fe(k,R);var f=new R;function H(r,e){return (...t)=>{try{let o=r(...t);return o instanceof Promise?o.catch(()=>e):o}catch{return e}}}var qt="--pup-priv-args";function Xe(){let r=process.argv,e=r.find(o=>o.startsWith(qt));if(!e)return f.debug("procargv",r),process.argv;let t=["exec",...r.slice(-1)];return e=Buffer.from(e.split("=")[1],"base64").toString(),t.push(...JSON.parse(e)),f.debug("pupargs",t),t}var Z=1920,ee=1080,te=30,re=5,oe="out",Te=["mp4","webm"];function Je(r){return Te.includes(r)}var Qe=y__default.default.object({duration:y__default.default.number().optional().default(re).describe("Duration in seconds"),width:y__default.default.number().optional().default(Z).describe("Video width"),height:y__default.default.number().optional().default(ee).describe("Video height"),fps:y__default.default.number().optional().default(te).describe("Frames per second"),formats:y__default.default.array(y__default.default.enum(Te)).optional().default(["mp4"]).describe(`Output video formats, allow ${Te.join(", ")}`),withAudio:y__default.default.boolean().optional().default(false).describe("Capture and encode audio"),outDir:y__default.default.string().optional().default(oe).describe("Output directory"),useInnerProxy:y__default.default.boolean().optional().default(false).describe("Use bilibili inner proxy for resource access"),deterministic:y__default.default.boolean().optional().default(false).describe("Render by frame rather than recording")});async function et(r,e){let t=Qe.shape;commander.program.name(r).argument("<source>","file://, http(s)://, \u6216 data: URI").option("-W, --width <number>",t.width.description,`${Z}`).option("-H, --height <number>",t.height.description,`${ee}`).option("-f, --fps <number>",t.fps.description,`${te}`).option("-t, --duration <number>",t.duration.description,`${re}`).option("-o, --out-dir <path>",t.outDir.description,`${oe}`).option("-F, --formats <formats>",t.formats.description,"mp4").option("-a, --with-audio",t.withAudio.description,false).option("--use-inner-proxy",t.useInnerProxy.description,ve).option("-d, --deterministic",t.deterministic.description,false).action(async(o,i)=>{try{await e(o,{width:H(I,Z)(i.width),height:H(I,ee)(i.height),fps:H(I,te)(i.fps),duration:H(I,re)(i.duration),outDir:i.outDir??oe,formats:We(i.formats).split(",").map(n=>n.trim()).filter(Je),withAudio:i.withAudio??!1,useInnerProxy:i.useInnerProxy??ve,deterministic:i.deterministic??!1});}catch(n){f.fatal(n);}}),await commander.program.parseAsync(Xe());}var T=class{constructor(e){this.maxConcurrency=e;}_active=0;_queue=[];_ended=false;get active(){return this._active}get pending(){return this._queue.length}get stats(){return `active: ${this.active}, pending: ${this.pending}`}async schedule(e){if(this._ended)throw new Error("ended");return new Promise((t,o)=>{let i=()=>{this._active++,e().then(n=>{this._active--,t(n),this.next();}).catch(n=>{this._active--,o(n),this.next();});};this._queue.push(i),this.next();})}async end(){if(!this._ended)for(this._ended=true;this._active>0||this.pending>0;)await new Promise(e=>setTimeout(e,50));}next(){this._active<this.maxConcurrency&&this._queue.shift()?.();}};var er={[constants.AV_SAMPLE_FMT_FLT]:"flt",[constants.AV_SAMPLE_FMT_FLTP]:"fltp"},ie=class r{_ctx;_stream;_outRate;_outFmt;_frameSize;_pkt;_filterFrame;_graph;_bufSrc;_bufSink;_inRate;pts=0n;constructor(e,t,o){this._ctx=e,this._stream=t,this._outRate=e.sampleRate,this._outFmt=o,this._frameSize=e.frameSize,this._pkt=new nodeAv.Packet,this._pkt.alloc(),this._filterFrame=new nodeAv.Frame,this._filterFrame.alloc();}static async create(e){let{outSampleRate:t,outSampleFmt:o,codecName:i,globalHeader:n,bitrate:a,muxer:c}=e,s=nodeAv.Codec.findEncoderByName(i);if(!s)throw new Error(`Audio encoder not found: ${i}`);let d=new nodeAv.CodecContext;d.allocContext3(s),d.codecId=s.id,d.sampleFormat=o,d.sampleRate=t,d.channelLayout=constants.AV_CHANNEL_LAYOUT_STEREO,d.timeBase=new nodeAv.Rational(1,t),d.bitRate=BigInt(a),n&&d.setFlags(constants.AV_CODEC_FLAG_GLOBAL_HEADER),nodeAv.FFmpegError.throwIfError(await d.open2(s,null),"audioCtx.open2");let u=c.addStream(d);return new r(d,u,o)}setInputRate(e){this._disposeGraph(),this._inRate=e;let t=new nodeAv.FilterGraph;t.alloc();let o=nodeAv.Filter.getByName("abuffer"),i=`sample_rate=${e}:sample_fmt=flt:channel_layout=stereo:time_base=1/${e}`,n=t.createFilter(o,"src",i);if(!n)throw new Error("Failed to create abuffer");let a=nodeAv.Filter.getByName("abuffersink"),c=t.createFilter(a,"sink");if(!c)throw new Error("Failed to create abuffersink");let d=`aformat=sample_fmts=${er[this._outFmt]??"flt"}:sample_rates=${this._outRate}:channel_layouts=stereo,asetnsamples=n=${this._frameSize}:p=1`,u=nodeAv.FilterInOut.createList([{name:"in",filterCtx:n,padIdx:0}]),m=nodeAv.FilterInOut.createList([{name:"out",filterCtx:c,padIdx:0}]);nodeAv.FFmpegError.throwIfError(t.parsePtr(d,m,u),"graph.parsePtr"),nodeAv.FFmpegError.throwIfError(t.configSync(),"graph.config"),this._graph=t,this._bufSrc=n,this._bufSink=c;}get stream(){return this._stream}get timeBase(){return this._ctx.timeBase}async encode(e,t){var a=[];try{if(!this._bufSrc||!this._bufSink||!this._inRate)return;let o=new Float32Array(e.buffer,e.byteOffset,e.byteLength/4);for(let u=0;u<o.length;u++)isFinite(o[u])||(o[u]=0);let i=o.length>>1;let n=N(a,nodeAv.Frame.fromAudioBuffer(Buffer.from(o.buffer,o.byteOffset,o.byteLength),{nbSamples:i,format:constants.AV_SAMPLE_FMT_FLT,sampleRate:this._inRate,channelLayout:constants.AV_CHANNEL_LAYOUT_STEREO,pts:this.pts,timeBase:{num:1,den:this._inRate}}));this.pts+=BigInt(i);nodeAv.FFmpegError.throwIfError(await this._bufSrc.buffersrcAddFrame(n),"buffersrcAddFrame");await this._drainFilter(t);}catch(c){var s=c,d=true;}finally{Q(a,s,d);}}async flush(e){this._bufSrc&&this._bufSink&&(await this._bufSrc.buffersrcAddFrame(null),await this._drainFilter(e)),await this._ctx.sendFrame(null),await this._drainCodec(e);}[Symbol.dispose](){this._pkt.free(),this._filterFrame.free(),this._disposeGraph(),this._ctx.freeContext();}async _drainFilter(e){let t=this._filterFrame;for(;;){let o=await this._bufSink.buffersinkGetFrame(t);if(o===constants.AVERROR_EAGAIN||o===constants.AVERROR_EOF)break;nodeAv.FFmpegError.throwIfError(o,"buffersinkGetFrame"),nodeAv.FFmpegError.throwIfError(await this._ctx.sendFrame(t),"audioCtx.sendFrame"),t.unref(),await this._drainCodec(e);}}async _drainCodec(e){let t=this._pkt;for(;;){let o=await this._ctx.receivePacket(t);if(o===constants.AVERROR_EAGAIN||o===constants.AVERROR_EOF)break;nodeAv.FFmpegError.throwIfError(o,"audio.receivePacket"),t.streamIndex=this._stream.index,t.rescaleTs(this._ctx.timeBase,this._stream.timeBase),await e.writePacket(t),t.unref();}}_disposeGraph(){this._graph?.[Symbol.dispose](),this._graph=void 0,this._bufSrc=void 0,this._bufSink=void 0;}};var ne=class{_ctx;_opened=false;constructor(e){this._ctx=new nodeAv.FormatContext,nodeAv.FFmpegError.throwIfError(this._ctx.allocOutputContext2(null,null,e),"allocOutputContext2");}addStream(e,t){let o=this._ctx.newStream(null);return o.timeBase=e.timeBase,nodeAv.FFmpegError.throwIfError(o.codecpar.fromContext(e),"codecpar.fromContext"),t&&(o.codecpar.codecTag=t),o}async open(){this._opened||(nodeAv.FFmpegError.throwIfError(await this._ctx.openOutput(),"openOutput"),nodeAv.FFmpegError.throwIfError(await this._ctx.writeHeader(null),"writeHeader"),this._opened=true);}async writePacket(e){nodeAv.FFmpegError.throwIfError(await this._ctx.interleavedWriteFrame(e),"interleavedWriteFrame");}async finish(){this._opened&&(await this._ctx.writeTrailer(),await this._ctx.closeOutput(),this._opened=false);}async[Symbol.asyncDispose](){await this.finish(),await this._ctx[Symbol.asyncDispose]();}};var ae=class r{_ctx;_sws;_src;_dst;_pkt;_stream;pts=0n;constructor(e,t,o,i,n,a){this._ctx=e,this._sws=t,this._src=o,this._dst=i,this._pkt=n,this._stream=a;}static async create(e){let{width:t,height:o,fps:i,codecName:n,pixFmt:a,codecTag:c,globalHeader:s,codecOpts:d,bitrate:u,muxer:m}=e,l=nodeAv.Codec.findEncoderByName(n);if(!l)throw new Error(`Video encoder not found: ${n}`);let p=new nodeAv.CodecContext;p.allocContext3(l),p.codecId=l.id,p.width=t,p.height=o,p.pixelFormat=a,p.timeBase=new nodeAv.Rational(1,i),p.framerate=new nodeAv.Rational(i,1),p.gopSize=i,p.bitRate=BigInt(u),p.setOption("threads","4"),s&&p.setFlags(constants.AV_CODEC_FLAG_GLOBAL_HEADER);for(let[v,b]of Object.entries(d))p.setOption(v,b);c&&(p.codecTag=c),nodeAv.FFmpegError.throwIfError(await p.open2(l,null),"videoCtx.open2");let x=new nodeAv.SoftwareScaleContext;x.getContext(t,o,constants.AV_PIX_FMT_BGRA,t,o,a,constants.SWS_BILINEAR);let _=new nodeAv.Frame;_.alloc(),_.format=a,_.width=t,_.height=o,nodeAv.FFmpegError.throwIfError(_.getBuffer(0),"dstFrame.getBuffer");let g=new nodeAv.Frame;g.alloc(),g.format=constants.AV_PIX_FMT_BGRA,g.width=t,g.height=o,nodeAv.FFmpegError.throwIfError(g.getBuffer(0),"srcFrame.getBuffer");let F=new nodeAv.Packet;F.alloc();let w=m.addStream(p,c);return new r(p,x,g,_,F,w)}get stream(){return this._stream}get timeBase(){return this._ctx.timeBase}async encode(e,t){let{_src:o,_dst:i,_sws:n}=this;nodeAv.FFmpegError.throwIfError(o.makeWritable(),"src.makeWritable"),nodeAv.FFmpegError.throwIfError(o.fromBuffer(e),"src.fromBuffer"),o.pts=this.pts,nodeAv.FFmpegError.throwIfError(i.makeWritable(),"dst.makeWritable"),nodeAv.FFmpegError.throwIfError(await n.scaleFrame(i,o),"sws.scaleFrame"),i.pts=this.pts++,nodeAv.FFmpegError.throwIfError(await this._ctx.sendFrame(i),"videoCtx.sendFrame"),await this.drain(t);}async flush(e){await this._ctx.sendFrame(null),await this.drain(e);}[Symbol.dispose](){this._pkt.free(),this._src.free(),this._dst.free(),this._sws[Symbol.dispose](),this._ctx.freeContext();}async drain(e){let t=this._pkt;for(;;){let o=await this._ctx.receivePacket(t);if(o===constants.AVERROR_EAGAIN||o===constants.AVERROR_EOF)break;nodeAv.FFmpegError.throwIfError(o,"video.receivePacket"),t.streamIndex=this._stream.index,t.rescaleTs(this._ctx.timeBase,this._stream.timeBase),await e.writePacket(t),t.unref();}}};nodeAv.Log.setCallback((r,e)=>{let t=e.trimEnd();t&&(r<=constants.AV_LOG_ERROR?f.error(t):r<=constants.AV_LOG_WARNING&&f.warn(t));});var gr={mp4:{videoCodecName:constants.FF_ENCODER_LIBX265,pixFmt:constants.AV_PIX_FMT_YUVA420P,codecTag:"hvc1",globalHeader:true,videoOpts:{preset:"ultrafast","x265-params":"log-level=1"},audioCodecName:constants.FF_ENCODER_AAC,audioSampleFmt:constants.AV_SAMPLE_FMT_FLTP,outSampleRate:44100},webm:{videoCodecName:"libvpx-vp9",pixFmt:constants.AV_PIX_FMT_YUVA420P,globalHeader:false,videoOpts:{quality:"realtime","cpu-used":"8"},audioCodecName:"libopus",audioSampleFmt:constants.AV_SAMPLE_FMT_FLT,outSampleRate:48e3}},B=class r{_states;constructor(e){this._states=e;}static async create({width:e,height:t,fps:o,formats:i,outDir:n,withAudio:a=false,videoBitrate:c=8e6,audioBitrate:s=128e3}){let d=await Promise.all(i.map(async u=>{let m=gr[u],l=path.join(n,`output.${u}`),p=new ne(l),x=await ae.create({width:e,height:t,fps:o,codecName:m.videoCodecName,pixFmt:m.pixFmt,codecTag:m.codecTag,globalHeader:m.globalHeader,codecOpts:m.videoOpts,bitrate:c,muxer:p}),_;a&&(_=await ie.create({outSampleRate:m.outSampleRate,outSampleFmt:m.audioSampleFmt,codecName:m.audioCodecName,globalHeader:m.globalHeader,bitrate:s,muxer:p})),await p.open();let g=new T(1);return {format:u,outPath:l,muxer:p,video:x,audio:_,limiter:g}}));return new r(d)}setupAudio(e){for(let t of this._states)t.audio?.setInputRate(e);}async encodeFrame(e,t){await Promise.all(this._states.map(o=>o.limiter.schedule(()=>o.video.encode(e,o.muxer))));}async encodeAudio(e){await Promise.all(this._states.map(t=>t.audio?t.limiter.schedule(()=>t.audio.encode(e,t.muxer)):Promise.resolve()));}async finish(){let e={};return await Promise.all(this._states.map(async t=>{var a=[];try{await t.limiter.end();await t.audio?.flush(t.muxer);await t.video.flush(t.muxer);e[t.format]=t.outPath;let o=N(a,t.audio);let i=N(a,t.video);let n=N(a,t.muxer,!0);}catch(c){var s=c,d=true;}finally{var u=Q(a,s,d);u&&await u;}})),e}};function se(r){let e=r.getSize();return e.width===0||e.height===0?true:r.isEmpty()}var Er="[AudioCapture]",Ar=`
|
|
784
2
|
(function() {
|
|
785
3
|
if (window.__pup_audio_capturing__) return;
|
|
786
4
|
window.__pup_audio_capturing__ = true;
|
|
@@ -852,60 +70,27 @@ var AUDIO_CAPTURE_SCRIPT = `
|
|
|
852
70
|
return origPlay.call(this);
|
|
853
71
|
};
|
|
854
72
|
})();
|
|
855
|
-
`;
|
|
856
|
-
async function setupAudioCapture(pipeline) {
|
|
857
|
-
const preloadPath = path.join(os.tmpdir(), `pup_audio_preload_${crypto.randomUUID()}.js`);
|
|
858
|
-
await promises.writeFile(preloadPath, AUDIO_CAPTURE_SCRIPT);
|
|
859
|
-
electron.session.defaultSession.registerPreloadScript({
|
|
860
|
-
type: "frame",
|
|
861
|
-
id: "pup-audio",
|
|
862
|
-
filePath: preloadPath
|
|
863
|
-
});
|
|
864
|
-
electron.ipcMain.once("audio-meta", (_e, data) => {
|
|
865
|
-
pipeline.setupAudio(data.sampleRate);
|
|
866
|
-
});
|
|
867
|
-
electron.ipcMain.on("audio-chunk", async (_e, buffer) => {
|
|
868
|
-
try {
|
|
869
|
-
await pipeline.encodeAudio(buffer);
|
|
870
|
-
} catch (e) {
|
|
871
|
-
logger.error(TAG, "failed to encode audio chunk:", e);
|
|
872
|
-
}
|
|
873
|
-
});
|
|
874
|
-
return {
|
|
875
|
-
async teardown() {
|
|
876
|
-
electron.ipcMain.removeAllListeners("audio-meta");
|
|
877
|
-
electron.ipcMain.removeAllListeners("audio-chunk");
|
|
878
|
-
electron.session.defaultSession.unregisterPreloadScript("pup-audio");
|
|
879
|
-
await promises.rm(preloadPath, { force: true });
|
|
880
|
-
}
|
|
881
|
-
};
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
// src/renderer/frame_sync.ts
|
|
885
|
-
var FRAME_SYNC_MARKER_WIDTH = 32;
|
|
886
|
-
function buildWrapperHTML(targetURL, size) {
|
|
887
|
-
const { width, height } = size;
|
|
888
|
-
return `<!DOCTYPE html>
|
|
73
|
+
`;async function ft(r){let e=path.join(os.tmpdir(),`pup_audio_preload_${crypto.randomUUID()}.js`);return await promises.writeFile(e,Ar),electron.session.defaultSession.registerPreloadScript({type:"frame",id:"pup-audio",filePath:e}),electron.ipcMain.once("audio-meta",(t,o)=>{r.setupAudio(o.sampleRate);}),electron.ipcMain.on("audio-chunk",async(t,o)=>{try{await r.encodeAudio(o);}catch(i){f.error(Er,"failed to encode audio chunk:",i);}}),{async teardown(){electron.ipcMain.removeAllListeners("audio-meta"),electron.ipcMain.removeAllListeners("audio-chunk"),electron.session.defaultSession.unregisterPreloadScript("pup-audio"),await promises.rm(e,{force:true});}}}function lt(r,e){let{width:t,height:o}=e;return `<!DOCTYPE html>
|
|
889
74
|
<html>
|
|
890
75
|
<head>
|
|
891
76
|
<meta charset="UTF-8">
|
|
892
77
|
<style>
|
|
893
78
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
894
|
-
html, body { width: ${
|
|
79
|
+
html, body { width: ${t}px; height: ${o+1}px; overflow: hidden; }
|
|
895
80
|
#target {
|
|
896
81
|
position: absolute;
|
|
897
82
|
top: 0;
|
|
898
83
|
left: 0;
|
|
899
|
-
width: ${
|
|
900
|
-
height: ${
|
|
84
|
+
width: ${t}px;
|
|
85
|
+
height: ${o}px;
|
|
901
86
|
border: none;
|
|
902
87
|
display: block;
|
|
903
88
|
}
|
|
904
89
|
#stego {
|
|
905
90
|
position: absolute;
|
|
906
|
-
top: ${
|
|
91
|
+
top: ${o}px;
|
|
907
92
|
left: 0;
|
|
908
|
-
width: ${
|
|
93
|
+
width: ${t}px;
|
|
909
94
|
height: 1px;
|
|
910
95
|
display: block;
|
|
911
96
|
image-rendering: pixelated;
|
|
@@ -913,12 +98,12 @@ function buildWrapperHTML(targetURL, size) {
|
|
|
913
98
|
</style>
|
|
914
99
|
</head>
|
|
915
100
|
<body>
|
|
916
|
-
<iframe id="target" src="${
|
|
917
|
-
<canvas id="stego" width="${
|
|
101
|
+
<iframe id="target" src="${r}"></iframe>
|
|
102
|
+
<canvas id="stego" width="${t}" height="1"></canvas>
|
|
918
103
|
<script>
|
|
919
104
|
(function() {
|
|
920
|
-
const WIDTH = ${
|
|
921
|
-
const MARKER_WIDTH =
|
|
105
|
+
const WIDTH = ${t};
|
|
106
|
+
const MARKER_WIDTH = 32;
|
|
922
107
|
const canvas = document.getElementById('stego');
|
|
923
108
|
const ctx = canvas.getContext('2d', { willReadFrequently: true });
|
|
924
109
|
let startTime = null;
|
|
@@ -973,520 +158,8 @@ function buildWrapperHTML(targetURL, size) {
|
|
|
973
158
|
})();
|
|
974
159
|
</script>
|
|
975
160
|
</body>
|
|
976
|
-
</html
|
|
977
|
-
}
|
|
978
|
-
function decodeTimestamp(bitmap, size) {
|
|
979
|
-
const { width, height } = size;
|
|
980
|
-
if (width < FRAME_SYNC_MARKER_WIDTH || height < 2) {
|
|
981
|
-
return void 0;
|
|
982
|
-
}
|
|
983
|
-
const markerRow = height - 1;
|
|
984
|
-
let timestamp = 0;
|
|
985
|
-
for (let i = 0; i < FRAME_SYNC_MARKER_WIDTH; i++) {
|
|
986
|
-
const pixelIdx = (markerRow * width + i) * 4;
|
|
987
|
-
const r = bitmap[pixelIdx] ?? 0;
|
|
988
|
-
const bit = r > 127 ? 1 : 0;
|
|
989
|
-
timestamp = timestamp << 1 | bit;
|
|
990
|
-
}
|
|
991
|
-
timestamp = timestamp >>> 0;
|
|
992
|
-
if (!Number.isFinite(timestamp) || timestamp < 0 || timestamp > 1e7) {
|
|
993
|
-
return void 0;
|
|
994
|
-
}
|
|
995
|
-
return timestamp;
|
|
996
|
-
}
|
|
997
|
-
function startSync(cdp) {
|
|
998
|
-
return cdp.sendCommand("Runtime.evaluate", {
|
|
999
|
-
expression: `window.__pup_start_recording__()`
|
|
1000
|
-
});
|
|
1001
|
-
}
|
|
1002
|
-
function stopSync(cdp) {
|
|
1003
|
-
return cdp.sendCommand("Runtime.evaluate", {
|
|
1004
|
-
expression: `window.__pup_stop_recording__()`
|
|
1005
|
-
});
|
|
1006
|
-
}
|
|
1007
|
-
|
|
1008
|
-
// src/base/timing.ts
|
|
1009
|
-
function sleep(ms) {
|
|
1010
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
// src/base/retry.ts
|
|
1014
|
-
function useRetry({ fn, maxAttempts = 3, timeout }) {
|
|
1015
|
-
const timeoutError = new Error(`timeout over ${timeout}ms`);
|
|
1016
|
-
return async function(...args) {
|
|
1017
|
-
let attempt = 0;
|
|
1018
|
-
while (true) {
|
|
1019
|
-
try {
|
|
1020
|
-
const promises = [fn(...args)];
|
|
1021
|
-
if (timeout) {
|
|
1022
|
-
promises.push(
|
|
1023
|
-
promises$1.setTimeout(timeout).then(() => {
|
|
1024
|
-
throw timeoutError;
|
|
1025
|
-
})
|
|
1026
|
-
);
|
|
1027
|
-
}
|
|
1028
|
-
return await Promise.race(promises);
|
|
1029
|
-
} catch (e) {
|
|
1030
|
-
attempt++;
|
|
1031
|
-
if (attempt >= maxAttempts) {
|
|
1032
|
-
throw e;
|
|
1033
|
-
}
|
|
1034
|
-
await sleep(Math.pow(2, attempt) * 100 + Math.random() * 100);
|
|
1035
|
-
}
|
|
1036
|
-
}
|
|
1037
|
-
};
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
// src/renderer/html_check.ts
|
|
1041
|
-
var SUPPORTED_PROTOCOLS = ["file:", "http:", "https:", "data:"];
|
|
1042
|
-
var SOURCE_PATTERN = /^(file:|https?:|data:)/;
|
|
1043
|
-
function checkHTML(source) {
|
|
1044
|
-
if (SOURCE_PATTERN.test(source)) {
|
|
1045
|
-
return;
|
|
1046
|
-
}
|
|
1047
|
-
const protocol = source.split(":")[0] + ":";
|
|
1048
|
-
const message = SUPPORTED_PROTOCOLS.includes(protocol) ? `unsupported protocol: ${protocol}, expected ${SUPPORTED_PROTOCOLS.join(", ")}` : `invalid source format, expected ${SUPPORTED_PROTOCOLS.join(", ")}`;
|
|
1049
|
-
throw new Error(message);
|
|
1050
|
-
}
|
|
1051
|
-
|
|
1052
|
-
// src/base/waitable_event.ts
|
|
1053
|
-
var WaitableEvent = class {
|
|
1054
|
-
_promise;
|
|
1055
|
-
_resolve;
|
|
1056
|
-
_timeoutToken;
|
|
1057
|
-
wait(options) {
|
|
1058
|
-
if (this._promise) {
|
|
1059
|
-
throw new Error("already waiting");
|
|
1060
|
-
}
|
|
1061
|
-
this._promise = new Promise((resolve) => {
|
|
1062
|
-
this._resolve = resolve;
|
|
1063
|
-
if (options?.timeout !== void 0) {
|
|
1064
|
-
this._timeoutToken = setTimeout(() => {
|
|
1065
|
-
options.onTimeout?.();
|
|
1066
|
-
resolve();
|
|
1067
|
-
}, options.timeout);
|
|
1068
|
-
}
|
|
1069
|
-
});
|
|
1070
|
-
return this._promise;
|
|
1071
|
-
}
|
|
1072
|
-
signal() {
|
|
1073
|
-
clearTimeout(this._timeoutToken);
|
|
1074
|
-
this._promise = void 0;
|
|
1075
|
-
this._resolve?.();
|
|
1076
|
-
}
|
|
1077
|
-
};
|
|
1078
|
-
|
|
1079
|
-
// src/renderer/network.ts
|
|
1080
|
-
var TAG2 = "[Network]";
|
|
1081
|
-
var map = /* @__PURE__ */ new Map([
|
|
1082
|
-
[`jssz-boss.hdslb.com`, `jssz-boss.bilibili.co`],
|
|
1083
|
-
//
|
|
1084
|
-
[`boss.hdslb.com`, `shjd-boss.bilibili.co`]
|
|
1085
|
-
]);
|
|
1086
|
-
function proxiedUrl(url$1) {
|
|
1087
|
-
if (!url$1.startsWith("http")) {
|
|
1088
|
-
return url$1;
|
|
1089
|
-
}
|
|
1090
|
-
const parsed = new url.URL(url$1);
|
|
1091
|
-
const target = map.get(parsed.hostname);
|
|
1092
|
-
if (!target) {
|
|
1093
|
-
return url$1;
|
|
1094
|
-
}
|
|
1095
|
-
parsed.hostname = target;
|
|
1096
|
-
parsed.protocol = "http:";
|
|
1097
|
-
return parsed.toString();
|
|
1098
|
-
}
|
|
1099
|
-
function setInterceptor({ source, window, useInnerProxy }) {
|
|
1100
|
-
const req = window.webContents.session.webRequest;
|
|
1101
|
-
const limiter = new ConcurrencyLimiter(64);
|
|
1102
|
-
const events = /* @__PURE__ */ new Map();
|
|
1103
|
-
async function wait(key, onTimeout) {
|
|
1104
|
-
const event = new WaitableEvent();
|
|
1105
|
-
events.set(key, event);
|
|
1106
|
-
await event.wait({ timeout: 5e3, onTimeout }).finally(() => events.delete(key));
|
|
1107
|
-
}
|
|
1108
|
-
function signal(key) {
|
|
1109
|
-
events.get(key)?.signal();
|
|
1110
|
-
}
|
|
1111
|
-
req.onBeforeRequest((details, callback) => {
|
|
1112
|
-
const url = details.url;
|
|
1113
|
-
const proxied = useInnerProxy ? proxiedUrl(url) : url;
|
|
1114
|
-
limiter.schedule(() => {
|
|
1115
|
-
const key = `${window.id}_${details.id}`;
|
|
1116
|
-
logger.debug(TAG2, `start:`, {
|
|
1117
|
-
key,
|
|
1118
|
-
url,
|
|
1119
|
-
proxied,
|
|
1120
|
-
method: details.method,
|
|
1121
|
-
source,
|
|
1122
|
-
stats: limiter.stats
|
|
1123
|
-
});
|
|
1124
|
-
if (proxied === url) {
|
|
1125
|
-
callback({ cancel: false });
|
|
1126
|
-
} else {
|
|
1127
|
-
callback({ cancel: false, redirectURL: proxied });
|
|
1128
|
-
}
|
|
1129
|
-
return wait(key, () => {
|
|
1130
|
-
logger.warn(TAG2, `maybe timeout:`, {
|
|
1131
|
-
key,
|
|
1132
|
-
url,
|
|
1133
|
-
proxied,
|
|
1134
|
-
method: details.method,
|
|
1135
|
-
source
|
|
1136
|
-
});
|
|
1137
|
-
});
|
|
1138
|
-
});
|
|
1139
|
-
});
|
|
1140
|
-
req.onHeadersReceived(({ responseHeaders }, callback) => {
|
|
1141
|
-
delete responseHeaders?.["x-frame-options"];
|
|
1142
|
-
delete responseHeaders?.["X-Frame-Options"];
|
|
1143
|
-
delete responseHeaders?.["content-security-policy"];
|
|
1144
|
-
delete responseHeaders?.["Content-Security-Policy"];
|
|
1145
|
-
callback({ cancel: false, responseHeaders });
|
|
1146
|
-
});
|
|
1147
|
-
req.onCompleted((details) => {
|
|
1148
|
-
const key = `${window.id}_${details.id}`;
|
|
1149
|
-
signal(key);
|
|
1150
|
-
logger.debug(TAG2, `completed:`, {
|
|
1151
|
-
key,
|
|
1152
|
-
url: details.url,
|
|
1153
|
-
method: details.method,
|
|
1154
|
-
statusCode: details.statusCode,
|
|
1155
|
-
source
|
|
1156
|
-
});
|
|
1157
|
-
});
|
|
1158
|
-
req.onErrorOccurred((details) => {
|
|
1159
|
-
const key = `${window.id}_${details.id}`;
|
|
1160
|
-
signal(key);
|
|
1161
|
-
logger.error(TAG2, `error:`, {
|
|
1162
|
-
key,
|
|
1163
|
-
url: details.url,
|
|
1164
|
-
method: details.method,
|
|
1165
|
-
error: details.error,
|
|
1166
|
-
source
|
|
1167
|
-
});
|
|
1168
|
-
});
|
|
1169
|
-
}
|
|
1170
|
-
function unsetInterceptor(window) {
|
|
1171
|
-
const req = window.webContents.session.webRequest;
|
|
1172
|
-
req.onBeforeRequest(null);
|
|
1173
|
-
req.onHeadersReceived(null);
|
|
1174
|
-
req.onCompleted(null);
|
|
1175
|
-
req.onErrorOccurred(null);
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
|
-
// src/renderer/window.ts
|
|
1179
|
-
var TAG3 = "[Window]";
|
|
1180
|
-
function waitForFinish(win, action) {
|
|
1181
|
-
return new Promise((resolve, reject) => {
|
|
1182
|
-
const timeout = setTimeout(() => reject(new Error("load window timeout")), 3e4);
|
|
1183
|
-
const done = (err) => {
|
|
1184
|
-
clearTimeout(timeout);
|
|
1185
|
-
err ? reject(err) : resolve();
|
|
1186
|
-
};
|
|
1187
|
-
win.webContents.once("did-finish-load", () => done());
|
|
1188
|
-
win.webContents.once(
|
|
1189
|
-
"did-fail-load",
|
|
1190
|
-
(_e, code, desc, url) => done(new Error(`failed to load ${url}: [${code}] ${desc}`))
|
|
1191
|
-
);
|
|
1192
|
-
win.webContents.once(
|
|
1193
|
-
"render-process-gone",
|
|
1194
|
-
(_e, { exitCode, reason }) => done(new Error(`renderer crashed: ${exitCode}, ${reason}`))
|
|
1195
|
-
);
|
|
1196
|
-
action();
|
|
1197
|
-
});
|
|
1198
|
-
}
|
|
1199
|
-
async function openWindow(wins, source, options) {
|
|
1200
|
-
checkHTML(source);
|
|
1201
|
-
const { width, height, useInnerProxy } = options;
|
|
1202
|
-
let src = source;
|
|
1203
|
-
if (useInnerProxy) {
|
|
1204
|
-
src = proxiedUrl(source);
|
|
1205
|
-
}
|
|
1206
|
-
wins.forEach((w) => {
|
|
1207
|
-
w.webContents.removeAllListeners();
|
|
1208
|
-
unsetInterceptor(w);
|
|
1209
|
-
logger.debug(TAG3, `destroy window:`, w.id);
|
|
1210
|
-
});
|
|
1211
|
-
const win = new electron.BrowserWindow({
|
|
1212
|
-
width,
|
|
1213
|
-
height: height + 1,
|
|
1214
|
-
show: false,
|
|
1215
|
-
transparent: true,
|
|
1216
|
-
backgroundColor: void 0,
|
|
1217
|
-
webPreferences: {
|
|
1218
|
-
offscreen: true,
|
|
1219
|
-
backgroundThrottling: false,
|
|
1220
|
-
nodeIntegration: true,
|
|
1221
|
-
nodeIntegrationInSubFrames: true,
|
|
1222
|
-
nodeIntegrationInWorker: true,
|
|
1223
|
-
contextIsolation: false,
|
|
1224
|
-
webSecurity: false,
|
|
1225
|
-
allowRunningInsecureContent: true,
|
|
1226
|
-
experimentalFeatures: true
|
|
1227
|
-
}
|
|
1228
|
-
});
|
|
1229
|
-
setInterceptor({ source, window: win, useInnerProxy });
|
|
1230
|
-
wins.splice(0).forEach((w) => w.destroy());
|
|
1231
|
-
wins.push(win);
|
|
1232
|
-
win.webContents.on("console-message", ({ level, message, lineNumber, sourceId }) => {
|
|
1233
|
-
if (level === "error") {
|
|
1234
|
-
logger.error(TAG3, "console:", {
|
|
1235
|
-
message,
|
|
1236
|
-
lineNumber,
|
|
1237
|
-
sourceId,
|
|
1238
|
-
source
|
|
1239
|
-
});
|
|
1240
|
-
}
|
|
1241
|
-
});
|
|
1242
|
-
const wrapperHTML = buildWrapperHTML(src, { width, height });
|
|
1243
|
-
const dataURL = `data:text/html;charset=utf-8,${encodeURIComponent(wrapperHTML)}`;
|
|
1244
|
-
await waitForFinish(win, () => win.loadURL(dataURL));
|
|
1245
|
-
return win;
|
|
1246
|
-
}
|
|
1247
|
-
async function loadWindow(source, options) {
|
|
1248
|
-
try {
|
|
1249
|
-
const wins = [];
|
|
1250
|
-
await useRetry({ fn: openWindow, maxAttempts: 2 })(wins, source, options);
|
|
1251
|
-
return await openWindow(wins, source, options);
|
|
1252
|
-
} catch (e) {
|
|
1253
|
-
const { message, stack } = e;
|
|
1254
|
-
const desc = { source, message, stack };
|
|
1255
|
-
throw new Error(`failed to load window: ${JSON.stringify(desc)}`);
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
|
|
1259
|
-
// src/renderer/render.ts
|
|
1260
|
-
var TAG4 = "[Render]";
|
|
1261
|
-
async function render(source, options) {
|
|
1262
|
-
logger.info(TAG4, `progress: 0%`);
|
|
1263
|
-
const { outDir, fps, width, height, duration, withAudio, formats } = options;
|
|
1264
|
-
await promises.mkdir(outDir, { recursive: true });
|
|
1265
|
-
const pipeline = await EncoderPipeline.create({ width, height, fps, formats, outDir, withAudio });
|
|
1266
|
-
const audioCapture = withAudio ? await setupAudioCapture(pipeline) : void 0;
|
|
1267
|
-
const win = await loadWindow(source, options);
|
|
1268
|
-
try {
|
|
1269
|
-
const cdp = win.webContents.debugger;
|
|
1270
|
-
cdp.attach("1.3");
|
|
1271
|
-
win.webContents.setFrameRate(fps);
|
|
1272
|
-
if (!win.webContents.isPainting()) {
|
|
1273
|
-
win.webContents.startPainting();
|
|
1274
|
-
}
|
|
1275
|
-
const total = Math.ceil(fps * duration);
|
|
1276
|
-
const frameInterval = 1e3 / fps;
|
|
1277
|
-
let written = 0;
|
|
1278
|
-
let lastWrittenTime;
|
|
1279
|
-
let progress = 0;
|
|
1280
|
-
let frameError;
|
|
1281
|
-
let resolver;
|
|
1282
|
-
let rejecter;
|
|
1283
|
-
let coverBgra;
|
|
1284
|
-
const encodeQueue = new ConcurrencyLimiter(1);
|
|
1285
|
-
const scheduleFrame = (frame, timestampUs) => {
|
|
1286
|
-
written++;
|
|
1287
|
-
const t0 = performance.now();
|
|
1288
|
-
encodeQueue.schedule(() => pipeline.encodeFrame(frame, timestampUs)).catch((e) => frameError ??= e);
|
|
1289
|
-
const diff = performance.now() - t0;
|
|
1290
|
-
if (diff > frameInterval * 1.2) {
|
|
1291
|
-
logger.warn(TAG4, `frame stalled in ${diff}ms`);
|
|
1292
|
-
}
|
|
1293
|
-
};
|
|
1294
|
-
const paint = (_e, _r, image) => {
|
|
1295
|
-
if (frameError) {
|
|
1296
|
-
rejecter?.(frameError);
|
|
1297
|
-
return;
|
|
1298
|
-
}
|
|
1299
|
-
if (isEmpty(image)) return;
|
|
1300
|
-
const bitmap = image.toBitmap();
|
|
1301
|
-
const currentTime = decodeTimestamp(bitmap, image.getSize());
|
|
1302
|
-
if (currentTime === void 0) {
|
|
1303
|
-
frameError ??= new Error(`no timestamp @ ${written}`);
|
|
1304
|
-
return;
|
|
1305
|
-
}
|
|
1306
|
-
const bytesPerRow = width * 4;
|
|
1307
|
-
const cropped = Buffer.from(bitmap.buffer, bitmap.byteOffset, height * bytesPerRow);
|
|
1308
|
-
coverBgra ??= cropped;
|
|
1309
|
-
if (lastWrittenTime === void 0) {
|
|
1310
|
-
scheduleFrame(cropped, currentTime * 1e3);
|
|
1311
|
-
lastWrittenTime = currentTime;
|
|
1312
|
-
} else {
|
|
1313
|
-
const timeDelta = currentTime - lastWrittenTime;
|
|
1314
|
-
if (timeDelta >= frameInterval * 0.8) {
|
|
1315
|
-
if (timeDelta <= frameInterval * 1.2) {
|
|
1316
|
-
scheduleFrame(cropped, currentTime * 1e3);
|
|
1317
|
-
} else {
|
|
1318
|
-
const framesToInsert = Math.round(timeDelta / frameInterval);
|
|
1319
|
-
for (let i = 0; i < framesToInsert && written < total; i++) {
|
|
1320
|
-
scheduleFrame(cropped, Math.round((lastWrittenTime + (i + 1) * frameInterval) * 1e3));
|
|
1321
|
-
}
|
|
1322
|
-
}
|
|
1323
|
-
lastWrittenTime = currentTime;
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
|
-
const newProgress = Math.floor(written / total * 100);
|
|
1327
|
-
if (Math.abs(newProgress - progress) > 10) {
|
|
1328
|
-
progress = newProgress;
|
|
1329
|
-
logger.info(TAG4, `progress: ${Math.round(progress)}%`);
|
|
1330
|
-
}
|
|
1331
|
-
const durationMs = duration * 1e3;
|
|
1332
|
-
if (currentTime >= durationMs - frameInterval * 0.5 || written >= total) {
|
|
1333
|
-
resolver?.();
|
|
1334
|
-
}
|
|
1335
|
-
};
|
|
1336
|
-
win.webContents.on("paint", paint);
|
|
1337
|
-
await startSync(cdp);
|
|
1338
|
-
try {
|
|
1339
|
-
await new Promise((r, j) => [resolver, rejecter] = [r, j]);
|
|
1340
|
-
} finally {
|
|
1341
|
-
await stopSync(cdp);
|
|
1342
|
-
win.webContents.off("paint", paint);
|
|
1343
|
-
await audioCapture?.teardown();
|
|
1344
|
-
}
|
|
1345
|
-
if (frameError || written === 0) {
|
|
1346
|
-
throw frameError ?? new Error("no frames captured");
|
|
1347
|
-
}
|
|
1348
|
-
await encodeQueue.end();
|
|
1349
|
-
const outputFiles = await pipeline.finish();
|
|
1350
|
-
const coverPath = path.join(outDir, "cover.png");
|
|
1351
|
-
assert.ok(coverBgra, "cover image is missing");
|
|
1352
|
-
const png = electron.nativeImage.createFromBuffer(coverBgra, { width, height }).toPNG();
|
|
1353
|
-
await promises.writeFile(coverPath, png);
|
|
1354
|
-
const result = {
|
|
1355
|
-
options,
|
|
1356
|
-
written,
|
|
1357
|
-
files: { ...outputFiles, cover: coverPath }
|
|
1358
|
-
};
|
|
1359
|
-
await promises.writeFile(path.join(outDir, "summary.json"), JSON.stringify(result));
|
|
1360
|
-
logger.info(TAG4, `progress: 100%, ${written} frames written`);
|
|
1361
|
-
} finally {
|
|
1362
|
-
win.close();
|
|
1363
|
-
}
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
// src/base/cdp.ts
|
|
1367
|
-
function advanceVirtualTime(cdp, budget) {
|
|
1368
|
-
return new Promise((resolve) => {
|
|
1369
|
-
const handler = (_, method) => {
|
|
1370
|
-
if (method === "Emulation.virtualTimeBudgetExpired") {
|
|
1371
|
-
cdp.off("message", handler);
|
|
1372
|
-
resolve();
|
|
1373
|
-
}
|
|
1374
|
-
};
|
|
1375
|
-
cdp.on("message", handler);
|
|
1376
|
-
cdp.sendCommand("Emulation.setVirtualTimePolicy", {
|
|
1377
|
-
policy: "advance",
|
|
1378
|
-
budget
|
|
1379
|
-
});
|
|
1380
|
-
});
|
|
1381
|
-
}
|
|
1382
|
-
|
|
1383
|
-
// src/renderer/shoot.ts
|
|
1384
|
-
var TAG5 = "[Shoot]";
|
|
1385
|
-
function tickAnims(tick) {
|
|
1386
|
-
return `document.getAnimations().forEach((a) => {
|
|
161
|
+
</html>`}function de(r,e){let{width:t,height:o}=e;if(t<32||o<2)return;let i=o-1,n=0;for(let a=0;a<32;a++){let c=(i*t+a)*4,d=(r[c]??0)>127?1:0;n=n<<1|d;}if(n=n>>>0,!(!Number.isFinite(n)||n<0||n>1e7))return n}function me(r){return r.sendCommand("Runtime.evaluate",{expression:"window.__pup_start_recording__()"})}function ue(r){return r.sendCommand("Runtime.evaluate",{expression:"window.__pup_stop_recording__()"})}function ht(r){return new Promise(e=>setTimeout(e,r))}function wt({fn:r,maxAttempts:e=3,timeout:t}){let o=new Error(`timeout over ${t}ms`);return async function(...i){let n=0;for(;;)try{let a=[r(...i)];return t&&a.push(promises$1.setTimeout(t).then(()=>{throw o})),await Promise.race(a)}catch(a){if(n++,n>=e)throw a;await ht(Math.pow(2,n)*100+Math.random()*100);}}}var Se=["file:","http:","https:","data:"],Rr=/^(file:|https?:|data:)/;function _t(r){if(Rr.test(r))return;let e=r.split(":")[0]+":",t=Se.includes(e)?`unsupported protocol: ${e}, expected ${Se.join(", ")}`:`invalid source format, expected ${Se.join(", ")}`;throw new Error(t)}var pe=class{_promise;_resolve;_timeoutToken;wait(e){if(this._promise)throw new Error("already waiting");return this._promise=new Promise(t=>{this._resolve=t,e?.timeout!==void 0&&(this._timeoutToken=setTimeout(()=>{e.onTimeout?.(),t();},e.timeout));}),this._promise}signal(){clearTimeout(this._timeoutToken),this._promise=void 0,this._resolve?.();}};var fe="[Network]",Tr=new Map([["jssz-boss.hdslb.com","jssz-boss.bilibili.co"],["boss.hdslb.com","shjd-boss.bilibili.co"]]);function Ie(r){if(!r.startsWith("http"))return r;let e=new url.URL(r),t=Tr.get(e.hostname);return t?(e.hostname=t,e.protocol="http:",e.toString()):r}function gt({source:r,window:e,useInnerProxy:t}){let o=e.webContents.session.webRequest,i=new T(64),n=new Map;async function a(s,d){let u=new pe;n.set(s,u),await u.wait({timeout:5e3,onTimeout:d}).finally(()=>n.delete(s));}function c(s){n.get(s)?.signal();}o.onBeforeRequest((s,d)=>{let u=s.url,m=t?Ie(u):u;i.schedule(()=>{let l=`${e.id}_${s.id}`;return f.debug(fe,"start:",{key:l,url:u,proxied:m,method:s.method,source:r,stats:i.stats}),d(m===u?{cancel:false}:{cancel:false,redirectURL:m}),a(l,()=>{f.warn(fe,"maybe timeout:",{key:l,url:u,proxied:m,method:s.method,source:r});})});}),o.onHeadersReceived(({responseHeaders:s},d)=>{delete s?.["x-frame-options"],delete s?.["X-Frame-Options"],delete s?.["content-security-policy"],delete s?.["Content-Security-Policy"],d({cancel:false,responseHeaders:s});}),o.onCompleted(s=>{let d=`${e.id}_${s.id}`;c(d),f.debug(fe,"completed:",{key:d,url:s.url,method:s.method,statusCode:s.statusCode,source:r});}),o.onErrorOccurred(s=>{let d=`${e.id}_${s.id}`;c(d),f.error(fe,"error:",{key:d,url:s.url,method:s.method,error:s.error,source:r});});}function bt(r){let e=r.webContents.session.webRequest;e.onBeforeRequest(null),e.onHeadersReceived(null),e.onCompleted(null),e.onErrorOccurred(null);}var xt="[Window]";function Ir(r,e){return new Promise((t,o)=>{let i=setTimeout(()=>o(new Error("load window timeout")),3e4),n=a=>{clearTimeout(i),a?o(a):t();};r.webContents.once("did-finish-load",()=>n()),r.webContents.once("did-fail-load",(a,c,s,d)=>n(new Error(`failed to load ${d}: [${c}] ${s}`))),r.webContents.once("render-process-gone",(a,{exitCode:c,reason:s})=>n(new Error(`renderer crashed: ${c}, ${s}`))),e();})}async function Ft(r,e,t){_t(e);let{width:o,height:i,useInnerProxy:n}=t,a=e;n&&(a=Ie(e)),r.forEach(u=>{u.webContents.removeAllListeners(),bt(u),f.debug(xt,"destroy window:",u.id);});let c=new electron.BrowserWindow({width:o,height:i+1,show:false,transparent:true,backgroundColor:void 0,webPreferences:{offscreen:true,backgroundThrottling:false,nodeIntegration:true,nodeIntegrationInSubFrames:true,nodeIntegrationInWorker:true,contextIsolation:false,webSecurity:false,allowRunningInsecureContent:true,experimentalFeatures:true}});gt({source:e,window:c,useInnerProxy:n}),r.splice(0).forEach(u=>u.destroy()),r.push(c),c.webContents.on("console-message",({level:u,message:m,lineNumber:l,sourceId:p})=>{u==="error"&&f.error(xt,"console:",{message:m,lineNumber:l,sourceId:p,source:e});});let s=lt(a,{width:o,height:i}),d=`data:text/html;charset=utf-8,${encodeURIComponent(s)}`;return await Ir(c,()=>c.loadURL(d)),c}async function le(r,e){try{let t=[];return await wt({fn:Ft,maxAttempts:2})(t,r,e),await Ft(t,r,e)}catch(t){let{message:o,stack:i}=t,n={source:r,message:o,stack:i};throw new Error(`failed to load window: ${JSON.stringify(n)}`)}}var he="[Render]";async function Et(r,e){f.info(he,"progress: 0%");let{outDir:t,fps:o,width:i,height:n,duration:a,withAudio:c,formats:s}=e;await promises.mkdir(t,{recursive:true});let d=await B.create({width:i,height:n,fps:o,formats:s,outDir:t,withAudio:c}),u=c?await ft(d):void 0,m=await le(r,e);try{let l=m.webContents.debugger;l.attach("1.3"),m.webContents.setFrameRate(o),m.webContents.isPainting()||m.webContents.startPainting();let p=Math.ceil(o*a),x=1e3/o,_=0,g,F=0,w,v,b,A,j=new T(1),E=(Y,K)=>{_++;let $=performance.now();j.schedule(()=>d.encodeFrame(Y,K)).catch(P=>w??=P);let L=performance.now()-$;L>x*1.2&&f.warn(he,`frame stalled in ${L}ms`);},q=(Y,K,$)=>{if(w){b?.(w);return}if(se($))return;let L=$.toBitmap(),P=de(L,$.getSize());if(P===void 0){w??=new Error(`no timestamp @ ${_}`);return}let kt=i*4,X=Buffer.from(L.buffer,L.byteOffset,n*kt);if(A??=X,g===void 0)E(X,P*1e3),g=P;else {let ge=P-g;if(ge>=x*.8){if(ge<=x*1.2)E(X,P*1e3);else {let Lt=Math.round(ge/x);for(let be=0;be<Lt&&_<p;be++)E(X,Math.round((g+(be+1)*x)*1e3));}g=P;}}let ke=Math.floor(_/p*100);Math.abs(ke-F)>10&&(F=ke,f.info(he,`progress: ${Math.round(F)}%`));let Mt=a*1e3;(P>=Mt-x*.5||_>=p)&&v?.();};m.webContents.on("paint",q),await me(l);try{await new Promise((Y,K)=>[v,b]=[Y,K]);}finally{await ue(l),m.webContents.off("paint",q),await u?.teardown();}if(w||_===0)throw w??new Error("no frames captured");await j.end();let _e=await d.finish(),V=path.join(t,"cover.png");assert.ok(A,"cover image is missing");let z=electron.nativeImage.createFromBuffer(A,{width:i,height:n}).toPNG();await promises.writeFile(V,z);let It={options:e,written:_,files:{..._e,cover:V}};await promises.writeFile(path.join(t,"summary.json"),JSON.stringify(It)),f.info(he,`progress: 100%, ${_} frames written`);}finally{m.close();}}function At(r,e){return new Promise(t=>{let o=(i,n)=>{n==="Emulation.virtualTimeBudgetExpired"&&(r.off("message",o),t());};r.on("message",o),r.sendCommand("Emulation.setVirtualTimePolicy",{policy:"advance",budget:e});})}var we="[Shoot]";function Ct(r){return `document.getAnimations().forEach((a) => {
|
|
1387
162
|
a.pause();
|
|
1388
|
-
a.currentTime += ${
|
|
1389
|
-
})
|
|
1390
|
-
}
|
|
1391
|
-
function awaitStegoFrame(win, width, height, afterTs, frameIndex) {
|
|
1392
|
-
return new Promise((resolve, reject) => {
|
|
1393
|
-
const timeout = setTimeout(() => reject(new Error(`frame ${frameIndex} paint timeout`)), 1e3);
|
|
1394
|
-
const handler = (_e, _d, image) => {
|
|
1395
|
-
if (isEmpty(image)) return;
|
|
1396
|
-
const bitmap = image.toBitmap();
|
|
1397
|
-
const ts = decodeTimestamp(bitmap, image.getSize());
|
|
1398
|
-
if (ts === void 0 || ts <= afterTs) return;
|
|
1399
|
-
clearTimeout(timeout);
|
|
1400
|
-
win.webContents.off("paint", handler);
|
|
1401
|
-
resolve(Buffer.from(bitmap.buffer, bitmap.byteOffset, height * width * 4));
|
|
1402
|
-
};
|
|
1403
|
-
win.webContents.on("paint", handler);
|
|
1404
|
-
});
|
|
1405
|
-
}
|
|
1406
|
-
async function shoot(source, options) {
|
|
1407
|
-
const { outDir, fps, width, height, duration, withAudio, formats } = options;
|
|
1408
|
-
if (withAudio) {
|
|
1409
|
-
logger.warn(TAG5, "Audio capture is not supported in deterministic mode");
|
|
1410
|
-
}
|
|
1411
|
-
logger.info(TAG5, `progress: 0%`);
|
|
1412
|
-
await promises.mkdir(outDir, { recursive: true });
|
|
1413
|
-
const win = await loadWindow(source, options);
|
|
1414
|
-
try {
|
|
1415
|
-
const cdp = win.webContents.debugger;
|
|
1416
|
-
cdp.attach("1.3");
|
|
1417
|
-
win.webContents.setFrameRate(240);
|
|
1418
|
-
const rootFrame = win.webContents.mainFrame.frames[0];
|
|
1419
|
-
await rootFrame?.executeJavaScript(tickAnims(0));
|
|
1420
|
-
if (!win.webContents.isPainting()) {
|
|
1421
|
-
win.webContents.startPainting();
|
|
1422
|
-
}
|
|
1423
|
-
await startSync(cdp);
|
|
1424
|
-
const pipeline = await EncoderPipeline.create({ width, height, fps, formats, outDir, withAudio });
|
|
1425
|
-
const total = Math.ceil(fps * duration);
|
|
1426
|
-
const frameInterval = 1e3 / fps;
|
|
1427
|
-
const frameIntervalUs = Math.round(1e6 / fps);
|
|
1428
|
-
let written = 0;
|
|
1429
|
-
let progress = 0;
|
|
1430
|
-
let coverBgra;
|
|
1431
|
-
try {
|
|
1432
|
-
for (let frame = 0; frame < total; frame++) {
|
|
1433
|
-
const frameMs = (frame + 1) * frameInterval;
|
|
1434
|
-
const pending = awaitStegoFrame(win, width, height, frameMs - 1, frame);
|
|
1435
|
-
await advanceVirtualTime(cdp, frameInterval);
|
|
1436
|
-
await rootFrame?.executeJavaScript(tickAnims(frameInterval));
|
|
1437
|
-
const bitmap = await pending;
|
|
1438
|
-
if (frame === 0) {
|
|
1439
|
-
coverBgra = bitmap;
|
|
1440
|
-
}
|
|
1441
|
-
await pipeline.encodeFrame(bitmap, frame * frameIntervalUs);
|
|
1442
|
-
written++;
|
|
1443
|
-
const newProgress = Math.floor(written / total * 100);
|
|
1444
|
-
if (Math.abs(newProgress - progress) > 10) {
|
|
1445
|
-
progress = newProgress;
|
|
1446
|
-
logger.info(TAG5, `progress: ${Math.round(progress)}%`);
|
|
1447
|
-
}
|
|
1448
|
-
}
|
|
1449
|
-
} finally {
|
|
1450
|
-
await stopSync(cdp);
|
|
1451
|
-
cdp.detach();
|
|
1452
|
-
}
|
|
1453
|
-
if (written === 0) {
|
|
1454
|
-
throw new Error("no frames captured");
|
|
1455
|
-
}
|
|
1456
|
-
const outputFiles = await pipeline.finish();
|
|
1457
|
-
const coverPath = path.join(outDir, "cover.png");
|
|
1458
|
-
assert.ok(coverBgra, "cover image is missing");
|
|
1459
|
-
const png = electron.nativeImage.createFromBuffer(coverBgra, { width, height }).toPNG();
|
|
1460
|
-
await promises.writeFile(coverPath, png);
|
|
1461
|
-
const result = {
|
|
1462
|
-
options,
|
|
1463
|
-
written,
|
|
1464
|
-
files: { ...outputFiles, cover: coverPath }
|
|
1465
|
-
};
|
|
1466
|
-
await promises.writeFile(path.join(outDir, "summary.json"), JSON.stringify(result));
|
|
1467
|
-
logger.info(TAG5, `progress: 100%, ${written} frames written`);
|
|
1468
|
-
} finally {
|
|
1469
|
-
win.close();
|
|
1470
|
-
}
|
|
1471
|
-
}
|
|
1472
|
-
|
|
1473
|
-
// src/app.ts
|
|
1474
|
-
process.once("exit", () => electron.app.quit());
|
|
1475
|
-
var TAG6 = "[App]";
|
|
1476
|
-
function printFeatures() {
|
|
1477
|
-
logger.debug(TAG6, "gpu features:", electron.app.getGPUFeatureStatus());
|
|
1478
|
-
}
|
|
1479
|
-
electron.app.dock?.hide();
|
|
1480
|
-
makeCLI("app", async (source, options) => {
|
|
1481
|
-
try {
|
|
1482
|
-
electron.app.on("gpu-info-update", printFeatures);
|
|
1483
|
-
await electron.app.whenReady();
|
|
1484
|
-
printFeatures();
|
|
1485
|
-
const action = options.deterministic ? shoot : render;
|
|
1486
|
-
await action(source, options);
|
|
1487
|
-
} finally {
|
|
1488
|
-
electron.app.quit();
|
|
1489
|
-
}
|
|
1490
|
-
});
|
|
1491
|
-
//# sourceMappingURL=app.cjs.map
|
|
1492
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYnVuL3RzdXBAOC41LjErMDdhMGQ2MWJiMDc1MTRlZS9ub2RlX21vZHVsZXMvdHN1cC9hc3NldHMvY2pzX3NoaW1zLmpzIiwiLi4vc3JjL2Jhc2UvZW52LnRzIiwiLi4vc3JjL2Jhc2UvcGFyc2VyLnRzIiwiLi4vc3JjL2Jhc2UvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Jhc2UvbG9nZ2luZy50cyIsIi4uL3NyYy9iYXNlL25vZXJyLnRzIiwiLi4vc3JjL2Jhc2UvcHJvY2Vzcy50cyIsIi4uL3NyYy9yZW5kZXJlci9zY2hlbWEudHMiLCIuLi9zcmMvY29tbW9uLnRzIiwiLi4vc3JjL2Jhc2UvbGltaXRlci50cyIsIi4uL3NyYy9iYXNlL2VuY29kZXIvYXVkaW8udHMiLCIuLi9zcmMvYmFzZS9lbmNvZGVyL211eGVyLnRzIiwiLi4vc3JjL2Jhc2UvZW5jb2Rlci92aWRlby50cyIsIi4uL3NyYy9iYXNlL2VuY29kZXIvZW5jb2Rlci50cyIsIi4uL3NyYy9iYXNlL2ltYWdlLnRzIiwiLi4vc3JjL3JlbmRlcmVyL2F1ZGlvX2NhcHR1cmUudHMiLCIuLi9zcmMvcmVuZGVyZXIvZnJhbWVfc3luYy50cyIsIi4uL3NyYy9iYXNlL3RpbWluZy50cyIsIi4uL3NyYy9iYXNlL3JldHJ5LnRzIiwiLi4vc3JjL3JlbmRlcmVyL2h0bWxfY2hlY2sudHMiLCIuLi9zcmMvYmFzZS93YWl0YWJsZV9ldmVudC50cyIsIi4uL3NyYy9yZW5kZXJlci9uZXR3b3JrLnRzIiwiLi4vc3JjL3JlbmRlcmVyL3dpbmRvdy50cyIsIi4uL3NyYy9yZW5kZXJlci9yZW5kZXIudHMiLCIuLi9zcmMvYmFzZS9jZHAudHMiLCIuLi9zcmMvcmVuZGVyZXIvc2hvb3QudHMiLCIuLi9zcmMvYXBwLnRzIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwiZGlybmFtZSIsImpvaW4iLCJ6IiwicHJvZ3JhbSIsIkFWX1NBTVBMRV9GTVRfRkxUIiwiQVZfU0FNUExFX0ZNVF9GTFRQIiwiUGFja2V0IiwiRnJhbWUiLCJDb2RlYyIsIkNvZGVjQ29udGV4dCIsIkFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTyIsIlJhdGlvbmFsIiwiQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSIiwiRkZtcGVnRXJyb3IiLCJGaWx0ZXJHcmFwaCIsIkZpbHRlciIsIkZpbHRlckluT3V0IiwiQVZFUlJPUl9FQUdBSU4iLCJBVkVSUk9SX0VPRiIsIkZvcm1hdENvbnRleHQiLCJTb2Z0d2FyZVNjYWxlQ29udGV4dCIsIkFWX1BJWF9GTVRfQkdSQSIsIlNXU19CSUxJTkVBUiIsIkxvZyIsIkFWX0xPR19FUlJPUiIsIkFWX0xPR19XQVJOSU5HIiwiRkZfRU5DT0RFUl9MSUJYMjY1IiwiQVZfUElYX0ZNVF9ZVVZBNDIwUCIsIkZGX0VOQ09ERVJfQUFDIiwidG1wZGlyIiwicmFuZG9tVVVJRCIsIndyaXRlRmlsZSIsInNlc3Npb24iLCJpcGNNYWluIiwicm0iLCJzZXRUaW1lb3V0IiwiVEFHIiwidXJsIiwiVVJMIiwiQnJvd3NlcldpbmRvdyIsIm1rZGlyIiwib2siLCJuYXRpdmVJbWFnZSIsImFwcCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLQSxJQUFNLGdCQUFBLEdBQW1CLE1BQ3ZCLE9BQU8sUUFBQSxLQUFhLFdBQUEsR0FDaEIsSUFBSSxHQUFBLENBQUksQ0FBQSxLQUFBLEVBQVEsVUFBVSxDQUFBLENBQUUsQ0FBQSxDQUFFLElBQUEsR0FDN0IsUUFBQSxDQUFTLGFBQUEsSUFBaUIsUUFBQSxDQUFTLGFBQUEsQ0FBYyxPQUFBLENBQVEsV0FBQSxFQUFZLEtBQU0sUUFBQSxHQUMxRSxRQUFBLENBQVMsYUFBQSxDQUFjLEdBQUEsR0FDdkIsSUFBSSxHQUFBLENBQUksU0FBQSxFQUFXLFFBQUEsQ0FBUyxPQUFPLENBQUEsQ0FBRSxJQUFBO0FBRXRDLElBQU0sZ0NBQWdDLGdCQUFBLEVBQWlCOzs7QUNOdkQsU0FBUyxJQUFBLENBQVEsSUFBQSxFQUFjLE1BQUEsRUFBc0IsWUFBQSxFQUFpQztBQUMzRixFQUFBLElBQUk7QUFDRixJQUFBLE9BQU8sTUFBQSxDQUFPLE9BQUEsQ0FBUSxHQUFBLENBQUksSUFBSSxDQUFDLENBQUE7QUFBQSxFQUNqQyxDQUFBLENBQUEsTUFBUTtBQUNOLElBQUEsT0FBTyxZQUFBO0FBQUEsRUFDVDtBQUNGOzs7QUNWTyxTQUFTLFlBQVksQ0FBQSxFQUFvQjtBQUM5QyxFQUFBLElBQUksT0FBTyxNQUFNLFFBQUEsRUFBVTtBQUN6QixJQUFBLE9BQU8sQ0FBQTtBQUFBLEVBQ1Q7QUFDQSxFQUFBLE1BQU0sR0FBQSxHQUFNLE9BQU8sQ0FBQyxDQUFBO0FBQ3BCLEVBQUEsSUFBSSxNQUFBLENBQU8sS0FBQSxDQUFNLEdBQUcsQ0FBQSxFQUFHO0FBQ3JCLElBQUEsTUFBTSxJQUFJLEtBQUEsQ0FBTSxDQUFBLE1BQUEsRUFBUyxDQUFDLENBQUEsc0JBQUEsQ0FBd0IsQ0FBQTtBQUFBLEVBQ3BEO0FBQ0EsRUFBQSxPQUFPLEdBQUE7QUFDVDtBQUVPLFNBQVMsWUFBWSxDQUFBLEVBQW9CO0FBQzlDLEVBQUEsSUFBSSxPQUFPLENBQUEsS0FBTSxRQUFBLEVBQVUsT0FBTyxDQUFBO0FBQ2xDLEVBQUEsT0FBTyxPQUFPLENBQUMsQ0FBQTtBQUNqQjs7O0FDVEEsSUFBTUEsUUFBQUEsR0FBVUMsdUJBQWMsYUFBZSxDQUFBO0FBQzdDLElBQU0sTUFBTSxPQUFBLENBQVEsR0FBQTtBQUViLElBQU0sV0FBQSxHQUFjLElBQUEsQ0FBSyxlQUFBLEVBQWlCLFdBQUEsRUFBYSxDQUFDLENBQUE7QUFDeEQsSUFBTSxnQkFBQSxHQUFtQixHQUFBLENBQUkscUJBQXFCLENBQUEsS0FBTSxHQUFBO0FBQ2xDLEdBQUEsQ0FBSSxpQkFBaUIsQ0FBQSxLQUFNO0FBRWpELElBQU0sVUFBQSxHQUFhQyxZQUFBLENBQVFGLFFBQUFBLENBQVEsT0FBQSxDQUFRLDJCQUEyQixDQUFDLENBQUE7QUFDeERHLFNBQUEsQ0FBSyxVQUFBLEVBQVksTUFBQSxFQUFRLFNBQVM7OztBQ0F4RCxJQUFNLEtBQUEsR0FBUSxhQUFBO0FBQ2QsSUFBTSxJQUFBLEdBQU8sWUFBQTtBQUNiLElBQU0sSUFBQSxHQUFPLFlBQUE7QUFDYixJQUFNLEtBQUEsR0FBUSxhQUFBO0FBQ2QsSUFBTSxLQUFBLEdBQVEsYUFBQTtBQUVkLFNBQVMsU0FBQSxDQUFVLFFBQWtCLFFBQUEsRUFBdUM7QUFDMUUsRUFBQSxPQUFPLFlBQTJCLFFBQUEsRUFBcUI7QUFDckQsSUFBQSxNQUFNLFNBQUEsR0FBWSxRQUFBLENBQVMsR0FBQSxDQUFJLENBQUMsR0FBQSxLQUFRO0FBQ3RDLE1BQUEsT0FBTyxlQUFlLEtBQUEsR0FBUyxHQUFBLENBQUksS0FBQSxJQUFTLE1BQUEsQ0FBTyxHQUFHLENBQUEsR0FBSyxHQUFBO0FBQUEsSUFDN0QsQ0FBQyxDQUFBO0FBQ0QsSUFBQSxPQUFPLE1BQUEsQ0FBTyxJQUFBLENBQUssSUFBQSxFQUFNLEdBQUcsU0FBUyxDQUFBO0FBQUEsRUFDdkMsQ0FBQTtBQUNGO0FBNUJBLElBQUEsVUFBQSxFQUFBLFVBQUEsRUFBQSxTQUFBLEVBQUEsU0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBO0FBZ0VFLFVBQUEsR0FBQSxDQUFDLFlBS0QsU0FBQSxHQUFBLENBQUMsU0FBQSxDQUFBLEVBS0QsYUFBQyxTQUFBLENBQUEsRUFLRCxVQUFBLEdBQUEsQ0FBQyxZQUtELFVBQUEsR0FBQSxDQUFDLFNBQUEsQ0FBQTtBQXRESSxJQUFNLFNBQU4sTUFBbUM7QUFBQSxFQThCeEMsV0FBQSxDQUFvQixTQUFpQixXQUFBLEVBQWE7QUFBOUIsSUFBQSxJQUFBLENBQUEsTUFBQSxHQUFBLE1BQUE7QUE5QmYsSUFBQSxpQkFBQSxDQUFBLEtBQUEsRUFBQSxDQUFBLEVBQUEsSUFBQSxDQUFBO0FBQ0wsSUFBQSxhQUFBLENBQUEsSUFBQSxFQUFRLE9BQUEsQ0FBQTtBQThCTixJQUFBLElBQUEsQ0FBSyxJQUFBLEdBQU8sT0FBQTtBQUFBLEVBQ2Q7QUFBQSxFQTdCQSxJQUFJLEtBQUEsR0FBZ0I7QUFDbEIsSUFBQSxPQUFPLElBQUEsQ0FBSyxNQUFBO0FBQUEsRUFDZDtBQUFBLEVBRUEsSUFBSSxNQUFNLEtBQUEsRUFBZTtBQUN2QixJQUFBLElBQUEsQ0FBSyxNQUFBLEdBQVMsS0FBQTtBQUNkLElBQUEsSUFBQSxDQUFLLElBQUEsR0FBTyxLQUFLLEtBQUEsSUFBUyxPQUFBO0FBQUEsRUFDNUI7QUFBQSxFQUVBLElBQUksSUFBQSxHQUErQjtBQUNqQyxJQUFBLE9BQU8sSUFBQSxDQUFLLEtBQUE7QUFBQSxFQUNkO0FBQUEsRUFFQSxJQUFJLEtBQUssS0FBQSxFQUFtQjtBQUMxQixJQUFBLE1BQU0sS0FBQSxHQUFRLEtBQUEsQ0FBTSxLQUFBLElBQVMsT0FBQSxDQUFRLEtBQUE7QUFDckMsSUFBQSxNQUFNLElBQUEsR0FBTyxLQUFBLENBQU0sSUFBQSxJQUFRLE9BQUEsQ0FBUSxJQUFBO0FBQ25DLElBQUEsTUFBTSxJQUFBLEdBQU8sS0FBQSxDQUFNLElBQUEsSUFBUSxPQUFBLENBQVEsSUFBQTtBQUNuQyxJQUFBLE1BQU0sS0FBQSxHQUFRLEtBQUEsQ0FBTSxLQUFBLElBQVMsT0FBQSxDQUFRLEtBQUE7QUFDckMsSUFBQSxNQUFNLEtBQUssSUFBQSxDQUFLLE1BQUE7QUFDaEIsSUFBQSxJQUFBLENBQUssS0FBQSxHQUFRO0FBQUEsTUFDWCxLQUFBLEVBQU8sRUFBQSxJQUFNLENBQUEsR0FBSSxLQUFBLEdBQVEsTUFBQTtBQUFBLE1BQ3pCLElBQUEsRUFBTSxFQUFBLElBQU0sQ0FBQSxHQUFJLElBQUEsR0FBTyxNQUFBO0FBQUEsTUFDdkIsSUFBQSxFQUFNLEVBQUEsSUFBTSxDQUFBLEdBQUksSUFBQSxHQUFPLE1BQUE7QUFBQSxNQUN2QixLQUFBLEVBQU8sRUFBQSxJQUFNLENBQUEsR0FBSSxLQUFBLEdBQVE7QUFBQSxLQUMzQjtBQUFBLEVBQ0Y7QUFBQSxFQU9BLFNBQVMsUUFBQSxFQUEyQjtBQUNsQyxJQUFBLElBQUEsQ0FBSyxJQUFBLEVBQU0sS0FBQSxHQUFRLEtBQUEsRUFBTyxHQUFHLFFBQVEsQ0FBQTtBQUFBLEVBQ3ZDO0FBQUEsRUFHQSxRQUFRLFFBQUEsRUFBMkI7QUFDakMsSUFBQSxJQUFBLENBQUssSUFBQSxFQUFNLElBQUEsR0FBTyxJQUFBLEVBQU0sR0FBRyxRQUFRLENBQUE7QUFBQSxFQUNyQztBQUFBLEVBR0EsUUFBUSxRQUFBLEVBQTJCO0FBQ2pDLElBQUEsSUFBQSxDQUFLLElBQUEsRUFBTSxJQUFBLEdBQU8sSUFBQSxFQUFNLEdBQUcsUUFBUSxDQUFBO0FBQUEsRUFDckM7QUFBQSxFQUdBLFNBQVMsUUFBQSxFQUEyQjtBQUNsQyxJQUFBLElBQUEsQ0FBSyxJQUFBLEVBQU0sS0FBQSxHQUFRLEtBQUEsRUFBTyxHQUFHLFFBQVEsQ0FBQTtBQUFBLEVBQ3ZDO0FBQUEsRUFHQSxTQUFTLFFBQUEsRUFBMkI7QUFDbEMsSUFBQSxJQUFBLENBQUssSUFBQSxFQUFNLEtBQUEsR0FBUSxLQUFBLEVBQU8sR0FBRyxRQUFRLENBQUE7QUFDckMsSUFBQSxPQUFBLENBQVEsS0FBSyxDQUFDLENBQUE7QUFBQSxFQUNoQjtBQUFBLEVBRVEsU0FBUyxPQUFBLEVBQWlCO0FBQ2hDLElBQUEsSUFBSSxPQUFBLENBQVEsVUFBQSxDQUFXLEtBQUssQ0FBQSxFQUFHO0FBQzdCLE1BQUEsSUFBQSxDQUFLLE1BQU0sT0FBQSxDQUFRLEtBQUEsQ0FBTSxLQUFBLENBQU0sTUFBQSxHQUFTLENBQUMsQ0FBQyxDQUFBO0FBQUEsSUFDNUMsQ0FBQSxNQUFBLElBQVcsT0FBQSxDQUFRLFVBQUEsQ0FBVyxJQUFJLENBQUEsRUFBRztBQUNuQyxNQUFBLElBQUEsQ0FBSyxLQUFLLE9BQUEsQ0FBUSxLQUFBLENBQU0sSUFBQSxDQUFLLE1BQUEsR0FBUyxDQUFDLENBQUMsQ0FBQTtBQUFBLElBQzFDLENBQUEsTUFBQSxJQUFXLE9BQUEsQ0FBUSxVQUFBLENBQVcsSUFBSSxDQUFBLEVBQUc7QUFDbkMsTUFBQSxJQUFBLENBQUssS0FBSyxPQUFBLENBQVEsS0FBQSxDQUFNLElBQUEsQ0FBSyxNQUFBLEdBQVMsQ0FBQyxDQUFDLENBQUE7QUFBQSxJQUMxQyxDQUFBLE1BQUEsSUFBVyxPQUFBLENBQVEsVUFBQSxDQUFXLEtBQUssQ0FBQSxFQUFHO0FBQ3BDLE1BQUEsSUFBQSxDQUFLLE1BQU0sT0FBQSxDQUFRLEtBQUEsQ0FBTSxLQUFBLENBQU0sTUFBQSxHQUFTLENBQUMsQ0FBQyxDQUFBO0FBQUEsSUFDNUMsQ0FBQSxNQUFPO0FBQ0wsTUFBQSxJQUFBLENBQUssS0FBSyxPQUFPLENBQUE7QUFBQSxJQUNuQjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQUEsQ0FBTyxNQUFvQixJQUFBLEVBQWM7QUFDdkMsSUFBQSxPQUFPLElBQUksT0FBQSxDQUFjLENBQUMsT0FBQSxFQUFTLE1BQUEsS0FBVztBQUM1QyxNQUFBLElBQUEsQ0FBSyxLQUFBLENBQU0sQ0FBQSxFQUFHLElBQUksQ0FBQSxPQUFBLENBQVMsQ0FBQTtBQUMzQixNQUFBLElBQUksS0FBQSxHQUFnQixFQUFBO0FBQ3BCLE1BQUEsTUFBTSxRQUFBLEdBQVcsQ0FBQyxJQUFBLEtBQWdDO0FBQ2hELFFBQUEsTUFBTSxPQUFBLEdBQVUsS0FBSyxRQUFBLEVBQVM7QUFDOUIsUUFBQSxJQUFJLE9BQUEsQ0FBUSxVQUFBLENBQVcsS0FBSyxDQUFBLEVBQUc7QUFDN0IsVUFBQSxLQUFBLElBQVMsT0FBQSxDQUFRLEtBQUEsQ0FBTSxLQUFBLENBQU0sTUFBQSxHQUFTLENBQUMsQ0FBQTtBQUFBLFFBQ3pDLENBQUEsTUFBTztBQUNMLFVBQUEsSUFBQSxDQUFLLFNBQVMsT0FBTyxDQUFBO0FBQUEsUUFDdkI7QUFBQSxNQUNGLENBQUE7QUFDQSxNQUFBLElBQUEsQ0FBSyxNQUFBLEVBQVEsRUFBQSxDQUFHLE1BQUEsRUFBUSxRQUFRLENBQUE7QUFDaEMsTUFBQSxJQUFBLENBQUssTUFBQSxFQUFRLEVBQUEsQ0FBRyxNQUFBLEVBQVEsUUFBUSxDQUFBO0FBQ2hDLE1BQUEsSUFBQSxDQUNHLEdBQUcsU0FBQSxFQUFXLFFBQVEsRUFDdEIsRUFBQSxDQUFHLE9BQUEsRUFBUyxDQUFDLEdBQUEsS0FBUTtBQUNwQixRQUFBLEtBQUEsSUFBUyxHQUFBLENBQUksT0FBQTtBQUNiLFFBQUEsSUFBQSxDQUFLLElBQUEsRUFBSztBQUFBLE1BQ1osQ0FBQyxDQUFBLENBQ0EsSUFBQSxDQUFLLE9BQUEsRUFBUyxDQUFDLE1BQU0sTUFBQSxLQUFXO0FBQy9CLFFBQUEsSUFBSSxJQUFBLElBQVEsVUFBVSxLQUFBLEVBQU87QUFDM0IsVUFBQSxLQUFBLEtBQVUsQ0FBQSxnQkFBQSxFQUFtQixJQUFBLENBQUssU0FBQSxDQUFVLElBQUEsQ0FBSyxHQUFHLENBQUMsQ0FBQSxDQUFBO0FBQ3JELFVBQUEsSUFBQSxDQUFLLEtBQUEsQ0FBTSxHQUFHLElBQUksQ0FBQSxNQUFBLENBQUEsRUFBVSxFQUFFLElBQUEsRUFBTSxNQUFBLEVBQVEsT0FBTyxDQUFBO0FBQ25ELFVBQUEsTUFBQSxDQUFPLElBQUksS0FBQSxDQUFNLEtBQUssQ0FBQyxDQUFBO0FBQUEsUUFDekIsQ0FBQSxNQUFPO0FBQ0wsVUFBQSxJQUFBLENBQUssS0FBQSxDQUFNLENBQUEsRUFBRyxJQUFJLENBQUEsTUFBQSxDQUFRLENBQUE7QUFDMUIsVUFBQSxPQUFBLEVBQVE7QUFBQSxRQUNWO0FBQUEsTUFDRixDQUFDLENBQUEsQ0FDQSxFQUFBLENBQUcsb0JBQUEsRUFBc0IsQ0FBQyxNQUFBLEtBQVc7QUFDcEMsUUFBQSxJQUFBLENBQUssS0FBQSxDQUFNLENBQUEsRUFBRyxJQUFJLENBQUEsVUFBQSxDQUFBLEVBQWMsTUFBTSxDQUFBO0FBQUEsTUFDeEMsQ0FBQyxDQUFBLENBQ0EsRUFBQSxDQUFHLDBCQUFBLEVBQTRCLENBQUMsR0FBQSxLQUFRO0FBQ3ZDLFFBQUEsSUFBQSxDQUFLLEtBQUEsQ0FBTSxDQUFBLEVBQUcsSUFBSSxDQUFBLFVBQUEsQ0FBQSxFQUFjLEdBQUcsQ0FBQTtBQUFBLE1BQ3JDLENBQUMsQ0FBQTtBQUFBLElBQ0wsQ0FBQyxDQUFBO0FBQUEsRUFDSDtBQUNGLENBQUE7QUFoSE8sS0FBQSxHQUFBLGdCQUFBLENBQUEsQ0FBQTtBQW1DTCxpQkFBQSxDQUFBLEtBQUEsRUFBQSxDQUFBLEVBQUEsT0FBQSxFQURBLFVBQUEsRUFsQ1csTUFBQSxDQUFBO0FBd0NYLGlCQUFBLENBQUEsS0FBQSxFQUFBLENBQUEsRUFBQSxNQUFBLEVBREEsU0FBQSxFQXZDVyxNQUFBLENBQUE7QUE2Q1gsaUJBQUEsQ0FBQSxLQUFBLEVBQUEsQ0FBQSxFQUFBLE1BQUEsRUFEQSxTQUFBLEVBNUNXLE1BQUEsQ0FBQTtBQWtEWCxpQkFBQSxDQUFBLEtBQUEsRUFBQSxDQUFBLEVBQUEsT0FBQSxFQURBLFVBQUEsRUFqRFcsTUFBQSxDQUFBO0FBdURYLGlCQUFBLENBQUEsS0FBQSxFQUFBLENBQUEsRUFBQSxPQUFBLEVBREEsVUFBQSxFQXREVyxNQUFBLENBQUE7QUFBTixtQkFBQSxDQUFBLEtBQUEsRUFBTSxNQUFBLENBQUE7QUFrSGIsSUFBTSxNQUFBLEdBQVMsSUFBSSxNQUFBLEVBQU87OztBQzlJbkIsU0FBUyxLQUFBLENBQ2QsSUFDQSxZQUFBLEVBQ2lEO0FBQ2pELEVBQUEsT0FBTyxJQUFJLElBQUEsS0FBUztBQUNsQixJQUFBLElBQUk7QUFDRixNQUFBLE1BQU0sR0FBQSxHQUFNLEVBQUEsQ0FBRyxHQUFHLElBQUksQ0FBQTtBQUN0QixNQUFBLElBQUksZUFBZSxPQUFBLEVBQVM7QUFDMUIsUUFBQSxPQUFPLEdBQUEsQ0FBSSxLQUFBLENBQU0sTUFBTSxZQUFZLENBQUE7QUFBQSxNQUNyQztBQUNBLE1BQUEsT0FBTyxHQUFBO0FBQUEsSUFDVCxDQUFBLENBQUEsTUFBUTtBQUNOLE1BQUEsT0FBTyxZQUFBO0FBQUEsSUFDVDtBQUFBLEVBQ0YsQ0FBQTtBQUNGOzs7QUNaTyxJQUFNLFlBQUEsR0FBZSxpQkFBQTtBQUVyQixTQUFTLEtBQUEsR0FBUTtBQUN0QixFQUFBLE1BQU0sT0FBTyxPQUFBLENBQVEsSUFBQTtBQUNyQixFQUFBLElBQUksSUFBQSxHQUFPLEtBQUssSUFBQSxDQUFLLENBQUMsUUFBUSxHQUFBLENBQUksVUFBQSxDQUFXLFlBQVksQ0FBQyxDQUFBO0FBQzFELEVBQUEsSUFBSSxDQUFDLElBQUEsRUFBTTtBQUNULElBQUEsTUFBQSxDQUFPLEtBQUEsQ0FBTSxZQUFZLElBQUksQ0FBQTtBQUM3QixJQUFBLE9BQU8sT0FBQSxDQUFRLElBQUE7QUFBQSxFQUNqQjtBQUNBLEVBQUEsTUFBTSxPQUFPLENBQUMsTUFBQSxFQUFRLEdBQUcsSUFBQSxDQUFLLEtBQUEsQ0FBTSxFQUFFLENBQUMsQ0FBQTtBQUN2QyxFQUFBLElBQUEsR0FBTyxNQUFBLENBQU8sSUFBQSxDQUFLLElBQUEsQ0FBSyxLQUFBLENBQU0sR0FBRyxFQUFFLENBQUMsQ0FBQSxFQUFJLFFBQVEsQ0FBQSxDQUFFLFFBQUEsRUFBUztBQUMzRCxFQUFBLElBQUEsQ0FBSyxJQUFBLENBQUssR0FBRyxJQUFBLENBQUssS0FBQSxDQUFNLElBQUksQ0FBQyxDQUFBO0FBQzdCLEVBQUEsTUFBQSxDQUFPLEtBQUEsQ0FBTSxXQUFXLElBQUksQ0FBQTtBQUM1QixFQUFBLE9BQU8sSUFBQTtBQUNUO0FDVE8sSUFBTSxhQUFBLEdBQWdCLElBQUE7QUFDdEIsSUFBTSxjQUFBLEdBQWlCLElBQUE7QUFDdkIsSUFBTSxXQUFBLEdBQWMsRUFBQTtBQUNwQixJQUFNLGdCQUFBLEdBQW1CLENBQUE7QUFDekIsSUFBTSxlQUFBLEdBQWtCLEtBQUE7QUFDeEIsSUFBTSxhQUFBLEdBQWdCLENBQUMsS0FBQSxFQUFPLE1BQU0sQ0FBQTtBQUlwQyxTQUFTLGNBQWMsQ0FBQSxFQUE2QjtBQUN6RCxFQUFBLE9BQU8sYUFBQSxDQUFjLFNBQVMsQ0FBZ0IsQ0FBQTtBQUNoRDtBQUVPLElBQU0sWUFBQSxHQUFlQyxtQkFBRSxNQUFBLENBQU87QUFBQSxFQUNuQyxRQUFBLEVBQVVBLGtCQUFBLENBQUUsTUFBQSxFQUFPLENBQUUsUUFBQSxHQUFXLE9BQUEsQ0FBUSxnQkFBZ0IsQ0FBQSxDQUFFLFFBQUEsQ0FBUyxxQkFBcUIsQ0FBQTtBQUFBLEVBQ3hGLEtBQUEsRUFBT0Esa0JBQUEsQ0FBRSxNQUFBLEVBQU8sQ0FBRSxRQUFBLEdBQVcsT0FBQSxDQUFRLGFBQWEsQ0FBQSxDQUFFLFFBQUEsQ0FBUyxhQUFhLENBQUE7QUFBQSxFQUMxRSxNQUFBLEVBQVFBLGtCQUFBLENBQUUsTUFBQSxFQUFPLENBQUUsUUFBQSxHQUFXLE9BQUEsQ0FBUSxjQUFjLENBQUEsQ0FBRSxRQUFBLENBQVMsY0FBYyxDQUFBO0FBQUEsRUFDN0UsR0FBQSxFQUFLQSxrQkFBQSxDQUFFLE1BQUEsRUFBTyxDQUFFLFFBQUEsR0FBVyxPQUFBLENBQVEsV0FBVyxDQUFBLENBQUUsUUFBQSxDQUFTLG1CQUFtQixDQUFBO0FBQUEsRUFDNUUsT0FBQSxFQUFTQSxtQkFDTixLQUFBLENBQU1BLGtCQUFBLENBQUUsS0FBSyxhQUFhLENBQUMsRUFDM0IsUUFBQSxFQUFTLENBQ1QsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBLENBQ2YsUUFBQSxDQUFTLCtCQUErQixhQUFBLENBQWMsSUFBQSxDQUFLLElBQUksQ0FBQyxDQUFBLENBQUUsQ0FBQTtBQUFBLEVBQ3JFLFNBQUEsRUFBV0Esa0JBQUEsQ0FBRSxPQUFBLEVBQVEsQ0FBRSxRQUFBLEdBQVcsT0FBQSxDQUFRLEtBQUssQ0FBQSxDQUFFLFFBQUEsQ0FBUywwQkFBMEIsQ0FBQTtBQUFBLEVBQ3BGLE1BQUEsRUFBUUEsa0JBQUEsQ0FBRSxNQUFBLEVBQU8sQ0FBRSxRQUFBLEdBQVcsT0FBQSxDQUFRLGVBQWUsQ0FBQSxDQUFFLFFBQUEsQ0FBUyxrQkFBa0IsQ0FBQTtBQUFBLEVBQ2xGLGFBQUEsRUFBZUEsa0JBQUEsQ0FBRSxPQUFBLEVBQVEsQ0FBRSxRQUFBLEdBQVcsT0FBQSxDQUFRLEtBQUssQ0FBQSxDQUFFLFFBQUEsQ0FBUyw4Q0FBOEMsQ0FBQTtBQUFBLEVBQzVHLGFBQUEsRUFBZUEsa0JBQUEsQ0FBRSxPQUFBLEVBQVEsQ0FBRSxRQUFBLEdBQVcsT0FBQSxDQUFRLEtBQUssQ0FBQSxDQUFFLFFBQUEsQ0FBUyx1Q0FBdUM7QUFDdkcsQ0FBQyxDQUFBOzs7QUNoQkQsZUFBc0IsT0FBQSxDQUFRLE1BQWMsUUFBQSxFQUF1QjtBQUNqRSxFQUFBLE1BQU0sUUFBUSxZQUFBLENBQWEsS0FBQTtBQUMzQixFQUFBQyxpQkFBQSxDQUNHLEtBQUssSUFBSSxDQUFBLENBQ1QsUUFBQSxDQUFTLFVBQUEsRUFBWSx1Q0FBa0MsQ0FBQSxDQUN2RCxNQUFBLENBQU8sc0JBQUEsRUFBd0IsS0FBQSxDQUFNLE1BQU0sV0FBQSxFQUFhLENBQUEsRUFBRyxhQUFhLENBQUEsQ0FBRSxDQUFBLENBQzFFLE9BQU8sdUJBQUEsRUFBeUIsS0FBQSxDQUFNLE1BQUEsQ0FBTyxXQUFBLEVBQWEsR0FBRyxjQUFjLENBQUEsQ0FBRSxFQUM3RSxNQUFBLENBQU8sb0JBQUEsRUFBc0IsTUFBTSxHQUFBLENBQUksV0FBQSxFQUFhLENBQUEsRUFBRyxXQUFXLEVBQUUsQ0FBQSxDQUNwRSxNQUFBLENBQU8sMkJBQTJCLEtBQUEsQ0FBTSxRQUFBLENBQVMsYUFBYSxDQUFBLEVBQUcsZ0JBQWdCLENBQUEsQ0FBRSxDQUFBLENBQ25GLE9BQU8sc0JBQUEsRUFBd0IsS0FBQSxDQUFNLE9BQU8sV0FBQSxFQUFhLENBQUEsRUFBRyxlQUFlLENBQUEsQ0FBRSxDQUFBLENBQzdFLE1BQUEsQ0FBTyx5QkFBQSxFQUEyQixNQUFNLE9BQUEsQ0FBUSxXQUFBLEVBQWEsS0FBSyxDQUFBLENBQ2xFLE1BQUEsQ0FBTyxvQkFBb0IsS0FBQSxDQUFNLFNBQUEsQ0FBVSxXQUFBLEVBQWEsS0FBSyxFQUM3RCxNQUFBLENBQU8sbUJBQUEsRUFBcUIsTUFBTSxhQUFBLENBQWMsV0FBQSxFQUFhLGdCQUFnQixDQUFBLENBQzdFLE1BQUEsQ0FBTyxxQkFBQSxFQUF1QixLQUFBLENBQU0sY0FBYyxXQUFBLEVBQWEsS0FBSyxFQUNwRSxNQUFBLENBQU8sT0FBTyxRQUFnQixJQUFBLEtBQVM7QUFDdEMsSUFBQSxJQUFJO0FBQ0YsTUFBQSxNQUFNLFNBQVMsTUFBQSxFQUFRO0FBQUEsUUFDckIsT0FBTyxLQUFBLENBQU0sV0FBQSxFQUFhLGFBQWEsQ0FBQSxDQUFFLEtBQUssS0FBSyxDQUFBO0FBQUEsUUFDbkQsUUFBUSxLQUFBLENBQU0sV0FBQSxFQUFhLGNBQWMsQ0FBQSxDQUFFLEtBQUssTUFBTSxDQUFBO0FBQUEsUUFDdEQsS0FBSyxLQUFBLENBQU0sV0FBQSxFQUFhLFdBQVcsQ0FBQSxDQUFFLEtBQUssR0FBRyxDQUFBO0FBQUEsUUFDN0MsVUFBVSxLQUFBLENBQU0sV0FBQSxFQUFhLGdCQUFnQixDQUFBLENBQUUsS0FBSyxRQUFRLENBQUE7QUFBQSxRQUM1RCxNQUFBLEVBQVEsS0FBSyxNQUFBLElBQVUsZUFBQTtBQUFBLFFBQ3ZCLFNBQVMsV0FBQSxDQUFZLElBQUEsQ0FBSyxPQUFPLENBQUEsQ0FDOUIsTUFBTSxHQUFHLENBQUEsQ0FDVCxHQUFBLENBQUksQ0FBQyxNQUFNLENBQUEsQ0FBRSxJQUFBLEVBQU0sQ0FBQSxDQUNuQixPQUFPLGFBQWEsQ0FBQTtBQUFBLFFBQ3ZCLFNBQUEsRUFBVyxLQUFLLFNBQUEsSUFBYSxLQUFBO0FBQUEsUUFDN0IsYUFBQSxFQUFlLEtBQUssYUFBQSxJQUFpQixnQkFBQTtBQUFBLFFBQ3JDLGFBQUEsRUFBZSxLQUFLLGFBQUEsSUFBaUI7QUFBQSxPQUN0QyxDQUFBO0FBQUEsSUFDSCxTQUFTLENBQUEsRUFBRztBQUNWLE1BQUEsTUFBQSxDQUFPLE1BQU0sQ0FBQyxDQUFBO0FBQUEsSUFDaEI7QUFBQSxFQUNGLENBQUMsQ0FBQTtBQUNILEVBQUEsTUFBTUEsaUJBQUEsQ0FBUSxVQUFBLENBQVcsS0FBQSxFQUFPLENBQUE7QUFDbEM7OztBQ3RETyxJQUFNLHFCQUFOLE1BQXlCO0FBQUEsRUFLOUIsWUFBcUIsY0FBQSxFQUF3QjtBQUF4QixJQUFBLElBQUEsQ0FBQSxjQUFBLEdBQUEsY0FBQTtBQUFBLEVBQXlCO0FBQUEsRUFKdEMsT0FBQSxHQUFVLENBQUE7QUFBQSxFQUNWLFNBQXlCLEVBQUM7QUFBQSxFQUMxQixNQUFBLEdBQVMsS0FBQTtBQUFBLEVBSWpCLElBQUksTUFBQSxHQUFpQjtBQUNuQixJQUFBLE9BQU8sSUFBQSxDQUFLLE9BQUE7QUFBQSxFQUNkO0FBQUEsRUFFQSxJQUFJLE9BQUEsR0FBa0I7QUFDcEIsSUFBQSxPQUFPLEtBQUssTUFBQSxDQUFPLE1BQUE7QUFBQSxFQUNyQjtBQUFBLEVBRUEsSUFBSSxLQUFBLEdBQWdCO0FBQ2xCLElBQUEsT0FBTyxDQUFBLFFBQUEsRUFBVyxJQUFBLENBQUssTUFBTSxDQUFBLFdBQUEsRUFBYyxLQUFLLE9BQU8sQ0FBQSxDQUFBO0FBQUEsRUFDekQ7QUFBQSxFQUVBLE1BQU0sU0FBWSxFQUFBLEVBQWtDO0FBQ2xELElBQUEsSUFBSSxLQUFLLE1BQUEsRUFBUTtBQUNmLE1BQUEsTUFBTSxJQUFJLE1BQU0sT0FBTyxDQUFBO0FBQUEsSUFDekI7QUFDQSxJQUFBLE9BQU8sSUFBSSxPQUFBLENBQVcsQ0FBQyxPQUFBLEVBQVMsTUFBQSxLQUFXO0FBQ3pDLE1BQUEsTUFBTSxNQUFNLE1BQU07QUFDaEIsUUFBQSxJQUFBLENBQUssT0FBQSxFQUFBO0FBQ0wsUUFBQSxFQUFBLEVBQUcsQ0FDQSxJQUFBLENBQUssQ0FBQyxDQUFBLEtBQU07QUFDWCxVQUFBLElBQUEsQ0FBSyxPQUFBLEVBQUE7QUFDTCxVQUFBLE9BQUEsQ0FBUSxDQUFDLENBQUE7QUFDVCxVQUFBLElBQUEsQ0FBSyxJQUFBLEVBQUs7QUFBQSxRQUNaLENBQUMsQ0FBQSxDQUNBLEtBQUEsQ0FBTSxDQUFDLENBQUEsS0FBTTtBQUNaLFVBQUEsSUFBQSxDQUFLLE9BQUEsRUFBQTtBQUNMLFVBQUEsTUFBQSxDQUFPLENBQUMsQ0FBQTtBQUNSLFVBQUEsSUFBQSxDQUFLLElBQUEsRUFBSztBQUFBLFFBQ1osQ0FBQyxDQUFBO0FBQUEsTUFDTCxDQUFBO0FBQ0EsTUFBQSxJQUFBLENBQUssTUFBQSxDQUFPLEtBQUssR0FBRyxDQUFBO0FBQ3BCLE1BQUEsSUFBQSxDQUFLLElBQUEsRUFBSztBQUFBLElBQ1osQ0FBQyxDQUFBO0FBQUEsRUFDSDtBQUFBLEVBRUEsTUFBTSxHQUFBLEdBQU07QUFDVixJQUFBLElBQUksS0FBSyxNQUFBLEVBQVE7QUFDZixNQUFBO0FBQUEsSUFDRjtBQUNBLElBQUEsSUFBQSxDQUFLLE1BQUEsR0FBUyxJQUFBO0FBQ2QsSUFBQSxPQUFPLElBQUEsQ0FBSyxPQUFBLEdBQVUsQ0FBQSxJQUFLLElBQUEsQ0FBSyxVQUFVLENBQUEsRUFBRztBQUMzQyxNQUFBLE1BQU0sSUFBSSxPQUFBLENBQVEsQ0FBQyxNQUFNLFVBQUEsQ0FBVyxDQUFBLEVBQUcsRUFBRSxDQUFDLENBQUE7QUFBQSxJQUM1QztBQUFBLEVBQ0Y7QUFBQSxFQUVRLElBQUEsR0FBTztBQUNiLElBQUEsSUFBSSxJQUFBLENBQUssT0FBQSxHQUFVLElBQUEsQ0FBSyxjQUFBLEVBQWdCO0FBQ3RDLE1BQUEsSUFBQSxDQUFLLE1BQUEsQ0FBTyxPQUFNLElBQUk7QUFBQSxJQUN4QjtBQUFBLEVBQ0Y7QUFDRixDQUFBO0FDbkNBLElBQU0sZUFBQSxHQUEwQztBQUFBLEVBQzlDLENBQUNDLDJCQUFpQixHQUFHLEtBQUE7QUFBQSxFQUNyQixDQUFDQyw0QkFBa0IsR0FBRztBQUN4QixDQUFBO0FBYU8sSUFBTSxZQUFBLEdBQU4sTUFBTSxhQUFBLENBQW1DO0FBQUEsRUFDN0IsSUFBQTtBQUFBLEVBQ0EsT0FBQTtBQUFBLEVBQ0EsUUFBQTtBQUFBLEVBQ0EsT0FBQTtBQUFBLEVBQ0EsVUFBQTtBQUFBLEVBQ0EsSUFBQTtBQUFBLEVBQ0EsWUFBQTtBQUFBLEVBRVQsTUFBQTtBQUFBLEVBQ0EsT0FBQTtBQUFBLEVBQ0EsUUFBQTtBQUFBLEVBQ0EsT0FBQTtBQUFBLEVBQ1IsR0FBQSxHQUFNLEVBQUE7QUFBQSxFQUVFLFdBQUEsQ0FBWSxHQUFBLEVBQW1CLE1BQUEsRUFBZ0IsTUFBQSxFQUE4RDtBQUNuSCxJQUFBLElBQUEsQ0FBSyxJQUFBLEdBQU8sR0FBQTtBQUNaLElBQUEsSUFBQSxDQUFLLE9BQUEsR0FBVSxNQUFBO0FBQ2YsSUFBQSxJQUFBLENBQUssV0FBVyxHQUFBLENBQUksVUFBQTtBQUNwQixJQUFBLElBQUEsQ0FBSyxPQUFBLEdBQVUsTUFBQTtBQUNmLElBQUEsSUFBQSxDQUFLLGFBQWEsR0FBQSxDQUFJLFNBQUE7QUFFdEIsSUFBQSxJQUFBLENBQUssSUFBQSxHQUFPLElBQUlDLGFBQUEsRUFBTztBQUN2QixJQUFBLElBQUEsQ0FBSyxLQUFLLEtBQUEsRUFBTTtBQUVoQixJQUFBLElBQUEsQ0FBSyxZQUFBLEdBQWUsSUFBSUMsWUFBQSxFQUFNO0FBQzlCLElBQUEsSUFBQSxDQUFLLGFBQWEsS0FBQSxFQUFNO0FBQUEsRUFDMUI7QUFBQSxFQUVBLGFBQWEsT0FBTyxJQUFBLEVBQWtEO0FBQ3BFLElBQUEsTUFBTSxFQUFFLGFBQUEsRUFBZSxZQUFBLEVBQWMsV0FBVyxZQUFBLEVBQWMsT0FBQSxFQUFTLE9BQU0sR0FBSSxJQUFBO0FBRWpGLElBQUEsTUFBTSxLQUFBLEdBQVFDLFlBQUEsQ0FBTSxpQkFBQSxDQUFrQixTQUFTLENBQUE7QUFDL0MsSUFBQSxJQUFJLENBQUMsS0FBQSxFQUFPLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBQSx5QkFBQSxFQUE0QixTQUFTLENBQUEsQ0FBRSxDQUFBO0FBRW5FLElBQUEsTUFBTSxHQUFBLEdBQU0sSUFBSUMsbUJBQUEsRUFBYTtBQUM3QixJQUFBLEdBQUEsQ0FBSSxjQUFjLEtBQUssQ0FBQTtBQUN2QixJQUFBLEdBQUEsQ0FBSSxVQUFVLEtBQUEsQ0FBTSxFQUFBO0FBQ3BCLElBQUEsR0FBQSxDQUFJLFlBQUEsR0FBZSxZQUFBO0FBQ25CLElBQUEsR0FBQSxDQUFJLFVBQUEsR0FBYSxhQUFBO0FBQ2pCLElBQUEsR0FBQSxDQUFJLGFBQUEsR0FBZ0JDLGtDQUFBO0FBQ3BCLElBQUEsR0FBQSxDQUFJLFFBQUEsR0FBVyxJQUFJQyxlQUFBLENBQVMsQ0FBQSxFQUFHLGFBQWEsQ0FBQTtBQUM1QyxJQUFBLEdBQUEsQ0FBSSxPQUFBLEdBQVUsT0FBTyxPQUFPLENBQUE7QUFDNUIsSUFBQSxJQUFJLFlBQUEsRUFBYyxHQUFBLENBQUksUUFBQSxDQUFTQyxxQ0FBMkIsQ0FBQTtBQUMxRCxJQUFBQyxrQkFBQSxDQUFZLGFBQWEsTUFBTSxHQUFBLENBQUksTUFBTSxLQUFBLEVBQU8sSUFBSSxHQUFHLGdCQUFnQixDQUFBO0FBRXZFLElBQUEsTUFBTSxNQUFBLEdBQVMsS0FBQSxDQUFNLFNBQUEsQ0FBVSxHQUFHLENBQUE7QUFDbEMsSUFBQSxPQUFPLElBQUksYUFBQSxDQUFhLEdBQUEsRUFBSyxNQUFBLEVBQVEsWUFBWSxDQUFBO0FBQUEsRUFDbkQ7QUFBQTtBQUFBLEVBR0EsYUFBYSxZQUFBLEVBQTRCO0FBQ3ZDLElBQUEsSUFBQSxDQUFLLGFBQUEsRUFBYztBQUNuQixJQUFBLElBQUEsQ0FBSyxPQUFBLEdBQVUsWUFBQTtBQUVmLElBQUEsTUFBTSxLQUFBLEdBQVEsSUFBSUMsa0JBQUEsRUFBWTtBQUM5QixJQUFBLEtBQUEsQ0FBTSxLQUFBLEVBQU07QUFHWixJQUFBLE1BQU0sT0FBQSxHQUFVQyxhQUFBLENBQU8sU0FBQSxDQUFVLFNBQVMsQ0FBQTtBQUMxQyxJQUFBLE1BQU0sT0FBQSxHQUFVLENBQUEsWUFBQSxFQUFlLFlBQVksQ0FBQSxrREFBQSxFQUFxRCxZQUFZLENBQUEsQ0FBQTtBQUM1RyxJQUFBLE1BQU0sTUFBQSxHQUFTLEtBQUEsQ0FBTSxZQUFBLENBQWEsT0FBQSxFQUFTLE9BQU8sT0FBTyxDQUFBO0FBQ3pELElBQUEsSUFBSSxDQUFDLE1BQUEsRUFBUSxNQUFNLElBQUksTUFBTSwwQkFBMEIsQ0FBQTtBQUd2RCxJQUFBLE1BQU0sV0FBQSxHQUFjQSxhQUFBLENBQU8sU0FBQSxDQUFVLGFBQWEsQ0FBQTtBQUNsRCxJQUFBLE1BQU0sT0FBQSxHQUFVLEtBQUEsQ0FBTSxZQUFBLENBQWEsV0FBQSxFQUFhLE1BQU0sQ0FBQTtBQUN0RCxJQUFBLElBQUksQ0FBQyxPQUFBLEVBQVMsTUFBTSxJQUFJLE1BQU0sOEJBQThCLENBQUE7QUFHNUQsSUFBQSxNQUFNLE9BQUEsR0FBVSxlQUFBLENBQWdCLElBQUEsQ0FBSyxPQUFPLENBQUEsSUFBSyxLQUFBO0FBQ2pELElBQUEsTUFBTSxVQUFBLEdBQWEsdUJBQXVCLE9BQU8sQ0FBQSxjQUFBLEVBQWlCLEtBQUssUUFBUSxDQUFBLHVDQUFBLEVBQTBDLEtBQUssVUFBVSxDQUFBLElBQUEsQ0FBQTtBQUV4SSxJQUFBLE1BQU0sT0FBQSxHQUFVQyxrQkFBQSxDQUFZLFVBQUEsQ0FBVyxDQUFDLEVBQUUsSUFBQSxFQUFNLElBQUEsRUFBTSxTQUFBLEVBQVcsTUFBQSxFQUFRLE1BQUEsRUFBUSxDQUFBLEVBQUcsQ0FBQyxDQUFBO0FBQ3JGLElBQUEsTUFBTSxNQUFBLEdBQVNBLGtCQUFBLENBQVksVUFBQSxDQUFXLENBQUMsRUFBRSxJQUFBLEVBQU0sS0FBQSxFQUFPLFNBQUEsRUFBVyxPQUFBLEVBQVMsTUFBQSxFQUFRLENBQUEsRUFBRyxDQUFDLENBQUE7QUFDdEYsSUFBQUgsa0JBQUEsQ0FBWSxhQUFhLEtBQUEsQ0FBTSxRQUFBLENBQVMsWUFBWSxNQUFBLEVBQVEsT0FBTyxHQUFHLGdCQUFnQixDQUFBO0FBQ3RGLElBQUFBLGtCQUFBLENBQVksWUFBQSxDQUFhLEtBQUEsQ0FBTSxVQUFBLEVBQVcsRUFBRyxjQUFjLENBQUE7QUFFM0QsSUFBQSxJQUFBLENBQUssTUFBQSxHQUFTLEtBQUE7QUFDZCxJQUFBLElBQUEsQ0FBSyxPQUFBLEdBQVUsTUFBQTtBQUNmLElBQUEsSUFBQSxDQUFLLFFBQUEsR0FBVyxPQUFBO0FBQUEsRUFDbEI7QUFBQSxFQUVBLElBQUksTUFBQSxHQUFTO0FBQ1gsSUFBQSxPQUFPLElBQUEsQ0FBSyxPQUFBO0FBQUEsRUFDZDtBQUFBLEVBQ0EsSUFBSSxRQUFBLEdBQVc7QUFDYixJQUFBLE9BQU8sS0FBSyxJQUFBLENBQUssUUFBQTtBQUFBLEVBQ25CO0FBQUEsRUFFQSxNQUFNLE1BQUEsQ0FBTyxHQUFBLEVBQWEsS0FBQSxFQUFtQztBQVUzRCxJQUFBLElBQUEsTUFBQSxHQUFBLEVBQUE7QUFBQSxJQUFBLElBQUE7QUFUQSxNQUFBLElBQUksQ0FBQyxLQUFLLE9BQUEsSUFBVyxDQUFDLEtBQUssUUFBQSxJQUFZLENBQUMsS0FBSyxPQUFBLEVBQVM7QUFHdEQsTUFBQSxNQUFNLEdBQUEsR0FBTSxJQUFJLFlBQUEsQ0FBYSxHQUFBLENBQUksUUFBUSxHQUFBLENBQUksVUFBQSxFQUFZLEdBQUEsQ0FBSSxVQUFBLEdBQWEsQ0FBQyxDQUFBO0FBQzNFLE1BQUEsS0FBQSxJQUFTLENBQUEsR0FBSSxDQUFBLEVBQUcsQ0FBQSxHQUFJLEdBQUEsQ0FBSSxRQUFRLENBQUEsRUFBQSxFQUFLO0FBQ25DLFFBQUEsSUFBSSxDQUFDLFNBQVMsR0FBQSxDQUFJLENBQUMsQ0FBRSxDQUFBLEVBQUcsR0FBQSxDQUFJLENBQUMsQ0FBQSxHQUFJLENBQUE7QUFBQSxNQUNuQztBQUNBLE1BQUEsTUFBTSxRQUFBLEdBQVcsSUFBSSxNQUFBLElBQVUsQ0FBQTtBQUUvQixNQUFBLE1BQU0sS0FBQSxHQUFRLE9BQUEsQ0FBQSxNQUFBLEVBQUFOLFlBQUEsQ0FBTSxlQUFBLENBQWdCLE1BQUEsQ0FBTyxJQUFBLENBQUssR0FBQSxDQUFJLE1BQUEsRUFBUSxHQUFBLENBQUksVUFBQSxFQUFZLEdBQUEsQ0FBSSxVQUFVLENBQUEsRUFBRztBQUFBLFFBQzNGLFNBQUEsRUFBVyxRQUFBO0FBQUEsUUFDWCxNQUFBLEVBQVFILDJCQUFBO0FBQUEsUUFDUixZQUFZLElBQUEsQ0FBSyxPQUFBO0FBQUEsUUFDakIsYUFBQSxFQUFlTSxrQ0FBQTtBQUFBLFFBQ2YsS0FBSyxJQUFBLENBQUssR0FBQTtBQUFBLFFBQ1YsVUFBVSxFQUFFLEdBQUEsRUFBSyxDQUFBLEVBQUcsR0FBQSxFQUFLLEtBQUssT0FBQTtBQUFRLE9BQ3ZDLENBQUEsQ0FBQTtBQUNELE1BQUEsSUFBQSxDQUFLLEdBQUEsSUFBTyxPQUFPLFFBQVEsQ0FBQTtBQUUzQixNQUFBRyxrQkFBQSxDQUFZLGFBQWEsTUFBTSxJQUFBLENBQUssUUFBUSxpQkFBQSxDQUFrQixLQUFLLEdBQUcsbUJBQW1CLENBQUE7QUFDekYsTUFBQSxNQUFNLElBQUEsQ0FBSyxhQUFhLEtBQUssQ0FBQTtBQUFBLElBQUEsQ0FBQSxDQUFBLE9BWDdCLENBQUEsRUFBQTtBQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsQ0FBQSxFQUFBLFNBQUEsR0FBQSxJQUFBO0FBQUEsSUFBQSxDQUFBLFNBQUE7QUFBQSxNQUFBLGFBQUEsQ0FBQSxNQUFBLEVBQUEsTUFBQSxFQUFBLFNBQUEsQ0FBQTtBQUFBLElBQUE7QUFBQSxFQVlGO0FBQUEsRUFFQSxNQUFNLE1BQU0sS0FBQSxFQUFtQztBQUM3QyxJQUFBLElBQUksSUFBQSxDQUFLLE9BQUEsSUFBVyxJQUFBLENBQUssUUFBQSxFQUFVO0FBRWpDLE1BQUEsTUFBTSxJQUFBLENBQUssT0FBQSxDQUFRLGlCQUFBLENBQWtCLElBQUksQ0FBQTtBQUN6QyxNQUFBLE1BQU0sSUFBQSxDQUFLLGFBQWEsS0FBSyxDQUFBO0FBQUEsSUFDL0I7QUFFQSxJQUFBLE1BQU0sSUFBQSxDQUFLLElBQUEsQ0FBSyxTQUFBLENBQVUsSUFBSSxDQUFBO0FBQzlCLElBQUEsTUFBTSxJQUFBLENBQUssWUFBWSxLQUFLLENBQUE7QUFBQSxFQUM5QjtBQUFBLEVBRUEsQ0FBQyxNQUFBLENBQU8sT0FBTyxDQUFBLEdBQVU7QUFDdkIsSUFBQSxJQUFBLENBQUssS0FBSyxJQUFBLEVBQUs7QUFDZixJQUFBLElBQUEsQ0FBSyxhQUFhLElBQUEsRUFBSztBQUN2QixJQUFBLElBQUEsQ0FBSyxhQUFBLEVBQWM7QUFDbkIsSUFBQSxJQUFBLENBQUssS0FBSyxXQUFBLEVBQVk7QUFBQSxFQUN4QjtBQUFBO0FBQUEsRUFHQSxNQUFjLGFBQWEsS0FBQSxFQUFtQztBQUM1RCxJQUFBLE1BQU0sV0FBVyxJQUFBLENBQUssWUFBQTtBQUN0QixJQUFBLE9BQU8sSUFBQSxFQUFNO0FBQ1gsTUFBQSxNQUFNLENBQUEsR0FBSSxNQUFNLElBQUEsQ0FBSyxRQUFBLENBQVUsbUJBQW1CLFFBQVEsQ0FBQTtBQUMxRCxNQUFBLElBQUksQ0FBQSxLQUFNSSx3QkFBQSxJQUFrQixDQUFBLEtBQU1DLHFCQUFBLEVBQWE7QUFDL0MsTUFBQUwsa0JBQUEsQ0FBWSxZQUFBLENBQWEsR0FBRyxvQkFBb0IsQ0FBQTtBQUNoRCxNQUFBQSxrQkFBQSxDQUFZLGFBQWEsTUFBTSxJQUFBLENBQUssS0FBSyxTQUFBLENBQVUsUUFBUSxHQUFHLG9CQUFvQixDQUFBO0FBQ2xGLE1BQUEsUUFBQSxDQUFTLEtBQUEsRUFBTTtBQUNmLE1BQUEsTUFBTSxJQUFBLENBQUssWUFBWSxLQUFLLENBQUE7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFBQTtBQUFBLEVBR0EsTUFBYyxZQUFZLEtBQUEsRUFBbUM7QUFDM0QsSUFBQSxNQUFNLE1BQU0sSUFBQSxDQUFLLElBQUE7QUFDakIsSUFBQSxPQUFPLElBQUEsRUFBTTtBQUNYLE1BQUEsTUFBTSxDQUFBLEdBQUksTUFBTSxJQUFBLENBQUssSUFBQSxDQUFLLGNBQWMsR0FBRyxDQUFBO0FBQzNDLE1BQUEsSUFBSSxDQUFBLEtBQU1JLHdCQUFBLElBQWtCLENBQUEsS0FBTUMscUJBQUEsRUFBYTtBQUMvQyxNQUFBTCxrQkFBQSxDQUFZLFlBQUEsQ0FBYSxHQUFHLHFCQUFxQixDQUFBO0FBQ2pELE1BQUEsR0FBQSxDQUFJLFdBQUEsR0FBYyxLQUFLLE9BQUEsQ0FBUSxLQUFBO0FBQy9CLE1BQUEsR0FBQSxDQUFJLFVBQVUsSUFBQSxDQUFLLElBQUEsQ0FBSyxRQUFBLEVBQVUsSUFBQSxDQUFLLFFBQVEsUUFBUSxDQUFBO0FBQ3ZELE1BQUEsTUFBTSxLQUFBLENBQU0sWUFBWSxHQUFHLENBQUE7QUFDM0IsTUFBQSxHQUFBLENBQUksS0FBQSxFQUFNO0FBQUEsSUFDWjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGFBQUEsR0FBc0I7QUFFNUIsSUFBQSxJQUFBLENBQUssTUFBQSxHQUFTLE1BQUEsQ0FBTyxPQUFPLENBQUEsRUFBRTtBQUM5QixJQUFBLElBQUEsQ0FBSyxNQUFBLEdBQVMsTUFBQTtBQUNkLElBQUEsSUFBQSxDQUFLLE9BQUEsR0FBVSxNQUFBO0FBQ2YsSUFBQSxJQUFBLENBQUssUUFBQSxHQUFXLE1BQUE7QUFBQSxFQUNsQjtBQUNGLENBQUE7QUM3TU8sSUFBTSxjQUFOLE1BQWtCO0FBQUEsRUFDTixJQUFBO0FBQUEsRUFDVCxPQUFBLEdBQVUsS0FBQTtBQUFBLEVBRWxCLFlBQVksT0FBQSxFQUFpQjtBQUMzQixJQUFBLElBQUEsQ0FBSyxJQUFBLEdBQU8sSUFBSU0sb0JBQUEsRUFBYztBQUM5QixJQUFBTixrQkFBQUEsQ0FBWSxhQUFhLElBQUEsQ0FBSyxJQUFBLENBQUssb0JBQW9CLElBQUEsRUFBTSxJQUFBLEVBQU0sT0FBTyxDQUFBLEVBQUcscUJBQXFCLENBQUE7QUFBQSxFQUNwRztBQUFBLEVBRUEsU0FBQSxDQUFVLFVBQXdCLFFBQUEsRUFBMkQ7QUFDM0YsSUFBQSxNQUFNLE1BQUEsR0FBUyxJQUFBLENBQUssSUFBQSxDQUFLLFNBQUEsQ0FBVSxJQUFJLENBQUE7QUFDdkMsSUFBQSxNQUFBLENBQU8sV0FBVyxRQUFBLENBQVMsUUFBQTtBQUMzQixJQUFBQSxtQkFBWSxZQUFBLENBQWEsTUFBQSxDQUFPLFNBQVMsV0FBQSxDQUFZLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQTtBQUN0RixJQUFBLElBQUksUUFBQSxFQUFVLE1BQUEsQ0FBTyxRQUFBLENBQVMsUUFBQSxHQUFXLFFBQUE7QUFDekMsSUFBQSxPQUFPLE1BQUE7QUFBQSxFQUNUO0FBQUEsRUFFQSxNQUFNLElBQUEsR0FBc0I7QUFDMUIsSUFBQSxJQUFJLEtBQUssT0FBQSxFQUFTO0FBQ2xCLElBQUFBLG1CQUFZLFlBQUEsQ0FBYSxNQUFNLEtBQUssSUFBQSxDQUFLLFVBQUEsSUFBYyxZQUFZLENBQUE7QUFDbkUsSUFBQUEsa0JBQUFBLENBQVksYUFBYSxNQUFNLElBQUEsQ0FBSyxLQUFLLFdBQUEsQ0FBWSxJQUFJLEdBQUcsYUFBYSxDQUFBO0FBQ3pFLElBQUEsSUFBQSxDQUFLLE9BQUEsR0FBVSxJQUFBO0FBQUEsRUFDakI7QUFBQSxFQUVBLE1BQU0sWUFBWSxHQUFBLEVBQTRCO0FBQzVDLElBQUFBLGtCQUFBQSxDQUFZLGFBQWEsTUFBTSxJQUFBLENBQUssS0FBSyxxQkFBQSxDQUFzQixHQUFHLEdBQUcsdUJBQXVCLENBQUE7QUFBQSxFQUM5RjtBQUFBLEVBRUEsTUFBTSxNQUFBLEdBQXdCO0FBQzVCLElBQUEsSUFBSSxDQUFDLEtBQUssT0FBQSxFQUFTO0FBQ25CLElBQUEsTUFBTSxJQUFBLENBQUssS0FBSyxZQUFBLEVBQWE7QUFDN0IsSUFBQSxNQUFNLElBQUEsQ0FBSyxLQUFLLFdBQUEsRUFBWTtBQUM1QixJQUFBLElBQUEsQ0FBSyxPQUFBLEdBQVUsS0FBQTtBQUFBLEVBQ2pCO0FBQUEsRUFFQSxPQUFPLE1BQUEsQ0FBTyxZQUFZLENBQUEsR0FBbUI7QUFDM0MsSUFBQSxNQUFNLEtBQUssTUFBQSxFQUFPO0FBQ2xCLElBQUEsTUFBTSxJQUFBLENBQUssSUFBQSxDQUFLLE1BQUEsQ0FBTyxZQUFZLENBQUEsRUFBRTtBQUFBLEVBQ3ZDO0FBQ0YsQ0FBQTtBQ1hPLElBQU0sWUFBQSxHQUFOLE1BQU0sYUFBQSxDQUFtQztBQUFBLEVBQzdCLElBQUE7QUFBQSxFQUNBLElBQUE7QUFBQSxFQUNBLElBQUE7QUFBQSxFQUNBLElBQUE7QUFBQSxFQUNBLElBQUE7QUFBQSxFQUNBLE9BQUE7QUFBQSxFQUNqQixHQUFBLEdBQU0sRUFBQTtBQUFBLEVBRUUsWUFDTixHQUFBLEVBQ0EsR0FBQSxFQUNBLEdBQUEsRUFDQSxHQUFBLEVBQ0EsS0FDQSxNQUFBLEVBQ0E7QUFDQSxJQUFBLElBQUEsQ0FBSyxJQUFBLEdBQU8sR0FBQTtBQUNaLElBQUEsSUFBQSxDQUFLLElBQUEsR0FBTyxHQUFBO0FBQ1osSUFBQSxJQUFBLENBQUssSUFBQSxHQUFPLEdBQUE7QUFDWixJQUFBLElBQUEsQ0FBSyxJQUFBLEdBQU8sR0FBQTtBQUNaLElBQUEsSUFBQSxDQUFLLElBQUEsR0FBTyxHQUFBO0FBQ1osSUFBQSxJQUFBLENBQUssT0FBQSxHQUFVLE1BQUE7QUFBQSxFQUNqQjtBQUFBLEVBRUEsYUFBYSxPQUFPLElBQUEsRUFBa0Q7QUFDcEUsSUFBQSxNQUFNLEVBQUUsS0FBQSxFQUFPLE1BQUEsRUFBUSxHQUFBLEVBQUssU0FBQSxFQUFXLE1BQUEsRUFBUSxRQUFBLEVBQVUsWUFBQSxFQUFjLFNBQUEsRUFBVyxPQUFBLEVBQVMsS0FBQSxFQUFNLEdBQUksSUFBQTtBQUVyRyxJQUFBLE1BQU0sS0FBQSxHQUFRTCxZQUFBQSxDQUFNLGlCQUFBLENBQWtCLFNBQVMsQ0FBQTtBQUMvQyxJQUFBLElBQUksQ0FBQyxLQUFBLEVBQU8sTUFBTSxJQUFJLEtBQUEsQ0FBTSxDQUFBLHlCQUFBLEVBQTRCLFNBQVMsQ0FBQSxDQUFFLENBQUE7QUFFbkUsSUFBQSxNQUFNLEdBQUEsR0FBTSxJQUFJQyxtQkFBQUEsRUFBYTtBQUM3QixJQUFBLEdBQUEsQ0FBSSxjQUFjLEtBQUssQ0FBQTtBQUN2QixJQUFBLEdBQUEsQ0FBSSxVQUFVLEtBQUEsQ0FBTSxFQUFBO0FBQ3BCLElBQUEsR0FBQSxDQUFJLEtBQUEsR0FBUSxLQUFBO0FBQ1osSUFBQSxHQUFBLENBQUksTUFBQSxHQUFTLE1BQUE7QUFDYixJQUFBLEdBQUEsQ0FBSSxXQUFBLEdBQWMsTUFBQTtBQUNsQixJQUFBLEdBQUEsQ0FBSSxRQUFBLEdBQVcsSUFBSUUsZUFBQUEsQ0FBUyxDQUFBLEVBQUcsR0FBRyxDQUFBO0FBQ2xDLElBQUEsR0FBQSxDQUFJLFNBQUEsR0FBWSxJQUFJQSxlQUFBQSxDQUFTLEdBQUEsRUFBSyxDQUFDLENBQUE7QUFDbkMsSUFBQSxHQUFBLENBQUksT0FBQSxHQUFVLEdBQUE7QUFDZCxJQUFBLEdBQUEsQ0FBSSxPQUFBLEdBQVUsT0FBTyxPQUFPLENBQUE7QUFDNUIsSUFBQSxHQUFBLENBQUksU0FBQSxDQUFVLFdBQVcsR0FBRyxDQUFBO0FBQzVCLElBQUEsSUFBSSxZQUFBLEVBQWMsR0FBQSxDQUFJLFFBQUEsQ0FBU0MscUNBQTJCLENBQUE7QUFDMUQsSUFBQSxLQUFBLE1BQVcsQ0FBQyxDQUFBLEVBQUcsQ0FBQyxDQUFBLElBQUssTUFBQSxDQUFPLE9BQUEsQ0FBUSxTQUFTLENBQUEsRUFBRyxHQUFBLENBQUksU0FBQSxDQUFVLENBQUEsRUFBRyxDQUFDLENBQUE7QUFDbEUsSUFBQSxJQUFJLFFBQUEsTUFBYyxRQUFBLEdBQVcsUUFBQTtBQUM3QixJQUFBQyxrQkFBQUEsQ0FBWSxhQUFhLE1BQU0sR0FBQSxDQUFJLE1BQU0sS0FBQSxFQUFPLElBQUksR0FBRyxnQkFBZ0IsQ0FBQTtBQUV2RSxJQUFBLE1BQU0sR0FBQSxHQUFNLElBQUlPLDJCQUFBLEVBQXFCO0FBQ3JDLElBQUEsR0FBQSxDQUFJLFdBQVcsS0FBQSxFQUFPLE1BQUEsRUFBUUMsMkJBQWlCLEtBQUEsRUFBTyxNQUFBLEVBQVEsUUFBUUMsc0JBQVksQ0FBQTtBQUVsRixJQUFBLE1BQU0sR0FBQSxHQUFNLElBQUlmLFlBQUFBLEVBQU07QUFDdEIsSUFBQSxHQUFBLENBQUksS0FBQSxFQUFNO0FBQ1YsSUFBQSxHQUFBLENBQUksTUFBQSxHQUFTLE1BQUE7QUFDYixJQUFBLEdBQUEsQ0FBSSxLQUFBLEdBQVEsS0FBQTtBQUNaLElBQUEsR0FBQSxDQUFJLE1BQUEsR0FBUyxNQUFBO0FBQ2IsSUFBQU0sbUJBQVksWUFBQSxDQUFhLEdBQUEsQ0FBSSxTQUFBLENBQVUsQ0FBQyxHQUFHLG9CQUFvQixDQUFBO0FBRy9ELElBQUEsTUFBTSxHQUFBLEdBQU0sSUFBSU4sWUFBQUEsRUFBTTtBQUN0QixJQUFBLEdBQUEsQ0FBSSxLQUFBLEVBQU07QUFDVixJQUFBLEdBQUEsQ0FBSSxNQUFBLEdBQVNjLHlCQUFBO0FBQ2IsSUFBQSxHQUFBLENBQUksS0FBQSxHQUFRLEtBQUE7QUFDWixJQUFBLEdBQUEsQ0FBSSxNQUFBLEdBQVMsTUFBQTtBQUNiLElBQUFSLG1CQUFZLFlBQUEsQ0FBYSxHQUFBLENBQUksU0FBQSxDQUFVLENBQUMsR0FBRyxvQkFBb0IsQ0FBQTtBQUcvRCxJQUFBLE1BQU0sR0FBQSxHQUFNLElBQUlQLGFBQUFBLEVBQU87QUFDdkIsSUFBQSxHQUFBLENBQUksS0FBQSxFQUFNO0FBRVYsSUFBQSxNQUFNLE1BQUEsR0FBUyxLQUFBLENBQU0sU0FBQSxDQUFVLEdBQUEsRUFBSyxRQUFRLENBQUE7QUFDNUMsSUFBQSxPQUFPLElBQUksYUFBQSxDQUFhLEdBQUEsRUFBSyxLQUFLLEdBQUEsRUFBSyxHQUFBLEVBQUssS0FBSyxNQUFNLENBQUE7QUFBQSxFQUN6RDtBQUFBLEVBRUEsSUFBSSxNQUFBLEdBQVM7QUFDWCxJQUFBLE9BQU8sSUFBQSxDQUFLLE9BQUE7QUFBQSxFQUNkO0FBQUEsRUFDQSxJQUFJLFFBQUEsR0FBVztBQUNiLElBQUEsT0FBTyxLQUFLLElBQUEsQ0FBSyxRQUFBO0FBQUEsRUFDbkI7QUFBQSxFQUVBLE1BQU0sTUFBQSxDQUFPLElBQUEsRUFBYyxLQUFBLEVBQW1DO0FBQzVELElBQUEsTUFBTSxFQUFFLElBQUEsRUFBTSxHQUFBLEVBQUssTUFBTSxHQUFBLEVBQUssSUFBQSxFQUFNLEtBQUksR0FBSSxJQUFBO0FBRzVDLElBQUFPLGtCQUFBQSxDQUFZLFlBQUEsQ0FBYSxHQUFBLENBQUksWUFBQSxJQUFnQixrQkFBa0IsQ0FBQTtBQUMvRCxJQUFBQSxtQkFBWSxZQUFBLENBQWEsR0FBQSxDQUFJLFVBQUEsQ0FBVyxJQUFJLEdBQUcsZ0JBQWdCLENBQUE7QUFDL0QsSUFBQSxHQUFBLENBQUksTUFBTSxJQUFBLENBQUssR0FBQTtBQUVmLElBQUFBLGtCQUFBQSxDQUFZLFlBQUEsQ0FBYSxHQUFBLENBQUksWUFBQSxJQUFnQixrQkFBa0IsQ0FBQTtBQUMvRCxJQUFBQSxrQkFBQUEsQ0FBWSxhQUFhLE1BQU0sR0FBQSxDQUFJLFdBQVcsR0FBQSxFQUFLLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQTtBQUV6RSxJQUFBLEdBQUEsQ0FBSSxNQUFNLElBQUEsQ0FBSyxHQUFBLEVBQUE7QUFDZixJQUFBQSxrQkFBQUEsQ0FBWSxhQUFhLE1BQU0sSUFBQSxDQUFLLEtBQUssU0FBQSxDQUFVLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQTtBQUM3RSxJQUFBLE1BQU0sSUFBQSxDQUFLLE1BQU0sS0FBSyxDQUFBO0FBQUEsRUFDeEI7QUFBQSxFQUVBLE1BQU0sTUFBTSxLQUFBLEVBQW1DO0FBQzdDLElBQUEsTUFBTSxJQUFBLENBQUssSUFBQSxDQUFLLFNBQUEsQ0FBVSxJQUFJLENBQUE7QUFDOUIsSUFBQSxNQUFNLElBQUEsQ0FBSyxNQUFNLEtBQUssQ0FBQTtBQUFBLEVBQ3hCO0FBQUEsRUFFQSxDQUFDLE1BQUEsQ0FBTyxPQUFPLENBQUEsR0FBVTtBQUN2QixJQUFBLElBQUEsQ0FBSyxLQUFLLElBQUEsRUFBSztBQUNmLElBQUEsSUFBQSxDQUFLLEtBQUssSUFBQSxFQUFLO0FBQ2YsSUFBQSxJQUFBLENBQUssS0FBSyxJQUFBLEVBQUs7QUFDZixJQUFBLElBQUEsQ0FBSyxJQUFBLENBQUssTUFBQSxDQUFPLE9BQU8sQ0FBQSxFQUFFO0FBQzFCLElBQUEsSUFBQSxDQUFLLEtBQUssV0FBQSxFQUFZO0FBQUEsRUFDeEI7QUFBQSxFQUVBLE1BQWMsTUFBTSxLQUFBLEVBQW1DO0FBQ3JELElBQUEsTUFBTSxNQUFNLElBQUEsQ0FBSyxJQUFBO0FBQ2pCLElBQUEsT0FBTyxJQUFBLEVBQU07QUFDWCxNQUFBLE1BQU0sQ0FBQSxHQUFJLE1BQU0sSUFBQSxDQUFLLElBQUEsQ0FBSyxjQUFjLEdBQUcsQ0FBQTtBQUMzQyxNQUFBLElBQUksQ0FBQSxLQUFNSSx3QkFBQUEsSUFBa0IsQ0FBQSxLQUFNQyxxQkFBQUEsRUFBYTtBQUMvQyxNQUFBTCxrQkFBQUEsQ0FBWSxZQUFBLENBQWEsQ0FBQSxFQUFHLHFCQUFxQixDQUFBO0FBQ2pELE1BQUEsR0FBQSxDQUFJLFdBQUEsR0FBYyxLQUFLLE9BQUEsQ0FBUSxLQUFBO0FBQy9CLE1BQUEsR0FBQSxDQUFJLFVBQVUsSUFBQSxDQUFLLElBQUEsQ0FBSyxRQUFBLEVBQVUsSUFBQSxDQUFLLFFBQVEsUUFBUSxDQUFBO0FBQ3ZELE1BQUEsTUFBTSxLQUFBLENBQU0sWUFBWSxHQUFHLENBQUE7QUFDM0IsTUFBQSxHQUFBLENBQUksS0FBQSxFQUFNO0FBQUEsSUFDWjtBQUFBLEVBQ0Y7QUFDRixDQUFBOzs7QUNoSUFVLFVBQUEsQ0FBSSxXQUFBLENBQVksQ0FBQyxLQUFBLEVBQU8sT0FBQSxLQUFZO0FBQ2xDLEVBQUEsTUFBTSxHQUFBLEdBQU0sUUFBUSxPQUFBLEVBQVE7QUFDNUIsRUFBQSxJQUFJLENBQUMsR0FBQSxFQUFLO0FBQ1YsRUFBQSxJQUFJLEtBQUEsSUFBU0Msc0JBQUEsRUFBYyxNQUFBLENBQU8sS0FBQSxDQUFNLEdBQUcsQ0FBQTtBQUFBLE9BQUEsSUFDbEMsS0FBQSxJQUFTQyx3QkFBQSxFQUFnQixNQUFBLENBQU8sSUFBQSxDQUFLLEdBQUcsQ0FBQTtBQUNuRCxDQUFDLENBQUE7QUFhRCxJQUFNLFlBQUEsR0FBZ0Q7QUFBQSxFQUNwRCxHQUFBLEVBQUs7QUFBQSxJQUNILGNBQUEsRUFBZ0JDLDRCQUFBO0FBQUEsSUFDaEIsTUFBQSxFQUFRQyw2QkFBQUE7QUFBQSxJQUNSLFFBQUEsRUFBVSxNQUFBO0FBQUEsSUFDVixZQUFBLEVBQWMsSUFBQTtBQUFBLElBQ2QsU0FBQSxFQUFXLEVBQUUsTUFBQSxFQUFRLFdBQUEsRUFBYSxlQUFlLGFBQUEsRUFBYztBQUFBLElBQy9ELGNBQUEsRUFBZ0JDLHdCQUFBO0FBQUEsSUFDaEIsY0FBQSxFQUFnQnZCLDRCQUFBQTtBQUFBLElBQ2hCLGFBQUEsRUFBZTtBQUFBLEdBQ2pCO0FBQUEsRUFDQSxJQUFBLEVBQU07QUFBQSxJQUNKLGNBQUEsRUFBZ0IsWUFBQTtBQUFBLElBQ2hCLE1BQUEsRUFBUXNCLDZCQUFBQTtBQUFBLElBQ1IsWUFBQSxFQUFjLEtBQUE7QUFBQSxJQUNkLFNBQUEsRUFBVyxFQUFFLE9BQUEsRUFBUyxVQUFBLEVBQVksWUFBWSxHQUFBLEVBQUk7QUFBQSxJQUNsRCxjQUFBLEVBQWdCLFNBQUE7QUFBQSxJQUNoQixjQUFBLEVBQWdCdkIsMkJBQUFBO0FBQUEsSUFDaEIsYUFBQSxFQUFlO0FBQUE7QUFFbkIsQ0FBQTtBQXdCTyxJQUFNLGVBQUEsR0FBTixNQUFNLGdCQUFBLENBQWdCO0FBQUEsRUFDVixPQUFBO0FBQUEsRUFFVCxZQUFZLE1BQUEsRUFBdUI7QUFDekMsSUFBQSxJQUFBLENBQUssT0FBQSxHQUFVLE1BQUE7QUFBQSxFQUNqQjtBQUFBLEVBRUEsYUFBYSxNQUFBLENBQU87QUFBQSxJQUNsQixLQUFBO0FBQUEsSUFDQSxNQUFBO0FBQUEsSUFDQSxHQUFBO0FBQUEsSUFDQSxPQUFBO0FBQUEsSUFDQSxNQUFBO0FBQUEsSUFDQSxTQUFBLEdBQVksS0FBQTtBQUFBLElBQ1osWUFBQSxHQUFlLEdBQUE7QUFBQSxJQUNmLFlBQUEsR0FBZTtBQUFBLEdBQ2pCLEVBQXFEO0FBQ25ELElBQUEsTUFBTSxNQUFBLEdBQVMsTUFBTSxPQUFBLENBQVEsR0FBQTtBQUFBLE1BQzNCLE9BQUEsQ0FBUSxHQUFBLENBQUksT0FBTyxNQUFBLEtBQVc7QUFDNUIsUUFBQSxNQUFNLElBQUEsR0FBTyxhQUFhLE1BQU0sQ0FBQTtBQUNoQyxRQUFBLE1BQU0sT0FBQSxHQUFVSCxTQUFBQSxDQUFLLE1BQUEsRUFBUSxDQUFBLE9BQUEsRUFBVSxNQUFNLENBQUEsQ0FBRSxDQUFBO0FBQy9DLFFBQUEsTUFBTSxLQUFBLEdBQVEsSUFBSSxXQUFBLENBQVksT0FBTyxDQUFBO0FBRXJDLFFBQUEsTUFBTSxLQUFBLEdBQVEsTUFBTSxZQUFBLENBQWEsTUFBQSxDQUFPO0FBQUEsVUFDdEMsS0FBQTtBQUFBLFVBQ0EsTUFBQTtBQUFBLFVBQ0EsR0FBQTtBQUFBLFVBQ0EsV0FBVyxJQUFBLENBQUssY0FBQTtBQUFBLFVBQ2hCLFFBQVEsSUFBQSxDQUFLLE1BQUE7QUFBQSxVQUNiLFVBQVUsSUFBQSxDQUFLLFFBQUE7QUFBQSxVQUNmLGNBQWMsSUFBQSxDQUFLLFlBQUE7QUFBQSxVQUNuQixXQUFXLElBQUEsQ0FBSyxTQUFBO0FBQUEsVUFDaEIsT0FBQSxFQUFTLFlBQUE7QUFBQSxVQUNUO0FBQUEsU0FDRCxDQUFBO0FBRUQsUUFBQSxJQUFJLEtBQUE7QUFDSixRQUFBLElBQUksU0FBQSxFQUFXO0FBQ2IsVUFBQSxLQUFBLEdBQVEsTUFBTSxhQUFhLE1BQUEsQ0FBTztBQUFBLFlBQ2hDLGVBQWUsSUFBQSxDQUFLLGFBQUE7QUFBQSxZQUNwQixjQUFjLElBQUEsQ0FBSyxjQUFBO0FBQUEsWUFDbkIsV0FBVyxJQUFBLENBQUssY0FBQTtBQUFBLFlBQ2hCLGNBQWMsSUFBQSxDQUFLLFlBQUE7QUFBQSxZQUNuQixPQUFBLEVBQVMsWUFBQTtBQUFBLFlBQ1Q7QUFBQSxXQUNELENBQUE7QUFBQSxRQUNIO0FBRUEsUUFBQSxNQUFNLE1BQU0sSUFBQSxFQUFLO0FBQ2pCLFFBQUEsTUFBTSxPQUFBLEdBQVUsSUFBSSxrQkFBQSxDQUFtQixDQUFDLENBQUE7QUFDeEMsUUFBQSxPQUFPLEVBQUUsTUFBQSxFQUFRLE9BQUEsRUFBUyxLQUFBLEVBQU8sS0FBQSxFQUFPLE9BQU8sT0FBQSxFQUFRO0FBQUEsTUFDekQsQ0FBQztBQUFBLEtBQ0g7QUFDQSxJQUFBLE9BQU8sSUFBSSxpQkFBZ0IsTUFBTSxDQUFBO0FBQUEsRUFDbkM7QUFBQSxFQUVBLFdBQVcsVUFBQSxFQUEwQjtBQUNuQyxJQUFBLEtBQUEsTUFBVyxDQUFBLElBQUssS0FBSyxPQUFBLEVBQVM7QUFDNUIsTUFBQSxDQUFBLENBQUUsS0FBQSxFQUFPLGFBQWEsVUFBVSxDQUFBO0FBQUEsSUFDbEM7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFNLFdBQUEsQ0FBWSxJQUFBLEVBQWMsWUFBQSxFQUFxQztBQUNuRSxJQUFBLE1BQU0sUUFBUSxHQUFBLENBQUksSUFBQSxDQUFLLFFBQVEsR0FBQSxDQUFJLENBQUMsTUFBTSxDQUFBLENBQUUsT0FBQSxDQUFRLFNBQVMsTUFBTSxDQUFBLENBQUUsTUFBTSxNQUFBLENBQU8sSUFBQSxFQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQUEsRUFDcEc7QUFBQSxFQUVBLE1BQU0sWUFBWSxHQUFBLEVBQTRCO0FBQzVDLElBQUEsTUFBTSxPQUFBLENBQVEsR0FBQTtBQUFBLE1BQ1osSUFBQSxDQUFLLE9BQUEsQ0FBUSxHQUFBLENBQUksQ0FBQyxDQUFBLEtBQU07QUFDdEIsUUFBQSxJQUFJLENBQUMsQ0FBQSxDQUFFLEtBQUEsRUFBTyxPQUFPLFFBQVEsT0FBQSxFQUFRO0FBQ3JDLFFBQUEsT0FBTyxDQUFBLENBQUUsT0FBQSxDQUFRLFFBQUEsQ0FBUyxNQUFNLENBQUEsQ0FBRSxNQUFPLE1BQUEsQ0FBTyxHQUFBLEVBQUssQ0FBQSxDQUFFLEtBQUssQ0FBQyxDQUFBO0FBQUEsTUFDL0QsQ0FBQztBQUFBLEtBQ0g7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFNLE1BQUEsR0FBaUM7QUFDckMsSUFBQSxNQUFNLFNBQXdCLEVBQUM7QUFDL0IsSUFBQSxNQUFNLE9BQUEsQ0FBUSxHQUFBO0FBQUEsTUFDWixJQUFBLENBQUssT0FBQSxDQUFRLEdBQUEsQ0FBSSxPQUFPLENBQUEsS0FBTTtBQUs1QixRQUFBLElBQUEsTUFBQSxHQUFBLEVBQUE7QUFBQSxRQUFBLElBQUE7QUFKQSxVQUFBLE1BQU0sQ0FBQSxDQUFFLFFBQVEsR0FBQSxFQUFJO0FBQ3BCLFVBQUEsTUFBTSxDQUFBLENBQUUsS0FBQSxFQUFPLEtBQUEsQ0FBTSxDQUFBLENBQUUsS0FBSyxDQUFBO0FBQzVCLFVBQUEsTUFBTSxDQUFBLENBQUUsS0FBQSxDQUFNLEtBQUEsQ0FBTSxDQUFBLENBQUUsS0FBSyxDQUFBO0FBQzNCLFVBQUEsTUFBQSxDQUFPLENBQUEsQ0FBRSxNQUFNLENBQUEsR0FBSSxDQUFBLENBQUUsT0FBQTtBQUNyQixVQUFBLE1BQU0sS0FBSyxPQUFBLENBQUEsTUFBQSxFQUFBLENBQUEsQ0FBRSxLQUFBLENBQUE7QUFDYixVQUFBLE1BQU0sS0FBSyxPQUFBLENBQUEsTUFBQSxFQUFBLENBQUEsQ0FBRSxLQUFBLENBQUE7QUFDYixVQUFBLE1BQVksRUFBQSxHQUFLLGtCQUFFLEtBQUEsRUFBRixJQUFBLENBQUE7QUFBQSxRQUFBLENBQUEsQ0FBQSxPQUZqQixDQUFBLEVBQUE7QUFBQSxVQUFBLElBQUEsTUFBQSxHQUFBLENBQUEsRUFBQSxTQUFBLEdBQUEsSUFBQTtBQUFBLFFBQUEsQ0FBQSxTQUFBO0FBQUEsVUFBQSxJQUFBLFFBQUEsR0FBQSxhQUFBLENBQUEsTUFBQSxFQUFBLE1BQUEsRUFBQSxTQUFBLENBQUE7QUFBQSxVQUFBLFFBQUEsSUFBQSxNQUFBLFFBQUE7QUFBQSxRQUFBO0FBQUEsTUFHRixDQUFDO0FBQUEsS0FDSDtBQUNBLElBQUEsT0FBTyxNQUFBO0FBQUEsRUFDVDtBQUNGLENBQUE7OztBQzNLTyxTQUFTLFFBQVEsS0FBQSxFQUFvQjtBQUMxQyxFQUFBLE1BQU0sSUFBQSxHQUFPLE1BQU0sT0FBQSxFQUFRO0FBQzNCLEVBQUEsSUFBSSxLQUFLLEtBQUEsS0FBVSxDQUFBLElBQUssSUFBQSxDQUFLLE1BQUEsS0FBVyxHQUFHLE9BQU8sSUFBQTtBQUNsRCxFQUFBLE9BQU8sTUFBTSxPQUFBLEVBQVE7QUFDdkI7QUNFQSxJQUFNLEdBQUEsR0FBTSxnQkFBQTtBQUVaLElBQU0sb0JBQUEsR0FBdUI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsQ0FBQTtBQThFN0IsZUFBc0Isa0JBQWtCLFFBQUEsRUFBa0Q7QUFDeEYsRUFBQSxNQUFNLGNBQWNBLFNBQUFBLENBQUs0QixTQUFBLElBQVUsQ0FBQSxrQkFBQSxFQUFxQkMsaUJBQUEsRUFBWSxDQUFBLEdBQUEsQ0FBSyxDQUFBO0FBQ3pFLEVBQUEsTUFBTUMsa0JBQUEsQ0FBVSxhQUFhLG9CQUFvQixDQUFBO0FBQ2pELEVBQUFDLGdCQUFBLENBQVEsZUFBZSxxQkFBQSxDQUFzQjtBQUFBLElBQzNDLElBQUEsRUFBTSxPQUFBO0FBQUEsSUFDTixFQUFBLEVBQUksV0FBQTtBQUFBLElBQ0osUUFBQSxFQUFVO0FBQUEsR0FDWCxDQUFBO0FBRUQsRUFBQUMsZ0JBQUEsQ0FBUSxJQUFBLENBQUssWUFBQSxFQUFjLENBQUMsRUFBQSxFQUFJLElBQUEsS0FBaUM7QUFDL0QsSUFBQSxRQUFBLENBQVMsVUFBQSxDQUFXLEtBQUssVUFBVSxDQUFBO0FBQUEsRUFDckMsQ0FBQyxDQUFBO0FBQ0QsRUFBQUEsZ0JBQUEsQ0FBUSxFQUFBLENBQUcsYUFBQSxFQUFlLE9BQU8sRUFBQSxFQUFJLE1BQUEsS0FBbUI7QUFDdEQsSUFBQSxJQUFJO0FBQ0YsTUFBQSxNQUFNLFFBQUEsQ0FBUyxZQUFZLE1BQU0sQ0FBQTtBQUFBLElBQ25DLFNBQVMsQ0FBQSxFQUFHO0FBQ1YsTUFBQSxNQUFBLENBQU8sS0FBQSxDQUFNLEdBQUEsRUFBSywrQkFBQSxFQUFpQyxDQUFDLENBQUE7QUFBQSxJQUN0RDtBQUFBLEVBQ0YsQ0FBQyxDQUFBO0FBRUQsRUFBQSxPQUFPO0FBQUEsSUFDTCxNQUFNLFFBQUEsR0FBVztBQUNmLE1BQUFBLGdCQUFBLENBQVEsbUJBQW1CLFlBQVksQ0FBQTtBQUN2QyxNQUFBQSxnQkFBQSxDQUFRLG1CQUFtQixhQUFhLENBQUE7QUFDeEMsTUFBQUQsZ0JBQUEsQ0FBUSxjQUFBLENBQWUsd0JBQXdCLFdBQVcsQ0FBQTtBQUMxRCxNQUFBLE1BQU1FLFdBQUEsQ0FBRyxXQUFBLEVBQWEsRUFBRSxLQUFBLEVBQU8sTUFBTSxDQUFBO0FBQUEsSUFDdkM7QUFBQSxHQUNGO0FBQ0Y7OztBQ2xITyxJQUFNLHVCQUFBLEdBQTBCLEVBQUE7QUFHaEMsU0FBUyxnQkFBQSxDQUFpQixXQUFtQixJQUFBLEVBQW9CO0FBQ3RFLEVBQUEsTUFBTSxFQUFFLEtBQUEsRUFBTyxNQUFBLEVBQU8sR0FBSSxJQUFBO0FBQzFCLEVBQUEsT0FBTyxDQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHdCQUFBLEVBTWlCLEtBQUssQ0FBQSxZQUFBLEVBQWUsTUFBQSxHQUFTLENBQUMsQ0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBQSxFQUt6QyxLQUFLLENBQUE7QUFBQSxjQUFBLEVBQ0osTUFBTSxDQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFdBQUEsRUFNVCxNQUFNLENBQUE7QUFBQTtBQUFBLGFBQUEsRUFFSixLQUFLLENBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDJCQUFBLEVBUVMsU0FBUyxDQUFBO0FBQUEsNEJBQUEsRUFDUixLQUFLLENBQUE7QUFBQTtBQUFBO0FBQUEsb0JBQUEsRUFHYixLQUFLLENBQUE7QUFBQSwyQkFBQSxFQUNFLHVCQUF1QixDQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUFBLENBQUE7QUF3RHBEO0FBRU8sU0FBUyxlQUFBLENBQWdCLFFBQWdCLElBQUEsRUFBZ0M7QUFDOUUsRUFBQSxNQUFNLEVBQUUsS0FBQSxFQUFPLE1BQUEsRUFBTyxHQUFJLElBQUE7QUFDMUIsRUFBQSxJQUFJLEtBQUEsR0FBUSx1QkFBQSxJQUEyQixNQUFBLEdBQVMsQ0FBQSxFQUFHO0FBQ2pELElBQUEsT0FBTyxNQUFBO0FBQUEsRUFDVDtBQUVBLEVBQUEsTUFBTSxZQUFZLE1BQUEsR0FBUyxDQUFBO0FBRTNCLEVBQUEsSUFBSSxTQUFBLEdBQVksQ0FBQTtBQUNoQixFQUFBLEtBQUEsSUFBUyxDQUFBLEdBQUksQ0FBQSxFQUFHLENBQUEsR0FBSSx1QkFBQSxFQUF5QixDQUFBLEVBQUEsRUFBSztBQUNoRCxJQUFBLE1BQU0sUUFBQSxHQUFBLENBQVksU0FBQSxHQUFZLEtBQUEsR0FBUSxDQUFBLElBQUssQ0FBQTtBQUMzQyxJQUFBLE1BQU0sQ0FBQSxHQUFJLE1BQUEsQ0FBTyxRQUFRLENBQUEsSUFBSyxDQUFBO0FBQzlCLElBQUEsTUFBTSxHQUFBLEdBQU0sQ0FBQSxHQUFJLEdBQUEsR0FBTSxDQUFBLEdBQUksQ0FBQTtBQUMxQixJQUFBLFNBQUEsR0FBYSxhQUFhLENBQUEsR0FBSyxHQUFBO0FBQUEsRUFDakM7QUFFQSxFQUFBLFNBQUEsR0FBWSxTQUFBLEtBQWMsQ0FBQTtBQUUxQixFQUFBLElBQUksQ0FBQyxPQUFPLFFBQUEsQ0FBUyxTQUFTLEtBQUssU0FBQSxHQUFZLENBQUEsSUFBSyxZQUFZLEdBQUEsRUFBSztBQUNuRSxJQUFBLE9BQU8sTUFBQTtBQUFBLEVBQ1Q7QUFFQSxFQUFBLE9BQU8sU0FBQTtBQUNUO0FBRU8sU0FBUyxVQUFVLEdBQUEsRUFBZTtBQUN2QyxFQUFBLE9BQU8sR0FBQSxDQUFJLFlBQVksa0JBQUEsRUFBb0I7QUFBQSxJQUN6QyxVQUFBLEVBQVksQ0FBQSxnQ0FBQTtBQUFBLEdBQ2IsQ0FBQTtBQUNIO0FBRU8sU0FBUyxTQUFTLEdBQUEsRUFBZTtBQUN0QyxFQUFBLE9BQU8sR0FBQSxDQUFJLFlBQVksa0JBQUEsRUFBb0I7QUFBQSxJQUN6QyxVQUFBLEVBQVksQ0FBQSwrQkFBQTtBQUFBLEdBQ2IsQ0FBQTtBQUNIOzs7QUNySU8sU0FBUyxNQUFNLEVBQUEsRUFBWTtBQUNoQyxFQUFBLE9BQU8sSUFBSSxPQUFBLENBQWMsQ0FBQyxZQUFZLFVBQUEsQ0FBVyxPQUFBLEVBQVMsRUFBRSxDQUFDLENBQUE7QUFDL0Q7OztBQ09PLFNBQVMsU0FBa0MsRUFBRSxFQUFBLEVBQUksV0FBQSxHQUFjLENBQUEsRUFBRyxTQUFRLEVBQTRCO0FBQzNHLEVBQUEsTUFBTSxZQUFBLEdBQWUsSUFBSSxLQUFBLENBQU0sQ0FBQSxhQUFBLEVBQWdCLE9BQU8sQ0FBQSxFQUFBLENBQUksQ0FBQTtBQUMxRCxFQUFBLE9BQU8sa0JBQW1CLElBQUEsRUFBWTtBQUNwQyxJQUFBLElBQUksT0FBQSxHQUFVLENBQUE7QUFDZCxJQUFBLE9BQU8sSUFBQSxFQUFNO0FBQ1gsTUFBQSxJQUFJO0FBQ0YsUUFBQSxNQUFNLFFBQUEsR0FBVyxDQUFDLEVBQUEsQ0FBRyxHQUFHLElBQUksQ0FBQyxDQUFBO0FBQzdCLFFBQUEsSUFBSSxPQUFBLEVBQVM7QUFDWCxVQUFBLFFBQUEsQ0FBUyxJQUFBO0FBQUEsWUFDUEMscUJBQUFBLENBQVcsT0FBTyxDQUFBLENBQUUsSUFBQSxDQUFLLE1BQU07QUFDN0IsY0FBQSxNQUFNLFlBQUE7QUFBQSxZQUNSLENBQUM7QUFBQSxXQUNIO0FBQUEsUUFDRjtBQUNBLFFBQUEsT0FBTyxNQUFNLE9BQUEsQ0FBUSxJQUFBLENBQUssUUFBUSxDQUFBO0FBQUEsTUFDcEMsU0FBUyxDQUFBLEVBQUc7QUFDVixRQUFBLE9BQUEsRUFBQTtBQUNBLFFBQUEsSUFBSSxXQUFXLFdBQUEsRUFBYTtBQUMxQixVQUFBLE1BQU0sQ0FBQTtBQUFBLFFBQ1I7QUFDQSxRQUFBLE1BQU0sS0FBQSxDQUFNLElBQUEsQ0FBSyxHQUFBLENBQUksQ0FBQSxFQUFHLE9BQU8sSUFBSSxHQUFBLEdBQU0sSUFBQSxDQUFLLE1BQUEsRUFBTyxHQUFJLEdBQUcsQ0FBQTtBQUFBLE1BQzlEO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQTtBQUNGOzs7QUNqQ0EsSUFBTSxtQkFBQSxHQUFzQixDQUFDLE9BQUEsRUFBUyxPQUFBLEVBQVMsVUFBVSxPQUFPLENBQUE7QUFDaEUsSUFBTSxjQUFBLEdBQWlCLHdCQUFBO0FBRWhCLFNBQVMsVUFBVSxNQUFBLEVBQXNCO0FBQzlDLEVBQUEsSUFBSSxjQUFBLENBQWUsSUFBQSxDQUFLLE1BQU0sQ0FBQSxFQUFHO0FBQy9CLElBQUE7QUFBQSxFQUNGO0FBRUEsRUFBQSxNQUFNLFdBQVcsTUFBQSxDQUFPLEtBQUEsQ0FBTSxHQUFHLENBQUEsQ0FBRSxDQUFDLENBQUEsR0FBSSxHQUFBO0FBQ3hDLEVBQUEsTUFBTSxVQUFVLG1CQUFBLENBQW9CLFFBQUEsQ0FBUyxRQUFRLENBQUEsR0FDakQseUJBQXlCLFFBQVEsQ0FBQSxXQUFBLEVBQWMsbUJBQUEsQ0FBb0IsSUFBQSxDQUFLLElBQUksQ0FBQyxDQUFBLENBQUEsR0FDN0UsbUNBQW1DLG1CQUFBLENBQW9CLElBQUEsQ0FBSyxJQUFJLENBQUMsQ0FBQSxDQUFBO0FBRXJFLEVBQUEsTUFBTSxJQUFJLE1BQU0sT0FBTyxDQUFBO0FBQ3pCOzs7QUNUTyxJQUFNLGdCQUFOLE1BQW9CO0FBQUEsRUFDakIsUUFBQTtBQUFBLEVBQ0EsUUFBQTtBQUFBLEVBQ0EsYUFBQTtBQUFBLEVBRVIsS0FBSyxPQUFBLEVBQXNDO0FBQ3pDLElBQUEsSUFBSSxLQUFLLFFBQUEsRUFBVTtBQUNqQixNQUFBLE1BQU0sSUFBSSxNQUFNLGlCQUFpQixDQUFBO0FBQUEsSUFDbkM7QUFDQSxJQUFBLElBQUEsQ0FBSyxRQUFBLEdBQVcsSUFBSSxPQUFBLENBQVEsQ0FBQyxPQUFBLEtBQVk7QUFDdkMsTUFBQSxJQUFBLENBQUssUUFBQSxHQUFXLE9BQUE7QUFDaEIsTUFBQSxJQUFJLE9BQUEsRUFBUyxZQUFZLE1BQUEsRUFBVztBQUNsQyxRQUFBLElBQUEsQ0FBSyxhQUFBLEdBQWdCLFdBQVcsTUFBTTtBQUNwQyxVQUFBLE9BQUEsQ0FBUSxTQUFBLElBQVk7QUFDcEIsVUFBQSxPQUFBLEVBQVE7QUFBQSxRQUNWLENBQUEsRUFBRyxRQUFRLE9BQU8sQ0FBQTtBQUFBLE1BQ3BCO0FBQUEsSUFDRixDQUFDLENBQUE7QUFDRCxJQUFBLE9BQU8sSUFBQSxDQUFLLFFBQUE7QUFBQSxFQUNkO0FBQUEsRUFFQSxNQUFBLEdBQVM7QUFDUCxJQUFBLFlBQUEsQ0FBYSxLQUFLLGFBQWEsQ0FBQTtBQUMvQixJQUFBLElBQUEsQ0FBSyxRQUFBLEdBQVcsTUFBQTtBQUNoQixJQUFBLElBQUEsQ0FBSyxRQUFBLElBQVc7QUFBQSxFQUNsQjtBQUNGLENBQUE7OztBQ3pCQSxJQUFNQyxJQUFBQSxHQUFNLFdBQUE7QUFFWixJQUFNLEdBQUEsdUJBQVUsR0FBQSxDQUFJO0FBQUEsRUFDbEIsQ0FBQyx1QkFBdUIsQ0FBQSxxQkFBQSxDQUF1QixDQUFBO0FBQUE7QUFBQSxFQUMvQyxDQUFDLGtCQUFrQixDQUFBLHFCQUFBLENBQXVCO0FBQzVDLENBQUMsQ0FBQTtBQUVNLFNBQVMsV0FBV0MsS0FBQSxFQUFhO0FBQ3RDLEVBQUEsSUFBSSxDQUFDQSxLQUFBLENBQUksVUFBQSxDQUFXLE1BQU0sQ0FBQSxFQUFHO0FBQzNCLElBQUEsT0FBT0EsS0FBQTtBQUFBLEVBQ1Q7QUFDQSxFQUFBLE1BQU0sTUFBQSxHQUFTLElBQUlDLE9BQUFBLENBQUlELEtBQUcsQ0FBQTtBQUMxQixFQUFBLE1BQU0sTUFBQSxHQUFTLEdBQUEsQ0FBSSxHQUFBLENBQUksTUFBQSxDQUFPLFFBQVEsQ0FBQTtBQUN0QyxFQUFBLElBQUksQ0FBQyxNQUFBLEVBQVE7QUFDWCxJQUFBLE9BQU9BLEtBQUE7QUFBQSxFQUNUO0FBQ0EsRUFBQSxNQUFBLENBQU8sUUFBQSxHQUFXLE1BQUE7QUFDbEIsRUFBQSxNQUFBLENBQU8sUUFBQSxHQUFXLE9BQUE7QUFDbEIsRUFBQSxPQUFPLE9BQU8sUUFBQSxFQUFTO0FBQ3pCO0FBUU8sU0FBUyxjQUFBLENBQWUsRUFBRSxNQUFBLEVBQVEsTUFBQSxFQUFRLGVBQWMsRUFBbUI7QUFDaEYsRUFBQSxNQUFNLEdBQUEsR0FBTSxNQUFBLENBQU8sV0FBQSxDQUFZLE9BQUEsQ0FBUSxVQUFBO0FBQ3ZDLEVBQUEsTUFBTSxPQUFBLEdBQVUsSUFBSSxrQkFBQSxDQUFtQixFQUFFLENBQUE7QUFDekMsRUFBQSxNQUFNLE1BQUEsdUJBQWEsR0FBQSxFQUEyQjtBQUU5QyxFQUFBLGVBQWUsSUFBQSxDQUFLLEtBQWEsU0FBQSxFQUF3QjtBQUN2RCxJQUFBLE1BQU0sS0FBQSxHQUFRLElBQUksYUFBQSxFQUFjO0FBQ2hDLElBQUEsTUFBQSxDQUFPLEdBQUEsQ0FBSSxLQUFLLEtBQUssQ0FBQTtBQUNyQixJQUFBLE1BQU0sS0FBQSxDQUFNLElBQUEsQ0FBSyxFQUFFLE9BQUEsRUFBUyxHQUFBLEVBQU8sU0FBQSxFQUFXLENBQUEsQ0FBRSxPQUFBLENBQVEsTUFBTSxNQUFBLENBQU8sTUFBQSxDQUFPLEdBQUcsQ0FBQyxDQUFBO0FBQUEsRUFDbEY7QUFFQSxFQUFBLFNBQVMsT0FBTyxHQUFBLEVBQWE7QUFDM0IsSUFBQSxNQUFBLENBQU8sR0FBQSxDQUFJLEdBQUcsQ0FBQSxFQUFHLE1BQUEsRUFBTztBQUFBLEVBQzFCO0FBRUEsRUFBQSxHQUFBLENBQUksZUFBQSxDQUFnQixDQUFDLE9BQUEsRUFBUyxRQUFBLEtBQWE7QUFDekMsSUFBQSxNQUFNLE1BQU0sT0FBQSxDQUFRLEdBQUE7QUFDcEIsSUFBQSxNQUFNLE9BQUEsR0FBVSxhQUFBLEdBQWdCLFVBQUEsQ0FBVyxHQUFHLENBQUEsR0FBSSxHQUFBO0FBQ2xELElBQUEsT0FBQSxDQUFRLFNBQVMsTUFBTTtBQUNyQixNQUFBLE1BQU0sTUFBTSxDQUFBLEVBQUcsTUFBQSxDQUFPLEVBQUUsQ0FBQSxDQUFBLEVBQUksUUFBUSxFQUFFLENBQUEsQ0FBQTtBQUN0QyxNQUFBLE1BQUEsQ0FBTyxLQUFBLENBQU1ELE1BQUssQ0FBQSxNQUFBLENBQUEsRUFBVTtBQUFBLFFBQzFCLEdBQUE7QUFBQSxRQUNBLEdBQUE7QUFBQSxRQUNBLE9BQUE7QUFBQSxRQUNBLFFBQVEsT0FBQSxDQUFRLE1BQUE7QUFBQSxRQUNoQixNQUFBO0FBQUEsUUFDQSxPQUFPLE9BQUEsQ0FBUTtBQUFBLE9BQ2hCLENBQUE7QUFDRCxNQUFBLElBQUksWUFBWSxHQUFBLEVBQUs7QUFDbkIsUUFBQSxRQUFBLENBQVMsRUFBRSxNQUFBLEVBQVEsS0FBQSxFQUFPLENBQUE7QUFBQSxNQUM1QixDQUFBLE1BQU87QUFDTCxRQUFBLFFBQUEsQ0FBUyxFQUFFLE1BQUEsRUFBUSxLQUFBLEVBQU8sV0FBQSxFQUFhLFNBQVMsQ0FBQTtBQUFBLE1BQ2xEO0FBQ0EsTUFBQSxPQUFPLElBQUEsQ0FBSyxLQUFLLE1BQU07QUFDckIsUUFBQSxNQUFBLENBQU8sSUFBQSxDQUFLQSxNQUFLLENBQUEsY0FBQSxDQUFBLEVBQWtCO0FBQUEsVUFDakMsR0FBQTtBQUFBLFVBQ0EsR0FBQTtBQUFBLFVBQ0EsT0FBQTtBQUFBLFVBQ0EsUUFBUSxPQUFBLENBQVEsTUFBQTtBQUFBLFVBQ2hCO0FBQUEsU0FDRCxDQUFBO0FBQUEsTUFDSCxDQUFDLENBQUE7QUFBQSxJQUNILENBQUMsQ0FBQTtBQUFBLEVBQ0gsQ0FBQyxDQUFBO0FBRUQsRUFBQSxHQUFBLENBQUksaUJBQUEsQ0FBa0IsQ0FBQyxFQUFFLGVBQUEsSUFBbUIsUUFBQSxLQUFhO0FBQ3ZELElBQUEsT0FBTyxrQkFBa0IsaUJBQWlCLENBQUE7QUFDMUMsSUFBQSxPQUFPLGtCQUFrQixpQkFBaUIsQ0FBQTtBQUMxQyxJQUFBLE9BQU8sa0JBQWtCLHlCQUF5QixDQUFBO0FBQ2xELElBQUEsT0FBTyxrQkFBa0IseUJBQXlCLENBQUE7QUFDbEQsSUFBQSxRQUFBLENBQVMsRUFBRSxNQUFBLEVBQVEsS0FBQSxFQUFPLGVBQUEsRUFBaUIsQ0FBQTtBQUFBLEVBQzdDLENBQUMsQ0FBQTtBQUVELEVBQUEsR0FBQSxDQUFJLFdBQUEsQ0FBWSxDQUFDLE9BQUEsS0FBWTtBQUMzQixJQUFBLE1BQU0sTUFBTSxDQUFBLEVBQUcsTUFBQSxDQUFPLEVBQUUsQ0FBQSxDQUFBLEVBQUksUUFBUSxFQUFFLENBQUEsQ0FBQTtBQUN0QyxJQUFBLE1BQUEsQ0FBTyxHQUFHLENBQUE7QUFDVixJQUFBLE1BQUEsQ0FBTyxLQUFBLENBQU1BLE1BQUssQ0FBQSxVQUFBLENBQUEsRUFBYztBQUFBLE1BQzlCLEdBQUE7QUFBQSxNQUNBLEtBQUssT0FBQSxDQUFRLEdBQUE7QUFBQSxNQUNiLFFBQVEsT0FBQSxDQUFRLE1BQUE7QUFBQSxNQUNoQixZQUFZLE9BQUEsQ0FBUSxVQUFBO0FBQUEsTUFDcEI7QUFBQSxLQUNELENBQUE7QUFBQSxFQUNILENBQUMsQ0FBQTtBQUVELEVBQUEsR0FBQSxDQUFJLGVBQUEsQ0FBZ0IsQ0FBQyxPQUFBLEtBQVk7QUFDL0IsSUFBQSxNQUFNLE1BQU0sQ0FBQSxFQUFHLE1BQUEsQ0FBTyxFQUFFLENBQUEsQ0FBQSxFQUFJLFFBQVEsRUFBRSxDQUFBLENBQUE7QUFDdEMsSUFBQSxNQUFBLENBQU8sR0FBRyxDQUFBO0FBQ1YsSUFBQSxNQUFBLENBQU8sS0FBQSxDQUFNQSxNQUFLLENBQUEsTUFBQSxDQUFBLEVBQVU7QUFBQSxNQUMxQixHQUFBO0FBQUEsTUFDQSxLQUFLLE9BQUEsQ0FBUSxHQUFBO0FBQUEsTUFDYixRQUFRLE9BQUEsQ0FBUSxNQUFBO0FBQUEsTUFDaEIsT0FBTyxPQUFBLENBQVEsS0FBQTtBQUFBLE1BQ2Y7QUFBQSxLQUNELENBQUE7QUFBQSxFQUNILENBQUMsQ0FBQTtBQUNIO0FBRU8sU0FBUyxpQkFBaUIsTUFBQSxFQUF1QjtBQUN0RCxFQUFBLE1BQU0sR0FBQSxHQUFNLE1BQUEsQ0FBTyxXQUFBLENBQVksT0FBQSxDQUFRLFVBQUE7QUFDdkMsRUFBQSxHQUFBLENBQUksZ0JBQWdCLElBQUksQ0FBQTtBQUN4QixFQUFBLEdBQUEsQ0FBSSxrQkFBa0IsSUFBSSxDQUFBO0FBQzFCLEVBQUEsR0FBQSxDQUFJLFlBQVksSUFBSSxDQUFBO0FBQ3BCLEVBQUEsR0FBQSxDQUFJLGdCQUFnQixJQUFJLENBQUE7QUFDMUI7OztBQzdHQSxJQUFNQSxJQUFBQSxHQUFNLFVBQUE7QUFFWixTQUFTLGFBQUEsQ0FBYyxLQUFvQixNQUFBLEVBQW9CO0FBQzdELEVBQUEsT0FBTyxJQUFJLE9BQUEsQ0FBYyxDQUFDLE9BQUEsRUFBUyxNQUFBLEtBQVc7QUFDNUMsSUFBQSxNQUFNLE9BQUEsR0FBVSxXQUFXLE1BQU0sTUFBQSxDQUFPLElBQUksS0FBQSxDQUFNLHFCQUFxQixDQUFDLENBQUEsRUFBRyxHQUFNLENBQUE7QUFDakYsSUFBQSxNQUFNLElBQUEsR0FBTyxDQUFDLEdBQUEsS0FBZ0I7QUFDNUIsTUFBQSxZQUFBLENBQWEsT0FBTyxDQUFBO0FBQ3BCLE1BQUEsR0FBQSxHQUFNLE1BQUEsQ0FBTyxHQUFHLENBQUEsR0FBSSxPQUFBLEVBQVE7QUFBQSxJQUM5QixDQUFBO0FBQ0EsSUFBQSxHQUFBLENBQUksV0FBQSxDQUFZLElBQUEsQ0FBSyxpQkFBQSxFQUFtQixNQUFNLE1BQU0sQ0FBQTtBQUNwRCxJQUFBLEdBQUEsQ0FBSSxXQUFBLENBQVksSUFBQTtBQUFBLE1BQUssZUFBQTtBQUFBLE1BQWlCLENBQUMsRUFBQSxFQUFJLElBQUEsRUFBTSxJQUFBLEVBQU0sUUFDckQsSUFBQSxDQUFLLElBQUksS0FBQSxDQUFNLENBQUEsZUFBQSxFQUFrQixHQUFHLENBQUEsR0FBQSxFQUFNLElBQUksQ0FBQSxFQUFBLEVBQUssSUFBSSxFQUFFLENBQUM7QUFBQSxLQUM1RDtBQUNBLElBQUEsR0FBQSxDQUFJLFdBQUEsQ0FBWSxJQUFBO0FBQUEsTUFBSyxxQkFBQTtBQUFBLE1BQXVCLENBQUMsRUFBQSxFQUFJLEVBQUUsUUFBQSxFQUFVLFFBQU8sS0FDbEUsSUFBQSxDQUFLLElBQUksS0FBQSxDQUFNLENBQUEsa0JBQUEsRUFBcUIsUUFBUSxDQUFBLEVBQUEsRUFBSyxNQUFNLEVBQUUsQ0FBQztBQUFBLEtBQzVEO0FBQ0EsSUFBQSxNQUFBLEVBQU87QUFBQSxFQUNULENBQUMsQ0FBQTtBQUNIO0FBRUEsZUFBZSxVQUFBLENBQVcsSUFBQSxFQUF1QixNQUFBLEVBQWdCLE9BQUEsRUFBZ0Q7QUFDL0csRUFBQSxTQUFBLENBQVUsTUFBTSxDQUFBO0FBRWhCLEVBQUEsTUFBTSxFQUFFLEtBQUEsRUFBTyxNQUFBLEVBQVEsYUFBQSxFQUFjLEdBQUksT0FBQTtBQUV6QyxFQUFBLElBQUksR0FBQSxHQUFNLE1BQUE7QUFDVixFQUFBLElBQUksYUFBQSxFQUFlO0FBQ2pCLElBQUEsR0FBQSxHQUFNLFdBQVcsTUFBTSxDQUFBO0FBQUEsRUFDekI7QUFFQSxFQUFBLElBQUEsQ0FBSyxPQUFBLENBQVEsQ0FBQyxDQUFBLEtBQU07QUFDbEIsSUFBQSxDQUFBLENBQUUsWUFBWSxrQkFBQSxFQUFtQjtBQUNqQyxJQUFBLGdCQUFBLENBQWlCLENBQUMsQ0FBQTtBQUNsQixJQUFBLE1BQUEsQ0FBTyxLQUFBLENBQU1BLElBQUFBLEVBQUssQ0FBQSxlQUFBLENBQUEsRUFBbUIsQ0FBQSxDQUFFLEVBQUUsQ0FBQTtBQUFBLEVBQzNDLENBQUMsQ0FBQTtBQUNELEVBQUEsTUFBTSxHQUFBLEdBQU0sSUFBSUcsc0JBQUFBLENBQWM7QUFBQSxJQUM1QixLQUFBO0FBQUEsSUFDQSxRQUFRLE1BQUEsR0FBUyxDQUFBO0FBQUEsSUFDakIsSUFBQSxFQUFNLEtBQUE7QUFBQSxJQUNOLFdBQUEsRUFBYSxJQUFBO0FBQUEsSUFDYixlQUFBLEVBQWlCLE1BQUE7QUFBQSxJQUNqQixjQUFBLEVBQWdCO0FBQUEsTUFDZCxTQUFBLEVBQVcsSUFBQTtBQUFBLE1BQ1gsb0JBQUEsRUFBc0IsS0FBQTtBQUFBLE1BQ3RCLGVBQUEsRUFBaUIsSUFBQTtBQUFBLE1BQ2pCLDBCQUFBLEVBQTRCLElBQUE7QUFBQSxNQUM1Qix1QkFBQSxFQUF5QixJQUFBO0FBQUEsTUFDekIsZ0JBQUEsRUFBa0IsS0FBQTtBQUFBLE1BQ2xCLFdBQUEsRUFBYSxLQUFBO0FBQUEsTUFDYiwyQkFBQSxFQUE2QixJQUFBO0FBQUEsTUFDN0Isb0JBQUEsRUFBc0I7QUFBQTtBQUN4QixHQUNELENBQUE7QUFDRCxFQUFBLGNBQUEsQ0FBZSxFQUFFLE1BQUEsRUFBUSxNQUFBLEVBQVEsR0FBQSxFQUFLLGVBQWUsQ0FBQTtBQUNyRCxFQUFBLElBQUEsQ0FBSyxNQUFBLENBQU8sQ0FBQyxDQUFBLENBQUUsT0FBQSxDQUFRLENBQUMsQ0FBQSxLQUFNLENBQUEsQ0FBRSxTQUFTLENBQUE7QUFDekMsRUFBQSxJQUFBLENBQUssS0FBSyxHQUFHLENBQUE7QUFFYixFQUFBLEdBQUEsQ0FBSSxXQUFBLENBQVksR0FBRyxpQkFBQSxFQUFtQixDQUFDLEVBQUUsS0FBQSxFQUFPLE9BQUEsRUFBUyxVQUFBLEVBQVksUUFBQSxFQUFTLEtBQU07QUFDbEYsSUFBQSxJQUFJLFVBQVUsT0FBQSxFQUFTO0FBQ3JCLE1BQUEsTUFBQSxDQUFPLEtBQUEsQ0FBTUgsTUFBSyxVQUFBLEVBQVk7QUFBQSxRQUM1QixPQUFBO0FBQUEsUUFDQSxVQUFBO0FBQUEsUUFDQSxRQUFBO0FBQUEsUUFDQTtBQUFBLE9BQ0QsQ0FBQTtBQUFBLElBQ0g7QUFBQSxFQUNGLENBQUMsQ0FBQTtBQUVELEVBQUEsTUFBTSxjQUFjLGdCQUFBLENBQWlCLEdBQUEsRUFBSyxFQUFFLEtBQUEsRUFBTyxRQUFRLENBQUE7QUFDM0QsRUFBQSxNQUFNLE9BQUEsR0FBVSxDQUFBLDZCQUFBLEVBQWdDLGtCQUFBLENBQW1CLFdBQVcsQ0FBQyxDQUFBLENBQUE7QUFDL0UsRUFBQSxNQUFNLGNBQWMsR0FBQSxFQUFLLE1BQU0sR0FBQSxDQUFJLE9BQUEsQ0FBUSxPQUFPLENBQUMsQ0FBQTtBQUVuRCxFQUFBLE9BQU8sR0FBQTtBQUNUO0FBRUEsZUFBc0IsVUFBQSxDQUFXLFFBQWdCLE9BQUEsRUFBZ0Q7QUFDL0YsRUFBQSxJQUFJO0FBQ0YsSUFBQSxNQUFNLE9BQXdCLEVBQUM7QUFDL0IsSUFBQSxNQUFNLFFBQUEsQ0FBUyxFQUFFLEVBQUEsRUFBSSxVQUFBLEVBQVksV0FBQSxFQUFhLEdBQUcsQ0FBQSxDQUFFLElBQUEsRUFBTSxNQUFBLEVBQVEsT0FBTyxDQUFBO0FBQ3hFLElBQUEsT0FBTyxNQUFNLFVBQUEsQ0FBVyxJQUFBLEVBQU0sTUFBQSxFQUFRLE9BQU8sQ0FBQTtBQUFBLEVBQy9DLFNBQVMsQ0FBQSxFQUFHO0FBQ1YsSUFBQSxNQUFNLEVBQUUsT0FBQSxFQUFTLEtBQUEsRUFBTSxHQUFJLENBQUE7QUFDM0IsSUFBQSxNQUFNLElBQUEsR0FBTyxFQUFFLE1BQUEsRUFBUSxPQUFBLEVBQVMsS0FBQSxFQUFNO0FBQ3RDLElBQUEsTUFBTSxJQUFJLEtBQUEsQ0FBTSxDQUFBLHVCQUFBLEVBQTBCLEtBQUssU0FBQSxDQUFVLElBQUksQ0FBQyxDQUFBLENBQUUsQ0FBQTtBQUFBLEVBQ2xFO0FBQ0Y7OztBQ2hGQSxJQUFNQSxJQUFBQSxHQUFNLFVBQUE7QUFFWixlQUFzQixNQUFBLENBQU8sUUFBZ0IsT0FBQSxFQUF1QztBQUNsRixFQUFBLE1BQUEsQ0FBTyxJQUFBLENBQUtBLE1BQUssQ0FBQSxZQUFBLENBQWMsQ0FBQTtBQUMvQixFQUFBLE1BQU0sRUFBRSxRQUFRLEdBQUEsRUFBSyxLQUFBLEVBQU8sUUFBUSxRQUFBLEVBQVUsU0FBQSxFQUFXLFNBQVEsR0FBSSxPQUFBO0FBRXJFLEVBQUEsTUFBTUksY0FBQSxDQUFNLE1BQUEsRUFBUSxFQUFFLFNBQUEsRUFBVyxNQUFNLENBQUE7QUFFdkMsRUFBQSxNQUFNLFFBQUEsR0FBVyxNQUFNLGVBQUEsQ0FBZ0IsTUFBQSxDQUFPLEVBQUUsS0FBQSxFQUFPLE1BQUEsRUFBUSxHQUFBLEVBQUssT0FBQSxFQUFTLE1BQUEsRUFBUSxTQUFBLEVBQVcsQ0FBQTtBQUNoRyxFQUFBLE1BQU0sWUFBQSxHQUFlLFNBQUEsR0FBWSxNQUFNLGlCQUFBLENBQWtCLFFBQVEsQ0FBQSxHQUFJLE1BQUE7QUFFckUsRUFBQSxNQUFNLEdBQUEsR0FBTSxNQUFNLFVBQUEsQ0FBVyxNQUFBLEVBQVEsT0FBTyxDQUFBO0FBQzVDLEVBQUEsSUFBSTtBQUNGLElBQUEsTUFBTSxHQUFBLEdBQU0sSUFBSSxXQUFBLENBQVksUUFBQTtBQUM1QixJQUFBLEdBQUEsQ0FBSSxPQUFPLEtBQUssQ0FBQTtBQUVoQixJQUFBLEdBQUEsQ0FBSSxXQUFBLENBQVksYUFBYSxHQUFHLENBQUE7QUFDaEMsSUFBQSxJQUFJLENBQUMsR0FBQSxDQUFJLFdBQUEsQ0FBWSxVQUFBLEVBQVcsRUFBRztBQUNqQyxNQUFBLEdBQUEsQ0FBSSxZQUFZLGFBQUEsRUFBYztBQUFBLElBQ2hDO0FBRUEsSUFBQSxNQUFNLEtBQUEsR0FBUSxJQUFBLENBQUssSUFBQSxDQUFLLEdBQUEsR0FBTSxRQUFRLENBQUE7QUFDdEMsSUFBQSxNQUFNLGdCQUFnQixHQUFBLEdBQU8sR0FBQTtBQUU3QixJQUFBLElBQUksT0FBQSxHQUFVLENBQUE7QUFDZCxJQUFBLElBQUksZUFBQTtBQUNKLElBQUEsSUFBSSxRQUFBLEdBQVcsQ0FBQTtBQUNmLElBQUEsSUFBSSxVQUFBO0FBQ0osSUFBQSxJQUFJLFFBQUE7QUFDSixJQUFBLElBQUksUUFBQTtBQUNKLElBQUEsSUFBSSxTQUFBO0FBQ0osSUFBQSxNQUFNLFdBQUEsR0FBYyxJQUFJLGtCQUFBLENBQW1CLENBQUMsQ0FBQTtBQUU1QyxJQUFBLE1BQU0sYUFBQSxHQUFnQixDQUFDLEtBQUEsRUFBZSxXQUFBLEtBQXdCO0FBQzVELE1BQUEsT0FBQSxFQUFBO0FBQ0EsTUFBQSxNQUFNLEVBQUEsR0FBSyxZQUFZLEdBQUEsRUFBSTtBQUMzQixNQUFBLFdBQUEsQ0FDRyxRQUFBLENBQVMsTUFBTSxRQUFBLENBQVMsV0FBQSxDQUFZLEtBQUEsRUFBTyxXQUFXLENBQUMsQ0FBQSxDQUN2RCxLQUFBLENBQU0sQ0FBQyxDQUFBLEtBQU8sVUFBQSxLQUFlLENBQUUsQ0FBQTtBQUNsQyxNQUFBLE1BQU0sSUFBQSxHQUFPLFdBQUEsQ0FBWSxHQUFBLEVBQUksR0FBSSxFQUFBO0FBQ2pDLE1BQUEsSUFBSSxJQUFBLEdBQU8sZ0JBQWdCLEdBQUEsRUFBSztBQUM5QixRQUFBLE1BQUEsQ0FBTyxJQUFBLENBQUtKLElBQUFBLEVBQUssQ0FBQSxpQkFBQSxFQUFvQixJQUFJLENBQUEsRUFBQSxDQUFJLENBQUE7QUFBQSxNQUMvQztBQUFBLElBQ0YsQ0FBQTtBQUVBLElBQUEsTUFBTSxLQUFBLEdBQVEsQ0FBQyxFQUFBLEVBQWEsRUFBQSxFQUFhLEtBQUEsS0FBdUI7QUFDOUQsTUFBQSxJQUFJLFVBQUEsRUFBWTtBQUNkLFFBQUEsUUFBQSxHQUFXLFVBQVUsQ0FBQTtBQUNyQixRQUFBO0FBQUEsTUFDRjtBQUVBLE1BQUEsSUFBSSxPQUFBLENBQVEsS0FBSyxDQUFBLEVBQUc7QUFFcEIsTUFBQSxNQUFNLE1BQUEsR0FBUyxNQUFNLFFBQUEsRUFBUztBQUM5QixNQUFBLE1BQU0sV0FBQSxHQUFjLGVBQUEsQ0FBZ0IsTUFBQSxFQUFRLEtBQUEsQ0FBTSxTQUFTLENBQUE7QUFDM0QsTUFBQSxJQUFJLGdCQUFnQixLQUFBLENBQUEsRUFBVztBQUM3QixRQUFBLFVBQUEsS0FBZSxJQUFJLEtBQUEsQ0FBTSxDQUFBLGVBQUEsRUFBa0IsT0FBTyxDQUFBLENBQUUsQ0FBQTtBQUNwRCxRQUFBO0FBQUEsTUFDRjtBQUVBLE1BQUEsTUFBTSxjQUFjLEtBQUEsR0FBUSxDQUFBO0FBQzVCLE1BQUEsTUFBTSxPQUFBLEdBQVUsT0FBTyxJQUFBLENBQUssTUFBQSxDQUFPLFFBQVEsTUFBQSxDQUFPLFVBQUEsRUFBWSxTQUFTLFdBQVcsQ0FBQTtBQUVsRixNQUFBLFNBQUEsS0FBYyxPQUFBO0FBRWQsTUFBQSxJQUFJLG9CQUFvQixLQUFBLENBQUEsRUFBVztBQUNqQyxRQUFBLGFBQUEsQ0FBYyxPQUFBLEVBQVMsY0FBYyxHQUFJLENBQUE7QUFDekMsUUFBQSxlQUFBLEdBQWtCLFdBQUE7QUFBQSxNQUNwQixDQUFBLE1BQU87QUFDTCxRQUFBLE1BQU0sWUFBWSxXQUFBLEdBQWMsZUFBQTtBQUNoQyxRQUFBLElBQUksU0FBQSxJQUFhLGdCQUFnQixHQUFBLEVBQUs7QUFDcEMsVUFBQSxJQUFJLFNBQUEsSUFBYSxnQkFBZ0IsR0FBQSxFQUFLO0FBQ3BDLFlBQUEsYUFBQSxDQUFjLE9BQUEsRUFBUyxjQUFjLEdBQUksQ0FBQTtBQUFBLFVBQzNDLENBQUEsTUFBTztBQUNMLFlBQUEsTUFBTSxjQUFBLEdBQWlCLElBQUEsQ0FBSyxLQUFBLENBQU0sU0FBQSxHQUFZLGFBQWEsQ0FBQTtBQUMzRCxZQUFBLEtBQUEsSUFBUyxJQUFJLENBQUEsRUFBRyxDQUFBLEdBQUksY0FBQSxJQUFrQixPQUFBLEdBQVUsT0FBTyxDQUFBLEVBQUEsRUFBSztBQUMxRCxjQUFBLGFBQUEsQ0FBYyxPQUFBLEVBQVMsS0FBSyxLQUFBLENBQUEsQ0FBTyxlQUFBLEdBQUEsQ0FBbUIsSUFBSSxDQUFBLElBQUssYUFBQSxJQUFpQixHQUFJLENBQUMsQ0FBQTtBQUFBLFlBQ3ZGO0FBQUEsVUFDRjtBQUNBLFVBQUEsZUFBQSxHQUFrQixXQUFBO0FBQUEsUUFDcEI7QUFBQSxNQUNGO0FBRUEsTUFBQSxNQUFNLFdBQUEsR0FBYyxJQUFBLENBQUssS0FBQSxDQUFPLE9BQUEsR0FBVSxRQUFTLEdBQUcsQ0FBQTtBQUN0RCxNQUFBLElBQUksSUFBQSxDQUFLLEdBQUEsQ0FBSSxXQUFBLEdBQWMsUUFBUSxJQUFJLEVBQUEsRUFBSTtBQUN6QyxRQUFBLFFBQUEsR0FBVyxXQUFBO0FBQ1gsUUFBQSxNQUFBLENBQU8sS0FBS0EsSUFBQUEsRUFBSyxDQUFBLFVBQUEsRUFBYSxLQUFLLEtBQUEsQ0FBTSxRQUFRLENBQUMsQ0FBQSxDQUFBLENBQUcsQ0FBQTtBQUFBLE1BQ3ZEO0FBRUEsTUFBQSxNQUFNLGFBQWEsUUFBQSxHQUFXLEdBQUE7QUFDOUIsTUFBQSxJQUFJLFdBQUEsSUFBZSxVQUFBLEdBQWEsYUFBQSxHQUFnQixHQUFBLElBQU8sV0FBVyxLQUFBLEVBQU87QUFDdkUsUUFBQSxRQUFBLElBQVc7QUFBQSxNQUNiO0FBQUEsSUFDRixDQUFBO0FBRUEsSUFBQSxHQUFBLENBQUksV0FBQSxDQUFZLEVBQUEsQ0FBRyxPQUFBLEVBQVMsS0FBSyxDQUFBO0FBQ2pDLElBQUEsTUFBTSxVQUFVLEdBQUcsQ0FBQTtBQUNuQixJQUFBLElBQUk7QUFDRixNQUFBLE1BQU0sSUFBSSxPQUFBLENBQWMsQ0FBQyxDQUFBLEVBQUcsQ0FBQSxLQUFPLENBQUMsUUFBQSxFQUFVLFFBQVEsQ0FBQSxHQUFJLENBQUMsQ0FBQSxFQUFHLENBQUMsQ0FBRSxDQUFBO0FBQUEsSUFDbkUsQ0FBQSxTQUFFO0FBQ0EsTUFBQSxNQUFNLFNBQVMsR0FBRyxDQUFBO0FBQ2xCLE1BQUEsR0FBQSxDQUFJLFdBQUEsQ0FBWSxHQUFBLENBQUksT0FBQSxFQUFTLEtBQUssQ0FBQTtBQUNsQyxNQUFBLE1BQU0sY0FBYyxRQUFBLEVBQVM7QUFBQSxJQUMvQjtBQUVBLElBQUEsSUFBSSxVQUFBLElBQWMsWUFBWSxDQUFBLEVBQUc7QUFDL0IsTUFBQSxNQUFNLFVBQUEsSUFBYyxJQUFJLEtBQUEsQ0FBTSxvQkFBb0IsQ0FBQTtBQUFBLElBQ3BEO0FBRUEsSUFBQSxNQUFNLFlBQVksR0FBQSxFQUFJO0FBQ3RCLElBQUEsTUFBTSxXQUFBLEdBQWMsTUFBTSxRQUFBLENBQVMsTUFBQSxFQUFPO0FBQzFDLElBQUEsTUFBTSxTQUFBLEdBQVluQyxTQUFBQSxDQUFLLE1BQUEsRUFBUSxXQUFXLENBQUE7QUFDMUMsSUFBQXdDLFNBQUEsQ0FBRyxXQUFXLHdCQUF3QixDQUFBO0FBQ3RDLElBQUEsTUFBTSxHQUFBLEdBQU1DLHFCQUFZLGdCQUFBLENBQWlCLFNBQUEsRUFBVyxFQUFFLEtBQUEsRUFBTyxNQUFBLEVBQVEsQ0FBQSxDQUFFLEtBQUEsRUFBTTtBQUM3RSxJQUFBLE1BQU1YLGtCQUFBQSxDQUFVLFdBQVcsR0FBRyxDQUFBO0FBQzlCLElBQUEsTUFBTSxNQUFBLEdBQXVCO0FBQUEsTUFDM0IsT0FBQTtBQUFBLE1BQ0EsT0FBQTtBQUFBLE1BQ0EsS0FBQSxFQUFPLEVBQUUsR0FBRyxXQUFBLEVBQWEsT0FBTyxTQUFBO0FBQVUsS0FDNUM7QUFDQSxJQUFBLE1BQU1BLGtCQUFBQSxDQUFVOUIsVUFBSyxNQUFBLEVBQVEsY0FBYyxHQUFHLElBQUEsQ0FBSyxTQUFBLENBQVUsTUFBTSxDQUFDLENBQUE7QUFDcEUsSUFBQSxNQUFBLENBQU8sSUFBQSxDQUFLbUMsSUFBQUEsRUFBSyxDQUFBLGdCQUFBLEVBQW1CLE9BQU8sQ0FBQSxlQUFBLENBQWlCLENBQUE7QUFBQSxFQUM5RCxDQUFBLFNBQUU7QUFDQSxJQUFBLEdBQUEsQ0FBSSxLQUFBLEVBQU07QUFBQSxFQUNaO0FBQ0Y7OztBQ3hJTyxTQUFTLGtCQUFBLENBQW1CLEtBQWUsTUFBQSxFQUErQjtBQUMvRSxFQUFBLE9BQU8sSUFBSSxPQUFBLENBQVEsQ0FBQyxPQUFBLEtBQVk7QUFDOUIsSUFBQSxNQUFNLE9BQUEsR0FBVSxDQUFDLENBQUEsRUFBbUIsTUFBQSxLQUFtQjtBQUNyRCxNQUFBLElBQUksV0FBVyxvQ0FBQSxFQUFzQztBQUNuRCxRQUFBLEdBQUEsQ0FBSSxHQUFBLENBQUksV0FBVyxPQUFPLENBQUE7QUFDMUIsUUFBQSxPQUFBLEVBQVE7QUFBQSxNQUNWO0FBQUEsSUFDRixDQUFBO0FBQ0EsSUFBQSxHQUFBLENBQUksRUFBQSxDQUFHLFdBQVcsT0FBTyxDQUFBO0FBQ3pCLElBQUEsR0FBQSxDQUFJLFlBQVksZ0NBQUEsRUFBa0M7QUFBQSxNQUNoRCxNQUFBLEVBQVEsU0FBQTtBQUFBLE1BQ1I7QUFBQSxLQUNELENBQUE7QUFBQSxFQUNILENBQUMsQ0FBQTtBQUNIOzs7QUNKQSxJQUFNQSxJQUFBQSxHQUFNLFNBQUE7QUFFWixTQUFTLFVBQVUsSUFBQSxFQUFjO0FBQy9CLEVBQUEsT0FBTyxDQUFBO0FBQUE7QUFBQSxxQkFBQSxFQUVjLElBQUksQ0FBQTtBQUFBLElBQUEsQ0FBQTtBQUUzQjtBQUVBLFNBQVMsZUFBQSxDQUNQLEdBQUEsRUFDQSxLQUFBLEVBQ0EsTUFBQSxFQUNBLFNBQ0EsVUFBQSxFQUNpQjtBQUNqQixFQUFBLE9BQU8sSUFBSSxPQUFBLENBQVEsQ0FBQyxPQUFBLEVBQVMsTUFBQSxLQUFXO0FBQ3RDLElBQUEsTUFBTSxPQUFBLEdBQVUsVUFBQSxDQUFXLE1BQU0sTUFBQSxDQUFPLElBQUksS0FBQSxDQUFNLENBQUEsTUFBQSxFQUFTLFVBQVUsQ0FBQSxjQUFBLENBQWdCLENBQUMsQ0FBQSxFQUFHLEdBQUssQ0FBQTtBQUM5RixJQUFBLE1BQU0sT0FBQSxHQUFVLENBQUMsRUFBQSxFQUFhLEVBQUEsRUFBYSxLQUFBLEtBQXVCO0FBQ2hFLE1BQUEsSUFBSSxPQUFBLENBQVEsS0FBSyxDQUFBLEVBQUc7QUFDcEIsTUFBQSxNQUFNLE1BQUEsR0FBUyxNQUFNLFFBQUEsRUFBUztBQUM5QixNQUFBLE1BQU0sRUFBQSxHQUFLLGVBQUEsQ0FBZ0IsTUFBQSxFQUFRLEtBQUEsQ0FBTSxTQUFTLENBQUE7QUFDbEQsTUFBQSxJQUFJLEVBQUEsS0FBTyxNQUFBLElBQWEsRUFBQSxJQUFNLE9BQUEsRUFBUztBQUN2QyxNQUFBLFlBQUEsQ0FBYSxPQUFPLENBQUE7QUFDcEIsTUFBQSxHQUFBLENBQUksV0FBQSxDQUFZLEdBQUEsQ0FBSSxPQUFBLEVBQVMsT0FBTyxDQUFBO0FBQ3BDLE1BQUEsT0FBQSxDQUFRLE1BQUEsQ0FBTyxLQUFLLE1BQUEsQ0FBTyxNQUFBLEVBQVEsT0FBTyxVQUFBLEVBQVksTUFBQSxHQUFTLEtBQUEsR0FBUSxDQUFDLENBQUMsQ0FBQTtBQUFBLElBQzNFLENBQUE7QUFDQSxJQUFBLEdBQUEsQ0FBSSxXQUFBLENBQVksRUFBQSxDQUFHLE9BQUEsRUFBUyxPQUFPLENBQUE7QUFBQSxFQUNyQyxDQUFDLENBQUE7QUFDSDtBQUVBLGVBQXNCLEtBQUEsQ0FBTSxRQUFnQixPQUFBLEVBQXVDO0FBQ2pGLEVBQUEsTUFBTSxFQUFFLFFBQVEsR0FBQSxFQUFLLEtBQUEsRUFBTyxRQUFRLFFBQUEsRUFBVSxTQUFBLEVBQVcsU0FBUSxHQUFJLE9BQUE7QUFDckUsRUFBQSxJQUFJLFNBQUEsRUFBVztBQUNiLElBQUEsTUFBQSxDQUFPLElBQUEsQ0FBS0EsTUFBSyxzREFBc0QsQ0FBQTtBQUFBLEVBQ3pFO0FBRUEsRUFBQSxNQUFBLENBQU8sSUFBQSxDQUFLQSxNQUFLLENBQUEsWUFBQSxDQUFjLENBQUE7QUFDL0IsRUFBQSxNQUFNSSxjQUFBQSxDQUFNLE1BQUEsRUFBUSxFQUFFLFNBQUEsRUFBVyxNQUFNLENBQUE7QUFFdkMsRUFBQSxNQUFNLEdBQUEsR0FBTSxNQUFNLFVBQUEsQ0FBVyxNQUFBLEVBQVEsT0FBTyxDQUFBO0FBQzVDLEVBQUEsSUFBSTtBQUNGLElBQUEsTUFBTSxHQUFBLEdBQU0sSUFBSSxXQUFBLENBQVksUUFBQTtBQUM1QixJQUFBLEdBQUEsQ0FBSSxPQUFPLEtBQUssQ0FBQTtBQUVoQixJQUFBLEdBQUEsQ0FBSSxXQUFBLENBQVksYUFBYSxHQUFHLENBQUE7QUFDaEMsSUFBQSxNQUFNLFNBQUEsR0FBWSxHQUFBLENBQUksV0FBQSxDQUFZLFNBQUEsQ0FBVSxPQUFPLENBQUMsQ0FBQTtBQUNwRCxJQUFBLE1BQU0sU0FBQSxFQUFXLGlCQUFBLENBQWtCLFNBQUEsQ0FBVSxDQUFDLENBQUMsQ0FBQTtBQUUvQyxJQUFBLElBQUksQ0FBQyxHQUFBLENBQUksV0FBQSxDQUFZLFVBQUEsRUFBVyxFQUFHO0FBQ2pDLE1BQUEsR0FBQSxDQUFJLFlBQVksYUFBQSxFQUFjO0FBQUEsSUFDaEM7QUFFQSxJQUFBLE1BQU0sVUFBVSxHQUFHLENBQUE7QUFFbkIsSUFBQSxNQUFNLFFBQUEsR0FBVyxNQUFNLGVBQUEsQ0FBZ0IsTUFBQSxDQUFPLEVBQUUsS0FBQSxFQUFPLE1BQUEsRUFBUSxHQUFBLEVBQUssT0FBQSxFQUFTLE1BQUEsRUFBUSxTQUFBLEVBQVcsQ0FBQTtBQUNoRyxJQUFBLE1BQU0sS0FBQSxHQUFRLElBQUEsQ0FBSyxJQUFBLENBQUssR0FBQSxHQUFNLFFBQVEsQ0FBQTtBQUN0QyxJQUFBLE1BQU0sZ0JBQWdCLEdBQUEsR0FBTyxHQUFBO0FBQzdCLElBQUEsTUFBTSxlQUFBLEdBQWtCLElBQUEsQ0FBSyxLQUFBLENBQU0sR0FBQSxHQUFZLEdBQUcsQ0FBQTtBQUVsRCxJQUFBLElBQUksT0FBQSxHQUFVLENBQUE7QUFDZCxJQUFBLElBQUksUUFBQSxHQUFXLENBQUE7QUFDZixJQUFBLElBQUksU0FBQTtBQUVKLElBQUEsSUFBSTtBQUNGLE1BQUEsS0FBQSxJQUFTLEtBQUEsR0FBUSxDQUFBLEVBQUcsS0FBQSxHQUFRLEtBQUEsRUFBTyxLQUFBLEVBQUEsRUFBUztBQUMxQyxRQUFBLE1BQU0sT0FBQSxHQUFBLENBQVcsUUFBUSxDQUFBLElBQUssYUFBQTtBQUM5QixRQUFBLE1BQU0sVUFBVSxlQUFBLENBQWdCLEdBQUEsRUFBSyxPQUFPLE1BQUEsRUFBUSxPQUFBLEdBQVUsR0FBRyxLQUFLLENBQUE7QUFFdEUsUUFBQSxNQUFNLGtCQUFBLENBQW1CLEtBQUssYUFBYSxDQUFBO0FBQzNDLFFBQUEsTUFBTSxTQUFBLEVBQVcsaUJBQUEsQ0FBa0IsU0FBQSxDQUFVLGFBQWEsQ0FBQyxDQUFBO0FBRTNELFFBQUEsTUFBTSxTQUFTLE1BQU0sT0FBQTtBQUVyQixRQUFBLElBQUksVUFBVSxDQUFBLEVBQUc7QUFDZixVQUFBLFNBQUEsR0FBWSxNQUFBO0FBQUEsUUFDZDtBQUVBLFFBQUEsTUFBTSxRQUFBLENBQVMsV0FBQSxDQUFZLE1BQUEsRUFBUSxLQUFBLEdBQVEsZUFBZSxDQUFBO0FBQzFELFFBQUEsT0FBQSxFQUFBO0FBRUEsUUFBQSxNQUFNLFdBQUEsR0FBYyxJQUFBLENBQUssS0FBQSxDQUFPLE9BQUEsR0FBVSxRQUFTLEdBQUcsQ0FBQTtBQUN0RCxRQUFBLElBQUksSUFBQSxDQUFLLEdBQUEsQ0FBSSxXQUFBLEdBQWMsUUFBUSxJQUFJLEVBQUEsRUFBSTtBQUN6QyxVQUFBLFFBQUEsR0FBVyxXQUFBO0FBQ1gsVUFBQSxNQUFBLENBQU8sS0FBS0osSUFBQUEsRUFBSyxDQUFBLFVBQUEsRUFBYSxLQUFLLEtBQUEsQ0FBTSxRQUFRLENBQUMsQ0FBQSxDQUFBLENBQUcsQ0FBQTtBQUFBLFFBQ3ZEO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQSxTQUFFO0FBQ0EsTUFBQSxNQUFNLFNBQVMsR0FBRyxDQUFBO0FBQ2xCLE1BQUEsR0FBQSxDQUFJLE1BQUEsRUFBTztBQUFBLElBQ2I7QUFFQSxJQUFBLElBQUksWUFBWSxDQUFBLEVBQUc7QUFDakIsTUFBQSxNQUFNLElBQUksTUFBTSxvQkFBb0IsQ0FBQTtBQUFBLElBQ3RDO0FBRUEsSUFBQSxNQUFNLFdBQUEsR0FBYyxNQUFNLFFBQUEsQ0FBUyxNQUFBLEVBQU87QUFDMUMsSUFBQSxNQUFNLFNBQUEsR0FBWW5DLFNBQUFBLENBQUssTUFBQSxFQUFRLFdBQVcsQ0FBQTtBQUMxQyxJQUFBd0MsU0FBQUEsQ0FBRyxXQUFXLHdCQUF3QixDQUFBO0FBQ3RDLElBQUEsTUFBTSxHQUFBLEdBQU1DLHFCQUFZLGdCQUFBLENBQWlCLFNBQUEsRUFBVyxFQUFFLEtBQUEsRUFBTyxNQUFBLEVBQVEsQ0FBQSxDQUFFLEtBQUEsRUFBTTtBQUM3RSxJQUFBLE1BQU1YLGtCQUFBQSxDQUFVLFdBQVcsR0FBRyxDQUFBO0FBQzlCLElBQUEsTUFBTSxNQUFBLEdBQXVCO0FBQUEsTUFDM0IsT0FBQTtBQUFBLE1BQ0EsT0FBQTtBQUFBLE1BQ0EsS0FBQSxFQUFPLEVBQUUsR0FBRyxXQUFBLEVBQWEsT0FBTyxTQUFBO0FBQVUsS0FDNUM7QUFDQSxJQUFBLE1BQU1BLGtCQUFBQSxDQUFVOUIsVUFBSyxNQUFBLEVBQVEsY0FBYyxHQUFHLElBQUEsQ0FBSyxTQUFBLENBQVUsTUFBTSxDQUFDLENBQUE7QUFDcEUsSUFBQSxNQUFBLENBQU8sSUFBQSxDQUFLbUMsSUFBQUEsRUFBSyxDQUFBLGdCQUFBLEVBQW1CLE9BQU8sQ0FBQSxlQUFBLENBQWlCLENBQUE7QUFBQSxFQUM5RCxDQUFBLFNBQUU7QUFDQSxJQUFBLEdBQUEsQ0FBSSxLQUFBLEVBQU07QUFBQSxFQUNaO0FBQ0Y7OztBQ3JIQSxPQUFBLENBQVEsSUFBQSxDQUFLLE1BQUEsRUFBUSxNQUFNTyxZQUFBLENBQUksTUFBTSxDQUFBO0FBRXJDLElBQU1QLElBQUFBLEdBQU0sT0FBQTtBQUVaLFNBQVMsYUFBQSxHQUFnQjtBQUN2QixFQUFBLE1BQUEsQ0FBTyxLQUFBLENBQU1BLElBQUFBLEVBQUssZUFBQSxFQUFpQk8sWUFBQSxDQUFJLHFCQUFxQixDQUFBO0FBQzlEO0FBRUFBLFlBQUEsQ0FBSSxNQUFNLElBQUEsRUFBSztBQUVmLE9BQUEsQ0FBUSxLQUFBLEVBQU8sT0FBTyxNQUFBLEVBQVEsT0FBQSxLQUFZO0FBQ3hDLEVBQUEsSUFBSTtBQUNGLElBQUFBLFlBQUEsQ0FBSSxFQUFBLENBQUcsbUJBQW1CLGFBQWEsQ0FBQTtBQUN2QyxJQUFBLE1BQU1BLGFBQUksU0FBQSxFQUFVO0FBQ3BCLElBQUEsYUFBQSxFQUFjO0FBQ2QsSUFBQSxNQUFNLE1BQUEsR0FBUyxPQUFBLENBQVEsYUFBQSxHQUFnQixLQUFBLEdBQVEsTUFBQTtBQUMvQyxJQUFBLE1BQU0sTUFBQSxDQUFPLFFBQVEsT0FBTyxDQUFBO0FBQUEsRUFDOUIsQ0FBQSxTQUFFO0FBQ0EsSUFBQUEsWUFBQSxDQUFJLElBQUEsRUFBSztBQUFBLEVBQ1g7QUFDRixDQUFDLENBQUEiLCJmaWxlIjoiYXBwLmNqcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNoaW0gZ2xvYmFscyBpbiBjanMgYnVuZGxlXG4vLyBUaGVyZSdzIGEgd2VpcmQgYnVnIHRoYXQgZXNidWlsZCB3aWxsIGFsd2F5cyBpbmplY3QgaW1wb3J0TWV0YVVybFxuLy8gaWYgd2UgZXhwb3J0IGl0IGFzIGBjb25zdCBpbXBvcnRNZXRhVXJsID0gLi4uIF9fZmlsZW5hbWUgLi4uYFxuLy8gQnV0IHVzaW5nIGEgZnVuY3Rpb24gd2lsbCBub3QgY2F1c2UgdGhpcyBpc3N1ZVxuXG5jb25zdCBnZXRJbXBvcnRNZXRhVXJsID0gKCkgPT4gXG4gIHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIiBcbiAgICA/IG5ldyBVUkwoYGZpbGU6JHtfX2ZpbGVuYW1lfWApLmhyZWYgXG4gICAgOiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1NDUklQVCcpIFxuICAgICAgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyBcbiAgICAgIDogbmV3IFVSTChcIm1haW4uanNcIiwgZG9jdW1lbnQuYmFzZVVSSSkuaHJlZjtcblxuZXhwb3J0IGNvbnN0IGltcG9ydE1ldGFVcmwgPSAvKiBAX19QVVJFX18gKi8gZ2V0SW1wb3J0TWV0YVVybCgpXG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzI1LlxuXG5leHBvcnQgdHlwZSBFbnZQYXJzZXI8VD4gPSAodmFsdWU6IHVua25vd24pID0+IFQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBwZW52PFQ+KG5hbWU6IHN0cmluZywgcGFyc2VyOiBFbnZQYXJzZXI8VD4sIGRlZmF1bHRWYWx1ZTogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBwZW52PFQ+KG5hbWU6IHN0cmluZywgcGFyc2VyOiBFbnZQYXJzZXI8VD4sIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VyKHByb2Nlc3MuZW52W25hbWVdKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMS8zMC5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTnVtYmVyKHg6IHVua25vd24pOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHggPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4geDtcbiAgfVxuICBjb25zdCBudW0gPSBOdW1iZXIoeCk7XG4gIGlmIChOdW1iZXIuaXNOYU4obnVtKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWUgJHt4fSBpcyBub3QgYSB2YWxpZCBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gbnVtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdHJpbmcoeDogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHg7XG4gIHJldHVybiBTdHJpbmcoeCk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBwZW52IH0gZnJvbSBcIi4vZW52XCI7XG5pbXBvcnQgeyBwYXJzZU51bWJlciB9IGZyb20gXCIuL3BhcnNlclwiO1xuXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG5cbmV4cG9ydCBjb25zdCBwdXBMb2dMZXZlbCA9IHBlbnYoXCJQVVBfTE9HX0xFVkVMXCIsIHBhcnNlTnVtYmVyLCAyKTtcbmV4cG9ydCBjb25zdCBwdXBVc2VJbm5lclByb3h5ID0gZW52W1wiUFVQX1VTRV9JTk5FUl9QUk9YWVwiXSA9PT0gXCIxXCI7XG5leHBvcnQgY29uc3QgcHVwRGlzYWJsZUdQVSA9IGVudltcIlBVUF9ESVNBQkxFX0dQVVwiXSA9PT0gXCIxXCI7XG5cbmV4cG9ydCBjb25zdCBwdXBQa2dSb290ID0gZGlybmFtZShyZXF1aXJlLnJlc29sdmUoXCJwdXAtcmVjb3JkZXIvcGFja2FnZS5qc29uXCIpKTtcbmV4cG9ydCBjb25zdCBwdXBBcHAgPSBqb2luKHB1cFBrZ1Jvb3QsIFwiZGlzdFwiLCBcImFwcC5janNcIik7XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA2LlxuXG5pbXBvcnQgeyBDaGlsZFByb2Nlc3MsIHR5cGUgU2VyaWFsaXphYmxlIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHB1cExvZ0xldmVsIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyTGlrZSB7XG4gIGRlYnVnPyh0aGlzOiB2b2lkLCAuLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZDtcblxuICBpbmZvPyh0aGlzOiB2b2lkLCAuLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZDtcblxuICB3YXJuPyh0aGlzOiB2b2lkLCAuLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZDtcblxuICBlcnJvcj8odGhpczogdm9pZCwgLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQ7XG59XG5cbmNvbnN0IERFQlVHID0gXCI8cHVwQGRlYnVnPlwiO1xuY29uc3QgSU5GTyA9IFwiPHB1cEBpbmZvPlwiO1xuY29uc3QgV0FSTiA9IFwiPHB1cEB3YXJuPlwiO1xuY29uc3QgRVJST1IgPSBcIjxwdXBAZXJyb3I+XCI7XG5jb25zdCBGQVRBTCA9IFwiPHB1cEBmYXRhbD5cIjtcblxuZnVuY3Rpb24gc3RhY2tIb29rKHRhcmdldDogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc01ldGhvZERlY29yYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGlzOiBMb2dnZXIsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pIHtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBtZXNzYWdlcy5tYXAoKG1zZykgPT4ge1xuICAgICAgcmV0dXJuIG1zZyBpbnN0YW5jZW9mIEVycm9yID8gKG1zZy5zdGFjayA/PyBTdHJpbmcobXNnKSkgOiBtc2c7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLnByb2Nlc3NlZCk7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBMb2dnZXJMaWtlIHtcbiAgcHJpdmF0ZSBfaW1wbD86IExvZ2dlckxpa2U7XG5cbiAgZ2V0IGxldmVsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsO1xuICB9XG5cbiAgc2V0IGxldmVsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9sZXZlbCA9IHZhbHVlO1xuICAgIHRoaXMuaW1wbCA9IHRoaXMuX2ltcGwgPz8gY29uc29sZTtcbiAgfVxuXG4gIGdldCBpbXBsKCk6IExvZ2dlckxpa2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbXBsO1xuICB9XG5cbiAgc2V0IGltcGwodmFsdWU6IExvZ2dlckxpa2UpIHtcbiAgICBjb25zdCBkZWJ1ZyA9IHZhbHVlLmRlYnVnID8/IGNvbnNvbGUuZGVidWc7XG4gICAgY29uc3QgaW5mbyA9IHZhbHVlLmluZm8gPz8gY29uc29sZS5pbmZvO1xuICAgIGNvbnN0IHdhcm4gPSB2YWx1ZS53YXJuID8/IGNvbnNvbGUud2FybjtcbiAgICBjb25zdCBlcnJvciA9IHZhbHVlLmVycm9yID8/IGNvbnNvbGUuZXJyb3I7XG4gICAgY29uc3QgbHYgPSB0aGlzLl9sZXZlbDtcbiAgICB0aGlzLl9pbXBsID0ge1xuICAgICAgZGVidWc6IGx2ID49IDMgPyBkZWJ1ZyA6IHVuZGVmaW5lZCxcbiAgICAgIGluZm86IGx2ID49IDIgPyBpbmZvIDogdW5kZWZpbmVkLFxuICAgICAgd2FybjogbHYgPj0gMSA/IHdhcm4gOiB1bmRlZmluZWQsXG4gICAgICBlcnJvcjogbHYgPj0gMCA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sZXZlbDogbnVtYmVyID0gcHVwTG9nTGV2ZWwpIHtcbiAgICB0aGlzLmltcGwgPSBjb25zb2xlO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICBkZWJ1ZyguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy5kZWJ1Zz8uKERFQlVHLCAuLi5tZXNzYWdlcyk7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIGluZm8oLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8uaW5mbz8uKElORk8sIC4uLm1lc3NhZ2VzKTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgd2FybiguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy53YXJuPy4oV0FSTiwgLi4ubWVzc2FnZXMpO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICBlcnJvciguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy5lcnJvcj8uKEVSUk9SLCAuLi5tZXNzYWdlcyk7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIGZhdGFsKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/LmVycm9yPy4oRkFUQUwsIC4uLm1lc3NhZ2VzKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoREVCVUcpKSB7XG4gICAgICB0aGlzLmRlYnVnKG1lc3NhZ2Uuc2xpY2UoREVCVUcubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS5zdGFydHNXaXRoKElORk8pKSB7XG4gICAgICB0aGlzLmluZm8obWVzc2FnZS5zbGljZShJTkZPLmxlbmd0aCArIDEpKTtcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2Uuc3RhcnRzV2l0aChXQVJOKSkge1xuICAgICAgdGhpcy53YXJuKG1lc3NhZ2Uuc2xpY2UoV0FSTi5sZW5ndGggKyAxKSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoRVJST1IpKSB7XG4gICAgICB0aGlzLmVycm9yKG1lc3NhZ2Uuc2xpY2UoRVJST1IubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluZm8obWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgYXR0YWNoKHByb2M6IENoaWxkUHJvY2VzcywgbmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGVidWcoYCR7bmFtZX0uYXR0YWNoYCk7XG4gICAgICBsZXQgZmF0YWw6IHN0cmluZyA9IFwiXCI7XG4gICAgICBjb25zdCBkaXNwYXRjaCA9IChkYXRhOiBCdWZmZXIgfCBTZXJpYWxpemFibGUpID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhcnRzV2l0aChGQVRBTCkpIHtcbiAgICAgICAgICBmYXRhbCArPSBtZXNzYWdlLnNsaWNlKEZBVEFMLmxlbmd0aCArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2gobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBwcm9jLnN0ZGVycj8ub24oXCJkYXRhXCIsIGRpc3BhdGNoKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbihcImRhdGFcIiwgZGlzcGF0Y2gpO1xuICAgICAgcHJvY1xuICAgICAgICAub24oXCJtZXNzYWdlXCIsIGRpc3BhdGNoKVxuICAgICAgICAub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgZmF0YWwgKz0gZXJyLm1lc3NhZ2U7XG4gICAgICAgICAgcHJvYy5raWxsKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChjb2RlIHx8IHNpZ25hbCB8fCBmYXRhbCkge1xuICAgICAgICAgICAgZmF0YWwgfHw9IGBjb21tYW5kIGZhaWxlZDogJHtwcm9jLnNwYXduYXJncy5qb2luKFwiIFwiKX1gO1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgJHtuYW1lfS5jbG9zZWAsIHsgY29kZSwgc2lnbmFsLCBmYXRhbCB9KTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZmF0YWwpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgJHtuYW1lfS5jbG9zZWApO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsIChyZWFzb24pID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yKGAke25hbWV9LnVuaGFuZGxlZGAsIHJlYXNvbik7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbihcInVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvcihgJHtuYW1lfS51bmhhbmRsZWRgLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbmV4cG9ydCB7IGxvZ2dlciB9O1xuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8yNC5cblxuZXhwb3J0IGZ1bmN0aW9uIG5vZXJyPEZuIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIEQ+KFxuICBmbjogRm4sXG4gIGRlZmF1bHRWYWx1ZTogRCxcbik6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEZuPikgPT4gUmV0dXJuVHlwZTxGbj4gfCBEIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHJldC5jYXRjaCgoKSA9PiBkZWZhdWx0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMS8zMC5cblxuaW1wb3J0IHsgc3Bhd24sIHR5cGUgQ2hpbGRQcm9jZXNzLCB0eXBlIFNwYXduT3B0aW9ucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBQVVBfQVJHU19LRVkgPSBcIi0tcHVwLXByaXYtYXJnc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyZ3MoKSB7XG4gIGNvbnN0IGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gIGxldCBwcml2ID0gYXJndi5maW5kKChhcmcpID0+IGFyZy5zdGFydHNXaXRoKFBVUF9BUkdTX0tFWSkpO1xuICBpZiAoIXByaXYpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJwcm9jYXJndlwiLCBhcmd2KTtcbiAgICByZXR1cm4gcHJvY2Vzcy5hcmd2O1xuICB9XG4gIGNvbnN0IGFyZ3MgPSBbXCJleGVjXCIsIC4uLmFyZ3Yuc2xpY2UoLTEpXTtcbiAgcHJpdiA9IEJ1ZmZlci5mcm9tKHByaXYuc3BsaXQoXCI9XCIpWzFdISwgXCJiYXNlNjRcIikudG9TdHJpbmcoKTtcbiAgYXJncy5wdXNoKC4uLkpTT04ucGFyc2UocHJpdikpO1xuICBsb2dnZXIuZGVidWcoXCJwdXBhcmdzXCIsIGFyZ3MpO1xuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzSGFuZGxlIHtcbiAgcHJvY2VzczogQ2hpbGRQcm9jZXNzO1xuICB3YWl0OiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjbWQ6IHN0cmluZywgb3B0aW9ucz86IFNwYXduT3B0aW9ucyk6IFByb2Nlc3NIYW5kbGUge1xuICBjb25zdCBwYXJ0cyA9IGNtZC5zcGxpdChcIiBcIikuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCk7XG4gIGNvbnN0IFtjb21tYW5kLCAuLi5hcmdzXSA9IHBhcnRzO1xuICBpZiAoIWNvbW1hbmQpIHRocm93IG5ldyBFcnJvcihcImVtcHR5IGNvbW1hbmRcIik7XG4gIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xuICByZXR1cm4geyBwcm9jZXNzOiBwcm9jLCB3YWl0OiBsb2dnZXIuYXR0YWNoKHByb2MsIGNvbW1hbmQpIH07XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA2LlxuXG5pbXBvcnQgeiBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9GaWxlcyB7XG4gIGNvdmVyOiBzdHJpbmc7XG4gIG1wND86IHN0cmluZztcbiAgd2VibT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0lEVEggPSAxOTIwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSEVJR0hUID0gMTA4MDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZQUyA9IDMwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRFVSQVRJT04gPSA1O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUX0RJUiA9IFwib3V0XCI7XG5leHBvcnQgY29uc3QgVklERU9fRk9STUFUUyA9IFtcIm1wNFwiLCBcIndlYm1cIl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFZpZGVvRm9ybWF0ID0gKHR5cGVvZiBWSURFT19GT1JNQVRTKVtudW1iZXJdO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNWaWRlb0Zvcm1hdChzOiBzdHJpbmcpOiBzIGlzIFZpZGVvRm9ybWF0IHtcbiAgcmV0dXJuIFZJREVPX0ZPUk1BVFMuaW5jbHVkZXMocyBhcyBWaWRlb0Zvcm1hdCk7XG59XG5cbmV4cG9ydCBjb25zdCBSZW5kZXJTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGR1cmF0aW9uOiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVmYXVsdChERUZBVUxUX0RVUkFUSU9OKS5kZXNjcmliZShcIkR1cmF0aW9uIGluIHNlY29uZHNcIiksXG4gIHdpZHRoOiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVmYXVsdChERUZBVUxUX1dJRFRIKS5kZXNjcmliZShcIlZpZGVvIHdpZHRoXCIpLFxuICBoZWlnaHQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKS5kZWZhdWx0KERFRkFVTFRfSEVJR0hUKS5kZXNjcmliZShcIlZpZGVvIGhlaWdodFwiKSxcbiAgZnBzOiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVmYXVsdChERUZBVUxUX0ZQUykuZGVzY3JpYmUoXCJGcmFtZXMgcGVyIHNlY29uZFwiKSxcbiAgZm9ybWF0czogelxuICAgIC5hcnJheSh6LmVudW0oVklERU9fRk9STUFUUykpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVmYXVsdChbXCJtcDRcIl0pXG4gICAgLmRlc2NyaWJlKGBPdXRwdXQgdmlkZW8gZm9ybWF0cywgYWxsb3cgJHtWSURFT19GT1JNQVRTLmpvaW4oXCIsIFwiKX1gKSxcbiAgd2l0aEF1ZGlvOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLmRlZmF1bHQoZmFsc2UpLmRlc2NyaWJlKFwiQ2FwdHVyZSBhbmQgZW5jb2RlIGF1ZGlvXCIpLFxuICBvdXREaXI6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZWZhdWx0KERFRkFVTFRfT1VUX0RJUikuZGVzY3JpYmUoXCJPdXRwdXQgZGlyZWN0b3J5XCIpLFxuICB1c2VJbm5lclByb3h5OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLmRlZmF1bHQoZmFsc2UpLmRlc2NyaWJlKFwiVXNlIGJpbGliaWxpIGlubmVyIHByb3h5IGZvciByZXNvdXJjZSBhY2Nlc3NcIiksXG4gIGRldGVybWluaXN0aWM6IHouYm9vbGVhbigpLm9wdGlvbmFsKCkuZGVmYXVsdChmYWxzZSkuZGVzY3JpYmUoXCJSZW5kZXIgYnkgZnJhbWUgcmF0aGVyIHRoYW4gcmVjb3JkaW5nXCIpLFxufSk7XG5cbmV4cG9ydCB0eXBlIFJlbmRlck9wdGlvbnMgPSB6LmluZmVyPHR5cGVvZiBSZW5kZXJTY2hlbWE+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclJlc3VsdCB7XG4gIG9wdGlvbnM6IFJlbmRlck9wdGlvbnM7XG4gIHdyaXR0ZW46IG51bWJlcjtcbiAgZmlsZXM6IFZpZGVvRmlsZXM7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgcHVwVXNlSW5uZXJQcm94eSB9IGZyb20gXCIuL2Jhc2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi9iYXNlL2xvZ2dpbmdcIjtcbmltcG9ydCB7IG5vZXJyIH0gZnJvbSBcIi4vYmFzZS9ub2VyclwiO1xuaW1wb3J0IHsgcGFyc2VOdW1iZXIsIHBhcnNlU3RyaW5nIH0gZnJvbSBcIi4vYmFzZS9wYXJzZXJcIjtcbmltcG9ydCB7IHBhcmdzIH0gZnJvbSBcIi4vYmFzZS9wcm9jZXNzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0RVUkFUSU9OLFxuICBERUZBVUxUX0ZQUyxcbiAgREVGQVVMVF9IRUlHSFQsXG4gIERFRkFVTFRfT1VUX0RJUixcbiAgREVGQVVMVF9XSURUSCxcbiAgaXNWaWRlb0Zvcm1hdCxcbiAgUmVuZGVyU2NoZW1hLFxuICB0eXBlIFJlbmRlck9wdGlvbnMsXG59IGZyb20gXCIuL3JlbmRlcmVyL3NjaGVtYVwiO1xuXG5leHBvcnQgdHlwZSBDTElDYWxsYmFjayA9IChzb3VyY2U6IHN0cmluZywgb3B0aW9uczogUmVuZGVyT3B0aW9ucykgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1ha2VDTEkobmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ0xJQ2FsbGJhY2spIHtcbiAgY29uc3Qgc2hhcGUgPSBSZW5kZXJTY2hlbWEuc2hhcGU7XG4gIHByb2dyYW1cbiAgICAubmFtZShuYW1lKVxuICAgIC5hcmd1bWVudChcIjxzb3VyY2U+XCIsIFwiZmlsZTovLywgaHR0cChzKTovLywg5oiWIGRhdGE6IFVSSVwiKVxuICAgIC5vcHRpb24oXCItVywgLS13aWR0aCA8bnVtYmVyPlwiLCBzaGFwZS53aWR0aC5kZXNjcmlwdGlvbiwgYCR7REVGQVVMVF9XSURUSH1gKVxuICAgIC5vcHRpb24oXCItSCwgLS1oZWlnaHQgPG51bWJlcj5cIiwgc2hhcGUuaGVpZ2h0LmRlc2NyaXB0aW9uLCBgJHtERUZBVUxUX0hFSUdIVH1gKVxuICAgIC5vcHRpb24oXCItZiwgLS1mcHMgPG51bWJlcj5cIiwgc2hhcGUuZnBzLmRlc2NyaXB0aW9uLCBgJHtERUZBVUxUX0ZQU31gKVxuICAgIC5vcHRpb24oXCItdCwgLS1kdXJhdGlvbiA8bnVtYmVyPlwiLCBzaGFwZS5kdXJhdGlvbi5kZXNjcmlwdGlvbiwgYCR7REVGQVVMVF9EVVJBVElPTn1gKVxuICAgIC5vcHRpb24oXCItbywgLS1vdXQtZGlyIDxwYXRoPlwiLCBzaGFwZS5vdXREaXIuZGVzY3JpcHRpb24sIGAke0RFRkFVTFRfT1VUX0RJUn1gKVxuICAgIC5vcHRpb24oXCItRiwgLS1mb3JtYXRzIDxmb3JtYXRzPlwiLCBzaGFwZS5mb3JtYXRzLmRlc2NyaXB0aW9uLCBcIm1wNFwiKVxuICAgIC5vcHRpb24oXCItYSwgLS13aXRoLWF1ZGlvXCIsIHNoYXBlLndpdGhBdWRpby5kZXNjcmlwdGlvbiwgZmFsc2UpXG4gICAgLm9wdGlvbihcIi0tdXNlLWlubmVyLXByb3h5XCIsIHNoYXBlLnVzZUlubmVyUHJveHkuZGVzY3JpcHRpb24sIHB1cFVzZUlubmVyUHJveHkpXG4gICAgLm9wdGlvbihcIi1kLCAtLWRldGVybWluaXN0aWNcIiwgc2hhcGUuZGV0ZXJtaW5pc3RpYy5kZXNjcmlwdGlvbiwgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAoc291cmNlOiBzdHJpbmcsIG9wdHMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNhbGxiYWNrKHNvdXJjZSwge1xuICAgICAgICAgIHdpZHRoOiBub2VycihwYXJzZU51bWJlciwgREVGQVVMVF9XSURUSCkob3B0cy53aWR0aCksXG4gICAgICAgICAgaGVpZ2h0OiBub2VycihwYXJzZU51bWJlciwgREVGQVVMVF9IRUlHSFQpKG9wdHMuaGVpZ2h0KSxcbiAgICAgICAgICBmcHM6IG5vZXJyKHBhcnNlTnVtYmVyLCBERUZBVUxUX0ZQUykob3B0cy5mcHMpLFxuICAgICAgICAgIGR1cmF0aW9uOiBub2VycihwYXJzZU51bWJlciwgREVGQVVMVF9EVVJBVElPTikob3B0cy5kdXJhdGlvbiksXG4gICAgICAgICAgb3V0RGlyOiBvcHRzLm91dERpciA/PyBERUZBVUxUX09VVF9ESVIsXG4gICAgICAgICAgZm9ybWF0czogcGFyc2VTdHJpbmcob3B0cy5mb3JtYXRzKVxuICAgICAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAgICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKGlzVmlkZW9Gb3JtYXQpLFxuICAgICAgICAgIHdpdGhBdWRpbzogb3B0cy53aXRoQXVkaW8gPz8gZmFsc2UsXG4gICAgICAgICAgdXNlSW5uZXJQcm94eTogb3B0cy51c2VJbm5lclByb3h5ID8/IHB1cFVzZUlubmVyUHJveHksXG4gICAgICAgICAgZGV0ZXJtaW5pc3RpYzogb3B0cy5kZXRlcm1pbmlzdGljID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmZhdGFsKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMocGFyZ3MoKSk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAxLzMwLlxuXG5leHBvcnQgY2xhc3MgQ29uY3VycmVuY3lMaW1pdGVyIHtcbiAgcHJpdmF0ZSBfYWN0aXZlID0gMDtcbiAgcHJpdmF0ZSBfcXVldWU6IFZvaWRGdW5jdGlvbltdID0gW107XG4gIHByaXZhdGUgX2VuZGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgbWF4Q29uY3VycmVuY3k6IG51bWJlcikge31cblxuICBnZXQgYWN0aXZlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBzdGF0cygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYWN0aXZlOiAke3RoaXMuYWN0aXZlfSwgcGVuZGluZzogJHt0aGlzLnBlbmRpbmd9YDtcbiAgfVxuXG4gIGFzeW5jIHNjaGVkdWxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbmRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJ1biA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fYWN0aXZlKys7XG4gICAgICAgIGZuKClcbiAgICAgICAgICAudGhlbigodikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlLS07XG4gICAgICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZS0tO1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5fcXVldWUucHVzaChydW4pO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBlbmQoKSB7XG4gICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2VuZGVkID0gdHJ1ZTtcbiAgICB3aGlsZSAodGhpcy5fYWN0aXZlID4gMCB8fCB0aGlzLnBlbmRpbmcgPiAwKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbmV4dCgpIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlIDwgdGhpcy5tYXhDb25jdXJyZW5jeSkge1xuICAgICAgdGhpcy5fcXVldWUuc2hpZnQoKT8uKCk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAzLzIxLlxuXG5pbXBvcnQge1xuICBDb2RlYyxcbiAgQ29kZWNDb250ZXh0LFxuICBGRm1wZWdFcnJvcixcbiAgRmlsdGVyLFxuICBGaWx0ZXJHcmFwaCxcbiAgRmlsdGVySW5PdXQsXG4gIEZyYW1lLFxuICBQYWNrZXQsXG4gIFJhdGlvbmFsLFxuICB0eXBlIEZpbHRlckNvbnRleHQsXG59IGZyb20gXCJub2RlLWF2XCI7XG5pbXBvcnQge1xuICBBVl9DSEFOTkVMX0xBWU9VVF9TVEVSRU8sXG4gIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUixcbiAgQVZfU0FNUExFX0ZNVF9GTFQsXG4gIEFWX1NBTVBMRV9GTVRfRkxUUCxcbiAgQVZFUlJPUl9FQUdBSU4sXG4gIEFWRVJST1JfRU9GLFxuICB0eXBlIEZGQXVkaW9FbmNvZGVyLFxufSBmcm9tIFwibm9kZS1hdi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgRm9ybWF0TXV4ZXIgfSBmcm9tIFwiLi9tdXhlclwiO1xuXG5jb25zdCBTQU1QTEVfRk1UX05BTUU6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIFtBVl9TQU1QTEVfRk1UX0ZMVF06IFwiZmx0XCIsXG4gIFtBVl9TQU1QTEVfRk1UX0ZMVFBdOiBcImZsdHBcIixcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9FbmNvZGVyT3B0aW9ucyB7XG4gIG91dFNhbXBsZVJhdGU6IG51bWJlcjtcbiAgb3V0U2FtcGxlRm10OiB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFQgfCB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFRQO1xuICBjb2RlY05hbWU6IEZGQXVkaW9FbmNvZGVyO1xuICBnbG9iYWxIZWFkZXI6IGJvb2xlYW47XG4gIGJpdHJhdGU6IG51bWJlcjtcbiAgbXV4ZXI6IEZvcm1hdE11eGVyO1xufVxuXG50eXBlIFN0cmVhbSA9IFJldHVyblR5cGU8aW1wb3J0KFwibm9kZS1hdlwiKS5Gb3JtYXRDb250ZXh0W1wibmV3U3RyZWFtXCJdPjtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRW5jb2RlciBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdHg6IENvZGVjQ29udGV4dDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RyZWFtOiBTdHJlYW07XG4gIHByaXZhdGUgcmVhZG9ubHkgX291dFJhdGU6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfb3V0Rm10OiB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFQgfCB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFRQO1xuICBwcml2YXRlIHJlYWRvbmx5IF9mcmFtZVNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGt0OiBQYWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlckZyYW1lOiBGcmFtZTtcblxuICBwcml2YXRlIF9ncmFwaD86IEZpbHRlckdyYXBoO1xuICBwcml2YXRlIF9idWZTcmM/OiBGaWx0ZXJDb250ZXh0O1xuICBwcml2YXRlIF9idWZTaW5rPzogRmlsdGVyQ29udGV4dDtcbiAgcHJpdmF0ZSBfaW5SYXRlPzogbnVtYmVyO1xuICBwdHMgPSAwbjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGN0eDogQ29kZWNDb250ZXh0LCBzdHJlYW06IFN0cmVhbSwgb3V0Rm10OiB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFQgfCB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFRQKSB7XG4gICAgdGhpcy5fY3R4ID0gY3R4O1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9vdXRSYXRlID0gY3R4LnNhbXBsZVJhdGU7XG4gICAgdGhpcy5fb3V0Rm10ID0gb3V0Rm10O1xuICAgIHRoaXMuX2ZyYW1lU2l6ZSA9IGN0eC5mcmFtZVNpemU7XG5cbiAgICB0aGlzLl9wa3QgPSBuZXcgUGFja2V0KCk7XG4gICAgdGhpcy5fcGt0LmFsbG9jKCk7XG5cbiAgICB0aGlzLl9maWx0ZXJGcmFtZSA9IG5ldyBGcmFtZSgpO1xuICAgIHRoaXMuX2ZpbHRlckZyYW1lLmFsbG9jKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlKG9wdHM6IEF1ZGlvRW5jb2Rlck9wdGlvbnMpOiBQcm9taXNlPEF1ZGlvRW5jb2Rlcj4ge1xuICAgIGNvbnN0IHsgb3V0U2FtcGxlUmF0ZSwgb3V0U2FtcGxlRm10LCBjb2RlY05hbWUsIGdsb2JhbEhlYWRlciwgYml0cmF0ZSwgbXV4ZXIgfSA9IG9wdHM7XG5cbiAgICBjb25zdCBjb2RlYyA9IENvZGVjLmZpbmRFbmNvZGVyQnlOYW1lKGNvZGVjTmFtZSk7XG4gICAgaWYgKCFjb2RlYykgdGhyb3cgbmV3IEVycm9yKGBBdWRpbyBlbmNvZGVyIG5vdCBmb3VuZDogJHtjb2RlY05hbWV9YCk7XG5cbiAgICBjb25zdCBjdHggPSBuZXcgQ29kZWNDb250ZXh0KCk7XG4gICAgY3R4LmFsbG9jQ29udGV4dDMoY29kZWMpO1xuICAgIGN0eC5jb2RlY0lkID0gY29kZWMuaWQ7XG4gICAgY3R4LnNhbXBsZUZvcm1hdCA9IG91dFNhbXBsZUZtdDtcbiAgICBjdHguc2FtcGxlUmF0ZSA9IG91dFNhbXBsZVJhdGU7XG4gICAgY3R4LmNoYW5uZWxMYXlvdXQgPSBBVl9DSEFOTkVMX0xBWU9VVF9TVEVSRU87XG4gICAgY3R4LnRpbWVCYXNlID0gbmV3IFJhdGlvbmFsKDEsIG91dFNhbXBsZVJhdGUpO1xuICAgIGN0eC5iaXRSYXRlID0gQmlnSW50KGJpdHJhdGUpO1xuICAgIGlmIChnbG9iYWxIZWFkZXIpIGN0eC5zZXRGbGFncyhBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCBjdHgub3BlbjIoY29kZWMsIG51bGwpLCBcImF1ZGlvQ3R4Lm9wZW4yXCIpO1xuXG4gICAgY29uc3Qgc3RyZWFtID0gbXV4ZXIuYWRkU3RyZWFtKGN0eCk7XG4gICAgcmV0dXJuIG5ldyBBdWRpb0VuY29kZXIoY3R4LCBzdHJlYW0sIG91dFNhbXBsZUZtdCk7XG4gIH1cblxuICAvKiogQ2FsbGVkIG9uY2Ugd2hlbiBhdWRpby1tZXRhIGFycml2ZXMgd2l0aCB0aGUgcGFnZSdzIGFjdHVhbCBzYW1wbGUgcmF0ZS4gKi9cbiAgc2V0SW5wdXRSYXRlKGluU2FtcGxlUmF0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzcG9zZUdyYXBoKCk7XG4gICAgdGhpcy5faW5SYXRlID0gaW5TYW1wbGVSYXRlO1xuXG4gICAgY29uc3QgZ3JhcGggPSBuZXcgRmlsdGVyR3JhcGgoKTtcbiAgICBncmFwaC5hbGxvYygpO1xuXG4gICAgLy8gYWJ1ZmZlciBzb3VyY2U6IGludGVybGVhdmVkIHN0ZXJlbyBmbG9hdCBmcm9tIGJyb3dzZXJcbiAgICBjb25zdCBhYnVmZmVyID0gRmlsdGVyLmdldEJ5TmFtZShcImFidWZmZXJcIikhO1xuICAgIGNvbnN0IHNyY0FyZ3MgPSBgc2FtcGxlX3JhdGU9JHtpblNhbXBsZVJhdGV9OnNhbXBsZV9mbXQ9Zmx0OmNoYW5uZWxfbGF5b3V0PXN0ZXJlbzp0aW1lX2Jhc2U9MS8ke2luU2FtcGxlUmF0ZX1gO1xuICAgIGNvbnN0IGJ1ZlNyYyA9IGdyYXBoLmNyZWF0ZUZpbHRlcihhYnVmZmVyLCBcInNyY1wiLCBzcmNBcmdzKTtcbiAgICBpZiAoIWJ1ZlNyYykgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBhYnVmZmVyXCIpO1xuXG4gICAgLy8gYWJ1ZmZlcnNpbmtcbiAgICBjb25zdCBhYnVmZmVyc2luayA9IEZpbHRlci5nZXRCeU5hbWUoXCJhYnVmZmVyc2lua1wiKSE7XG4gICAgY29uc3QgYnVmU2luayA9IGdyYXBoLmNyZWF0ZUZpbHRlcihhYnVmZmVyc2luaywgXCJzaW5rXCIpO1xuICAgIGlmICghYnVmU2luaykgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBhYnVmZmVyc2lua1wiKTtcblxuICAgIC8vIFBhcnNlIGZpbHRlciBjaGFpbjogYWZvcm1hdCArIGFzZXRuc2FtcGxlc1xuICAgIGNvbnN0IGZtdE5hbWUgPSBTQU1QTEVfRk1UX05BTUVbdGhpcy5fb3V0Rm10XSA/PyBcImZsdFwiO1xuICAgIGNvbnN0IGZpbHRlckRlc2MgPSBgYWZvcm1hdD1zYW1wbGVfZm10cz0ke2ZtdE5hbWV9OnNhbXBsZV9yYXRlcz0ke3RoaXMuX291dFJhdGV9OmNoYW5uZWxfbGF5b3V0cz1zdGVyZW8sYXNldG5zYW1wbGVzPW49JHt0aGlzLl9mcmFtZVNpemV9OnA9MWA7XG5cbiAgICBjb25zdCBvdXRwdXRzID0gRmlsdGVySW5PdXQuY3JlYXRlTGlzdChbeyBuYW1lOiBcImluXCIsIGZpbHRlckN0eDogYnVmU3JjLCBwYWRJZHg6IDAgfV0pO1xuICAgIGNvbnN0IGlucHV0cyA9IEZpbHRlckluT3V0LmNyZWF0ZUxpc3QoW3sgbmFtZTogXCJvdXRcIiwgZmlsdGVyQ3R4OiBidWZTaW5rLCBwYWRJZHg6IDAgfV0pO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihncmFwaC5wYXJzZVB0cihmaWx0ZXJEZXNjLCBpbnB1dHMsIG91dHB1dHMpLCBcImdyYXBoLnBhcnNlUHRyXCIpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihncmFwaC5jb25maWdTeW5jKCksIFwiZ3JhcGguY29uZmlnXCIpO1xuXG4gICAgdGhpcy5fZ3JhcGggPSBncmFwaDtcbiAgICB0aGlzLl9idWZTcmMgPSBidWZTcmM7XG4gICAgdGhpcy5fYnVmU2luayA9IGJ1ZlNpbms7XG4gIH1cblxuICBnZXQgc3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW07XG4gIH1cbiAgZ2V0IHRpbWVCYXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9jdHgudGltZUJhc2U7XG4gIH1cblxuICBhc3luYyBlbmNvZGUocGNtOiBCdWZmZXIsIG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5fYnVmU3JjIHx8ICF0aGlzLl9idWZTaW5rIHx8ICF0aGlzLl9pblJhdGUpIHJldHVybjtcblxuICAgIC8vIEluLXBsYWNlIHNhbml0aXplIOKAlCBtdXRhdGUgc291cmNlIGRpcmVjdGx5LCBubyBjb3B5XG4gICAgY29uc3Qgc3JjID0gbmV3IEZsb2F0MzJBcnJheShwY20uYnVmZmVyLCBwY20uYnl0ZU9mZnNldCwgcGNtLmJ5dGVMZW5ndGggLyA0KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFpc0Zpbml0ZShzcmNbaV0hKSkgc3JjW2ldID0gMDtcbiAgICB9XG4gICAgY29uc3QgblNhbXBsZXMgPSBzcmMubGVuZ3RoID4+IDE7XG5cbiAgICB1c2luZyBmcmFtZSA9IEZyYW1lLmZyb21BdWRpb0J1ZmZlcihCdWZmZXIuZnJvbShzcmMuYnVmZmVyLCBzcmMuYnl0ZU9mZnNldCwgc3JjLmJ5dGVMZW5ndGgpLCB7XG4gICAgICBuYlNhbXBsZXM6IG5TYW1wbGVzLFxuICAgICAgZm9ybWF0OiBBVl9TQU1QTEVfRk1UX0ZMVCxcbiAgICAgIHNhbXBsZVJhdGU6IHRoaXMuX2luUmF0ZSxcbiAgICAgIGNoYW5uZWxMYXlvdXQ6IEFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTyxcbiAgICAgIHB0czogdGhpcy5wdHMsXG4gICAgICB0aW1lQmFzZTogeyBudW06IDEsIGRlbjogdGhpcy5faW5SYXRlIH0sXG4gICAgfSk7XG4gICAgdGhpcy5wdHMgKz0gQmlnSW50KG5TYW1wbGVzKTtcblxuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9idWZTcmMuYnVmZmVyc3JjQWRkRnJhbWUoZnJhbWUpLCBcImJ1ZmZlcnNyY0FkZEZyYW1lXCIpO1xuICAgIGF3YWl0IHRoaXMuX2RyYWluRmlsdGVyKG11eGVyKTtcbiAgfVxuXG4gIGFzeW5jIGZsdXNoKG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9idWZTcmMgJiYgdGhpcy5fYnVmU2luaykge1xuICAgICAgLy8gU2lnbmFsIEVPRiB0byBmaWx0ZXIgZ3JhcGhcbiAgICAgIGF3YWl0IHRoaXMuX2J1ZlNyYy5idWZmZXJzcmNBZGRGcmFtZShudWxsKTtcbiAgICAgIGF3YWl0IHRoaXMuX2RyYWluRmlsdGVyKG11eGVyKTtcbiAgICB9XG4gICAgLy8gRmx1c2ggY29kZWNcbiAgICBhd2FpdCB0aGlzLl9jdHguc2VuZEZyYW1lKG51bGwpO1xuICAgIGF3YWl0IHRoaXMuX2RyYWluQ29kZWMobXV4ZXIpO1xuICB9XG5cbiAgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wa3QuZnJlZSgpO1xuICAgIHRoaXMuX2ZpbHRlckZyYW1lLmZyZWUoKTtcbiAgICB0aGlzLl9kaXNwb3NlR3JhcGgoKTtcbiAgICB0aGlzLl9jdHguZnJlZUNvbnRleHQoKTtcbiAgfVxuXG4gIC8qKiBEcmFpbiBmaWx0ZXIg4oaSIHNlbmQgdG8gY29kZWMg4oaSIGRyYWluIGNvZGVjIHBhY2tldHMuICovXG4gIHByaXZhdGUgYXN5bmMgX2RyYWluRmlsdGVyKG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG91dEZyYW1lID0gdGhpcy5fZmlsdGVyRnJhbWU7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLl9idWZTaW5rIS5idWZmZXJzaW5rR2V0RnJhbWUob3V0RnJhbWUpO1xuICAgICAgaWYgKHIgPT09IEFWRVJST1JfRUFHQUlOIHx8IHIgPT09IEFWRVJST1JfRU9GKSBicmVhaztcbiAgICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihyLCBcImJ1ZmZlcnNpbmtHZXRGcmFtZVwiKTtcbiAgICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9jdHguc2VuZEZyYW1lKG91dEZyYW1lKSwgXCJhdWRpb0N0eC5zZW5kRnJhbWVcIik7XG4gICAgICBvdXRGcmFtZS51bnJlZigpO1xuICAgICAgYXdhaXQgdGhpcy5fZHJhaW5Db2RlYyhtdXhlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqIERyYWluIGNvZGVjIHBhY2tldHMgdG8gbXV4ZXIuICovXG4gIHByaXZhdGUgYXN5bmMgX2RyYWluQ29kZWMobXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGt0ID0gdGhpcy5fcGt0O1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5fY3R4LnJlY2VpdmVQYWNrZXQocGt0KTtcbiAgICAgIGlmIChyID09PSBBVkVSUk9SX0VBR0FJTiB8fCByID09PSBBVkVSUk9SX0VPRikgYnJlYWs7XG4gICAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IociwgXCJhdWRpby5yZWNlaXZlUGFja2V0XCIpO1xuICAgICAgcGt0LnN0cmVhbUluZGV4ID0gdGhpcy5fc3RyZWFtLmluZGV4O1xuICAgICAgcGt0LnJlc2NhbGVUcyh0aGlzLl9jdHgudGltZUJhc2UsIHRoaXMuX3N0cmVhbS50aW1lQmFzZSk7XG4gICAgICBhd2FpdCBtdXhlci53cml0ZVBhY2tldChwa3QpO1xuICAgICAgcGt0LnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGlzcG9zZUdyYXBoKCk6IHZvaWQge1xuICAgIC8vIEZpbHRlckdyYXBoLmZyZWUoKSByZWxlYXNlcyBhbGwgY29udGFpbmVkIGZpbHRlciBjb250ZXh0c1xuICAgIHRoaXMuX2dyYXBoPy5bU3ltYm9sLmRpc3Bvc2VdKCk7XG4gICAgdGhpcy5fZ3JhcGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fYnVmU3JjID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2J1ZlNpbmsgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvZGVjQ29udGV4dCwgRkZtcGVnRXJyb3IsIEZvcm1hdENvbnRleHQsIFBhY2tldCB9IGZyb20gXCJub2RlLWF2XCI7XG5cbmV4cG9ydCBjbGFzcyBGb3JtYXRNdXhlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N0eDogRm9ybWF0Q29udGV4dDtcbiAgcHJpdmF0ZSBfb3BlbmVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Iob3V0UGF0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3R4ID0gbmV3IEZvcm1hdENvbnRleHQoKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IodGhpcy5fY3R4LmFsbG9jT3V0cHV0Q29udGV4dDIobnVsbCwgbnVsbCwgb3V0UGF0aCksIFwiYWxsb2NPdXRwdXRDb250ZXh0MlwiKTtcbiAgfVxuXG4gIGFkZFN0cmVhbShjb2RlY0N0eDogQ29kZWNDb250ZXh0LCBjb2RlY1RhZz86IHN0cmluZyk6IFJldHVyblR5cGU8Rm9ybWF0Q29udGV4dFtcIm5ld1N0cmVhbVwiXT4ge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX2N0eC5uZXdTdHJlYW0obnVsbCk7XG4gICAgc3RyZWFtLnRpbWVCYXNlID0gY29kZWNDdHgudGltZUJhc2U7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHN0cmVhbS5jb2RlY3Bhci5mcm9tQ29udGV4dChjb2RlY0N0eCksIFwiY29kZWNwYXIuZnJvbUNvbnRleHRcIik7XG4gICAgaWYgKGNvZGVjVGFnKSBzdHJlYW0uY29kZWNwYXIuY29kZWNUYWcgPSBjb2RlY1RhZztcbiAgICByZXR1cm4gc3RyZWFtO1xuICB9XG5cbiAgYXN5bmMgb3BlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fb3BlbmVkKSByZXR1cm47XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHRoaXMuX2N0eC5vcGVuT3V0cHV0KCksIFwib3Blbk91dHB1dFwiKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fY3R4LndyaXRlSGVhZGVyKG51bGwpLCBcIndyaXRlSGVhZGVyXCIpO1xuICAgIHRoaXMuX29wZW5lZCA9IHRydWU7XG4gIH1cblxuICBhc3luYyB3cml0ZVBhY2tldChwa3Q6IFBhY2tldCk6IFByb21pc2U8dm9pZD4ge1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9jdHguaW50ZXJsZWF2ZWRXcml0ZUZyYW1lKHBrdCksIFwiaW50ZXJsZWF2ZWRXcml0ZUZyYW1lXCIpO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5fb3BlbmVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5fY3R4LndyaXRlVHJhaWxlcigpO1xuICAgIGF3YWl0IHRoaXMuX2N0eC5jbG9zZU91dHB1dCgpO1xuICAgIHRoaXMuX29wZW5lZCA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKCk7XG4gICAgYXdhaXQgdGhpcy5fY3R4W1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDMvMjEuXG5cbmltcG9ydCB7IENvZGVjLCBDb2RlY0NvbnRleHQsIEZGbXBlZ0Vycm9yLCBGcmFtZSwgUGFja2V0LCBSYXRpb25hbCwgU29mdHdhcmVTY2FsZUNvbnRleHQgfSBmcm9tIFwibm9kZS1hdlwiO1xuaW1wb3J0IHtcbiAgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSLFxuICBBVl9QSVhfRk1UX0JHUkEsXG4gIEFWX1BJWF9GTVRfWVVWNDIwUCxcbiAgQVZfUElYX0ZNVF9ZVVZBNDIwUCxcbiAgQVZFUlJPUl9FQUdBSU4sXG4gIEFWRVJST1JfRU9GLFxuICBTV1NfQklMSU5FQVIsXG4gIHR5cGUgRkZWaWRlb0VuY29kZXIsXG59IGZyb20gXCJub2RlLWF2L2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBGb3JtYXRNdXhlciB9IGZyb20gXCIuL211eGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9FbmNvZGVyT3B0aW9ucyB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBmcHM6IG51bWJlcjtcbiAgY29kZWNOYW1lOiBGRlZpZGVvRW5jb2RlcjtcbiAgcGl4Rm10OiB0eXBlb2YgQVZfUElYX0ZNVF9ZVVZBNDIwUCB8IHR5cGVvZiBBVl9QSVhfRk1UX1lVVjQyMFA7XG4gIGNvZGVjVGFnPzogc3RyaW5nO1xuICBnbG9iYWxIZWFkZXI6IGJvb2xlYW47XG4gIGNvZGVjT3B0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgYml0cmF0ZTogbnVtYmVyO1xuICBtdXhlcjogRm9ybWF0TXV4ZXI7XG59XG5cbnR5cGUgU3RyZWFtID0gUmV0dXJuVHlwZTxpbXBvcnQoXCJub2RlLWF2XCIpLkZvcm1hdENvbnRleHRbXCJuZXdTdHJlYW1cIl0+O1xuXG5leHBvcnQgY2xhc3MgVmlkZW9FbmNvZGVyIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N0eDogQ29kZWNDb250ZXh0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9zd3M6IFNvZnR3YXJlU2NhbGVDb250ZXh0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9zcmM6IEZyYW1lO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kc3Q6IEZyYW1lO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wa3Q6IFBhY2tldDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RyZWFtOiBTdHJlYW07XG4gIHB0cyA9IDBuO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgY3R4OiBDb2RlY0NvbnRleHQsXG4gICAgc3dzOiBTb2Z0d2FyZVNjYWxlQ29udGV4dCxcbiAgICBzcmM6IEZyYW1lLFxuICAgIGRzdDogRnJhbWUsXG4gICAgcGt0OiBQYWNrZXQsXG4gICAgc3RyZWFtOiBTdHJlYW0sXG4gICkge1xuICAgIHRoaXMuX2N0eCA9IGN0eDtcbiAgICB0aGlzLl9zd3MgPSBzd3M7XG4gICAgdGhpcy5fc3JjID0gc3JjO1xuICAgIHRoaXMuX2RzdCA9IGRzdDtcbiAgICB0aGlzLl9wa3QgPSBwa3Q7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZShvcHRzOiBWaWRlb0VuY29kZXJPcHRpb25zKTogUHJvbWlzZTxWaWRlb0VuY29kZXI+IHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGZwcywgY29kZWNOYW1lLCBwaXhGbXQsIGNvZGVjVGFnLCBnbG9iYWxIZWFkZXIsIGNvZGVjT3B0cywgYml0cmF0ZSwgbXV4ZXIgfSA9IG9wdHM7XG5cbiAgICBjb25zdCBjb2RlYyA9IENvZGVjLmZpbmRFbmNvZGVyQnlOYW1lKGNvZGVjTmFtZSk7XG4gICAgaWYgKCFjb2RlYykgdGhyb3cgbmV3IEVycm9yKGBWaWRlbyBlbmNvZGVyIG5vdCBmb3VuZDogJHtjb2RlY05hbWV9YCk7XG5cbiAgICBjb25zdCBjdHggPSBuZXcgQ29kZWNDb250ZXh0KCk7XG4gICAgY3R4LmFsbG9jQ29udGV4dDMoY29kZWMpO1xuICAgIGN0eC5jb2RlY0lkID0gY29kZWMuaWQ7XG4gICAgY3R4LndpZHRoID0gd2lkdGg7XG4gICAgY3R4LmhlaWdodCA9IGhlaWdodDtcbiAgICBjdHgucGl4ZWxGb3JtYXQgPSBwaXhGbXQ7XG4gICAgY3R4LnRpbWVCYXNlID0gbmV3IFJhdGlvbmFsKDEsIGZwcyk7XG4gICAgY3R4LmZyYW1lcmF0ZSA9IG5ldyBSYXRpb25hbChmcHMsIDEpO1xuICAgIGN0eC5nb3BTaXplID0gZnBzO1xuICAgIGN0eC5iaXRSYXRlID0gQmlnSW50KGJpdHJhdGUpO1xuICAgIGN0eC5zZXRPcHRpb24oXCJ0aHJlYWRzXCIsIFwiNFwiKTtcbiAgICBpZiAoZ2xvYmFsSGVhZGVyKSBjdHguc2V0RmxhZ3MoQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhjb2RlY09wdHMpKSBjdHguc2V0T3B0aW9uKGssIHYpO1xuICAgIGlmIChjb2RlY1RhZykgY3R4LmNvZGVjVGFnID0gY29kZWNUYWc7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IGN0eC5vcGVuMihjb2RlYywgbnVsbCksIFwidmlkZW9DdHgub3BlbjJcIik7XG5cbiAgICBjb25zdCBzd3MgPSBuZXcgU29mdHdhcmVTY2FsZUNvbnRleHQoKTtcbiAgICBzd3MuZ2V0Q29udGV4dCh3aWR0aCwgaGVpZ2h0LCBBVl9QSVhfRk1UX0JHUkEsIHdpZHRoLCBoZWlnaHQsIHBpeEZtdCwgU1dTX0JJTElORUFSKTtcblxuICAgIGNvbnN0IGRzdCA9IG5ldyBGcmFtZSgpO1xuICAgIGRzdC5hbGxvYygpO1xuICAgIGRzdC5mb3JtYXQgPSBwaXhGbXQ7XG4gICAgZHN0LndpZHRoID0gd2lkdGg7XG4gICAgZHN0LmhlaWdodCA9IGhlaWdodDtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoZHN0LmdldEJ1ZmZlcigwKSwgXCJkc3RGcmFtZS5nZXRCdWZmZXJcIik7XG5cbiAgICAvLyBQcmUtYWxsb2NhdGUgc3JjIGZyYW1lIChCR1JBLCByZXVzZWQgZXZlcnkgZW5jb2RlKVxuICAgIGNvbnN0IHNyYyA9IG5ldyBGcmFtZSgpO1xuICAgIHNyYy5hbGxvYygpO1xuICAgIHNyYy5mb3JtYXQgPSBBVl9QSVhfRk1UX0JHUkE7XG4gICAgc3JjLndpZHRoID0gd2lkdGg7XG4gICAgc3JjLmhlaWdodCA9IGhlaWdodDtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3Ioc3JjLmdldEJ1ZmZlcigwKSwgXCJzcmNGcmFtZS5nZXRCdWZmZXJcIik7XG5cbiAgICAvLyBQcmUtYWxsb2NhdGUgcmV1c2FibGUgcGFja2V0XG4gICAgY29uc3QgcGt0ID0gbmV3IFBhY2tldCgpO1xuICAgIHBrdC5hbGxvYygpO1xuXG4gICAgY29uc3Qgc3RyZWFtID0gbXV4ZXIuYWRkU3RyZWFtKGN0eCwgY29kZWNUYWcpO1xuICAgIHJldHVybiBuZXcgVmlkZW9FbmNvZGVyKGN0eCwgc3dzLCBzcmMsIGRzdCwgcGt0LCBzdHJlYW0pO1xuICB9XG5cbiAgZ2V0IHN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtO1xuICB9XG4gIGdldCB0aW1lQmFzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3R4LnRpbWVCYXNlO1xuICB9XG5cbiAgYXN5bmMgZW5jb2RlKGJncmE6IEJ1ZmZlciwgbXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBfc3JjOiBzcmMsIF9kc3Q6IGRzdCwgX3N3czogc3dzIH0gPSB0aGlzO1xuXG4gICAgLy8gUmV1c2Ugc3JjIGZyYW1lOiBtYWtlV3JpdGFibGUgKyBmcm9tQnVmZmVyICsgcHRzXG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHNyYy5tYWtlV3JpdGFibGUoKSwgXCJzcmMubWFrZVdyaXRhYmxlXCIpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihzcmMuZnJvbUJ1ZmZlcihiZ3JhKSwgXCJzcmMuZnJvbUJ1ZmZlclwiKTtcbiAgICBzcmMucHRzID0gdGhpcy5wdHM7XG5cbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoZHN0Lm1ha2VXcml0YWJsZSgpLCBcImRzdC5tYWtlV3JpdGFibGVcIik7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHN3cy5zY2FsZUZyYW1lKGRzdCwgc3JjKSwgXCJzd3Muc2NhbGVGcmFtZVwiKTtcblxuICAgIGRzdC5wdHMgPSB0aGlzLnB0cysrO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9jdHguc2VuZEZyYW1lKGRzdCksIFwidmlkZW9DdHguc2VuZEZyYW1lXCIpO1xuICAgIGF3YWl0IHRoaXMuZHJhaW4obXV4ZXIpO1xuICB9XG5cbiAgYXN5bmMgZmx1c2gobXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5fY3R4LnNlbmRGcmFtZShudWxsKTtcbiAgICBhd2FpdCB0aGlzLmRyYWluKG11eGVyKTtcbiAgfVxuXG4gIFtTeW1ib2wuZGlzcG9zZV0oKTogdm9pZCB7XG4gICAgdGhpcy5fcGt0LmZyZWUoKTtcbiAgICB0aGlzLl9zcmMuZnJlZSgpO1xuICAgIHRoaXMuX2RzdC5mcmVlKCk7XG4gICAgdGhpcy5fc3dzW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgIHRoaXMuX2N0eC5mcmVlQ29udGV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmFpbihtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwa3QgPSB0aGlzLl9wa3Q7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLl9jdHgucmVjZWl2ZVBhY2tldChwa3QpO1xuICAgICAgaWYgKHIgPT09IEFWRVJST1JfRUFHQUlOIHx8IHIgPT09IEFWRVJST1JfRU9GKSBicmVhaztcbiAgICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihyLCBcInZpZGVvLnJlY2VpdmVQYWNrZXRcIik7XG4gICAgICBwa3Quc3RyZWFtSW5kZXggPSB0aGlzLl9zdHJlYW0uaW5kZXg7XG4gICAgICBwa3QucmVzY2FsZVRzKHRoaXMuX2N0eC50aW1lQmFzZSwgdGhpcy5fc3RyZWFtLnRpbWVCYXNlKTtcbiAgICAgIGF3YWl0IG11eGVyLndyaXRlUGFja2V0KHBrdCk7XG4gICAgICBwa3QudW5yZWYoKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDMvMjEuXG5cbmltcG9ydCB7IExvZyB9IGZyb20gXCJub2RlLWF2XCI7XG5pbXBvcnQge1xuICBBVl9MT0dfRVJST1IsXG4gIEFWX0xPR19XQVJOSU5HLFxuICBBVl9QSVhfRk1UX1lVVkE0MjBQLFxuICBBVl9TQU1QTEVfRk1UX0ZMVCxcbiAgQVZfU0FNUExFX0ZNVF9GTFRQLFxuICBGRl9FTkNPREVSX0FBQyxcbiAgRkZfRU5DT0RFUl9MSUJYMjY1LFxuICB0eXBlIEZGQXVkaW9FbmNvZGVyLFxuICB0eXBlIEZGVmlkZW9FbmNvZGVyLFxufSBmcm9tIFwibm9kZS1hdi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgdHlwZSB7IFZpZGVvRm9ybWF0IH0gZnJvbSBcIi4uLy4uL3JlbmRlcmVyL3NjaGVtYVwiO1xuaW1wb3J0IHsgQ29uY3VycmVuY3lMaW1pdGVyIH0gZnJvbSBcIi4uL2xpbWl0ZXJcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi9sb2dnaW5nXCI7XG5pbXBvcnQgeyBBdWRpb0VuY29kZXIgfSBmcm9tIFwiLi9hdWRpb1wiO1xuaW1wb3J0IHsgRm9ybWF0TXV4ZXIgfSBmcm9tIFwiLi9tdXhlclwiO1xuaW1wb3J0IHsgVmlkZW9FbmNvZGVyIH0gZnJvbSBcIi4vdmlkZW9cIjtcblxuTG9nLnNldENhbGxiYWNrKChsZXZlbCwgbWVzc2FnZSkgPT4ge1xuICBjb25zdCBtc2cgPSBtZXNzYWdlLnRyaW1FbmQoKTtcbiAgaWYgKCFtc2cpIHJldHVybjtcbiAgaWYgKGxldmVsIDw9IEFWX0xPR19FUlJPUikgbG9nZ2VyLmVycm9yKG1zZyk7XG4gIGVsc2UgaWYgKGxldmVsIDw9IEFWX0xPR19XQVJOSU5HKSBsb2dnZXIud2Fybihtc2cpO1xufSk7XG5cbmludGVyZmFjZSBGb3JtYXRTcGVjIHtcbiAgdmlkZW9Db2RlY05hbWU6IEZGVmlkZW9FbmNvZGVyO1xuICBwaXhGbXQ6IHR5cGVvZiBBVl9QSVhfRk1UX1lVVkE0MjBQO1xuICBjb2RlY1RhZz86IHN0cmluZztcbiAgZ2xvYmFsSGVhZGVyOiBib29sZWFuO1xuICB2aWRlb09wdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGF1ZGlvQ29kZWNOYW1lOiBGRkF1ZGlvRW5jb2RlcjtcbiAgYXVkaW9TYW1wbGVGbXQ6IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVCB8IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVFA7XG4gIG91dFNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuY29uc3QgRk9STUFUX1NQRUNTOiBSZWNvcmQ8VmlkZW9Gb3JtYXQsIEZvcm1hdFNwZWM+ID0ge1xuICBtcDQ6IHtcbiAgICB2aWRlb0NvZGVjTmFtZTogRkZfRU5DT0RFUl9MSUJYMjY1LFxuICAgIHBpeEZtdDogQVZfUElYX0ZNVF9ZVVZBNDIwUCxcbiAgICBjb2RlY1RhZzogXCJodmMxXCIsXG4gICAgZ2xvYmFsSGVhZGVyOiB0cnVlLFxuICAgIHZpZGVvT3B0czogeyBwcmVzZXQ6IFwidWx0cmFmYXN0XCIsIFwieDI2NS1wYXJhbXNcIjogXCJsb2ctbGV2ZWw9MVwiIH0sXG4gICAgYXVkaW9Db2RlY05hbWU6IEZGX0VOQ09ERVJfQUFDLFxuICAgIGF1ZGlvU2FtcGxlRm10OiBBVl9TQU1QTEVfRk1UX0ZMVFAsXG4gICAgb3V0U2FtcGxlUmF0ZTogNDRfMTAwLFxuICB9LFxuICB3ZWJtOiB7XG4gICAgdmlkZW9Db2RlY05hbWU6IFwibGlidnB4LXZwOVwiIGFzIEZGVmlkZW9FbmNvZGVyLFxuICAgIHBpeEZtdDogQVZfUElYX0ZNVF9ZVVZBNDIwUCxcbiAgICBnbG9iYWxIZWFkZXI6IGZhbHNlLFxuICAgIHZpZGVvT3B0czogeyBxdWFsaXR5OiBcInJlYWx0aW1lXCIsIFwiY3B1LXVzZWRcIjogXCI4XCIgfSxcbiAgICBhdWRpb0NvZGVjTmFtZTogXCJsaWJvcHVzXCIgYXMgRkZBdWRpb0VuY29kZXIsXG4gICAgYXVkaW9TYW1wbGVGbXQ6IEFWX1NBTVBMRV9GTVRfRkxULFxuICAgIG91dFNhbXBsZVJhdGU6IDQ4XzAwMCxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBGb3JtYXRTdGF0ZSB7XG4gIGZvcm1hdDogVmlkZW9Gb3JtYXQ7XG4gIG91dFBhdGg6IHN0cmluZztcbiAgbXV4ZXI6IEZvcm1hdE11eGVyO1xuICB2aWRlbzogVmlkZW9FbmNvZGVyO1xuICBhdWRpbz86IEF1ZGlvRW5jb2RlcjtcbiAgbGltaXRlcjogQ29uY3VycmVuY3lMaW1pdGVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVuY29kZXJQaXBlbGluZU9wdGlvbnMge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgZnBzOiBudW1iZXI7XG4gIGZvcm1hdHM6IFZpZGVvRm9ybWF0W107XG4gIG91dERpcjogc3RyaW5nO1xuICB3aXRoQXVkaW8/OiBib29sZWFuO1xuICB2aWRlb0JpdHJhdGU/OiBudW1iZXI7XG4gIGF1ZGlvQml0cmF0ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgRW5jb2RlclJlc3VsdCA9IFBhcnRpYWw8UmVjb3JkPFZpZGVvRm9ybWF0LCBzdHJpbmc+PjtcblxuZXhwb3J0IGNsYXNzIEVuY29kZXJQaXBlbGluZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXRlczogRm9ybWF0U3RhdGVbXTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHN0YXRlczogRm9ybWF0U3RhdGVbXSkge1xuICAgIHRoaXMuX3N0YXRlcyA9IHN0YXRlcztcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUoe1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBmcHMsXG4gICAgZm9ybWF0cyxcbiAgICBvdXREaXIsXG4gICAgd2l0aEF1ZGlvID0gZmFsc2UsXG4gICAgdmlkZW9CaXRyYXRlID0gOF8wMDBfMDAwLFxuICAgIGF1ZGlvQml0cmF0ZSA9IDEyOF8wMDAsXG4gIH06IEVuY29kZXJQaXBlbGluZU9wdGlvbnMpOiBQcm9taXNlPEVuY29kZXJQaXBlbGluZT4ge1xuICAgIGNvbnN0IHN0YXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZm9ybWF0cy5tYXAoYXN5bmMgKGZvcm1hdCkgPT4ge1xuICAgICAgICBjb25zdCBzcGVjID0gRk9STUFUX1NQRUNTW2Zvcm1hdF07XG4gICAgICAgIGNvbnN0IG91dFBhdGggPSBqb2luKG91dERpciwgYG91dHB1dC4ke2Zvcm1hdH1gKTtcbiAgICAgICAgY29uc3QgbXV4ZXIgPSBuZXcgRm9ybWF0TXV4ZXIob3V0UGF0aCk7XG5cbiAgICAgICAgY29uc3QgdmlkZW8gPSBhd2FpdCBWaWRlb0VuY29kZXIuY3JlYXRlKHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgZnBzLFxuICAgICAgICAgIGNvZGVjTmFtZTogc3BlYy52aWRlb0NvZGVjTmFtZSxcbiAgICAgICAgICBwaXhGbXQ6IHNwZWMucGl4Rm10LFxuICAgICAgICAgIGNvZGVjVGFnOiBzcGVjLmNvZGVjVGFnLFxuICAgICAgICAgIGdsb2JhbEhlYWRlcjogc3BlYy5nbG9iYWxIZWFkZXIsXG4gICAgICAgICAgY29kZWNPcHRzOiBzcGVjLnZpZGVvT3B0cyxcbiAgICAgICAgICBiaXRyYXRlOiB2aWRlb0JpdHJhdGUsXG4gICAgICAgICAgbXV4ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBhdWRpbzogQXVkaW9FbmNvZGVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAod2l0aEF1ZGlvKSB7XG4gICAgICAgICAgYXVkaW8gPSBhd2FpdCBBdWRpb0VuY29kZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIG91dFNhbXBsZVJhdGU6IHNwZWMub3V0U2FtcGxlUmF0ZSxcbiAgICAgICAgICAgIG91dFNhbXBsZUZtdDogc3BlYy5hdWRpb1NhbXBsZUZtdCxcbiAgICAgICAgICAgIGNvZGVjTmFtZTogc3BlYy5hdWRpb0NvZGVjTmFtZSxcbiAgICAgICAgICAgIGdsb2JhbEhlYWRlcjogc3BlYy5nbG9iYWxIZWFkZXIsXG4gICAgICAgICAgICBiaXRyYXRlOiBhdWRpb0JpdHJhdGUsXG4gICAgICAgICAgICBtdXhlcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG11eGVyLm9wZW4oKTtcbiAgICAgICAgY29uc3QgbGltaXRlciA9IG5ldyBDb25jdXJyZW5jeUxpbWl0ZXIoMSk7XG4gICAgICAgIHJldHVybiB7IGZvcm1hdCwgb3V0UGF0aCwgbXV4ZXIsIHZpZGVvLCBhdWRpbywgbGltaXRlciB9IHNhdGlzZmllcyBGb3JtYXRTdGF0ZTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBFbmNvZGVyUGlwZWxpbmUoc3RhdGVzKTtcbiAgfVxuXG4gIHNldHVwQXVkaW8oc2FtcGxlUmF0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBzIG9mIHRoaXMuX3N0YXRlcykge1xuICAgICAgcy5hdWRpbz8uc2V0SW5wdXRSYXRlKHNhbXBsZVJhdGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVuY29kZUZyYW1lKGJncmE6IEJ1ZmZlciwgX3RpbWVzdGFtcFVzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl9zdGF0ZXMubWFwKChzKSA9PiBzLmxpbWl0ZXIuc2NoZWR1bGUoKCkgPT4gcy52aWRlby5lbmNvZGUoYmdyYSwgcy5tdXhlcikpKSk7XG4gIH1cblxuICBhc3luYyBlbmNvZGVBdWRpbyhwY206IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy5fc3RhdGVzLm1hcCgocykgPT4ge1xuICAgICAgICBpZiAoIXMuYXVkaW8pIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuIHMubGltaXRlci5zY2hlZHVsZSgoKSA9PiBzLmF1ZGlvIS5lbmNvZGUocGNtLCBzLm11eGVyKSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoKCk6IFByb21pc2U8RW5jb2RlclJlc3VsdD4ge1xuICAgIGNvbnN0IHJlc3VsdDogRW5jb2RlclJlc3VsdCA9IHt9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy5fc3RhdGVzLm1hcChhc3luYyAocykgPT4ge1xuICAgICAgICBhd2FpdCBzLmxpbWl0ZXIuZW5kKCk7XG4gICAgICAgIGF3YWl0IHMuYXVkaW8/LmZsdXNoKHMubXV4ZXIpO1xuICAgICAgICBhd2FpdCBzLnZpZGVvLmZsdXNoKHMubXV4ZXIpO1xuICAgICAgICByZXN1bHRbcy5mb3JtYXRdID0gcy5vdXRQYXRoO1xuICAgICAgICB1c2luZyBfYSA9IHMuYXVkaW87XG4gICAgICAgIHVzaW5nIF92ID0gcy52aWRlbztcbiAgICAgICAgYXdhaXQgdXNpbmcgX20gPSBzLm11eGVyO1xuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA2LlxuXG5pbXBvcnQgdHlwZSB7IE5hdGl2ZUltYWdlIH0gZnJvbSBcImVsZWN0cm9uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KGltYWdlOiBOYXRpdmVJbWFnZSkge1xuICBjb25zdCBzaXplID0gaW1hZ2UuZ2V0U2l6ZSgpO1xuICBpZiAoc2l6ZS53aWR0aCA9PT0gMCB8fCBzaXplLmhlaWdodCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBpbWFnZS5pc0VtcHR5KCk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAzLzAyLlxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgaXBjTWFpbiwgc2Vzc2lvbiB9IGZyb20gXCJlbGVjdHJvblwiO1xuaW1wb3J0IHsgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgRW5jb2RlclBpcGVsaW5lIH0gZnJvbSBcIi4uL2Jhc2UvZW5jb2Rlci9lbmNvZGVyXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vYmFzZS9sb2dnaW5nXCI7XG5cbmNvbnN0IFRBRyA9IFwiW0F1ZGlvQ2FwdHVyZV1cIjtcblxuY29uc3QgQVVESU9fQ0FQVFVSRV9TQ1JJUFQgPSBgXG4oZnVuY3Rpb24oKSB7XG4gIGlmICh3aW5kb3cuX19wdXBfYXVkaW9fY2FwdHVyaW5nX18pIHJldHVybjtcbiAgd2luZG93Ll9fcHVwX2F1ZGlvX2NhcHR1cmluZ19fID0gdHJ1ZTtcblxuICBjb25zdCB7IGlwY1JlbmRlcmVyIH0gPSByZXF1aXJlKCdlbGVjdHJvbicpO1xuICBjb25zdCBjYXB0dXJlZENvbnRleHRzID0gbmV3IFdlYWtTZXQoKTtcbiAgY29uc3Qgc291cmNlZEVsZW1lbnRzID0gbmV3IFdlYWtTZXQoKTtcbiAgbGV0IG1ldGFTZW50ID0gZmFsc2U7XG5cbiAgY29uc3Qgb3JpZ0NyZWF0ZU1FUyA9IEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlO1xuICBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZSA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgc291cmNlZEVsZW1lbnRzLmFkZChlbCk7XG4gICAgcmV0dXJuIG9yaWdDcmVhdGVNRVMuY2FsbCh0aGlzLCBlbCk7XG4gIH07XG5cbiAgY29uc3Qgb3JpZ0Nvbm5lY3QgPSBBdWRpb05vZGUucHJvdG90eXBlLmNvbm5lY3Q7XG4gIEF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uKGRlc3QsIG91dElkeCwgaW5JZHgpIHtcbiAgICBjb25zdCBjYXB0dXJlTm9kZSA9IGRlc3Q/LmNvbnRleHQ/Ll9fcHVwX2NhcHR1cmVOb2RlX187XG4gICAgaWYgKGNhcHR1cmVOb2RlICYmIGRlc3QgPT09IGRlc3QuY29udGV4dC5kZXN0aW5hdGlvbiAmJiB0aGlzICE9PSBjYXB0dXJlTm9kZSkge1xuICAgICAgb3JpZ0Nvbm5lY3QuY2FsbCh0aGlzLCBjYXB0dXJlTm9kZSwgb3V0SWR4LCBpbklkeCk7XG4gICAgfVxuICAgIHJldHVybiBvcmlnQ29ubmVjdC5jYWxsKHRoaXMsIGRlc3QsIG91dElkeCwgaW5JZHgpO1xuICB9O1xuXG4gIGNvbnN0IE9yaWdBQyA9IHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dDtcbiAgaWYgKCFPcmlnQUMpIHJldHVybjtcblxuICBmdW5jdGlvbiBQYXRjaGVkQUMoKSB7XG4gICAgY29uc3QgY3R4ID0gbmV3IE9yaWdBQyguLi5hcmd1bWVudHMpO1xuICAgIGlmICghY2FwdHVyZWRDb250ZXh0cy5oYXMoY3R4KSkge1xuICAgICAgY2FwdHVyZWRDb250ZXh0cy5hZGQoY3R4KTtcbiAgICAgIGlmICghbWV0YVNlbnQpIHtcbiAgICAgICAgbWV0YVNlbnQgPSB0cnVlO1xuICAgICAgICBpcGNSZW5kZXJlci5zZW5kKCdhdWRpby1tZXRhJywgeyBzYW1wbGVSYXRlOiBjdHguc2FtcGxlUmF0ZSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGUgPSBjdHguY3JlYXRlU2NyaXB0UHJvY2Vzc29yKDQwOTYsIDIsIDIpO1xuICAgICAgbm9kZS5vbmF1ZGlvcHJvY2VzcyA9IChlKSA9PiB7XG4gICAgICAgIGNvbnN0IEwgPSBlLmlucHV0QnVmZmVyLmdldENoYW5uZWxEYXRhKDApO1xuICAgICAgICBjb25zdCBSID0gZS5pbnB1dEJ1ZmZlci5nZXRDaGFubmVsRGF0YSgxKTtcbiAgICAgICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShMLmxlbmd0aCAqIDIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBvdXRbaSAqIDJdID0gTFtpXTtcbiAgICAgICAgICBvdXRbaSAqIDIgKyAxXSA9IFJbaV07XG4gICAgICAgIH1cbiAgICAgICAgaXBjUmVuZGVyZXIuc2VuZCgnYXVkaW8tY2h1bmsnLCBCdWZmZXIuZnJvbShvdXQuYnVmZmVyKSk7XG4gICAgICB9O1xuICAgICAgbm9kZS5jb25uZWN0KGN0eC5kZXN0aW5hdGlvbik7XG4gICAgICBjdHguX19wdXBfY2FwdHVyZU5vZGVfXyA9IG5vZGU7XG4gICAgfVxuICAgIHJldHVybiBjdHg7XG4gIH1cbiAgUGF0Y2hlZEFDLnByb3RvdHlwZSA9IE9yaWdBQy5wcm90b3R5cGU7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihQYXRjaGVkQUMsIE9yaWdBQyk7XG4gIHdpbmRvdy5BdWRpb0NvbnRleHQgPSBQYXRjaGVkQUM7XG4gIGlmICgnd2Via2l0QXVkaW9Db250ZXh0JyBpbiB3aW5kb3cpIHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQgPSBQYXRjaGVkQUM7XG5cbiAgY29uc3Qgb3JpZ1BsYXkgPSBIVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZS5wbGF5O1xuICBIVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9fcHVwX2NhcHR1cmVkX18pIHtcbiAgICAgIHRoaXMuX19wdXBfY2FwdHVyZWRfXyA9IHRydWU7XG4gICAgICBjb25zdCBlbCA9IHRoaXM7XG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKCFzb3VyY2VkRWxlbWVudHMuaGFzKGVsKSkge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IG5ldyBQYXRjaGVkQUMoKTtcbiAgICAgICAgICBjdHguY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKGVsKS5jb25uZWN0KGN0eC5kZXN0aW5hdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3JpZ1BsYXkuY2FsbCh0aGlzKTtcbiAgfTtcbn0pKCk7XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvQ2FwdHVyZSB7XG4gIHRlYXJkb3duKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEF1ZGlvQ2FwdHVyZShwaXBlbGluZTogRW5jb2RlclBpcGVsaW5lKTogUHJvbWlzZTxBdWRpb0NhcHR1cmU+IHtcbiAgY29uc3QgcHJlbG9hZFBhdGggPSBqb2luKHRtcGRpcigpLCBgcHVwX2F1ZGlvX3ByZWxvYWRfJHtyYW5kb21VVUlEKCl9LmpzYCk7XG4gIGF3YWl0IHdyaXRlRmlsZShwcmVsb2FkUGF0aCwgQVVESU9fQ0FQVFVSRV9TQ1JJUFQpO1xuICBzZXNzaW9uLmRlZmF1bHRTZXNzaW9uLnJlZ2lzdGVyUHJlbG9hZFNjcmlwdCh7XG4gICAgdHlwZTogXCJmcmFtZVwiLFxuICAgIGlkOiBcInB1cC1hdWRpb1wiLFxuICAgIGZpbGVQYXRoOiBwcmVsb2FkUGF0aCxcbiAgfSk7XG5cbiAgaXBjTWFpbi5vbmNlKFwiYXVkaW8tbWV0YVwiLCAoX2UsIGRhdGE6IHsgc2FtcGxlUmF0ZTogbnVtYmVyIH0pID0+IHtcbiAgICBwaXBlbGluZS5zZXR1cEF1ZGlvKGRhdGEuc2FtcGxlUmF0ZSk7XG4gIH0pO1xuICBpcGNNYWluLm9uKFwiYXVkaW8tY2h1bmtcIiwgYXN5bmMgKF9lLCBidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwaXBlbGluZS5lbmNvZGVBdWRpbyhidWZmZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihUQUcsIFwiZmFpbGVkIHRvIGVuY29kZSBhdWRpbyBjaHVuazpcIiwgZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHRlYXJkb3duKCkge1xuICAgICAgaXBjTWFpbi5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJhdWRpby1tZXRhXCIpO1xuICAgICAgaXBjTWFpbi5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJhdWRpby1jaHVua1wiKTtcbiAgICAgIHNlc3Npb24uZGVmYXVsdFNlc3Npb24udW5yZWdpc3RlclByZWxvYWRTY3JpcHQoXCJwdXAtYXVkaW9cIik7XG4gICAgICBhd2FpdCBybShwcmVsb2FkUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9LFxuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z2dlciwgU2l6ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xuXG5leHBvcnQgY29uc3QgRlJBTUVfU1lOQ19NQVJLRVJfV0lEVEggPSAzMjtcbmV4cG9ydCBjb25zdCBGUkFNRV9TWU5DX01BUktFUl9IRUlHSFQgPSAxO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXcmFwcGVySFRNTCh0YXJnZXRVUkw6IHN0cmluZywgc2l6ZTogU2l6ZSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gc2l6ZTtcbiAgcmV0dXJuIGA8IURPQ1RZUEUgaHRtbD5cbjxodG1sPlxuPGhlYWQ+XG4gIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiPlxuICA8c3R5bGU+XG4gICAgKiB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfVxuICAgIGh0bWwsIGJvZHkgeyB3aWR0aDogJHt3aWR0aH1weDsgaGVpZ2h0OiAke2hlaWdodCArIDF9cHg7IG92ZXJmbG93OiBoaWRkZW47IH1cbiAgICAjdGFyZ2V0IHsgXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7IFxuICAgICAgdG9wOiAwOyBcbiAgICAgIGxlZnQ6IDA7IFxuICAgICAgd2lkdGg6ICR7d2lkdGh9cHg7IFxuICAgICAgaGVpZ2h0OiAke2hlaWdodH1weDsgXG4gICAgICBib3JkZXI6IG5vbmU7IFxuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgICNzdGVnbyB7IFxuICAgICAgcG9zaXRpb246IGFic29sdXRlOyBcbiAgICAgIHRvcDogJHtoZWlnaHR9cHg7IFxuICAgICAgbGVmdDogMDsgXG4gICAgICB3aWR0aDogJHt3aWR0aH1weDsgXG4gICAgICBoZWlnaHQ6IDFweDsgXG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkO1xuICAgIH1cbiAgPC9zdHlsZT5cbjwvaGVhZD5cbjxib2R5PlxuICA8aWZyYW1lIGlkPVwidGFyZ2V0XCIgc3JjPVwiJHt0YXJnZXRVUkx9XCI+PC9pZnJhbWU+XG4gIDxjYW52YXMgaWQ9XCJzdGVnb1wiIHdpZHRoPVwiJHt3aWR0aH1cIiBoZWlnaHQ9XCIxXCI+PC9jYW52YXM+XG4gIDxzY3JpcHQ+XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgV0lEVEggPSAke3dpZHRofTtcbiAgICAgIGNvbnN0IE1BUktFUl9XSURUSCA9ICR7RlJBTUVfU1lOQ19NQVJLRVJfV0lEVEh9O1xuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZWdvJyk7XG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICAgIGxldCBzdGFydFRpbWUgPSBudWxsO1xuICAgICAgbGV0IHJhZklkID0gbnVsbDtcblxuICAgICAgZnVuY3Rpb24gZW5jb2RlVGltZXN0YW1wKHRpbWVzdGFtcE1zKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEoV0lEVEgsIDEpO1xuICAgICAgICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0aW1lc3RhbXBJbnQgPSBNYXRoLmZsb29yKHRpbWVzdGFtcE1zKSA+Pj4gMDtcbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTUFSS0VSX1dJRFRIOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBiaXQgPSAodGltZXN0YW1wSW50ID4+PiAoTUFSS0VSX1dJRFRIIC0gMSAtIGkpKSAmIDE7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBiaXQgPyAyNTUgOiAwO1xuICAgICAgICAgIGNvbnN0IGlkeCA9IGkgKiA0O1xuICAgICAgICAgIGRhdGFbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgIGRhdGFbaWR4ICsgMV0gPSB2YWx1ZTtcbiAgICAgICAgICBkYXRhW2lkeCArIDJdID0gdmFsdWU7XG4gICAgICAgICAgZGF0YVtpZHggKyAzXSA9IDI1NTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZm9yIChsZXQgaSA9IE1BUktFUl9XSURUSDsgaSA8IFdJRFRIOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpZHggPSBpICogNDtcbiAgICAgICAgICBkYXRhW2lkeF0gPSAwO1xuICAgICAgICAgIGRhdGFbaWR4ICsgMV0gPSAwO1xuICAgICAgICAgIGRhdGFbaWR4ICsgMl0gPSAwO1xuICAgICAgICAgIGRhdGFbaWR4ICsgM10gPSAyNTU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXBkYXRlTG9vcCgpIHtcbiAgICAgICAgaWYgKHN0YXJ0VGltZSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBlbGFwc2VkID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgIGVuY29kZVRpbWVzdGFtcChlbGFwc2VkKTtcbiAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlTG9vcCk7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5fX3B1cF9zdGFydF9yZWNvcmRpbmdfXyA9ICgpID0+IHtcbiAgICAgICAgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIGVuY29kZVRpbWVzdGFtcCgwKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZUxvb3ApO1xuICAgICAgfTtcblxuICAgICAgd2luZG93Ll9fcHVwX3N0b3BfcmVjb3JkaW5nX18gPSAoKSA9PiB7XG4gICAgICAgIGlmIChyYWZJZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgICAgICAgICByYWZJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSkoKTtcbiAgPC9zY3JpcHQ+XG48L2JvZHk+XG48L2h0bWw+YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRpbWVzdGFtcChiaXRtYXA6IEJ1ZmZlciwgc2l6ZTogU2l6ZSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gc2l6ZTtcbiAgaWYgKHdpZHRoIDwgRlJBTUVfU1lOQ19NQVJLRVJfV0lEVEggfHwgaGVpZ2h0IDwgMikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBtYXJrZXJSb3cgPSBoZWlnaHQgLSAxO1xuXG4gIGxldCB0aW1lc3RhbXAgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IEZSQU1FX1NZTkNfTUFSS0VSX1dJRFRIOyBpKyspIHtcbiAgICBjb25zdCBwaXhlbElkeCA9IChtYXJrZXJSb3cgKiB3aWR0aCArIGkpICogNDtcbiAgICBjb25zdCByID0gYml0bWFwW3BpeGVsSWR4XSA/PyAwO1xuICAgIGNvbnN0IGJpdCA9IHIgPiAxMjcgPyAxIDogMDtcbiAgICB0aW1lc3RhbXAgPSAodGltZXN0YW1wIDw8IDEpIHwgYml0O1xuICB9XG5cbiAgdGltZXN0YW1wID0gdGltZXN0YW1wID4+PiAwO1xuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHRpbWVzdGFtcCkgfHwgdGltZXN0YW1wIDwgMCB8fCB0aW1lc3RhbXAgPiAxZTcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHRpbWVzdGFtcDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0U3luYyhjZHA6IERlYnVnZ2VyKSB7XG4gIHJldHVybiBjZHAuc2VuZENvbW1hbmQoXCJSdW50aW1lLmV2YWx1YXRlXCIsIHtcbiAgICBleHByZXNzaW9uOiBgd2luZG93Ll9fcHVwX3N0YXJ0X3JlY29yZGluZ19fKClgLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BTeW5jKGNkcDogRGVidWdnZXIpIHtcbiAgcmV0dXJuIGNkcC5zZW5kQ29tbWFuZChcIlJ1bnRpbWUuZXZhbHVhdGVcIiwge1xuICAgIGV4cHJlc3Npb246IGB3aW5kb3cuX19wdXBfc3RvcF9yZWNvcmRpbmdfXygpYCxcbiAgfSk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcmlvZGljYWwoY2FsbGJhY2s6IChjb3VudDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCwgbXM6IG51bWJlcikge1xuICBsZXQgdG9rZW46IE5vZGVKUy5UaW1lb3V0O1xuICBsZXQgY2xvc2VkID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIHRpY2soY291bnQ6IG51bWJlcikge1xuICAgIGF3YWl0IGNhbGxiYWNrKGNvdW50KTtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm47XG4gICAgdG9rZW4gPSBzZXRUaW1lb3V0KCgpID0+IHRpY2soY291bnQgKyAxKSwgbXMpO1xuICB9XG4gIHRva2VuID0gc2V0VGltZW91dCgoKSA9PiB0aWNrKDApLCBtcyk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQodG9rZW4pO1xuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wNS5cblxuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gXCJ0aW1lcnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4vdGltaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zPEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0PiB7XG4gIGZuOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXQ+O1xuICBtYXhBdHRlbXB0cz86IG51bWJlcjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJldHJ5PEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0Pih7IGZuLCBtYXhBdHRlbXB0cyA9IDMsIHRpbWVvdXQgfTogUmV0cnlPcHRpb25zPEFyZ3MsIFJldD4pIHtcbiAgY29uc3QgdGltZW91dEVycm9yID0gbmV3IEVycm9yKGB0aW1lb3V0IG92ZXIgJHt0aW1lb3V0fW1zYCk7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJnczogQXJncykge1xuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbZm4oLi4uYXJncyldO1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRpbWVvdXQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyB0aW1lb3V0RXJyb3I7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UocHJvbWlzZXMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgIGlmIChhdHRlbXB0ID49IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzbGVlcChNYXRoLnBvdygyLCBhdHRlbXB0KSAqIDEwMCArIE1hdGgucmFuZG9tKCkgKiAxMDApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMDkuXG5cbmNvbnN0IFNVUFBPUlRFRF9QUk9UT0NPTFMgPSBbXCJmaWxlOlwiLCBcImh0dHA6XCIsIFwiaHR0cHM6XCIsIFwiZGF0YTpcIl07XG5jb25zdCBTT1VSQ0VfUEFUVEVSTiA9IC9eKGZpbGU6fGh0dHBzPzp8ZGF0YTopLztcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSFRNTChzb3VyY2U6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoU09VUkNFX1BBVFRFUk4udGVzdChzb3VyY2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcHJvdG9jb2wgPSBzb3VyY2Uuc3BsaXQoXCI6XCIpWzBdICsgXCI6XCI7XG4gIGNvbnN0IG1lc3NhZ2UgPSBTVVBQT1JURURfUFJPVE9DT0xTLmluY2x1ZGVzKHByb3RvY29sKVxuICAgID8gYHVuc3VwcG9ydGVkIHByb3RvY29sOiAke3Byb3RvY29sfSwgZXhwZWN0ZWQgJHtTVVBQT1JURURfUFJPVE9DT0xTLmpvaW4oXCIsIFwiKX1gXG4gICAgOiBgaW52YWxpZCBzb3VyY2UgZm9ybWF0LCBleHBlY3RlZCAke1NVUFBPUlRFRF9QUk9UT0NPTFMuam9pbihcIiwgXCIpfWA7XG5cbiAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMy8xMC5cblxuZXhwb3J0IGludGVyZmFjZSBXYWl0T3B0aW9ucyB7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAgb25UaW1lb3V0PzogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFdhaXRhYmxlRXZlbnQge1xuICBwcml2YXRlIF9wcm9taXNlPzogUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBfcmVzb2x2ZT86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgX3RpbWVvdXRUb2tlbj86IE5vZGVKUy5UaW1lb3V0O1xuXG4gIHdhaXQob3B0aW9ucz86IFdhaXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX3Byb21pc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFscmVhZHkgd2FpdGluZ1wiKTtcbiAgICB9XG4gICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIGlmIChvcHRpb25zPy50aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fdGltZW91dFRva2VuID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgb3B0aW9ucy5vblRpbWVvdXQ/LigpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgfVxuXG4gIHNpZ25hbCgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dFRva2VuKTtcbiAgICB0aGlzLl9wcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc29sdmU/LigpO1xuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5pbXBvcnQgeyBCcm93c2VyV2luZG93IH0gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgeyBVUkwgfSBmcm9tIFwidXJsXCI7XG5pbXBvcnQgeyBDb25jdXJyZW5jeUxpbWl0ZXIgfSBmcm9tIFwiLi4vYmFzZS9saW1pdGVyXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vYmFzZS9sb2dnaW5nXCI7XG5pbXBvcnQgeyBXYWl0YWJsZUV2ZW50IH0gZnJvbSBcIi4uL2Jhc2Uvd2FpdGFibGVfZXZlbnRcIjtcblxuY29uc3QgVEFHID0gXCJbTmV0d29ya11cIjtcblxuY29uc3QgbWFwID0gbmV3IE1hcChbXG4gIFtganNzei1ib3NzLmhkc2xiLmNvbWAsIGBqc3N6LWJvc3MuYmlsaWJpbGkuY29gXSwgLy9cbiAgW2Bib3NzLmhkc2xiLmNvbWAsIGBzaGpkLWJvc3MuYmlsaWJpbGkuY29gXSxcbl0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJveGllZFVybCh1cmw6IHN0cmluZykge1xuICBpZiAoIXVybC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICBjb25zdCB0YXJnZXQgPSBtYXAuZ2V0KHBhcnNlZC5ob3N0bmFtZSk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBwYXJzZWQuaG9zdG5hbWUgPSB0YXJnZXQ7XG4gIHBhcnNlZC5wcm90b2NvbCA9IFwiaHR0cDpcIjtcbiAgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtPcHRpb25zIHtcbiAgc291cmNlOiBzdHJpbmc7XG4gIHdpbmRvdzogQnJvd3NlcldpbmRvdztcbiAgdXNlSW5uZXJQcm94eT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRJbnRlcmNlcHRvcih7IHNvdXJjZSwgd2luZG93LCB1c2VJbm5lclByb3h5IH06IE5ldHdvcmtPcHRpb25zKSB7XG4gIGNvbnN0IHJlcSA9IHdpbmRvdy53ZWJDb250ZW50cy5zZXNzaW9uLndlYlJlcXVlc3Q7XG4gIGNvbnN0IGxpbWl0ZXIgPSBuZXcgQ29uY3VycmVuY3lMaW1pdGVyKDY0KTtcbiAgY29uc3QgZXZlbnRzID0gbmV3IE1hcDxzdHJpbmcsIFdhaXRhYmxlRXZlbnQ+KCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdChrZXk6IHN0cmluZywgb25UaW1lb3V0PzogKCkgPT4gdm9pZCkge1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IFdhaXRhYmxlRXZlbnQoKTtcbiAgICBldmVudHMuc2V0KGtleSwgZXZlbnQpO1xuICAgIGF3YWl0IGV2ZW50LndhaXQoeyB0aW1lb3V0OiA1XzAwMCwgb25UaW1lb3V0IH0pLmZpbmFsbHkoKCkgPT4gZXZlbnRzLmRlbGV0ZShrZXkpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZ25hbChrZXk6IHN0cmluZykge1xuICAgIGV2ZW50cy5nZXQoa2V5KT8uc2lnbmFsKCk7XG4gIH1cblxuICByZXEub25CZWZvcmVSZXF1ZXN0KChkZXRhaWxzLCBjYWxsYmFjaykgPT4ge1xuICAgIGNvbnN0IHVybCA9IGRldGFpbHMudXJsO1xuICAgIGNvbnN0IHByb3hpZWQgPSB1c2VJbm5lclByb3h5ID8gcHJveGllZFVybCh1cmwpIDogdXJsO1xuICAgIGxpbWl0ZXIuc2NoZWR1bGUoKCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7d2luZG93LmlkfV8ke2RldGFpbHMuaWR9YDtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhUQUcsIGBzdGFydDpgLCB7XG4gICAgICAgIGtleSxcbiAgICAgICAgdXJsLFxuICAgICAgICBwcm94aWVkLFxuICAgICAgICBtZXRob2Q6IGRldGFpbHMubWV0aG9kLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHN0YXRzOiBsaW1pdGVyLnN0YXRzLFxuICAgICAgfSk7XG4gICAgICBpZiAocHJveGllZCA9PT0gdXJsKSB7XG4gICAgICAgIGNhbGxiYWNrKHsgY2FuY2VsOiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKHsgY2FuY2VsOiBmYWxzZSwgcmVkaXJlY3RVUkw6IHByb3hpZWQgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2FpdChrZXksICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oVEFHLCBgbWF5YmUgdGltZW91dDpgLCB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBwcm94aWVkLFxuICAgICAgICAgIG1ldGhvZDogZGV0YWlscy5tZXRob2QsXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICByZXEub25IZWFkZXJzUmVjZWl2ZWQoKHsgcmVzcG9uc2VIZWFkZXJzIH0sIGNhbGxiYWNrKSA9PiB7XG4gICAgZGVsZXRlIHJlc3BvbnNlSGVhZGVycz8uW1wieC1mcmFtZS1vcHRpb25zXCJdO1xuICAgIGRlbGV0ZSByZXNwb25zZUhlYWRlcnM/LltcIlgtRnJhbWUtT3B0aW9uc1wiXTtcbiAgICBkZWxldGUgcmVzcG9uc2VIZWFkZXJzPy5bXCJjb250ZW50LXNlY3VyaXR5LXBvbGljeVwiXTtcbiAgICBkZWxldGUgcmVzcG9uc2VIZWFkZXJzPy5bXCJDb250ZW50LVNlY3VyaXR5LVBvbGljeVwiXTtcbiAgICBjYWxsYmFjayh7IGNhbmNlbDogZmFsc2UsIHJlc3BvbnNlSGVhZGVycyB9KTtcbiAgfSk7XG5cbiAgcmVxLm9uQ29tcGxldGVkKChkZXRhaWxzKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYCR7d2luZG93LmlkfV8ke2RldGFpbHMuaWR9YDtcbiAgICBzaWduYWwoa2V5KTtcbiAgICBsb2dnZXIuZGVidWcoVEFHLCBgY29tcGxldGVkOmAsIHtcbiAgICAgIGtleSxcbiAgICAgIHVybDogZGV0YWlscy51cmwsXG4gICAgICBtZXRob2Q6IGRldGFpbHMubWV0aG9kLFxuICAgICAgc3RhdHVzQ29kZTogZGV0YWlscy5zdGF0dXNDb2RlLFxuICAgICAgc291cmNlLFxuICAgIH0pO1xuICB9KTtcblxuICByZXEub25FcnJvck9jY3VycmVkKChkZXRhaWxzKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYCR7d2luZG93LmlkfV8ke2RldGFpbHMuaWR9YDtcbiAgICBzaWduYWwoa2V5KTtcbiAgICBsb2dnZXIuZXJyb3IoVEFHLCBgZXJyb3I6YCwge1xuICAgICAga2V5LFxuICAgICAgdXJsOiBkZXRhaWxzLnVybCxcbiAgICAgIG1ldGhvZDogZGV0YWlscy5tZXRob2QsXG4gICAgICBlcnJvcjogZGV0YWlscy5lcnJvcixcbiAgICAgIHNvdXJjZSxcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnNldEludGVyY2VwdG9yKHdpbmRvdzogQnJvd3NlcldpbmRvdykge1xuICBjb25zdCByZXEgPSB3aW5kb3cud2ViQ29udGVudHMuc2Vzc2lvbi53ZWJSZXF1ZXN0O1xuICByZXEub25CZWZvcmVSZXF1ZXN0KG51bGwpO1xuICByZXEub25IZWFkZXJzUmVjZWl2ZWQobnVsbCk7XG4gIHJlcS5vbkNvbXBsZXRlZChudWxsKTtcbiAgcmVxLm9uRXJyb3JPY2N1cnJlZChudWxsKTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMjcuXG5cbmltcG9ydCB7IEJyb3dzZXJXaW5kb3cgfSBmcm9tIFwiZWxlY3Ryb25cIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi9iYXNlL2xvZ2dpbmdcIjtcbmltcG9ydCB7IHVzZVJldHJ5IH0gZnJvbSBcIi4uL2Jhc2UvcmV0cnlcIjtcbmltcG9ydCB7IGJ1aWxkV3JhcHBlckhUTUwgfSBmcm9tIFwiLi9mcmFtZV9zeW5jXCI7XG5pbXBvcnQgeyBjaGVja0hUTUwgfSBmcm9tIFwiLi9odG1sX2NoZWNrXCI7XG5pbXBvcnQgeyBwcm94aWVkVXJsLCBzZXRJbnRlcmNlcHRvciwgdW5zZXRJbnRlcmNlcHRvciB9IGZyb20gXCIuL25ldHdvcmtcIjtcbmltcG9ydCB0eXBlIHsgUmVuZGVyT3B0aW9ucyB9IGZyb20gXCIuL3NjaGVtYVwiO1xuXG5jb25zdCBUQUcgPSBcIltXaW5kb3ddXCI7XG5cbmZ1bmN0aW9uIHdhaXRGb3JGaW5pc2god2luOiBCcm93c2VyV2luZG93LCBhY3Rpb246ICgpID0+IHZvaWQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKFwibG9hZCB3aW5kb3cgdGltZW91dFwiKSksIDMwXzAwMCk7XG4gICAgY29uc3QgZG9uZSA9IChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKCk7XG4gICAgfTtcbiAgICB3aW4ud2ViQ29udGVudHMub25jZShcImRpZC1maW5pc2gtbG9hZFwiLCAoKSA9PiBkb25lKCkpO1xuICAgIHdpbi53ZWJDb250ZW50cy5vbmNlKFwiZGlkLWZhaWwtbG9hZFwiLCAoX2UsIGNvZGUsIGRlc2MsIHVybCkgPT5cbiAgICAgIGRvbmUobmV3IEVycm9yKGBmYWlsZWQgdG8gbG9hZCAke3VybH06IFske2NvZGV9XSAke2Rlc2N9YCkpLFxuICAgICk7XG4gICAgd2luLndlYkNvbnRlbnRzLm9uY2UoXCJyZW5kZXItcHJvY2Vzcy1nb25lXCIsIChfZSwgeyBleGl0Q29kZSwgcmVhc29uIH0pID0+XG4gICAgICBkb25lKG5ldyBFcnJvcihgcmVuZGVyZXIgY3Jhc2hlZDogJHtleGl0Q29kZX0sICR7cmVhc29ufWApKSxcbiAgICApO1xuICAgIGFjdGlvbigpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gb3BlbldpbmRvdyh3aW5zOiBCcm93c2VyV2luZG93W10sIHNvdXJjZTogc3RyaW5nLCBvcHRpb25zOiBSZW5kZXJPcHRpb25zKTogUHJvbWlzZTxCcm93c2VyV2luZG93PiB7XG4gIGNoZWNrSFRNTChzb3VyY2UpO1xuXG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdXNlSW5uZXJQcm94eSB9ID0gb3B0aW9ucztcblxuICBsZXQgc3JjID0gc291cmNlO1xuICBpZiAodXNlSW5uZXJQcm94eSkge1xuICAgIHNyYyA9IHByb3hpZWRVcmwoc291cmNlKTtcbiAgfVxuXG4gIHdpbnMuZm9yRWFjaCgodykgPT4ge1xuICAgIHcud2ViQ29udGVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgdW5zZXRJbnRlcmNlcHRvcih3KTtcbiAgICBsb2dnZXIuZGVidWcoVEFHLCBgZGVzdHJveSB3aW5kb3c6YCwgdy5pZCk7XG4gIH0pO1xuICBjb25zdCB3aW4gPSBuZXcgQnJvd3NlcldpbmRvdyh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQgKyAxLFxuICAgIHNob3c6IGZhbHNlLFxuICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgIGJhY2tncm91bmRDb2xvcjogdW5kZWZpbmVkLFxuICAgIHdlYlByZWZlcmVuY2VzOiB7XG4gICAgICBvZmZzY3JlZW46IHRydWUsXG4gICAgICBiYWNrZ3JvdW5kVGhyb3R0bGluZzogZmFsc2UsXG4gICAgICBub2RlSW50ZWdyYXRpb246IHRydWUsXG4gICAgICBub2RlSW50ZWdyYXRpb25JblN1YkZyYW1lczogdHJ1ZSxcbiAgICAgIG5vZGVJbnRlZ3JhdGlvbkluV29ya2VyOiB0cnVlLFxuICAgICAgY29udGV4dElzb2xhdGlvbjogZmFsc2UsXG4gICAgICB3ZWJTZWN1cml0eTogZmFsc2UsXG4gICAgICBhbGxvd1J1bm5pbmdJbnNlY3VyZUNvbnRlbnQ6IHRydWUsXG4gICAgICBleHBlcmltZW50YWxGZWF0dXJlczogdHJ1ZSxcbiAgICB9LFxuICB9KTtcbiAgc2V0SW50ZXJjZXB0b3IoeyBzb3VyY2UsIHdpbmRvdzogd2luLCB1c2VJbm5lclByb3h5IH0pO1xuICB3aW5zLnNwbGljZSgwKS5mb3JFYWNoKCh3KSA9PiB3LmRlc3Ryb3koKSk7XG4gIHdpbnMucHVzaCh3aW4pO1xuXG4gIHdpbi53ZWJDb250ZW50cy5vbihcImNvbnNvbGUtbWVzc2FnZVwiLCAoeyBsZXZlbCwgbWVzc2FnZSwgbGluZU51bWJlciwgc291cmNlSWQgfSkgPT4ge1xuICAgIGlmIChsZXZlbCA9PT0gXCJlcnJvclwiKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoVEFHLCBcImNvbnNvbGU6XCIsIHtcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgbGluZU51bWJlcixcbiAgICAgICAgc291cmNlSWQsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3Qgd3JhcHBlckhUTUwgPSBidWlsZFdyYXBwZXJIVE1MKHNyYywgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICBjb25zdCBkYXRhVVJMID0gYGRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgsJHtlbmNvZGVVUklDb21wb25lbnQod3JhcHBlckhUTUwpfWA7XG4gIGF3YWl0IHdhaXRGb3JGaW5pc2god2luLCAoKSA9PiB3aW4ubG9hZFVSTChkYXRhVVJMKSk7XG5cbiAgcmV0dXJuIHdpbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXaW5kb3coc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMpOiBQcm9taXNlPEJyb3dzZXJXaW5kb3c+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB3aW5zOiBCcm93c2VyV2luZG93W10gPSBbXTtcbiAgICBhd2FpdCB1c2VSZXRyeSh7IGZuOiBvcGVuV2luZG93LCBtYXhBdHRlbXB0czogMiB9KSh3aW5zLCBzb3VyY2UsIG9wdGlvbnMpO1xuICAgIHJldHVybiBhd2FpdCBvcGVuV2luZG93KHdpbnMsIHNvdXJjZSwgb3B0aW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIHN0YWNrIH0gPSBlIGFzIEVycm9yO1xuICAgIGNvbnN0IGRlc2MgPSB7IHNvdXJjZSwgbWVzc2FnZSwgc3RhY2sgfTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBsb2FkIHdpbmRvdzogJHtKU09OLnN0cmluZ2lmeShkZXNjKX1gKTtcbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuaW1wb3J0IHsgb2sgfSBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBuYXRpdmVJbWFnZSwgdHlwZSBOYXRpdmVJbWFnZSB9IGZyb20gXCJlbGVjdHJvblwiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBFbmNvZGVyUGlwZWxpbmUgfSBmcm9tIFwiLi4vYmFzZS9lbmNvZGVyL2VuY29kZXJcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vYmFzZS9pbWFnZVwiO1xuaW1wb3J0IHsgQ29uY3VycmVuY3lMaW1pdGVyIH0gZnJvbSBcIi4uL2Jhc2UvbGltaXRlclwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jhc2UvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgc2V0dXBBdWRpb0NhcHR1cmUgfSBmcm9tIFwiLi9hdWRpb19jYXB0dXJlXCI7XG5pbXBvcnQgeyBkZWNvZGVUaW1lc3RhbXAsIHN0YXJ0U3luYywgc3RvcFN5bmMgfSBmcm9tIFwiLi9mcmFtZV9zeW5jXCI7XG5pbXBvcnQgdHlwZSB7IFJlbmRlck9wdGlvbnMsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuaW1wb3J0IHsgbG9hZFdpbmRvdyB9IGZyb20gXCIuL3dpbmRvd1wiO1xuXG5jb25zdCBUQUcgPSBcIltSZW5kZXJdXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXIoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbG9nZ2VyLmluZm8oVEFHLCBgcHJvZ3Jlc3M6IDAlYCk7XG4gIGNvbnN0IHsgb3V0RGlyLCBmcHMsIHdpZHRoLCBoZWlnaHQsIGR1cmF0aW9uLCB3aXRoQXVkaW8sIGZvcm1hdHMgfSA9IG9wdGlvbnM7XG5cbiAgYXdhaXQgbWtkaXIob3V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBwaXBlbGluZSA9IGF3YWl0IEVuY29kZXJQaXBlbGluZS5jcmVhdGUoeyB3aWR0aCwgaGVpZ2h0LCBmcHMsIGZvcm1hdHMsIG91dERpciwgd2l0aEF1ZGlvIH0pO1xuICBjb25zdCBhdWRpb0NhcHR1cmUgPSB3aXRoQXVkaW8gPyBhd2FpdCBzZXR1cEF1ZGlvQ2FwdHVyZShwaXBlbGluZSkgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgd2luID0gYXdhaXQgbG9hZFdpbmRvdyhzb3VyY2UsIG9wdGlvbnMpO1xuICB0cnkge1xuICAgIGNvbnN0IGNkcCA9IHdpbi53ZWJDb250ZW50cy5kZWJ1Z2dlcjtcbiAgICBjZHAuYXR0YWNoKFwiMS4zXCIpO1xuXG4gICAgd2luLndlYkNvbnRlbnRzLnNldEZyYW1lUmF0ZShmcHMpO1xuICAgIGlmICghd2luLndlYkNvbnRlbnRzLmlzUGFpbnRpbmcoKSkge1xuICAgICAgd2luLndlYkNvbnRlbnRzLnN0YXJ0UGFpbnRpbmcoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b3RhbCA9IE1hdGguY2VpbChmcHMgKiBkdXJhdGlvbik7XG4gICAgY29uc3QgZnJhbWVJbnRlcnZhbCA9IDEwMDAgLyBmcHM7XG5cbiAgICBsZXQgd3JpdHRlbiA9IDA7XG4gICAgbGV0IGxhc3RXcml0dGVuVGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBwcm9ncmVzcyA9IDA7XG4gICAgbGV0IGZyYW1lRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXNvbHZlcjogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWplY3RlcjogKChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY292ZXJCZ3JhOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW5jb2RlUXVldWUgPSBuZXcgQ29uY3VycmVuY3lMaW1pdGVyKDEpO1xuXG4gICAgY29uc3Qgc2NoZWR1bGVGcmFtZSA9IChmcmFtZTogQnVmZmVyLCB0aW1lc3RhbXBVczogbnVtYmVyKSA9PiB7XG4gICAgICB3cml0dGVuKys7XG4gICAgICBjb25zdCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgZW5jb2RlUXVldWUgLy9cbiAgICAgICAgLnNjaGVkdWxlKCgpID0+IHBpcGVsaW5lLmVuY29kZUZyYW1lKGZyYW1lLCB0aW1lc3RhbXBVcykpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gKGZyYW1lRXJyb3IgPz89IGUpKTtcbiAgICAgIGNvbnN0IGRpZmYgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHQwO1xuICAgICAgaWYgKGRpZmYgPiBmcmFtZUludGVydmFsICogMS4yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFRBRywgYGZyYW1lIHN0YWxsZWQgaW4gJHtkaWZmfW1zYCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHBhaW50ID0gKF9lOiB1bmtub3duLCBfcjogdW5rbm93biwgaW1hZ2U6IE5hdGl2ZUltYWdlKSA9PiB7XG4gICAgICBpZiAoZnJhbWVFcnJvcikge1xuICAgICAgICByZWplY3Rlcj8uKGZyYW1lRXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0VtcHR5KGltYWdlKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBiaXRtYXAgPSBpbWFnZS50b0JpdG1hcCgpO1xuICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBkZWNvZGVUaW1lc3RhbXAoYml0bWFwLCBpbWFnZS5nZXRTaXplKCkpO1xuICAgICAgaWYgKGN1cnJlbnRUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZnJhbWVFcnJvciA/Pz0gbmV3IEVycm9yKGBubyB0aW1lc3RhbXAgQCAke3dyaXR0ZW59YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnl0ZXNQZXJSb3cgPSB3aWR0aCAqIDQ7XG4gICAgICBjb25zdCBjcm9wcGVkID0gQnVmZmVyLmZyb20oYml0bWFwLmJ1ZmZlciwgYml0bWFwLmJ5dGVPZmZzZXQsIGhlaWdodCAqIGJ5dGVzUGVyUm93KTtcblxuICAgICAgY292ZXJCZ3JhID8/PSBjcm9wcGVkO1xuXG4gICAgICBpZiAobGFzdFdyaXR0ZW5UaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NoZWR1bGVGcmFtZShjcm9wcGVkLCBjdXJyZW50VGltZSAqIDEwMDApO1xuICAgICAgICBsYXN0V3JpdHRlblRpbWUgPSBjdXJyZW50VGltZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRpbWVEZWx0YSA9IGN1cnJlbnRUaW1lIC0gbGFzdFdyaXR0ZW5UaW1lO1xuICAgICAgICBpZiAodGltZURlbHRhID49IGZyYW1lSW50ZXJ2YWwgKiAwLjgpIHtcbiAgICAgICAgICBpZiAodGltZURlbHRhIDw9IGZyYW1lSW50ZXJ2YWwgKiAxLjIpIHtcbiAgICAgICAgICAgIHNjaGVkdWxlRnJhbWUoY3JvcHBlZCwgY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZnJhbWVzVG9JbnNlcnQgPSBNYXRoLnJvdW5kKHRpbWVEZWx0YSAvIGZyYW1lSW50ZXJ2YWwpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZXNUb0luc2VydCAmJiB3cml0dGVuIDwgdG90YWw7IGkrKykge1xuICAgICAgICAgICAgICBzY2hlZHVsZUZyYW1lKGNyb3BwZWQsIE1hdGgucm91bmQoKGxhc3RXcml0dGVuVGltZSArIChpICsgMSkgKiBmcmFtZUludGVydmFsKSAqIDEwMDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdFdyaXR0ZW5UaW1lID0gY3VycmVudFRpbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3UHJvZ3Jlc3MgPSBNYXRoLmZsb29yKCh3cml0dGVuIC8gdG90YWwpICogMTAwKTtcbiAgICAgIGlmIChNYXRoLmFicyhuZXdQcm9ncmVzcyAtIHByb2dyZXNzKSA+IDEwKSB7XG4gICAgICAgIHByb2dyZXNzID0gbmV3UHJvZ3Jlc3M7XG4gICAgICAgIGxvZ2dlci5pbmZvKFRBRywgYHByb2dyZXNzOiAke01hdGgucm91bmQocHJvZ3Jlc3MpfSVgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IGR1cmF0aW9uICogMTAwMDtcbiAgICAgIGlmIChjdXJyZW50VGltZSA+PSBkdXJhdGlvbk1zIC0gZnJhbWVJbnRlcnZhbCAqIDAuNSB8fCB3cml0dGVuID49IHRvdGFsKSB7XG4gICAgICAgIHJlc29sdmVyPy4oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luLndlYkNvbnRlbnRzLm9uKFwicGFpbnRcIiwgcGFpbnQpO1xuICAgIGF3YWl0IHN0YXJ0U3luYyhjZHApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigociwgaikgPT4gKFtyZXNvbHZlciwgcmVqZWN0ZXJdID0gW3IsIGpdKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHN0b3BTeW5jKGNkcCk7XG4gICAgICB3aW4ud2ViQ29udGVudHMub2ZmKFwicGFpbnRcIiwgcGFpbnQpO1xuICAgICAgYXdhaXQgYXVkaW9DYXB0dXJlPy50ZWFyZG93bigpO1xuICAgIH1cblxuICAgIGlmIChmcmFtZUVycm9yIHx8IHdyaXR0ZW4gPT09IDApIHtcbiAgICAgIHRocm93IGZyYW1lRXJyb3IgPz8gbmV3IEVycm9yKFwibm8gZnJhbWVzIGNhcHR1cmVkXCIpO1xuICAgIH1cblxuICAgIGF3YWl0IGVuY29kZVF1ZXVlLmVuZCgpO1xuICAgIGNvbnN0IG91dHB1dEZpbGVzID0gYXdhaXQgcGlwZWxpbmUuZmluaXNoKCk7XG4gICAgY29uc3QgY292ZXJQYXRoID0gam9pbihvdXREaXIsIFwiY292ZXIucG5nXCIpO1xuICAgIG9rKGNvdmVyQmdyYSwgXCJjb3ZlciBpbWFnZSBpcyBtaXNzaW5nXCIpO1xuICAgIGNvbnN0IHBuZyA9IG5hdGl2ZUltYWdlLmNyZWF0ZUZyb21CdWZmZXIoY292ZXJCZ3JhLCB7IHdpZHRoLCBoZWlnaHQgfSkudG9QTkcoKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoY292ZXJQYXRoLCBwbmcpO1xuICAgIGNvbnN0IHJlc3VsdDogUmVuZGVyUmVzdWx0ID0ge1xuICAgICAgb3B0aW9ucyxcbiAgICAgIHdyaXR0ZW4sXG4gICAgICBmaWxlczogeyAuLi5vdXRwdXRGaWxlcywgY292ZXI6IGNvdmVyUGF0aCB9LFxuICAgIH07XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4ob3V0RGlyLCBcInN1bW1hcnkuanNvblwiKSwgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgbG9nZ2VyLmluZm8oVEFHLCBgcHJvZ3Jlc3M6IDEwMCUsICR7d3JpdHRlbn0gZnJhbWVzIHdyaXR0ZW5gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB3aW4uY2xvc2UoKTtcbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMy8xMy5cblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z2dlciB9IGZyb20gXCJlbGVjdHJvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gYWR2YW5jZVZpcnR1YWxUaW1lKGNkcDogRGVidWdnZXIsIGJ1ZGdldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSAoXzogRWxlY3Ryb24uRXZlbnQsIG1ldGhvZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcIkVtdWxhdGlvbi52aXJ0dWFsVGltZUJ1ZGdldEV4cGlyZWRcIikge1xuICAgICAgICBjZHAub2ZmKFwibWVzc2FnZVwiLCBoYW5kbGVyKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgY2RwLm9uKFwibWVzc2FnZVwiLCBoYW5kbGVyKTtcbiAgICBjZHAuc2VuZENvbW1hbmQoXCJFbXVsYXRpb24uc2V0VmlydHVhbFRpbWVQb2xpY3lcIiwge1xuICAgICAgcG9saWN5OiBcImFkdmFuY2VcIixcbiAgICAgIGJ1ZGdldCxcbiAgICB9KTtcbiAgfSk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAzLzEzLlxuXG5pbXBvcnQgeyBvayB9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG5hdGl2ZUltYWdlLCB0eXBlIEJyb3dzZXJXaW5kb3csIHR5cGUgTmF0aXZlSW1hZ2UgfSBmcm9tIFwiZWxlY3Ryb25cIjtcbmltcG9ydCB7IG1rZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgYWR2YW5jZVZpcnR1YWxUaW1lIH0gZnJvbSBcIi4uL2Jhc2UvY2RwXCI7XG5pbXBvcnQgeyBFbmNvZGVyUGlwZWxpbmUgfSBmcm9tIFwiLi4vYmFzZS9lbmNvZGVyL2VuY29kZXJcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vYmFzZS9pbWFnZVwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jhc2UvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZGVjb2RlVGltZXN0YW1wLCBzdGFydFN5bmMsIHN0b3BTeW5jIH0gZnJvbSBcIi4vZnJhbWVfc3luY1wiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJPcHRpb25zLCBSZW5kZXJSZXN1bHQgfSBmcm9tIFwiLi9zY2hlbWFcIjtcbmltcG9ydCB7IGxvYWRXaW5kb3cgfSBmcm9tIFwiLi93aW5kb3dcIjtcblxuY29uc3QgVEFHID0gXCJbU2hvb3RdXCI7XG5cbmZ1bmN0aW9uIHRpY2tBbmltcyh0aWNrOiBudW1iZXIpIHtcbiAgcmV0dXJuIGBkb2N1bWVudC5nZXRBbmltYXRpb25zKCkuZm9yRWFjaCgoYSkgPT4ge1xuICAgIGEucGF1c2UoKTtcbiAgICBhLmN1cnJlbnRUaW1lICs9ICR7dGlja307XG4gIH0pYDtcbn1cblxuZnVuY3Rpb24gYXdhaXRTdGVnb0ZyYW1lKFxuICB3aW46IEJyb3dzZXJXaW5kb3csXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBhZnRlclRzOiBudW1iZXIsXG4gIGZyYW1lSW5kZXg6IG51bWJlcixcbik6IFByb21pc2U8QnVmZmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgZnJhbWUgJHtmcmFtZUluZGV4fSBwYWludCB0aW1lb3V0YCkpLCAxXzAwMCk7XG4gICAgY29uc3QgaGFuZGxlciA9IChfZTogdW5rbm93biwgX2Q6IHVua25vd24sIGltYWdlOiBOYXRpdmVJbWFnZSkgPT4ge1xuICAgICAgaWYgKGlzRW1wdHkoaW1hZ2UpKSByZXR1cm47XG4gICAgICBjb25zdCBiaXRtYXAgPSBpbWFnZS50b0JpdG1hcCgpO1xuICAgICAgY29uc3QgdHMgPSBkZWNvZGVUaW1lc3RhbXAoYml0bWFwLCBpbWFnZS5nZXRTaXplKCkpO1xuICAgICAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPD0gYWZ0ZXJUcykgcmV0dXJuO1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgd2luLndlYkNvbnRlbnRzLm9mZihcInBhaW50XCIsIGhhbmRsZXIpO1xuICAgICAgcmVzb2x2ZShCdWZmZXIuZnJvbShiaXRtYXAuYnVmZmVyLCBiaXRtYXAuYnl0ZU9mZnNldCwgaGVpZ2h0ICogd2lkdGggKiA0KSk7XG4gICAgfTtcbiAgICB3aW4ud2ViQ29udGVudHMub24oXCJwYWludFwiLCBoYW5kbGVyKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG9vdChzb3VyY2U6IHN0cmluZywgb3B0aW9uczogUmVuZGVyT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IG91dERpciwgZnBzLCB3aWR0aCwgaGVpZ2h0LCBkdXJhdGlvbiwgd2l0aEF1ZGlvLCBmb3JtYXRzIH0gPSBvcHRpb25zO1xuICBpZiAod2l0aEF1ZGlvKSB7XG4gICAgbG9nZ2VyLndhcm4oVEFHLCBcIkF1ZGlvIGNhcHR1cmUgaXMgbm90IHN1cHBvcnRlZCBpbiBkZXRlcm1pbmlzdGljIG1vZGVcIik7XG4gIH1cblxuICBsb2dnZXIuaW5mbyhUQUcsIGBwcm9ncmVzczogMCVgKTtcbiAgYXdhaXQgbWtkaXIob3V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCB3aW4gPSBhd2FpdCBsb2FkV2luZG93KHNvdXJjZSwgb3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2RwID0gd2luLndlYkNvbnRlbnRzLmRlYnVnZ2VyO1xuICAgIGNkcC5hdHRhY2goXCIxLjNcIik7XG5cbiAgICB3aW4ud2ViQ29udGVudHMuc2V0RnJhbWVSYXRlKDI0MCk7XG4gICAgY29uc3Qgcm9vdEZyYW1lID0gd2luLndlYkNvbnRlbnRzLm1haW5GcmFtZS5mcmFtZXNbMF07XG4gICAgYXdhaXQgcm9vdEZyYW1lPy5leGVjdXRlSmF2YVNjcmlwdCh0aWNrQW5pbXMoMCkpO1xuXG4gICAgaWYgKCF3aW4ud2ViQ29udGVudHMuaXNQYWludGluZygpKSB7XG4gICAgICB3aW4ud2ViQ29udGVudHMuc3RhcnRQYWludGluZygpO1xuICAgIH1cblxuICAgIGF3YWl0IHN0YXJ0U3luYyhjZHApO1xuXG4gICAgY29uc3QgcGlwZWxpbmUgPSBhd2FpdCBFbmNvZGVyUGlwZWxpbmUuY3JlYXRlKHsgd2lkdGgsIGhlaWdodCwgZnBzLCBmb3JtYXRzLCBvdXREaXIsIHdpdGhBdWRpbyB9KTtcbiAgICBjb25zdCB0b3RhbCA9IE1hdGguY2VpbChmcHMgKiBkdXJhdGlvbik7XG4gICAgY29uc3QgZnJhbWVJbnRlcnZhbCA9IDEwMDAgLyBmcHM7XG4gICAgY29uc3QgZnJhbWVJbnRlcnZhbFVzID0gTWF0aC5yb3VuZCgxXzAwMF8wMDAgLyBmcHMpO1xuXG4gICAgbGV0IHdyaXR0ZW4gPSAwO1xuICAgIGxldCBwcm9ncmVzcyA9IDA7XG4gICAgbGV0IGNvdmVyQmdyYTogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAobGV0IGZyYW1lID0gMDsgZnJhbWUgPCB0b3RhbDsgZnJhbWUrKykge1xuICAgICAgICBjb25zdCBmcmFtZU1zID0gKGZyYW1lICsgMSkgKiBmcmFtZUludGVydmFsO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gYXdhaXRTdGVnb0ZyYW1lKHdpbiwgd2lkdGgsIGhlaWdodCwgZnJhbWVNcyAtIDEsIGZyYW1lKTtcblxuICAgICAgICBhd2FpdCBhZHZhbmNlVmlydHVhbFRpbWUoY2RwLCBmcmFtZUludGVydmFsKTtcbiAgICAgICAgYXdhaXQgcm9vdEZyYW1lPy5leGVjdXRlSmF2YVNjcmlwdCh0aWNrQW5pbXMoZnJhbWVJbnRlcnZhbCkpO1xuXG4gICAgICAgIGNvbnN0IGJpdG1hcCA9IGF3YWl0IHBlbmRpbmc7XG5cbiAgICAgICAgaWYgKGZyYW1lID09PSAwKSB7XG4gICAgICAgICAgY292ZXJCZ3JhID0gYml0bWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgcGlwZWxpbmUuZW5jb2RlRnJhbWUoYml0bWFwLCBmcmFtZSAqIGZyYW1lSW50ZXJ2YWxVcyk7XG4gICAgICAgIHdyaXR0ZW4rKztcblxuICAgICAgICBjb25zdCBuZXdQcm9ncmVzcyA9IE1hdGguZmxvb3IoKHdyaXR0ZW4gLyB0b3RhbCkgKiAxMDApO1xuICAgICAgICBpZiAoTWF0aC5hYnMobmV3UHJvZ3Jlc3MgLSBwcm9ncmVzcykgPiAxMCkge1xuICAgICAgICAgIHByb2dyZXNzID0gbmV3UHJvZ3Jlc3M7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oVEFHLCBgcHJvZ3Jlc3M6ICR7TWF0aC5yb3VuZChwcm9ncmVzcyl9JWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHN0b3BTeW5jKGNkcCk7XG4gICAgICBjZHAuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgaWYgKHdyaXR0ZW4gPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGZyYW1lcyBjYXB0dXJlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRGaWxlcyA9IGF3YWl0IHBpcGVsaW5lLmZpbmlzaCgpO1xuICAgIGNvbnN0IGNvdmVyUGF0aCA9IGpvaW4ob3V0RGlyLCBcImNvdmVyLnBuZ1wiKTtcbiAgICBvayhjb3ZlckJncmEsIFwiY292ZXIgaW1hZ2UgaXMgbWlzc2luZ1wiKTtcbiAgICBjb25zdCBwbmcgPSBuYXRpdmVJbWFnZS5jcmVhdGVGcm9tQnVmZmVyKGNvdmVyQmdyYSwgeyB3aWR0aCwgaGVpZ2h0IH0pLnRvUE5HKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGNvdmVyUGF0aCwgcG5nKTtcbiAgICBjb25zdCByZXN1bHQ6IFJlbmRlclJlc3VsdCA9IHtcbiAgICAgIG9wdGlvbnMsXG4gICAgICB3cml0dGVuLFxuICAgICAgZmlsZXM6IHsgLi4ub3V0cHV0RmlsZXMsIGNvdmVyOiBjb3ZlclBhdGggfSxcbiAgICB9O1xuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKG91dERpciwgXCJzdW1tYXJ5Lmpzb25cIiksIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgIGxvZ2dlci5pbmZvKFRBRywgYHByb2dyZXNzOiAxMDAlLCAke3dyaXR0ZW59IGZyYW1lcyB3cml0dGVuYCk7XG4gIH0gZmluYWxseSB7XG4gICAgd2luLmNsb3NlKCk7XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDEvMzAuXG5cbmltcG9ydCB7IGFwcCB9IGZyb20gXCJlbGVjdHJvblwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vYmFzZS9sb2dnaW5nXCI7XG5pbXBvcnQgeyBtYWtlQ0xJIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tIFwiLi9yZW5kZXJlci9yZW5kZXJcIjtcbmltcG9ydCB7IHNob290IH0gZnJvbSBcIi4vcmVuZGVyZXIvc2hvb3RcIjtcblxucHJvY2Vzcy5vbmNlKFwiZXhpdFwiLCAoKSA9PiBhcHAucXVpdCgpKTtcblxuY29uc3QgVEFHID0gXCJbQXBwXVwiO1xuXG5mdW5jdGlvbiBwcmludEZlYXR1cmVzKCkge1xuICBsb2dnZXIuZGVidWcoVEFHLCBcImdwdSBmZWF0dXJlczpcIiwgYXBwLmdldEdQVUZlYXR1cmVTdGF0dXMoKSk7XG59XG5cbmFwcC5kb2NrPy5oaWRlKCk7XG5cbm1ha2VDTEkoXCJhcHBcIiwgYXN5bmMgKHNvdXJjZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIGFwcC5vbihcImdwdS1pbmZvLXVwZGF0ZVwiLCBwcmludEZlYXR1cmVzKTtcbiAgICBhd2FpdCBhcHAud2hlblJlYWR5KCk7XG4gICAgcHJpbnRGZWF0dXJlcygpO1xuICAgIGNvbnN0IGFjdGlvbiA9IG9wdGlvbnMuZGV0ZXJtaW5pc3RpYyA/IHNob290IDogcmVuZGVyO1xuICAgIGF3YWl0IGFjdGlvbihzb3VyY2UsIG9wdGlvbnMpO1xuICB9IGZpbmFsbHkge1xuICAgIGFwcC5xdWl0KCk7XG4gIH1cbn0pO1xuIl19
|
|
163
|
+
a.currentTime += ${r};
|
|
164
|
+
})`}function Dr(r,e,t,o,i){return new Promise((n,a)=>{let c=setTimeout(()=>a(new Error(`frame ${i} paint timeout`)),1e3),s=(d,u,m)=>{if(se(m))return;let l=m.toBitmap(),p=de(l,m.getSize());p===void 0||p<=o||(clearTimeout(c),r.webContents.off("paint",s),n(Buffer.from(l.buffer,l.byteOffset,t*e*4)));};r.webContents.on("paint",s);})}async function Tt(r,e){let{outDir:t,fps:o,width:i,height:n,duration:a,withAudio:c,formats:s}=e;c&&f.warn(we,"Audio capture is not supported in deterministic mode"),f.info(we,"progress: 0%"),await promises.mkdir(t,{recursive:true});let d=await le(r,e);try{let u=d.webContents.debugger;u.attach("1.3"),d.webContents.setFrameRate(240);let m=d.webContents.mainFrame.frames[0];await m?.executeJavaScript(Ct(0)),d.webContents.isPainting()||d.webContents.startPainting(),await me(u);let l=await B.create({width:i,height:n,fps:o,formats:s,outDir:t,withAudio:c}),p=Math.ceil(o*a),x=1e3/o,_=Math.round(1e6/o),g=0,F=0,w;try{for(let E=0;E<p;E++){let q=(E+1)*x,_e=Dr(d,i,n,q-1,E);await At(u,x),await m?.executeJavaScript(Ct(x));let V=await _e;E===0&&(w=V),await l.encodeFrame(V,E*_),g++;let z=Math.floor(g/p*100);Math.abs(z-F)>10&&(F=z,f.info(we,`progress: ${Math.round(F)}%`));}}finally{await ue(u),u.detach();}if(g===0)throw new Error("no frames captured");let v=await l.finish(),b=path.join(t,"cover.png");assert.ok(w,"cover image is missing");let A=electron.nativeImage.createFromBuffer(w,{width:i,height:n}).toPNG();await promises.writeFile(b,A);let j={options:e,written:g,files:{...v,cover:b}};await promises.writeFile(path.join(t,"summary.json"),JSON.stringify(j)),f.info(we,`progress: 100%, ${g} frames written`);}finally{d.close();}}process.once("exit",()=>electron.app.quit());var Vr="[App]";function St(){f.debug(Vr,"gpu features:",electron.app.getGPUFeatureStatus());}electron.app.dock?.hide();et("app",async(r,e)=>{try{electron.app.on("gpu-info-update",St),await electron.app.whenReady(),St(),await(e.deterministic?Tt:Et)(r,e);}finally{electron.app.quit();}});//# sourceMappingURL=app.cjs.map
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYnVuL3RzdXBAOC41LjErMDdhMGQ2MWJiMDc1MTRlZS9ub2RlX21vZHVsZXMvdHN1cC9hc3NldHMvY2pzX3NoaW1zLmpzIiwiLi4vc3JjL2Jhc2UvZW52LnRzIiwiLi4vc3JjL2Jhc2UvcGFyc2VyLnRzIiwiLi4vc3JjL2Jhc2UvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Jhc2UvbG9nZ2luZy50cyIsIi4uL3NyYy9iYXNlL25vZXJyLnRzIiwiLi4vc3JjL2Jhc2UvcHJvY2Vzcy50cyIsIi4uL3NyYy9yZW5kZXJlci9zY2hlbWEudHMiLCIuLi9zcmMvY29tbW9uLnRzIiwiLi4vc3JjL2Jhc2UvbGltaXRlci50cyIsIi4uL3NyYy9iYXNlL2VuY29kZXIvYXVkaW8udHMiLCIuLi9zcmMvYmFzZS9lbmNvZGVyL211eGVyLnRzIiwiLi4vc3JjL2Jhc2UvZW5jb2Rlci92aWRlby50cyIsIi4uL3NyYy9iYXNlL2VuY29kZXIvZW5jb2Rlci50cyIsIi4uL3NyYy9iYXNlL2ltYWdlLnRzIiwiLi4vc3JjL3JlbmRlcmVyL2F1ZGlvX2NhcHR1cmUudHMiLCIuLi9zcmMvcmVuZGVyZXIvZnJhbWVfc3luYy50cyIsIi4uL3NyYy9iYXNlL3RpbWluZy50cyIsIi4uL3NyYy9iYXNlL3JldHJ5LnRzIiwiLi4vc3JjL3JlbmRlcmVyL2h0bWxfY2hlY2sudHMiLCIuLi9zcmMvYmFzZS93YWl0YWJsZV9ldmVudC50cyIsIi4uL3NyYy9yZW5kZXJlci9uZXR3b3JrLnRzIiwiLi4vc3JjL3JlbmRlcmVyL3dpbmRvdy50cyIsIi4uL3NyYy9yZW5kZXJlci9yZW5kZXIudHMiLCIuLi9zcmMvYmFzZS9jZHAudHMiLCIuLi9zcmMvcmVuZGVyZXIvc2hvb3QudHMiLCIuLi9zcmMvYXBwLnRzIl0sIm5hbWVzIjpbImdldEltcG9ydE1ldGFVcmwiLCJpbXBvcnRNZXRhVXJsIiwicGVudiIsIm5hbWUiLCJwYXJzZXIiLCJkZWZhdWx0VmFsdWUiLCJwYXJzZU51bWJlciIsIngiLCJudW0iLCJwYXJzZVN0cmluZyIsInJlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwiZW52IiwicHVwTG9nTGV2ZWwiLCJwdXBVc2VJbm5lclByb3h5IiwicHVwUGtnUm9vdCIsImRpcm5hbWUiLCJqb2luIiwiREVCVUciLCJJTkZPIiwiV0FSTiIsIkVSUk9SIiwiRkFUQUwiLCJzdGFja0hvb2siLCJ0YXJnZXQiLCJfY29udGV4dCIsIm1lc3NhZ2VzIiwicHJvY2Vzc2VkIiwibXNnIiwiX2ZhdGFsX2RlYyIsIl9lcnJvcl9kZWMiLCJfd2Fybl9kZWMiLCJfaW5mb19kZWMiLCJfZGVidWdfZGVjIiwiX2luaXQiLCJMb2dnZXIiLCJfbGV2ZWwiLCJfX3J1bkluaXRpYWxpemVycyIsIl9fcHVibGljRmllbGQiLCJ2YWx1ZSIsImRlYnVnIiwiaW5mbyIsIndhcm4iLCJlcnJvciIsImx2IiwibWVzc2FnZSIsInByb2MiLCJyZXNvbHZlIiwicmVqZWN0IiwiZmF0YWwiLCJkaXNwYXRjaCIsImRhdGEiLCJlcnIiLCJjb2RlIiwic2lnbmFsIiwicmVhc29uIiwiX19kZWNvcmF0b3JTdGFydCIsIl9fZGVjb3JhdGVFbGVtZW50IiwiX19kZWNvcmF0b3JNZXRhZGF0YSIsImxvZ2dlciIsIm5vZXJyIiwiZm4iLCJhcmdzIiwicmV0IiwiUFVQX0FSR1NfS0VZIiwicGFyZ3MiLCJhcmd2IiwicHJpdiIsImFyZyIsIkRFRkFVTFRfV0lEVEgiLCJERUZBVUxUX0hFSUdIVCIsIkRFRkFVTFRfRlBTIiwiREVGQVVMVF9EVVJBVElPTiIsIkRFRkFVTFRfT1VUX0RJUiIsIlZJREVPX0ZPUk1BVFMiLCJpc1ZpZGVvRm9ybWF0IiwicyIsIlJlbmRlclNjaGVtYSIsInoiLCJtYWtlQ0xJIiwiY2FsbGJhY2siLCJzaGFwZSIsInByb2dyYW0iLCJzb3VyY2UiLCJvcHRzIiwiZSIsIkNvbmN1cnJlbmN5TGltaXRlciIsIm1heENvbmN1cnJlbmN5IiwicnVuIiwidiIsInIiLCJTQU1QTEVfRk1UX05BTUUiLCJBVl9TQU1QTEVfRk1UX0ZMVCIsIkFWX1NBTVBMRV9GTVRfRkxUUCIsIkF1ZGlvRW5jb2RlciIsIl9BdWRpb0VuY29kZXIiLCJjdHgiLCJzdHJlYW0iLCJvdXRGbXQiLCJQYWNrZXQiLCJGcmFtZSIsIm91dFNhbXBsZVJhdGUiLCJvdXRTYW1wbGVGbXQiLCJjb2RlY05hbWUiLCJnbG9iYWxIZWFkZXIiLCJiaXRyYXRlIiwibXV4ZXIiLCJjb2RlYyIsIkNvZGVjIiwiQ29kZWNDb250ZXh0IiwiQVZfQ0hBTk5FTF9MQVlPVVRfU1RFUkVPIiwiUmF0aW9uYWwiLCJBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIiLCJGRm1wZWdFcnJvciIsImluU2FtcGxlUmF0ZSIsImdyYXBoIiwiRmlsdGVyR3JhcGgiLCJhYnVmZmVyIiwiRmlsdGVyIiwic3JjQXJncyIsImJ1ZlNyYyIsImFidWZmZXJzaW5rIiwiYnVmU2luayIsImZpbHRlckRlc2MiLCJvdXRwdXRzIiwiRmlsdGVySW5PdXQiLCJpbnB1dHMiLCJwY20iLCJfc3RhY2siLCJzcmMiLCJpIiwiblNhbXBsZXMiLCJmcmFtZSIsIl9fdXNpbmciLCJfIiwiX2Vycm9yIiwiX2hhc0Vycm9yIiwiX19jYWxsRGlzcG9zZSIsIm91dEZyYW1lIiwiQVZFUlJPUl9FQUdBSU4iLCJBVkVSUk9SX0VPRiIsInBrdCIsIkZvcm1hdE11eGVyIiwib3V0UGF0aCIsIkZvcm1hdENvbnRleHQiLCJjb2RlY0N0eCIsImNvZGVjVGFnIiwiVmlkZW9FbmNvZGVyIiwiX1ZpZGVvRW5jb2RlciIsInN3cyIsImRzdCIsIndpZHRoIiwiaGVpZ2h0IiwiZnBzIiwicGl4Rm10IiwiY29kZWNPcHRzIiwiayIsIlNvZnR3YXJlU2NhbGVDb250ZXh0IiwiQVZfUElYX0ZNVF9CR1JBIiwiU1dTX0JJTElORUFSIiwiYmdyYSIsIkxvZyIsImxldmVsIiwiQVZfTE9HX0VSUk9SIiwiQVZfTE9HX1dBUk5JTkciLCJGT1JNQVRfU1BFQ1MiLCJGRl9FTkNPREVSX0xJQlgyNjUiLCJBVl9QSVhfRk1UX1lVVkE0MjBQIiwiRkZfRU5DT0RFUl9BQUMiLCJFbmNvZGVyUGlwZWxpbmUiLCJfRW5jb2RlclBpcGVsaW5lIiwic3RhdGVzIiwiZm9ybWF0cyIsIm91dERpciIsIndpdGhBdWRpbyIsInZpZGVvQml0cmF0ZSIsImF1ZGlvQml0cmF0ZSIsImZvcm1hdCIsInNwZWMiLCJ2aWRlbyIsImF1ZGlvIiwibGltaXRlciIsInNhbXBsZVJhdGUiLCJfdGltZXN0YW1wVXMiLCJyZXN1bHQiLCJfYSIsIl92IiwiX20iLCJfcHJvbWlzZSIsImlzRW1wdHkiLCJpbWFnZSIsInNpemUiLCJUQUciLCJBVURJT19DQVBUVVJFX1NDUklQVCIsInNldHVwQXVkaW9DYXB0dXJlIiwicGlwZWxpbmUiLCJwcmVsb2FkUGF0aCIsInRtcGRpciIsInJhbmRvbVVVSUQiLCJ3cml0ZUZpbGUiLCJzZXNzaW9uIiwiaXBjTWFpbiIsIl9lIiwiYnVmZmVyIiwicm0iLCJidWlsZFdyYXBwZXJIVE1MIiwidGFyZ2V0VVJMIiwiZGVjb2RlVGltZXN0YW1wIiwiYml0bWFwIiwibWFya2VyUm93IiwidGltZXN0YW1wIiwicGl4ZWxJZHgiLCJiaXQiLCJzdGFydFN5bmMiLCJjZHAiLCJzdG9wU3luYyIsInNsZWVwIiwibXMiLCJ1c2VSZXRyeSIsIm1heEF0dGVtcHRzIiwidGltZW91dCIsInRpbWVvdXRFcnJvciIsImF0dGVtcHQiLCJwcm9taXNlcyIsInNldFRpbWVvdXQiLCJTVVBQT1JURURfUFJPVE9DT0xTIiwiU09VUkNFX1BBVFRFUk4iLCJjaGVja0hUTUwiLCJwcm90b2NvbCIsIldhaXRhYmxlRXZlbnQiLCJvcHRpb25zIiwibWFwIiwicHJveGllZFVybCIsInVybCIsInBhcnNlZCIsIlVSTCIsInNldEludGVyY2VwdG9yIiwid2luZG93IiwidXNlSW5uZXJQcm94eSIsInJlcSIsImV2ZW50cyIsIndhaXQiLCJrZXkiLCJvblRpbWVvdXQiLCJldmVudCIsImRldGFpbHMiLCJwcm94aWVkIiwicmVzcG9uc2VIZWFkZXJzIiwidW5zZXRJbnRlcmNlcHRvciIsIndhaXRGb3JGaW5pc2giLCJ3aW4iLCJhY3Rpb24iLCJkb25lIiwiZGVzYyIsImV4aXRDb2RlIiwib3BlbldpbmRvdyIsIndpbnMiLCJ3IiwiQnJvd3NlcldpbmRvdyIsImxpbmVOdW1iZXIiLCJzb3VyY2VJZCIsIndyYXBwZXJIVE1MIiwiZGF0YVVSTCIsImxvYWRXaW5kb3ciLCJzdGFjayIsInJlbmRlciIsImR1cmF0aW9uIiwibWtkaXIiLCJhdWRpb0NhcHR1cmUiLCJ0b3RhbCIsImZyYW1lSW50ZXJ2YWwiLCJ3cml0dGVuIiwibGFzdFdyaXR0ZW5UaW1lIiwicHJvZ3Jlc3MiLCJmcmFtZUVycm9yIiwicmVzb2x2ZXIiLCJyZWplY3RlciIsImNvdmVyQmdyYSIsImVuY29kZVF1ZXVlIiwic2NoZWR1bGVGcmFtZSIsInRpbWVzdGFtcFVzIiwidDAiLCJkaWZmIiwicGFpbnQiLCJfciIsImN1cnJlbnRUaW1lIiwiYnl0ZXNQZXJSb3ciLCJjcm9wcGVkIiwidGltZURlbHRhIiwiZnJhbWVzVG9JbnNlcnQiLCJuZXdQcm9ncmVzcyIsImR1cmF0aW9uTXMiLCJqIiwib3V0cHV0RmlsZXMiLCJjb3ZlclBhdGgiLCJvayIsInBuZyIsIm5hdGl2ZUltYWdlIiwiYWR2YW5jZVZpcnR1YWxUaW1lIiwiYnVkZ2V0IiwiaGFuZGxlciIsIm1ldGhvZCIsInRpY2tBbmltcyIsInRpY2siLCJhd2FpdFN0ZWdvRnJhbWUiLCJhZnRlclRzIiwiZnJhbWVJbmRleCIsIl9kIiwidHMiLCJzaG9vdCIsInJvb3RGcmFtZSIsImZyYW1lSW50ZXJ2YWxVcyIsImZyYW1lTXMiLCJwZW5kaW5nIiwiYXBwIiwicHJpbnRGZWF0dXJlcyJdLCJtYXBwaW5ncyI6InFnQkFLQSxJQUFBLEVBQUEsQ0FBQSxNQUFBLENBQUEsTUFBQSxDQUFBLElBQUEsRUFBQSxDQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxDQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxDQUFBLE1BQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsVUFBQSxDQUFBLElBQUEsQ0FBQSxZQUFBLENBQUEsSUFBQSxDQUFBLFFBQUEsQ0FBQSxJQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLEVBQUEsQ0FBQSxDQUFBLEVBQUEsSUFBQSxFQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsUUFBQSxDQUFBLFFBQUEsQ0FBQSxRQUFBLENBQUEsVUFBQSxDQUFBLE9BQUEsQ0FBQSxPQUFBLENBQUEsS0FBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxHQUFBLE1BQUEsRUFBQSxPQUFBLENBQUEsRUFBQSxVQUFBLENBQUEsQ0FBQSxDQUFBLG1CQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxRQUFBLENBQUEsQ0FBQSxDQUFBLGNBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEscUJBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxJQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLFVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLElBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsT0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLElBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsTUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsT0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsRUFBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsQ0FBQSxFQUFBLElBQUEsQ0FBQSxDQUFBLE9BQUEsQ0FBQSxFQUFBLFFBQUEsRUFBQSxPQUFBLENBQUEsRUFBQSxVQUFBLEVBQUEsQ0FBQSxDQUFBLGlCQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLGNBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsTUFBQSxHQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLE9BQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxDQUFBLENBQUEsdUJBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsVUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBQSxDQUFBLE1BQUEsQ0FBQSxDQUFBLENBQUEsT0FBQSxPQUFBLENBQUEsTUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsT0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLE9BQUEsZUFBQSxFQUFBLFVBQUEsQ0FBQSxlQUFBLENBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FB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LENBQUtxSSxFQUFBQSxDQUFLLENBQUEsZ0JBQUEsRUFBbUIrRSxDQUFPLENBQUEsZUFBQSxDQUFpQixFQUM5RCxDQUFBLE9BQUUsQ0FDQXJCLENBQUFBLENBQUksS0FBQSxHQUNOLENBQ0YsQ0NySEEsT0FBQSxDQUFRLElBQUEsQ0FBSyxNQUFBLENBQVEsSUFBTWdFLFlBQUFBLENBQUksTUFBTSxDQUFBLENBRXJDLElBQU0xSCxFQUFBQSxDQUFNLE9BQUEsQ0FFWixTQUFTMkgsSUFBZ0IsQ0FDdkJoUSxDQUFBQSxDQUFPLEtBQUEsQ0FBTXFJLEVBQUFBLENBQUssZUFBQSxDQUFpQjBILFlBQUFBLENBQUkscUJBQXFCLEVBQzlELENBRUFBLFlBQUFBLENBQUksSUFBQSxFQUFNLElBQUEsR0FFVjNPLEVBQUFBLENBQVEsS0FBQSxDQUFPLE1BQU9JLENBQUFBLENBQVFtSixDQUFBQSxHQUFZLENBQ3hDLEdBQUksQ0FDRm9GLFlBQUFBLENBQUksRUFBQSxDQUFHLGlCQUFBLENBQW1CQyxFQUFhLENBQUEsQ0FDdkMsTUFBTUQsWUFBQUEsQ0FBSSxTQUFBLEVBQVUsQ0FDcEJDLEVBQUFBLEVBQWMsQ0FFZCxLQUFBLENBRGVyRixFQUFRLGFBQUEsQ0FBZ0IrRSxFQUFBQSxDQUFRNUMsRUFBQUEsRUFDbEN0TCxDQUFBQSxDQUFRbUosQ0FBTyxFQUM5QixDQUFBLE9BQUUsQ0FDQW9GLFlBQUFBLENBQUksSUFBQSxHQUNOLENBQ0YsQ0FBQyxDQUFBIiwiZmlsZSI6ImFwcC5janMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTaGltIGdsb2JhbHMgaW4gY2pzIGJ1bmRsZVxuLy8gVGhlcmUncyBhIHdlaXJkIGJ1ZyB0aGF0IGVzYnVpbGQgd2lsbCBhbHdheXMgaW5qZWN0IGltcG9ydE1ldGFVcmxcbi8vIGlmIHdlIGV4cG9ydCBpdCBhcyBgY29uc3QgaW1wb3J0TWV0YVVybCA9IC4uLiBfX2ZpbGVuYW1lIC4uLmBcbi8vIEJ1dCB1c2luZyBhIGZ1bmN0aW9uIHdpbGwgbm90IGNhdXNlIHRoaXMgaXNzdWVcblxuY29uc3QgZ2V0SW1wb3J0TWV0YVVybCA9ICgpID0+IFxuICB0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIgXG4gICAgPyBuZXcgVVJMKGBmaWxlOiR7X19maWxlbmFtZX1gKS5ocmVmIFxuICAgIDogKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdTQ1JJUFQnKSBcbiAgICAgID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgXG4gICAgICA6IG5ldyBVUkwoXCJtYWluLmpzXCIsIGRvY3VtZW50LmJhc2VVUkkpLmhyZWY7XG5cbmV4cG9ydCBjb25zdCBpbXBvcnRNZXRhVXJsID0gLyogQF9fUFVSRV9fICovIGdldEltcG9ydE1ldGFVcmwoKVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8yNS5cblxuZXhwb3J0IHR5cGUgRW52UGFyc2VyPFQ+ID0gKHZhbHVlOiB1bmtub3duKSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU6IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIHBlbnY8VD4obmFtZTogc3RyaW5nLCBwYXJzZXI6IEVudlBhcnNlcjxUPiwgZGVmYXVsdFZhbHVlPzogVCk6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlcihwcm9jZXNzLmVudltuYW1lXSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDEvMzAuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU51bWJlcih4OiB1bmtub3duKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB4ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgY29uc3QgbnVtID0gTnVtYmVyKHgpO1xuICBpZiAoTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlICR7eH0gaXMgbm90IGEgdmFsaWQgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIG51bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyaW5nKHg6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpIHJldHVybiB4O1xuICByZXR1cm4gU3RyaW5nKHgpO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJtb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcGVudiB9IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0IHsgcGFyc2VOdW1iZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IGVudiA9IHByb2Nlc3MuZW52O1xuXG5leHBvcnQgY29uc3QgcHVwTG9nTGV2ZWwgPSBwZW52KFwiUFVQX0xPR19MRVZFTFwiLCBwYXJzZU51bWJlciwgMik7XG5leHBvcnQgY29uc3QgcHVwVXNlSW5uZXJQcm94eSA9IGVudltcIlBVUF9VU0VfSU5ORVJfUFJPWFlcIl0gPT09IFwiMVwiO1xuZXhwb3J0IGNvbnN0IHB1cERpc2FibGVHUFUgPSBlbnZbXCJQVVBfRElTQUJMRV9HUFVcIl0gPT09IFwiMVwiO1xuXG5leHBvcnQgY29uc3QgcHVwUGtnUm9vdCA9IGRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKFwicHVwLXJlY29yZGVyL3BhY2thZ2UuanNvblwiKSk7XG5leHBvcnQgY29uc3QgcHVwQXBwID0gam9pbihwdXBQa2dSb290LCBcImRpc3RcIiwgXCJhcHAuY2pzXCIpO1xuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wNi5cblxuaW1wb3J0IHsgQ2hpbGRQcm9jZXNzLCB0eXBlIFNlcmlhbGl6YWJsZSB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBwdXBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlckxpa2Uge1xuICBkZWJ1Zz8odGhpczogdm9pZCwgLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQ7XG5cbiAgaW5mbz8odGhpczogdm9pZCwgLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQ7XG5cbiAgd2Fybj8odGhpczogdm9pZCwgLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQ7XG5cbiAgZXJyb3I/KHRoaXM6IHZvaWQsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkO1xufVxuXG5jb25zdCBERUJVRyA9IFwiPHB1cEBkZWJ1Zz5cIjtcbmNvbnN0IElORk8gPSBcIjxwdXBAaW5mbz5cIjtcbmNvbnN0IFdBUk4gPSBcIjxwdXBAd2Fybj5cIjtcbmNvbnN0IEVSUk9SID0gXCI8cHVwQGVycm9yPlwiO1xuY29uc3QgRkFUQUwgPSBcIjxwdXBAZmF0YWw+XCI7XG5cbmZ1bmN0aW9uIHN0YWNrSG9vayh0YXJnZXQ6IEZ1bmN0aW9uLCBfY29udGV4dDogQ2xhc3NNZXRob2REZWNvcmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhpczogTG9nZ2VyLCAuLi5tZXNzYWdlczogdW5rbm93bltdKSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkID0gbWVzc2FnZXMubWFwKChtc2cpID0+IHtcbiAgICAgIHJldHVybiBtc2cgaW5zdGFuY2VvZiBFcnJvciA/IChtc2cuc3RhY2sgPz8gU3RyaW5nKG1zZykpIDogbXNnO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5wcm9jZXNzZWQpO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgTG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VyTGlrZSB7XG4gIHByaXZhdGUgX2ltcGw/OiBMb2dnZXJMaWtlO1xuXG4gIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxuXG4gIHNldCBsZXZlbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbGV2ZWwgPSB2YWx1ZTtcbiAgICB0aGlzLmltcGwgPSB0aGlzLl9pbXBsID8/IGNvbnNvbGU7XG4gIH1cblxuICBnZXQgaW1wbCgpOiBMb2dnZXJMaWtlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW1wbDtcbiAgfVxuXG4gIHNldCBpbXBsKHZhbHVlOiBMb2dnZXJMaWtlKSB7XG4gICAgY29uc3QgZGVidWcgPSB2YWx1ZS5kZWJ1ZyA/PyBjb25zb2xlLmRlYnVnO1xuICAgIGNvbnN0IGluZm8gPSB2YWx1ZS5pbmZvID8/IGNvbnNvbGUuaW5mbztcbiAgICBjb25zdCB3YXJuID0gdmFsdWUud2FybiA/PyBjb25zb2xlLndhcm47XG4gICAgY29uc3QgZXJyb3IgPSB2YWx1ZS5lcnJvciA/PyBjb25zb2xlLmVycm9yO1xuICAgIGNvbnN0IGx2ID0gdGhpcy5fbGV2ZWw7XG4gICAgdGhpcy5faW1wbCA9IHtcbiAgICAgIGRlYnVnOiBsdiA+PSAzID8gZGVidWcgOiB1bmRlZmluZWQsXG4gICAgICBpbmZvOiBsdiA+PSAyID8gaW5mbyA6IHVuZGVmaW5lZCxcbiAgICAgIHdhcm46IGx2ID49IDEgPyB3YXJuIDogdW5kZWZpbmVkLFxuICAgICAgZXJyb3I6IGx2ID49IDAgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbGV2ZWw6IG51bWJlciA9IHB1cExvZ0xldmVsKSB7XG4gICAgdGhpcy5pbXBsID0gY29uc29sZTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgZGVidWcoLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8uZGVidWc/LihERUJVRywgLi4ubWVzc2FnZXMpO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICBpbmZvKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/LmluZm8/LihJTkZPLCAuLi5tZXNzYWdlcyk7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIHdhcm4oLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8ud2Fybj8uKFdBUk4sIC4uLm1lc3NhZ2VzKTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgZXJyb3IoLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8uZXJyb3I/LihFUlJPUiwgLi4ubWVzc2FnZXMpO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICBmYXRhbCguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy5lcnJvcj8uKEZBVEFMLCAuLi5tZXNzYWdlcyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBpZiAobWVzc2FnZS5zdGFydHNXaXRoKERFQlVHKSkge1xuICAgICAgdGhpcy5kZWJ1ZyhtZXNzYWdlLnNsaWNlKERFQlVHLmxlbmd0aCArIDEpKTtcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2Uuc3RhcnRzV2l0aChJTkZPKSkge1xuICAgICAgdGhpcy5pbmZvKG1lc3NhZ2Uuc2xpY2UoSU5GTy5sZW5ndGggKyAxKSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoV0FSTikpIHtcbiAgICAgIHRoaXMud2FybihtZXNzYWdlLnNsaWNlKFdBUk4ubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS5zdGFydHNXaXRoKEVSUk9SKSkge1xuICAgICAgdGhpcy5lcnJvcihtZXNzYWdlLnNsaWNlKEVSUk9SLmxlbmd0aCArIDEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbmZvKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaChwcm9jOiBDaGlsZFByb2Nlc3MsIG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRlYnVnKGAke25hbWV9LmF0dGFjaGApO1xuICAgICAgbGV0IGZhdGFsOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSAoZGF0YTogQnVmZmVyIHwgU2VyaWFsaXphYmxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoRkFUQUwpKSB7XG4gICAgICAgICAgZmF0YWwgKz0gbWVzc2FnZS5zbGljZShGQVRBTC5sZW5ndGggKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKFwiZGF0YVwiLCBkaXNwYXRjaCk7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oXCJkYXRhXCIsIGRpc3BhdGNoKTtcbiAgICAgIHByb2NcbiAgICAgICAgLm9uKFwibWVzc2FnZVwiLCBkaXNwYXRjaClcbiAgICAgICAgLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgIGZhdGFsICs9IGVyci5tZXNzYWdlO1xuICAgICAgICAgIHByb2Mua2lsbCgpO1xuICAgICAgICB9KVxuICAgICAgICAub25jZShcImNsb3NlXCIsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoY29kZSB8fCBzaWduYWwgfHwgZmF0YWwpIHtcbiAgICAgICAgICAgIGZhdGFsIHx8PSBgY29tbWFuZCBmYWlsZWQ6ICR7cHJvYy5zcGF3bmFyZ3Muam9pbihcIiBcIil9YDtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYCR7bmFtZX0uY2xvc2VgLCB7IGNvZGUsIHNpZ25hbCwgZmF0YWwgfSk7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGZhdGFsKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYCR7bmFtZX0uY2xvc2VgKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbihcInVuaGFuZGxlZFJlamVjdGlvblwiLCAocmVhc29uKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvcihgJHtuYW1lfS51bmhhbmRsZWRgLCByZWFzb24pO1xuICAgICAgICB9KVxuICAgICAgICAub24oXCJ1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3IoYCR7bmFtZX0udW5oYW5kbGVkYCwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuXG5leHBvcnQgeyBsb2dnZXIgfTtcbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMjQuXG5cbmV4cG9ydCBmdW5jdGlvbiBub2VycjxGbiBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBEPihcbiAgZm46IEZuLFxuICBkZWZhdWx0VmFsdWU6IEQsXG4pOiAoLi4uYXJnczogUGFyYW1ldGVyczxGbj4pID0+IFJldHVyblR5cGU8Rm4+IHwgRCB7XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBmbiguLi5hcmdzKTtcbiAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiByZXQuY2F0Y2goKCkgPT4gZGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDEvMzAuXG5cbmltcG9ydCB7IHNwYXduLCB0eXBlIENoaWxkUHJvY2VzcywgdHlwZSBTcGF3bk9wdGlvbnMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuXG5leHBvcnQgY29uc3QgUFVQX0FSR1NfS0VZID0gXCItLXB1cC1wcml2LWFyZ3NcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcmdzKCkge1xuICBjb25zdCBhcmd2ID0gcHJvY2Vzcy5hcmd2O1xuICBsZXQgcHJpdiA9IGFyZ3YuZmluZCgoYXJnKSA9PiBhcmcuc3RhcnRzV2l0aChQVVBfQVJHU19LRVkpKTtcbiAgaWYgKCFwcml2KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicHJvY2FyZ3ZcIiwgYXJndik7XG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndjtcbiAgfVxuICBjb25zdCBhcmdzID0gW1wiZXhlY1wiLCAuLi5hcmd2LnNsaWNlKC0xKV07XG4gIHByaXYgPSBCdWZmZXIuZnJvbShwcml2LnNwbGl0KFwiPVwiKVsxXSEsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKCk7XG4gIGFyZ3MucHVzaCguLi5KU09OLnBhcnNlKHByaXYpKTtcbiAgbG9nZ2VyLmRlYnVnKFwicHVwYXJnc1wiLCBhcmdzKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0hhbmRsZSB7XG4gIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcbiAgd2FpdDogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY21kOiBzdHJpbmcsIG9wdGlvbnM/OiBTcGF3bk9wdGlvbnMpOiBQcm9jZXNzSGFuZGxlIHtcbiAgY29uc3QgcGFydHMgPSBjbWQuc3BsaXQoXCIgXCIpLmZpbHRlcigocykgPT4gcy5sZW5ndGgpO1xuICBjb25zdCBbY29tbWFuZCwgLi4uYXJnc10gPSBwYXJ0cztcbiAgaWYgKCFjb21tYW5kKSB0aHJvdyBuZXcgRXJyb3IoXCJlbXB0eSBjb21tYW5kXCIpO1xuICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncywge1xuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbiAgcmV0dXJuIHsgcHJvY2VzczogcHJvYywgd2FpdDogbG9nZ2VyLmF0dGFjaChwcm9jLCBjb21tYW5kKSB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wNi5cblxuaW1wb3J0IHogZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpZGVvRmlsZXMge1xuICBjb3Zlcjogc3RyaW5nO1xuICBtcDQ/OiBzdHJpbmc7XG4gIHdlYm0/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dJRFRIID0gMTkyMDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0hFSUdIVCA9IDEwODA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9GUFMgPSAzMDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0RVUkFUSU9OID0gNTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVF9ESVIgPSBcIm91dFwiO1xuZXhwb3J0IGNvbnN0IFZJREVPX0ZPUk1BVFMgPSBbXCJtcDRcIiwgXCJ3ZWJtXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBWaWRlb0Zvcm1hdCA9ICh0eXBlb2YgVklERU9fRk9STUFUUylbbnVtYmVyXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmlkZW9Gb3JtYXQoczogc3RyaW5nKTogcyBpcyBWaWRlb0Zvcm1hdCB7XG4gIHJldHVybiBWSURFT19GT1JNQVRTLmluY2x1ZGVzKHMgYXMgVmlkZW9Gb3JtYXQpO1xufVxuXG5leHBvcnQgY29uc3QgUmVuZGVyU2NoZW1hID0gei5vYmplY3Qoe1xuICBkdXJhdGlvbjogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlZmF1bHQoREVGQVVMVF9EVVJBVElPTikuZGVzY3JpYmUoXCJEdXJhdGlvbiBpbiBzZWNvbmRzXCIpLFxuICB3aWR0aDogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlZmF1bHQoREVGQVVMVF9XSURUSCkuZGVzY3JpYmUoXCJWaWRlbyB3aWR0aFwiKSxcbiAgaGVpZ2h0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVmYXVsdChERUZBVUxUX0hFSUdIVCkuZGVzY3JpYmUoXCJWaWRlbyBoZWlnaHRcIiksXG4gIGZwczogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlZmF1bHQoREVGQVVMVF9GUFMpLmRlc2NyaWJlKFwiRnJhbWVzIHBlciBzZWNvbmRcIiksXG4gIGZvcm1hdHM6IHpcbiAgICAuYXJyYXkoei5lbnVtKFZJREVPX0ZPUk1BVFMpKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlZmF1bHQoW1wibXA0XCJdKVxuICAgIC5kZXNjcmliZShgT3V0cHV0IHZpZGVvIGZvcm1hdHMsIGFsbG93ICR7VklERU9fRk9STUFUUy5qb2luKFwiLCBcIil9YCksXG4gIHdpdGhBdWRpbzogei5ib29sZWFuKCkub3B0aW9uYWwoKS5kZWZhdWx0KGZhbHNlKS5kZXNjcmliZShcIkNhcHR1cmUgYW5kIGVuY29kZSBhdWRpb1wiKSxcbiAgb3V0RGlyOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVmYXVsdChERUZBVUxUX09VVF9ESVIpLmRlc2NyaWJlKFwiT3V0cHV0IGRpcmVjdG9yeVwiKSxcbiAgdXNlSW5uZXJQcm94eTogei5ib29sZWFuKCkub3B0aW9uYWwoKS5kZWZhdWx0KGZhbHNlKS5kZXNjcmliZShcIlVzZSBiaWxpYmlsaSBpbm5lciBwcm94eSBmb3IgcmVzb3VyY2UgYWNjZXNzXCIpLFxuICBkZXRlcm1pbmlzdGljOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLmRlZmF1bHQoZmFsc2UpLmRlc2NyaWJlKFwiUmVuZGVyIGJ5IGZyYW1lIHJhdGhlciB0aGFuIHJlY29yZGluZ1wiKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBSZW5kZXJPcHRpb25zID0gei5pbmZlcjx0eXBlb2YgUmVuZGVyU2NoZW1hPjtcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJSZXN1bHQge1xuICBvcHRpb25zOiBSZW5kZXJPcHRpb25zO1xuICB3cml0dGVuOiBudW1iZXI7XG4gIGZpbGVzOiBWaWRlb0ZpbGVzO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuaW1wb3J0IHsgcHJvZ3JhbSB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IHB1cFVzZUlubmVyUHJveHkgfSBmcm9tIFwiLi9iYXNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vYmFzZS9sb2dnaW5nXCI7XG5pbXBvcnQgeyBub2VyciB9IGZyb20gXCIuL2Jhc2Uvbm9lcnJcIjtcbmltcG9ydCB7IHBhcnNlTnVtYmVyLCBwYXJzZVN0cmluZyB9IGZyb20gXCIuL2Jhc2UvcGFyc2VyXCI7XG5pbXBvcnQgeyBwYXJncyB9IGZyb20gXCIuL2Jhc2UvcHJvY2Vzc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9EVVJBVElPTixcbiAgREVGQVVMVF9GUFMsXG4gIERFRkFVTFRfSEVJR0hULFxuICBERUZBVUxUX09VVF9ESVIsXG4gIERFRkFVTFRfV0lEVEgsXG4gIGlzVmlkZW9Gb3JtYXQsXG4gIFJlbmRlclNjaGVtYSxcbiAgdHlwZSBSZW5kZXJPcHRpb25zLFxufSBmcm9tIFwiLi9yZW5kZXJlci9zY2hlbWFcIjtcblxuZXhwb3J0IHR5cGUgQ0xJQ2FsbGJhY2sgPSAoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWtlQ0xJKG5hbWU6IHN0cmluZywgY2FsbGJhY2s6IENMSUNhbGxiYWNrKSB7XG4gIGNvbnN0IHNoYXBlID0gUmVuZGVyU2NoZW1hLnNoYXBlO1xuICBwcm9ncmFtXG4gICAgLm5hbWUobmFtZSlcbiAgICAuYXJndW1lbnQoXCI8c291cmNlPlwiLCBcImZpbGU6Ly8sIGh0dHAocyk6Ly8sIOaIliBkYXRhOiBVUklcIilcbiAgICAub3B0aW9uKFwiLVcsIC0td2lkdGggPG51bWJlcj5cIiwgc2hhcGUud2lkdGguZGVzY3JpcHRpb24sIGAke0RFRkFVTFRfV0lEVEh9YClcbiAgICAub3B0aW9uKFwiLUgsIC0taGVpZ2h0IDxudW1iZXI+XCIsIHNoYXBlLmhlaWdodC5kZXNjcmlwdGlvbiwgYCR7REVGQVVMVF9IRUlHSFR9YClcbiAgICAub3B0aW9uKFwiLWYsIC0tZnBzIDxudW1iZXI+XCIsIHNoYXBlLmZwcy5kZXNjcmlwdGlvbiwgYCR7REVGQVVMVF9GUFN9YClcbiAgICAub3B0aW9uKFwiLXQsIC0tZHVyYXRpb24gPG51bWJlcj5cIiwgc2hhcGUuZHVyYXRpb24uZGVzY3JpcHRpb24sIGAke0RFRkFVTFRfRFVSQVRJT059YClcbiAgICAub3B0aW9uKFwiLW8sIC0tb3V0LWRpciA8cGF0aD5cIiwgc2hhcGUub3V0RGlyLmRlc2NyaXB0aW9uLCBgJHtERUZBVUxUX09VVF9ESVJ9YClcbiAgICAub3B0aW9uKFwiLUYsIC0tZm9ybWF0cyA8Zm9ybWF0cz5cIiwgc2hhcGUuZm9ybWF0cy5kZXNjcmlwdGlvbiwgXCJtcDRcIilcbiAgICAub3B0aW9uKFwiLWEsIC0td2l0aC1hdWRpb1wiLCBzaGFwZS53aXRoQXVkaW8uZGVzY3JpcHRpb24sIGZhbHNlKVxuICAgIC5vcHRpb24oXCItLXVzZS1pbm5lci1wcm94eVwiLCBzaGFwZS51c2VJbm5lclByb3h5LmRlc2NyaXB0aW9uLCBwdXBVc2VJbm5lclByb3h5KVxuICAgIC5vcHRpb24oXCItZCwgLS1kZXRlcm1pbmlzdGljXCIsIHNoYXBlLmRldGVybWluaXN0aWMuZGVzY3JpcHRpb24sIGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKHNvdXJjZTogc3RyaW5nLCBvcHRzKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjYWxsYmFjayhzb3VyY2UsIHtcbiAgICAgICAgICB3aWR0aDogbm9lcnIocGFyc2VOdW1iZXIsIERFRkFVTFRfV0lEVEgpKG9wdHMud2lkdGgpLFxuICAgICAgICAgIGhlaWdodDogbm9lcnIocGFyc2VOdW1iZXIsIERFRkFVTFRfSEVJR0hUKShvcHRzLmhlaWdodCksXG4gICAgICAgICAgZnBzOiBub2VycihwYXJzZU51bWJlciwgREVGQVVMVF9GUFMpKG9wdHMuZnBzKSxcbiAgICAgICAgICBkdXJhdGlvbjogbm9lcnIocGFyc2VOdW1iZXIsIERFRkFVTFRfRFVSQVRJT04pKG9wdHMuZHVyYXRpb24pLFxuICAgICAgICAgIG91dERpcjogb3B0cy5vdXREaXIgPz8gREVGQVVMVF9PVVRfRElSLFxuICAgICAgICAgIGZvcm1hdHM6IHBhcnNlU3RyaW5nKG9wdHMuZm9ybWF0cylcbiAgICAgICAgICAgIC5zcGxpdChcIixcIilcbiAgICAgICAgICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihpc1ZpZGVvRm9ybWF0KSxcbiAgICAgICAgICB3aXRoQXVkaW86IG9wdHMud2l0aEF1ZGlvID8/IGZhbHNlLFxuICAgICAgICAgIHVzZUlubmVyUHJveHk6IG9wdHMudXNlSW5uZXJQcm94eSA/PyBwdXBVc2VJbm5lclByb3h5LFxuICAgICAgICAgIGRldGVybWluaXN0aWM6IG9wdHMuZGV0ZXJtaW5pc3RpYyA/PyBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5mYXRhbChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKHBhcmdzKCkpO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMS8zMC5cblxuZXhwb3J0IGNsYXNzIENvbmN1cnJlbmN5TGltaXRlciB7XG4gIHByaXZhdGUgX2FjdGl2ZSA9IDA7XG4gIHByaXZhdGUgX3F1ZXVlOiBWb2lkRnVuY3Rpb25bXSA9IFtdO1xuICBwcml2YXRlIF9lbmRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IG1heENvbmN1cnJlbmN5OiBudW1iZXIpIHt9XG5cbiAgZ2V0IGFjdGl2ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBnZXQgcGVuZGluZygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9xdWV1ZS5sZW5ndGg7XG4gIH1cblxuICBnZXQgc3RhdHMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGFjdGl2ZTogJHt0aGlzLmFjdGl2ZX0sIHBlbmRpbmc6ICR7dGhpcy5wZW5kaW5nfWA7XG4gIH1cblxuICBhc3luYyBzY2hlZHVsZTxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGlmICh0aGlzLl9lbmRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZW5kZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSsrO1xuICAgICAgICBmbigpXG4gICAgICAgICAgLnRoZW4oKHYpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZS0tO1xuICAgICAgICAgICAgcmVzb2x2ZSh2KTtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX3F1ZXVlLnB1c2gocnVuKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZW5kKCkge1xuICAgIGlmICh0aGlzLl9lbmRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbmRlZCA9IHRydWU7XG4gICAgd2hpbGUgKHRoaXMuX2FjdGl2ZSA+IDAgfHwgdGhpcy5wZW5kaW5nID4gMCkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgNTApKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5leHQoKSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSA8IHRoaXMubWF4Q29uY3VycmVuY3kpIHtcbiAgICAgIHRoaXMuX3F1ZXVlLnNoaWZ0KCk/LigpO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMy8yMS5cblxuaW1wb3J0IHtcbiAgQ29kZWMsXG4gIENvZGVjQ29udGV4dCxcbiAgRkZtcGVnRXJyb3IsXG4gIEZpbHRlcixcbiAgRmlsdGVyR3JhcGgsXG4gIEZpbHRlckluT3V0LFxuICBGcmFtZSxcbiAgUGFja2V0LFxuICBSYXRpb25hbCxcbiAgdHlwZSBGaWx0ZXJDb250ZXh0LFxufSBmcm9tIFwibm9kZS1hdlwiO1xuaW1wb3J0IHtcbiAgQVZfQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLFxuICBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIsXG4gIEFWX1NBTVBMRV9GTVRfRkxULFxuICBBVl9TQU1QTEVfRk1UX0ZMVFAsXG4gIEFWRVJST1JfRUFHQUlOLFxuICBBVkVSUk9SX0VPRixcbiAgdHlwZSBGRkF1ZGlvRW5jb2Rlcixcbn0gZnJvbSBcIm5vZGUtYXYvY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1hdE11eGVyIH0gZnJvbSBcIi4vbXV4ZXJcIjtcblxuY29uc3QgU0FNUExFX0ZNVF9OQU1FOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICBbQVZfU0FNUExFX0ZNVF9GTFRdOiBcImZsdFwiLFxuICBbQVZfU0FNUExFX0ZNVF9GTFRQXTogXCJmbHRwXCIsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvRW5jb2Rlck9wdGlvbnMge1xuICBvdXRTYW1wbGVSYXRlOiBudW1iZXI7XG4gIG91dFNhbXBsZUZtdDogdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUIHwgdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUUDtcbiAgY29kZWNOYW1lOiBGRkF1ZGlvRW5jb2RlcjtcbiAgZ2xvYmFsSGVhZGVyOiBib29sZWFuO1xuICBiaXRyYXRlOiBudW1iZXI7XG4gIG11eGVyOiBGb3JtYXRNdXhlcjtcbn1cblxudHlwZSBTdHJlYW0gPSBSZXR1cm5UeXBlPGltcG9ydChcIm5vZGUtYXZcIikuRm9ybWF0Q29udGV4dFtcIm5ld1N0cmVhbVwiXT47XG5cbmV4cG9ydCBjbGFzcyBBdWRpb0VuY29kZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3R4OiBDb2RlY0NvbnRleHQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0cmVhbTogU3RyZWFtO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vdXRSYXRlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX291dEZtdDogdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUIHwgdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUUDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZnJhbWVTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BrdDogUGFja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJGcmFtZTogRnJhbWU7XG5cbiAgcHJpdmF0ZSBfZ3JhcGg/OiBGaWx0ZXJHcmFwaDtcbiAgcHJpdmF0ZSBfYnVmU3JjPzogRmlsdGVyQ29udGV4dDtcbiAgcHJpdmF0ZSBfYnVmU2luaz86IEZpbHRlckNvbnRleHQ7XG4gIHByaXZhdGUgX2luUmF0ZT86IG51bWJlcjtcbiAgcHRzID0gMG47XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihjdHg6IENvZGVjQ29udGV4dCwgc3RyZWFtOiBTdHJlYW0sIG91dEZtdDogdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUIHwgdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUUCkge1xuICAgIHRoaXMuX2N0eCA9IGN0eDtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fb3V0UmF0ZSA9IGN0eC5zYW1wbGVSYXRlO1xuICAgIHRoaXMuX291dEZtdCA9IG91dEZtdDtcbiAgICB0aGlzLl9mcmFtZVNpemUgPSBjdHguZnJhbWVTaXplO1xuXG4gICAgdGhpcy5fcGt0ID0gbmV3IFBhY2tldCgpO1xuICAgIHRoaXMuX3BrdC5hbGxvYygpO1xuXG4gICAgdGhpcy5fZmlsdGVyRnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICB0aGlzLl9maWx0ZXJGcmFtZS5hbGxvYygpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZShvcHRzOiBBdWRpb0VuY29kZXJPcHRpb25zKTogUHJvbWlzZTxBdWRpb0VuY29kZXI+IHtcbiAgICBjb25zdCB7IG91dFNhbXBsZVJhdGUsIG91dFNhbXBsZUZtdCwgY29kZWNOYW1lLCBnbG9iYWxIZWFkZXIsIGJpdHJhdGUsIG11eGVyIH0gPSBvcHRzO1xuXG4gICAgY29uc3QgY29kZWMgPSBDb2RlYy5maW5kRW5jb2RlckJ5TmFtZShjb2RlY05hbWUpO1xuICAgIGlmICghY29kZWMpIHRocm93IG5ldyBFcnJvcihgQXVkaW8gZW5jb2RlciBub3QgZm91bmQ6ICR7Y29kZWNOYW1lfWApO1xuXG4gICAgY29uc3QgY3R4ID0gbmV3IENvZGVjQ29udGV4dCgpO1xuICAgIGN0eC5hbGxvY0NvbnRleHQzKGNvZGVjKTtcbiAgICBjdHguY29kZWNJZCA9IGNvZGVjLmlkO1xuICAgIGN0eC5zYW1wbGVGb3JtYXQgPSBvdXRTYW1wbGVGbXQ7XG4gICAgY3R4LnNhbXBsZVJhdGUgPSBvdXRTYW1wbGVSYXRlO1xuICAgIGN0eC5jaGFubmVsTGF5b3V0ID0gQVZfQ0hBTk5FTF9MQVlPVVRfU1RFUkVPO1xuICAgIGN0eC50aW1lQmFzZSA9IG5ldyBSYXRpb25hbCgxLCBvdXRTYW1wbGVSYXRlKTtcbiAgICBjdHguYml0UmF0ZSA9IEJpZ0ludChiaXRyYXRlKTtcbiAgICBpZiAoZ2xvYmFsSGVhZGVyKSBjdHguc2V0RmxhZ3MoQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgY3R4Lm9wZW4yKGNvZGVjLCBudWxsKSwgXCJhdWRpb0N0eC5vcGVuMlwiKTtcblxuICAgIGNvbnN0IHN0cmVhbSA9IG11eGVyLmFkZFN0cmVhbShjdHgpO1xuICAgIHJldHVybiBuZXcgQXVkaW9FbmNvZGVyKGN0eCwgc3RyZWFtLCBvdXRTYW1wbGVGbXQpO1xuICB9XG5cbiAgLyoqIENhbGxlZCBvbmNlIHdoZW4gYXVkaW8tbWV0YSBhcnJpdmVzIHdpdGggdGhlIHBhZ2UncyBhY3R1YWwgc2FtcGxlIHJhdGUuICovXG4gIHNldElucHV0UmF0ZShpblNhbXBsZVJhdGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Rpc3Bvc2VHcmFwaCgpO1xuICAgIHRoaXMuX2luUmF0ZSA9IGluU2FtcGxlUmF0ZTtcblxuICAgIGNvbnN0IGdyYXBoID0gbmV3IEZpbHRlckdyYXBoKCk7XG4gICAgZ3JhcGguYWxsb2MoKTtcblxuICAgIC8vIGFidWZmZXIgc291cmNlOiBpbnRlcmxlYXZlZCBzdGVyZW8gZmxvYXQgZnJvbSBicm93c2VyXG4gICAgY29uc3QgYWJ1ZmZlciA9IEZpbHRlci5nZXRCeU5hbWUoXCJhYnVmZmVyXCIpITtcbiAgICBjb25zdCBzcmNBcmdzID0gYHNhbXBsZV9yYXRlPSR7aW5TYW1wbGVSYXRlfTpzYW1wbGVfZm10PWZsdDpjaGFubmVsX2xheW91dD1zdGVyZW86dGltZV9iYXNlPTEvJHtpblNhbXBsZVJhdGV9YDtcbiAgICBjb25zdCBidWZTcmMgPSBncmFwaC5jcmVhdGVGaWx0ZXIoYWJ1ZmZlciwgXCJzcmNcIiwgc3JjQXJncyk7XG4gICAgaWYgKCFidWZTcmMpIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgYWJ1ZmZlclwiKTtcblxuICAgIC8vIGFidWZmZXJzaW5rXG4gICAgY29uc3QgYWJ1ZmZlcnNpbmsgPSBGaWx0ZXIuZ2V0QnlOYW1lKFwiYWJ1ZmZlcnNpbmtcIikhO1xuICAgIGNvbnN0IGJ1ZlNpbmsgPSBncmFwaC5jcmVhdGVGaWx0ZXIoYWJ1ZmZlcnNpbmssIFwic2lua1wiKTtcbiAgICBpZiAoIWJ1ZlNpbmspIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgYWJ1ZmZlcnNpbmtcIik7XG5cbiAgICAvLyBQYXJzZSBmaWx0ZXIgY2hhaW46IGFmb3JtYXQgKyBhc2V0bnNhbXBsZXNcbiAgICBjb25zdCBmbXROYW1lID0gU0FNUExFX0ZNVF9OQU1FW3RoaXMuX291dEZtdF0gPz8gXCJmbHRcIjtcbiAgICBjb25zdCBmaWx0ZXJEZXNjID0gYGFmb3JtYXQ9c2FtcGxlX2ZtdHM9JHtmbXROYW1lfTpzYW1wbGVfcmF0ZXM9JHt0aGlzLl9vdXRSYXRlfTpjaGFubmVsX2xheW91dHM9c3RlcmVvLGFzZXRuc2FtcGxlcz1uPSR7dGhpcy5fZnJhbWVTaXplfTpwPTFgO1xuXG4gICAgY29uc3Qgb3V0cHV0cyA9IEZpbHRlckluT3V0LmNyZWF0ZUxpc3QoW3sgbmFtZTogXCJpblwiLCBmaWx0ZXJDdHg6IGJ1ZlNyYywgcGFkSWR4OiAwIH1dKTtcbiAgICBjb25zdCBpbnB1dHMgPSBGaWx0ZXJJbk91dC5jcmVhdGVMaXN0KFt7IG5hbWU6IFwib3V0XCIsIGZpbHRlckN0eDogYnVmU2luaywgcGFkSWR4OiAwIH1dKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoZ3JhcGgucGFyc2VQdHIoZmlsdGVyRGVzYywgaW5wdXRzLCBvdXRwdXRzKSwgXCJncmFwaC5wYXJzZVB0clwiKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoZ3JhcGguY29uZmlnU3luYygpLCBcImdyYXBoLmNvbmZpZ1wiKTtcblxuICAgIHRoaXMuX2dyYXBoID0gZ3JhcGg7XG4gICAgdGhpcy5fYnVmU3JjID0gYnVmU3JjO1xuICAgIHRoaXMuX2J1ZlNpbmsgPSBidWZTaW5rO1xuICB9XG5cbiAgZ2V0IHN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtO1xuICB9XG4gIGdldCB0aW1lQmFzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3R4LnRpbWVCYXNlO1xuICB9XG5cbiAgYXN5bmMgZW5jb2RlKHBjbTogQnVmZmVyLCBtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2J1ZlNyYyB8fCAhdGhpcy5fYnVmU2luayB8fCAhdGhpcy5faW5SYXRlKSByZXR1cm47XG5cbiAgICAvLyBJbi1wbGFjZSBzYW5pdGl6ZSDigJQgbXV0YXRlIHNvdXJjZSBkaXJlY3RseSwgbm8gY29weVxuICAgIGNvbnN0IHNyYyA9IG5ldyBGbG9hdDMyQXJyYXkocGNtLmJ1ZmZlciwgcGNtLmJ5dGVPZmZzZXQsIHBjbS5ieXRlTGVuZ3RoIC8gNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghaXNGaW5pdGUoc3JjW2ldISkpIHNyY1tpXSA9IDA7XG4gICAgfVxuICAgIGNvbnN0IG5TYW1wbGVzID0gc3JjLmxlbmd0aCA+PiAxO1xuXG4gICAgdXNpbmcgZnJhbWUgPSBGcmFtZS5mcm9tQXVkaW9CdWZmZXIoQnVmZmVyLmZyb20oc3JjLmJ1ZmZlciwgc3JjLmJ5dGVPZmZzZXQsIHNyYy5ieXRlTGVuZ3RoKSwge1xuICAgICAgbmJTYW1wbGVzOiBuU2FtcGxlcyxcbiAgICAgIGZvcm1hdDogQVZfU0FNUExFX0ZNVF9GTFQsXG4gICAgICBzYW1wbGVSYXRlOiB0aGlzLl9pblJhdGUsXG4gICAgICBjaGFubmVsTGF5b3V0OiBBVl9DSEFOTkVMX0xBWU9VVF9TVEVSRU8sXG4gICAgICBwdHM6IHRoaXMucHRzLFxuICAgICAgdGltZUJhc2U6IHsgbnVtOiAxLCBkZW46IHRoaXMuX2luUmF0ZSB9LFxuICAgIH0pO1xuICAgIHRoaXMucHRzICs9IEJpZ0ludChuU2FtcGxlcyk7XG5cbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fYnVmU3JjLmJ1ZmZlcnNyY0FkZEZyYW1lKGZyYW1lKSwgXCJidWZmZXJzcmNBZGRGcmFtZVwiKTtcbiAgICBhd2FpdCB0aGlzLl9kcmFpbkZpbHRlcihtdXhlcik7XG4gIH1cblxuICBhc3luYyBmbHVzaChtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fYnVmU3JjICYmIHRoaXMuX2J1ZlNpbmspIHtcbiAgICAgIC8vIFNpZ25hbCBFT0YgdG8gZmlsdGVyIGdyYXBoXG4gICAgICBhd2FpdCB0aGlzLl9idWZTcmMuYnVmZmVyc3JjQWRkRnJhbWUobnVsbCk7XG4gICAgICBhd2FpdCB0aGlzLl9kcmFpbkZpbHRlcihtdXhlcik7XG4gICAgfVxuICAgIC8vIEZsdXNoIGNvZGVjXG4gICAgYXdhaXQgdGhpcy5fY3R4LnNlbmRGcmFtZShudWxsKTtcbiAgICBhd2FpdCB0aGlzLl9kcmFpbkNvZGVjKG11eGVyKTtcbiAgfVxuXG4gIFtTeW1ib2wuZGlzcG9zZV0oKTogdm9pZCB7XG4gICAgdGhpcy5fcGt0LmZyZWUoKTtcbiAgICB0aGlzLl9maWx0ZXJGcmFtZS5mcmVlKCk7XG4gICAgdGhpcy5fZGlzcG9zZUdyYXBoKCk7XG4gICAgdGhpcy5fY3R4LmZyZWVDb250ZXh0KCk7XG4gIH1cblxuICAvKiogRHJhaW4gZmlsdGVyIOKGkiBzZW5kIHRvIGNvZGVjIOKGkiBkcmFpbiBjb2RlYyBwYWNrZXRzLiAqL1xuICBwcml2YXRlIGFzeW5jIF9kcmFpbkZpbHRlcihtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvdXRGcmFtZSA9IHRoaXMuX2ZpbHRlckZyYW1lO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5fYnVmU2luayEuYnVmZmVyc2lua0dldEZyYW1lKG91dEZyYW1lKTtcbiAgICAgIGlmIChyID09PSBBVkVSUk9SX0VBR0FJTiB8fCByID09PSBBVkVSUk9SX0VPRikgYnJlYWs7XG4gICAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IociwgXCJidWZmZXJzaW5rR2V0RnJhbWVcIik7XG4gICAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fY3R4LnNlbmRGcmFtZShvdXRGcmFtZSksIFwiYXVkaW9DdHguc2VuZEZyYW1lXCIpO1xuICAgICAgb3V0RnJhbWUudW5yZWYoKTtcbiAgICAgIGF3YWl0IHRoaXMuX2RyYWluQ29kZWMobXV4ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEcmFpbiBjb2RlYyBwYWNrZXRzIHRvIG11eGVyLiAqL1xuICBwcml2YXRlIGFzeW5jIF9kcmFpbkNvZGVjKG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBrdCA9IHRoaXMuX3BrdDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuX2N0eC5yZWNlaXZlUGFja2V0KHBrdCk7XG4gICAgICBpZiAociA9PT0gQVZFUlJPUl9FQUdBSU4gfHwgciA9PT0gQVZFUlJPUl9FT0YpIGJyZWFrO1xuICAgICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHIsIFwiYXVkaW8ucmVjZWl2ZVBhY2tldFwiKTtcbiAgICAgIHBrdC5zdHJlYW1JbmRleCA9IHRoaXMuX3N0cmVhbS5pbmRleDtcbiAgICAgIHBrdC5yZXNjYWxlVHModGhpcy5fY3R4LnRpbWVCYXNlLCB0aGlzLl9zdHJlYW0udGltZUJhc2UpO1xuICAgICAgYXdhaXQgbXV4ZXIud3JpdGVQYWNrZXQocGt0KTtcbiAgICAgIHBrdC51bnJlZigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Rpc3Bvc2VHcmFwaCgpOiB2b2lkIHtcbiAgICAvLyBGaWx0ZXJHcmFwaC5mcmVlKCkgcmVsZWFzZXMgYWxsIGNvbnRhaW5lZCBmaWx0ZXIgY29udGV4dHNcbiAgICB0aGlzLl9ncmFwaD8uW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgIHRoaXMuX2dyYXBoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2J1ZlNyYyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9idWZTaW5rID0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb2RlY0NvbnRleHQsIEZGbXBlZ0Vycm9yLCBGb3JtYXRDb250ZXh0LCBQYWNrZXQgfSBmcm9tIFwibm9kZS1hdlwiO1xuXG5leHBvcnQgY2xhc3MgRm9ybWF0TXV4ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdHg6IEZvcm1hdENvbnRleHQ7XG4gIHByaXZhdGUgX29wZW5lZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKG91dFBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuX2N0eCA9IG5ldyBGb3JtYXRDb250ZXh0KCk7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHRoaXMuX2N0eC5hbGxvY091dHB1dENvbnRleHQyKG51bGwsIG51bGwsIG91dFBhdGgpLCBcImFsbG9jT3V0cHV0Q29udGV4dDJcIik7XG4gIH1cblxuICBhZGRTdHJlYW0oY29kZWNDdHg6IENvZGVjQ29udGV4dCwgY29kZWNUYWc/OiBzdHJpbmcpOiBSZXR1cm5UeXBlPEZvcm1hdENvbnRleHRbXCJuZXdTdHJlYW1cIl0+IHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9jdHgubmV3U3RyZWFtKG51bGwpO1xuICAgIHN0cmVhbS50aW1lQmFzZSA9IGNvZGVjQ3R4LnRpbWVCYXNlO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihzdHJlYW0uY29kZWNwYXIuZnJvbUNvbnRleHQoY29kZWNDdHgpLCBcImNvZGVjcGFyLmZyb21Db250ZXh0XCIpO1xuICAgIGlmIChjb2RlY1RhZykgc3RyZWFtLmNvZGVjcGFyLmNvZGVjVGFnID0gY29kZWNUYWc7XG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIGFzeW5jIG9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX29wZW5lZCkgcmV0dXJuO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9jdHgub3Blbk91dHB1dCgpLCBcIm9wZW5PdXRwdXRcIik7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHRoaXMuX2N0eC53cml0ZUhlYWRlcihudWxsKSwgXCJ3cml0ZUhlYWRlclwiKTtcbiAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgd3JpdGVQYWNrZXQocGt0OiBQYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fY3R4LmludGVybGVhdmVkV3JpdGVGcmFtZShwa3QpLCBcImludGVybGVhdmVkV3JpdGVGcmFtZVwiKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX29wZW5lZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuX2N0eC53cml0ZVRyYWlsZXIoKTtcbiAgICBhd2FpdCB0aGlzLl9jdHguY2xvc2VPdXRwdXQoKTtcbiAgICB0aGlzLl9vcGVuZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaCgpO1xuICAgIGF3YWl0IHRoaXMuX2N0eFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAzLzIxLlxuXG5pbXBvcnQgeyBDb2RlYywgQ29kZWNDb250ZXh0LCBGRm1wZWdFcnJvciwgRnJhbWUsIFBhY2tldCwgUmF0aW9uYWwsIFNvZnR3YXJlU2NhbGVDb250ZXh0IH0gZnJvbSBcIm5vZGUtYXZcIjtcbmltcG9ydCB7XG4gIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUixcbiAgQVZfUElYX0ZNVF9CR1JBLFxuICBBVl9QSVhfRk1UX1lVVjQyMFAsXG4gIEFWX1BJWF9GTVRfWVVWQTQyMFAsXG4gIEFWRVJST1JfRUFHQUlOLFxuICBBVkVSUk9SX0VPRixcbiAgU1dTX0JJTElORUFSLFxuICB0eXBlIEZGVmlkZW9FbmNvZGVyLFxufSBmcm9tIFwibm9kZS1hdi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgRm9ybWF0TXV4ZXIgfSBmcm9tIFwiLi9tdXhlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpZGVvRW5jb2Rlck9wdGlvbnMge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgZnBzOiBudW1iZXI7XG4gIGNvZGVjTmFtZTogRkZWaWRlb0VuY29kZXI7XG4gIHBpeEZtdDogdHlwZW9mIEFWX1BJWF9GTVRfWVVWQTQyMFAgfCB0eXBlb2YgQVZfUElYX0ZNVF9ZVVY0MjBQO1xuICBjb2RlY1RhZz86IHN0cmluZztcbiAgZ2xvYmFsSGVhZGVyOiBib29sZWFuO1xuICBjb2RlY09wdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGJpdHJhdGU6IG51bWJlcjtcbiAgbXV4ZXI6IEZvcm1hdE11eGVyO1xufVxuXG50eXBlIFN0cmVhbSA9IFJldHVyblR5cGU8aW1wb3J0KFwibm9kZS1hdlwiKS5Gb3JtYXRDb250ZXh0W1wibmV3U3RyZWFtXCJdPjtcblxuZXhwb3J0IGNsYXNzIFZpZGVvRW5jb2RlciBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdHg6IENvZGVjQ29udGV4dDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3dzOiBTb2Z0d2FyZVNjYWxlQ29udGV4dDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3JjOiBGcmFtZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZHN0OiBGcmFtZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGt0OiBQYWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0cmVhbTogU3RyZWFtO1xuICBwdHMgPSAwbjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIGN0eDogQ29kZWNDb250ZXh0LFxuICAgIHN3czogU29mdHdhcmVTY2FsZUNvbnRleHQsXG4gICAgc3JjOiBGcmFtZSxcbiAgICBkc3Q6IEZyYW1lLFxuICAgIHBrdDogUGFja2V0LFxuICAgIHN0cmVhbTogU3RyZWFtLFxuICApIHtcbiAgICB0aGlzLl9jdHggPSBjdHg7XG4gICAgdGhpcy5fc3dzID0gc3dzO1xuICAgIHRoaXMuX3NyYyA9IHNyYztcbiAgICB0aGlzLl9kc3QgPSBkc3Q7XG4gICAgdGhpcy5fcGt0ID0gcGt0O1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUob3B0czogVmlkZW9FbmNvZGVyT3B0aW9ucyk6IFByb21pc2U8VmlkZW9FbmNvZGVyPiB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBmcHMsIGNvZGVjTmFtZSwgcGl4Rm10LCBjb2RlY1RhZywgZ2xvYmFsSGVhZGVyLCBjb2RlY09wdHMsIGJpdHJhdGUsIG11eGVyIH0gPSBvcHRzO1xuXG4gICAgY29uc3QgY29kZWMgPSBDb2RlYy5maW5kRW5jb2RlckJ5TmFtZShjb2RlY05hbWUpO1xuICAgIGlmICghY29kZWMpIHRocm93IG5ldyBFcnJvcihgVmlkZW8gZW5jb2RlciBub3QgZm91bmQ6ICR7Y29kZWNOYW1lfWApO1xuXG4gICAgY29uc3QgY3R4ID0gbmV3IENvZGVjQ29udGV4dCgpO1xuICAgIGN0eC5hbGxvY0NvbnRleHQzKGNvZGVjKTtcbiAgICBjdHguY29kZWNJZCA9IGNvZGVjLmlkO1xuICAgIGN0eC53aWR0aCA9IHdpZHRoO1xuICAgIGN0eC5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY3R4LnBpeGVsRm9ybWF0ID0gcGl4Rm10O1xuICAgIGN0eC50aW1lQmFzZSA9IG5ldyBSYXRpb25hbCgxLCBmcHMpO1xuICAgIGN0eC5mcmFtZXJhdGUgPSBuZXcgUmF0aW9uYWwoZnBzLCAxKTtcbiAgICBjdHguZ29wU2l6ZSA9IGZwcztcbiAgICBjdHguYml0UmF0ZSA9IEJpZ0ludChiaXRyYXRlKTtcbiAgICBjdHguc2V0T3B0aW9uKFwidGhyZWFkc1wiLCBcIjRcIik7XG4gICAgaWYgKGdsb2JhbEhlYWRlcikgY3R4LnNldEZsYWdzKEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUik7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoY29kZWNPcHRzKSkgY3R4LnNldE9wdGlvbihrLCB2KTtcbiAgICBpZiAoY29kZWNUYWcpIGN0eC5jb2RlY1RhZyA9IGNvZGVjVGFnO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCBjdHgub3BlbjIoY29kZWMsIG51bGwpLCBcInZpZGVvQ3R4Lm9wZW4yXCIpO1xuXG4gICAgY29uc3Qgc3dzID0gbmV3IFNvZnR3YXJlU2NhbGVDb250ZXh0KCk7XG4gICAgc3dzLmdldENvbnRleHQod2lkdGgsIGhlaWdodCwgQVZfUElYX0ZNVF9CR1JBLCB3aWR0aCwgaGVpZ2h0LCBwaXhGbXQsIFNXU19CSUxJTkVBUik7XG5cbiAgICBjb25zdCBkc3QgPSBuZXcgRnJhbWUoKTtcbiAgICBkc3QuYWxsb2MoKTtcbiAgICBkc3QuZm9ybWF0ID0gcGl4Rm10O1xuICAgIGRzdC53aWR0aCA9IHdpZHRoO1xuICAgIGRzdC5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGRzdC5nZXRCdWZmZXIoMCksIFwiZHN0RnJhbWUuZ2V0QnVmZmVyXCIpO1xuXG4gICAgLy8gUHJlLWFsbG9jYXRlIHNyYyBmcmFtZSAoQkdSQSwgcmV1c2VkIGV2ZXJ5IGVuY29kZSlcbiAgICBjb25zdCBzcmMgPSBuZXcgRnJhbWUoKTtcbiAgICBzcmMuYWxsb2MoKTtcbiAgICBzcmMuZm9ybWF0ID0gQVZfUElYX0ZNVF9CR1JBO1xuICAgIHNyYy53aWR0aCA9IHdpZHRoO1xuICAgIHNyYy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHNyYy5nZXRCdWZmZXIoMCksIFwic3JjRnJhbWUuZ2V0QnVmZmVyXCIpO1xuXG4gICAgLy8gUHJlLWFsbG9jYXRlIHJldXNhYmxlIHBhY2tldFxuICAgIGNvbnN0IHBrdCA9IG5ldyBQYWNrZXQoKTtcbiAgICBwa3QuYWxsb2MoKTtcblxuICAgIGNvbnN0IHN0cmVhbSA9IG11eGVyLmFkZFN0cmVhbShjdHgsIGNvZGVjVGFnKTtcbiAgICByZXR1cm4gbmV3IFZpZGVvRW5jb2RlcihjdHgsIHN3cywgc3JjLCBkc3QsIHBrdCwgc3RyZWFtKTtcbiAgfVxuXG4gIGdldCBzdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmVhbTtcbiAgfVxuICBnZXQgdGltZUJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N0eC50aW1lQmFzZTtcbiAgfVxuXG4gIGFzeW5jIGVuY29kZShiZ3JhOiBCdWZmZXIsIG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgX3NyYzogc3JjLCBfZHN0OiBkc3QsIF9zd3M6IHN3cyB9ID0gdGhpcztcblxuICAgIC8vIFJldXNlIHNyYyBmcmFtZTogbWFrZVdyaXRhYmxlICsgZnJvbUJ1ZmZlciArIHB0c1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihzcmMubWFrZVdyaXRhYmxlKCksIFwic3JjLm1ha2VXcml0YWJsZVwiKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3Ioc3JjLmZyb21CdWZmZXIoYmdyYSksIFwic3JjLmZyb21CdWZmZXJcIik7XG4gICAgc3JjLnB0cyA9IHRoaXMucHRzO1xuXG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGRzdC5tYWtlV3JpdGFibGUoKSwgXCJkc3QubWFrZVdyaXRhYmxlXCIpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCBzd3Muc2NhbGVGcmFtZShkc3QsIHNyYyksIFwic3dzLnNjYWxlRnJhbWVcIik7XG5cbiAgICBkc3QucHRzID0gdGhpcy5wdHMrKztcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fY3R4LnNlbmRGcmFtZShkc3QpLCBcInZpZGVvQ3R4LnNlbmRGcmFtZVwiKTtcbiAgICBhd2FpdCB0aGlzLmRyYWluKG11eGVyKTtcbiAgfVxuXG4gIGFzeW5jIGZsdXNoKG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuX2N0eC5zZW5kRnJhbWUobnVsbCk7XG4gICAgYXdhaXQgdGhpcy5kcmFpbihtdXhlcik7XG4gIH1cblxuICBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIHRoaXMuX3BrdC5mcmVlKCk7XG4gICAgdGhpcy5fc3JjLmZyZWUoKTtcbiAgICB0aGlzLl9kc3QuZnJlZSgpO1xuICAgIHRoaXMuX3N3c1tTeW1ib2wuZGlzcG9zZV0oKTtcbiAgICB0aGlzLl9jdHguZnJlZUNvbnRleHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZHJhaW4obXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGt0ID0gdGhpcy5fcGt0O1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5fY3R4LnJlY2VpdmVQYWNrZXQocGt0KTtcbiAgICAgIGlmIChyID09PSBBVkVSUk9SX0VBR0FJTiB8fCByID09PSBBVkVSUk9SX0VPRikgYnJlYWs7XG4gICAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IociwgXCJ2aWRlby5yZWNlaXZlUGFja2V0XCIpO1xuICAgICAgcGt0LnN0cmVhbUluZGV4ID0gdGhpcy5fc3RyZWFtLmluZGV4O1xuICAgICAgcGt0LnJlc2NhbGVUcyh0aGlzLl9jdHgudGltZUJhc2UsIHRoaXMuX3N0cmVhbS50aW1lQmFzZSk7XG4gICAgICBhd2FpdCBtdXhlci53cml0ZVBhY2tldChwa3QpO1xuICAgICAgcGt0LnVucmVmKCk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAzLzIxLlxuXG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwibm9kZS1hdlwiO1xuaW1wb3J0IHtcbiAgQVZfTE9HX0VSUk9SLFxuICBBVl9MT0dfV0FSTklORyxcbiAgQVZfUElYX0ZNVF9ZVVZBNDIwUCxcbiAgQVZfU0FNUExFX0ZNVF9GTFQsXG4gIEFWX1NBTVBMRV9GTVRfRkxUUCxcbiAgRkZfRU5DT0RFUl9BQUMsXG4gIEZGX0VOQ09ERVJfTElCWDI2NSxcbiAgdHlwZSBGRkF1ZGlvRW5jb2RlcixcbiAgdHlwZSBGRlZpZGVvRW5jb2Rlcixcbn0gZnJvbSBcIm5vZGUtYXYvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHR5cGUgeyBWaWRlb0Zvcm1hdCB9IGZyb20gXCIuLi8uLi9yZW5kZXJlci9zY2hlbWFcIjtcbmltcG9ydCB7IENvbmN1cnJlbmN5TGltaXRlciB9IGZyb20gXCIuLi9saW1pdGVyXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQXVkaW9FbmNvZGVyIH0gZnJvbSBcIi4vYXVkaW9cIjtcbmltcG9ydCB7IEZvcm1hdE11eGVyIH0gZnJvbSBcIi4vbXV4ZXJcIjtcbmltcG9ydCB7IFZpZGVvRW5jb2RlciB9IGZyb20gXCIuL3ZpZGVvXCI7XG5cbkxvZy5zZXRDYWxsYmFjaygobGV2ZWwsIG1lc3NhZ2UpID0+IHtcbiAgY29uc3QgbXNnID0gbWVzc2FnZS50cmltRW5kKCk7XG4gIGlmICghbXNnKSByZXR1cm47XG4gIGlmIChsZXZlbCA8PSBBVl9MT0dfRVJST1IpIGxvZ2dlci5lcnJvcihtc2cpO1xuICBlbHNlIGlmIChsZXZlbCA8PSBBVl9MT0dfV0FSTklORykgbG9nZ2VyLndhcm4obXNnKTtcbn0pO1xuXG5pbnRlcmZhY2UgRm9ybWF0U3BlYyB7XG4gIHZpZGVvQ29kZWNOYW1lOiBGRlZpZGVvRW5jb2RlcjtcbiAgcGl4Rm10OiB0eXBlb2YgQVZfUElYX0ZNVF9ZVVZBNDIwUDtcbiAgY29kZWNUYWc/OiBzdHJpbmc7XG4gIGdsb2JhbEhlYWRlcjogYm9vbGVhbjtcbiAgdmlkZW9PcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBhdWRpb0NvZGVjTmFtZTogRkZBdWRpb0VuY29kZXI7XG4gIGF1ZGlvU2FtcGxlRm10OiB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFQgfCB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFRQO1xuICBvdXRTYW1wbGVSYXRlOiBudW1iZXI7XG59XG5cbmNvbnN0IEZPUk1BVF9TUEVDUzogUmVjb3JkPFZpZGVvRm9ybWF0LCBGb3JtYXRTcGVjPiA9IHtcbiAgbXA0OiB7XG4gICAgdmlkZW9Db2RlY05hbWU6IEZGX0VOQ09ERVJfTElCWDI2NSxcbiAgICBwaXhGbXQ6IEFWX1BJWF9GTVRfWVVWQTQyMFAsXG4gICAgY29kZWNUYWc6IFwiaHZjMVwiLFxuICAgIGdsb2JhbEhlYWRlcjogdHJ1ZSxcbiAgICB2aWRlb09wdHM6IHsgcHJlc2V0OiBcInVsdHJhZmFzdFwiLCBcIngyNjUtcGFyYW1zXCI6IFwibG9nLWxldmVsPTFcIiB9LFxuICAgIGF1ZGlvQ29kZWNOYW1lOiBGRl9FTkNPREVSX0FBQyxcbiAgICBhdWRpb1NhbXBsZUZtdDogQVZfU0FNUExFX0ZNVF9GTFRQLFxuICAgIG91dFNhbXBsZVJhdGU6IDQ0XzEwMCxcbiAgfSxcbiAgd2VibToge1xuICAgIHZpZGVvQ29kZWNOYW1lOiBcImxpYnZweC12cDlcIiBhcyBGRlZpZGVvRW5jb2RlcixcbiAgICBwaXhGbXQ6IEFWX1BJWF9GTVRfWVVWQTQyMFAsXG4gICAgZ2xvYmFsSGVhZGVyOiBmYWxzZSxcbiAgICB2aWRlb09wdHM6IHsgcXVhbGl0eTogXCJyZWFsdGltZVwiLCBcImNwdS11c2VkXCI6IFwiOFwiIH0sXG4gICAgYXVkaW9Db2RlY05hbWU6IFwibGlib3B1c1wiIGFzIEZGQXVkaW9FbmNvZGVyLFxuICAgIGF1ZGlvU2FtcGxlRm10OiBBVl9TQU1QTEVfRk1UX0ZMVCxcbiAgICBvdXRTYW1wbGVSYXRlOiA0OF8wMDAsXG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgRm9ybWF0U3RhdGUge1xuICBmb3JtYXQ6IFZpZGVvRm9ybWF0O1xuICBvdXRQYXRoOiBzdHJpbmc7XG4gIG11eGVyOiBGb3JtYXRNdXhlcjtcbiAgdmlkZW86IFZpZGVvRW5jb2RlcjtcbiAgYXVkaW8/OiBBdWRpb0VuY29kZXI7XG4gIGxpbWl0ZXI6IENvbmN1cnJlbmN5TGltaXRlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGVyUGlwZWxpbmVPcHRpb25zIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGZwczogbnVtYmVyO1xuICBmb3JtYXRzOiBWaWRlb0Zvcm1hdFtdO1xuICBvdXREaXI6IHN0cmluZztcbiAgd2l0aEF1ZGlvPzogYm9vbGVhbjtcbiAgdmlkZW9CaXRyYXRlPzogbnVtYmVyO1xuICBhdWRpb0JpdHJhdGU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIEVuY29kZXJSZXN1bHQgPSBQYXJ0aWFsPFJlY29yZDxWaWRlb0Zvcm1hdCwgc3RyaW5nPj47XG5cbmV4cG9ydCBjbGFzcyBFbmNvZGVyUGlwZWxpbmUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0ZXM6IEZvcm1hdFN0YXRlW107XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihzdGF0ZXM6IEZvcm1hdFN0YXRlW10pIHtcbiAgICB0aGlzLl9zdGF0ZXMgPSBzdGF0ZXM7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlKHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZnBzLFxuICAgIGZvcm1hdHMsXG4gICAgb3V0RGlyLFxuICAgIHdpdGhBdWRpbyA9IGZhbHNlLFxuICAgIHZpZGVvQml0cmF0ZSA9IDhfMDAwXzAwMCxcbiAgICBhdWRpb0JpdHJhdGUgPSAxMjhfMDAwLFxuICB9OiBFbmNvZGVyUGlwZWxpbmVPcHRpb25zKTogUHJvbWlzZTxFbmNvZGVyUGlwZWxpbmU+IHtcbiAgICBjb25zdCBzdGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZvcm1hdHMubWFwKGFzeW5jIChmb3JtYXQpID0+IHtcbiAgICAgICAgY29uc3Qgc3BlYyA9IEZPUk1BVF9TUEVDU1tmb3JtYXRdO1xuICAgICAgICBjb25zdCBvdXRQYXRoID0gam9pbihvdXREaXIsIGBvdXRwdXQuJHtmb3JtYXR9YCk7XG4gICAgICAgIGNvbnN0IG11eGVyID0gbmV3IEZvcm1hdE11eGVyKG91dFBhdGgpO1xuXG4gICAgICAgIGNvbnN0IHZpZGVvID0gYXdhaXQgVmlkZW9FbmNvZGVyLmNyZWF0ZSh7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGZwcyxcbiAgICAgICAgICBjb2RlY05hbWU6IHNwZWMudmlkZW9Db2RlY05hbWUsXG4gICAgICAgICAgcGl4Rm10OiBzcGVjLnBpeEZtdCxcbiAgICAgICAgICBjb2RlY1RhZzogc3BlYy5jb2RlY1RhZyxcbiAgICAgICAgICBnbG9iYWxIZWFkZXI6IHNwZWMuZ2xvYmFsSGVhZGVyLFxuICAgICAgICAgIGNvZGVjT3B0czogc3BlYy52aWRlb09wdHMsXG4gICAgICAgICAgYml0cmF0ZTogdmlkZW9CaXRyYXRlLFxuICAgICAgICAgIG11eGVyLFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgYXVkaW86IEF1ZGlvRW5jb2RlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHdpdGhBdWRpbykge1xuICAgICAgICAgIGF1ZGlvID0gYXdhaXQgQXVkaW9FbmNvZGVyLmNyZWF0ZSh7XG4gICAgICAgICAgICBvdXRTYW1wbGVSYXRlOiBzcGVjLm91dFNhbXBsZVJhdGUsXG4gICAgICAgICAgICBvdXRTYW1wbGVGbXQ6IHNwZWMuYXVkaW9TYW1wbGVGbXQsXG4gICAgICAgICAgICBjb2RlY05hbWU6IHNwZWMuYXVkaW9Db2RlY05hbWUsXG4gICAgICAgICAgICBnbG9iYWxIZWFkZXI6IHNwZWMuZ2xvYmFsSGVhZGVyLFxuICAgICAgICAgICAgYml0cmF0ZTogYXVkaW9CaXRyYXRlLFxuICAgICAgICAgICAgbXV4ZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBtdXhlci5vcGVuKCk7XG4gICAgICAgIGNvbnN0IGxpbWl0ZXIgPSBuZXcgQ29uY3VycmVuY3lMaW1pdGVyKDEpO1xuICAgICAgICByZXR1cm4geyBmb3JtYXQsIG91dFBhdGgsIG11eGVyLCB2aWRlbywgYXVkaW8sIGxpbWl0ZXIgfSBzYXRpc2ZpZXMgRm9ybWF0U3RhdGU7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBuZXcgRW5jb2RlclBpcGVsaW5lKHN0YXRlcyk7XG4gIH1cblxuICBzZXR1cEF1ZGlvKHNhbXBsZVJhdGU6IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLl9zdGF0ZXMpIHtcbiAgICAgIHMuYXVkaW8/LnNldElucHV0UmF0ZShzYW1wbGVSYXRlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBlbmNvZGVGcmFtZShiZ3JhOiBCdWZmZXIsIF90aW1lc3RhbXBVczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fc3RhdGVzLm1hcCgocykgPT4gcy5saW1pdGVyLnNjaGVkdWxlKCgpID0+IHMudmlkZW8uZW5jb2RlKGJncmEsIHMubXV4ZXIpKSkpO1xuICB9XG5cbiAgYXN5bmMgZW5jb2RlQXVkaW8ocGNtOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX3N0YXRlcy5tYXAoKHMpID0+IHtcbiAgICAgICAgaWYgKCFzLmF1ZGlvKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybiBzLmxpbWl0ZXIuc2NoZWR1bGUoKCkgPT4gcy5hdWRpbyEuZW5jb2RlKHBjbSwgcy5tdXhlcikpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaCgpOiBQcm9taXNlPEVuY29kZXJSZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHQ6IEVuY29kZXJSZXN1bHQgPSB7fTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX3N0YXRlcy5tYXAoYXN5bmMgKHMpID0+IHtcbiAgICAgICAgYXdhaXQgcy5saW1pdGVyLmVuZCgpO1xuICAgICAgICBhd2FpdCBzLmF1ZGlvPy5mbHVzaChzLm11eGVyKTtcbiAgICAgICAgYXdhaXQgcy52aWRlby5mbHVzaChzLm11eGVyKTtcbiAgICAgICAgcmVzdWx0W3MuZm9ybWF0XSA9IHMub3V0UGF0aDtcbiAgICAgICAgdXNpbmcgX2EgPSBzLmF1ZGlvO1xuICAgICAgICB1c2luZyBfdiA9IHMudmlkZW87XG4gICAgICAgIGF3YWl0IHVzaW5nIF9tID0gcy5tdXhlcjtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wNi5cblxuaW1wb3J0IHR5cGUgeyBOYXRpdmVJbWFnZSB9IGZyb20gXCJlbGVjdHJvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShpbWFnZTogTmF0aXZlSW1hZ2UpIHtcbiAgY29uc3Qgc2l6ZSA9IGltYWdlLmdldFNpemUoKTtcbiAgaWYgKHNpemUud2lkdGggPT09IDAgfHwgc2l6ZS5oZWlnaHQgPT09IDApIHJldHVybiB0cnVlO1xuICByZXR1cm4gaW1hZ2UuaXNFbXB0eSgpO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMy8wMi5cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGlwY01haW4sIHNlc3Npb24gfSBmcm9tIFwiZWxlY3Ryb25cIjtcbmltcG9ydCB7IHJtLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEVuY29kZXJQaXBlbGluZSB9IGZyb20gXCIuLi9iYXNlL2VuY29kZXIvZW5jb2RlclwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jhc2UvbG9nZ2luZ1wiO1xuXG5jb25zdCBUQUcgPSBcIltBdWRpb0NhcHR1cmVdXCI7XG5cbmNvbnN0IEFVRElPX0NBUFRVUkVfU0NSSVBUID0gYFxuKGZ1bmN0aW9uKCkge1xuICBpZiAod2luZG93Ll9fcHVwX2F1ZGlvX2NhcHR1cmluZ19fKSByZXR1cm47XG4gIHdpbmRvdy5fX3B1cF9hdWRpb19jYXB0dXJpbmdfXyA9IHRydWU7XG5cbiAgY29uc3QgeyBpcGNSZW5kZXJlciB9ID0gcmVxdWlyZSgnZWxlY3Ryb24nKTtcbiAgY29uc3QgY2FwdHVyZWRDb250ZXh0cyA9IG5ldyBXZWFrU2V0KCk7XG4gIGNvbnN0IHNvdXJjZWRFbGVtZW50cyA9IG5ldyBXZWFrU2V0KCk7XG4gIGxldCBtZXRhU2VudCA9IGZhbHNlO1xuXG4gIGNvbnN0IG9yaWdDcmVhdGVNRVMgPSBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZTtcbiAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UgPSBmdW5jdGlvbihlbCkge1xuICAgIHNvdXJjZWRFbGVtZW50cy5hZGQoZWwpO1xuICAgIHJldHVybiBvcmlnQ3JlYXRlTUVTLmNhbGwodGhpcywgZWwpO1xuICB9O1xuXG4gIGNvbnN0IG9yaWdDb25uZWN0ID0gQXVkaW9Ob2RlLnByb3RvdHlwZS5jb25uZWN0O1xuICBBdWRpb05vZGUucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbihkZXN0LCBvdXRJZHgsIGluSWR4KSB7XG4gICAgY29uc3QgY2FwdHVyZU5vZGUgPSBkZXN0Py5jb250ZXh0Py5fX3B1cF9jYXB0dXJlTm9kZV9fO1xuICAgIGlmIChjYXB0dXJlTm9kZSAmJiBkZXN0ID09PSBkZXN0LmNvbnRleHQuZGVzdGluYXRpb24gJiYgdGhpcyAhPT0gY2FwdHVyZU5vZGUpIHtcbiAgICAgIG9yaWdDb25uZWN0LmNhbGwodGhpcywgY2FwdHVyZU5vZGUsIG91dElkeCwgaW5JZHgpO1xuICAgIH1cbiAgICByZXR1cm4gb3JpZ0Nvbm5lY3QuY2FsbCh0aGlzLCBkZXN0LCBvdXRJZHgsIGluSWR4KTtcbiAgfTtcblxuICBjb25zdCBPcmlnQUMgPSB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQ7XG4gIGlmICghT3JpZ0FDKSByZXR1cm47XG5cbiAgZnVuY3Rpb24gUGF0Y2hlZEFDKCkge1xuICAgIGNvbnN0IGN0eCA9IG5ldyBPcmlnQUMoLi4uYXJndW1lbnRzKTtcbiAgICBpZiAoIWNhcHR1cmVkQ29udGV4dHMuaGFzKGN0eCkpIHtcbiAgICAgIGNhcHR1cmVkQ29udGV4dHMuYWRkKGN0eCk7XG4gICAgICBpZiAoIW1ldGFTZW50KSB7XG4gICAgICAgIG1ldGFTZW50ID0gdHJ1ZTtcbiAgICAgICAgaXBjUmVuZGVyZXIuc2VuZCgnYXVkaW8tbWV0YScsIHsgc2FtcGxlUmF0ZTogY3R4LnNhbXBsZVJhdGUgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub2RlID0gY3R4LmNyZWF0ZVNjcmlwdFByb2Nlc3Nvcig0MDk2LCAyLCAyKTtcbiAgICAgIG5vZGUub25hdWRpb3Byb2Nlc3MgPSAoZSkgPT4ge1xuICAgICAgICBjb25zdCBMID0gZS5pbnB1dEJ1ZmZlci5nZXRDaGFubmVsRGF0YSgwKTtcbiAgICAgICAgY29uc3QgUiA9IGUuaW5wdXRCdWZmZXIuZ2V0Q2hhbm5lbERhdGEoMSk7XG4gICAgICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoTC5sZW5ndGggKiAyKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBMLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgb3V0W2kgKiAyXSA9IExbaV07XG4gICAgICAgICAgb3V0W2kgKiAyICsgMV0gPSBSW2ldO1xuICAgICAgICB9XG4gICAgICAgIGlwY1JlbmRlcmVyLnNlbmQoJ2F1ZGlvLWNodW5rJywgQnVmZmVyLmZyb20ob3V0LmJ1ZmZlcikpO1xuICAgICAgfTtcbiAgICAgIG5vZGUuY29ubmVjdChjdHguZGVzdGluYXRpb24pO1xuICAgICAgY3R4Ll9fcHVwX2NhcHR1cmVOb2RlX18gPSBub2RlO1xuICAgIH1cbiAgICByZXR1cm4gY3R4O1xuICB9XG4gIFBhdGNoZWRBQy5wcm90b3R5cGUgPSBPcmlnQUMucHJvdG90eXBlO1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoUGF0Y2hlZEFDLCBPcmlnQUMpO1xuICB3aW5kb3cuQXVkaW9Db250ZXh0ID0gUGF0Y2hlZEFDO1xuICBpZiAoJ3dlYmtpdEF1ZGlvQ29udGV4dCcgaW4gd2luZG93KSB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0ID0gUGF0Y2hlZEFDO1xuXG4gIGNvbnN0IG9yaWdQbGF5ID0gSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUucGxheTtcbiAgSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5fX3B1cF9jYXB0dXJlZF9fKSB7XG4gICAgICB0aGlzLl9fcHVwX2NhcHR1cmVkX18gPSB0cnVlO1xuICAgICAgY29uc3QgZWwgPSB0aGlzO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICghc291cmNlZEVsZW1lbnRzLmhhcyhlbCkpIHtcbiAgICAgICAgICBjb25zdCBjdHggPSBuZXcgUGF0Y2hlZEFDKCk7XG4gICAgICAgICAgY3R4LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZShlbCkuY29ubmVjdChjdHguZGVzdGluYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdQbGF5LmNhbGwodGhpcyk7XG4gIH07XG59KSgpO1xuYDtcblxuZXhwb3J0IGludGVyZmFjZSBBdWRpb0NhcHR1cmUge1xuICB0ZWFyZG93bigpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBBdWRpb0NhcHR1cmUocGlwZWxpbmU6IEVuY29kZXJQaXBlbGluZSk6IFByb21pc2U8QXVkaW9DYXB0dXJlPiB7XG4gIGNvbnN0IHByZWxvYWRQYXRoID0gam9pbih0bXBkaXIoKSwgYHB1cF9hdWRpb19wcmVsb2FkXyR7cmFuZG9tVVVJRCgpfS5qc2ApO1xuICBhd2FpdCB3cml0ZUZpbGUocHJlbG9hZFBhdGgsIEFVRElPX0NBUFRVUkVfU0NSSVBUKTtcbiAgc2Vzc2lvbi5kZWZhdWx0U2Vzc2lvbi5yZWdpc3RlclByZWxvYWRTY3JpcHQoe1xuICAgIHR5cGU6IFwiZnJhbWVcIixcbiAgICBpZDogXCJwdXAtYXVkaW9cIixcbiAgICBmaWxlUGF0aDogcHJlbG9hZFBhdGgsXG4gIH0pO1xuXG4gIGlwY01haW4ub25jZShcImF1ZGlvLW1ldGFcIiwgKF9lLCBkYXRhOiB7IHNhbXBsZVJhdGU6IG51bWJlciB9KSA9PiB7XG4gICAgcGlwZWxpbmUuc2V0dXBBdWRpbyhkYXRhLnNhbXBsZVJhdGUpO1xuICB9KTtcbiAgaXBjTWFpbi5vbihcImF1ZGlvLWNodW5rXCIsIGFzeW5jIChfZSwgYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcGlwZWxpbmUuZW5jb2RlQXVkaW8oYnVmZmVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoVEFHLCBcImZhaWxlZCB0byBlbmNvZGUgYXVkaW8gY2h1bms6XCIsIGUpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyB0ZWFyZG93bigpIHtcbiAgICAgIGlwY01haW4ucmVtb3ZlQWxsTGlzdGVuZXJzKFwiYXVkaW8tbWV0YVwiKTtcbiAgICAgIGlwY01haW4ucmVtb3ZlQWxsTGlzdGVuZXJzKFwiYXVkaW8tY2h1bmtcIik7XG4gICAgICBzZXNzaW9uLmRlZmF1bHRTZXNzaW9uLnVucmVnaXN0ZXJQcmVsb2FkU2NyaXB0KFwicHVwLWF1ZGlvXCIpO1xuICAgICAgYXdhaXQgcm0ocHJlbG9hZFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMDkuXG5cbmltcG9ydCB0eXBlIHsgRGVidWdnZXIsIFNpemUgfSBmcm9tIFwiZWxlY3Ryb25cIjtcblxuZXhwb3J0IGNvbnN0IEZSQU1FX1NZTkNfTUFSS0VSX1dJRFRIID0gMzI7XG5leHBvcnQgY29uc3QgRlJBTUVfU1lOQ19NQVJLRVJfSEVJR0hUID0gMTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckhUTUwodGFyZ2V0VVJMOiBzdHJpbmcsIHNpemU6IFNpemUpOiBzdHJpbmcge1xuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHNpemU7XG4gIHJldHVybiBgPCFET0NUWVBFIGh0bWw+XG48aHRtbD5cbjxoZWFkPlxuICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgPHN0eWxlPlxuICAgICogeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cbiAgICBodG1sLCBib2R5IHsgd2lkdGg6ICR7d2lkdGh9cHg7IGhlaWdodDogJHtoZWlnaHQgKyAxfXB4OyBvdmVyZmxvdzogaGlkZGVuOyB9XG4gICAgI3RhcmdldCB7IFxuICAgICAgcG9zaXRpb246IGFic29sdXRlOyBcbiAgICAgIHRvcDogMDsgXG4gICAgICBsZWZ0OiAwOyBcbiAgICAgIHdpZHRoOiAke3dpZHRofXB4OyBcbiAgICAgIGhlaWdodDogJHtoZWlnaHR9cHg7IFxuICAgICAgYm9yZGVyOiBub25lOyBcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAjc3RlZ28geyBcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgXG4gICAgICB0b3A6ICR7aGVpZ2h0fXB4OyBcbiAgICAgIGxlZnQ6IDA7IFxuICAgICAgd2lkdGg6ICR7d2lkdGh9cHg7IFxuICAgICAgaGVpZ2h0OiAxcHg7IFxuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDtcbiAgICB9XG4gIDwvc3R5bGU+XG48L2hlYWQ+XG48Ym9keT5cbiAgPGlmcmFtZSBpZD1cInRhcmdldFwiIHNyYz1cIiR7dGFyZ2V0VVJMfVwiPjwvaWZyYW1lPlxuICA8Y2FudmFzIGlkPVwic3RlZ29cIiB3aWR0aD1cIiR7d2lkdGh9XCIgaGVpZ2h0PVwiMVwiPjwvY2FudmFzPlxuICA8c2NyaXB0PlxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IFdJRFRIID0gJHt3aWR0aH07XG4gICAgICBjb25zdCBNQVJLRVJfV0lEVEggPSAke0ZSQU1FX1NZTkNfTUFSS0VSX1dJRFRIfTtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVnbycpO1xuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBsZXQgc3RhcnRUaW1lID0gbnVsbDtcbiAgICAgIGxldCByYWZJZCA9IG51bGw7XG5cbiAgICAgIGZ1bmN0aW9uIGVuY29kZVRpbWVzdGFtcCh0aW1lc3RhbXBNcykge1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKFdJRFRILCAxKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGltYWdlRGF0YS5kYXRhO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdGltZXN0YW1wSW50ID0gTWF0aC5mbG9vcih0aW1lc3RhbXBNcykgPj4+IDA7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1BUktFUl9XSURUSDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgYml0ID0gKHRpbWVzdGFtcEludCA+Pj4gKE1BUktFUl9XSURUSCAtIDEgLSBpKSkgJiAxO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYml0ID8gMjU1IDogMDtcbiAgICAgICAgICBjb25zdCBpZHggPSBpICogNDtcbiAgICAgICAgICBkYXRhW2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICBkYXRhW2lkeCArIDFdID0gdmFsdWU7XG4gICAgICAgICAgZGF0YVtpZHggKyAyXSA9IHZhbHVlO1xuICAgICAgICAgIGRhdGFbaWR4ICsgM10gPSAyNTU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IGkgPSBNQVJLRVJfV0lEVEg7IGkgPCBXSURUSDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgaWR4ID0gaSAqIDQ7XG4gICAgICAgICAgZGF0YVtpZHhdID0gMDtcbiAgICAgICAgICBkYXRhW2lkeCArIDFdID0gMDtcbiAgICAgICAgICBkYXRhW2lkeCArIDJdID0gMDtcbiAgICAgICAgICBkYXRhW2lkeCArIDNdID0gMjU1O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZUxvb3AoKSB7XG4gICAgICAgIGlmIChzdGFydFRpbWUgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBlbmNvZGVUaW1lc3RhbXAoZWxhcHNlZCk7XG4gICAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZUxvb3ApO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cuX19wdXBfc3RhcnRfcmVjb3JkaW5nX18gPSAoKSA9PiB7XG4gICAgICAgIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICBlbmNvZGVUaW1lc3RhbXAoMCk7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGVMb29wKTtcbiAgICAgIH07XG5cbiAgICAgIHdpbmRvdy5fX3B1cF9zdG9wX3JlY29yZGluZ19fID0gKCkgPT4ge1xuICAgICAgICBpZiAocmFmSWQgIT09IG51bGwpIHtcbiAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XG4gICAgICAgICAgcmFmSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pKCk7XG4gIDwvc2NyaXB0PlxuPC9ib2R5PlxuPC9odG1sPmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUaW1lc3RhbXAoYml0bWFwOiBCdWZmZXIsIHNpemU6IFNpemUpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHNpemU7XG4gIGlmICh3aWR0aCA8IEZSQU1FX1NZTkNfTUFSS0VSX1dJRFRIIHx8IGhlaWdodCA8IDIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgbWFya2VyUm93ID0gaGVpZ2h0IC0gMTtcblxuICBsZXQgdGltZXN0YW1wID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBGUkFNRV9TWU5DX01BUktFUl9XSURUSDsgaSsrKSB7XG4gICAgY29uc3QgcGl4ZWxJZHggPSAobWFya2VyUm93ICogd2lkdGggKyBpKSAqIDQ7XG4gICAgY29uc3QgciA9IGJpdG1hcFtwaXhlbElkeF0gPz8gMDtcbiAgICBjb25zdCBiaXQgPSByID4gMTI3ID8gMSA6IDA7XG4gICAgdGltZXN0YW1wID0gKHRpbWVzdGFtcCA8PCAxKSB8IGJpdDtcbiAgfVxuXG4gIHRpbWVzdGFtcCA9IHRpbWVzdGFtcCA+Pj4gMDtcblxuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aW1lc3RhbXApIHx8IHRpbWVzdGFtcCA8IDAgfHwgdGltZXN0YW1wID4gMWU3KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB0aW1lc3RhbXA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydFN5bmMoY2RwOiBEZWJ1Z2dlcikge1xuICByZXR1cm4gY2RwLnNlbmRDb21tYW5kKFwiUnVudGltZS5ldmFsdWF0ZVwiLCB7XG4gICAgZXhwcmVzc2lvbjogYHdpbmRvdy5fX3B1cF9zdGFydF9yZWNvcmRpbmdfXygpYCxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wU3luYyhjZHA6IERlYnVnZ2VyKSB7XG4gIHJldHVybiBjZHAuc2VuZENvbW1hbmQoXCJSdW50aW1lLmV2YWx1YXRlXCIsIHtcbiAgICBleHByZXNzaW9uOiBgd2luZG93Ll9fcHVwX3N0b3BfcmVjb3JkaW5nX18oKWAsXG4gIH0pO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJpb2RpY2FsKGNhbGxiYWNrOiAoY291bnQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQsIG1zOiBudW1iZXIpIHtcbiAgbGV0IHRva2VuOiBOb2RlSlMuVGltZW91dDtcbiAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICBhc3luYyBmdW5jdGlvbiB0aWNrKGNvdW50OiBudW1iZXIpIHtcbiAgICBhd2FpdCBjYWxsYmFjayhjb3VudCk7XG4gICAgaWYgKGNsb3NlZCkgcmV0dXJuO1xuICAgIHRva2VuID0gc2V0VGltZW91dCgoKSA9PiB0aWNrKGNvdW50ICsgMSksIG1zKTtcbiAgfVxuICB0b2tlbiA9IHNldFRpbWVvdXQoKCkgPT4gdGljaygwKSwgbXMpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWU7XG4gICAgY2xlYXJUaW1lb3V0KHRva2VuKTtcbiAgfTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMDUuXG5cbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tIFwidGltZXJzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gXCIuL3RpbWluZ1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9uczxBcmdzIGV4dGVuZHMgYW55W10sIFJldD4ge1xuICBmbjogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8UmV0PjtcbiAgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZXRyeTxBcmdzIGV4dGVuZHMgYW55W10sIFJldD4oeyBmbiwgbWF4QXR0ZW1wdHMgPSAzLCB0aW1lb3V0IH06IFJldHJ5T3B0aW9uczxBcmdzLCBSZXQ+KSB7XG4gIGNvbnN0IHRpbWVvdXRFcnJvciA9IG5ldyBFcnJvcihgdGltZW91dCBvdmVyICR7dGltZW91dH1tc2ApO1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3M6IEFyZ3MpIHtcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW2ZuKC4uLmFyZ3MpXTtcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgc2V0VGltZW91dCh0aW1lb3V0KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhyb3cgdGltZW91dEVycm9yO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICBpZiAoYXR0ZW1wdCA+PSBtYXhBdHRlbXB0cykge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgc2xlZXAoTWF0aC5wb3coMiwgYXR0ZW1wdCkgKiAxMDAgKyBNYXRoLnJhbmRvbSgpICogMTAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5jb25zdCBTVVBQT1JURURfUFJPVE9DT0xTID0gW1wiZmlsZTpcIiwgXCJodHRwOlwiLCBcImh0dHBzOlwiLCBcImRhdGE6XCJdO1xuY29uc3QgU09VUkNFX1BBVFRFUk4gPSAvXihmaWxlOnxodHRwcz86fGRhdGE6KS87XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0hUTUwoc291cmNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFNPVVJDRV9QQVRURVJOLnRlc3Qoc291cmNlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHByb3RvY29sID0gc291cmNlLnNwbGl0KFwiOlwiKVswXSArIFwiOlwiO1xuICBjb25zdCBtZXNzYWdlID0gU1VQUE9SVEVEX1BST1RPQ09MUy5pbmNsdWRlcyhwcm90b2NvbClcbiAgICA/IGB1bnN1cHBvcnRlZCBwcm90b2NvbDogJHtwcm90b2NvbH0sIGV4cGVjdGVkICR7U1VQUE9SVEVEX1BST1RPQ09MUy5qb2luKFwiLCBcIil9YFxuICAgIDogYGludmFsaWQgc291cmNlIGZvcm1hdCwgZXhwZWN0ZWQgJHtTVVBQT1JURURfUFJPVE9DT0xTLmpvaW4oXCIsIFwiKX1gO1xuXG4gIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDMvMTAuXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdE9wdGlvbnMge1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIG9uVGltZW91dD86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBXYWl0YWJsZUV2ZW50IHtcbiAgcHJpdmF0ZSBfcHJvbWlzZT86IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgX3Jlc29sdmU/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIF90aW1lb3V0VG9rZW4/OiBOb2RlSlMuVGltZW91dDtcblxuICB3YWl0KG9wdGlvbnM/OiBXYWl0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9wcm9taXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhbHJlYWR5IHdhaXRpbmdcIik7XG4gICAgfVxuICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICBpZiAob3B0aW9ucz8udGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3RpbWVvdXRUb2tlbiA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIG9wdGlvbnMub25UaW1lb3V0Py4oKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIG9wdGlvbnMudGltZW91dCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gIH1cblxuICBzaWduYWwoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRUb2tlbik7XG4gICAgdGhpcy5fcHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZXNvbHZlPy4oKTtcbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuaW1wb3J0IHsgQnJvd3NlcldpbmRvdyB9IGZyb20gXCJlbGVjdHJvblwiO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSBcInVybFwiO1xuaW1wb3J0IHsgQ29uY3VycmVuY3lMaW1pdGVyIH0gZnJvbSBcIi4uL2Jhc2UvbGltaXRlclwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jhc2UvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgV2FpdGFibGVFdmVudCB9IGZyb20gXCIuLi9iYXNlL3dhaXRhYmxlX2V2ZW50XCI7XG5cbmNvbnN0IFRBRyA9IFwiW05ldHdvcmtdXCI7XG5cbmNvbnN0IG1hcCA9IG5ldyBNYXAoW1xuICBbYGpzc3otYm9zcy5oZHNsYi5jb21gLCBganNzei1ib3NzLmJpbGliaWxpLmNvYF0sIC8vXG4gIFtgYm9zcy5oZHNsYi5jb21gLCBgc2hqZC1ib3NzLmJpbGliaWxpLmNvYF0sXG5dKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3hpZWRVcmwodXJsOiBzdHJpbmcpIHtcbiAgaWYgKCF1cmwuc3RhcnRzV2l0aChcImh0dHBcIikpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgY29uc3QgdGFyZ2V0ID0gbWFwLmdldChwYXJzZWQuaG9zdG5hbWUpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgcGFyc2VkLmhvc3RuYW1lID0gdGFyZ2V0O1xuICBwYXJzZWQucHJvdG9jb2wgPSBcImh0dHA6XCI7XG4gIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrT3B0aW9ucyB7XG4gIHNvdXJjZTogc3RyaW5nO1xuICB3aW5kb3c6IEJyb3dzZXJXaW5kb3c7XG4gIHVzZUlubmVyUHJveHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SW50ZXJjZXB0b3IoeyBzb3VyY2UsIHdpbmRvdywgdXNlSW5uZXJQcm94eSB9OiBOZXR3b3JrT3B0aW9ucykge1xuICBjb25zdCByZXEgPSB3aW5kb3cud2ViQ29udGVudHMuc2Vzc2lvbi53ZWJSZXF1ZXN0O1xuICBjb25zdCBsaW1pdGVyID0gbmV3IENvbmN1cnJlbmN5TGltaXRlcig2NCk7XG4gIGNvbnN0IGV2ZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBXYWl0YWJsZUV2ZW50PigpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhaXQoa2V5OiBzdHJpbmcsIG9uVGltZW91dD86ICgpID0+IHZvaWQpIHtcbiAgICBjb25zdCBldmVudCA9IG5ldyBXYWl0YWJsZUV2ZW50KCk7XG4gICAgZXZlbnRzLnNldChrZXksIGV2ZW50KTtcbiAgICBhd2FpdCBldmVudC53YWl0KHsgdGltZW91dDogNV8wMDAsIG9uVGltZW91dCB9KS5maW5hbGx5KCgpID0+IGV2ZW50cy5kZWxldGUoa2V5KSk7XG4gIH1cblxuICBmdW5jdGlvbiBzaWduYWwoa2V5OiBzdHJpbmcpIHtcbiAgICBldmVudHMuZ2V0KGtleSk/LnNpZ25hbCgpO1xuICB9XG5cbiAgcmVxLm9uQmVmb3JlUmVxdWVzdCgoZGV0YWlscywgY2FsbGJhY2spID0+IHtcbiAgICBjb25zdCB1cmwgPSBkZXRhaWxzLnVybDtcbiAgICBjb25zdCBwcm94aWVkID0gdXNlSW5uZXJQcm94eSA/IHByb3hpZWRVcmwodXJsKSA6IHVybDtcbiAgICBsaW1pdGVyLnNjaGVkdWxlKCgpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3dpbmRvdy5pZH1fJHtkZXRhaWxzLmlkfWA7XG4gICAgICBsb2dnZXIuZGVidWcoVEFHLCBgc3RhcnQ6YCwge1xuICAgICAgICBrZXksXG4gICAgICAgIHVybCxcbiAgICAgICAgcHJveGllZCxcbiAgICAgICAgbWV0aG9kOiBkZXRhaWxzLm1ldGhvZCxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBzdGF0czogbGltaXRlci5zdGF0cyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHByb3hpZWQgPT09IHVybCkge1xuICAgICAgICBjYWxsYmFjayh7IGNhbmNlbDogZmFsc2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayh7IGNhbmNlbDogZmFsc2UsIHJlZGlyZWN0VVJMOiBwcm94aWVkIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdhaXQoa2V5LCAoKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKFRBRywgYG1heWJlIHRpbWVvdXQ6YCwge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcHJveGllZCxcbiAgICAgICAgICBtZXRob2Q6IGRldGFpbHMubWV0aG9kLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmVxLm9uSGVhZGVyc1JlY2VpdmVkKCh7IHJlc3BvbnNlSGVhZGVycyB9LCBjYWxsYmFjaykgPT4ge1xuICAgIGRlbGV0ZSByZXNwb25zZUhlYWRlcnM/LltcIngtZnJhbWUtb3B0aW9uc1wiXTtcbiAgICBkZWxldGUgcmVzcG9uc2VIZWFkZXJzPy5bXCJYLUZyYW1lLU9wdGlvbnNcIl07XG4gICAgZGVsZXRlIHJlc3BvbnNlSGVhZGVycz8uW1wiY29udGVudC1zZWN1cml0eS1wb2xpY3lcIl07XG4gICAgZGVsZXRlIHJlc3BvbnNlSGVhZGVycz8uW1wiQ29udGVudC1TZWN1cml0eS1Qb2xpY3lcIl07XG4gICAgY2FsbGJhY2soeyBjYW5jZWw6IGZhbHNlLCByZXNwb25zZUhlYWRlcnMgfSk7XG4gIH0pO1xuXG4gIHJlcS5vbkNvbXBsZXRlZCgoZGV0YWlscykgPT4ge1xuICAgIGNvbnN0IGtleSA9IGAke3dpbmRvdy5pZH1fJHtkZXRhaWxzLmlkfWA7XG4gICAgc2lnbmFsKGtleSk7XG4gICAgbG9nZ2VyLmRlYnVnKFRBRywgYGNvbXBsZXRlZDpgLCB7XG4gICAgICBrZXksXG4gICAgICB1cmw6IGRldGFpbHMudXJsLFxuICAgICAgbWV0aG9kOiBkZXRhaWxzLm1ldGhvZCxcbiAgICAgIHN0YXR1c0NvZGU6IGRldGFpbHMuc3RhdHVzQ29kZSxcbiAgICAgIHNvdXJjZSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmVxLm9uRXJyb3JPY2N1cnJlZCgoZGV0YWlscykgPT4ge1xuICAgIGNvbnN0IGtleSA9IGAke3dpbmRvdy5pZH1fJHtkZXRhaWxzLmlkfWA7XG4gICAgc2lnbmFsKGtleSk7XG4gICAgbG9nZ2VyLmVycm9yKFRBRywgYGVycm9yOmAsIHtcbiAgICAgIGtleSxcbiAgICAgIHVybDogZGV0YWlscy51cmwsXG4gICAgICBtZXRob2Q6IGRldGFpbHMubWV0aG9kLFxuICAgICAgZXJyb3I6IGRldGFpbHMuZXJyb3IsXG4gICAgICBzb3VyY2UsXG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRJbnRlcmNlcHRvcih3aW5kb3c6IEJyb3dzZXJXaW5kb3cpIHtcbiAgY29uc3QgcmVxID0gd2luZG93LndlYkNvbnRlbnRzLnNlc3Npb24ud2ViUmVxdWVzdDtcbiAgcmVxLm9uQmVmb3JlUmVxdWVzdChudWxsKTtcbiAgcmVxLm9uSGVhZGVyc1JlY2VpdmVkKG51bGwpO1xuICByZXEub25Db21wbGV0ZWQobnVsbCk7XG4gIHJlcS5vbkVycm9yT2NjdXJyZWQobnVsbCk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzI3LlxuXG5pbXBvcnQgeyBCcm93c2VyV2luZG93IH0gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vYmFzZS9sb2dnaW5nXCI7XG5pbXBvcnQgeyB1c2VSZXRyeSB9IGZyb20gXCIuLi9iYXNlL3JldHJ5XCI7XG5pbXBvcnQgeyBidWlsZFdyYXBwZXJIVE1MIH0gZnJvbSBcIi4vZnJhbWVfc3luY1wiO1xuaW1wb3J0IHsgY2hlY2tIVE1MIH0gZnJvbSBcIi4vaHRtbF9jaGVja1wiO1xuaW1wb3J0IHsgcHJveGllZFVybCwgc2V0SW50ZXJjZXB0b3IsIHVuc2V0SW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9uZXR3b3JrXCI7XG5pbXBvcnQgdHlwZSB7IFJlbmRlck9wdGlvbnMgfSBmcm9tIFwiLi9zY2hlbWFcIjtcblxuY29uc3QgVEFHID0gXCJbV2luZG93XVwiO1xuXG5mdW5jdGlvbiB3YWl0Rm9yRmluaXNoKHdpbjogQnJvd3NlcldpbmRvdywgYWN0aW9uOiAoKSA9PiB2b2lkKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcImxvYWQgd2luZG93IHRpbWVvdXRcIikpLCAzMF8wMDApO1xuICAgIGNvbnN0IGRvbmUgPSAoZXJyPzogRXJyb3IpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgd2luLndlYkNvbnRlbnRzLm9uY2UoXCJkaWQtZmluaXNoLWxvYWRcIiwgKCkgPT4gZG9uZSgpKTtcbiAgICB3aW4ud2ViQ29udGVudHMub25jZShcImRpZC1mYWlsLWxvYWRcIiwgKF9lLCBjb2RlLCBkZXNjLCB1cmwpID0+XG4gICAgICBkb25lKG5ldyBFcnJvcihgZmFpbGVkIHRvIGxvYWQgJHt1cmx9OiBbJHtjb2RlfV0gJHtkZXNjfWApKSxcbiAgICApO1xuICAgIHdpbi53ZWJDb250ZW50cy5vbmNlKFwicmVuZGVyLXByb2Nlc3MtZ29uZVwiLCAoX2UsIHsgZXhpdENvZGUsIHJlYXNvbiB9KSA9PlxuICAgICAgZG9uZShuZXcgRXJyb3IoYHJlbmRlcmVyIGNyYXNoZWQ6ICR7ZXhpdENvZGV9LCAke3JlYXNvbn1gKSksXG4gICAgKTtcbiAgICBhY3Rpb24oKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5XaW5kb3cod2luczogQnJvd3NlcldpbmRvd1tdLCBzb3VyY2U6IHN0cmluZywgb3B0aW9uczogUmVuZGVyT3B0aW9ucyk6IFByb21pc2U8QnJvd3NlcldpbmRvdz4ge1xuICBjaGVja0hUTUwoc291cmNlKTtcblxuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHVzZUlubmVyUHJveHkgfSA9IG9wdGlvbnM7XG5cbiAgbGV0IHNyYyA9IHNvdXJjZTtcbiAgaWYgKHVzZUlubmVyUHJveHkpIHtcbiAgICBzcmMgPSBwcm94aWVkVXJsKHNvdXJjZSk7XG4gIH1cblxuICB3aW5zLmZvckVhY2goKHcpID0+IHtcbiAgICB3LndlYkNvbnRlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHVuc2V0SW50ZXJjZXB0b3Iodyk7XG4gICAgbG9nZ2VyLmRlYnVnKFRBRywgYGRlc3Ryb3kgd2luZG93OmAsIHcuaWQpO1xuICB9KTtcbiAgY29uc3Qgd2luID0gbmV3IEJyb3dzZXJXaW5kb3coe1xuICAgIHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0ICsgMSxcbiAgICBzaG93OiBmYWxzZSxcbiAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHVuZGVmaW5lZCxcbiAgICB3ZWJQcmVmZXJlbmNlczoge1xuICAgICAgb2Zmc2NyZWVuOiB0cnVlLFxuICAgICAgYmFja2dyb3VuZFRocm90dGxpbmc6IGZhbHNlLFxuICAgICAgbm9kZUludGVncmF0aW9uOiB0cnVlLFxuICAgICAgbm9kZUludGVncmF0aW9uSW5TdWJGcmFtZXM6IHRydWUsXG4gICAgICBub2RlSW50ZWdyYXRpb25JbldvcmtlcjogdHJ1ZSxcbiAgICAgIGNvbnRleHRJc29sYXRpb246IGZhbHNlLFxuICAgICAgd2ViU2VjdXJpdHk6IGZhbHNlLFxuICAgICAgYWxsb3dSdW5uaW5nSW5zZWN1cmVDb250ZW50OiB0cnVlLFxuICAgICAgZXhwZXJpbWVudGFsRmVhdHVyZXM6IHRydWUsXG4gICAgfSxcbiAgfSk7XG4gIHNldEludGVyY2VwdG9yKHsgc291cmNlLCB3aW5kb3c6IHdpbiwgdXNlSW5uZXJQcm94eSB9KTtcbiAgd2lucy5zcGxpY2UoMCkuZm9yRWFjaCgodykgPT4gdy5kZXN0cm95KCkpO1xuICB3aW5zLnB1c2god2luKTtcblxuICB3aW4ud2ViQ29udGVudHMub24oXCJjb25zb2xlLW1lc3NhZ2VcIiwgKHsgbGV2ZWwsIG1lc3NhZ2UsIGxpbmVOdW1iZXIsIHNvdXJjZUlkIH0pID0+IHtcbiAgICBpZiAobGV2ZWwgPT09IFwiZXJyb3JcIikge1xuICAgICAgbG9nZ2VyLmVycm9yKFRBRywgXCJjb25zb2xlOlwiLCB7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGxpbmVOdW1iZXIsXG4gICAgICAgIHNvdXJjZUlkLFxuICAgICAgICBzb3VyY2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHdyYXBwZXJIVE1MID0gYnVpbGRXcmFwcGVySFRNTChzcmMsIHsgd2lkdGgsIGhlaWdodCB9KTtcbiAgY29uc3QgZGF0YVVSTCA9IGBkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04LCR7ZW5jb2RlVVJJQ29tcG9uZW50KHdyYXBwZXJIVE1MKX1gO1xuICBhd2FpdCB3YWl0Rm9yRmluaXNoKHdpbiwgKCkgPT4gd2luLmxvYWRVUkwoZGF0YVVSTCkpO1xuXG4gIHJldHVybiB3aW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkV2luZG93KHNvdXJjZTogc3RyaW5nLCBvcHRpb25zOiBSZW5kZXJPcHRpb25zKTogUHJvbWlzZTxCcm93c2VyV2luZG93PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgd2luczogQnJvd3NlcldpbmRvd1tdID0gW107XG4gICAgYXdhaXQgdXNlUmV0cnkoeyBmbjogb3BlbldpbmRvdywgbWF4QXR0ZW1wdHM6IDIgfSkod2lucywgc291cmNlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgb3BlbldpbmRvdyh3aW5zLCBzb3VyY2UsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBzdGFjayB9ID0gZSBhcyBFcnJvcjtcbiAgICBjb25zdCBkZXNjID0geyBzb3VyY2UsIG1lc3NhZ2UsIHN0YWNrIH07XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gbG9hZCB3aW5kb3c6ICR7SlNPTi5zdHJpbmdpZnkoZGVzYyl9YCk7XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMDkuXG5cbmltcG9ydCB7IG9rIH0gZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgbmF0aXZlSW1hZ2UsIHR5cGUgTmF0aXZlSW1hZ2UgfSBmcm9tIFwiZWxlY3Ryb25cIjtcbmltcG9ydCB7IG1rZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgRW5jb2RlclBpcGVsaW5lIH0gZnJvbSBcIi4uL2Jhc2UvZW5jb2Rlci9lbmNvZGVyXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uL2Jhc2UvaW1hZ2VcIjtcbmltcG9ydCB7IENvbmN1cnJlbmN5TGltaXRlciB9IGZyb20gXCIuLi9iYXNlL2xpbWl0ZXJcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi9iYXNlL2xvZ2dpbmdcIjtcbmltcG9ydCB7IHNldHVwQXVkaW9DYXB0dXJlIH0gZnJvbSBcIi4vYXVkaW9fY2FwdHVyZVwiO1xuaW1wb3J0IHsgZGVjb2RlVGltZXN0YW1wLCBzdGFydFN5bmMsIHN0b3BTeW5jIH0gZnJvbSBcIi4vZnJhbWVfc3luY1wiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJPcHRpb25zLCBSZW5kZXJSZXN1bHQgfSBmcm9tIFwiLi9zY2hlbWFcIjtcbmltcG9ydCB7IGxvYWRXaW5kb3cgfSBmcm9tIFwiLi93aW5kb3dcIjtcblxuY29uc3QgVEFHID0gXCJbUmVuZGVyXVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zOiBSZW5kZXJPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxvZ2dlci5pbmZvKFRBRywgYHByb2dyZXNzOiAwJWApO1xuICBjb25zdCB7IG91dERpciwgZnBzLCB3aWR0aCwgaGVpZ2h0LCBkdXJhdGlvbiwgd2l0aEF1ZGlvLCBmb3JtYXRzIH0gPSBvcHRpb25zO1xuXG4gIGF3YWl0IG1rZGlyKG91dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgcGlwZWxpbmUgPSBhd2FpdCBFbmNvZGVyUGlwZWxpbmUuY3JlYXRlKHsgd2lkdGgsIGhlaWdodCwgZnBzLCBmb3JtYXRzLCBvdXREaXIsIHdpdGhBdWRpbyB9KTtcbiAgY29uc3QgYXVkaW9DYXB0dXJlID0gd2l0aEF1ZGlvID8gYXdhaXQgc2V0dXBBdWRpb0NhcHR1cmUocGlwZWxpbmUpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHdpbiA9IGF3YWl0IGxvYWRXaW5kb3coc291cmNlLCBvcHRpb25zKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjZHAgPSB3aW4ud2ViQ29udGVudHMuZGVidWdnZXI7XG4gICAgY2RwLmF0dGFjaChcIjEuM1wiKTtcblxuICAgIHdpbi53ZWJDb250ZW50cy5zZXRGcmFtZVJhdGUoZnBzKTtcbiAgICBpZiAoIXdpbi53ZWJDb250ZW50cy5pc1BhaW50aW5nKCkpIHtcbiAgICAgIHdpbi53ZWJDb250ZW50cy5zdGFydFBhaW50aW5nKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWwgPSBNYXRoLmNlaWwoZnBzICogZHVyYXRpb24pO1xuICAgIGNvbnN0IGZyYW1lSW50ZXJ2YWwgPSAxMDAwIC8gZnBzO1xuXG4gICAgbGV0IHdyaXR0ZW4gPSAwO1xuICAgIGxldCBsYXN0V3JpdHRlblRpbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJvZ3Jlc3MgPSAwO1xuICAgIGxldCBmcmFtZUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVzb2x2ZXI6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVqZWN0ZXI6ICgocmVhc29uPzogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNvdmVyQmdyYTogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVuY29kZVF1ZXVlID0gbmV3IENvbmN1cnJlbmN5TGltaXRlcigxKTtcblxuICAgIGNvbnN0IHNjaGVkdWxlRnJhbWUgPSAoZnJhbWU6IEJ1ZmZlciwgdGltZXN0YW1wVXM6IG51bWJlcikgPT4ge1xuICAgICAgd3JpdHRlbisrO1xuICAgICAgY29uc3QgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIGVuY29kZVF1ZXVlIC8vXG4gICAgICAgIC5zY2hlZHVsZSgoKSA9PiBwaXBlbGluZS5lbmNvZGVGcmFtZShmcmFtZSwgdGltZXN0YW1wVXMpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IChmcmFtZUVycm9yID8/PSBlKSk7XG4gICAgICBjb25zdCBkaWZmID0gcGVyZm9ybWFuY2Uubm93KCkgLSB0MDtcbiAgICAgIGlmIChkaWZmID4gZnJhbWVJbnRlcnZhbCAqIDEuMikge1xuICAgICAgICBsb2dnZXIud2FybihUQUcsIGBmcmFtZSBzdGFsbGVkIGluICR7ZGlmZn1tc2ApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBwYWludCA9IChfZTogdW5rbm93biwgX3I6IHVua25vd24sIGltYWdlOiBOYXRpdmVJbWFnZSkgPT4ge1xuICAgICAgaWYgKGZyYW1lRXJyb3IpIHtcbiAgICAgICAgcmVqZWN0ZXI/LihmcmFtZUVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNFbXB0eShpbWFnZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgYml0bWFwID0gaW1hZ2UudG9CaXRtYXAoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gZGVjb2RlVGltZXN0YW1wKGJpdG1hcCwgaW1hZ2UuZ2V0U2l6ZSgpKTtcbiAgICAgIGlmIChjdXJyZW50VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZyYW1lRXJyb3IgPz89IG5ldyBFcnJvcihgbm8gdGltZXN0YW1wIEAgJHt3cml0dGVufWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ5dGVzUGVyUm93ID0gd2lkdGggKiA0O1xuICAgICAgY29uc3QgY3JvcHBlZCA9IEJ1ZmZlci5mcm9tKGJpdG1hcC5idWZmZXIsIGJpdG1hcC5ieXRlT2Zmc2V0LCBoZWlnaHQgKiBieXRlc1BlclJvdyk7XG5cbiAgICAgIGNvdmVyQmdyYSA/Pz0gY3JvcHBlZDtcblxuICAgICAgaWYgKGxhc3RXcml0dGVuVGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjaGVkdWxlRnJhbWUoY3JvcHBlZCwgY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICAgICAgbGFzdFdyaXR0ZW5UaW1lID0gY3VycmVudFRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0aW1lRGVsdGEgPSBjdXJyZW50VGltZSAtIGxhc3RXcml0dGVuVGltZTtcbiAgICAgICAgaWYgKHRpbWVEZWx0YSA+PSBmcmFtZUludGVydmFsICogMC44KSB7XG4gICAgICAgICAgaWYgKHRpbWVEZWx0YSA8PSBmcmFtZUludGVydmFsICogMS4yKSB7XG4gICAgICAgICAgICBzY2hlZHVsZUZyYW1lKGNyb3BwZWQsIGN1cnJlbnRUaW1lICogMTAwMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lc1RvSW5zZXJ0ID0gTWF0aC5yb3VuZCh0aW1lRGVsdGEgLyBmcmFtZUludGVydmFsKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWVzVG9JbnNlcnQgJiYgd3JpdHRlbiA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgICAgICAgc2NoZWR1bGVGcmFtZShjcm9wcGVkLCBNYXRoLnJvdW5kKChsYXN0V3JpdHRlblRpbWUgKyAoaSArIDEpICogZnJhbWVJbnRlcnZhbCkgKiAxMDAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxhc3RXcml0dGVuVGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1Byb2dyZXNzID0gTWF0aC5mbG9vcigod3JpdHRlbiAvIHRvdGFsKSAqIDEwMCk7XG4gICAgICBpZiAoTWF0aC5hYnMobmV3UHJvZ3Jlc3MgLSBwcm9ncmVzcykgPiAxMCkge1xuICAgICAgICBwcm9ncmVzcyA9IG5ld1Byb2dyZXNzO1xuICAgICAgICBsb2dnZXIuaW5mbyhUQUcsIGBwcm9ncmVzczogJHtNYXRoLnJvdW5kKHByb2dyZXNzKX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBkdXJhdGlvbiAqIDEwMDA7XG4gICAgICBpZiAoY3VycmVudFRpbWUgPj0gZHVyYXRpb25NcyAtIGZyYW1lSW50ZXJ2YWwgKiAwLjUgfHwgd3JpdHRlbiA+PSB0b3RhbCkge1xuICAgICAgICByZXNvbHZlcj8uKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdpbi53ZWJDb250ZW50cy5vbihcInBhaW50XCIsIHBhaW50KTtcbiAgICBhd2FpdCBzdGFydFN5bmMoY2RwKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHIsIGopID0+IChbcmVzb2x2ZXIsIHJlamVjdGVyXSA9IFtyLCBqXSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBzdG9wU3luYyhjZHApO1xuICAgICAgd2luLndlYkNvbnRlbnRzLm9mZihcInBhaW50XCIsIHBhaW50KTtcbiAgICAgIGF3YWl0IGF1ZGlvQ2FwdHVyZT8udGVhcmRvd24oKTtcbiAgICB9XG5cbiAgICBpZiAoZnJhbWVFcnJvciB8fCB3cml0dGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBmcmFtZUVycm9yID8/IG5ldyBFcnJvcihcIm5vIGZyYW1lcyBjYXB0dXJlZFwiKTtcbiAgICB9XG5cbiAgICBhd2FpdCBlbmNvZGVRdWV1ZS5lbmQoKTtcbiAgICBjb25zdCBvdXRwdXRGaWxlcyA9IGF3YWl0IHBpcGVsaW5lLmZpbmlzaCgpO1xuICAgIGNvbnN0IGNvdmVyUGF0aCA9IGpvaW4ob3V0RGlyLCBcImNvdmVyLnBuZ1wiKTtcbiAgICBvayhjb3ZlckJncmEsIFwiY292ZXIgaW1hZ2UgaXMgbWlzc2luZ1wiKTtcbiAgICBjb25zdCBwbmcgPSBuYXRpdmVJbWFnZS5jcmVhdGVGcm9tQnVmZmVyKGNvdmVyQmdyYSwgeyB3aWR0aCwgaGVpZ2h0IH0pLnRvUE5HKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGNvdmVyUGF0aCwgcG5nKTtcbiAgICBjb25zdCByZXN1bHQ6IFJlbmRlclJlc3VsdCA9IHtcbiAgICAgIG9wdGlvbnMsXG4gICAgICB3cml0dGVuLFxuICAgICAgZmlsZXM6IHsgLi4ub3V0cHV0RmlsZXMsIGNvdmVyOiBjb3ZlclBhdGggfSxcbiAgICB9O1xuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKG91dERpciwgXCJzdW1tYXJ5Lmpzb25cIiksIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgIGxvZ2dlci5pbmZvKFRBRywgYHByb2dyZXNzOiAxMDAlLCAke3dyaXR0ZW59IGZyYW1lcyB3cml0dGVuYCk7XG4gIH0gZmluYWxseSB7XG4gICAgd2luLmNsb3NlKCk7XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDMvMTMuXG5cbmltcG9ydCB0eXBlIHsgRGVidWdnZXIgfSBmcm9tIFwiZWxlY3Ryb25cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFkdmFuY2VWaXJ0dWFsVGltZShjZHA6IERlYnVnZ2VyLCBidWRnZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gKF86IEVsZWN0cm9uLkV2ZW50LCBtZXRob2Q6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJFbXVsYXRpb24udmlydHVhbFRpbWVCdWRnZXRFeHBpcmVkXCIpIHtcbiAgICAgICAgY2RwLm9mZihcIm1lc3NhZ2VcIiwgaGFuZGxlcik7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNkcC5vbihcIm1lc3NhZ2VcIiwgaGFuZGxlcik7XG4gICAgY2RwLnNlbmRDb21tYW5kKFwiRW11bGF0aW9uLnNldFZpcnR1YWxUaW1lUG9saWN5XCIsIHtcbiAgICAgIHBvbGljeTogXCJhZHZhbmNlXCIsXG4gICAgICBidWRnZXQsXG4gICAgfSk7XG4gIH0pO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMy8xMy5cblxuaW1wb3J0IHsgb2sgfSBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBuYXRpdmVJbWFnZSwgdHlwZSBCcm93c2VyV2luZG93LCB0eXBlIE5hdGl2ZUltYWdlIH0gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgeyBta2Rpciwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGFkdmFuY2VWaXJ0dWFsVGltZSB9IGZyb20gXCIuLi9iYXNlL2NkcFwiO1xuaW1wb3J0IHsgRW5jb2RlclBpcGVsaW5lIH0gZnJvbSBcIi4uL2Jhc2UvZW5jb2Rlci9lbmNvZGVyXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uL2Jhc2UvaW1hZ2VcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi9iYXNlL2xvZ2dpbmdcIjtcbmltcG9ydCB7IGRlY29kZVRpbWVzdGFtcCwgc3RhcnRTeW5jLCBzdG9wU3luYyB9IGZyb20gXCIuL2ZyYW1lX3N5bmNcIjtcbmltcG9ydCB0eXBlIHsgUmVuZGVyT3B0aW9ucywgUmVuZGVyUmVzdWx0IH0gZnJvbSBcIi4vc2NoZW1hXCI7XG5pbXBvcnQgeyBsb2FkV2luZG93IH0gZnJvbSBcIi4vd2luZG93XCI7XG5cbmNvbnN0IFRBRyA9IFwiW1Nob290XVwiO1xuXG5mdW5jdGlvbiB0aWNrQW5pbXModGljazogbnVtYmVyKSB7XG4gIHJldHVybiBgZG9jdW1lbnQuZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goKGEpID0+IHtcbiAgICBhLnBhdXNlKCk7XG4gICAgYS5jdXJyZW50VGltZSArPSAke3RpY2t9O1xuICB9KWA7XG59XG5cbmZ1bmN0aW9uIGF3YWl0U3RlZ29GcmFtZShcbiAgd2luOiBCcm93c2VyV2luZG93LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgYWZ0ZXJUczogbnVtYmVyLFxuICBmcmFtZUluZGV4OiBudW1iZXIsXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IoYGZyYW1lICR7ZnJhbWVJbmRleH0gcGFpbnQgdGltZW91dGApKSwgMV8wMDApO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAoX2U6IHVua25vd24sIF9kOiB1bmtub3duLCBpbWFnZTogTmF0aXZlSW1hZ2UpID0+IHtcbiAgICAgIGlmIChpc0VtcHR5KGltYWdlKSkgcmV0dXJuO1xuICAgICAgY29uc3QgYml0bWFwID0gaW1hZ2UudG9CaXRtYXAoKTtcbiAgICAgIGNvbnN0IHRzID0gZGVjb2RlVGltZXN0YW1wKGJpdG1hcCwgaW1hZ2UuZ2V0U2l6ZSgpKTtcbiAgICAgIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzIDw9IGFmdGVyVHMpIHJldHVybjtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHdpbi53ZWJDb250ZW50cy5vZmYoXCJwYWludFwiLCBoYW5kbGVyKTtcbiAgICAgIHJlc29sdmUoQnVmZmVyLmZyb20oYml0bWFwLmJ1ZmZlciwgYml0bWFwLmJ5dGVPZmZzZXQsIGhlaWdodCAqIHdpZHRoICogNCkpO1xuICAgIH07XG4gICAgd2luLndlYkNvbnRlbnRzLm9uKFwicGFpbnRcIiwgaGFuZGxlcik7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hvb3Qoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBvdXREaXIsIGZwcywgd2lkdGgsIGhlaWdodCwgZHVyYXRpb24sIHdpdGhBdWRpbywgZm9ybWF0cyB9ID0gb3B0aW9ucztcbiAgaWYgKHdpdGhBdWRpbykge1xuICAgIGxvZ2dlci53YXJuKFRBRywgXCJBdWRpbyBjYXB0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGV0ZXJtaW5pc3RpYyBtb2RlXCIpO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oVEFHLCBgcHJvZ3Jlc3M6IDAlYCk7XG4gIGF3YWl0IG1rZGlyKG91dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3Qgd2luID0gYXdhaXQgbG9hZFdpbmRvdyhzb3VyY2UsIG9wdGlvbnMpO1xuICB0cnkge1xuICAgIGNvbnN0IGNkcCA9IHdpbi53ZWJDb250ZW50cy5kZWJ1Z2dlcjtcbiAgICBjZHAuYXR0YWNoKFwiMS4zXCIpO1xuXG4gICAgd2luLndlYkNvbnRlbnRzLnNldEZyYW1lUmF0ZSgyNDApO1xuICAgIGNvbnN0IHJvb3RGcmFtZSA9IHdpbi53ZWJDb250ZW50cy5tYWluRnJhbWUuZnJhbWVzWzBdO1xuICAgIGF3YWl0IHJvb3RGcmFtZT8uZXhlY3V0ZUphdmFTY3JpcHQodGlja0FuaW1zKDApKTtcblxuICAgIGlmICghd2luLndlYkNvbnRlbnRzLmlzUGFpbnRpbmcoKSkge1xuICAgICAgd2luLndlYkNvbnRlbnRzLnN0YXJ0UGFpbnRpbmcoKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzdGFydFN5bmMoY2RwKTtcblxuICAgIGNvbnN0IHBpcGVsaW5lID0gYXdhaXQgRW5jb2RlclBpcGVsaW5lLmNyZWF0ZSh7IHdpZHRoLCBoZWlnaHQsIGZwcywgZm9ybWF0cywgb3V0RGlyLCB3aXRoQXVkaW8gfSk7XG4gICAgY29uc3QgdG90YWwgPSBNYXRoLmNlaWwoZnBzICogZHVyYXRpb24pO1xuICAgIGNvbnN0IGZyYW1lSW50ZXJ2YWwgPSAxMDAwIC8gZnBzO1xuICAgIGNvbnN0IGZyYW1lSW50ZXJ2YWxVcyA9IE1hdGgucm91bmQoMV8wMDBfMDAwIC8gZnBzKTtcblxuICAgIGxldCB3cml0dGVuID0gMDtcbiAgICBsZXQgcHJvZ3Jlc3MgPSAwO1xuICAgIGxldCBjb3ZlckJncmE6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBmcmFtZSA9IDA7IGZyYW1lIDwgdG90YWw7IGZyYW1lKyspIHtcbiAgICAgICAgY29uc3QgZnJhbWVNcyA9IChmcmFtZSArIDEpICogZnJhbWVJbnRlcnZhbDtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IGF3YWl0U3RlZ29GcmFtZSh3aW4sIHdpZHRoLCBoZWlnaHQsIGZyYW1lTXMgLSAxLCBmcmFtZSk7XG5cbiAgICAgICAgYXdhaXQgYWR2YW5jZVZpcnR1YWxUaW1lKGNkcCwgZnJhbWVJbnRlcnZhbCk7XG4gICAgICAgIGF3YWl0IHJvb3RGcmFtZT8uZXhlY3V0ZUphdmFTY3JpcHQodGlja0FuaW1zKGZyYW1lSW50ZXJ2YWwpKTtcblxuICAgICAgICBjb25zdCBiaXRtYXAgPSBhd2FpdCBwZW5kaW5nO1xuXG4gICAgICAgIGlmIChmcmFtZSA9PT0gMCkge1xuICAgICAgICAgIGNvdmVyQmdyYSA9IGJpdG1hcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHBpcGVsaW5lLmVuY29kZUZyYW1lKGJpdG1hcCwgZnJhbWUgKiBmcmFtZUludGVydmFsVXMpO1xuICAgICAgICB3cml0dGVuKys7XG5cbiAgICAgICAgY29uc3QgbmV3UHJvZ3Jlc3MgPSBNYXRoLmZsb29yKCh3cml0dGVuIC8gdG90YWwpICogMTAwKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKG5ld1Byb2dyZXNzIC0gcHJvZ3Jlc3MpID4gMTApIHtcbiAgICAgICAgICBwcm9ncmVzcyA9IG5ld1Byb2dyZXNzO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFRBRywgYHByb2dyZXNzOiAke01hdGgucm91bmQocHJvZ3Jlc3MpfSVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBzdG9wU3luYyhjZHApO1xuICAgICAgY2RwLmRldGFjaCgpO1xuICAgIH1cblxuICAgIGlmICh3cml0dGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJubyBmcmFtZXMgY2FwdHVyZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0RmlsZXMgPSBhd2FpdCBwaXBlbGluZS5maW5pc2goKTtcbiAgICBjb25zdCBjb3ZlclBhdGggPSBqb2luKG91dERpciwgXCJjb3Zlci5wbmdcIik7XG4gICAgb2soY292ZXJCZ3JhLCBcImNvdmVyIGltYWdlIGlzIG1pc3NpbmdcIik7XG4gICAgY29uc3QgcG5nID0gbmF0aXZlSW1hZ2UuY3JlYXRlRnJvbUJ1ZmZlcihjb3ZlckJncmEsIHsgd2lkdGgsIGhlaWdodCB9KS50b1BORygpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShjb3ZlclBhdGgsIHBuZyk7XG4gICAgY29uc3QgcmVzdWx0OiBSZW5kZXJSZXN1bHQgPSB7XG4gICAgICBvcHRpb25zLFxuICAgICAgd3JpdHRlbixcbiAgICAgIGZpbGVzOiB7IC4uLm91dHB1dEZpbGVzLCBjb3ZlcjogY292ZXJQYXRoIH0sXG4gICAgfTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoam9pbihvdXREaXIsIFwic3VtbWFyeS5qc29uXCIpLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICBsb2dnZXIuaW5mbyhUQUcsIGBwcm9ncmVzczogMTAwJSwgJHt3cml0dGVufSBmcmFtZXMgd3JpdHRlbmApO1xuICB9IGZpbmFsbHkge1xuICAgIHdpbi5jbG9zZSgpO1xuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAxLzMwLlxuXG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwiZWxlY3Ryb25cIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2Jhc2UvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgbWFrZUNMSSB9IGZyb20gXCIuL2NvbW1vblwiO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIi4vcmVuZGVyZXIvcmVuZGVyXCI7XG5pbXBvcnQgeyBzaG9vdCB9IGZyb20gXCIuL3JlbmRlcmVyL3Nob290XCI7XG5cbnByb2Nlc3Mub25jZShcImV4aXRcIiwgKCkgPT4gYXBwLnF1aXQoKSk7XG5cbmNvbnN0IFRBRyA9IFwiW0FwcF1cIjtcblxuZnVuY3Rpb24gcHJpbnRGZWF0dXJlcygpIHtcbiAgbG9nZ2VyLmRlYnVnKFRBRywgXCJncHUgZmVhdHVyZXM6XCIsIGFwcC5nZXRHUFVGZWF0dXJlU3RhdHVzKCkpO1xufVxuXG5hcHAuZG9jaz8uaGlkZSgpO1xuXG5tYWtlQ0xJKFwiYXBwXCIsIGFzeW5jIChzb3VyY2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICBhcHAub24oXCJncHUtaW5mby11cGRhdGVcIiwgcHJpbnRGZWF0dXJlcyk7XG4gICAgYXdhaXQgYXBwLndoZW5SZWFkeSgpO1xuICAgIHByaW50RmVhdHVyZXMoKTtcbiAgICBjb25zdCBhY3Rpb24gPSBvcHRpb25zLmRldGVybWluaXN0aWMgPyBzaG9vdCA6IHJlbmRlcjtcbiAgICBhd2FpdCBhY3Rpb24oc291cmNlLCBvcHRpb25zKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhcHAucXVpdCgpO1xuICB9XG59KTtcbiJdfQ==
|