@dbx-tools/appkit-mastra 0.9.74 → 0.9.79

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.
@@ -8,9 +8,13 @@
8
8
  * @module
9
9
  */
10
10
  import { errorUtils, functionUtils } from "@dbx-tools/shared-core";
11
+ import { ensureMontyNativeBinding } from "./monty-native.js";
11
12
  const DEFAULT_COMMAND_TIMEOUT_MS = 30_000;
12
13
  const DEFAULT_MAX_MEMORY_BYTES = 10_000_000;
13
- const montyModule = functionUtils.memoize(() => import("@pydantic/monty/node"));
14
+ const montyModule = functionUtils.memoize(async () => {
15
+ await ensureMontyNativeBinding();
16
+ return import("@pydantic/monty/node");
17
+ });
14
18
  const montyPool = functionUtils.memoize(async () => {
15
19
  const { Monty } = await montyModule();
16
20
  return Monty.create({
@@ -86,7 +90,7 @@ export class MontySandbox {
86
90
  const pool = await montyPool();
87
91
  const session = await checkoutSession(pool, {
88
92
  limits: {
89
- maxDurationSecs: Math.max(0.001, timeout / 1_000),
93
+ maxFeedDurationSecs: Math.max(0.001, timeout / 1_000),
90
94
  maxMemory: this.maxMemoryBytes,
91
95
  },
92
96
  typeCheck: this.typeCheck,
@@ -328,4 +332,4 @@ function failedResult(command, args, started, stderr) {
328
332
  executionTimeMs: performance.now() - started,
329
333
  };
330
334
  }
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udHktc2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb250eS1zYW5kYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVNuRSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztBQUU1QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7QUFDaEYsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQXdCLEVBQUU7SUFDckUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUM7SUFDdEMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2xCLFlBQVksRUFBRSxDQUFDO1FBQ2YsWUFBWSxFQUFFLENBQUM7UUFDZixjQUFjLEVBQUUsRUFBRTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQWdCSCwrRUFBK0U7QUFDL0UsTUFBTSxPQUFPLFlBQVk7SUFDZCxFQUFFLENBQVM7SUFDWCxJQUFJLENBQVM7SUFDYixRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzVCLE1BQU0sR0FBK0IsU0FBUyxDQUFDO0lBQy9DLEtBQUssQ0FBVTtJQUVFLGdCQUFnQixDQUFTO0lBQ3pCLGNBQWMsQ0FBUztJQUN2QixTQUFTLENBQVU7SUFDbkIsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDaEMsVUFBVSxDQUFRO0lBRTFCLFlBQVksVUFBK0IsRUFBRTtRQUMzQyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDO1FBQ2hDLElBQUks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RUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxNQUErQjtJQUNsRCxPQUFPLE1BQU0sRUFBRSxNQUFNLElBQUksSUFBSSxZQUFZLENBQUMseUJBQXlCLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUNuQixPQUFlLEVBQ2YsSUFBYyxFQUNkLE9BQWUsRUFDZixNQUFjO0lBRWQsT0FBTztRQUNMLE9BQU87UUFDUCxJQUFJO1FBQ0osT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsQ0FBQztRQUNYLE1BQU0sRUFBRSxFQUFFO1FBQ1YsTUFBTTtRQUNOLGVBQWUsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTztLQUM3QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHlkYW50aWMgTW9udHkgZmFsbGJhY2sgZm9yIE1hc3RyYSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAqXG4gKiBVc2VzIHRoZSBOb2RlIHN1YnByb2Nlc3Mtd29ya2VyIGJ1aWxkIG9mIE1vbnR5LiBJdCBleGVjdXRlcyBQeXRob24gc291cmNlXG4gKiB3aXRoIG5vIGhvc3QgZmlsZXN5c3RlbSwgbmV0d29yaywgZW52aXJvbm1lbnQsIHNoZWxsLCBvciB0aGlyZC1wYXJ0eSBwYWNrYWdlXG4gKiBhY2Nlc3MgdW5sZXNzIGEgZnV0dXJlIGNhbGxlciBleHBsaWNpdGx5IGFkZHMgdGhvc2UgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBlcnJvclV0aWxzLCBmdW5jdGlvblV0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWFuZFJlc3VsdCxcbiAgRXhlY3V0ZUNvbW1hbmRPcHRpb25zLFxuICBTYW5kYm94SW5mbyxcbiAgV29ya3NwYWNlU2FuZGJveCxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcbmltcG9ydCB0eXBlIHsgQ2hlY2tvdXRPcHRpb25zLCBNb250eSBhcyBNb250eVBvb2wsIE1vbnR5U2Vzc2lvbiB9IGZyb20gXCJAcHlkYW50aWMvbW9udHkvbm9kZVwiO1xuXG5jb25zdCBERUZBVUxUX0NPTU1BTkRfVElNRU9VVF9NUyA9IDMwXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX01FTU9SWV9CWVRFUyA9IDEwXzAwMF8wMDA7XG5cbmNvbnN0IG1vbnR5TW9kdWxlID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKCgpID0+IGltcG9ydChcIkBweWRhbnRpYy9tb250eS9ub2RlXCIpKTtcbmNvbnN0IG1vbnR5UG9vbCA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZShhc3luYyAoKTogUHJvbWlzZTxNb250eVBvb2w+ID0+IHtcbiAgY29uc3QgeyBNb250eSB9ID0gYXdhaXQgbW9udHlNb2R1bGUoKTtcbiAgcmV0dXJuIE1vbnR5LmNyZWF0ZSh7XG4gICAgbWluUHJvY2Vzc2VzOiAxLFxuICAgIG1heFByb2Nlc3NlczogNCxcbiAgICByZXF1ZXN0VGltZW91dDogMzUsXG4gIH0pO1xufSk7XG5cbi8qKiBSZXNvdXJjZSBjb250cm9scyBmb3IgdGhlIE1vbnR5IFB5dGhvbiBmYWxsYmFjay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9udHlTYW5kYm94T3B0aW9ucyB7XG4gIC8qKiBNYXN0cmEgcHJvdmlkZXIgaWQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogRGlzcGxheSBuYW1lLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBleGVjdXRpb24gdGltZW91dC4gUGVyLWNhbGwgYG9wdGlvbnMudGltZW91dGAgd2lucy4gKi9cbiAgY29tbWFuZFRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gTW9udHkgaGVhcCBieXRlcyBmb3Igb25lIGNoZWNrb3V0LiAqL1xuICBtYXhNZW1vcnlCeXRlcz86IG51bWJlcjtcbiAgLyoqIFR5cGUtY2hlY2sgZWFjaCBQeXRob24gc25pcHBldCBiZWZvcmUgcnVubmluZyBpdC4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHR5cGVDaGVjaz86IGJvb2xlYW47XG59XG5cbi8qKiBQeXRob24tb25seSwgZGVueS1ieS1kZWZhdWx0IHNhbmRib3ggYmFja2VkIGJ5IE1vbnR5J3MgTm9kZSB3b3JrZXIgcG9vbC4gKi9cbmV4cG9ydCBjbGFzcyBNb250eVNhbmRib3ggaW1wbGVtZW50cyBXb3Jrc3BhY2VTYW5kYm94IHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwcm92aWRlciA9IFwibW9udHlcIjtcbiAgc3RhdHVzOiBXb3Jrc3BhY2VTYW5kYm94W1wic3RhdHVzXCJdID0gXCJwZW5kaW5nXCI7XG4gIGVycm9yPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heE1lbW9yeUJ5dGVzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHlwZUNoZWNrOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gIHByaXZhdGUgbGFzdFVzZWRBdD86IERhdGU7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9udHlTYW5kYm94T3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQgPz8gXCJtb250eVwiO1xuICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZSA/PyBcIlB5ZGFudGljIE1vbnR5XCI7XG4gICAgdGhpcy5jb21tYW5kVGltZW91dE1zID0gb3B0aW9ucy5jb21tYW5kVGltZW91dE1zID8/IERFRkFVTFRfQ09NTUFORF9USU1FT1VUX01TO1xuICAgIHRoaXMubWF4TWVtb3J5Qnl0ZXMgPSBvcHRpb25zLm1heE1lbW9yeUJ5dGVzID8/IERFRkFVTFRfTUFYX01FTU9SWV9CWVRFUztcbiAgICB0aGlzLnR5cGVDaGVjayA9IG9wdGlvbnMudHlwZUNoZWNrID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqIFdhcm0gdGhlIHNoYXJlZCBjcmFzaC1pc29sYXRlZCB3b3JrZXIgcG9vbC4gKi9cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSBcInJ1bm5pbmdcIikgcmV0dXJuO1xuICAgIHRoaXMuc3RhdHVzID0gXCJzdGFydGluZ1wiO1xuICAgIHRoaXMuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1vbnR5UG9vbCgpO1xuICAgICAgdGhpcy5zdGF0dXMgPSBcInJ1bm5pbmdcIjtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gXCJlcnJvclwiO1xuICAgICAgdGhpcy5lcnJvciA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICB0aHJvdyBjYXVnaHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBwcm9jZXNzLXdpZGUgcG9vbCBzdGF5cyB3YXJtOyB0aGlzIGluc3RhbmNlIGNhcnJpZXMgbm8gb3BlbiBzZXNzaW9uLiAqL1xuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdHVzID0gXCJzdG9wcGVkXCI7XG4gIH1cblxuICAvKiogVGhlIHByb2Nlc3Mtd2lkZSBwb29sIHN0YXlzIHdhcm07IGVhY2ggY29tbWFuZCBjbG9zZXMgaXRzIG93biBjaGVja291dC4gKi9cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXR1cyA9IFwiZGVzdHJveWVkXCI7XG4gIH1cblxuICAvKiogTW9udHkgc2Vzc2lvbnMgYXJlIGVwaGVtZXJhbCBhbmQgZG8gbm90IHByb3ZpZGUgcGVyc2lzdGVudCBjaGVja3BvaW50cy4gKi9cbiAgYXN5bmMgc25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIHJlYWRvbmx5IHN1cHBvcnRzQ2hlY2twb2ludHMgPSBmYWxzZTtcblxuICAvKiogRXhlY3V0ZSBQeXRob24gc291cmNlIGFuZCBtYXAgTW9udHkgb3V0cHV0IHRvIE1hc3RyYSdzIGNvbW1hbmQgcmVzdWx0LiAqL1xuICBhc3luYyBleGVjdXRlQ29tbWFuZChcbiAgICBjb21tYW5kOiBzdHJpbmcsXG4gICAgYXJnczogc3RyaW5nW10gPSBbXSxcbiAgICBvcHRpb25zOiBFeGVjdXRlQ29tbWFuZE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxDb21tYW5kUmVzdWx0PiB7XG4gICAgY29uc3Qgc3RhcnRlZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGNvZGUgPSBtb250eUNvZGUoY29tbWFuZCwgYXJncyk7XG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhaWxlZFJlc3VsdChcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhcnRlZCxcbiAgICAgICAgXCJNb250eSBmYWxsYmFjayBhY2NlcHRzIFB5dGhvbiBzb3VyY2UgZGlyZWN0bHksIG9yIHB5dGhvbi9weXRob24zIHdpdGggYSBzaW5nbGUgLWMgc2NyaXB0LlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBPYmplY3QuZW50cmllcyhvcHRpb25zLmVudiA/PyB7fSkuZmlsdGVyKFxuICAgICAgKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICApO1xuICAgIGlmIChlbnZpcm9ubWVudC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmFpbGVkUmVzdWx0KFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdGFydGVkLFxuICAgICAgICBcIk1vbnR5IGZhbGxiYWNrIGRvZXMgbm90IGV4cG9zZSBob3N0IGVudmlyb25tZW50IHZhcmlhYmxlcy5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmN3ZCkge1xuICAgICAgcmV0dXJuIGZhaWxlZFJlc3VsdChcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhcnRlZCxcbiAgICAgICAgXCJNb250eSBmYWxsYmFjayBkb2VzIG5vdCBleHBvc2UgYSBob3N0IHdvcmtpbmcgZGlyZWN0b3J5LlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYWJvcnRTaWduYWw/LmFib3J0ZWQpIHRocm93IG9wdGlvbnMuYWJvcnRTaWduYWwucmVhc29uO1xuXG4gICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy5jb21tYW5kVGltZW91dE1zO1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCBtb250eVBvb2woKTtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY2hlY2tvdXRTZXNzaW9uKFxuICAgICAgcG9vbCxcbiAgICAgIHtcbiAgICAgICAgbGltaXRzOiB7XG4gICAgICAgICAgbWF4RHVyYXRpb25TZWNzOiBNYXRoLm1heCgwLjAwMSwgdGltZW91dCAvIDFfMDAwKSxcbiAgICAgICAgICBtYXhNZW1vcnk6IHRoaXMubWF4TWVtb3J5Qnl0ZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVDaGVjazogdGhpcy50eXBlQ2hlY2ssXG4gICAgICB9LFxuICAgICAgb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICApO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSZXRhaW5lZE91dHB1dChvcHRpb25zKTtcbiAgICBjb25zdCB3b3JrZXJQaWQgPSBzZXNzaW9uLndvcmtlclBpZDtcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHRlcm1pbmF0ZVdvcmtlcih3b3JrZXJQaWQpO1xuICAgIH07XG4gICAgb3B0aW9ucy5hYm9ydFNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgb25BYm9ydCgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWJvcnRlZCkgdGhyb3cgYWJvcnRSZWFzb24ob3B0aW9ucy5hYm9ydFNpZ25hbCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHNlc3Npb24uZmVlZFJ1bihzdHJpcFB5dGhvbkZlbmNlKGNvZGUpLCB7XG4gICAgICAgIHByaW50Q2FsbGJhY2s6IChzdHJlYW0sIHRleHQpID0+IG91dHB1dC5lbWl0KHN0cmVhbSwgdGV4dCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJldHVybmVkID0gZm9ybWF0UmVzdWx0KHZhbHVlKTtcbiAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICBjb25zdCBzdWZmaXggPSByZXR1cm5lZC5lbmRzV2l0aChcIlxcblwiKSA/IHJldHVybmVkIDogYCR7cmV0dXJuZWR9XFxuYDtcbiAgICAgICAgb3V0cHV0LmVtaXQoXCJzdGRvdXRcIiwgc3VmZml4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFVzZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgc3Rkb3V0OiBvdXRwdXQuc3Rkb3V0LnZhbHVlLFxuICAgICAgICBzdGRlcnI6IG91dHB1dC5zdGRlcnIudmFsdWUsXG4gICAgICAgIGV4ZWN1dGlvblRpbWVNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoYWJvcnRlZCB8fCBvcHRpb25zLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IGFib3J0UmVhc29uKG9wdGlvbnMuYWJvcnRTaWduYWwpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICBvdXRwdXQuZW1pdChcInN0ZGVyclwiLCBvdXRwdXQuc3RkZXJyLnZhbHVlID8gYFxcbiR7bWVzc2FnZX1gIDogbWVzc2FnZSk7XG4gICAgICBjb25zdCB7IE1vbnR5Q3Jhc2hlZEVycm9yIH0gPSBhd2FpdCBtb250eU1vZHVsZSgpO1xuICAgICAgY29uc3QgdGltZWRPdXQgPSBjYXVnaHQgaW5zdGFuY2VvZiBNb250eUNyYXNoZWRFcnJvciAmJiBjYXVnaHQudGltZWRPdXQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXhpdENvZGU6IHRpbWVkT3V0ID8gLTEgOiAxLFxuICAgICAgICBzdGRvdXQ6IG91dHB1dC5zdGRvdXQudmFsdWUsXG4gICAgICAgIHN0ZGVycjogb3V0cHV0LnN0ZGVyci52YWx1ZSxcbiAgICAgICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gICAgICAgIC4uLih0aW1lZE91dCA/IHsgdGltZWRPdXQ6IHRydWUsIGtpbGxlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9wdGlvbnMuYWJvcnRTaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIGF3YWl0IHNlc3Npb24uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1JlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCI7XG4gIH1cblxuICBnZXRJbmZvKCk6IFNhbmRib3hJbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBwcm92aWRlcjogdGhpcy5wcm92aWRlcixcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgLi4uKHRoaXMubGFzdFVzZWRBdCA/IHsgbGFzdFVzZWRBdDogdGhpcy5sYXN0VXNlZEF0IH0gOiB7fSksXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYW5ndWFnZTogXCJweXRob25cIixcbiAgICAgICAgaG9zdEFjY2VzczogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXRJbnN0cnVjdGlvbnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJDb21tYW5kcyBydW4gYXMgUHl0aG9uIHNvdXJjZSBpbiB0aGUgUHlkYW50aWMgTW9udHkgZmFsbGJhY2suXCIsXG4gICAgICBcIlBhc3MgUHl0aG9uIGNvZGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gc2hlbGwgc3ludGF4LlwiLFxuICAgICAgXCJUaGVyZSBpcyBubyBob3N0IGZpbGVzeXN0ZW0sIG5ldHdvcmssIGVudmlyb25tZW50LCBzaGVsbCwgb3IgdGhpcmQtcGFydHkgcGFja2FnZSBhY2Nlc3MuXCIsXG4gICAgXS5qb2luKFwiIFwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb250eUNvZGUoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbW1hbmQ7XG4gIGlmICgoY29tbWFuZCA9PT0gXCJweXRob25cIiB8fCBjb21tYW5kID09PSBcInB5dGhvbjNcIikgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgYXJnc1swXSA9PT0gXCItY1wiKSB7XG4gICAgcmV0dXJuIGFyZ3NbMV07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RyaXBQeXRob25GZW5jZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gY29kZS50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gL15gYGAoPzpweXRob258cHkpP1xccypcXG4oW1xcc1xcU10qPylcXG5gYGAkL2kuZXhlYyh0cmltbWVkKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV0gPz8gY29kZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBcIlwiO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSA/PyBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZE91dHB1dCB7XG4gIHJlYWRvbmx5IHN0ZG91dDogUmV0YWluZWRUZXh0O1xuICByZWFkb25seSBzdGRlcnI6IFJldGFpbmVkVGV4dDtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uU3Rkb3V0OiBFeGVjdXRlQ29tbWFuZE9wdGlvbnNbXCJvblN0ZG91dFwiXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblN0ZGVycjogRXhlY3V0ZUNvbW1hbmRPcHRpb25zW1wib25TdGRlcnJcIl07XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXhlY3V0ZUNvbW1hbmRPcHRpb25zKSB7XG4gICAgdGhpcy5zdGRvdXQgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5zdGRlcnIgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5vblN0ZG91dCA9IG9wdGlvbnMub25TdGRvdXQ7XG4gICAgdGhpcy5vblN0ZGVyciA9IG9wdGlvbnMub25TdGRlcnI7XG4gIH1cblxuICBlbWl0KHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChzdHJlYW0gPT09IFwic3Rkb3V0XCIpIHtcbiAgICAgIHRoaXMub25TdGRvdXQ/Lih0ZXh0KTtcbiAgICAgIHRoaXMuc3Rkb3V0LmFwcGVuZCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblN0ZGVycj8uKHRleHQpO1xuICAgICAgdGhpcy5zdGRlcnIuYXBwZW5kKHRleHQpO1xuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhKCk6IFBpY2s8XG4gICAgQ29tbWFuZFJlc3VsdCxcbiAgICBcInN0ZG91dFRydW5jYXRlZFwiIHwgXCJzdGRlcnJUcnVuY2F0ZWRcIiB8IFwic3Rkb3V0RHJvcHBlZEJ5dGVzXCIgfCBcInN0ZGVyckRyb3BwZWRCeXRlc1wiXG4gID4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZG91dFRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZG91dERyb3BwZWRCeXRlczogdGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4odGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZGVyclRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZGVyckRyb3BwZWRCeXRlczogdGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZFRleHQge1xuICB2YWx1ZSA9IFwiXCI7XG4gIGRyb3BwZWRCeXRlcyA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgY29uc3RydWN0b3IobWF4Qnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gbWF4Qnl0ZXMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkICE9PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgJiZcbiAgICAgICghTnVtYmVyLmlzU2FmZUludGVnZXIocmVzb2x2ZWQpIHx8IHJlc29sdmVkIDwgMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtYXhSZXRhaW5lZEJ5dGVzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyIG9yIEluZmluaXR5XCIpO1xuICAgIH1cbiAgICB0aGlzLm1heEJ5dGVzID0gcmVzb2x2ZWQ7XG4gIH1cblxuICBhcHBlbmQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMubWF4Qnl0ZXMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb21iaW5lZCA9IHRoaXMuZW5jb2Rlci5lbmNvZGUodGhpcy52YWx1ZSArIHRleHQpO1xuICAgIGlmIChjb21iaW5lZC5sZW5ndGggPD0gdGhpcy5tYXhCeXRlcykge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSBjb21iaW5lZC5sZW5ndGggLSB0aGlzLm1heEJ5dGVzO1xuICAgIHdoaWxlIChzdGFydCA8IGNvbWJpbmVkLmxlbmd0aCAmJiAoY29tYmluZWRbc3RhcnRdISAmIDB4YzApID09PSAweDgwKSBzdGFydCsrO1xuICAgIGNvbnN0IHJldGFpbmVkID0gY29tYmluZWQuc3ViYXJyYXkoc3RhcnQpO1xuICAgIHRoaXMuZHJvcHBlZEJ5dGVzICs9IGNvbWJpbmVkLmxlbmd0aCAtIHJldGFpbmVkLmxlbmd0aDtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWNvZGVyLmRlY29kZShyZXRhaW5lZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVybWluYXRlV29ya2VyKHdvcmtlclBpZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICh3b3JrZXJQaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCh3b3JrZXJQaWQsIFwiU0lHS0lMTFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIGNvbW1hbmQgY2FuIGZpbmlzaCBiZXR3ZWVuIHRoZSBhYm9ydCBldmVudCBhbmQgdGhlIGtpbGwgcmVxdWVzdC5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja291dFNlc3Npb24oXG4gIHBvb2w6IE1vbnR5UG9vbCxcbiAgb3B0aW9uczogQ2hlY2tvdXRPcHRpb25zLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxNb250eVNlc3Npb24+IHtcbiAgY29uc3QgY2hlY2tvdXQgPSBwb29sLmNoZWNrb3V0KG9wdGlvbnMpO1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIGNoZWNrb3V0O1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB2b2lkIGNoZWNrb3V0LnRoZW4oKHNlc3Npb24pID0+IHNlc3Npb24uY2xvc2UoKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0aHJvdyBhYm9ydFJlYXNvbihzaWduYWwpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPE1vbnR5U2Vzc2lvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlamVjdChhYm9ydFJlYXNvbihzaWduYWwpKTtcbiAgICAgIHZvaWQgY2hlY2tvdXQudGhlbigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5jbG9zZSgpKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH07XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgY2hlY2tvdXQudGhlbihcbiAgICAgIChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHNlc3Npb24pO1xuICAgICAgfSxcbiAgICAgIChjYXVnaHQ6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChjYXVnaHQpO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWJvcnRSZWFzb24oc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICByZXR1cm4gc2lnbmFsPy5yZWFzb24gPz8gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBjb21tYW5kIHdhcyBhYm9ydGVkXCIsIFwiQWJvcnRFcnJvclwiKTtcbn1cblxuZnVuY3Rpb24gZmFpbGVkUmVzdWx0KFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBzdGFydGVkOiBudW1iZXIsXG4gIHN0ZGVycjogc3RyaW5nLFxuKTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGV4aXRDb2RlOiAxLFxuICAgIHN0ZG91dDogXCJcIixcbiAgICBzdGRlcnIsXG4gICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gIH07XG59XG4iXX0=
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udHktc2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb250eS1zYW5kYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVNuRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3RCxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztBQUU1QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ25ELE1BQU0sd0JBQXdCLEVBQUUsQ0FBQztJQUNqQyxPQUFPLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQXdCLEVBQUU7SUFDckUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUM7SUFDdEMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2xCLFlBQVksRUFBRSxDQUFDO1FBQ2YsWUFBWSxFQUFFLENBQUM7UUFDZixjQUFjLEVBQUUsRUFBRTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQWdCSCwrRUFBK0U7QUFDL0UsTUFBTSxPQUFPLFlBQVk7SUFDZCxFQUFFLENBQVM7SUFDWCxJQUFJLENBQVM7SUFDYixRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzVCLE1BQU0sR0FBK0IsU0FBUyxDQUFDO0lBQy9DLEtBQUssQ0FBVTtJQUVFLGdCQUFnQixDQUFTO0lBQ3pCLGNBQWMsQ0FBUztJQUN2QixTQUFTLENBQVU7SUFDbkIsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDaEMsVUFBVSxDQUFRO0lBRTFCLFlBQVksVUFBK0IsRUFBRTtRQUMzQyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJLDBCQUEwQixDQUFDO1FBQy9FLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSx3QkFBd0IsQ0FBQztRQUN6RSxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUztZQUFFLE9BQU87UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUMxQixDQUFDO1FBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsTUFBTSxNQUFNLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsS0FBSyxDQUFDLE9BQU87UUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLEtBQUssQ0FBQyxRQUFRLEtBQW1CLENBQUM7SUFFekIsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBRXJDLDZFQUE2RTtJQUM3RSxLQUFLLENBQUMsY0FBYyxDQUNsQixPQUFlLEVBQ2YsT0FBaUIsRUFBRSxFQUNuQixVQUFpQyxFQUFFO1FBRW5DLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sWUFBWSxDQUNqQixPQUFPLEVBQ1AsSUFBSSxFQUNKLE9BQU8sRUFDUCwyRkFBMkYsQ0FDNUYsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUMxRCxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FDbkMsQ0FBQztRQUNGLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLFlBQVksQ0FDakIsT0FBTyxFQUNQLElBQUksRUFDSixPQUFPLEVBQ1AsNERBQTRELENBQzdELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEIsT0FBTyxZQUFZLENBQ2pCLE9BQU8sRUFDUCxJQUFJLEVBQ0osT0FBTyxFQUNQLDBEQUEwRCxDQUMzRCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPO1lBQUUsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUVuRSxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxNQUFNLFNBQVMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLE1BQU0sZUFBZSxDQUNuQyxJQUFJLEVBQ0o7WUFDRSxNQUFNLEVBQUU7Z0JBQ04sbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckQsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjO2FBQy9CO1lBQ0QsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLEVBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FDcEIsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDcEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLEdBQVMsRUFBRTtZQUN6QixPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUNGLE9BQU8sQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDO1lBQ0gsSUFBSSxPQUFPO2dCQUFFLE1BQU0sV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFELGFBQWEsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQzthQUMzRCxDQUFDLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxJQUFJLENBQUM7Z0JBQ3BFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTztnQkFDTCxPQUFPO2dCQUNQLElBQUk7Z0JBQ0osT0FBTyxFQUFFLElBQUk7Z0JBQ2IsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDM0IsZUFBZSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPO2dCQUM1QyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUU7YUFDckIsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQzVDLE1BQU0sV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsTUFBTSxXQUFXLEVBQUUsQ0FBQztZQUNsRCxNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksaUJBQWlCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUN4RSxPQUFPO2dCQUNMLE9BQU87Z0JBQ1AsSUFBSTtnQkFDSixPQUFPLEVBQUUsS0FBSztnQkFDZCxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDM0IsZUFBZSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPO2dCQUM1QyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRTthQUNyQixDQUFDO1FBQ0osQ0FBQztnQkFBUyxDQUFDO1lBQ1QsT0FBTyxDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0QsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTztRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPO1lBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNELFFBQVEsRUFBRTtnQkFDUixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsVUFBVSxFQUFFLEtBQUs7YUFDbEI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPO1lBQ0wsK0RBQStEO1lBQy9ELHFEQUFxRDtZQUNyRCwwRkFBMEY7U0FDM0YsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFFRCxTQUFTLFNBQVMsQ0FBQyxPQUFlLEVBQUUsSUFBdUI7SUFDekQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUN0QyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzdGLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFZO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixNQUFNLEtBQUssR0FBRywwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkUsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDckQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sY0FBYztJQUNULE1BQU0sQ0FBZTtJQUNyQixNQUFNLENBQWU7SUFFYixRQUFRLENBQW9DO0lBQzVDLFFBQVEsQ0FBb0M7SUFFN0QsWUFBWSxPQUE4QjtRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQTJCLEVBQUUsSUFBWTtRQUM1QyxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBSU4sT0FBTztZQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDO2dCQUM5QixDQUFDLENBQUM7b0JBQ0UsZUFBZSxFQUFFLElBQUk7b0JBQ3JCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWTtpQkFDN0M7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDO2dCQUM5QixDQUFDLENBQUM7b0JBQ0UsZUFBZSxFQUFFLElBQUk7b0JBQ3JCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWTtpQkFDN0M7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxNQUFNLFlBQVk7SUFDaEIsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLFlBQVksR0FBRyxDQUFDLENBQUM7SUFFQSxRQUFRLENBQVM7SUFDakIsT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDNUIsT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFFN0MsWUFBWSxRQUE0QjtRQUN0QyxNQUFNLFFBQVEsR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ3RELElBQ0UsUUFBUSxLQUFLLE1BQU0sQ0FBQyxpQkFBaUI7WUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUNqRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLFNBQVMsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVk7UUFDakIsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDeEQsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM1QyxPQUFPLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBRSxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUk7WUFBRSxLQUFLLEVBQUUsQ0FBQztRQUM5RSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBRUQsU0FBUyxlQUFlLENBQUMsU0FBNkI7SUFDcEQsSUFBSSxTQUFTLEtBQUssU0FBUztRQUFFLE9BQU87SUFDcEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHVFQUF1RTtJQUN6RSxDQUFDO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxlQUFlLENBQzVCLElBQWUsRUFDZixPQUF3QixFQUN4QixNQUErQjtJQUUvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDN0IsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEUsTUFBTSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELE9BQU8sSUFBSSxPQUFPLENBQWUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbkQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLEdBQVMsRUFBRTtZQUN6QixJQUFJLE9BQU87Z0JBQUUsT0FBTztZQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzVCLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsUUFBUSxDQUFDLElBQUksQ0FDWCxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1YsSUFBSSxPQUFPO2dCQUFFLE9BQU87WUFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25CLENBQUMsRUFDRCxDQUFDLE1BQWUsRUFBRSxFQUFFO1lBQ2xCLElBQUksT0FBTztnQkFBRSxPQUFPO1lBQ3BCLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQStCO0lBQ2xELE9BQU8sTUFBTSxFQUFFLE1BQU0sSUFBSSxJQUFJLFlBQVksQ0FBQyx5QkFBeUIsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLE9BQWUsRUFDZixJQUFjLEVBQ2QsT0FBZSxFQUNmLE1BQWM7SUFFZCxPQUFPO1FBQ0wsT0FBTztRQUNQLElBQUk7UUFDSixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxDQUFDO1FBQ1gsTUFBTSxFQUFFLEVBQUU7UUFDVixNQUFNO1FBQ04sZUFBZSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPO0tBQzdDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQeWRhbnRpYyBNb250eSBmYWxsYmFjayBmb3IgTWFzdHJhIGNvbW1hbmQgZXhlY3V0aW9uLlxuICpcbiAqIFVzZXMgdGhlIE5vZGUgc3VicHJvY2Vzcy13b3JrZXIgYnVpbGQgb2YgTW9udHkuIEl0IGV4ZWN1dGVzIFB5dGhvbiBzb3VyY2VcbiAqIHdpdGggbm8gaG9zdCBmaWxlc3lzdGVtLCBuZXR3b3JrLCBlbnZpcm9ubWVudCwgc2hlbGwsIG9yIHRoaXJkLXBhcnR5IHBhY2thZ2VcbiAqIGFjY2VzcyB1bmxlc3MgYSBmdXR1cmUgY2FsbGVyIGV4cGxpY2l0bHkgYWRkcyB0aG9zZSBjYXBhYmlsaXRpZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGVycm9yVXRpbHMsIGZ1bmN0aW9uVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kUmVzdWx0LFxuICBFeGVjdXRlQ29tbWFuZE9wdGlvbnMsXG4gIFNhbmRib3hJbmZvLFxuICBXb3Jrc3BhY2VTYW5kYm94LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBDaGVja291dE9wdGlvbnMsIE1vbnR5IGFzIE1vbnR5UG9vbCwgTW9udHlTZXNzaW9uIH0gZnJvbSBcIkBweWRhbnRpYy9tb250eS9ub2RlXCI7XG5cbmltcG9ydCB7IGVuc3VyZU1vbnR5TmF0aXZlQmluZGluZyB9IGZyb20gXCIuL21vbnR5LW5hdGl2ZS50c1wiO1xuXG5jb25zdCBERUZBVUxUX0NPTU1BTkRfVElNRU9VVF9NUyA9IDMwXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX01FTU9SWV9CWVRFUyA9IDEwXzAwMF8wMDA7XG5cbmNvbnN0IG1vbnR5TW9kdWxlID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpID0+IHtcbiAgYXdhaXQgZW5zdXJlTW9udHlOYXRpdmVCaW5kaW5nKCk7XG4gIHJldHVybiBpbXBvcnQoXCJAcHlkYW50aWMvbW9udHkvbm9kZVwiKTtcbn0pO1xuY29uc3QgbW9udHlQb29sID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpOiBQcm9taXNlPE1vbnR5UG9vbD4gPT4ge1xuICBjb25zdCB7IE1vbnR5IH0gPSBhd2FpdCBtb250eU1vZHVsZSgpO1xuICByZXR1cm4gTW9udHkuY3JlYXRlKHtcbiAgICBtaW5Qcm9jZXNzZXM6IDEsXG4gICAgbWF4UHJvY2Vzc2VzOiA0LFxuICAgIHJlcXVlc3RUaW1lb3V0OiAzNSxcbiAgfSk7XG59KTtcblxuLyoqIFJlc291cmNlIGNvbnRyb2xzIGZvciB0aGUgTW9udHkgUHl0aG9uIGZhbGxiYWNrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb250eVNhbmRib3hPcHRpb25zIHtcbiAgLyoqIE1hc3RyYSBwcm92aWRlciBpZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IGV4ZWN1dGlvbiB0aW1lb3V0LiBQZXItY2FsbCBgb3B0aW9ucy50aW1lb3V0YCB3aW5zLiAqL1xuICBjb21tYW5kVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBNb250eSBoZWFwIGJ5dGVzIGZvciBvbmUgY2hlY2tvdXQuICovXG4gIG1heE1lbW9yeUJ5dGVzPzogbnVtYmVyO1xuICAvKiogVHlwZS1jaGVjayBlYWNoIFB5dGhvbiBzbmlwcGV0IGJlZm9yZSBydW5uaW5nIGl0LiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgdHlwZUNoZWNrPzogYm9vbGVhbjtcbn1cblxuLyoqIFB5dGhvbi1vbmx5LCBkZW55LWJ5LWRlZmF1bHQgc2FuZGJveCBiYWNrZWQgYnkgTW9udHkncyBOb2RlIHdvcmtlciBwb29sLiAqL1xuZXhwb3J0IGNsYXNzIE1vbnR5U2FuZGJveCBpbXBsZW1lbnRzIFdvcmtzcGFjZVNhbmRib3gge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb3ZpZGVyID0gXCJtb250eVwiO1xuICBzdGF0dXM6IFdvcmtzcGFjZVNhbmRib3hbXCJzdGF0dXNcIl0gPSBcInBlbmRpbmdcIjtcbiAgZXJyb3I/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4TWVtb3J5Qnl0ZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlQ2hlY2s6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgcHJpdmF0ZSBsYXN0VXNlZEF0PzogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb250eVNhbmRib3hPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZCA/PyBcIm1vbnR5XCI7XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lID8/IFwiUHlkYW50aWMgTW9udHlcIjtcbiAgICB0aGlzLmNvbW1hbmRUaW1lb3V0TXMgPSBvcHRpb25zLmNvbW1hbmRUaW1lb3V0TXMgPz8gREVGQVVMVF9DT01NQU5EX1RJTUVPVVRfTVM7XG4gICAgdGhpcy5tYXhNZW1vcnlCeXRlcyA9IG9wdGlvbnMubWF4TWVtb3J5Qnl0ZXMgPz8gREVGQVVMVF9NQVhfTUVNT1JZX0JZVEVTO1xuICAgIHRoaXMudHlwZUNoZWNrID0gb3B0aW9ucy50eXBlQ2hlY2sgPz8gZmFsc2U7XG4gIH1cblxuICAvKiogV2FybSB0aGUgc2hhcmVkIGNyYXNoLWlzb2xhdGVkIHdvcmtlciBwb29sLiAqL1xuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IFwicnVubmluZ1wiKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXMgPSBcInN0YXJ0aW5nXCI7XG4gICAgdGhpcy5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbW9udHlQb29sKCk7XG4gICAgICB0aGlzLnN0YXR1cyA9IFwicnVubmluZ1wiO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgdGhpcy5zdGF0dXMgPSBcImVycm9yXCI7XG4gICAgICB0aGlzLmVycm9yID0gZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoY2F1Z2h0KTtcbiAgICAgIHRocm93IGNhdWdodDtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHByb2Nlc3Mtd2lkZSBwb29sIHN0YXlzIHdhcm07IHRoaXMgaW5zdGFuY2UgY2FycmllcyBubyBvcGVuIHNlc3Npb24uICovXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0dXMgPSBcInN0b3BwZWRcIjtcbiAgfVxuXG4gIC8qKiBUaGUgcHJvY2Vzcy13aWRlIHBvb2wgc3RheXMgd2FybTsgZWFjaCBjb21tYW5kIGNsb3NlcyBpdHMgb3duIGNoZWNrb3V0LiAqL1xuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdHVzID0gXCJkZXN0cm95ZWRcIjtcbiAgfVxuXG4gIC8qKiBNb250eSBzZXNzaW9ucyBhcmUgZXBoZW1lcmFsIGFuZCBkbyBub3QgcHJvdmlkZSBwZXJzaXN0ZW50IGNoZWNrcG9pbnRzLiAqL1xuICBhc3luYyBzbmFwc2hvdCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgcmVhZG9ubHkgc3VwcG9ydHNDaGVja3BvaW50cyA9IGZhbHNlO1xuXG4gIC8qKiBFeGVjdXRlIFB5dGhvbiBzb3VyY2UgYW5kIG1hcCBNb250eSBvdXRwdXQgdG8gTWFzdHJhJ3MgY29tbWFuZCByZXN1bHQuICovXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBhcmdzOiBzdHJpbmdbXSA9IFtdLFxuICAgIG9wdGlvbnM6IEV4ZWN1dGVDb21tYW5kT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydGVkID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgY29kZSA9IG1vbnR5Q29kZShjb21tYW5kLCBhcmdzKTtcbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFpbGVkUmVzdWx0KFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdGFydGVkLFxuICAgICAgICBcIk1vbnR5IGZhbGxiYWNrIGFjY2VwdHMgUHl0aG9uIHNvdXJjZSBkaXJlY3RseSwgb3IgcHl0aG9uL3B5dGhvbjMgd2l0aCBhIHNpbmdsZSAtYyBzY3JpcHQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZW52ID8/IHt9KS5maWx0ZXIoXG4gICAgICAoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgaWYgKGVudmlyb25tZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmYWlsZWRSZXN1bHQoXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXJ0ZWQsXG4gICAgICAgIFwiTW9udHkgZmFsbGJhY2sgZG9lcyBub3QgZXhwb3NlIGhvc3QgZW52aXJvbm1lbnQgdmFyaWFibGVzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuY3dkKSB7XG4gICAgICByZXR1cm4gZmFpbGVkUmVzdWx0KFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdGFydGVkLFxuICAgICAgICBcIk1vbnR5IGZhbGxiYWNrIGRvZXMgbm90IGV4cG9zZSBhIGhvc3Qgd29ya2luZyBkaXJlY3RvcnkuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgb3B0aW9ucy5hYm9ydFNpZ25hbC5yZWFzb247XG5cbiAgICBhd2FpdCB0aGlzLnN0YXJ0KCk7XG4gICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/PyB0aGlzLmNvbW1hbmRUaW1lb3V0TXM7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IG1vbnR5UG9vbCgpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjaGVja291dFNlc3Npb24oXG4gICAgICBwb29sLFxuICAgICAge1xuICAgICAgICBsaW1pdHM6IHtcbiAgICAgICAgICBtYXhGZWVkRHVyYXRpb25TZWNzOiBNYXRoLm1heCgwLjAwMSwgdGltZW91dCAvIDFfMDAwKSxcbiAgICAgICAgICBtYXhNZW1vcnk6IHRoaXMubWF4TWVtb3J5Qnl0ZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVDaGVjazogdGhpcy50eXBlQ2hlY2ssXG4gICAgICB9LFxuICAgICAgb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICApO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSZXRhaW5lZE91dHB1dChvcHRpb25zKTtcbiAgICBjb25zdCB3b3JrZXJQaWQgPSBzZXNzaW9uLndvcmtlclBpZDtcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHRlcm1pbmF0ZVdvcmtlcih3b3JrZXJQaWQpO1xuICAgIH07XG4gICAgb3B0aW9ucy5hYm9ydFNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgb25BYm9ydCgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWJvcnRlZCkgdGhyb3cgYWJvcnRSZWFzb24ob3B0aW9ucy5hYm9ydFNpZ25hbCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHNlc3Npb24uZmVlZFJ1bihzdHJpcFB5dGhvbkZlbmNlKGNvZGUpLCB7XG4gICAgICAgIHByaW50Q2FsbGJhY2s6IChzdHJlYW0sIHRleHQpID0+IG91dHB1dC5lbWl0KHN0cmVhbSwgdGV4dCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJldHVybmVkID0gZm9ybWF0UmVzdWx0KHZhbHVlKTtcbiAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICBjb25zdCBzdWZmaXggPSByZXR1cm5lZC5lbmRzV2l0aChcIlxcblwiKSA/IHJldHVybmVkIDogYCR7cmV0dXJuZWR9XFxuYDtcbiAgICAgICAgb3V0cHV0LmVtaXQoXCJzdGRvdXRcIiwgc3VmZml4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFVzZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgc3Rkb3V0OiBvdXRwdXQuc3Rkb3V0LnZhbHVlLFxuICAgICAgICBzdGRlcnI6IG91dHB1dC5zdGRlcnIudmFsdWUsXG4gICAgICAgIGV4ZWN1dGlvblRpbWVNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoYWJvcnRlZCB8fCBvcHRpb25zLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IGFib3J0UmVhc29uKG9wdGlvbnMuYWJvcnRTaWduYWwpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICBvdXRwdXQuZW1pdChcInN0ZGVyclwiLCBvdXRwdXQuc3RkZXJyLnZhbHVlID8gYFxcbiR7bWVzc2FnZX1gIDogbWVzc2FnZSk7XG4gICAgICBjb25zdCB7IE1vbnR5Q3Jhc2hlZEVycm9yIH0gPSBhd2FpdCBtb250eU1vZHVsZSgpO1xuICAgICAgY29uc3QgdGltZWRPdXQgPSBjYXVnaHQgaW5zdGFuY2VvZiBNb250eUNyYXNoZWRFcnJvciAmJiBjYXVnaHQudGltZWRPdXQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXhpdENvZGU6IHRpbWVkT3V0ID8gLTEgOiAxLFxuICAgICAgICBzdGRvdXQ6IG91dHB1dC5zdGRvdXQudmFsdWUsXG4gICAgICAgIHN0ZGVycjogb3V0cHV0LnN0ZGVyci52YWx1ZSxcbiAgICAgICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gICAgICAgIC4uLih0aW1lZE91dCA/IHsgdGltZWRPdXQ6IHRydWUsIGtpbGxlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9wdGlvbnMuYWJvcnRTaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIGF3YWl0IHNlc3Npb24uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1JlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCI7XG4gIH1cblxuICBnZXRJbmZvKCk6IFNhbmRib3hJbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBwcm92aWRlcjogdGhpcy5wcm92aWRlcixcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgLi4uKHRoaXMubGFzdFVzZWRBdCA/IHsgbGFzdFVzZWRBdDogdGhpcy5sYXN0VXNlZEF0IH0gOiB7fSksXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYW5ndWFnZTogXCJweXRob25cIixcbiAgICAgICAgaG9zdEFjY2VzczogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXRJbnN0cnVjdGlvbnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJDb21tYW5kcyBydW4gYXMgUHl0aG9uIHNvdXJjZSBpbiB0aGUgUHlkYW50aWMgTW9udHkgZmFsbGJhY2suXCIsXG4gICAgICBcIlBhc3MgUHl0aG9uIGNvZGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gc2hlbGwgc3ludGF4LlwiLFxuICAgICAgXCJUaGVyZSBpcyBubyBob3N0IGZpbGVzeXN0ZW0sIG5ldHdvcmssIGVudmlyb25tZW50LCBzaGVsbCwgb3IgdGhpcmQtcGFydHkgcGFja2FnZSBhY2Nlc3MuXCIsXG4gICAgXS5qb2luKFwiIFwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb250eUNvZGUoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbW1hbmQ7XG4gIGlmICgoY29tbWFuZCA9PT0gXCJweXRob25cIiB8fCBjb21tYW5kID09PSBcInB5dGhvbjNcIikgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgYXJnc1swXSA9PT0gXCItY1wiKSB7XG4gICAgcmV0dXJuIGFyZ3NbMV07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RyaXBQeXRob25GZW5jZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gY29kZS50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gL15gYGAoPzpweXRob258cHkpP1xccypcXG4oW1xcc1xcU10qPylcXG5gYGAkL2kuZXhlYyh0cmltbWVkKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV0gPz8gY29kZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBcIlwiO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSA/PyBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZE91dHB1dCB7XG4gIHJlYWRvbmx5IHN0ZG91dDogUmV0YWluZWRUZXh0O1xuICByZWFkb25seSBzdGRlcnI6IFJldGFpbmVkVGV4dDtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uU3Rkb3V0OiBFeGVjdXRlQ29tbWFuZE9wdGlvbnNbXCJvblN0ZG91dFwiXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblN0ZGVycjogRXhlY3V0ZUNvbW1hbmRPcHRpb25zW1wib25TdGRlcnJcIl07XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXhlY3V0ZUNvbW1hbmRPcHRpb25zKSB7XG4gICAgdGhpcy5zdGRvdXQgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5zdGRlcnIgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5vblN0ZG91dCA9IG9wdGlvbnMub25TdGRvdXQ7XG4gICAgdGhpcy5vblN0ZGVyciA9IG9wdGlvbnMub25TdGRlcnI7XG4gIH1cblxuICBlbWl0KHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChzdHJlYW0gPT09IFwic3Rkb3V0XCIpIHtcbiAgICAgIHRoaXMub25TdGRvdXQ/Lih0ZXh0KTtcbiAgICAgIHRoaXMuc3Rkb3V0LmFwcGVuZCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblN0ZGVycj8uKHRleHQpO1xuICAgICAgdGhpcy5zdGRlcnIuYXBwZW5kKHRleHQpO1xuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhKCk6IFBpY2s8XG4gICAgQ29tbWFuZFJlc3VsdCxcbiAgICBcInN0ZG91dFRydW5jYXRlZFwiIHwgXCJzdGRlcnJUcnVuY2F0ZWRcIiB8IFwic3Rkb3V0RHJvcHBlZEJ5dGVzXCIgfCBcInN0ZGVyckRyb3BwZWRCeXRlc1wiXG4gID4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZG91dFRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZG91dERyb3BwZWRCeXRlczogdGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4odGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZGVyclRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZGVyckRyb3BwZWRCeXRlczogdGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZFRleHQge1xuICB2YWx1ZSA9IFwiXCI7XG4gIGRyb3BwZWRCeXRlcyA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgY29uc3RydWN0b3IobWF4Qnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gbWF4Qnl0ZXMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkICE9PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgJiZcbiAgICAgICghTnVtYmVyLmlzU2FmZUludGVnZXIocmVzb2x2ZWQpIHx8IHJlc29sdmVkIDwgMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtYXhSZXRhaW5lZEJ5dGVzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyIG9yIEluZmluaXR5XCIpO1xuICAgIH1cbiAgICB0aGlzLm1heEJ5dGVzID0gcmVzb2x2ZWQ7XG4gIH1cblxuICBhcHBlbmQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMubWF4Qnl0ZXMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb21iaW5lZCA9IHRoaXMuZW5jb2Rlci5lbmNvZGUodGhpcy52YWx1ZSArIHRleHQpO1xuICAgIGlmIChjb21iaW5lZC5sZW5ndGggPD0gdGhpcy5tYXhCeXRlcykge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSBjb21iaW5lZC5sZW5ndGggLSB0aGlzLm1heEJ5dGVzO1xuICAgIHdoaWxlIChzdGFydCA8IGNvbWJpbmVkLmxlbmd0aCAmJiAoY29tYmluZWRbc3RhcnRdISAmIDB4YzApID09PSAweDgwKSBzdGFydCsrO1xuICAgIGNvbnN0IHJldGFpbmVkID0gY29tYmluZWQuc3ViYXJyYXkoc3RhcnQpO1xuICAgIHRoaXMuZHJvcHBlZEJ5dGVzICs9IGNvbWJpbmVkLmxlbmd0aCAtIHJldGFpbmVkLmxlbmd0aDtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWNvZGVyLmRlY29kZShyZXRhaW5lZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVybWluYXRlV29ya2VyKHdvcmtlclBpZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICh3b3JrZXJQaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCh3b3JrZXJQaWQsIFwiU0lHS0lMTFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIGNvbW1hbmQgY2FuIGZpbmlzaCBiZXR3ZWVuIHRoZSBhYm9ydCBldmVudCBhbmQgdGhlIGtpbGwgcmVxdWVzdC5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja291dFNlc3Npb24oXG4gIHBvb2w6IE1vbnR5UG9vbCxcbiAgb3B0aW9uczogQ2hlY2tvdXRPcHRpb25zLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxNb250eVNlc3Npb24+IHtcbiAgY29uc3QgY2hlY2tvdXQgPSBwb29sLmNoZWNrb3V0KG9wdGlvbnMpO1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIGNoZWNrb3V0O1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB2b2lkIGNoZWNrb3V0LnRoZW4oKHNlc3Npb24pID0+IHNlc3Npb24uY2xvc2UoKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0aHJvdyBhYm9ydFJlYXNvbihzaWduYWwpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPE1vbnR5U2Vzc2lvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlamVjdChhYm9ydFJlYXNvbihzaWduYWwpKTtcbiAgICAgIHZvaWQgY2hlY2tvdXQudGhlbigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5jbG9zZSgpKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH07XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgY2hlY2tvdXQudGhlbihcbiAgICAgIChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHNlc3Npb24pO1xuICAgICAgfSxcbiAgICAgIChjYXVnaHQ6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChjYXVnaHQpO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWJvcnRSZWFzb24oc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICByZXR1cm4gc2lnbmFsPy5yZWFzb24gPz8gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBjb21tYW5kIHdhcyBhYm9ydGVkXCIsIFwiQWJvcnRFcnJvclwiKTtcbn1cblxuZnVuY3Rpb24gZmFpbGVkUmVzdWx0KFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBzdGFydGVkOiBudW1iZXIsXG4gIHN0ZGVycjogc3RyaW5nLFxuKTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGV4aXRDb2RlOiAxLFxuICAgIHN0ZG91dDogXCJcIixcbiAgICBzdGRlcnIsXG4gICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gIH07XG59XG4iXX0=
@@ -59,6 +59,7 @@ import { localFS } from "@dbx-tools/fs";
59
59
  import { find } from "@dbx-tools/path";
60
60
  import { asyncUtils, errorUtils, hash, json, log, net, object, stringUtils, } from "@dbx-tools/shared-core";
61
61
  import { ASSISTANT_SHARED_SKILLS_PATH, userAssistantSkillsPath } from "./skill-paths.js";
62
+ import { clearWorkspaceSkillCache } from "./skill-cache.js";
62
63
  const logger = log.logger("mastra/remote-skills");
63
64
  /**
64
65
  * Agent id the `skills` CLI installs a bare `SKILL.md` tree under.
@@ -262,6 +263,7 @@ export async function provisionRemoteSkills(option) {
262
263
  const localSkillPaths = [];
263
264
  const skillNames = [];
264
265
  let staging;
266
+ let workspaceUpdated = false;
265
267
  try {
266
268
  const sources = Array.isArray(options.sources) ? options.sources : [options.sources];
267
269
  for (const entry of sources) {
@@ -272,7 +274,8 @@ export async function provisionRemoteSkills(option) {
272
274
  // the source's own stable local dir.
273
275
  const key = cacheKey(sourceOptions);
274
276
  const cacheFS = destination ?? localSkillsFS(key);
275
- const cached = (await readMetadata(cacheFS))?.sources[key];
277
+ const metadata = await readMetadata(cacheFS);
278
+ const cached = metadata?.sources[key];
276
279
  if (cached && isFresh(cached, resolveRefreshTtl(sourceOptions, options))) {
277
280
  skillNames.push(...cached.skills);
278
281
  if (!destination)
@@ -303,10 +306,12 @@ export async function provisionRemoteSkills(option) {
303
306
  ...(policy ? { policy } : {}),
304
307
  };
305
308
  if (destination && databricksBasePath) {
309
+ await removeDeletedSkills(destination, key, metadata, record.skills);
306
310
  await copySkillDirs(destination, staged);
307
311
  // Only after the copy lands: a metadata entry written first would
308
312
  // mark a failed provision as fresh and suppress the retry for a day.
309
313
  await writeMetadata(destination, key, record);
314
+ workspaceUpdated = true;
310
315
  }
311
316
  else {
312
317
  localSkillPaths.push(await persistLocally(key, staged, record));
@@ -334,8 +339,27 @@ export async function provisionRemoteSkills(option) {
334
339
  await rm(staging.root, { recursive: true, force: true }).catch(() => undefined);
335
340
  }
336
341
  }
342
+ if (workspaceUpdated && client?.config?.getHost) {
343
+ await clearWorkspaceSkillCache({
344
+ host: (await client.config.getHost()).toString(),
345
+ });
346
+ }
337
347
  return { localSkillPaths, databricksBasePath, skillNames };
338
348
  }
349
+ /** Remove directories dropped by one source unless another source still owns them. */
350
+ async function removeDeletedSkills(destination, key, metadata, nextSkills) {
351
+ const previous = metadata?.sources[key]?.skills ?? [];
352
+ const retained = new Set(nextSkills);
353
+ for (const [sourceKey, entry] of Object.entries(metadata?.sources ?? {})) {
354
+ if (sourceKey === key)
355
+ continue;
356
+ for (const skill of entry.skills)
357
+ retained.add(skill);
358
+ }
359
+ await Promise.all(previous
360
+ .filter((skill) => !retained.has(skill))
361
+ .map((skill) => destination.rmdir(skill, { force: true, recursive: true })));
362
+ }
339
363
  /** Probe file {@link openWritableWorkspace} writes and removes. */
340
364
  const WRITE_PROBE_FILE = ".dbx-tools-write-probe";
341
365
  /**
@@ -612,4 +636,4 @@ async function pathExists(path) {
612
636
  return false;
613
637
  }
614
638
  }
615
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsVUFBVSxFQUNWLFVBQVUsRUFDVixJQUFJLEVBQ0osSUFBSSxFQUNKLEdBQUcsRUFDSCxHQUFHLEVBQ0gsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLHdCQUF3QixDQUFDO0FBSWhDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXpGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUVsRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUVyQywrRUFBK0U7QUFDL0UsTUFB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c0IsRUFDdEIsTUFBNkI7SUFFN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsZ0JBQWdCLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3JGLE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxNQUFNLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDOUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsbUNBQW1DO0FBQ25DLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNwQyxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFydHVwIHByb3Zpc2lvbmluZyBvZiByZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBmb3IgYSBNYXN0cmEgd29ya3NwYWNlLlxuICpcbiAqIEEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlfSBuYW1lcyBXSEVSRSBhIGBTS0lMTC5tZGAgdHJlZSBjb21lcyBmcm9tIC0gdGhlXG4gKiB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIEdpdEh1YiBgb3duZXIvcmVwb2AsIGFueSBnaXQgLyBHaXRMYWIgVVJMLFxuICogb3IgYSBkaXJlY3QgZG93bmxvYWQgVVJMIC0gYW5kIG9wdGlvbmFsIHBlci1zb3VyY2UgcG9saWN5LlxuICoge0BsaW5rIHByb3Zpc2lvblJlbW90ZVNraWxsc30gbWF0ZXJpYWxpemVzIGV2ZXJ5IHNvdXJjZSBpbnRvIGEgbG9jYWxcbiAqIGBTS0lMTC5tZGAgdHJlZSBhdCBhcHAgYm9vdCBhbmQgcmV0dXJucyB0aGUgZGlyZWN0b3JpZXMgdG8gaGFuZCBNYXN0cmEgYXNcbiAqIGV4dHJhIHNraWxsIHNjYW4gcGF0aHMuXG4gKlxuICogUmVzb2x1dGlvbiBwZXIgc291cmNlLCBpbiBvcmRlcjpcbiAqXG4gKiAxLiB0aGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBjb25zdGFudCAoYFwiYWl0b29sc1wiYCk6IERhdGFicmlja3MnIG93biBza2lsbFxuICogICAgc2V0LCByZWFkIHN0cmFpZ2h0IGZyb20gdGhlIHB1YmxpYyByZXBvIHRoZSBgZGF0YWJyaWNrcyBhaXRvb2xzYCBDTElcbiAqICAgIHNvdXJjZXMgZnJvbS4gTm8gQ0xJLCBubyBEYXRhYnJpY2tzIGF1dGggLSB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHVzYWJsZVxuICogICAgaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHAgY29udGFpbmVyLCB3aGVyZSB0aGUgQ0xJIGlzIG5vdCBpbnN0YWxsZWQ7XG4gKiAyLiB0aGUgT1BUSU9OQUwgYHNraWxsc2AgbnBtIENMSSAocGVlciBkZXApOiBpZiBpbnN0YWxsZWQsIGVhY2ggc291cmNlIGlzXG4gKiAgICBjb3BpZWQgaW50byBhIHN0YWdpbmcgZGlyIHdpdGggYHNraWxscyBhZGQgPHNvdXJjZT4gLS1hZ2VudCA8ZGlyPiAtLWNvcHlgLFxuICogICAgd2hpY2ggdW5kZXJzdGFuZHMgZXZlcnkgc291cmNlIGZvcm1hdCB0aGUgZWNvc3lzdGVtIGRvZXMgKEdpdEh1YlxuICogICAgc2hvcnRoYW5kLCBnaXQgVVJMcywgYXJjaGl2ZS9kb3dubG9hZCBVUkxzKTtcbiAqIDMuIG90aGVyd2lzZSBhIHBsYWluIHtAbGluayBmZXRjaH0gb2YgdGhlIHNvdXJjZSBVUkwgKGJ1aWx0IHdpdGhcbiAqICAgIHtAbGluayBuZXQudXJsQnVpbGRlcn0pLCB3cml0aW5nIHRoZSBkb3dubG9hZGVkIGBTS0lMTC5tZGAgdG8gYSBzdGFnaW5nXG4gKiAgICBkaXIuXG4gKlxuICogQSBzb3VyY2UgdGhhdCByZXNvbHZlcyB0aHJvdWdoIG5laXRoZXIgcGF0aCBmYWlscyBhcHAgc3RhcnR1cCwgdW5sZXNzIHRoZVxuICogc291cmNlIChvciB0aGUgdG9wLWxldmVsIGNhbGwpIHNldHMgYGZhaWxPbkVycm9yOiBmYWxzZWAsIGluIHdoaWNoIGNhc2UgaXQgaXNcbiAqIGxvZ2dlZCBhbmQgc2tpcHBlZCBzbyBvbmUgYmFkIHNvdXJjZSBuZXZlciB0YWtlcyB0aGUgYXBwIGRvd24uXG4gKlxuICogRXZlcnkgcHJvdmlzaW9uZWQgdHJlZSBjYXJyaWVzIGEge0BsaW5rIE1FVEFEQVRBX0ZJTEV9IHJlY29yZGluZyB3aGVuIGVhY2hcbiAqIHNvdXJjZSB3YXMgbGFzdCBkb3dubG9hZGVkLCBhbmQgYSBzb3VyY2UgaXMgb25seSByZS1kb3dubG9hZGVkIG9uY2UgdGhhdFxuICogcmVjb3JkIGlzIG9sZGVyIHRoYW4ge0BsaW5rIERFRkFVTFRfUkVGUkVTSF9UVExfTVN9IChzZXZlbiBkYXlzKS4gVGhpcyBydW5zIGF0IGFwcFxuICogQk9PVCwgc28gd2l0aG91dCBpdCBhIGNvbnRhaW5lciB0aGF0IHJlc3RhcnRzIGEgZG96ZW4gdGltZXMgYW4gaG91ciByZS1wdWxsc1xuICogdGhlIHdob2xlIEFJIFRvb2xzIHNldCBhIGRvemVuIHRpbWVzIGZvciBjb250ZW50IHRoYXQgY2hhbmdlcyByYXJlbHkuIFRoZVxuICogcmVjb3JkIHRyYXZlbHMgV0lUSCB0aGUgdHJlZSByYXRoZXIgdGhhbiBpbiBwcm9jZXNzIG1lbW9yeSwgc28gdGhlIHJldXNlXG4gKiBzdXJ2aXZlcyBhIHJlc3RhcnQgLSB3aGljaCBpcyB0aGUgb25seSB3YXkgaXQgaGVscHMgYSBEYXRhYnJpY2tzIEFwcCBhdCBhbGwuXG4gKiBQYXNzIGByZWZyZXNoVHRsTXM6IDBgIHRvIGRvd25sb2FkIG9uIGV2ZXJ5IGJvb3QuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gaXMgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIEFzc2lzdGFudCBza2lsbHMgdHJlZVxuICogKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCwgdGhlIHNhbWUgdHJlZSBhIFwic2F2ZSB0aGlzIGFzIGEgc2tpbGxcIlxuICogYWN0aW9uIHdyaXRlcyB0byksIHNvIHByb3Zpc2lvbmVkIHNraWxscyBwZXJzaXN0IGFjcm9zcyByZXN0YXJ0cyBhbmQgYXJlXG4gKiBkaXNjb3ZlcmVkIGJ5IHRoZSBidWlsdC1pbiBBc3Npc3RhbnQtc2tpbGxzIG1vdW50LiBQYXNzIGB1c2VyRW1haWxgIChvciBhblxuICogZXhwbGljaXQgYGRhdGFicmlja3NCYXNlUGF0aGApIHRvIHRhcmdldCBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgXG4gKiBpbnN0ZWFkLiBXaGVuIG5vIERhdGFicmlja3MgY2xpZW50IGlzIHJlc29sdmFibGUgYXQgc3RhcnR1cCAtIG9yIHRoZSByZXNvbHZlZFxuICogaWRlbnRpdHkgY2Fubm90IFdSSVRFIHRoZSBkZXN0aW5hdGlvbiwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlIGZvciBhXG4gKiBEYXRhYnJpY2tzIEFwcCBzZXJ2aWNlIHByaW5jaXBhbCBhZ2FpbnN0IHRoZSBhZG1pbi1vd25lZCBzaGFyZWQgdHJlZSAoc2VlXG4gKiB7QGxpbmsgb3BlbldyaXRhYmxlV29ya3NwYWNlfSkgLSB0aGUgdHJlZSBpcyB3cml0dGVuIHVuZGVyXG4gKiB7QGxpbmsgbG9jYWxGUy50bXBGU30gYW5kIHJldHVybmVkIGFzIGFuIGV4dHJhIGxvY2FsIHNraWxsIHBhdGggZm9yIHRoZVxuICogY3VycmVudCBwcm9jZXNzLiBTdG9yYWdlIGxvY2F0aW9uIGRlZ3JhZGVzOyB0aGUgc2tpbGxzIHRoZW1zZWx2ZXMgZG8gbm90LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzdGF0LCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcG9zaXggfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0sIHdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmltcG9ydCB7IGxvY2FsRlMsIHR5cGUgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGZpbmQgfSBmcm9tIFwiQGRieC10b29scy9wYXRoXCI7XG5pbXBvcnQge1xuICBhc3luY1V0aWxzLFxuICBlcnJvclV0aWxzLFxuICBoYXNoLFxuICBqc29uLFxuICBsb2csXG4gIG5ldCxcbiAgb2JqZWN0LFxuICBzdHJpbmdVdGlscyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgT25lT3JNYW55IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuXG5pbXBvcnQgeyBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRILCB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvcmVtb3RlLXNraWxsc1wiKTtcblxuLyoqXG4gKiBBZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuXG4gKlxuICogYHVuaXZlcnNhbGAgaXMgdGhlIENMSSdzIG93biBuYW1lIGZvciBcIm5vIHBhcnRpY3VsYXIgYWdlbnQsIGp1c3QgdGhlIHBsYWluXG4gKiB0cmVlXCIsIHdoaWNoIGlzIHdoYXQgdGhpcyBtb2R1bGUgd2FudHMgLSBpdCByZS1ob3N0cyB0aGUgcmVzdWx0IGl0c2VsZi4gVGhlXG4gKiBpZCBtdXN0IGJlIG9uZSB0aGUgaW5zdGFsbGVkIENMSSBrbm93czogYW4gdW5yZWNvZ25pemVkIG9uZSBpcyByZWplY3RlZFxuICogb3V0cmlnaHQgKGBJbnZhbGlkIGFnZW50czogLi4uYCksIHRha2luZyBldmVyeSBub24tYGFpdG9vbHNgIHNvdXJjZSBkb3duIHdpdGhcbiAqIGl0LCBzaW5jZSBhIENMSSBmYWlsdXJlIGlzIGEgaGFyZCBmYWlsdXJlIHJhdGhlciB0aGFuIGEgZmFsbC10aHJvdWdoIHRvXG4gKiB7QGxpbmsgc3RhZ2VWaWFGZXRjaH0uXG4gKi9cbmNvbnN0IFNLSUxMU19DTElfQUdFTlQgPSBcInVuaXZlcnNhbFwiO1xuXG4vKiogV2hlcmUgdGhlIGBza2lsbHNgIENMSSBkcm9wcyBhIHBsYWluIGBTS0lMTC5tZGAgdHJlZSB1bmRlciBhIHRhcmdldCBkaXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0xBWU9VVCA9IFtcIi5hZ2VudHNcIiwgXCJza2lsbHNcIl0gYXMgY29uc3Q7XG5cbi8qKiBDYXAgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgYm9keSwgbWF0Y2hpbmcgdGhlIGBza2lsbHNgIENMSSBkZWZhdWx0LiAqL1xuY29uc3QgREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogTWF4aW11bSB0aW1lIG9uZSByZW1vdGUgZmlsZSBkb3dubG9hZCBtYXkgYmxvY2sgc3RhcnR1cC4gKi9cbmNvbnN0IERFRkFVTFRfRE9XTkxPQURfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIFN0YWJsZSB0ZW1wIGRpcmVjdG9yeSBob2xkaW5nIG9uZSByZWJ1aWx0IHNraWxsIHRyZWUgcGVyIHJlbW90ZSBzb3VyY2UuICovXG5jb25zdCBMT0NBTF9TS0lMTFNfRElSID0gXCJtYXN0cmEtbG9jYWwtc2tpbGxzXCI7XG5cbi8qKlxuICogQm9va2tlZXBpbmcgZmlsZSB3cml0dGVuIGF0IHRoZSByb290IG9mIGV2ZXJ5IHByb3Zpc2lvbmVkIHNraWxsIHRyZWUsIG5hbWluZ1xuICogd2hlbiBlYWNoIHNvdXJjZSB3YXMgbGFzdCBkb3dubG9hZGVkLiBBIGRvdGZpbGUgc28gdGhlIHNraWxsIHNjYW5uZXJzLCB3aGljaFxuICogbG9vayBmb3IgYDxkaXI+L1NLSUxMLm1kYCwgbmV2ZXIgbWlzdGFrZSBpdCBmb3IgYSBza2lsbC5cbiAqL1xuY29uc3QgTUVUQURBVEFfRklMRSA9IFwiLm1ldGFkYXRhLmpzb25cIjtcblxuLyoqIFNoYXBlIG1hcmtlciBmb3Ige0BsaW5rIE1FVEFEQVRBX0ZJTEV9OyBhbiB1bmtub3duIHZlcnNpb24gaXMgaWdub3JlZCwgbm90IHJlYWQuICovXG5jb25zdCBNRVRBREFUQV9WRVJTSU9OID0gMTtcblxuLyoqIEhvdyBsb25nIGEgcHJvdmlzaW9uZWQgc291cmNlIGlzIHJldXNlZCBiZWZvcmUgYmVpbmcgZG93bmxvYWRlZCBhZ2Fpbi4gKi9cbmNvbnN0IERFRkFVTFRfUkVGUkVTSF9UVExfTVMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFJIFRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFNvdXJjZSBjb25zdGFudCBzZWxlY3RpbmcgRGF0YWJyaWNrcycgb3duIEFJIFRvb2xzIHNraWxsIHNldC5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFzdHJhKHsgcmVtb3RlU2tpbGxzOiBcImFpdG9vbHNcIiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IEFJVE9PTFNfU09VUkNFID0gXCJhaXRvb2xzXCI7XG5cbi8qKiBUaGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBsaXRlcmFsLCBmb3IgY2FsbGVycyBzcGVsbGluZyB0aGUgdW5pb24gb3V0LiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sc1NvdXJjZSA9IHR5cGVvZiBBSVRPT0xTX1NPVVJDRTtcblxuLyoqXG4gKiBUaGUgUFVCTElDIHJlcG8gYGRhdGFicmlja3MgYWl0b29scyBpbnN0YWxsYCBzb3VyY2VzIGZyb20uIFJlYWRpbmcgaXRcbiAqIGRpcmVjdGx5IGlzIHdoYXQgbGV0cyBhbiBhcHAgZ2V0IHRoZSBzYW1lIHNraWxscyB0aGUgQ0xJIGluc3RhbGxzIHdpdGhvdXRcbiAqIHRoZSBDTEkgLSB3aGljaCBhIERhdGFicmlja3MgQXBwIGNvbnRhaW5lciBkb2VzIG5vdCBzaGlwLlxuICovXG5jb25zdCBBSVRPT0xTX1JFUE8gPSBcImRhdGFicmlja3MvZGF0YWJyaWNrcy1hZ2VudC1za2lsbHNcIjtcblxuLyoqIFJlcG8gcmVmIHRoZSBza2lsbHMgYXJlIHJlYWQgZnJvbS4gT3ZlcnJpZGUgcGVyIHNvdXJjZSB3aXRoIGByZWZgLiAqL1xuY29uc3QgQUlUT09MU19SRUYgPSBcIm1haW5cIjtcblxuLyoqIFNraWxsIGZpbGVzIGRvd25sb2FkZWQgYXQgb25jZTsgdGhlIHNldCBpcyB+MzAgc2tpbGxzIG9mIGEgZmV3IGZpbGVzIGVhY2guICovXG5jb25zdCBBSVRPT0xTX0NPTkNVUlJFTkNZID0gODtcblxuLyoqIFRoZSBzdWJzZXQgb2YgdGhlIHJlcG8ncyBnZW5lcmF0ZWQgYG1hbmlmZXN0Lmpzb25gIHRoaXMgbW9kdWxlIHJlYWRzLiAqL1xuaW50ZXJmYWNlIEFpVG9vbHNNYW5pZmVzdCB7XG4gIHNraWxscz86IFJlY29yZDxzdHJpbmcsIHsgZmlsZXM/OiBzdHJpbmdbXTsgcmVwb19kaXI/OiBzdHJpbmcgfT47XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHJlbW90ZSBza2lsbCBzb3VyY2UgYW5kIGl0cyBwZXItc291cmNlIHBvbGljeS5cbiAqXG4gKiBgc291cmNlYCBpcyB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IG9yIGFueXRoaW5nIHRoZSBgc2tpbGxzYCBlY29zeXN0ZW1cbiAqIHVuZGVyc3RhbmRzOiBhIEdpdEh1YiBgb3duZXIvcmVwb2Agc2hvcnRoYW5kLCBhIGZ1bGwgR2l0SHViIC8gR2l0TGFiIC8gZ2l0XG4gKiBVUkwsIG9yIGEgZGlyZWN0IGRvd25sb2FkIFVSTCB0byBhIGBTS0lMTC5tZGAgb3IgYXJjaGl2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMge1xuICAvKiogYFwiYWl0b29sc1wiYCwgYSBHaXRIdWIgc2hvcnRoYW5kLCBhIGdpdCAvIEdpdExhYiBVUkwsIG9yIGEgZG93bmxvYWQgVVJMLiAqL1xuICBzb3VyY2U6IG5ldC5VcmxMaWtlIHwgQWlUb29sc1NvdXJjZTtcbiAgLyoqIEluc3RhbGwgb25seSB0aGVzZSBza2lsbCBuYW1lcyBmcm9tIHRoZSBzb3VyY2UuICovXG4gIHNraWxscz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKiogSW5jbHVkZSBleHBlcmltZW50YWwgc2tpbGxzLiBgXCJhaXRvb2xzXCJgIG9ubHkuICovXG4gIGV4cGVyaW1lbnRhbD86IGJvb2xlYW47XG4gIC8qKiBQaW4gdGhlIHJlcG8gcmVmICh0YWcgLyBicmFuY2ggLyBzaGEpLiBgXCJhaXRvb2xzXCJgIG9ubHk7IGRlZmF1bHRzIHRvIGBtYWluYC4gKi9cbiAgcmVmPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgdGhlIGJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZCBmb3IgdGhpcyBzb3VyY2UuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGlzIHNvdXJjZSdzIHByb3Zpc2lvbmVkIHRyZWUgaXMgcmV1c2VkIGJlZm9yZSBpdCBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsXG4gICAqIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLnJlZnJlc2hUdGxNc307IGAwYCByZS1kb3dubG9hZHMgb25cbiAgICogZXZlcnkgYm9vdC5cbiAgICovXG4gIHJlZnJlc2hUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gYGZhbHNlYCwgYSBzb3VyY2UgdGhhdCBmYWlscyB0byByZXNvbHZlIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZCBpbnN0ZWFkXG4gICAqIG9mIGZhaWxpbmcgYXBwIHN0YXJ0dXAuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLmZhaWxPbkVycm9yfS5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJlbW90ZSBza2lsbCBzb3VyY2U6IHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIFVSTC1saWtlXG4gKiAoc3RyaW5nIC8gYFVSTGAgLyBgeyB1cmwgfWApLCBvciBhIHtAbGluayBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnN9IGJhZyB3aXRoXG4gKiBwZXItc291cmNlIHBvbGljeS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVtb3RlU2tpbGxTb3VyY2UgPSBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2UgfCBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnM7XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZSBgcmVtb3RlU2tpbGxzYCBvcHRpb246IG9uZSBzb3VyY2UsIGEgbm9uLWVtcHR5IGxpc3Qgb2YgdGhlbSwgb3JcbiAqIGEge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnN9IGJhZyB3aGVuIHRvcC1sZXZlbCBwb2xpY3kgaXMgbmVlZGVkLlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbHNPcHRpb24gPVxuICBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT4gfCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zO1xuXG4vKiogQSBzb3VyY2UgZW50cnkgd2l0aCBpdHMgYHNvdXJjZWAgZmxhdHRlbmVkIHRvIGEgcGxhaW4gc3RyaW5nLiAqL1xudHlwZSBOb3JtYWxpemVkU291cmNlID0gT21pdDxSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsIFwic291cmNlXCI+ICYgeyBzb3VyY2U6IHN0cmluZyB9O1xuXG4vKiogVG9wLWxldmVsIHJlbW90ZS1za2lsbHMgcHJvdmlzaW9uaW5nIG9wdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICAvKiogU291cmNlcyB0byBtYXRlcmlhbGl6ZSBhdCBzdGFydHVwLiAqL1xuICBzb3VyY2VzOiBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT47XG4gIC8qKlxuICAgKiBGYWlsIGFwcCBzdGFydHVwIHdoZW4gYSBzb3VyY2UgY2FuJ3QgYmUgcmVzb2x2ZWQuIERlZmF1bHRzIHRvIGB0cnVlYC4gQVxuICAgKiBwZXItc291cmNlIGBmYWlsT25FcnJvcmAgd2lucyBvdmVyIHRoaXMuXG4gICAqL1xuICBmYWlsT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIHBhdGggdGhhdCByb290cyB0aGUgZGVzdGluYXRpb24gQXNzaXN0YW50IHNraWxscyB0cmVlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgT0JPIHVzZXIncyBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgLlxuICAgKi9cbiAgZGF0YWJyaWNrc0Jhc2VQYXRoPzogc3RyaW5nO1xuICAvKiogQXV0aC1zY29wZWQgRGF0YWJyaWNrcyBjbGllbnQuIERlZmF1bHRzIHRvIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIC8qKiBVc2VyIGVtYWlsIHVzZWQgdG8gZGVyaXZlIHRoZSBkZWZhdWx0IERhdGFicmlja3MgZGVzdGluYXRpb24uICovXG4gIHVzZXJFbWFpbD86IHN0cmluZztcbiAgLyoqIEJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZC4gRGVmYXVsdHMgdG8gMTAgTWlCLiAqL1xuICBtYXhEb3dubG9hZEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogSG93IGxvbmcgYSBwcm92aXNpb25lZCB0cmVlIGlzIHJldXNlZCBiZWZvcmUgaXRzIHNvdXJjZSBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIHNldmVuIGRheXM7IGAwYCByZS1kb3dubG9hZHMgb24gZXZlcnlcbiAgICogYm9vdC4gQSBwZXItc291cmNlIGByZWZyZXNoVHRsTXNgIHdpbnMgb3ZlciB0aGlzLlxuICAgKi9cbiAgcmVmcmVzaFR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSByZXNvbHZlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMge1xuICAvKipcbiAgICogRXh0cmEgTE9DQUwgc2tpbGwgc2NhbiBwYXRocyB0byBoYW5kIE1hc3RyYSAoYSB0ZW1wIGRpciBwZXIgc291cmNlIHRoYXRcbiAgICogY291bGRuJ3QgYmUgd3JpdHRlbiB0byBEYXRhYnJpY2tzKS4gRW1wdHkgd2hlbiBldmVyeXRoaW5nIGxhbmRlZCBpbiB0aGVcbiAgICogRGF0YWJyaWNrcyBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluIG1vdW50IGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbiBlYWNoIHNvdXJjZSB3YXMgd3JpdHRlbiB0bywgaWYgYW55LiAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lcyBvZiBldmVyeSBza2lsbCBkaXJlY3Rvcnkgbm93IGF2YWlsYWJsZSwgd2hldGhlciBpdCB3YXMgZG93bmxvYWRlZCBvblxuICAgKiB0aGlzIGJvb3Qgb3IgcmV1c2VkIGZyb20gYSBzdGlsbC1mcmVzaCB0cmVlIChzZWUge0BsaW5rIE1FVEFEQVRBX0ZJTEV9KS5cbiAgICovXG4gIHNraWxsTmFtZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoYXQgb25lIHNvdXJjZSdzIGxhc3QgZG93bmxvYWQgbGVmdCBiZWhpbmQsIGFzIHJlY29yZGVkIGluXG4gKiB7QGxpbmsgTUVUQURBVEFfRklMRX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxDYWNoZUVudHJ5IHtcbiAgLyoqIFRoZSBzb3VyY2Ugc3RyaW5nIHRoaXMgZW50cnkgd2FzIGRvd25sb2FkZWQgZnJvbSwgZm9yIHJlYWRhYmlsaXR5LiAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgLyoqIFdoZW4gdGhlIGRvd25sb2FkIGNvbXBsZXRlZCwgSVNPLTg2MDEuICovXG4gIGRvd25sb2FkZWRBdDogc3RyaW5nO1xuICAvKiogU2tpbGwgZGlyZWN0b3J5IG5hbWVzIHRoZSBkb3dubG9hZCBwcm9kdWNlZC4gKi9cbiAgc2tpbGxzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50LWFmZmVjdGluZyBwb2xpY3kgdGhhdCBkb3dubG9hZCB1c2VkLiBBbHNvIGZvbGRlZCBpbnRvIHRoZSBlbnRyeVxuICAgKiBLRVksIHNvIG5hcnJvd2luZyBgc2tpbGxzYCBvciBtb3ZpbmcgYHJlZmAgbWlzc2VzIHRoZSBjYWNoZSBpbnN0ZWFkIG9mXG4gICAqIHNpbGVudGx5IHNlcnZpbmcgdGhlIHByZXZpb3VzIHNlbGVjdGlvbi5cbiAgICovXG4gIHBvbGljeT86IHsgc2tpbGxzPzogc3RyaW5nW107IGV4cGVyaW1lbnRhbD86IGJvb2xlYW47IHJlZj86IHN0cmluZyB9O1xufVxuXG4vKiogVGhlIHtAbGluayBNRVRBREFUQV9GSUxFfSBkb2N1bWVudDogb25lIGVudHJ5IHBlciBwcm92aXNpb25lZCBzb3VyY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsc01ldGFkYXRhIHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBSZW1vdGVTa2lsbENhY2hlRW50cnk+O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogTm9ybWFsaXplIHRoZSBgcmVtb3RlU2tpbGxzYCBvcHRpb24gaW50byBhIGZsYXQgb3B0aW9ucyBiYWcuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKFxuICBvcHRpb246IFJlbW90ZVNraWxsc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJhZyA9IGlzUHJvdmlzaW9uT3B0aW9ucyhvcHRpb24pID8gb3B0aW9uIDogdW5kZWZpbmVkO1xuICBjb25zdCBzb3VyY2VzID0gdG9Tb3VyY2VMaXN0KGJhZyA/IGJhZy5zb3VyY2VzIDogKG9wdGlvbiBhcyBSZW1vdGVTa2lsbFNvdXJjZSkpO1xuICAvLyBBbiBlbXB0eSBsaXN0IGlzIHRoZSBzYW1lIGFzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsLlxuICBpZiAoIW9iamVjdC5pc09uZU9yTWFueShzb3VyY2VzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgLi4uYmFnLCBzb3VyY2VzIH07XG59XG5cbi8qKiBBIGBzb3VyY2VzYC1iZWFyaW5nIGJhZyBpcyB0aGUgdG9wLWxldmVsIG9wdGlvbnMgc2hhcGUsIG5vdCBhIHNpbmdsZSBzb3VyY2UuICovXG5mdW5jdGlvbiBpc1Byb3Zpc2lvbk9wdGlvbnModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHtcbiAgcmV0dXJuIG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgJiYgXCJzb3VyY2VzXCIgaW4gdmFsdWU7XG59XG5cbi8qKiBPbmUgc291cmNlIG9yIG1hbnksIGFzIGEgcGxhaW4gYXJyYXkuIEEgc291cmNlIGlzIG5ldmVyIGl0c2VsZiBhbiBhcnJheS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlTGlzdChcbiAgaW5wdXQ6IFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPixcbik6IFJlbW90ZVNraWxsU291cmNlW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBbLi4uaW5wdXRdIDogW2lucHV0XTtcbn1cblxuLyoqIEZsYXR0ZW4gYSBzb3VyY2UgZW50cnkgLSBzdHJpbmcsIGBVUkxgLCBgeyB1cmwgfWAsIG9yIG9wdGlvbnMgYmFnIC0gdG8gYSB7QGxpbmsgTm9ybWFsaXplZFNvdXJjZX0uICovXG5mdW5jdGlvbiB0b1NvdXJjZU9wdGlvbnMoc291cmNlOiBSZW1vdGVTa2lsbFNvdXJjZSk6IE5vcm1hbGl6ZWRTb3VyY2Uge1xuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHsgc291cmNlIH07XG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBVUkwpIHJldHVybiB7IHNvdXJjZTogc291cmNlLnRvU3RyaW5nKCkgfTtcbiAgaWYgKFwic291cmNlXCIgaW4gc291cmNlKSByZXR1cm4geyAuLi5zb3VyY2UsIHNvdXJjZTogdG9Tb3VyY2VTdHJpbmcoc291cmNlLnNvdXJjZSkgfTtcbiAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UudXJsIH07XG59XG5cbi8qKiBBIHtAbGluayBuZXQuVXJsTGlrZX0gYXMgdGhlIHBsYWluIHN0cmluZyB0aGUgc3RhZ2luZyBwYXRocyB3b3JrIHdpdGguICovXG5mdW5jdGlvbiB0b1NvdXJjZVN0cmluZyhzb3VyY2U6IG5ldC5VcmxMaWtlKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBzb3VyY2U7XG4gIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBVUkwgPyBzb3VyY2UudG9TdHJpbmcoKSA6IHNvdXJjZS51cmw7XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBzb3VyY2Ugc2VsZWN0cyB0aGUgYnVpbHQtaW4gRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbCBzZXQuICovXG5mdW5jdGlvbiBpc0FpVG9vbHNTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNvdXJjZS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gQUlUT09MU19TT1VSQ0U7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhY2hlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHBvbGljeSB0aGF0IGRlY2lkZXMgd2hhdCBhIHNvdXJjZSdzIGRvd25sb2FkIENPTlRBSU5TLlxuICpcbiAqIE9ubHkgdGhlc2UgdGhyZWUgY2hhbmdlIHRoZSByZXN1bHRpbmcgdHJlZSwgc28gb25seSB0aGVzZSBiZWxvbmcgaW4gdGhlIGNhY2hlXG4gKiBrZXkgLSBgZmFpbE9uRXJyb3JgIGFuZCBgbWF4RG93bmxvYWRCeXRlc2AgZ292ZXJuIGhvdyBhIGZhaWx1cmUgaXMgaGFuZGxlZCxcbiAqIG5vdCB3aGF0IGEgc3VjY2VzcyBwcm9kdWNlcy5cbiAqL1xuZnVuY3Rpb24gY2FjaGVQb2xpY3koc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeVtcInBvbGljeVwiXSB7XG4gIGNvbnN0IHNraWxscyA9IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscyk7XG4gIGNvbnN0IHBvbGljeSA9IHtcbiAgICAuLi4oc2tpbGxzLmxlbmd0aCA+IDAgPyB7IHNraWxsczogWy4uLnNraWxsc10uc29ydCgpIH0gOiB7fSksXG4gICAgLi4uKHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlID8geyBleHBlcmltZW50YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPyB7IHJlZjogc291cmNlT3B0aW9ucy5yZWYhLnRyaW0oKSB9IDoge30pLFxuICB9O1xuICByZXR1cm4gT2JqZWN0LmtleXMocG9saWN5KS5sZW5ndGggPiAwID8gcG9saWN5IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YWJsZSBpZGVudGl0eSBvZiBhIHNvdXJjZSBBTkQgaXRzIGNvbnRlbnQtYWZmZWN0aW5nIHBvbGljeS5cbiAqXG4gKiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbG9uZSB3b3VsZCBsZXQgYSBjaGFuZ2VkIGBza2lsbHNgIGZpbHRlciBvciBgcmVmYCByZWFkXG4gKiBiYWNrIHRoZSBwcmV2aW91cyBkb3dubG9hZCBmb3IgYSBkYXk7IGtleWluZyBvbiBib3RoIHR1cm5zIHRoYXQgaW50byBhIG1pc3MuXG4gKiBUaGUgc2tpbGwgbGlzdCBpcyBzb3J0ZWQgZmlyc3Qgc28gYSByZW9yZGVyZWQgYXJyYXkgaXMgc3RpbGwgdGhlIHNhbWUga2V5LlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc2guZm52SGFzaChcbiAgICBKU09OLnN0cmluZ2lmeSh7IHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsIHBvbGljeTogY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucykgPz8gbnVsbCB9KSxcbiAgKTtcbn1cblxuLyoqIFRoZSBlZmZlY3RpdmUgcmV1c2Ugd2luZG93OiBwZXItc291cmNlLCB0aGVuIHRvcC1sZXZlbCwgdGhlbiBzZXZlbiBkYXlzLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlZnJlc2hUdGwoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBudW1iZXIge1xuICByZXR1cm4gc291cmNlT3B0aW9ucy5yZWZyZXNoVHRsTXMgPz8gb3B0aW9ucy5yZWZyZXNoVHRsTXMgPz8gREVGQVVMVF9SRUZSRVNIX1RUTF9NUztcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBtZXRhZGF0YSBkb2N1bWVudCBhdCB0aGUgcm9vdCBvZiBhIHByb3Zpc2lvbmVkIHRyZWUsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIHRoZXJlIGlzIG5vbmUsIGl0IGlzIHVucmVhZGFibGUsIG9yIGl0IHdhcyB3cml0dGVuIGJ5IGEgc2hhcGUgdGhpc1xuICogdmVyc2lvbiBkb2VzIG5vdCBrbm93LlxuICpcbiAqIE5ldmVyIHRocm93czogYSBtaXNzaW5nIG9yIGNvcnJ1cHQgcmVjb3JkIGlzIGEgY2FjaGUgTUlTUywgd2hpY2ggY29zdHMgYVxuICogZG93bmxvYWQgLSB3aGlsZSBsZXR0aW5nIGl0IGZhaWwgd291bGQgdGFrZSBhcHAgc3RhcnR1cCBkb3duIG92ZXJcbiAqIGJvb2trZWVwaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTWV0YWRhdGEoZnM6IEZpbGVTeXN0ZW0pOiBQcm9taXNlPFJlbW90ZVNraWxsc01ldGFkYXRhIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKE1FVEFEQVRBX0ZJTEUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShNRVRBREFUQV9GSUxFLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KTtcbiAgICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlKHJhdywgdW5kZWZpbmVkKSBhcyBSZW1vdGVTa2lsbHNNZXRhZGF0YSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChwYXJzZWQpIHx8IHBhcnNlZC52ZXJzaW9uICE9PSBNRVRBREFUQV9WRVJTSU9OKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBvYmplY3QuaXNSZWNvcmQocGFyc2VkLnNvdXJjZXMpID8gcGFyc2VkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjYWNoZTp1bnJlYWRhYmxlXCIsIHsgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gZW50cnkgaXMgc3RpbGwgaW5zaWRlIGl0cyByZXVzZSB3aW5kb3cuXG4gKlxuICogQSBgdHRsTXNgIG9mIGAwYCBkaXNhYmxlcyByZXVzZSBvdXRyaWdodCwgYW5kIGFuIHVucGFyc2VhYmxlIG9yIEZVVFVSRVxuICogdGltZXN0YW1wIGNvdW50cyBhcyBzdGFsZSAtIGEgY2xvY2sgdGhhdCBtb3ZlZCBiYWNrd2FyZHMgc2hvdWxkIGNvc3Qgb25lXG4gKiBleHRyYSBkb3dubG9hZCwgbm90IHBpbiBhIHRyZWUgYXMgZnJlc2ggaW5kZWZpbml0ZWx5LlxuICovXG5mdW5jdGlvbiBpc0ZyZXNoKGVudHJ5OiBSZW1vdGVTa2lsbENhY2hlRW50cnksIHR0bE1zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKHR0bE1zIDw9IDAgfHwgIUFycmF5LmlzQXJyYXkoZW50cnkuc2tpbGxzKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkb3dubG9hZGVkQXQgPSBvYmplY3QudG9EYXRlKGVudHJ5LmRvd25sb2FkZWRBdCk7XG4gIGlmICghZG93bmxvYWRlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBkb3dubG9hZGVkQXQuZ2V0VGltZSgpO1xuICByZXR1cm4gYWdlID49IDAgJiYgYWdlIDwgdHRsTXM7XG59XG5cbi8qKlxuICogTWVyZ2Ugb25lIHNvdXJjZSdzIGVudHJ5IGludG8gdGhlIHRyZWUncyBtZXRhZGF0YSBkb2N1bWVudCwgcHJlc2VydmluZyB3aGF0XG4gKiBvdGhlciBzb3VyY2VzIHJlY29yZGVkIC0gdGhlIERhdGFicmlja3MgZGVzdGluYXRpb24gaXMgU0hBUkVELCBzbyBhIGJsaW5kXG4gKiBvdmVyd3JpdGUgd291bGQgZHJvcCBldmVyeSBzaWJsaW5nIHNvdXJjZSdzIHRpbWVzdGFtcCBhbmQgcmUtZG93bmxvYWQgdGhlXG4gKiBsb3Qgb24gdGhlIG5leHQgYm9vdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVNZXRhZGF0YShcbiAgZnM6IEZpbGVTeXN0ZW0sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyeTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCByZWFkTWV0YWRhdGEoZnMpO1xuICBjb25zdCBuZXh0OiBSZW1vdGVTa2lsbHNNZXRhZGF0YSA9IHtcbiAgICB2ZXJzaW9uOiBNRVRBREFUQV9WRVJTSU9OLFxuICAgIHNvdXJjZXM6IHsgLi4uY3VycmVudD8uc291cmNlcywgW2tleV06IGVudHJ5IH0sXG4gIH07XG4gIGF3YWl0IGZzLndyaXRlRmlsZShNRVRBREFUQV9GSUxFLCBgJHtKU09OLnN0cmluZ2lmeShuZXh0LCBudWxsLCAyKX1cXG5gLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbn1cblxuLyoqIFRoZSBzdGFibGUgbG9jYWwgdHJlZSBhIHNvdXJjZSBpcyByZWJ1aWx0IGludG8sIGtleWVkIGJ5IHtAbGluayBjYWNoZUtleX0uICovXG5mdW5jdGlvbiBsb2NhbFNraWxsc0ZTKGtleTogc3RyaW5nKTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgcmV0dXJuIGxvY2FsRlMudG1wRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCk7XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemUgZXZlcnkgY29uZmlndXJlZCByZW1vdGUgc2tpbGwgc291cmNlIGF0IGFwcCBzdGFydHVwLlxuICpcbiAqIFdyaXRlcyBlYWNoIHJlc29sdmVkIGBTS0lMTC5tZGAgdHJlZSB0byB0aGUgRGF0YWJyaWNrcyB1c2VyIEFzc2lzdGFudCBza2lsbHNcbiAqIGZvbGRlciB3aGVuIGEgd3JpdGFibGUgd29ya3NwYWNlIGlzIGF2YWlsYWJsZSwgZWxzZSB1bmRlclxuICoge0BsaW5rIGxvY2FsRlMudG1wRlN9IHJldHVybmVkIGluIHtAbGluayBQcm92aXNpb25lZFJlbW90ZVNraWxscy5sb2NhbFNraWxsUGF0aHN9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlzaW9uUmVtb3RlU2tpbGxzKFxuICBvcHRpb246IFJlbW90ZVNraWxsc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8UHJvdmlzaW9uZWRSZW1vdGVTa2lsbHM+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IG5vcm1hbGl6ZVJlbW90ZVNraWxsc09wdGlvbihvcHRpb24pO1xuICBjb25zdCBlbXB0eTogUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMgPSB7IGxvY2FsU2tpbGxQYXRoczogW10sIHNraWxsTmFtZXM6IFtdIH07XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIGVtcHR5O1xuXG4gIGNvbnN0IGZhaWxEZWZhdWx0ID0gb3B0aW9ucy5mYWlsT25FcnJvciAhPT0gZmFsc2U7XG4gIGNvbnN0IGNsaWVudCA9IG9wdGlvbnMuY2xpZW50ID8/IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAgLy8gUHJvYmVkIHJhdGhlciB0aGFuIGFzc3VtZWQ6IGFuIGlkZW50aXR5IHRoYXQgY2Fubm90IHdyaXRlIHRoZSB3b3Jrc3BhY2VcbiAgLy8gdHJlZSBmYWxscyBiYWNrIHRvIHRoZSBsb2NhbCBvbmUgaW5zdGVhZCBvZiBmYWlsaW5nIHN0YXJ0dXAuIFRoZSBwcm9iZSBhbHNvXG4gIC8vIGNyZWF0ZXMgdGhlIHJvb3QsIHdoaWNoIHRoZSBmaXJzdCBjYWNoZSBSRUFEIG5lZWRzIC0gYGNvcHlTa2lsbERpcnNgIHdvdWxkXG4gIC8vIG90aGVyd2lzZSBiZSB0aGUgZmlyc3QgdGhpbmcgdG8gY3JlYXRlIGl0LCB3aGljaCBpcyB0b28gbGF0ZS5cbiAgY29uc3QgcmVxdWVzdGVkQmFzZVBhdGggPSByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKG9wdGlvbnMsIGNsaWVudCk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gcmVxdWVzdGVkQmFzZVBhdGhcbiAgICA/IGF3YWl0IG9wZW5Xcml0YWJsZVdvcmtzcGFjZShyZXF1ZXN0ZWRCYXNlUGF0aCwgY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudClcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZGF0YWJyaWNrc0Jhc2VQYXRoID0gZGVzdGluYXRpb24gPyByZXF1ZXN0ZWRCYXNlUGF0aCA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraWxsTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBzdGFnaW5nOiBMb2NhbEZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnNvdXJjZXMpID8gb3B0aW9ucy5zb3VyY2VzIDogW29wdGlvbnMuc291cmNlc107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3VyY2VzKSB7XG4gICAgICBjb25zdCBzb3VyY2VPcHRpb25zID0gdG9Tb3VyY2VPcHRpb25zKGVudHJ5KTtcbiAgICAgIGNvbnN0IGZhaWxPbkVycm9yID0gc291cmNlT3B0aW9ucy5mYWlsT25FcnJvciA/PyBmYWlsRGVmYXVsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFdoZXJlIHRoaXMgc291cmNlJ3MgYm9va2tlZXBpbmcgbGl2ZXM6IHRoZSBzaGFyZWQgRGF0YWJyaWNrcyB0cmVlLCBvclxuICAgICAgICAvLyB0aGUgc291cmNlJ3Mgb3duIHN0YWJsZSBsb2NhbCBkaXIuXG4gICAgICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHNvdXJjZU9wdGlvbnMpO1xuICAgICAgICBjb25zdCBjYWNoZUZTID0gZGVzdGluYXRpb24gPz8gbG9jYWxTa2lsbHNGUyhrZXkpO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSAoYXdhaXQgcmVhZE1ldGFkYXRhKGNhY2hlRlMpKT8uc291cmNlc1trZXldO1xuICAgICAgICBpZiAoY2FjaGVkICYmIGlzRnJlc2goY2FjaGVkLCByZXNvbHZlUmVmcmVzaFR0bChzb3VyY2VPcHRpb25zLCBvcHRpb25zKSkpIHtcbiAgICAgICAgICBza2lsbE5hbWVzLnB1c2goLi4uY2FjaGVkLnNraWxscyk7XG4gICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbikgbG9jYWxTa2lsbFBhdGhzLnB1c2goY2FjaGVGUy5yb290KTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbCByZWFkeVwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgICAgZGVzdGluYXRpb246IGRhdGFicmlja3NCYXNlUGF0aCA/PyBjYWNoZUZTLnJvb3QsXG4gICAgICAgICAgICBkb3dubG9hZGVkQXQ6IGNhY2hlZC5kb3dubG9hZGVkQXQsXG4gICAgICAgICAgICBza2lsbHM6IGNhY2hlZC5za2lsbHMsXG4gICAgICAgICAgICBjYWNoZWQ6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuaW5mbyhcImluc3RhbGxpbmcgcmVtb3RlIHNraWxsXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgICAgc3RhZ2luZyA/Pz0gYXdhaXQgaW5pdGlhbGl6ZWRTY3JhdGNoKFwibWFzdHJhLXJlbW90ZS1za2lsbHNcIik7XG4gICAgICAgIGNvbnN0IHN0YWdlZERpciA9IGF3YWl0IHN0YWdlU291cmNlKHNvdXJjZU9wdGlvbnMsIHN0YWdpbmcucm9vdCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHN0YWdlZCA9IGF3YWl0IGNvbGxlY3RTa2lsbERpcnMoc3RhZ2VkRGlyKTtcbiAgICAgICAgaWYgKHN0YWdlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIFNLSUxMLm1kIGZvdW5kIGZvciBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9saWN5ID0gY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5ID0ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZG93bmxvYWRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgc2tpbGxzOiBzdGFnZWQubWFwKChkaXIpID0+IGRpci5uYW1lKSxcbiAgICAgICAgICAuLi4ocG9saWN5ID8geyBwb2xpY3kgfSA6IHt9KSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRhdGFicmlja3NCYXNlUGF0aCkge1xuICAgICAgICAgIGF3YWl0IGNvcHlTa2lsbERpcnMoZGVzdGluYXRpb24sIHN0YWdlZCk7XG4gICAgICAgICAgLy8gT25seSBhZnRlciB0aGUgY29weSBsYW5kczogYSBtZXRhZGF0YSBlbnRyeSB3cml0dGVuIGZpcnN0IHdvdWxkXG4gICAgICAgICAgLy8gbWFyayBhIGZhaWxlZCBwcm92aXNpb24gYXMgZnJlc2ggYW5kIHN1cHByZXNzIHRoZSByZXRyeSBmb3IgYSBkYXkuXG4gICAgICAgICAgYXdhaXQgd3JpdGVNZXRhZGF0YShkZXN0aW5hdGlvbiwga2V5LCByZWNvcmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsU2tpbGxQYXRocy5wdXNoKGF3YWl0IHBlcnNpc3RMb2NhbGx5KGtleSwgc3RhZ2VkLCByZWNvcmQpKTtcbiAgICAgICAgfVxuICAgICAgICBza2lsbE5hbWVzLnB1c2goLi4ucmVjb3JkLnNraWxscyk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxsIGluc3RhbGxlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBkZXN0aW5hdGlvbjogZGF0YWJyaWNrc0Jhc2VQYXRoID8/IGxvY2FsU2tpbGxQYXRocy5hdCgtMSksXG4gICAgICAgICAgc2tpbGxzOiByZWNvcmQuc2tpbGxzLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgZmFpbGVkIHRvIHByb3Zpc2lvbiByZW1vdGUgc2tpbGwgc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cIjogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpfWAsXG4gICAgICAgICAgICB7IGNhdXNlOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzb3VyY2U6c2tpcHBlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChzdGFnaW5nKSB7XG4gICAgICBhd2FpdCBybShzdGFnaW5nLnJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGxvY2FsU2tpbGxQYXRocywgZGF0YWJyaWNrc0Jhc2VQYXRoLCBza2lsbE5hbWVzIH07XG59XG5cbi8qKiBQcm9iZSBmaWxlIHtAbGluayBvcGVuV3JpdGFibGVXb3Jrc3BhY2V9IHdyaXRlcyBhbmQgcmVtb3Zlcy4gKi9cbmNvbnN0IFdSSVRFX1BST0JFX0ZJTEUgPSBcIi5kYngtdG9vbHMtd3JpdGUtcHJvYmVcIjtcblxuLyoqXG4gKiBPcGVuIHRoZSBEYXRhYnJpY2tzIHNraWxscyBkZXN0aW5hdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlkZW50aXR5XG4gKiBjYW5ub3Qgd3JpdGUgdGhlcmUuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCkgaXMgY29tbW9ubHlcbiAqIGFkbWlucy1vbmx5LCBhbmQgYW4gYXBwIHNlcnZpY2UgcHJpbmNpcGFsIGlzIG5vdCBhbiBhZG1pbiAtIHNvIGEgRGF0YWJyaWNrc1xuICogQXBwIHdyaXRpbmcgdGhlcmUgZmFpbHMgd2l0aCBgUkVTT1VSQ0VfRE9FU19OT1RfRVhJU1RgLCB3aGljaCBpcyBob3cgdGhlXG4gKiB3b3Jrc3BhY2UgQVBJIHJlcG9ydHMgYSBwYXRoIHRoZSBjYWxsZXIgaXMgbm90IGFsbG93ZWQgdG8gc2VlLiBUaGF0IGlzIGEgZmFjdFxuICogYWJvdXQgV0hFUkUgdGhlIHRyZWUgaXMgc3RvcmVkLCBub3QgYWJvdXQgd2hldGhlciB0aGUgc2tpbGxzIGFyZSB1c2FibGUsIHNvIGl0XG4gKiBkZWdyYWRlcyB0byB0aGUgbG9jYWwgdHJlZSAoaGFuZGVkIHRvIE1hc3RyYSBhcyBhbiBleHRyYSBzY2FuIHBhdGgpIHJhdGhlclxuICogdGhhbiB0YWtpbmcgYXBwIHN0YXJ0dXAgZG93biBvdmVyIGJvb2trZWVwaW5nIGxvY2F0aW9uLlxuICpcbiAqIFRoZSBwcm9iZSBpcyBhIHJlYWwgd3JpdGU6IGBta2RpcnNgIHN1Y2NlZWRzIG9uIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBldmVuIGZvclxuICogYW4gaWRlbnRpdHkgdGhhdCBjYW5ub3Qgd3JpdGUgaW50byBpdCwgc28gaW5pdCBhbG9uZSBwcm92ZXMgbm90aGluZy4gUmVtb3ZpbmdcbiAqIHRoZSBwcm9iZSBmaWxlIGlzIGJlc3QtZWZmb3J0IC0gYSBmYWlsZWQgY2xlYW51cCBtdXN0IG5vdCBkZWNpZGUgd3JpdGFiaWxpdHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Xcml0YWJsZVdvcmtzcGFjZShcbiAgYmFzZVBhdGg6IHN0cmluZyxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPERhdGFicmlja3NGaWxlU3lzdGVtIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHtcbiAgICBjbGllbnQ6IHdvcmtzcGFjZUNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChjbGllbnQpLFxuICAgIHJvb3Q6IGJhc2VQYXRoLFxuICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICBjcmVhdGVSb290OiB0cnVlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5pbml0KCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFdSSVRFX1BST0JFX0ZJTEUsIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGVzdGluYXRpb246dW53cml0YWJsZVwiLCB7XG4gICAgICBkZXN0aW5hdGlvbjogYmFzZVBhdGgsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGF3YWl0IGZzLmRlbGV0ZUZpbGUoV1JJVEVfUFJPQkVfRklMRSwgeyBmb3JjZTogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gZnM7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBEYXRhYnJpY2tzIEFzc2lzdGFudCBza2lsbHMgZGVzdGluYXRpb24sIG9yIGB1bmRlZmluZWRgIGZvciBsb2NhbCB0ZW1wLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NCYXNlUGF0aChcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjbGllbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aCkgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aCk7XG4gIGNvbnN0IGVtYWlsID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChvcHRpb25zLnVzZXJFbWFpbCk7XG4gIC8vIEEgbmFtZWQgdXNlciB0YXJnZXRzIHRoZWlyIHBlcnNvbmFsIEFzc2lzdGFudCB0cmVlICh0aGUgXCJzYXZlIGEgc2tpbGxcIlxuICAvLyB0YXJnZXQpOyBvdGhlcndpc2UgdGhlIHNoYXJlZCB3b3Jrc3BhY2UgQXNzaXN0YW50IHRyZWUsIHdoaWNoIHRoZSBidWlsdC1pblxuICAvLyBBc3Npc3RhbnQtc2tpbGxzIG1vdW50IGFscmVhZHkgc2NhbnMuXG4gIHJldHVybiBlbWFpbCA/IHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoKGVtYWlsKSA6IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEg7XG59XG5cbi8qKlxuICogU3RhZ2Ugb25lIHNvdXJjZSBpbnRvIGEgZnJlc2ggZGlyIHVuZGVyIGBzdGFnaW5nUm9vdGAsIHByZWZlcnJpbmcgdGhlIG9wdGlvbmFsXG4gKiBgc2tpbGxzYCBDTEkgYW5kIGZhbGxpbmcgYmFjayB0byBhIGRpcmVjdCBmZXRjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VTb3VyY2UoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHN0YWdpbmdSb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB0YXJnZXQgPSBqb2luKHN0YWdpbmdSb290LCBgc3JjLSR7aGFzaC5pZCgpfWApO1xuICBhd2FpdCBta2Rpcih0YXJnZXQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAvLyBBSSBUb29scyByZXNvbHZlcyBmcm9tIGEga25vd24gcmVwbyBsYXlvdXQsIHNvIGl0IG5ldmVyIG5lZWRzIHRoZSBDTEkuXG4gIGlmIChpc0FpVG9vbHNTb3VyY2Uoc291cmNlT3B0aW9ucy5zb3VyY2UpKSByZXR1cm4gc3RhZ2VBaVRvb2xzKHNvdXJjZU9wdGlvbnMsIHRhcmdldCwgb3B0aW9ucyk7XG4gIGNvbnN0IHZpYUNsaSA9IGF3YWl0IHN0YWdlVmlhU2tpbGxzQ2xpKHNvdXJjZU9wdGlvbnMsIHRhcmdldCk7XG4gIGlmICh2aWFDbGkpIHJldHVybiB2aWFDbGk7XG4gIHJldHVybiBzdGFnZVZpYUZldGNoKHNvdXJjZU9wdGlvbnMsIHRhcmdldCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemUgdGhlIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGxzIGludG8gYHRhcmdldGAuXG4gKlxuICogUmVhZHMgdGhlIHJlcG8ncyBvd24gZ2VuZXJhdGVkIGBtYW5pZmVzdC5qc29uYCAod2hpY2ggbmFtZXMgZWFjaCBza2lsbCdzXG4gKiBmaWxlcyBhbmQgd2hldGhlciBpdCBsaXZlcyB1bmRlciBgc2tpbGxzL2Agb3IgYGV4cGVyaW1lbnRhbC9gKSBhbmQgZG93bmxvYWRzXG4gKiB0aGVtIC0gdGhlIHNhbWUgdGhpbmcgYGRhdGFicmlja3MgYWl0b29scyBpbnN0YWxsYCBkb2VzLCBtaW51cyB0aGUgQ0xJIGFuZFxuICogbWludXMgYW55IERhdGFicmlja3MgYXV0aCwgc2luY2UgdGhlIHJlcG8gaXMgcHVibGljLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZUFpVG9vbHMoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbWF4Qnl0ZXMgPSByZXNvbHZlTWF4Qnl0ZXMoc291cmNlT3B0aW9ucywgb3B0aW9ucyk7XG4gIGNvbnN0IHJlZiA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoc291cmNlT3B0aW9ucy5yZWYpID8/IEFJVE9PTFNfUkVGO1xuICBjb25zdCBtYW5pZmVzdCA9IGpzb24ucGFyc2UoXG4gICAgKGF3YWl0IGRvd25sb2FkKGFpVG9vbHNSYXdVcmwocmVmLCBcIm1hbmlmZXN0Lmpzb25cIiksIG1heEJ5dGVzKSkudG9TdHJpbmcoXCJ1dGY4XCIpLFxuICAgIHVuZGVmaW5lZCxcbiAgKSBhcyBBaVRvb2xzTWFuaWZlc3QgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgd2FudGVkID0gbmV3IFNldChzdHJpbmdVdGlscy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpKTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdD8uc2tpbGxzID8/IHt9KS5maWx0ZXIoKFtuYW1lLCBlbnRyeV0pID0+XG4gICAgd2FudGVkLnNpemUgPiAwXG4gICAgICA/IHdhbnRlZC5oYXMobmFtZSlcbiAgICAgIDogZW50cnkucmVwb19kaXIgIT09IFwiZXhwZXJpbWVudGFsXCIgfHwgc291cmNlT3B0aW9ucy5leHBlcmltZW50YWwgPT09IHRydWUsXG4gICk7XG4gIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIG1hdGNoaW5nIHNraWxscyBpbiAke0FJVE9PTFNfUkVQT31AJHtyZWZ9YCk7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IHNlbGVjdGVkLmZsYXRNYXAoKFtuYW1lLCBlbnRyeV0pID0+XG4gICAgKGVudHJ5LmZpbGVzID8/IFtdKS5tYXAoKGZpbGUpID0+ICh7XG4gICAgICB1cmw6IGFpVG9vbHNSYXdVcmwocmVmLCBgJHtlbnRyeS5yZXBvX2RpciA/PyBcInNraWxsc1wifS8ke25hbWV9LyR7ZmlsZX1gKSxcbiAgICAgIHBhdGg6IGpvaW4odGFyZ2V0LCBuYW1lLCAuLi5maWxlLnNwbGl0KFwiL1wiKSksXG4gICAgfSkpLFxuICApO1xuICBhd2FpdCBhc3luY1V0aWxzLm1hcENvbmN1cnJlbnQoXG4gICAgZmlsZXMsXG4gICAgYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBkb3dubG9hZChpdGVtLnVybCwgbWF4Qnl0ZXMpO1xuICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShpdGVtLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShpdGVtLnBhdGgsIGJvZHkpO1xuICAgIH0sXG4gICAgeyBjb25jdXJyZW5jeTogQUlUT09MU19DT05DVVJSRU5DWSB9LFxuICApO1xuXG4gIGxvZ2dlci5kZWJ1ZyhcImFpdG9vbHM6c3RhZ2VkXCIsIHsgcmVmLCBza2lsbHM6IHNlbGVjdGVkLmxlbmd0aCwgZmlsZXM6IGZpbGVzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqIFJhdy1jb250ZW50IFVSTCBmb3IgYSBwYXRoIGluIHRoZSBBSSBUb29scyByZXBvIGF0IGByZWZgLiAqL1xuZnVuY3Rpb24gYWlUb29sc1Jhd1VybChyZWY6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHtBSVRPT0xTX1JFUE99LyR7cmVmfS8ke3BhdGh9YDtcbn1cblxuLyoqXG4gKiBDb3B5IGEgc291cmNlIGludG8gYHRhcmdldGAgd2l0aCB0aGUgYHNraWxsc2AgQ0xJIHdoZW4gaXQgaXMgaW5zdGFsbGVkLlxuICogUmV0dXJucyB0aGUgZGlyIGhvbGRpbmcgdGhlIGNvcGllZCBgU0tJTEwubWRgIHRyZWVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICogQ0xJIGlzIGFic2VudCAoc28gdGhlIGNhbGxlciBjYW4gZmFsbCBiYWNrIHRvIGEgZmV0Y2gpLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVZpYVNraWxsc0NsaShcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjbGkgPSBhd2FpdCByZXNvbHZlU2tpbGxzQ2xpKCk7XG4gIGlmICghY2xpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgLi4uY2xpLmFyZ3MsXG4gICAgXCJhZGRcIixcbiAgICBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICBcIi0tYWdlbnRcIixcbiAgICBTS0lMTFNfQ0xJX0FHRU5ULFxuICAgIFwiLS1jb3B5XCIsXG4gICAgXCIteVwiLFxuICBdO1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykpIHtcbiAgICBhcmdzLnB1c2goXCItLXNraWxsXCIsIHNraWxsKTtcbiAgfVxuICBpZiAoc3RyaW5nVXRpbHMucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKS5sZW5ndGggPT09IDApIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgXCIqXCIpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMuc3Bhd24oY2xpLmNvbW1hbmQsIGFyZ3MsIHtcbiAgICBjd2Q6IHRhcmdldCxcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgY2hlY2s6IGZhbHNlLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBza2lsbHMgQ0xJIGZhaWxlZCAoZXhpdCAke3Jlc3VsdC5leGl0Q29kZX0pOiAke3Jlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4odGFyZ2V0LCAuLi5TS0lMTFNfQ0xJX0xBWU9VVCk7XG59XG5cbi8qKlxuICogTG9jYXRlIHRoZSBvcHRpb25hbCBgc2tpbGxzYCBDTEkgYmluLCByZXNvbHZlZCBmcm9tIFRISVMgcGFja2FnZSdzIG1vZHVsZVxuICogZ3JhcGguIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGVlciBkZXAgaXNuJ3QgaW5zdGFsbGVkLCBzbyB0aGUgY2FsbGVyXG4gKiBmYWxscyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxzQ2xpKCk6IFByb21pc2U8eyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgIGNvbnN0IHBrZ1BhdGggPSByZXF1aXJlLnJlc29sdmUoXCJza2lsbHMvcGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IGJpbiA9IGpvaW4ocGtnUGF0aCwgXCIuLlwiLCBcImJpblwiLCBcImNsaS5tanNcIik7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoYmluKSkgcmV0dXJuIHsgY29tbWFuZDogcHJvY2Vzcy5leGVjUGF0aCwgYXJnczogW2Jpbl0gfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gcGVlciBkZXAgYWJzZW50IG9yIHVucmVzb2x2YWJsZSAtIGZldGNoIGZhbGxiYWNrIGhhbmRsZXMgaXRcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZldGNoIGEgc291cmNlIFVSTCBhbmQgd3JpdGUgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB1bmRlciBgdGFyZ2V0YC5cbiAqIFVzZWQgd2hlbiB0aGUgYHNraWxsc2AgQ0xJIGlzbid0IGluc3RhbGxlZDsgc3VwcG9ydHMgYSBkaXJlY3QgYFNLSUxMLm1kYCBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhRmV0Y2goXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoc291cmNlT3B0aW9ucy5zb3VyY2UpO1xuICBpZiAoIXVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiIGlzIG5vdCBhIFVSTCBhbmQgdGhlIG9wdGlvbmFsIFwic2tpbGxzXCIgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGRvd25sb2FkKHVybC50b1N0cmluZygpLCByZXNvbHZlTWF4Qnl0ZXMoc291cmNlT3B0aW9ucywgb3B0aW9ucykpO1xuICBjb25zdCBuYW1lID0gc3RyaW5nVXRpbHMudG9TbHVnKGRlcml2ZVNraWxsTmFtZSh1cmwudG9TdHJpbmcoKSkpIHx8IFwicmVtb3RlLXNraWxsXCI7XG4gIGNvbnN0IHNraWxsRGlyID0gam9pbih0YXJnZXQsIG5hbWUpO1xuICBhd2FpdCBta2Rpcihza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHNraWxsRGlyLCBcIlNLSUxMLm1kXCIpLCBidWZmZXIpO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogVGhlIGVmZmVjdGl2ZSBkb3dubG9hZCBjZWlsaW5nOiBwZXItc291cmNlLCB0aGVuIHRvcC1sZXZlbCwgdGhlbiB0aGUgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNYXhCeXRlcyhcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIHJldHVybiBzb3VyY2VPcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gb3B0aW9ucy5tYXhEb3dubG9hZEJ5dGVzID8/IERFRkFVTFRfTUFYX0RPV05MT0FEX0JZVEVTO1xufVxuXG4vKiogR0VUIGEgVVJMLCBmYWlsaW5nIGxvdWRseSBvbiBhIG5vbi0yeHggc3RhdHVzIG9yIGFuIG92ZXJzaXplZCBib2R5LiAqL1xuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWQodXJsOiBzdHJpbmcsIG1heEJ5dGVzOiBudW1iZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChERUZBVUxUX0RPV05MT0FEX1RJTUVPVVRfTVMpLFxuICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBmYWlsZWQgKCR7dXJsfSk6ICR7ZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKX1gLCB7XG4gICAgICBjYXVzZTogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9ICgke3VybH0pYCk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChidWZmZXIuYnl0ZUxlbmd0aCA+IG1heEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBleGNlZWRzICR7bWF4Qnl0ZXN9IGJ5dGVzICgke3VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuLyoqIERlcml2ZSBhIHNraWxsIGRpcmVjdG9yeSBuYW1lIGZyb20gYSBkb3dubG9hZCBVUkwncyBsYXN0IHBhdGggc2VnbWVudC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVNraWxsTmFtZSh1cmxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHVybFN0cmluZyk7XG4gIGNvbnN0IGxhc3QgPSB1cmw/LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgPz8gXCJcIjtcbiAgcmV0dXJuIGxhc3QucmVwbGFjZSgvXFwuKG1kfHppcHx0YXJ8dGd6fGd6KSQvaSwgXCJcIik7XG59XG5cbi8qKiBBIHNraWxsIGRpcmVjdG9yeSAoaG9sZGluZyBhIGBTS0lMTC5tZGApIHN0YWdlZCBvbiBsb2NhbCBkaXNrLiAqL1xuaW50ZXJmYWNlIFN0YWdlZFNraWxsRGlyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhYnNvbHV0ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSB1bmRlciBgcm9vdGA6IGEgYHJvb3QvU0tJTEwubWRgIChyb290IElTIHRoZVxuICogc2tpbGwpIG9yIGVhY2ggaW1tZWRpYXRlIGNoaWxkIGRpciB0aGF0IGNvbnRhaW5zIGEgYFNLSUxMLm1kYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFNraWxsRGlycyhyb290OiBzdHJpbmcpOiBQcm9taXNlPFN0YWdlZFNraWxsRGlyW10+IHtcbiAgaWYgKCEoYXdhaXQgcGF0aEV4aXN0cyhyb290KSkpIHJldHVybiBbXTtcbiAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihyb290LCBcIlNLSUxMLm1kXCIpKSkge1xuICAgIGNvbnN0IG5hbWUgPSBwb3NpeC5iYXNlbmFtZShyb290LnNwbGl0KC9bXFxcXC9dLykuam9pbihcIi9cIikpO1xuICAgIHJldHVybiBbeyBuYW1lLCBhYnNvbHV0ZVBhdGg6IHJvb3QgfV07XG4gIH1cbiAgY29uc3QgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF3YWl0IHJlYWRkaXIocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBkaXIgPSBqb2luKHJvb3QsIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKGpvaW4oZGlyLCBcIlNLSUxMLm1kXCIpKSkge1xuICAgICAgZGlycy5wdXNoKHsgbmFtZTogZW50cnkubmFtZSwgYWJzb2x1dGVQYXRoOiBkaXIgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXJzO1xufVxuXG4vKipcbiAqIENvcHkgZXZlcnkgc3RhZ2VkIHNraWxsIGRpcmVjdG9yeSBpbnRvIHtAbGluayBkZXN0aW5hdGlvbn0sIHByZXNlcnZpbmcgdGhlXG4gKiBgPHNraWxsPi88cmVsYXRpdmU+YCBsYXlvdXQuIFRoZSBkZXN0aW5hdGlvbiBpcyBqdXN0IGEge0BsaW5rIEZpbGVTeXN0ZW19LFxuICogc28gdGhlIERhdGFicmlja3MgQXNzaXN0YW50IHRyZWUgYW5kIHRoZSBsb2NhbCBmYWxsYmFjayBzaGFyZSBvbmUgY29waWVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uOiBGaWxlU3lzdGVtLCBkaXJzOiBTdGFnZWRTa2lsbERpcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGRlc3RpbmF0aW9uLmluaXQoKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmUgb2YgZmluZC5maW5kRmlsZXMoXCIqKi8qXCIsIHsgY3dkOiBkaXIuYWJzb2x1dGVQYXRoLCBub2RpcjogdHJ1ZSB9KSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUoam9pbihkaXIuYWJzb2x1dGVQYXRoLCByZWxhdGl2ZSkpO1xuICAgICAgY29uc3Qgc2tpbGxQYXRoID0gcG9zaXguam9pbihkaXIubmFtZSwgcmVsYXRpdmUuc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgICBhd2FpdCBkZXN0aW5hdGlvbi53cml0ZUZpbGUoc2tpbGxQYXRoLCBidWZmZXIsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgc3RhZ2VkIHNraWxsIGRpcnMgaW50byBhIFNUQUJMRSBsb2NhbCB0cmVlIGtleWVkIGJ5IHRoZSBzb3VyY2UsIGFuZFxuICogcmV0dXJuIGl0cyByb290IHBhdGguXG4gKlxuICogQSBnaXZlbiBzb3VyY2UgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgY29udGVudCBvbiBhbG1vc3QgZXZlcnkgYm9vdCwgc28gZWFjaFxuICogb25lIG93bnMgYSBkaXJlY3RvcnkgbmFtZWQgZm9yIGl0cyB7QGxpbmsgY2FjaGVLZXl9IHJhdGhlciB0aGFuIGxlYXZpbmcgYVxuICogZnJlc2ggc2NyYXRjaCBkaXIgYmVoaW5kIHBlciByZXN0YXJ0LiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbmQgaXRzIHBvbGljeVxuICogKG5vdCB0aGUgY29udGVudCkgaXMgd2hhdCBrZWVwcyB0d28gZGlmZmVyZW50IHNvdXJjZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoXG4gKiBvdGhlci5cbiAqXG4gKiBUaGUgbWV0YWRhdGEgaXMgd3JpdHRlbiBJTlNJREUgdGhlIHJlYnVpbGQgcmF0aGVyIHRoYW4gYWZ0ZXIgaXQ6IGByZWJ1aWxkRlNgXG4gKiByZXBsYWNlcyB0aGUgc3RhYmxlIHJvb3Qgd2hvbGVzYWxlLCBzbyBhbnl0aGluZyB3cml0dGVuIGFmdGVyd2FyZHMgd291bGRcbiAqIHN1cnZpdmUgb25seSB1bnRpbCB0aGUgbmV4dCByZWZyZXNoLCBhbmQgYW55dGhpbmcgd3JpdHRlbiBiZWZvcmUgd291bGQgYmVcbiAqIHRocm93biBhd2F5IGJ5IHRoZSBzd2FwLlxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0TG9jYWxseShcbiAga2V5OiBzdHJpbmcsXG4gIGRpcnM6IFN0YWdlZFNraWxsRGlyW10sXG4gIHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3RhYmxlID0gYXdhaXQgbG9jYWxGUy5yZWJ1aWxkRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCwgYXN5bmMgKHNjcmF0Y2gpID0+IHtcbiAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKHNjcmF0Y2gsIGRpcnMpO1xuICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoc2NyYXRjaCwga2V5LCByZWNvcmQpO1xuICB9KTtcbiAgcmV0dXJuIHN0YWJsZS5yb290O1xufVxuXG4vKipcbiAqIEEgc2NyYXRjaCBmaWxlc3lzdGVtIHdob3NlIHJvb3QgZXhpc3RzIG9uIGRpc2ssIGZvciB0aGUgcGF0aHMgdGhhdCBoYW5kIGFcbiAqIHJlYWwgZGlyZWN0b3J5IHRvIGBub2RlOmZzYCBvciBhIGNoaWxkIHByb2Nlc3MgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICogdGhlIHtAbGluayBGaWxlU3lzdGVtfSBBUEkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVkU2NyYXRjaChwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8TG9jYWxGaWxlU3lzdGVtPiB7XG4gIGNvbnN0IHNjcmF0Y2ggPSBsb2NhbEZTLnNjcmF0Y2hGUyhwcmVmaXgpO1xuICBhd2FpdCBzY3JhdGNoLmluaXQoKTtcbiAgcmV0dXJuIHNjcmF0Y2g7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBleGlzdGVuY2UgY2hlY2suICovXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHN0YXQocGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
639
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsVUFBVSxFQUNWLFVBQVUsRUFDVixJQUFJLEVBQ0osSUFBSSxFQUNKLEdBQUcsRUFDSCxHQUFHLEVBQ0gsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLHdCQUF3QixDQUFDO0FBSWhDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUVsRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFN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Q0FBQyxDQUFDLENBQUM7WUFDMUUsTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILEtBQUssVUFBVSxjQUFjLENBQzNCLEdBQVcsRUFDWCxJQUFzQixFQUN0QixNQUE2QjtJQUU3QixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxnQkFBZ0IsSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDckYsTUFBTSxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsTUFBYztJQUM5QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YXJ0dXAgcHJvdmlzaW9uaW5nIG9mIHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIGZvciBhIE1hc3RyYSB3b3Jrc3BhY2UuXG4gKlxuICogQSB7QGxpbmsgUmVtb3RlU2tpbGxTb3VyY2V9IG5hbWVzIFdIRVJFIGEgYFNLSUxMLm1kYCB0cmVlIGNvbWVzIGZyb20gLSB0aGVcbiAqIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQsIGEgR2l0SHViIGBvd25lci9yZXBvYCwgYW55IGdpdCAvIEdpdExhYiBVUkwsXG4gKiBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgLSBhbmQgb3B0aW9uYWwgcGVyLXNvdXJjZSBwb2xpY3kuXG4gKiB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSBtYXRlcmlhbGl6ZXMgZXZlcnkgc291cmNlIGludG8gYSBsb2NhbFxuICogYFNLSUxMLm1kYCB0cmVlIGF0IGFwcCBib290IGFuZCByZXR1cm5zIHRoZSBkaXJlY3RvcmllcyB0byBoYW5kIE1hc3RyYSBhc1xuICogZXh0cmEgc2tpbGwgc2NhbiBwYXRocy5cbiAqXG4gKiBSZXNvbHV0aW9uIHBlciBzb3VyY2UsIGluIG9yZGVyOlxuICpcbiAqIDEuIHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50IChgXCJhaXRvb2xzXCJgKTogRGF0YWJyaWNrcycgb3duIHNraWxsXG4gKiAgICBzZXQsIHJlYWQgc3RyYWlnaHQgZnJvbSB0aGUgcHVibGljIHJlcG8gdGhlIGBkYXRhYnJpY2tzIGFpdG9vbHNgIENMSVxuICogICAgc291cmNlcyBmcm9tLiBObyBDTEksIG5vIERhdGFicmlja3MgYXV0aCAtIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQgdXNhYmxlXG4gKiAgICBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCBjb250YWluZXIsIHdoZXJlIHRoZSBDTEkgaXMgbm90IGluc3RhbGxlZDtcbiAqIDIuIHRoZSBPUFRJT05BTCBgc2tpbGxzYCBucG0gQ0xJIChwZWVyIGRlcCk6IGlmIGluc3RhbGxlZCwgZWFjaCBzb3VyY2UgaXNcbiAqICAgIGNvcGllZCBpbnRvIGEgc3RhZ2luZyBkaXIgd2l0aCBgc2tpbGxzIGFkZCA8c291cmNlPiAtLWFnZW50IDxkaXI+IC0tY29weWAsXG4gKiAgICB3aGljaCB1bmRlcnN0YW5kcyBldmVyeSBzb3VyY2UgZm9ybWF0IHRoZSBlY29zeXN0ZW0gZG9lcyAoR2l0SHViXG4gKiAgICBzaG9ydGhhbmQsIGdpdCBVUkxzLCBhcmNoaXZlL2Rvd25sb2FkIFVSTHMpO1xuICogMy4gb3RoZXJ3aXNlIGEgcGxhaW4ge0BsaW5rIGZldGNofSBvZiB0aGUgc291cmNlIFVSTCAoYnVpbHQgd2l0aFxuICogICAge0BsaW5rIG5ldC51cmxCdWlsZGVyfSksIHdyaXRpbmcgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB0byBhIHN0YWdpbmdcbiAqICAgIGRpci5cbiAqXG4gKiBBIHNvdXJjZSB0aGF0IHJlc29sdmVzIHRocm91Z2ggbmVpdGhlciBwYXRoIGZhaWxzIGFwcCBzdGFydHVwLCB1bmxlc3MgdGhlXG4gKiBzb3VyY2UgKG9yIHRoZSB0b3AtbGV2ZWwgY2FsbCkgc2V0cyBgZmFpbE9uRXJyb3I6IGZhbHNlYCwgaW4gd2hpY2ggY2FzZSBpdCBpc1xuICogbG9nZ2VkIGFuZCBza2lwcGVkIHNvIG9uZSBiYWQgc291cmNlIG5ldmVyIHRha2VzIHRoZSBhcHAgZG93bi5cbiAqXG4gKiBFdmVyeSBwcm92aXNpb25lZCB0cmVlIGNhcnJpZXMgYSB7QGxpbmsgTUVUQURBVEFfRklMRX0gcmVjb3JkaW5nIHdoZW4gZWFjaFxuICogc291cmNlIHdhcyBsYXN0IGRvd25sb2FkZWQsIGFuZCBhIHNvdXJjZSBpcyBvbmx5IHJlLWRvd25sb2FkZWQgb25jZSB0aGF0XG4gKiByZWNvcmQgaXMgb2xkZXIgdGhhbiB7QGxpbmsgREVGQVVMVF9SRUZSRVNIX1RUTF9NU30gKHNldmVuIGRheXMpLiBUaGlzIHJ1bnMgYXQgYXBwXG4gKiBCT09ULCBzbyB3aXRob3V0IGl0IGEgY29udGFpbmVyIHRoYXQgcmVzdGFydHMgYSBkb3plbiB0aW1lcyBhbiBob3VyIHJlLXB1bGxzXG4gKiB0aGUgd2hvbGUgQUkgVG9vbHMgc2V0IGEgZG96ZW4gdGltZXMgZm9yIGNvbnRlbnQgdGhhdCBjaGFuZ2VzIHJhcmVseS4gVGhlXG4gKiByZWNvcmQgdHJhdmVscyBXSVRIIHRoZSB0cmVlIHJhdGhlciB0aGFuIGluIHByb2Nlc3MgbWVtb3J5LCBzbyB0aGUgcmV1c2VcbiAqIHN1cnZpdmVzIGEgcmVzdGFydCAtIHdoaWNoIGlzIHRoZSBvbmx5IHdheSBpdCBoZWxwcyBhIERhdGFicmlja3MgQXBwIGF0IGFsbC5cbiAqIFBhc3MgYHJlZnJlc2hUdGxNczogMGAgdG8gZG93bmxvYWQgb24gZXZlcnkgYm9vdC5cbiAqXG4gKiBUaGUgZGVmYXVsdCBkZXN0aW5hdGlvbiBpcyB0aGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgQXNzaXN0YW50IHNraWxscyB0cmVlXG4gKiAoYC9Xb3Jrc3BhY2UvLmFzc2lzdGFudC9za2lsbHNgLCB0aGUgc2FtZSB0cmVlIGEgXCJzYXZlIHRoaXMgYXMgYSBza2lsbFwiXG4gKiBhY3Rpb24gd3JpdGVzIHRvKSwgc28gcHJvdmlzaW9uZWQgc2tpbGxzIHBlcnNpc3QgYWNyb3NzIHJlc3RhcnRzIGFuZCBhcmVcbiAqIGRpc2NvdmVyZWQgYnkgdGhlIGJ1aWx0LWluIEFzc2lzdGFudC1za2lsbHMgbW91bnQuIFBhc3MgYHVzZXJFbWFpbGAgKG9yIGFuXG4gKiBleHBsaWNpdCBgZGF0YWJyaWNrc0Jhc2VQYXRoYCkgdG8gdGFyZ2V0IGAvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2BcbiAqIGluc3RlYWQuIFdoZW4gbm8gRGF0YWJyaWNrcyBjbGllbnQgaXMgcmVzb2x2YWJsZSBhdCBzdGFydHVwIC0gb3IgdGhlIHJlc29sdmVkXG4gKiBpZGVudGl0eSBjYW5ub3QgV1JJVEUgdGhlIGRlc3RpbmF0aW9uLCB3aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UgZm9yIGFcbiAqIERhdGFicmlja3MgQXBwIHNlcnZpY2UgcHJpbmNpcGFsIGFnYWluc3QgdGhlIGFkbWluLW93bmVkIHNoYXJlZCB0cmVlIChzZWVcbiAqIHtAbGluayBvcGVuV3JpdGFibGVXb3Jrc3BhY2V9KSAtIHRoZSB0cmVlIGlzIHdyaXR0ZW4gdW5kZXJcbiAqIHtAbGluayBsb2NhbEZTLnRtcEZTfSBhbmQgcmV0dXJuZWQgYXMgYW4gZXh0cmEgbG9jYWwgc2tpbGwgcGF0aCBmb3IgdGhlXG4gKiBjdXJyZW50IHByb2Nlc3MuIFN0b3JhZ2UgbG9jYXRpb24gZGVncmFkZXM7IHRoZSBza2lsbHMgdGhlbXNlbHZlcyBkbyBub3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCByZWFkRmlsZSwgcm0sIHN0YXQsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCBwb3NpeCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgbG9jYWxGUywgdHlwZSBMb2NhbEZpbGVTeXN0ZW0gfSBmcm9tIFwiQGRieC10b29scy9mc1wiO1xuaW1wb3J0IHsgZmluZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3BhdGhcIjtcbmltcG9ydCB7XG4gIGFzeW5jVXRpbHMsXG4gIGVycm9yVXRpbHMsXG4gIGhhc2gsXG4gIGpzb24sXG4gIGxvZyxcbiAgbmV0LFxuICBvYmplY3QsXG4gIHN0cmluZ1V0aWxzLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBPbmVPck1hbnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5cbmltcG9ydCB7IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEgsIHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoIH0gZnJvbSBcIi4vc2tpbGwtcGF0aHMudHNcIjtcbmltcG9ydCB7IGNsZWFyV29ya3NwYWNlU2tpbGxDYWNoZSB9IGZyb20gXCIuL3NraWxsLWNhY2hlLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvcmVtb3RlLXNraWxsc1wiKTtcblxuLyoqXG4gKiBBZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuXG4gKlxuICogYHVuaXZlcnNhbGAgaXMgdGhlIENMSSdzIG93biBuYW1lIGZvciBcIm5vIHBhcnRpY3VsYXIgYWdlbnQsIGp1c3QgdGhlIHBsYWluXG4gKiB0cmVlXCIsIHdoaWNoIGlzIHdoYXQgdGhpcyBtb2R1bGUgd2FudHMgLSBpdCByZS1ob3N0cyB0aGUgcmVzdWx0IGl0c2VsZi4gVGhlXG4gKiBpZCBtdXN0IGJlIG9uZSB0aGUgaW5zdGFsbGVkIENMSSBrbm93czogYW4gdW5yZWNvZ25pemVkIG9uZSBpcyByZWplY3RlZFxuICogb3V0cmlnaHQgKGBJbnZhbGlkIGFnZW50czogLi4uYCksIHRha2luZyBldmVyeSBub24tYGFpdG9vbHNgIHNvdXJjZSBkb3duIHdpdGhcbiAqIGl0LCBzaW5jZSBhIENMSSBmYWlsdXJlIGlzIGEgaGFyZCBmYWlsdXJlIHJhdGhlciB0aGFuIGEgZmFsbC10aHJvdWdoIHRvXG4gKiB7QGxpbmsgc3RhZ2VWaWFGZXRjaH0uXG4gKi9cbmNvbnN0IFNLSUxMU19DTElfQUdFTlQgPSBcInVuaXZlcnNhbFwiO1xuXG4vKiogV2hlcmUgdGhlIGBza2lsbHNgIENMSSBkcm9wcyBhIHBsYWluIGBTS0lMTC5tZGAgdHJlZSB1bmRlciBhIHRhcmdldCBkaXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0xBWU9VVCA9IFtcIi5hZ2VudHNcIiwgXCJza2lsbHNcIl0gYXMgY29uc3Q7XG5cbi8qKiBDYXAgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgYm9keSwgbWF0Y2hpbmcgdGhlIGBza2lsbHNgIENMSSBkZWZhdWx0LiAqL1xuY29uc3QgREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogTWF4aW11bSB0aW1lIG9uZSByZW1vdGUgZmlsZSBkb3dubG9hZCBtYXkgYmxvY2sgc3RhcnR1cC4gKi9cbmNvbnN0IERFRkFVTFRfRE9XTkxPQURfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIFN0YWJsZSB0ZW1wIGRpcmVjdG9yeSBob2xkaW5nIG9uZSByZWJ1aWx0IHNraWxsIHRyZWUgcGVyIHJlbW90ZSBzb3VyY2UuICovXG5jb25zdCBMT0NBTF9TS0lMTFNfRElSID0gXCJtYXN0cmEtbG9jYWwtc2tpbGxzXCI7XG5cbi8qKlxuICogQm9va2tlZXBpbmcgZmlsZSB3cml0dGVuIGF0IHRoZSByb290IG9mIGV2ZXJ5IHByb3Zpc2lvbmVkIHNraWxsIHRyZWUsIG5hbWluZ1xuICogd2hlbiBlYWNoIHNvdXJjZSB3YXMgbGFzdCBkb3dubG9hZGVkLiBBIGRvdGZpbGUgc28gdGhlIHNraWxsIHNjYW5uZXJzLCB3aGljaFxuICogbG9vayBmb3IgYDxkaXI+L1NLSUxMLm1kYCwgbmV2ZXIgbWlzdGFrZSBpdCBmb3IgYSBza2lsbC5cbiAqL1xuY29uc3QgTUVUQURBVEFfRklMRSA9IFwiLm1ldGFkYXRhLmpzb25cIjtcblxuLyoqIFNoYXBlIG1hcmtlciBmb3Ige0BsaW5rIE1FVEFEQVRBX0ZJTEV9OyBhbiB1bmtub3duIHZlcnNpb24gaXMgaWdub3JlZCwgbm90IHJlYWQuICovXG5jb25zdCBNRVRBREFUQV9WRVJTSU9OID0gMTtcblxuLyoqIEhvdyBsb25nIGEgcHJvdmlzaW9uZWQgc291cmNlIGlzIHJldXNlZCBiZWZvcmUgYmVpbmcgZG93bmxvYWRlZCBhZ2Fpbi4gKi9cbmNvbnN0IERFRkFVTFRfUkVGUkVTSF9UVExfTVMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFJIFRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFNvdXJjZSBjb25zdGFudCBzZWxlY3RpbmcgRGF0YWJyaWNrcycgb3duIEFJIFRvb2xzIHNraWxsIHNldC5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFzdHJhKHsgcmVtb3RlU2tpbGxzOiBcImFpdG9vbHNcIiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IEFJVE9PTFNfU09VUkNFID0gXCJhaXRvb2xzXCI7XG5cbi8qKiBUaGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBsaXRlcmFsLCBmb3IgY2FsbGVycyBzcGVsbGluZyB0aGUgdW5pb24gb3V0LiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sc1NvdXJjZSA9IHR5cGVvZiBBSVRPT0xTX1NPVVJDRTtcblxuLyoqXG4gKiBUaGUgUFVCTElDIHJlcG8gYGRhdGFicmlja3MgYWl0b29scyBpbnN0YWxsYCBzb3VyY2VzIGZyb20uIFJlYWRpbmcgaXRcbiAqIGRpcmVjdGx5IGlzIHdoYXQgbGV0cyBhbiBhcHAgZ2V0IHRoZSBzYW1lIHNraWxscyB0aGUgQ0xJIGluc3RhbGxzIHdpdGhvdXRcbiAqIHRoZSBDTEkgLSB3aGljaCBhIERhdGFicmlja3MgQXBwIGNvbnRhaW5lciBkb2VzIG5vdCBzaGlwLlxuICovXG5jb25zdCBBSVRPT0xTX1JFUE8gPSBcImRhdGFicmlja3MvZGF0YWJyaWNrcy1hZ2VudC1za2lsbHNcIjtcblxuLyoqIFJlcG8gcmVmIHRoZSBza2lsbHMgYXJlIHJlYWQgZnJvbS4gT3ZlcnJpZGUgcGVyIHNvdXJjZSB3aXRoIGByZWZgLiAqL1xuY29uc3QgQUlUT09MU19SRUYgPSBcIm1haW5cIjtcblxuLyoqIFNraWxsIGZpbGVzIGRvd25sb2FkZWQgYXQgb25jZTsgdGhlIHNldCBpcyB+MzAgc2tpbGxzIG9mIGEgZmV3IGZpbGVzIGVhY2guICovXG5jb25zdCBBSVRPT0xTX0NPTkNVUlJFTkNZID0gODtcblxuLyoqIFRoZSBzdWJzZXQgb2YgdGhlIHJlcG8ncyBnZW5lcmF0ZWQgYG1hbmlmZXN0Lmpzb25gIHRoaXMgbW9kdWxlIHJlYWRzLiAqL1xuaW50ZXJmYWNlIEFpVG9vbHNNYW5pZmVzdCB7XG4gIHNraWxscz86IFJlY29yZDxzdHJpbmcsIHsgZmlsZXM/OiBzdHJpbmdbXTsgcmVwb19kaXI/OiBzdHJpbmcgfT47XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHJlbW90ZSBza2lsbCBzb3VyY2UgYW5kIGl0cyBwZXItc291cmNlIHBvbGljeS5cbiAqXG4gKiBgc291cmNlYCBpcyB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IG9yIGFueXRoaW5nIHRoZSBgc2tpbGxzYCBlY29zeXN0ZW1cbiAqIHVuZGVyc3RhbmRzOiBhIEdpdEh1YiBgb3duZXIvcmVwb2Agc2hvcnRoYW5kLCBhIGZ1bGwgR2l0SHViIC8gR2l0TGFiIC8gZ2l0XG4gKiBVUkwsIG9yIGEgZGlyZWN0IGRvd25sb2FkIFVSTCB0byBhIGBTS0lMTC5tZGAgb3IgYXJjaGl2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMge1xuICAvKiogYFwiYWl0b29sc1wiYCwgYSBHaXRIdWIgc2hvcnRoYW5kLCBhIGdpdCAvIEdpdExhYiBVUkwsIG9yIGEgZG93bmxvYWQgVVJMLiAqL1xuICBzb3VyY2U6IG5ldC5VcmxMaWtlIHwgQWlUb29sc1NvdXJjZTtcbiAgLyoqIEluc3RhbGwgb25seSB0aGVzZSBza2lsbCBuYW1lcyBmcm9tIHRoZSBzb3VyY2UuICovXG4gIHNraWxscz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKiogSW5jbHVkZSBleHBlcmltZW50YWwgc2tpbGxzLiBgXCJhaXRvb2xzXCJgIG9ubHkuICovXG4gIGV4cGVyaW1lbnRhbD86IGJvb2xlYW47XG4gIC8qKiBQaW4gdGhlIHJlcG8gcmVmICh0YWcgLyBicmFuY2ggLyBzaGEpLiBgXCJhaXRvb2xzXCJgIG9ubHk7IGRlZmF1bHRzIHRvIGBtYWluYC4gKi9cbiAgcmVmPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgdGhlIGJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZCBmb3IgdGhpcyBzb3VyY2UuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGlzIHNvdXJjZSdzIHByb3Zpc2lvbmVkIHRyZWUgaXMgcmV1c2VkIGJlZm9yZSBpdCBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsXG4gICAqIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLnJlZnJlc2hUdGxNc307IGAwYCByZS1kb3dubG9hZHMgb25cbiAgICogZXZlcnkgYm9vdC5cbiAgICovXG4gIHJlZnJlc2hUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gYGZhbHNlYCwgYSBzb3VyY2UgdGhhdCBmYWlscyB0byByZXNvbHZlIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZCBpbnN0ZWFkXG4gICAqIG9mIGZhaWxpbmcgYXBwIHN0YXJ0dXAuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLmZhaWxPbkVycm9yfS5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJlbW90ZSBza2lsbCBzb3VyY2U6IHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIFVSTC1saWtlXG4gKiAoc3RyaW5nIC8gYFVSTGAgLyBgeyB1cmwgfWApLCBvciBhIHtAbGluayBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnN9IGJhZyB3aXRoXG4gKiBwZXItc291cmNlIHBvbGljeS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVtb3RlU2tpbGxTb3VyY2UgPSBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2UgfCBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnM7XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZSBgcmVtb3RlU2tpbGxzYCBvcHRpb246IG9uZSBzb3VyY2UsIGEgbm9uLWVtcHR5IGxpc3Qgb2YgdGhlbSwgb3JcbiAqIGEge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnN9IGJhZyB3aGVuIHRvcC1sZXZlbCBwb2xpY3kgaXMgbmVlZGVkLlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbHNPcHRpb24gPVxuICBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT4gfCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zO1xuXG4vKiogQSBzb3VyY2UgZW50cnkgd2l0aCBpdHMgYHNvdXJjZWAgZmxhdHRlbmVkIHRvIGEgcGxhaW4gc3RyaW5nLiAqL1xudHlwZSBOb3JtYWxpemVkU291cmNlID0gT21pdDxSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsIFwic291cmNlXCI+ICYgeyBzb3VyY2U6IHN0cmluZyB9O1xuXG4vKiogVG9wLWxldmVsIHJlbW90ZS1za2lsbHMgcHJvdmlzaW9uaW5nIG9wdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICAvKiogU291cmNlcyB0byBtYXRlcmlhbGl6ZSBhdCBzdGFydHVwLiAqL1xuICBzb3VyY2VzOiBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT47XG4gIC8qKlxuICAgKiBGYWlsIGFwcCBzdGFydHVwIHdoZW4gYSBzb3VyY2UgY2FuJ3QgYmUgcmVzb2x2ZWQuIERlZmF1bHRzIHRvIGB0cnVlYC4gQVxuICAgKiBwZXItc291cmNlIGBmYWlsT25FcnJvcmAgd2lucyBvdmVyIHRoaXMuXG4gICAqL1xuICBmYWlsT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIHBhdGggdGhhdCByb290cyB0aGUgZGVzdGluYXRpb24gQXNzaXN0YW50IHNraWxscyB0cmVlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgT0JPIHVzZXIncyBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgLlxuICAgKi9cbiAgZGF0YWJyaWNrc0Jhc2VQYXRoPzogc3RyaW5nO1xuICAvKiogQXV0aC1zY29wZWQgRGF0YWJyaWNrcyBjbGllbnQuIERlZmF1bHRzIHRvIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIC8qKiBVc2VyIGVtYWlsIHVzZWQgdG8gZGVyaXZlIHRoZSBkZWZhdWx0IERhdGFicmlja3MgZGVzdGluYXRpb24uICovXG4gIHVzZXJFbWFpbD86IHN0cmluZztcbiAgLyoqIEJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZC4gRGVmYXVsdHMgdG8gMTAgTWlCLiAqL1xuICBtYXhEb3dubG9hZEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogSG93IGxvbmcgYSBwcm92aXNpb25lZCB0cmVlIGlzIHJldXNlZCBiZWZvcmUgaXRzIHNvdXJjZSBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIHNldmVuIGRheXM7IGAwYCByZS1kb3dubG9hZHMgb24gZXZlcnlcbiAgICogYm9vdC4gQSBwZXItc291cmNlIGByZWZyZXNoVHRsTXNgIHdpbnMgb3ZlciB0aGlzLlxuICAgKi9cbiAgcmVmcmVzaFR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSByZXNvbHZlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMge1xuICAvKipcbiAgICogRXh0cmEgTE9DQUwgc2tpbGwgc2NhbiBwYXRocyB0byBoYW5kIE1hc3RyYSAoYSB0ZW1wIGRpciBwZXIgc291cmNlIHRoYXRcbiAgICogY291bGRuJ3QgYmUgd3JpdHRlbiB0byBEYXRhYnJpY2tzKS4gRW1wdHkgd2hlbiBldmVyeXRoaW5nIGxhbmRlZCBpbiB0aGVcbiAgICogRGF0YWJyaWNrcyBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluIG1vdW50IGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbiBlYWNoIHNvdXJjZSB3YXMgd3JpdHRlbiB0bywgaWYgYW55LiAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lcyBvZiBldmVyeSBza2lsbCBkaXJlY3Rvcnkgbm93IGF2YWlsYWJsZSwgd2hldGhlciBpdCB3YXMgZG93bmxvYWRlZCBvblxuICAgKiB0aGlzIGJvb3Qgb3IgcmV1c2VkIGZyb20gYSBzdGlsbC1mcmVzaCB0cmVlIChzZWUge0BsaW5rIE1FVEFEQVRBX0ZJTEV9KS5cbiAgICovXG4gIHNraWxsTmFtZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoYXQgb25lIHNvdXJjZSdzIGxhc3QgZG93bmxvYWQgbGVmdCBiZWhpbmQsIGFzIHJlY29yZGVkIGluXG4gKiB7QGxpbmsgTUVUQURBVEFfRklMRX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxDYWNoZUVudHJ5IHtcbiAgLyoqIFRoZSBzb3VyY2Ugc3RyaW5nIHRoaXMgZW50cnkgd2FzIGRvd25sb2FkZWQgZnJvbSwgZm9yIHJlYWRhYmlsaXR5LiAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgLyoqIFdoZW4gdGhlIGRvd25sb2FkIGNvbXBsZXRlZCwgSVNPLTg2MDEuICovXG4gIGRvd25sb2FkZWRBdDogc3RyaW5nO1xuICAvKiogU2tpbGwgZGlyZWN0b3J5IG5hbWVzIHRoZSBkb3dubG9hZCBwcm9kdWNlZC4gKi9cbiAgc2tpbGxzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50LWFmZmVjdGluZyBwb2xpY3kgdGhhdCBkb3dubG9hZCB1c2VkLiBBbHNvIGZvbGRlZCBpbnRvIHRoZSBlbnRyeVxuICAgKiBLRVksIHNvIG5hcnJvd2luZyBgc2tpbGxzYCBvciBtb3ZpbmcgYHJlZmAgbWlzc2VzIHRoZSBjYWNoZSBpbnN0ZWFkIG9mXG4gICAqIHNpbGVudGx5IHNlcnZpbmcgdGhlIHByZXZpb3VzIHNlbGVjdGlvbi5cbiAgICovXG4gIHBvbGljeT86IHsgc2tpbGxzPzogc3RyaW5nW107IGV4cGVyaW1lbnRhbD86IGJvb2xlYW47IHJlZj86IHN0cmluZyB9O1xufVxuXG4vKiogVGhlIHtAbGluayBNRVRBREFUQV9GSUxFfSBkb2N1bWVudDogb25lIGVudHJ5IHBlciBwcm92aXNpb25lZCBzb3VyY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsc01ldGFkYXRhIHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBSZW1vdGVTa2lsbENhY2hlRW50cnk+O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogTm9ybWFsaXplIHRoZSBgcmVtb3RlU2tpbGxzYCBvcHRpb24gaW50byBhIGZsYXQgb3B0aW9ucyBiYWcuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKFxuICBvcHRpb246IFJlbW90ZVNraWxsc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJhZyA9IGlzUHJvdmlzaW9uT3B0aW9ucyhvcHRpb24pID8gb3B0aW9uIDogdW5kZWZpbmVkO1xuICBjb25zdCBzb3VyY2VzID0gdG9Tb3VyY2VMaXN0KGJhZyA/IGJhZy5zb3VyY2VzIDogKG9wdGlvbiBhcyBSZW1vdGVTa2lsbFNvdXJjZSkpO1xuICAvLyBBbiBlbXB0eSBsaXN0IGlzIHRoZSBzYW1lIGFzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsLlxuICBpZiAoIW9iamVjdC5pc09uZU9yTWFueShzb3VyY2VzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgLi4uYmFnLCBzb3VyY2VzIH07XG59XG5cbi8qKiBBIGBzb3VyY2VzYC1iZWFyaW5nIGJhZyBpcyB0aGUgdG9wLWxldmVsIG9wdGlvbnMgc2hhcGUsIG5vdCBhIHNpbmdsZSBzb3VyY2UuICovXG5mdW5jdGlvbiBpc1Byb3Zpc2lvbk9wdGlvbnModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHtcbiAgcmV0dXJuIG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgJiYgXCJzb3VyY2VzXCIgaW4gdmFsdWU7XG59XG5cbi8qKiBPbmUgc291cmNlIG9yIG1hbnksIGFzIGEgcGxhaW4gYXJyYXkuIEEgc291cmNlIGlzIG5ldmVyIGl0c2VsZiBhbiBhcnJheS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlTGlzdChcbiAgaW5wdXQ6IFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPixcbik6IFJlbW90ZVNraWxsU291cmNlW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBbLi4uaW5wdXRdIDogW2lucHV0XTtcbn1cblxuLyoqIEZsYXR0ZW4gYSBzb3VyY2UgZW50cnkgLSBzdHJpbmcsIGBVUkxgLCBgeyB1cmwgfWAsIG9yIG9wdGlvbnMgYmFnIC0gdG8gYSB7QGxpbmsgTm9ybWFsaXplZFNvdXJjZX0uICovXG5mdW5jdGlvbiB0b1NvdXJjZU9wdGlvbnMoc291cmNlOiBSZW1vdGVTa2lsbFNvdXJjZSk6IE5vcm1hbGl6ZWRTb3VyY2Uge1xuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHsgc291cmNlIH07XG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBVUkwpIHJldHVybiB7IHNvdXJjZTogc291cmNlLnRvU3RyaW5nKCkgfTtcbiAgaWYgKFwic291cmNlXCIgaW4gc291cmNlKSByZXR1cm4geyAuLi5zb3VyY2UsIHNvdXJjZTogdG9Tb3VyY2VTdHJpbmcoc291cmNlLnNvdXJjZSkgfTtcbiAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UudXJsIH07XG59XG5cbi8qKiBBIHtAbGluayBuZXQuVXJsTGlrZX0gYXMgdGhlIHBsYWluIHN0cmluZyB0aGUgc3RhZ2luZyBwYXRocyB3b3JrIHdpdGguICovXG5mdW5jdGlvbiB0b1NvdXJjZVN0cmluZyhzb3VyY2U6IG5ldC5VcmxMaWtlKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBzb3VyY2U7XG4gIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBVUkwgPyBzb3VyY2UudG9TdHJpbmcoKSA6IHNvdXJjZS51cmw7XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBzb3VyY2Ugc2VsZWN0cyB0aGUgYnVpbHQtaW4gRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbCBzZXQuICovXG5mdW5jdGlvbiBpc0FpVG9vbHNTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNvdXJjZS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gQUlUT09MU19TT1VSQ0U7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhY2hlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHBvbGljeSB0aGF0IGRlY2lkZXMgd2hhdCBhIHNvdXJjZSdzIGRvd25sb2FkIENPTlRBSU5TLlxuICpcbiAqIE9ubHkgdGhlc2UgdGhyZWUgY2hhbmdlIHRoZSByZXN1bHRpbmcgdHJlZSwgc28gb25seSB0aGVzZSBiZWxvbmcgaW4gdGhlIGNhY2hlXG4gKiBrZXkgLSBgZmFpbE9uRXJyb3JgIGFuZCBgbWF4RG93bmxvYWRCeXRlc2AgZ292ZXJuIGhvdyBhIGZhaWx1cmUgaXMgaGFuZGxlZCxcbiAqIG5vdCB3aGF0IGEgc3VjY2VzcyBwcm9kdWNlcy5cbiAqL1xuZnVuY3Rpb24gY2FjaGVQb2xpY3koc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeVtcInBvbGljeVwiXSB7XG4gIGNvbnN0IHNraWxscyA9IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscyk7XG4gIGNvbnN0IHBvbGljeSA9IHtcbiAgICAuLi4oc2tpbGxzLmxlbmd0aCA+IDAgPyB7IHNraWxsczogWy4uLnNraWxsc10uc29ydCgpIH0gOiB7fSksXG4gICAgLi4uKHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlID8geyBleHBlcmltZW50YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPyB7IHJlZjogc291cmNlT3B0aW9ucy5yZWYhLnRyaW0oKSB9IDoge30pLFxuICB9O1xuICByZXR1cm4gT2JqZWN0LmtleXMocG9saWN5KS5sZW5ndGggPiAwID8gcG9saWN5IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YWJsZSBpZGVudGl0eSBvZiBhIHNvdXJjZSBBTkQgaXRzIGNvbnRlbnQtYWZmZWN0aW5nIHBvbGljeS5cbiAqXG4gKiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbG9uZSB3b3VsZCBsZXQgYSBjaGFuZ2VkIGBza2lsbHNgIGZpbHRlciBvciBgcmVmYCByZWFkXG4gKiBiYWNrIHRoZSBwcmV2aW91cyBkb3dubG9hZCBmb3IgYSBkYXk7IGtleWluZyBvbiBib3RoIHR1cm5zIHRoYXQgaW50byBhIG1pc3MuXG4gKiBUaGUgc2tpbGwgbGlzdCBpcyBzb3J0ZWQgZmlyc3Qgc28gYSByZW9yZGVyZWQgYXJyYXkgaXMgc3RpbGwgdGhlIHNhbWUga2V5LlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc2guZm52SGFzaChcbiAgICBKU09OLnN0cmluZ2lmeSh7IHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsIHBvbGljeTogY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucykgPz8gbnVsbCB9KSxcbiAgKTtcbn1cblxuLyoqIFRoZSBlZmZlY3RpdmUgcmV1c2Ugd2luZG93OiBwZXItc291cmNlLCB0aGVuIHRvcC1sZXZlbCwgdGhlbiBzZXZlbiBkYXlzLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlZnJlc2hUdGwoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBudW1iZXIge1xuICByZXR1cm4gc291cmNlT3B0aW9ucy5yZWZyZXNoVHRsTXMgPz8gb3B0aW9ucy5yZWZyZXNoVHRsTXMgPz8gREVGQVVMVF9SRUZSRVNIX1RUTF9NUztcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBtZXRhZGF0YSBkb2N1bWVudCBhdCB0aGUgcm9vdCBvZiBhIHByb3Zpc2lvbmVkIHRyZWUsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIHRoZXJlIGlzIG5vbmUsIGl0IGlzIHVucmVhZGFibGUsIG9yIGl0IHdhcyB3cml0dGVuIGJ5IGEgc2hhcGUgdGhpc1xuICogdmVyc2lvbiBkb2VzIG5vdCBrbm93LlxuICpcbiAqIE5ldmVyIHRocm93czogYSBtaXNzaW5nIG9yIGNvcnJ1cHQgcmVjb3JkIGlzIGEgY2FjaGUgTUlTUywgd2hpY2ggY29zdHMgYVxuICogZG93bmxvYWQgLSB3aGlsZSBsZXR0aW5nIGl0IGZhaWwgd291bGQgdGFrZSBhcHAgc3RhcnR1cCBkb3duIG92ZXJcbiAqIGJvb2trZWVwaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTWV0YWRhdGEoZnM6IEZpbGVTeXN0ZW0pOiBQcm9taXNlPFJlbW90ZVNraWxsc01ldGFkYXRhIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKE1FVEFEQVRBX0ZJTEUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShNRVRBREFUQV9GSUxFLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KTtcbiAgICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlKHJhdywgdW5kZWZpbmVkKSBhcyBSZW1vdGVTa2lsbHNNZXRhZGF0YSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChwYXJzZWQpIHx8IHBhcnNlZC52ZXJzaW9uICE9PSBNRVRBREFUQV9WRVJTSU9OKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBvYmplY3QuaXNSZWNvcmQocGFyc2VkLnNvdXJjZXMpID8gcGFyc2VkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjYWNoZTp1bnJlYWRhYmxlXCIsIHsgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gZW50cnkgaXMgc3RpbGwgaW5zaWRlIGl0cyByZXVzZSB3aW5kb3cuXG4gKlxuICogQSBgdHRsTXNgIG9mIGAwYCBkaXNhYmxlcyByZXVzZSBvdXRyaWdodCwgYW5kIGFuIHVucGFyc2VhYmxlIG9yIEZVVFVSRVxuICogdGltZXN0YW1wIGNvdW50cyBhcyBzdGFsZSAtIGEgY2xvY2sgdGhhdCBtb3ZlZCBiYWNrd2FyZHMgc2hvdWxkIGNvc3Qgb25lXG4gKiBleHRyYSBkb3dubG9hZCwgbm90IHBpbiBhIHRyZWUgYXMgZnJlc2ggaW5kZWZpbml0ZWx5LlxuICovXG5mdW5jdGlvbiBpc0ZyZXNoKGVudHJ5OiBSZW1vdGVTa2lsbENhY2hlRW50cnksIHR0bE1zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKHR0bE1zIDw9IDAgfHwgIUFycmF5LmlzQXJyYXkoZW50cnkuc2tpbGxzKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkb3dubG9hZGVkQXQgPSBvYmplY3QudG9EYXRlKGVudHJ5LmRvd25sb2FkZWRBdCk7XG4gIGlmICghZG93bmxvYWRlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBkb3dubG9hZGVkQXQuZ2V0VGltZSgpO1xuICByZXR1cm4gYWdlID49IDAgJiYgYWdlIDwgdHRsTXM7XG59XG5cbi8qKlxuICogTWVyZ2Ugb25lIHNvdXJjZSdzIGVudHJ5IGludG8gdGhlIHRyZWUncyBtZXRhZGF0YSBkb2N1bWVudCwgcHJlc2VydmluZyB3aGF0XG4gKiBvdGhlciBzb3VyY2VzIHJlY29yZGVkIC0gdGhlIERhdGFicmlja3MgZGVzdGluYXRpb24gaXMgU0hBUkVELCBzbyBhIGJsaW5kXG4gKiBvdmVyd3JpdGUgd291bGQgZHJvcCBldmVyeSBzaWJsaW5nIHNvdXJjZSdzIHRpbWVzdGFtcCBhbmQgcmUtZG93bmxvYWQgdGhlXG4gKiBsb3Qgb24gdGhlIG5leHQgYm9vdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVNZXRhZGF0YShcbiAgZnM6IEZpbGVTeXN0ZW0sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyeTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCByZWFkTWV0YWRhdGEoZnMpO1xuICBjb25zdCBuZXh0OiBSZW1vdGVTa2lsbHNNZXRhZGF0YSA9IHtcbiAgICB2ZXJzaW9uOiBNRVRBREFUQV9WRVJTSU9OLFxuICAgIHNvdXJjZXM6IHsgLi4uY3VycmVudD8uc291cmNlcywgW2tleV06IGVudHJ5IH0sXG4gIH07XG4gIGF3YWl0IGZzLndyaXRlRmlsZShNRVRBREFUQV9GSUxFLCBgJHtKU09OLnN0cmluZ2lmeShuZXh0LCBudWxsLCAyKX1cXG5gLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbn1cblxuLyoqIFRoZSBzdGFibGUgbG9jYWwgdHJlZSBhIHNvdXJjZSBpcyByZWJ1aWx0IGludG8sIGtleWVkIGJ5IHtAbGluayBjYWNoZUtleX0uICovXG5mdW5jdGlvbiBsb2NhbFNraWxsc0ZTKGtleTogc3RyaW5nKTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgcmV0dXJuIGxvY2FsRlMudG1wRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCk7XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemUgZXZlcnkgY29uZmlndXJlZCByZW1vdGUgc2tpbGwgc291cmNlIGF0IGFwcCBzdGFydHVwLlxuICpcbiAqIFdyaXRlcyBlYWNoIHJlc29sdmVkIGBTS0lMTC5tZGAgdHJlZSB0byB0aGUgRGF0YWJyaWNrcyB1c2VyIEFzc2lzdGFudCBza2lsbHNcbiAqIGZvbGRlciB3aGVuIGEgd3JpdGFibGUgd29ya3NwYWNlIGlzIGF2YWlsYWJsZSwgZWxzZSB1bmRlclxuICoge0BsaW5rIGxvY2FsRlMudG1wRlN9IHJldHVybmVkIGluIHtAbGluayBQcm92aXNpb25lZFJlbW90ZVNraWxscy5sb2NhbFNraWxsUGF0aHN9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlzaW9uUmVtb3RlU2tpbGxzKFxuICBvcHRpb246IFJlbW90ZVNraWxsc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8UHJvdmlzaW9uZWRSZW1vdGVTa2lsbHM+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IG5vcm1hbGl6ZVJlbW90ZVNraWxsc09wdGlvbihvcHRpb24pO1xuICBjb25zdCBlbXB0eTogUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMgPSB7IGxvY2FsU2tpbGxQYXRoczogW10sIHNraWxsTmFtZXM6IFtdIH07XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIGVtcHR5O1xuXG4gIGNvbnN0IGZhaWxEZWZhdWx0ID0gb3B0aW9ucy5mYWlsT25FcnJvciAhPT0gZmFsc2U7XG4gIGNvbnN0IGNsaWVudCA9IG9wdGlvbnMuY2xpZW50ID8/IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAgLy8gUHJvYmVkIHJhdGhlciB0aGFuIGFzc3VtZWQ6IGFuIGlkZW50aXR5IHRoYXQgY2Fubm90IHdyaXRlIHRoZSB3b3Jrc3BhY2VcbiAgLy8gdHJlZSBmYWxscyBiYWNrIHRvIHRoZSBsb2NhbCBvbmUgaW5zdGVhZCBvZiBmYWlsaW5nIHN0YXJ0dXAuIFRoZSBwcm9iZSBhbHNvXG4gIC8vIGNyZWF0ZXMgdGhlIHJvb3QsIHdoaWNoIHRoZSBmaXJzdCBjYWNoZSBSRUFEIG5lZWRzIC0gYGNvcHlTa2lsbERpcnNgIHdvdWxkXG4gIC8vIG90aGVyd2lzZSBiZSB0aGUgZmlyc3QgdGhpbmcgdG8gY3JlYXRlIGl0LCB3aGljaCBpcyB0b28gbGF0ZS5cbiAgY29uc3QgcmVxdWVzdGVkQmFzZVBhdGggPSByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKG9wdGlvbnMsIGNsaWVudCk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gcmVxdWVzdGVkQmFzZVBhdGhcbiAgICA/IGF3YWl0IG9wZW5Xcml0YWJsZVdvcmtzcGFjZShyZXF1ZXN0ZWRCYXNlUGF0aCwgY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudClcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZGF0YWJyaWNrc0Jhc2VQYXRoID0gZGVzdGluYXRpb24gPyByZXF1ZXN0ZWRCYXNlUGF0aCA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraWxsTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBzdGFnaW5nOiBMb2NhbEZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ7XG4gIGxldCB3b3Jrc3BhY2VVcGRhdGVkID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnNvdXJjZXMpID8gb3B0aW9ucy5zb3VyY2VzIDogW29wdGlvbnMuc291cmNlc107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3VyY2VzKSB7XG4gICAgICBjb25zdCBzb3VyY2VPcHRpb25zID0gdG9Tb3VyY2VPcHRpb25zKGVudHJ5KTtcbiAgICAgIGNvbnN0IGZhaWxPbkVycm9yID0gc291cmNlT3B0aW9ucy5mYWlsT25FcnJvciA/PyBmYWlsRGVmYXVsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFdoZXJlIHRoaXMgc291cmNlJ3MgYm9va2tlZXBpbmcgbGl2ZXM6IHRoZSBzaGFyZWQgRGF0YWJyaWNrcyB0cmVlLCBvclxuICAgICAgICAvLyB0aGUgc291cmNlJ3Mgb3duIHN0YWJsZSBsb2NhbCBkaXIuXG4gICAgICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHNvdXJjZU9wdGlvbnMpO1xuICAgICAgICBjb25zdCBjYWNoZUZTID0gZGVzdGluYXRpb24gPz8gbG9jYWxTa2lsbHNGUyhrZXkpO1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHJlYWRNZXRhZGF0YShjYWNoZUZTKTtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gbWV0YWRhdGE/LnNvdXJjZXNba2V5XTtcbiAgICAgICAgaWYgKGNhY2hlZCAmJiBpc0ZyZXNoKGNhY2hlZCwgcmVzb2x2ZVJlZnJlc2hUdGwoc291cmNlT3B0aW9ucywgb3B0aW9ucykpKSB7XG4gICAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLmNhY2hlZC5za2lsbHMpO1xuICAgICAgICAgIGlmICghZGVzdGluYXRpb24pIGxvY2FsU2tpbGxQYXRocy5wdXNoKGNhY2hlRlMucm9vdCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGwgcmVhZHlcIiwge1xuICAgICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBkYXRhYnJpY2tzQmFzZVBhdGggPz8gY2FjaGVGUy5yb290LFxuICAgICAgICAgICAgZG93bmxvYWRlZEF0OiBjYWNoZWQuZG93bmxvYWRlZEF0LFxuICAgICAgICAgICAgc2tpbGxzOiBjYWNoZWQuc2tpbGxzLFxuICAgICAgICAgICAgY2FjaGVkOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIHJlbW90ZSBza2lsbFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YWdpbmcgPz89IGF3YWl0IGluaXRpYWxpemVkU2NyYXRjaChcIm1hc3RyYS1yZW1vdGUtc2tpbGxzXCIpO1xuICAgICAgICBjb25zdCBzdGFnZWREaXIgPSBhd2FpdCBzdGFnZVNvdXJjZShzb3VyY2VPcHRpb25zLCBzdGFnaW5nLnJvb3QsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFnZWQgPSBhd2FpdCBjb2xsZWN0U2tpbGxEaXJzKHN0YWdlZERpcik7XG4gICAgICAgIGlmIChzdGFnZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBTS0lMTC5tZCBmb3VuZCBmb3Igc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IGNhY2hlUG9saWN5KHNvdXJjZU9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSA9IHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGRvd25sb2FkZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHNraWxsczogc3RhZ2VkLm1hcCgoZGlyKSA9PiBkaXIubmFtZSksXG4gICAgICAgICAgLi4uKHBvbGljeSA/IHsgcG9saWN5IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkYXRhYnJpY2tzQmFzZVBhdGgpIHtcbiAgICAgICAgICBhd2FpdCByZW1vdmVEZWxldGVkU2tpbGxzKGRlc3RpbmF0aW9uLCBrZXksIG1ldGFkYXRhLCByZWNvcmQuc2tpbGxzKTtcbiAgICAgICAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uLCBzdGFnZWQpO1xuICAgICAgICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIGNvcHkgbGFuZHM6IGEgbWV0YWRhdGEgZW50cnkgd3JpdHRlbiBmaXJzdCB3b3VsZFxuICAgICAgICAgIC8vIG1hcmsgYSBmYWlsZWQgcHJvdmlzaW9uIGFzIGZyZXNoIGFuZCBzdXBwcmVzcyB0aGUgcmV0cnkgZm9yIGEgZGF5LlxuICAgICAgICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoZGVzdGluYXRpb24sIGtleSwgcmVjb3JkKTtcbiAgICAgICAgICB3b3Jrc3BhY2VVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NhbFNraWxsUGF0aHMucHVzaChhd2FpdCBwZXJzaXN0TG9jYWxseShrZXksIHN0YWdlZCwgcmVjb3JkKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLnJlY29yZC5za2lsbHMpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbCBpbnN0YWxsZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZGVzdGluYXRpb246IGRhdGFicmlja3NCYXNlUGF0aCA/PyBsb2NhbFNraWxsUGF0aHMuYXQoLTEpLFxuICAgICAgICAgIHNraWxsczogcmVjb3JkLnNraWxscyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYGZhaWxlZCB0byBwcm92aXNpb24gcmVtb3RlIHNraWxsIHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCI6ICR7ZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKX1gLFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyb3JVdGlscy50b0Vycm9yKGVycikgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci53YXJuKFwic291cmNlOnNraXBwZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoc3RhZ2luZykge1xuICAgICAgYXdhaXQgcm0oc3RhZ2luZy5yb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBpZiAod29ya3NwYWNlVXBkYXRlZCAmJiBjbGllbnQ/LmNvbmZpZz8uZ2V0SG9zdCkge1xuICAgIGF3YWl0IGNsZWFyV29ya3NwYWNlU2tpbGxDYWNoZSh7XG4gICAgICBob3N0OiAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4geyBsb2NhbFNraWxsUGF0aHMsIGRhdGFicmlja3NCYXNlUGF0aCwgc2tpbGxOYW1lcyB9O1xufVxuXG4vKiogUmVtb3ZlIGRpcmVjdG9yaWVzIGRyb3BwZWQgYnkgb25lIHNvdXJjZSB1bmxlc3MgYW5vdGhlciBzb3VyY2Ugc3RpbGwgb3ducyB0aGVtLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVsZXRlZFNraWxscyhcbiAgZGVzdGluYXRpb246IEZpbGVTeXN0ZW0sXG4gIGtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogUmVtb3RlU2tpbGxzTWV0YWRhdGEgfCB1bmRlZmluZWQsXG4gIG5leHRTa2lsbHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByZXZpb3VzID0gbWV0YWRhdGE/LnNvdXJjZXNba2V5XT8uc2tpbGxzID8/IFtdO1xuICBjb25zdCByZXRhaW5lZCA9IG5ldyBTZXQobmV4dFNraWxscyk7XG4gIGZvciAoY29uc3QgW3NvdXJjZUtleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhPy5zb3VyY2VzID8/IHt9KSkge1xuICAgIGlmIChzb3VyY2VLZXkgPT09IGtleSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiBlbnRyeS5za2lsbHMpIHJldGFpbmVkLmFkZChza2lsbCk7XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcHJldmlvdXNcbiAgICAgIC5maWx0ZXIoKHNraWxsKSA9PiAhcmV0YWluZWQuaGFzKHNraWxsKSlcbiAgICAgIC5tYXAoKHNraWxsKSA9PiBkZXN0aW5hdGlvbi5ybWRpcihza2lsbCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKSxcbiAgKTtcbn1cblxuLyoqIFByb2JlIGZpbGUge0BsaW5rIG9wZW5Xcml0YWJsZVdvcmtzcGFjZX0gd3JpdGVzIGFuZCByZW1vdmVzLiAqL1xuY29uc3QgV1JJVEVfUFJPQkVfRklMRSA9IFwiLmRieC10b29scy13cml0ZS1wcm9iZVwiO1xuXG4vKipcbiAqIE9wZW4gdGhlIERhdGFicmlja3Mgc2tpbGxzIGRlc3RpbmF0aW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaWRlbnRpdHlcbiAqIGNhbm5vdCB3cml0ZSB0aGVyZS5cbiAqXG4gKiBUaGUgZGVmYXVsdCBkZXN0aW5hdGlvbiAoYC9Xb3Jrc3BhY2UvLmFzc2lzdGFudC9za2lsbHNgKSBpcyBjb21tb25seVxuICogYWRtaW5zLW9ubHksIGFuZCBhbiBhcHAgc2VydmljZSBwcmluY2lwYWwgaXMgbm90IGFuIGFkbWluIC0gc28gYSBEYXRhYnJpY2tzXG4gKiBBcHAgd3JpdGluZyB0aGVyZSBmYWlscyB3aXRoIGBSRVNPVVJDRV9ET0VTX05PVF9FWElTVGAsIHdoaWNoIGlzIGhvdyB0aGVcbiAqIHdvcmtzcGFjZSBBUEkgcmVwb3J0cyBhIHBhdGggdGhlIGNhbGxlciBpcyBub3QgYWxsb3dlZCB0byBzZWUuIFRoYXQgaXMgYSBmYWN0XG4gKiBhYm91dCBXSEVSRSB0aGUgdHJlZSBpcyBzdG9yZWQsIG5vdCBhYm91dCB3aGV0aGVyIHRoZSBza2lsbHMgYXJlIHVzYWJsZSwgc28gaXRcbiAqIGRlZ3JhZGVzIHRvIHRoZSBsb2NhbCB0cmVlIChoYW5kZWQgdG8gTWFzdHJhIGFzIGFuIGV4dHJhIHNjYW4gcGF0aCkgcmF0aGVyXG4gKiB0aGFuIHRha2luZyBhcHAgc3RhcnR1cCBkb3duIG92ZXIgYm9va2tlZXBpbmcgbG9jYXRpb24uXG4gKlxuICogVGhlIHByb2JlIGlzIGEgcmVhbCB3cml0ZTogYG1rZGlyc2Agc3VjY2VlZHMgb24gYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGV2ZW4gZm9yXG4gKiBhbiBpZGVudGl0eSB0aGF0IGNhbm5vdCB3cml0ZSBpbnRvIGl0LCBzbyBpbml0IGFsb25lIHByb3ZlcyBub3RoaW5nLiBSZW1vdmluZ1xuICogdGhlIHByb2JlIGZpbGUgaXMgYmVzdC1lZmZvcnQgLSBhIGZhaWxlZCBjbGVhbnVwIG11c3Qgbm90IGRlY2lkZSB3cml0YWJpbGl0eS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlbldyaXRhYmxlV29ya3NwYWNlKFxuICBiYXNlUGF0aDogc3RyaW5nLFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8RGF0YWJyaWNrc0ZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgIGNsaWVudDogd29ya3NwYWNlQ2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KGNsaWVudCksXG4gICAgcm9vdDogYmFzZVBhdGgsXG4gICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgIGNyZWF0ZVJvb3Q6IHRydWUsXG4gIH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLmluaXQoKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoV1JJVEVfUFJPQkVfRklMRSwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJkZXN0aW5hdGlvbjp1bndyaXRhYmxlXCIsIHtcbiAgICAgIGRlc3RpbmF0aW9uOiBiYXNlUGF0aCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgYXdhaXQgZnMuZGVsZXRlRmlsZShXUklURV9QUk9CRV9GSUxFLCB7IGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIHJldHVybiBmcztcbn1cblxuLyoqIFJlc29sdmUgdGhlIERhdGFicmlja3MgQXNzaXN0YW50IHNraWxscyBkZXN0aW5hdGlvbiwgb3IgYHVuZGVmaW5lZGAgZm9yIGxvY2FsIHRlbXAuICovXG5mdW5jdGlvbiByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNsaWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoKSByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoKTtcbiAgY29uc3QgZW1haWwgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG9wdGlvbnMudXNlckVtYWlsKTtcbiAgLy8gQSBuYW1lZCB1c2VyIHRhcmdldHMgdGhlaXIgcGVyc29uYWwgQXNzaXN0YW50IHRyZWUgKHRoZSBcInNhdmUgYSBza2lsbFwiXG4gIC8vIHRhcmdldCk7IG90aGVyd2lzZSB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluXG4gIC8vIEFzc2lzdGFudC1za2lsbHMgbW91bnQgYWxyZWFkeSBzY2Fucy5cbiAgcmV0dXJuIGVtYWlsID8gdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpIDogQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSDtcbn1cblxuLyoqXG4gKiBTdGFnZSBvbmUgc291cmNlIGludG8gYSBmcmVzaCBkaXIgdW5kZXIgYHN0YWdpbmdSb290YCwgcHJlZmVycmluZyB0aGUgb3B0aW9uYWxcbiAqIGBza2lsbHNgIENMSSBhbmQgZmFsbGluZyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVNvdXJjZShcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgc3RhZ2luZ1Jvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHRhcmdldCA9IGpvaW4oc3RhZ2luZ1Jvb3QsIGBzcmMtJHtoYXNoLmlkKCl9YCk7XG4gIGF3YWl0IG1rZGlyKHRhcmdldCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIEFJIFRvb2xzIHJlc29sdmVzIGZyb20gYSBrbm93biByZXBvIGxheW91dCwgc28gaXQgbmV2ZXIgbmVlZHMgdGhlIENMSS5cbiAgaWYgKGlzQWlUb29sc1NvdXJjZShzb3VyY2VPcHRpb25zLnNvdXJjZSkpIHJldHVybiBzdGFnZUFpVG9vbHMoc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbiAgY29uc3QgdmlhQ2xpID0gYXdhaXQgc3RhZ2VWaWFTa2lsbHNDbGkoc291cmNlT3B0aW9ucywgdGFyZ2V0KTtcbiAgaWYgKHZpYUNsaSkgcmV0dXJuIHZpYUNsaTtcbiAgcmV0dXJuIHN0YWdlVmlhRmV0Y2goc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZSB0aGUgRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbHMgaW50byBgdGFyZ2V0YC5cbiAqXG4gKiBSZWFkcyB0aGUgcmVwbydzIG93biBnZW5lcmF0ZWQgYG1hbmlmZXN0Lmpzb25gICh3aGljaCBuYW1lcyBlYWNoIHNraWxsJ3NcbiAqIGZpbGVzIGFuZCB3aGV0aGVyIGl0IGxpdmVzIHVuZGVyIGBza2lsbHMvYCBvciBgZXhwZXJpbWVudGFsL2ApIGFuZCBkb3dubG9hZHNcbiAqIHRoZW0gLSB0aGUgc2FtZSB0aGluZyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGxgIGRvZXMsIG1pbnVzIHRoZSBDTEkgYW5kXG4gKiBtaW51cyBhbnkgRGF0YWJyaWNrcyBhdXRoLCBzaW5jZSB0aGUgcmVwbyBpcyBwdWJsaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlQWlUb29scyhcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBtYXhCeXRlcyA9IHJlc29sdmVNYXhCeXRlcyhzb3VyY2VPcHRpb25zLCBvcHRpb25zKTtcbiAgY29uc3QgcmVmID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPz8gQUlUT09MU19SRUY7XG4gIGNvbnN0IG1hbmlmZXN0ID0ganNvbi5wYXJzZShcbiAgICAoYXdhaXQgZG93bmxvYWQoYWlUb29sc1Jhd1VybChyZWYsIFwibWFuaWZlc3QuanNvblwiKSwgbWF4Qnl0ZXMpKS50b1N0cmluZyhcInV0ZjhcIiksXG4gICAgdW5kZWZpbmVkLFxuICApIGFzIEFpVG9vbHNNYW5pZmVzdCB8IHVuZGVmaW5lZDtcblxuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0KHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykpO1xuICBjb25zdCBzZWxlY3RlZCA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0Py5za2lsbHMgPz8ge30pLmZpbHRlcigoW25hbWUsIGVudHJ5XSkgPT5cbiAgICB3YW50ZWQuc2l6ZSA+IDBcbiAgICAgID8gd2FudGVkLmhhcyhuYW1lKVxuICAgICAgOiBlbnRyeS5yZXBvX2RpciAhPT0gXCJleHBlcmltZW50YWxcIiB8fCBzb3VyY2VPcHRpb25zLmV4cGVyaW1lbnRhbCA9PT0gdHJ1ZSxcbiAgKTtcbiAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gbWF0Y2hpbmcgc2tpbGxzIGluICR7QUlUT09MU19SRVBPfUAke3JlZn1gKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gc2VsZWN0ZWQuZmxhdE1hcCgoW25hbWUsIGVudHJ5XSkgPT5cbiAgICAoZW50cnkuZmlsZXMgPz8gW10pLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIHVybDogYWlUb29sc1Jhd1VybChyZWYsIGAke2VudHJ5LnJlcG9fZGlyID8/IFwic2tpbGxzXCJ9LyR7bmFtZX0vJHtmaWxlfWApLFxuICAgICAgcGF0aDogam9pbih0YXJnZXQsIG5hbWUsIC4uLmZpbGUuc3BsaXQoXCIvXCIpKSxcbiAgICB9KSksXG4gICk7XG4gIGF3YWl0IGFzeW5jVXRpbHMubWFwQ29uY3VycmVudChcbiAgICBmaWxlcyxcbiAgICBhc3luYyAoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGRvd25sb2FkKGl0ZW0udXJsLCBtYXhCeXRlcyk7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKGl0ZW0ucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGl0ZW0ucGF0aCwgYm9keSk7XG4gICAgfSxcbiAgICB7IGNvbmN1cnJlbmN5OiBBSVRPT0xTX0NPTkNVUlJFTkNZIH0sXG4gICk7XG5cbiAgbG9nZ2VyLmRlYnVnKFwiYWl0b29sczpzdGFnZWRcIiwgeyByZWYsIHNraWxsczogc2VsZWN0ZWQubGVuZ3RoLCBmaWxlczogZmlsZXMubGVuZ3RoIH0pO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogUmF3LWNvbnRlbnQgVVJMIGZvciBhIHBhdGggaW4gdGhlIEFJIFRvb2xzIHJlcG8gYXQgYHJlZmAuICovXG5mdW5jdGlvbiBhaVRvb2xzUmF3VXJsKHJlZjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke0FJVE9PTFNfUkVQT30vJHtyZWZ9LyR7cGF0aH1gO1xufVxuXG4vKipcbiAqIENvcHkgYSBzb3VyY2UgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBgc2tpbGxzYCBDTEkgd2hlbiBpdCBpcyBpbnN0YWxsZWQuXG4gKiBSZXR1cm5zIHRoZSBkaXIgaG9sZGluZyB0aGUgY29waWVkIGBTS0lMTC5tZGAgdHJlZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gKiBDTEkgaXMgYWJzZW50IChzbyB0aGUgY2FsbGVyIGNhbiBmYWxsIGJhY2sgdG8gYSBmZXRjaCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhU2tpbGxzQ2xpKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICB0YXJnZXQ6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNsaSA9IGF3YWl0IHJlc29sdmVTa2lsbHNDbGkoKTtcbiAgaWYgKCFjbGkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAuLi5jbGkuYXJncyxcbiAgICBcImFkZFwiLFxuICAgIHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgIFwiLS1hZ2VudFwiLFxuICAgIFNLSUxMU19DTElfQUdFTlQsXG4gICAgXCItLWNvcHlcIixcbiAgICBcIi15XCIsXG4gIF07XG4gIGZvciAoY29uc3Qgc2tpbGwgb2Ygc3RyaW5nVXRpbHMucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSkge1xuICAgIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgc2tpbGwpO1xuICB9XG4gIGlmIChzdHJpbmdVdGlscy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpLmxlbmd0aCA9PT0gMCkgYXJncy5wdXNoKFwiLS1za2lsbFwiLCBcIipcIik7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYy5zcGF3bihjbGkuY29tbWFuZCwgYXJncywge1xuICAgIGN3ZDogdGFyZ2V0LFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICBjaGVjazogZmFsc2UsXG4gIH0pO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNraWxscyBDTEkgZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSk6ICR7cmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0fWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gam9pbih0YXJnZXQsIC4uLlNLSUxMU19DTElfTEFZT1VUKTtcbn1cblxuLyoqXG4gKiBMb2NhdGUgdGhlIG9wdGlvbmFsIGBza2lsbHNgIENMSSBiaW4sIHJlc29sdmVkIGZyb20gVEhJUyBwYWNrYWdlJ3MgbW9kdWxlXG4gKiBncmFwaC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwZWVyIGRlcCBpc24ndCBpbnN0YWxsZWQsIHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gYSBkaXJlY3QgZmV0Y2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbHNDbGkoKTogUHJvbWlzZTx7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgcGtnUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShcInNraWxscy9wYWNrYWdlLmpzb25cIik7XG4gICAgY29uc3QgYmluID0gam9pbihwa2dQYXRoLCBcIi4uXCIsIFwiYmluXCIsIFwiY2xpLm1qc1wiKTtcbiAgICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhiaW4pKSByZXR1cm4geyBjb21tYW5kOiBwcm9jZXNzLmV4ZWNQYXRoLCBhcmdzOiBbYmluXSB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBwZWVyIGRlcCBhYnNlbnQgb3IgdW5yZXNvbHZhYmxlIC0gZmV0Y2ggZmFsbGJhY2sgaGFuZGxlcyBpdFxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmV0Y2ggYSBzb3VyY2UgVVJMIGFuZCB3cml0ZSB0aGUgZG93bmxvYWRlZCBgU0tJTEwubWRgIHVuZGVyIGB0YXJnZXRgLlxuICogVXNlZCB3aGVuIHRoZSBgc2tpbGxzYCBDTEkgaXNuJ3QgaW5zdGFsbGVkOyBzdXBwb3J0cyBhIGRpcmVjdCBgU0tJTEwubWRgIFVSTC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VWaWFGZXRjaChcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcihzb3VyY2VPcHRpb25zLnNvdXJjZSk7XG4gIGlmICghdXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCIgaXMgbm90IGEgVVJMIGFuZCB0aGUgb3B0aW9uYWwgXCJza2lsbHNcIiBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWRgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgZG93bmxvYWQodXJsLnRvU3RyaW5nKCksIHJlc29sdmVNYXhCeXRlcyhzb3VyY2VPcHRpb25zLCBvcHRpb25zKSk7XG4gIGNvbnN0IG5hbWUgPSBzdHJpbmdVdGlscy50b1NsdWcoZGVyaXZlU2tpbGxOYW1lKHVybC50b1N0cmluZygpKSkgfHwgXCJyZW1vdGUtc2tpbGxcIjtcbiAgY29uc3Qgc2tpbGxEaXIgPSBqb2luKHRhcmdldCwgbmFtZSk7XG4gIGF3YWl0IG1rZGlyKHNraWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oc2tpbGxEaXIsIFwiU0tJTEwubWRcIiksIGJ1ZmZlcik7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKiBUaGUgZWZmZWN0aXZlIGRvd25sb2FkIGNlaWxpbmc6IHBlci1zb3VyY2UsIHRoZW4gdG9wLWxldmVsLCB0aGVuIHRoZSBkZWZhdWx0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1heEJ5dGVzKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNvdXJjZU9wdGlvbnMubWF4RG93bmxvYWRCeXRlcyA/PyBvcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVM7XG59XG5cbi8qKiBHRVQgYSBVUkwsIGZhaWxpbmcgbG91ZGx5IG9uIGEgbm9uLTJ4eCBzdGF0dXMgb3IgYW4gb3ZlcnNpemVkIGJvZHkuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZCh1cmw6IHN0cmluZywgbWF4Qnl0ZXM6IG51bWJlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KERFRkFVTFRfRE9XTkxPQURfVElNRU9VVF9NUyksXG4gIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGZhaWxlZCAoJHt1cmx9KTogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpfWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7dXJsfSlgKTtcbiAgfVxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoID4gbWF4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGV4Y2VlZHMgJHttYXhCeXRlc30gYnl0ZXMgKCR7dXJsfSlgKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyO1xufVxuXG4vKiogRGVyaXZlIGEgc2tpbGwgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGRvd25sb2FkIFVSTCdzIGxhc3QgcGF0aCBzZWdtZW50LiAqL1xuZnVuY3Rpb24gZGVyaXZlU2tpbGxOYW1lKHVybFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIodXJsU3RyaW5nKTtcbiAgY29uc3QgbGFzdCA9IHVybD8ucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA/PyBcIlwiO1xuICByZXR1cm4gbGFzdC5yZXBsYWNlKC9cXC4obWR8emlwfHRhcnx0Z3p8Z3opJC9pLCBcIlwiKTtcbn1cblxuLyoqIEEgc2tpbGwgZGlyZWN0b3J5IChob2xkaW5nIGEgYFNLSUxMLm1kYCkgc3RhZ2VkIG9uIGxvY2FsIGRpc2suICovXG5pbnRlcmZhY2UgU3RhZ2VkU2tpbGxEaXIge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFic29sdXRlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgc2tpbGwgZGlyZWN0b3J5IHVuZGVyIGByb290YDogYSBgcm9vdC9TS0lMTC5tZGAgKHJvb3QgSVMgdGhlXG4gKiBza2lsbCkgb3IgZWFjaCBpbW1lZGlhdGUgY2hpbGQgZGlyIHRoYXQgY29udGFpbnMgYSBgU0tJTEwubWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0U2tpbGxEaXJzKHJvb3Q6IHN0cmluZyk6IFByb21pc2U8U3RhZ2VkU2tpbGxEaXJbXT4ge1xuICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKHJvb3QpKSkgcmV0dXJuIFtdO1xuICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhqb2luKHJvb3QsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgY29uc3QgbmFtZSA9IHBvc2l4LmJhc2VuYW1lKHJvb3Quc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgcmV0dXJuIFt7IG5hbWUsIGFic29sdXRlUGF0aDogcm9vdCB9XTtcbiAgfVxuICBjb25zdCBkaXJzOiBTdGFnZWRTa2lsbERpcltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgcmVhZGRpcihyb290LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRpciA9IGpvaW4ocm9vdCwgZW50cnkubmFtZSk7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihkaXIsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgICBkaXJzLnB1c2goeyBuYW1lOiBlbnRyeS5uYW1lLCBhYnNvbHV0ZVBhdGg6IGRpciB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpcnM7XG59XG5cbi8qKlxuICogQ29weSBldmVyeSBzdGFnZWQgc2tpbGwgZGlyZWN0b3J5IGludG8ge0BsaW5rIGRlc3RpbmF0aW9ufSwgcHJlc2VydmluZyB0aGVcbiAqIGA8c2tpbGw+LzxyZWxhdGl2ZT5gIGxheW91dC4gVGhlIGRlc3RpbmF0aW9uIGlzIGp1c3QgYSB7QGxpbmsgRmlsZVN5c3RlbX0sXG4gKiBzbyB0aGUgRGF0YWJyaWNrcyBBc3Npc3RhbnQgdHJlZSBhbmQgdGhlIGxvY2FsIGZhbGxiYWNrIHNoYXJlIG9uZSBjb3BpZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlTa2lsbERpcnMoZGVzdGluYXRpb246IEZpbGVTeXN0ZW0sIGRpcnM6IFN0YWdlZFNraWxsRGlyW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZGVzdGluYXRpb24uaW5pdCgpO1xuICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG4gICAgZm9yIChjb25zdCByZWxhdGl2ZSBvZiBmaW5kLmZpbmRGaWxlcyhcIioqLypcIiwgeyBjd2Q6IGRpci5hYnNvbHV0ZVBhdGgsIG5vZGlyOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZWFkRmlsZShqb2luKGRpci5hYnNvbHV0ZVBhdGgsIHJlbGF0aXZlKSk7XG4gICAgICBjb25zdCBza2lsbFBhdGggPSBwb3NpeC5qb2luKGRpci5uYW1lLCByZWxhdGl2ZS5zcGxpdCgvW1xcXFwvXS8pLmpvaW4oXCIvXCIpKTtcbiAgICAgIGF3YWl0IGRlc3RpbmF0aW9uLndyaXRlRmlsZShza2lsbFBhdGgsIGJ1ZmZlciwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29weSBzdGFnZWQgc2tpbGwgZGlycyBpbnRvIGEgU1RBQkxFIGxvY2FsIHRyZWUga2V5ZWQgYnkgdGhlIHNvdXJjZSwgYW5kXG4gKiByZXR1cm4gaXRzIHJvb3QgcGF0aC5cbiAqXG4gKiBBIGdpdmVuIHNvdXJjZSByZXNvbHZlcyB0byB0aGUgc2FtZSBjb250ZW50IG9uIGFsbW9zdCBldmVyeSBib290LCBzbyBlYWNoXG4gKiBvbmUgb3ducyBhIGRpcmVjdG9yeSBuYW1lZCBmb3IgaXRzIHtAbGluayBjYWNoZUtleX0gcmF0aGVyIHRoYW4gbGVhdmluZyBhXG4gKiBmcmVzaCBzY3JhdGNoIGRpciBiZWhpbmQgcGVyIHJlc3RhcnQuIEtleWluZyBvbiB0aGUgc291cmNlIGFuZCBpdHMgcG9saWN5XG4gKiAobm90IHRoZSBjb250ZW50KSBpcyB3aGF0IGtlZXBzIHR3byBkaWZmZXJlbnQgc291cmNlcyBmcm9tIG92ZXJ3cml0aW5nIGVhY2hcbiAqIG90aGVyLlxuICpcbiAqIFRoZSBtZXRhZGF0YSBpcyB3cml0dGVuIElOU0lERSB0aGUgcmVidWlsZCByYXRoZXIgdGhhbiBhZnRlciBpdDogYHJlYnVpbGRGU2BcbiAqIHJlcGxhY2VzIHRoZSBzdGFibGUgcm9vdCB3aG9sZXNhbGUsIHNvIGFueXRoaW5nIHdyaXR0ZW4gYWZ0ZXJ3YXJkcyB3b3VsZFxuICogc3Vydml2ZSBvbmx5IHVudGlsIHRoZSBuZXh0IHJlZnJlc2gsIGFuZCBhbnl0aGluZyB3cml0dGVuIGJlZm9yZSB3b3VsZCBiZVxuICogdGhyb3duIGF3YXkgYnkgdGhlIHN3YXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RMb2NhbGx5KFxuICBrZXk6IHN0cmluZyxcbiAgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSxcbiAgcmVjb3JkOiBSZW1vdGVTa2lsbENhY2hlRW50cnksXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBzdGFibGUgPSBhd2FpdCBsb2NhbEZTLnJlYnVpbGRGUyhgJHtMT0NBTF9TS0lMTFNfRElSfS8ke2tleX1gLCBhc3luYyAoc2NyYXRjaCkgPT4ge1xuICAgIGF3YWl0IGNvcHlTa2lsbERpcnMoc2NyYXRjaCwgZGlycyk7XG4gICAgYXdhaXQgd3JpdGVNZXRhZGF0YShzY3JhdGNoLCBrZXksIHJlY29yZCk7XG4gIH0pO1xuICByZXR1cm4gc3RhYmxlLnJvb3Q7XG59XG5cbi8qKlxuICogQSBzY3JhdGNoIGZpbGVzeXN0ZW0gd2hvc2Ugcm9vdCBleGlzdHMgb24gZGlzaywgZm9yIHRoZSBwYXRocyB0aGF0IGhhbmQgYVxuICogcmVhbCBkaXJlY3RvcnkgdG8gYG5vZGU6ZnNgIG9yIGEgY2hpbGQgcHJvY2VzcyByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoXG4gKiB0aGUge0BsaW5rIEZpbGVTeXN0ZW19IEFQSS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZWRTY3JhdGNoKHByZWZpeDogc3RyaW5nKTogUHJvbWlzZTxMb2NhbEZpbGVTeXN0ZW0+IHtcbiAgY29uc3Qgc2NyYXRjaCA9IGxvY2FsRlMuc2NyYXRjaEZTKHByZWZpeCk7XG4gIGF3YWl0IHNjcmF0Y2guaW5pdCgpO1xuICByZXR1cm4gc2NyYXRjaDtcbn1cblxuLyoqIEJlc3QtZWZmb3J0IGV4aXN0ZW5jZSBjaGVjay4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgc3RhdChwYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=