@dbx-tools/cache 0.9.150 → 0.9.151

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -37,6 +37,8 @@ await closeCache(cache);
37
37
  Pass ordered Keyv-compatible `levels` to `createCache` when an application needs
38
38
  custom persistence. The package does not depend on AppKit;
39
39
  `@dbx-tools/appkit` adapts it to AppKit's storage contract.
40
+ The package owns its Keyv runtime, so consumers do not install or pin Keyv to
41
+ align cache constructors.
40
42
 
41
43
  ## Limits
42
44
 
package/index.ts CHANGED
@@ -3,6 +3,6 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cache";
6
- export const PACKAGE_VERSION = "0.9.150";
6
+ export const PACKAGE_VERSION = "0.9.151";
7
7
  export * as cache from "./src/cache.ts";
8
8
  export type { CacheLevel, CacheOptions, ProjectCacheOptions, GetOrSetOptions } from "./src/cache.ts";
package/lib/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cache";
2
- export declare const PACKAGE_VERSION = "0.9.150";
2
+ export declare const PACKAGE_VERSION = "0.9.151";
3
3
  export * as cache from "./src/cache.ts";
4
4
  export type { CacheLevel, CacheOptions, ProjectCacheOptions, GetOrSetOptions } from "./src/cache.ts";
package/lib/index.js CHANGED
@@ -2,6 +2,6 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cache";
5
- export const PACKAGE_VERSION = "0.9.150";
5
+ export const PACKAGE_VERSION = "0.9.151";
6
6
  export * as cache from "./src/cache.js";
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2NhY2hlXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTUwXCI7XG5leHBvcnQgKiBhcyBjYWNoZSBmcm9tIFwiLi9zcmMvY2FjaGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2FjaGVMZXZlbCwgQ2FjaGVPcHRpb25zLCBQcm9qZWN0Q2FjaGVPcHRpb25zLCBHZXRPclNldE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2FjaGUudHNcIjtcbiJdfQ==
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2NhY2hlXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTUxXCI7XG5leHBvcnQgKiBhcyBjYWNoZSBmcm9tIFwiLi9zcmMvY2FjaGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2FjaGVMZXZlbCwgQ2FjaGVPcHRpb25zLCBQcm9qZWN0Q2FjaGVPcHRpb25zLCBHZXRPclNldE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2FjaGUudHNcIjtcbiJdfQ==
package/lib/src/cache.js CHANGED
@@ -7,8 +7,9 @@ import { EventEmitter } from "node:events";
7
7
  import { join } from "node:path";
8
8
  import { projectUtils } from "@dbx-tools/core";
9
9
  import { errorUtils, log } from "@dbx-tools/shared-core";
10
- import { Cacheable, CacheableHooks, createKeyv, KeyvCacheableMemory, } from "cacheable";
10
+ import { Cacheable, CacheableHooks, KeyvCacheableMemory, } from "cacheable";
11
11
  import envPaths from "env-paths";
12
+ import { Keyv } from "keyv";
12
13
  import { KeyvFile } from "keyv-file";
13
14
  const DEFAULT_MAX_ENTRIES = 1_000;
14
15
  const DEFAULT_WRITE_DELAY_MS = 25;
@@ -177,17 +178,25 @@ class TieredStoreAdapter extends EventEmitter {
177
178
  export function createCache(options = {}) {
178
179
  const maxEntries = positiveInteger(options.maxEntries, DEFAULT_MAX_ENTRIES, "maxEntries");
179
180
  const writeDelayMs = nonNegativeInteger(options.writeDelayMs, DEFAULT_WRITE_DELAY_MS, "writeDelayMs");
180
- const primary = createKeyv({
181
- lruSize: maxEntries,
182
- ttl: options.ttl,
183
- useClone: options.useClone ?? true,
181
+ const primary = new Keyv({
182
+ store: new KeyvCacheableMemory({
183
+ lruSize: maxEntries,
184
+ ttl: options.ttl,
185
+ useClone: options.useClone ?? true,
186
+ }),
187
+ ...(typeof options.ttl === "number" && Number.isInteger(options.ttl)
188
+ ? { ttl: options.ttl }
189
+ : {}),
184
190
  });
191
+ primary.serialize = undefined;
192
+ primary.deserialize = undefined;
185
193
  const adapter = options.levels?.length
186
194
  ? new TieredStoreAdapter(options.levels, writeDelayMs)
187
195
  : undefined;
196
+ const secondary = adapter ? new Keyv({ store: adapter }) : undefined;
188
197
  const cache = new Cacheable({
189
198
  primary,
190
- ...(adapter ? { secondary: adapter, nonBlocking: true } : {}),
199
+ ...(secondary ? { secondary, nonBlocking: true } : {}),
191
200
  ...(options.cacheId === undefined ? {} : { cacheId: options.cacheId }),
192
201
  ...(options.maxTtl === undefined ? {} : { maxTtl: options.maxTtl }),
193
202
  ...(options.namespace === undefined ? {} : { namespace: options.namespace }),
@@ -360,4 +369,4 @@ function nonNegativeInteger(value, fallback, name) {
360
369
  }
361
370
  return resolved;
362
371
  }
363
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxVQUFVLEVBQ1YsbUJBQW1CLEdBSXBCLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBQ2xDLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsZ0NBQWdDLENBQUM7QUFDNUQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQXFFbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7QUFDcEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7QUFFbkQ7OztHQUdHO0FBQ0gsTUFBTSxrQkFBbUIsU0FBUSxZQUFZO0lBQ2xDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbkIsU0FBUyxDQUFVO0lBRUYsTUFBTSxDQUF3QjtJQUM5QixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUFDdEMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO0lBQ3RDLFlBQVksQ0FBUztJQUM5QixZQUFZLENBQWlCO0lBQzdCLEtBQUssQ0FBaUM7SUFDdEMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUU3QixZQUFZLE1BQTZCLEVBQUUsWUFBb0I7UUFDN0QsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBUSxHQUFXO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksUUFBUSxFQUFFLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDbEQsSUFBSSxRQUFRLEVBQUUsSUFBSSxLQUFLLEtBQUs7WUFBRSxPQUFPLFFBQVEsQ0FBQyxLQUFjLENBQUM7UUFFN0QsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNuRCxNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELElBQUksS0FBSyxLQUFLLFNBQVM7Z0JBQUUsU0FBUztZQUNsQyxJQUFJLEtBQUssR0FBRyxDQUFDO2dCQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyRSxPQUFPLEtBQWMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQVEsSUFBYztRQUNqQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLEdBQVk7UUFDM0MsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUE0RDtRQUN4RSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU07WUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVc7UUFDaEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBYztRQUM3QixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksT0FBTztZQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUM7UUFDM0MsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEMsSUFDRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUN6RixDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN4QixNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUM7WUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUM5QixNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixNQUFNLFlBQVksQ0FDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQ3JELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVcsRUFBRSxFQUNwQyxZQUFZLENBQ2IsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVPLFFBQVE7UUFDZCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUN2QixLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sUUFBUSxHQUErRCxFQUFFLENBQUM7WUFDaEYsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQztvQkFDSCxNQUFNLFlBQVksQ0FDaEIsSUFBSSxDQUFDLE1BQU0sRUFDWCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ1IsUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLO3dCQUNyQixDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQzt3QkFDcEQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUM3QixRQUFRLENBQUMsSUFBSSxDQUNkLENBQUM7Z0JBQ0osQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQzFDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1lBQ0YsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQzt3QkFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdEYsQ0FBQztnQkFDRCxNQUFNLElBQUksY0FBYyxDQUN0QixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ3hDLGdDQUFnQyxRQUFRLENBQUMsTUFBTSxjQUFjLENBQzlELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxPQUFPLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxNQUE2QjtRQUN4RSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDO2FBQ3RGLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsRUFBRTtnQkFDaEQsR0FBRztnQkFDSCxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7YUFDakMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO2FBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUFFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGO0FBRUQsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxXQUFXLENBQUMsVUFBd0IsRUFBRTtJQUNwRCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMxRixNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FDckMsT0FBTyxDQUFDLFlBQVksRUFDcEIsc0JBQXNCLEVBQ3RCLGNBQWMsQ0FDZixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxVQUFVO1FBQ25CLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztRQUNoQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJO0tBQ25DLENBQUMsQ0FBQztJQUNILE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTTtRQUNwQyxDQUFDLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQztRQUN0RCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUM7UUFDMUIsT0FBTztRQUNQLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1RSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0QsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUMzRCxDQUFDLENBQUM7SUFDSCxvQkFBb0IsQ0FBQyxLQUFLLENB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QTJDLENBQUMsQ0FBQztJQUM3RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFhO0lBQ2hDLE9BQU8sa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxLQUF5QixFQUFFLFFBQWdCLEVBQUUsSUFBWTtJQUNoRixNQUFNLFFBQVEsR0FBRyxLQUFLLElBQUksUUFBUSxDQUFDO0lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsSUFBSSw2QkFBNkIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxLQUF5QixFQUFFLFFBQWdCLEVBQUUsSUFBWTtJQUNuRixNQUFNLFFBQVEsR0FBRyxLQUFLLElBQUksUUFBUSxDQUFDO0lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1vcnktZmlyc3QgQ2FjaGVhYmxlIGFuZCBLZXl2IGNvbXBvc2l0aW9uLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwibm9kZTpldmVudHNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwcm9qZWN0VXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgQ2FjaGVhYmxlLFxuICBDYWNoZWFibGVIb29rcyxcbiAgY3JlYXRlS2V5dixcbiAgS2V5dkNhY2hlYWJsZU1lbW9yeSxcbiAgdHlwZSBDYWNoZWFibGVPcHRpb25zLFxuICB0eXBlIEdldE9yU2V0RnVuY3Rpb25PcHRpb25zLFxuICB0eXBlIEtleXZTdG9yZUFkYXB0ZXIsXG59IGZyb20gXCJjYWNoZWFibGVcIjtcbmltcG9ydCBlbnZQYXRocyBmcm9tIFwiZW52LXBhdGhzXCI7XG5pbXBvcnQgeyBLZXl2RmlsZSB9IGZyb20gXCJrZXl2LWZpbGVcIjtcblxuY29uc3QgREVGQVVMVF9NQVhfRU5UUklFUyA9IDFfMDAwO1xuY29uc3QgREVGQVVMVF9XUklURV9ERUxBWV9NUyA9IDI1O1xuY29uc3QgRVJST1JfVkFMVUVfUFJFRklYID0gXCJfX2RieF90b29sc19jYWNoZWRfb25fZXJyb3JfXzpcIjtcbmNvbnN0IEVOVkVMT1BFX1ZFUlNJT04gPSAxO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImNhY2hlXCIpO1xuXG5pbnRlcmZhY2UgVmFsdWVFbnZlbG9wZSB7XG4gIHJlYWRvbmx5IF9fZGJ4VG9vbHNDYWNoZUVudmVsb3BlOiB0eXBlb2YgRU5WRUxPUEVfVkVSU0lPTjtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbmludGVyZmFjZSBTZXRNdXRhdGlvbiB7XG4gIHJlYWRvbmx5IGtpbmQ6IFwic2V0XCI7XG4gIHJlYWRvbmx5IHR0bD86IG51bWJlcjtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbmludGVyZmFjZSBEZWxldGVNdXRhdGlvbiB7XG4gIHJlYWRvbmx5IGtpbmQ6IFwiZGVsZXRlXCI7XG59XG5cbnR5cGUgTXV0YXRpb24gPSBEZWxldGVNdXRhdGlvbiB8IFNldE11dGF0aW9uO1xuXG5pbnRlcmZhY2UgQ2FjaGVTdGF0ZSB7XG4gIHJlYWRvbmx5IGFkYXB0ZXI/OiBUaWVyZWRTdG9yZUFkYXB0ZXI7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHJlZ2lzdHJ5S2V5Pzogc3RyaW5nO1xuICBjbG9zZWQ6IGJvb2xlYW47XG59XG5cbi8qKiBPbmUgb3JkZXJlZCBwZXJzaXN0ZW50IGNhY2hlIGxldmVsLiBFYXJsaWVyIGxldmVscyBhcmUgcmVhZCBmaXJzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVMZXZlbCB7XG4gIC8qKiBPcHRpb25hbCBuYW1lIGluY2x1ZGVkIGluIHBlcnNpc3RlbmNlIGVycm9yIG1lc3NhZ2VzLiAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICAvKiogS2V5di1jb21wYXRpYmxlIHN0b3JlIGFkYXB0ZXIuICovXG4gIHJlYWRvbmx5IHN0b3JlOiBLZXl2U3RvcmVBZGFwdGVyO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgYW4gQXBwS2l0LWluZGVwZW5kZW50IG1lbW9yeS1maXJzdCBjYWNoZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVPcHRpb25zIGV4dGVuZHMgUGljazxcbiAgQ2FjaGVhYmxlT3B0aW9ucyxcbiAgXCJjYWNoZUlkXCIgfCBcIm1heFR0bFwiIHwgXCJuYW1lc3BhY2VcIiB8IFwic3RhdHNcIiB8IFwidGFnc1wiIHwgXCJ0dGxcIlxuPiB7XG4gIC8qKiBBZGRpdGlvbmFsIG9yZGVyZWQgcGVyc2lzdGVuY2UgbGV2ZWxzLiBObyBsZXZlbHMgY3JlYXRlcyBhIG1lbW9yeS1vbmx5IGNhY2hlLiAqL1xuICByZWFkb25seSBsZXZlbHM/OiByZWFkb25seSBDYWNoZUxldmVsW107XG4gIC8qKiBNYXhpbXVtIGVudHJpZXMgcmV0YWluZWQgaW4gdGhlIG1lbW9yeSBwcmltYXJ5LiBEZWZhdWx0cyB0byAxLDAwMC4gKi9cbiAgcmVhZG9ubHkgbWF4RW50cmllcz86IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgbWVtb3J5IHJlYWRzIGNsb25lIHZhbHVlcy4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgcmVhZG9ubHkgdXNlQ2xvbmU/OiBib29sZWFuO1xuICAvKiogRGVsYXkgdXNlZCB0byBjb2FsZXNjZSBwZXJzaXN0ZW5jZSBtdXRhdGlvbnMuIERlZmF1bHRzIHRvIDI1IG1pbGxpc2Vjb25kcy4gKi9cbiAgcmVhZG9ubHkgd3JpdGVEZWxheU1zPzogbnVtYmVyO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgdGhlIGRlZmF1bHQgcHJvamVjdC1zY29wZWQgbWVtb3J5IGFuZCBkaXNrIGNhY2hlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Q2FjaGVPcHRpb25zIGV4dGVuZHMgQ2FjaGVPcHRpb25zIHtcbiAgLyoqIE92ZXJyaWRlIHRoZSBjYWNoZSBkaXJlY3RvcnksIHByaW1hcmlseSBmb3IgdGVzdHMuICovXG4gIHJlYWRvbmx5IGNhY2hlRGlyPzogc3RyaW5nO1xuICAvKiogRGlzYWJsZSB0aGUgZGVmYXVsdCBkaXNrIGxldmVsLiBEZWZhdWx0cyB0byB0cnVlLiAqL1xuICByZWFkb25seSBkaXNrPzogYm9vbGVhbjtcbiAgLyoqIERlbGF5IHVzZWQgYnkga2V5di1maWxlIHRvIGNvYWxlc2NlIGZpbGUgcmV3cml0ZXMuIERlZmF1bHRzIHRvIDEwMCBtaWxsaXNlY29uZHMuICovXG4gIHJlYWRvbmx5IGRpc2tXcml0ZURlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBPdmVycmlkZSB0aGUgcHJvamVjdCBuYW1lIHJlc29sdmVkIHRocm91Z2ggcHJvamVjdFV0aWxzLm5hbWUoKS4gKi9cbiAgcmVhZG9ubHkgcHJvamVjdE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKiBPcHRpb25zIGZvciB0aGUgQ2FjaGVhYmxlLWNvbXBhdGlibGUgZ2V0LW9yLXNldCBleHRlbnNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEdldE9yU2V0T3B0aW9ucyBleHRlbmRzIEdldE9yU2V0RnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqIFJldHVybiBhIHNlcGFyYXRlbHkgcmV0YWluZWQgc3VjY2Vzc2Z1bCB2YWx1ZSB3aGVuIHRoZSBsb2FkZXIgZmFpbHMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICByZWFkb25seSByZXR1cm5DYWNoZWRPbkVycm9yPzogYm9vbGVhbjtcbiAgLyoqIFRUTCBmb3IgdGhlIGNhY2hlZC1vbi1lcnJvciB2YWx1ZS4gRGVmYXVsdHMgdG8gMCwgbWVhbmluZyBubyBleHBpcmF0aW9uLiAqL1xuICByZWFkb25seSBjYWNoZWRPbkVycm9yVHRsPzogbnVtYmVyIHwgc3RyaW5nO1xufVxuXG5jb25zdCBzdGF0ZXMgPSBuZXcgV2Vha01hcDxDYWNoZWFibGUsIENhY2hlU3RhdGU+KCk7XG5jb25zdCBwcm9qZWN0Q2FjaGVzID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlYWJsZT4oKTtcblxuLyoqXG4gKiBLZXl2IGFkYXB0ZXIgdGhhdCBjb21wb3NlcyBhcmJpdHJhcnkgb3JkZXJlZCBsZXZlbHMgYmVoaW5kIENhY2hlYWJsZSdzIG9uZVxuICogc2Vjb25kYXJ5LXN0b3JlIHNsb3QgYW5kIG93bnMgdHJhY2tlZCB3cml0ZS1iZWhpbmQgcGVyc2lzdGVuY2UuXG4gKi9cbmNsYXNzIFRpZXJlZFN0b3JlQWRhcHRlciBleHRlbmRzIEV2ZW50RW1pdHRlciBpbXBsZW1lbnRzIEtleXZTdG9yZUFkYXB0ZXIge1xuICByZWFkb25seSBvcHRzID0ge307XG4gIG5hbWVzcGFjZT86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGxldmVsczogcmVhZG9ubHkgQ2FjaGVMZXZlbFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgTXV0YXRpb24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvbW90aW9ucyA9IG5ldyBTZXQ8UHJvbWlzZTx2b2lkPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3cml0ZURlbGF5TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSBmbHVzaFByb21pc2U/OiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIHRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgZGlzY29ubmVjdGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IobGV2ZWxzOiByZWFkb25seSBDYWNoZUxldmVsW10sIHdyaXRlRGVsYXlNczogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxldmVscyA9IGxldmVscztcbiAgICB0aGlzLndyaXRlRGVsYXlNcyA9IHdyaXRlRGVsYXlNcztcbiAgfVxuXG4gIGFzeW5jIGdldDxWYWx1ZT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFZhbHVlIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbXV0YXRpb24gPSB0aGlzLnBlbmRpbmcuZ2V0KGtleSk7XG4gICAgaWYgKG11dGF0aW9uPy5raW5kID09PSBcImRlbGV0ZVwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChtdXRhdGlvbj8ua2luZCA9PT0gXCJzZXRcIikgcmV0dXJuIG11dGF0aW9uLnZhbHVlIGFzIFZhbHVlO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGxldmVsXSBvZiB0aGlzLmxldmVscy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgbGV2ZWwuc3RvcmUuZ2V0PFZhbHVlPihrZXkpO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGluZGV4ID4gMCkgdGhpcy5wcm9tb3RlKGtleSwgdmFsdWUsIHRoaXMubGV2ZWxzLnNsaWNlKDAsIGluZGV4KSk7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBhc3luYyBnZXRNYW55PFZhbHVlPihrZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8QXJyYXk8VmFsdWUgfCB1bmRlZmluZWQ+PiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGtleXMubWFwKChrZXkpID0+IHRoaXMuZ2V0PFZhbHVlPihrZXkpKSk7XG4gIH1cblxuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCB0dGw/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmFzc2VydENvbm5lY3RlZCgpO1xuICAgIHRoaXMucGVuZGluZy5zZXQoa2V5LCB7IGtpbmQ6IFwic2V0XCIsIHZhbHVlLCAuLi4odHRsID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdHRsIH0pIH0pO1xuICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG5cbiAgYXN5bmMgc2V0TWFueSh2YWx1ZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duOyB0dGw/OiBudW1iZXIgfT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlcykgYXdhaXQgdGhpcy5zZXQoZW50cnkua2V5LCBlbnRyeS52YWx1ZSwgZW50cnkudHRsKTtcbiAgfVxuXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuYXNzZXJ0Q29ubmVjdGVkKCk7XG4gICAgdGhpcy5wZW5kaW5nLnNldChrZXksIHsga2luZDogXCJkZWxldGVcIiB9KTtcbiAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU1hbnkoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChrZXlzLm1hcCgoa2V5KSA9PiB0aGlzLmRlbGV0ZShrZXkpKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBoYXMoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChrZXkpO1xuICAgIGlmIChwZW5kaW5nKSByZXR1cm4gcGVuZGluZy5raW5kID09PSBcInNldFwiO1xuICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgdGhpcy5sZXZlbHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGV2ZWwuc3RvcmUuaGFzID8gYXdhaXQgbGV2ZWwuc3RvcmUuaGFzKGtleSkgOiAoYXdhaXQgbGV2ZWwuc3RvcmUuZ2V0KGtleSkpICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hc3NlcnRDb25uZWN0ZWQoKTtcbiAgICBhd2FpdCB0aGlzLmZsdXNoKCk7XG4gICAgdGhpcy5wZW5kaW5nLmNsZWFyKCk7XG4gICAgYXdhaXQgc2V0dGxlTGV2ZWxzKHRoaXMubGV2ZWxzLCAobGV2ZWwpID0+IGxldmVsLnN0b3JlLmNsZWFyKCksIFwiY2xlYXJcIik7XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmZsdXNoUHJvbWlzZSkge1xuICAgICAgdGhpcy5mbHVzaFByb21pc2UgPSB0aGlzLmZsdXNoUGVuZGluZygpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLmZsdXNoUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZsdXNoUHJvbWlzZTtcbiAgICBhd2FpdCB0aGlzLmZsdXNoUHJvbW90aW9ucygpO1xuICAgIGlmICh0aGlzLnBlbmRpbmcuc2l6ZSA+IDApIGF3YWl0IHRoaXMuZmx1c2goKTtcbiAgfVxuXG4gIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGlzY29ubmVjdGVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBhd2FpdCBzZXR0bGVMZXZlbHMoXG4gICAgICB0aGlzLmxldmVscy5maWx0ZXIoKGxldmVsKSA9PiBsZXZlbC5zdG9yZS5kaXNjb25uZWN0KSxcbiAgICAgIChsZXZlbCkgPT4gbGV2ZWwuc3RvcmUuZGlzY29ubmVjdCEoKSxcbiAgICAgIFwiZGlzY29ubmVjdFwiLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydENvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNjb25uZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIHBlcnNpc3RlbmNlIGlzIGRpc2Nvbm5lY3RlZFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZXIgfHwgdGhpcy5mbHVzaFByb21pc2UpIHJldHVybjtcbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgdm9pZCB0aGlzLmZsdXNoKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiY2FjaGUgcGVyc2lzdGVuY2UgZmx1c2ggZmFpbGVkXCIsIHsgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvcikgfSk7XG4gICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0sIHRoaXMud3JpdGVEZWxheU1zKTtcbiAgICB0aGlzLnRpbWVyLnVucmVmPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmx1c2hQZW5kaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdoaWxlICh0aGlzLnBlbmRpbmcuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gbmV3IE1hcCh0aGlzLnBlbmRpbmcpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgYmF0Y2gua2V5cygpKSB0aGlzLnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gICAgICBjb25zdCBmYWlsdXJlczogQXJyYXk8eyBrZXk6IHN0cmluZzsgbXV0YXRpb246IE11dGF0aW9uOyBlcnJvcjogdW5rbm93biB9PiA9IFtdO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIFsuLi5iYXRjaF0ubWFwKGFzeW5jIChba2V5LCBtdXRhdGlvbl0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc2V0dGxlTGV2ZWxzKFxuICAgICAgICAgICAgICB0aGlzLmxldmVscyxcbiAgICAgICAgICAgICAgKGxldmVsKSA9PlxuICAgICAgICAgICAgICAgIG11dGF0aW9uLmtpbmQgPT09IFwic2V0XCJcbiAgICAgICAgICAgICAgICAgID8gbGV2ZWwuc3RvcmUuc2V0KGtleSwgbXV0YXRpb24udmFsdWUsIG11dGF0aW9uLnR0bClcbiAgICAgICAgICAgICAgICAgIDogbGV2ZWwuc3RvcmUuZGVsZXRlKGtleSksXG4gICAgICAgICAgICAgIG11dGF0aW9uLmtpbmQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBmYWlsdXJlcy5wdXNoKHsga2V5LCBtdXRhdGlvbiwgZXJyb3IgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBpZiAoZmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgZmFpbHVyZXMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMucGVuZGluZy5oYXMoZmFpbHVyZS5rZXkpKSB0aGlzLnBlbmRpbmcuc2V0KGZhaWx1cmUua2V5LCBmYWlsdXJlLm11dGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICAgICAgZmFpbHVyZXMubWFwKChmYWlsdXJlKSA9PiBmYWlsdXJlLmVycm9yKSxcbiAgICAgICAgICBgQ2FjaGUgcGVyc2lzdGVuY2UgZmFpbGVkIGZvciAke2ZhaWx1cmVzLmxlbmd0aH0gbXV0YXRpb24ocylgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvbW90ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGxldmVsczogcmVhZG9ubHkgQ2FjaGVMZXZlbFtdKTogdm9pZCB7XG4gICAgY29uc3QgcHJvbW90aW9uID0gc2V0dGxlTGV2ZWxzKGxldmVscywgKGxldmVsKSA9PiBsZXZlbC5zdG9yZS5zZXQoa2V5LCB2YWx1ZSksIFwicHJvbW90ZVwiKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIud2FybihcImNhY2hlIHBlcnNpc3RlbmNlIHByb21vdGlvbiBmYWlsZWRcIiwge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLnByb21vdGlvbnMuZGVsZXRlKHByb21vdGlvbik7XG4gICAgICB9KTtcbiAgICB0aGlzLnByb21vdGlvbnMuYWRkKHByb21vdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZsdXNoUHJvbW90aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5wcm9tb3Rpb25zLnNpemUgPiAwKSBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy5wcm9tb3Rpb25zXSk7XG4gIH1cbn1cblxuLyoqIENyZWF0ZSBhIG1lbW9yeS1maXJzdCBjYWNoZSB3aXRoIG9wdGlvbmFsIG9yZGVyZWQgcGVyc2lzdGVudCBsZXZlbHMuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FjaGUob3B0aW9uczogQ2FjaGVPcHRpb25zID0ge30pOiBDYWNoZWFibGUge1xuICBjb25zdCBtYXhFbnRyaWVzID0gcG9zaXRpdmVJbnRlZ2VyKG9wdGlvbnMubWF4RW50cmllcywgREVGQVVMVF9NQVhfRU5UUklFUywgXCJtYXhFbnRyaWVzXCIpO1xuICBjb25zdCB3cml0ZURlbGF5TXMgPSBub25OZWdhdGl2ZUludGVnZXIoXG4gICAgb3B0aW9ucy53cml0ZURlbGF5TXMsXG4gICAgREVGQVVMVF9XUklURV9ERUxBWV9NUyxcbiAgICBcIndyaXRlRGVsYXlNc1wiLFxuICApO1xuICBjb25zdCBwcmltYXJ5ID0gY3JlYXRlS2V5dih7XG4gICAgbHJ1U2l6ZTogbWF4RW50cmllcyxcbiAgICB0dGw6IG9wdGlvbnMudHRsLFxuICAgIHVzZUNsb25lOiBvcHRpb25zLnVzZUNsb25lID8/IHRydWUsXG4gIH0pO1xuICBjb25zdCBhZGFwdGVyID0gb3B0aW9ucy5sZXZlbHM/Lmxlbmd0aFxuICAgID8gbmV3IFRpZXJlZFN0b3JlQWRhcHRlcihvcHRpb25zLmxldmVscywgd3JpdGVEZWxheU1zKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZWFibGUoe1xuICAgIHByaW1hcnksXG4gICAgLi4uKGFkYXB0ZXIgPyB7IHNlY29uZGFyeTogYWRhcHRlciwgbm9uQmxvY2tpbmc6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5jYWNoZUlkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgY2FjaGVJZDogb3B0aW9ucy5jYWNoZUlkIH0pLFxuICAgIC4uLihvcHRpb25zLm1heFR0bCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG1heFR0bDogb3B0aW9ucy5tYXhUdGwgfSksXG4gICAgLi4uKG9wdGlvbnMubmFtZXNwYWNlID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbmFtZXNwYWNlOiBvcHRpb25zLm5hbWVzcGFjZSB9KSxcbiAgICAuLi4ob3B0aW9ucy5zdGF0cyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHN0YXRzOiBvcHRpb25zLnN0YXRzIH0pLFxuICAgIC4uLihvcHRpb25zLnRhZ3MgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0YWdzOiBvcHRpb25zLnRhZ3MgfSksXG4gICAgLi4uKG9wdGlvbnMudHRsID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdHRsOiBvcHRpb25zLnR0bCB9KSxcbiAgfSk7XG4gIGluc3RhbGxWYWx1ZUVudmVsb3BlKGNhY2hlKTtcbiAgY2FjaGUub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICBsb2dnZXIud2FybihcImNhY2hlYWJsZSBvcGVyYXRpb24gZmFpbGVkXCIsIHsgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvcikgfSk7XG4gIH0pO1xuICBzdGF0ZXMuc2V0KGNhY2hlLCB7IGFkYXB0ZXIsIGNsb3NlZDogZmFsc2UgfSk7XG4gIHJldHVybiBjYWNoZTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIGRlZmF1bHQgcG9ydGFibGUgZGlzayBwYXRoIGZvciBhIHByb2plY3QgY2FjaGUgc2NvcGUuICovXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVQYXRoKFxuICBzY29wZTogc3RyaW5nLFxuICBvcHRpb25zOiBQaWNrPFByb2plY3RDYWNoZU9wdGlvbnMsIFwiY2FjaGVEaXJcIiB8IFwicHJvamVjdE5hbWVcIj4gPSB7fSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gb3B0aW9ucy5wcm9qZWN0TmFtZSA/PyBwcm9qZWN0VXRpbHMubmFtZSgpO1xuICBjb25zdCByb290ID0gb3B0aW9ucy5jYWNoZURpciA/PyBlbnZQYXRocyhcImRieC10b29sc1wiLCB7IHN1ZmZpeDogXCJcIiB9KS5jYWNoZTtcbiAgcmV0dXJuIGpvaW4ocm9vdCwgXCJjYWNoZVwiLCBzYWZlU2VnbWVudChwcm9qZWN0TmFtZSksIGAke3NhZmVTZWdtZW50KHNjb3BlKX0uanNvbmApO1xufVxuXG4vKipcbiAqIFJldHVybiBhIHByb2Nlc3Mtc2hhcmVkIHByb2plY3QgY2FjaGUuIEJ5IGRlZmF1bHQgaXQgaXMgbWVtb3J5LWZpcnN0IHdpdGggYVxuICogcG9ydGFibGUga2V5di1maWxlIHNlY29uZGFyeSBzY29wZWQgYnkgcHJvamVjdCBhbmQgbG9naWNhbCBjYWNoZSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdENhY2hlKHNjb3BlOiBzdHJpbmcsIG9wdGlvbnM6IFByb2plY3RDYWNoZU9wdGlvbnMgPSB7fSk6IENhY2hlYWJsZSB7XG4gIGNvbnN0IHBhdGggPSBjYWNoZVBhdGgoc2NvcGUsIG9wdGlvbnMpO1xuICBjb25zdCByZWdpc3RyeUtleSA9IEpTT04uc3RyaW5naWZ5KFtwYXRoLCBvcHRpb25zLmRpc2sgIT09IGZhbHNlXSk7XG4gIGNvbnN0IGV4aXN0aW5nID0gcHJvamVjdENhY2hlcy5nZXQocmVnaXN0cnlLZXkpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcblxuICBjb25zdCBsZXZlbHMgPSBbLi4uKG9wdGlvbnMubGV2ZWxzID8/IFtdKV07XG4gIGlmIChvcHRpb25zLmRpc2sgIT09IGZhbHNlKSB7XG4gICAgbGV2ZWxzLnB1c2goe1xuICAgICAgbmFtZTogXCJkaXNrXCIsXG4gICAgICBzdG9yZTogbmV3IEtleXZGaWxlKHtcbiAgICAgICAgZmlsZW5hbWU6IHBhdGgsXG4gICAgICAgIHdyaXRlRGVsYXk6IG5vbk5lZ2F0aXZlSW50ZWdlcihvcHRpb25zLmRpc2tXcml0ZURlbGF5TXMsIDEwMCwgXCJkaXNrV3JpdGVEZWxheU1zXCIpLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgY2FjaGUgPSBjcmVhdGVDYWNoZSh7IC4uLm9wdGlvbnMsIGxldmVscyB9KTtcbiAgY29uc3Qgc3RhdGUgPSByZXF1aXJlU3RhdGUoY2FjaGUpO1xuICBzdGF0ZS5wYXRoID0gcGF0aDtcbiAgc3RhdGUucmVnaXN0cnlLZXkgPSByZWdpc3RyeUtleTtcbiAgcHJvamVjdENhY2hlcy5zZXQocmVnaXN0cnlLZXksIGNhY2hlKTtcbiAgcmV0dXJuIGNhY2hlO1xufVxuXG4vKiogV2FpdCBmb3IgYWxsIHRyYWNrZWQgd3JpdGUtYmVoaW5kIHBlcnNpc3RlbmNlIHdpdGhvdXQgY2xvc2luZyB0aGUgY2FjaGUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmx1c2hDYWNoZShjYWNoZTogQ2FjaGVhYmxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlcXVpcmVTdGF0ZShjYWNoZSkuYWRhcHRlcj8uZmx1c2goKTtcbn1cblxuLyoqIEZsdXNoIHBlbmRpbmcgcGVyc2lzdGVuY2UgYW5kIGRpc2Nvbm5lY3QgYWxsIGNhY2hlIGxldmVscy4gSWRlbXBvdGVudC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9zZUNhY2hlKGNhY2hlOiBDYWNoZWFibGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhdGUgPSByZXF1aXJlU3RhdGUoY2FjaGUpO1xuICBpZiAoc3RhdGUuY2xvc2VkKSByZXR1cm47XG4gIGF3YWl0IHN0YXRlLmFkYXB0ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgc3RhdGUuY2xvc2VkID0gdHJ1ZTtcbiAgaWYgKHN0YXRlLnJlZ2lzdHJ5S2V5ICYmIHByb2plY3RDYWNoZXMuZ2V0KHN0YXRlLnJlZ2lzdHJ5S2V5KSA9PT0gY2FjaGUpIHtcbiAgICBwcm9qZWN0Q2FjaGVzLmRlbGV0ZShzdGF0ZS5yZWdpc3RyeUtleSk7XG4gIH1cbn1cblxuLyoqIEl0ZXJhdGUga2V5cyBjdXJyZW50bHkgcmV0YWluZWQgYnkgdGhlIGJvdW5kZWQgbWVtb3J5IHByaW1hcnkuICovXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVLZXlzKGNhY2hlOiBDYWNoZWFibGUpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICBjb25zdCBzdG9yZSA9IGNhY2hlLnByaW1hcnkuc3RvcmU7XG4gIGlmICghKHN0b3JlIGluc3RhbmNlb2YgS2V5dkNhY2hlYWJsZU1lbW9yeSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FjaGUgcHJpbWFyeSBpcyBub3QgQ2FjaGVhYmxlIG1lbW9yeVwiKTtcbiAgfVxuICByZXR1cm4gc3RvcmUuc3RvcmUua2V5cztcbn1cblxuLyoqIERlbGV0ZSBhIG5vcm1hbCBjYWNoZSB2YWx1ZSBhbmQgaXRzIG9wdGlvbmFsIGNhY2hlZC1vbi1lcnJvciBjb21wYW5pb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ2FjaGVkVmFsdWUoY2FjaGU6IENhY2hlYWJsZSwga2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW3ZhbHVlLCBmYWxsYmFja10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgY2FjaGUuZGVsZXRlKGtleSksXG4gICAgY2FjaGUuZGVsZXRlKGNhY2hlZE9uRXJyb3JLZXkoa2V5KSksXG4gIF0pO1xuICByZXR1cm4gQm9vbGVhbih2YWx1ZSB8fCBmYWxsYmFjayk7XG59XG5cbi8qKlxuICogVXNlIENhY2hlYWJsZSdzIG5hdGl2ZSBpbi1mbGlnaHQgZ2V0LW9yLXNldCBiZWhhdmlvciwgb3B0aW9uYWxseSByZXRhaW5pbmcgYVxuICogc3VjY2Vzc2Z1bCB2YWx1ZSB1bmRlciBhIHNlcGFyYXRlIGtleSBmb3IgcmVjb3Zlcnkgd2hlbiBhIGxhdGVyIGxvYWRlciBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yU2V0PFQ+KFxuICBjYWNoZTogQ2FjaGVhYmxlLFxuICBrZXk6IHN0cmluZyxcbiAgbG9hZDogKCkgPT4gUHJvbWlzZTxUPixcbiAgb3B0aW9uczogR2V0T3JTZXRPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgeyByZXR1cm5DYWNoZWRPbkVycm9yID0gZmFsc2UsIGNhY2hlZE9uRXJyb3JUdGwgPSAwLCAuLi5jYWNoZWFibGVPcHRpb25zIH0gPSBvcHRpb25zO1xuICBpZiAoIXJldHVybkNhY2hlZE9uRXJyb3IpIHJldHVybiBjYWNoZS5nZXRPclNldChrZXksIGxvYWQsIGNhY2hlYWJsZU9wdGlvbnMpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNhY2hlLmdldE9yU2V0KFxuICAgICAga2V5LFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGxvYWQoKTtcbiAgICAgICAgYXdhaXQgY2FjaGUuc2V0KGNhY2hlZE9uRXJyb3JLZXkoa2V5KSwgdmFsdWUsIHsgdHRsOiBjYWNoZWRPbkVycm9yVHRsIH0pO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgeyAuLi5jYWNoZWFibGVPcHRpb25zLCB0aHJvd0Vycm9yczogdHJ1ZSB9LFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgY2FjaGUuZ2V0PFQ+KGNhY2hlZE9uRXJyb3JLZXkoa2V5KSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICAgIGlmIChjYWNoZWFibGVPcHRpb25zLnRocm93RXJyb3JzKSB0aHJvdyBlcnJvcjtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxWYWx1ZUVudmVsb3BlKGNhY2hlOiBDYWNoZWFibGUpOiB2b2lkIHtcbiAgY2FjaGUub25Ib29rKENhY2hlYWJsZUhvb2tzLkJFRk9SRV9TRVQsIChpdGVtKSA9PiB7XG4gICAgaXRlbS52YWx1ZSA9IGVudmVsb3BlKGl0ZW0udmFsdWUpO1xuICB9KTtcbiAgY2FjaGUub25Ib29rKENhY2hlYWJsZUhvb2tzLkJFRk9SRV9TRVRfTUFOWSwgKGl0ZW1zKSA9PiB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSBpdGVtLnZhbHVlID0gZW52ZWxvcGUoaXRlbS52YWx1ZSk7XG4gIH0pO1xuICBjYWNoZS5vbkhvb2soQ2FjaGVhYmxlSG9va3MuQUZURVJfR0VULCAoaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtLnJlc3VsdCkgaXRlbS5yZXN1bHQudmFsdWUgPSB1bndyYXAoaXRlbS5yZXN1bHQudmFsdWUpO1xuICB9KTtcbiAgY2FjaGUub25Ib29rKENhY2hlYWJsZUhvb2tzLkFGVEVSX0dFVF9NQU5ZLCAoaXRlbSkgPT4ge1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGl0ZW0ucmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0KSByZXN1bHQudmFsdWUgPSB1bndyYXAocmVzdWx0LnZhbHVlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnZlbG9wZSh2YWx1ZTogdW5rbm93bik6IFZhbHVlRW52ZWxvcGUge1xuICByZXR1cm4geyBfX2RieFRvb2xzQ2FjaGVFbnZlbG9wZTogRU5WRUxPUEVfVkVSU0lPTiwgdmFsdWUgfTtcbn1cblxuZnVuY3Rpb24gdW53cmFwKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldHVybiBpc0VudmVsb3BlKHZhbHVlKSA/IHZhbHVlLnZhbHVlIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzRW52ZWxvcGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWYWx1ZUVudmVsb3BlIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcIl9fZGJ4VG9vbHNDYWNoZUVudmVsb3BlXCIgaW4gdmFsdWUgJiZcbiAgICAodmFsdWUgYXMgVmFsdWVFbnZlbG9wZSkuX19kYnhUb29sc0NhY2hlRW52ZWxvcGUgPT09IEVOVkVMT1BFX1ZFUlNJT04gJiZcbiAgICBcInZhbHVlXCIgaW4gdmFsdWUsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNhY2hlZE9uRXJyb3JLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7RVJST1JfVkFMVUVfUFJFRklYfSR7a2V5fWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHRsZUxldmVscyhcbiAgbGV2ZWxzOiByZWFkb25seSBDYWNoZUxldmVsW10sXG4gIG9wZXJhdGlvbjogKGxldmVsOiBDYWNoZUxldmVsKSA9PiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPixcbiAgb3BlcmF0aW9uTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQobGV2ZWxzLm1hcCgobGV2ZWwpID0+IG9wZXJhdGlvbihsZXZlbCkpKTtcbiAgY29uc3QgZXJyb3JzID0gcmVzdWx0cy5mbGF0TWFwKChyZXN1bHQsIGluZGV4KSA9PlxuICAgIHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIlxuICAgICAgPyBbXG4gICAgICAgICAgbmV3IEVycm9yKGAke2xldmVsc1tpbmRleF0/Lm5hbWUgPz8gYGxldmVsLSR7aW5kZXggKyAxfWB9ICR7b3BlcmF0aW9uTmFtZX0gZmFpbGVkYCwge1xuICAgICAgICAgICAgY2F1c2U6IHJlc3VsdC5yZWFzb24sXG4gICAgICAgICAgfSksXG4gICAgICAgIF1cbiAgICAgIDogW10sXG4gICk7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgYENhY2hlICR7b3BlcmF0aW9uTmFtZX0gZmFpbGVkYCk7XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVTdGF0ZShjYWNoZTogQ2FjaGVhYmxlKTogQ2FjaGVTdGF0ZSB7XG4gIGNvbnN0IHN0YXRlID0gc3RhdGVzLmdldChjYWNoZSk7XG4gIGlmICghc3RhdGUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYWNoZSB3YXMgbm90IGNyZWF0ZWQgYnkgQGRieC10b29scy9jYWNoZVwiKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBzYWZlU2VnbWVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZS50cmltKCkgfHwgXCJkZWZhdWx0XCIpO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZUludGVnZXIodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZSA/PyBmYWxsYmFjaztcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHJlc29sdmVkKSB8fCByZXNvbHZlZCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXJgKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbmZ1bmN0aW9uIG5vbk5lZ2F0aXZlSW50ZWdlcih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCByZXNvbHZlZCA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocmVzb2x2ZWQpIHx8IHJlc29sdmVkIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cbiJdfQ==
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxtQkFBbUIsR0FJcEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQztBQUNsQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLGtCQUFrQixHQUFHLGdDQUFnQyxDQUFDO0FBQzVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFxRW5DLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUF5QixDQUFDO0FBQ3BELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sa0JBQW1CLFNBQVEsWUFBWTtJQUNsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25CLFNBQVMsQ0FBVTtJQUVGLE1BQU0sQ0FBd0I7SUFDOUIsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQ3RDLFVBQVUsR0FBRyxJQUFJ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SSxRQUFRLENBQUM7SUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxJQUFJLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeS1maXJzdCBDYWNoZWFibGUgYW5kIEtleXYgY29tcG9zaXRpb24uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHByb2plY3RVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBDYWNoZWFibGUsXG4gIENhY2hlYWJsZUhvb2tzLFxuICBLZXl2Q2FjaGVhYmxlTWVtb3J5LFxuICB0eXBlIENhY2hlYWJsZU9wdGlvbnMsXG4gIHR5cGUgR2V0T3JTZXRGdW5jdGlvbk9wdGlvbnMsXG4gIHR5cGUgS2V5dlN0b3JlQWRhcHRlcixcbn0gZnJvbSBcImNhY2hlYWJsZVwiO1xuaW1wb3J0IGVudlBhdGhzIGZyb20gXCJlbnYtcGF0aHNcIjtcbmltcG9ydCB7IEtleXYgfSBmcm9tIFwia2V5dlwiO1xuaW1wb3J0IHsgS2V5dkZpbGUgfSBmcm9tIFwia2V5di1maWxlXCI7XG5cbmNvbnN0IERFRkFVTFRfTUFYX0VOVFJJRVMgPSAxXzAwMDtcbmNvbnN0IERFRkFVTFRfV1JJVEVfREVMQVlfTVMgPSAyNTtcbmNvbnN0IEVSUk9SX1ZBTFVFX1BSRUZJWCA9IFwiX19kYnhfdG9vbHNfY2FjaGVkX29uX2Vycm9yX186XCI7XG5jb25zdCBFTlZFTE9QRV9WRVJTSU9OID0gMTtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjYWNoZVwiKTtcblxuaW50ZXJmYWNlIFZhbHVlRW52ZWxvcGUge1xuICByZWFkb25seSBfX2RieFRvb2xzQ2FjaGVFbnZlbG9wZTogdHlwZW9mIEVOVkVMT1BFX1ZFUlNJT047XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgU2V0TXV0YXRpb24ge1xuICByZWFkb25seSBraW5kOiBcInNldFwiO1xuICByZWFkb25seSB0dGw/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgRGVsZXRlTXV0YXRpb24ge1xuICByZWFkb25seSBraW5kOiBcImRlbGV0ZVwiO1xufVxuXG50eXBlIE11dGF0aW9uID0gRGVsZXRlTXV0YXRpb24gfCBTZXRNdXRhdGlvbjtcblxuaW50ZXJmYWNlIENhY2hlU3RhdGUge1xuICByZWFkb25seSBhZGFwdGVyPzogVGllcmVkU3RvcmVBZGFwdGVyO1xuICBwYXRoPzogc3RyaW5nO1xuICByZWdpc3RyeUtleT86IHN0cmluZztcbiAgY2xvc2VkOiBib29sZWFuO1xufVxuXG4vKiogT25lIG9yZGVyZWQgcGVyc2lzdGVudCBjYWNoZSBsZXZlbC4gRWFybGllciBsZXZlbHMgYXJlIHJlYWQgZmlyc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlTGV2ZWwge1xuICAvKiogT3B0aW9uYWwgbmFtZSBpbmNsdWRlZCBpbiBwZXJzaXN0ZW5jZSBlcnJvciBtZXNzYWdlcy4gKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqIEtleXYtY29tcGF0aWJsZSBzdG9yZSBhZGFwdGVyLiAqL1xuICByZWFkb25seSBzdG9yZTogS2V5dlN0b3JlQWRhcHRlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGFuIEFwcEtpdC1pbmRlcGVuZGVudCBtZW1vcnktZmlyc3QgY2FjaGUuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlT3B0aW9ucyBleHRlbmRzIFBpY2s8XG4gIENhY2hlYWJsZU9wdGlvbnMsXG4gIFwiY2FjaGVJZFwiIHwgXCJtYXhUdGxcIiB8IFwibmFtZXNwYWNlXCIgfCBcInN0YXRzXCIgfCBcInRhZ3NcIiB8IFwidHRsXCJcbj4ge1xuICAvKiogQWRkaXRpb25hbCBvcmRlcmVkIHBlcnNpc3RlbmNlIGxldmVscy4gTm8gbGV2ZWxzIGNyZWF0ZXMgYSBtZW1vcnktb25seSBjYWNoZS4gKi9cbiAgcmVhZG9ubHkgbGV2ZWxzPzogcmVhZG9ubHkgQ2FjaGVMZXZlbFtdO1xuICAvKiogTWF4aW11bSBlbnRyaWVzIHJldGFpbmVkIGluIHRoZSBtZW1vcnkgcHJpbWFyeS4gRGVmYXVsdHMgdG8gMSwwMDAuICovXG4gIHJlYWRvbmx5IG1heEVudHJpZXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIG1lbW9yeSByZWFkcyBjbG9uZSB2YWx1ZXMuIERlZmF1bHRzIHRvIHRydWUuICovXG4gIHJlYWRvbmx5IHVzZUNsb25lPzogYm9vbGVhbjtcbiAgLyoqIERlbGF5IHVzZWQgdG8gY29hbGVzY2UgcGVyc2lzdGVuY2UgbXV0YXRpb25zLiBEZWZhdWx0cyB0byAyNSBtaWxsaXNlY29uZHMuICovXG4gIHJlYWRvbmx5IHdyaXRlRGVsYXlNcz86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSBkZWZhdWx0IHByb2plY3Qtc2NvcGVkIG1lbW9yeSBhbmQgZGlzayBjYWNoZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdENhY2hlT3B0aW9ucyBleHRlbmRzIENhY2hlT3B0aW9ucyB7XG4gIC8qKiBPdmVycmlkZSB0aGUgY2FjaGUgZGlyZWN0b3J5LCBwcmltYXJpbHkgZm9yIHRlc3RzLiAqL1xuICByZWFkb25seSBjYWNoZURpcj86IHN0cmluZztcbiAgLyoqIERpc2FibGUgdGhlIGRlZmF1bHQgZGlzayBsZXZlbC4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgcmVhZG9ubHkgZGlzaz86IGJvb2xlYW47XG4gIC8qKiBEZWxheSB1c2VkIGJ5IGtleXYtZmlsZSB0byBjb2FsZXNjZSBmaWxlIHJld3JpdGVzLiBEZWZhdWx0cyB0byAxMDAgbWlsbGlzZWNvbmRzLiAqL1xuICByZWFkb25seSBkaXNrV3JpdGVEZWxheU1zPzogbnVtYmVyO1xuICAvKiogT3ZlcnJpZGUgdGhlIHByb2plY3QgbmFtZSByZXNvbHZlZCB0aHJvdWdoIHByb2plY3RVdGlscy5uYW1lKCkuICovXG4gIHJlYWRvbmx5IHByb2plY3ROYW1lPzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgdGhlIENhY2hlYWJsZS1jb21wYXRpYmxlIGdldC1vci1zZXQgZXh0ZW5zaW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRPclNldE9wdGlvbnMgZXh0ZW5kcyBHZXRPclNldEZ1bmN0aW9uT3B0aW9ucyB7XG4gIC8qKiBSZXR1cm4gYSBzZXBhcmF0ZWx5IHJldGFpbmVkIHN1Y2Nlc3NmdWwgdmFsdWUgd2hlbiB0aGUgbG9hZGVyIGZhaWxzLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgcmVhZG9ubHkgcmV0dXJuQ2FjaGVkT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKiBUVEwgZm9yIHRoZSBjYWNoZWQtb24tZXJyb3IgdmFsdWUuIERlZmF1bHRzIHRvIDAsIG1lYW5pbmcgbm8gZXhwaXJhdGlvbi4gKi9cbiAgcmVhZG9ubHkgY2FjaGVkT25FcnJvclR0bD86IG51bWJlciB8IHN0cmluZztcbn1cblxuY29uc3Qgc3RhdGVzID0gbmV3IFdlYWtNYXA8Q2FjaGVhYmxlLCBDYWNoZVN0YXRlPigpO1xuY29uc3QgcHJvamVjdENhY2hlcyA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWFibGU+KCk7XG5cbi8qKlxuICogS2V5diBhZGFwdGVyIHRoYXQgY29tcG9zZXMgYXJiaXRyYXJ5IG9yZGVyZWQgbGV2ZWxzIGJlaGluZCBDYWNoZWFibGUncyBvbmVcbiAqIHNlY29uZGFyeS1zdG9yZSBzbG90IGFuZCBvd25zIHRyYWNrZWQgd3JpdGUtYmVoaW5kIHBlcnNpc3RlbmNlLlxuICovXG5jbGFzcyBUaWVyZWRTdG9yZUFkYXB0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIgaW1wbGVtZW50cyBLZXl2U3RvcmVBZGFwdGVyIHtcbiAgcmVhZG9ubHkgb3B0cyA9IHt9O1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsZXZlbHM6IHJlYWRvbmx5IENhY2hlTGV2ZWxbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IE1hcDxzdHJpbmcsIE11dGF0aW9uPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb21vdGlvbnMgPSBuZXcgU2V0PFByb21pc2U8dm9pZD4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgd3JpdGVEZWxheU1zOiBudW1iZXI7XG4gIHByaXZhdGUgZmx1c2hQcm9taXNlPzogUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSB0aW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIGRpc2Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGxldmVsczogcmVhZG9ubHkgQ2FjaGVMZXZlbFtdLCB3cml0ZURlbGF5TXM6IG51bWJlcikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sZXZlbHMgPSBsZXZlbHM7XG4gICAgdGhpcy53cml0ZURlbGF5TXMgPSB3cml0ZURlbGF5TXM7XG4gIH1cblxuICBhc3luYyBnZXQ8VmFsdWU+KGtleTogc3RyaW5nKTogUHJvbWlzZTxWYWx1ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG11dGF0aW9uID0gdGhpcy5wZW5kaW5nLmdldChrZXkpO1xuICAgIGlmIChtdXRhdGlvbj8ua2luZCA9PT0gXCJkZWxldGVcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobXV0YXRpb24/LmtpbmQgPT09IFwic2V0XCIpIHJldHVybiBtdXRhdGlvbi52YWx1ZSBhcyBWYWx1ZTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBsZXZlbF0gb2YgdGhpcy5sZXZlbHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGxldmVsLnN0b3JlLmdldDxWYWx1ZT4oa2V5KTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChpbmRleCA+IDApIHRoaXMucHJvbW90ZShrZXksIHZhbHVlLCB0aGlzLmxldmVscy5zbGljZSgwLCBpbmRleCkpO1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWFueTxWYWx1ZT4oa2V5czogc3RyaW5nW10pOiBQcm9taXNlPEFycmF5PFZhbHVlIHwgdW5kZWZpbmVkPj4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChrZXlzLm1hcCgoa2V5KSA9PiB0aGlzLmdldDxWYWx1ZT4oa2V5KSkpO1xuICB9XG5cbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgdHRsPzogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5hc3NlcnRDb25uZWN0ZWQoKTtcbiAgICB0aGlzLnBlbmRpbmcuc2V0KGtleSwgeyBraW5kOiBcInNldFwiLCB2YWx1ZSwgLi4uKHR0bCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHR0bCB9KSB9KTtcbiAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIHNldE1hbnkodmFsdWVzOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgdHRsPzogbnVtYmVyIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWx1ZXMpIGF3YWl0IHRoaXMuc2V0KGVudHJ5LmtleSwgZW50cnkudmFsdWUsIGVudHJ5LnR0bCk7XG4gIH1cblxuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmFzc2VydENvbm5lY3RlZCgpO1xuICAgIHRoaXMucGVuZGluZy5zZXQoa2V5LCB7IGtpbmQ6IFwiZGVsZXRlXCIgfSk7XG4gICAgdGhpcy5zY2hlZHVsZSgpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVNYW55KGtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoa2V5cy5tYXAoKGtleSkgPT4gdGhpcy5kZWxldGUoa2V5KSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgaGFzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZy5nZXQoa2V5KTtcbiAgICBpZiAocGVuZGluZykgcmV0dXJuIHBlbmRpbmcua2luZCA9PT0gXCJzZXRcIjtcbiAgICBmb3IgKGNvbnN0IGxldmVsIG9mIHRoaXMubGV2ZWxzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGxldmVsLnN0b3JlLmhhcyA/IGF3YWl0IGxldmVsLnN0b3JlLmhhcyhrZXkpIDogKGF3YWl0IGxldmVsLnN0b3JlLmdldChrZXkpKSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0Q29ubmVjdGVkKCk7XG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xuICAgIHRoaXMucGVuZGluZy5jbGVhcigpO1xuICAgIGF3YWl0IHNldHRsZUxldmVscyh0aGlzLmxldmVscywgKGxldmVsKSA9PiBsZXZlbC5zdG9yZS5jbGVhcigpLCBcImNsZWFyXCIpO1xuICB9XG5cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgIHRoaXMudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5mbHVzaFByb21pc2UpIHtcbiAgICAgIHRoaXMuZmx1c2hQcm9taXNlID0gdGhpcy5mbHVzaFBlbmRpbmcoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5mbHVzaFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5mbHVzaFByb21pc2U7XG4gICAgYXdhaXQgdGhpcy5mbHVzaFByb21vdGlvbnMoKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nLnNpemUgPiAwKSBhd2FpdCB0aGlzLmZsdXNoKCk7XG4gIH1cblxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpc2Nvbm5lY3RlZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuZmx1c2goKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgYXdhaXQgc2V0dGxlTGV2ZWxzKFxuICAgICAgdGhpcy5sZXZlbHMuZmlsdGVyKChsZXZlbCkgPT4gbGV2ZWwuc3RvcmUuZGlzY29ubmVjdCksXG4gICAgICAobGV2ZWwpID0+IGxldmVsLnN0b3JlLmRpc2Nvbm5lY3QhKCksXG4gICAgICBcImRpc2Nvbm5lY3RcIixcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRDb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzY29ubmVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZSBwZXJzaXN0ZW5jZSBpcyBkaXNjb25uZWN0ZWRcIik7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyIHx8IHRoaXMuZmx1c2hQcm9taXNlKSByZXR1cm47XG4gICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIHZvaWQgdGhpcy5mbHVzaCgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIud2FybihcImNhY2hlIHBlcnNpc3RlbmNlIGZsdXNoIGZhaWxlZFwiLCB7IGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpIH0pO1xuICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9LCB0aGlzLndyaXRlRGVsYXlNcyk7XG4gICAgdGhpcy50aW1lci51bnJlZj8uKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZsdXNoUGVuZGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5wZW5kaW5nLnNpemUgPiAwKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IG5ldyBNYXAodGhpcy5wZW5kaW5nKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGJhdGNoLmtleXMoKSkgdGhpcy5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgY29uc3QgZmFpbHVyZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IG11dGF0aW9uOiBNdXRhdGlvbjsgZXJyb3I6IHVua25vd24gfT4gPSBbXTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBbLi4uYmF0Y2hdLm1hcChhc3luYyAoW2tleSwgbXV0YXRpb25dKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHNldHRsZUxldmVscyhcbiAgICAgICAgICAgICAgdGhpcy5sZXZlbHMsXG4gICAgICAgICAgICAgIChsZXZlbCkgPT5cbiAgICAgICAgICAgICAgICBtdXRhdGlvbi5raW5kID09PSBcInNldFwiXG4gICAgICAgICAgICAgICAgICA/IGxldmVsLnN0b3JlLnNldChrZXksIG11dGF0aW9uLnZhbHVlLCBtdXRhdGlvbi50dGwpXG4gICAgICAgICAgICAgICAgICA6IGxldmVsLnN0b3JlLmRlbGV0ZShrZXkpLFxuICAgICAgICAgICAgICBtdXRhdGlvbi5raW5kLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh7IGtleSwgbXV0YXRpb24sIGVycm9yIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGZhaWx1cmVzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmcuaGFzKGZhaWx1cmUua2V5KSkgdGhpcy5wZW5kaW5nLnNldChmYWlsdXJlLmtleSwgZmFpbHVyZS5tdXRhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgIGZhaWx1cmVzLm1hcCgoZmFpbHVyZSkgPT4gZmFpbHVyZS5lcnJvciksXG4gICAgICAgICAgYENhY2hlIHBlcnNpc3RlbmNlIGZhaWxlZCBmb3IgJHtmYWlsdXJlcy5sZW5ndGh9IG11dGF0aW9uKHMpYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb21vdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBsZXZlbHM6IHJlYWRvbmx5IENhY2hlTGV2ZWxbXSk6IHZvaWQge1xuICAgIGNvbnN0IHByb21vdGlvbiA9IHNldHRsZUxldmVscyhsZXZlbHMsIChsZXZlbCkgPT4gbGV2ZWwuc3RvcmUuc2V0KGtleSwgdmFsdWUpLCBcInByb21vdGVcIilcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJjYWNoZSBwZXJzaXN0ZW5jZSBwcm9tb3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9tb3Rpb25zLmRlbGV0ZShwcm9tb3Rpb24pO1xuICAgICAgfSk7XG4gICAgdGhpcy5wcm9tb3Rpb25zLmFkZChwcm9tb3Rpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmbHVzaFByb21vdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRoaXMucHJvbW90aW9ucy5zaXplID4gMCkgYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnRoaXMucHJvbW90aW9uc10pO1xuICB9XG59XG5cbi8qKiBDcmVhdGUgYSBtZW1vcnktZmlyc3QgY2FjaGUgd2l0aCBvcHRpb25hbCBvcmRlcmVkIHBlcnNpc3RlbnQgbGV2ZWxzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhY2hlKG9wdGlvbnM6IENhY2hlT3B0aW9ucyA9IHt9KTogQ2FjaGVhYmxlIHtcbiAgY29uc3QgbWF4RW50cmllcyA9IHBvc2l0aXZlSW50ZWdlcihvcHRpb25zLm1heEVudHJpZXMsIERFRkFVTFRfTUFYX0VOVFJJRVMsIFwibWF4RW50cmllc1wiKTtcbiAgY29uc3Qgd3JpdGVEZWxheU1zID0gbm9uTmVnYXRpdmVJbnRlZ2VyKFxuICAgIG9wdGlvbnMud3JpdGVEZWxheU1zLFxuICAgIERFRkFVTFRfV1JJVEVfREVMQVlfTVMsXG4gICAgXCJ3cml0ZURlbGF5TXNcIixcbiAgKTtcbiAgY29uc3QgcHJpbWFyeSA9IG5ldyBLZXl2KHtcbiAgICBzdG9yZTogbmV3IEtleXZDYWNoZWFibGVNZW1vcnkoe1xuICAgICAgbHJ1U2l6ZTogbWF4RW50cmllcyxcbiAgICAgIHR0bDogb3B0aW9ucy50dGwsXG4gICAgICB1c2VDbG9uZTogb3B0aW9ucy51c2VDbG9uZSA/PyB0cnVlLFxuICAgIH0pLFxuICAgIC4uLih0eXBlb2Ygb3B0aW9ucy50dGwgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLnR0bClcbiAgICAgID8geyB0dGw6IG9wdGlvbnMudHRsIH1cbiAgICAgIDoge30pLFxuICB9KTtcbiAgcHJpbWFyeS5zZXJpYWxpemUgPSB1bmRlZmluZWQ7XG4gIHByaW1hcnkuZGVzZXJpYWxpemUgPSB1bmRlZmluZWQ7XG4gIGNvbnN0IGFkYXB0ZXIgPSBvcHRpb25zLmxldmVscz8ubGVuZ3RoXG4gICAgPyBuZXcgVGllcmVkU3RvcmVBZGFwdGVyKG9wdGlvbnMubGV2ZWxzLCB3cml0ZURlbGF5TXMpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlY29uZGFyeSA9IGFkYXB0ZXIgPyBuZXcgS2V5dih7IHN0b3JlOiBhZGFwdGVyIH0pIDogdW5kZWZpbmVkO1xuICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZWFibGUoe1xuICAgIHByaW1hcnksXG4gICAgLi4uKHNlY29uZGFyeSA/IHsgc2Vjb25kYXJ5LCBub25CbG9ja2luZzogdHJ1ZSB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLmNhY2hlSWQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBjYWNoZUlkOiBvcHRpb25zLmNhY2hlSWQgfSksXG4gICAgLi4uKG9wdGlvbnMubWF4VHRsID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbWF4VHRsOiBvcHRpb25zLm1heFR0bCB9KSxcbiAgICAuLi4ob3B0aW9ucy5uYW1lc3BhY2UgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBuYW1lc3BhY2U6IG9wdGlvbnMubmFtZXNwYWNlIH0pLFxuICAgIC4uLihvcHRpb25zLnN0YXRzID09PSB1bmRlZmluZWQgPyB7fSA6IHsgc3RhdHM6IG9wdGlvbnMuc3RhdHMgfSksXG4gICAgLi4uKG9wdGlvbnMudGFncyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHRhZ3M6IG9wdGlvbnMudGFncyB9KSxcbiAgICAuLi4ob3B0aW9ucy50dGwgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0dGw6IG9wdGlvbnMudHRsIH0pLFxuICB9KTtcbiAgaW5zdGFsbFZhbHVlRW52ZWxvcGUoY2FjaGUpO1xuICBjYWNoZS5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgIGxvZ2dlci53YXJuKFwiY2FjaGVhYmxlIG9wZXJhdGlvbiBmYWlsZWRcIiwgeyBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSB9KTtcbiAgfSk7XG4gIHN0YXRlcy5zZXQoY2FjaGUsIHsgYWRhcHRlciwgY2xvc2VkOiBmYWxzZSB9KTtcbiAgcmV0dXJuIGNhY2hlO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgZGVmYXVsdCBwb3J0YWJsZSBkaXNrIHBhdGggZm9yIGEgcHJvamVjdCBjYWNoZSBzY29wZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZVBhdGgoXG4gIHNjb3BlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFBpY2s8UHJvamVjdENhY2hlT3B0aW9ucywgXCJjYWNoZURpclwiIHwgXCJwcm9qZWN0TmFtZVwiPiA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvamVjdE5hbWUgPSBvcHRpb25zLnByb2plY3ROYW1lID8/IHByb2plY3RVdGlscy5uYW1lKCk7XG4gIGNvbnN0IHJvb3QgPSBvcHRpb25zLmNhY2hlRGlyID8/IGVudlBhdGhzKFwiZGJ4LXRvb2xzXCIsIHsgc3VmZml4OiBcIlwiIH0pLmNhY2hlO1xuICByZXR1cm4gam9pbihyb290LCBcImNhY2hlXCIsIHNhZmVTZWdtZW50KHByb2plY3ROYW1lKSwgYCR7c2FmZVNlZ21lbnQoc2NvcGUpfS5qc29uYCk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgcHJvY2Vzcy1zaGFyZWQgcHJvamVjdCBjYWNoZS4gQnkgZGVmYXVsdCBpdCBpcyBtZW1vcnktZmlyc3Qgd2l0aCBhXG4gKiBwb3J0YWJsZSBrZXl2LWZpbGUgc2Vjb25kYXJ5IHNjb3BlZCBieSBwcm9qZWN0IGFuZCBsb2dpY2FsIGNhY2hlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0Q2FjaGUoc2NvcGU6IHN0cmluZywgb3B0aW9uczogUHJvamVjdENhY2hlT3B0aW9ucyA9IHt9KTogQ2FjaGVhYmxlIHtcbiAgY29uc3QgcGF0aCA9IGNhY2hlUGF0aChzY29wZSwgb3B0aW9ucyk7XG4gIGNvbnN0IHJlZ2lzdHJ5S2V5ID0gSlNPTi5zdHJpbmdpZnkoW3BhdGgsIG9wdGlvbnMuZGlzayAhPT0gZmFsc2VdKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBwcm9qZWN0Q2FjaGVzLmdldChyZWdpc3RyeUtleSk7XG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuXG4gIGNvbnN0IGxldmVscyA9IFsuLi4ob3B0aW9ucy5sZXZlbHMgPz8gW10pXTtcbiAgaWYgKG9wdGlvbnMuZGlzayAhPT0gZmFsc2UpIHtcbiAgICBsZXZlbHMucHVzaCh7XG4gICAgICBuYW1lOiBcImRpc2tcIixcbiAgICAgIHN0b3JlOiBuZXcgS2V5dkZpbGUoe1xuICAgICAgICBmaWxlbmFtZTogcGF0aCxcbiAgICAgICAgd3JpdGVEZWxheTogbm9uTmVnYXRpdmVJbnRlZ2VyKG9wdGlvbnMuZGlza1dyaXRlRGVsYXlNcywgMTAwLCBcImRpc2tXcml0ZURlbGF5TXNcIiksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBjYWNoZSA9IGNyZWF0ZUNhY2hlKHsgLi4ub3B0aW9ucywgbGV2ZWxzIH0pO1xuICBjb25zdCBzdGF0ZSA9IHJlcXVpcmVTdGF0ZShjYWNoZSk7XG4gIHN0YXRlLnBhdGggPSBwYXRoO1xuICBzdGF0ZS5yZWdpc3RyeUtleSA9IHJlZ2lzdHJ5S2V5O1xuICBwcm9qZWN0Q2FjaGVzLnNldChyZWdpc3RyeUtleSwgY2FjaGUpO1xuICByZXR1cm4gY2FjaGU7XG59XG5cbi8qKiBXYWl0IGZvciBhbGwgdHJhY2tlZCB3cml0ZS1iZWhpbmQgcGVyc2lzdGVuY2Ugd2l0aG91dCBjbG9zaW5nIHRoZSBjYWNoZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaENhY2hlKGNhY2hlOiBDYWNoZWFibGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVxdWlyZVN0YXRlKGNhY2hlKS5hZGFwdGVyPy5mbHVzaCgpO1xufVxuXG4vKiogRmx1c2ggcGVuZGluZyBwZXJzaXN0ZW5jZSBhbmQgZGlzY29ubmVjdCBhbGwgY2FjaGUgbGV2ZWxzLiBJZGVtcG90ZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQ2FjaGUoY2FjaGU6IENhY2hlYWJsZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGF0ZSA9IHJlcXVpcmVTdGF0ZShjYWNoZSk7XG4gIGlmIChzdGF0ZS5jbG9zZWQpIHJldHVybjtcbiAgYXdhaXQgc3RhdGUuYWRhcHRlcj8uZGlzY29ubmVjdCgpO1xuICBzdGF0ZS5jbG9zZWQgPSB0cnVlO1xuICBpZiAoc3RhdGUucmVnaXN0cnlLZXkgJiYgcHJvamVjdENhY2hlcy5nZXQoc3RhdGUucmVnaXN0cnlLZXkpID09PSBjYWNoZSkge1xuICAgIHByb2plY3RDYWNoZXMuZGVsZXRlKHN0YXRlLnJlZ2lzdHJ5S2V5KTtcbiAgfVxufVxuXG4vKiogSXRlcmF0ZSBrZXlzIGN1cnJlbnRseSByZXRhaW5lZCBieSB0aGUgYm91bmRlZCBtZW1vcnkgcHJpbWFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUtleXMoY2FjaGU6IENhY2hlYWJsZSk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiB7XG4gIGNvbnN0IHN0b3JlID0gY2FjaGUucHJpbWFyeS5zdG9yZTtcbiAgaWYgKCEoc3RvcmUgaW5zdGFuY2VvZiBLZXl2Q2FjaGVhYmxlTWVtb3J5KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYWNoZSBwcmltYXJ5IGlzIG5vdCBDYWNoZWFibGUgbWVtb3J5XCIpO1xuICB9XG4gIHJldHVybiBzdG9yZS5zdG9yZS5rZXlzO1xufVxuXG4vKiogRGVsZXRlIGEgbm9ybWFsIGNhY2hlIHZhbHVlIGFuZCBpdHMgb3B0aW9uYWwgY2FjaGVkLW9uLWVycm9yIGNvbXBhbmlvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVDYWNoZWRWYWx1ZShjYWNoZTogQ2FjaGVhYmxlLCBrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbdmFsdWUsIGZhbGxiYWNrXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBjYWNoZS5kZWxldGUoa2V5KSxcbiAgICBjYWNoZS5kZWxldGUoY2FjaGVkT25FcnJvcktleShrZXkpKSxcbiAgXSk7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlIHx8IGZhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBVc2UgQ2FjaGVhYmxlJ3MgbmF0aXZlIGluLWZsaWdodCBnZXQtb3Itc2V0IGJlaGF2aW9yLCBvcHRpb25hbGx5IHJldGFpbmluZyBhXG4gKiBzdWNjZXNzZnVsIHZhbHVlIHVuZGVyIGEgc2VwYXJhdGUga2V5IGZvciByZWNvdmVyeSB3aGVuIGEgbGF0ZXIgbG9hZGVyIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JTZXQ8VD4oXG4gIGNhY2hlOiBDYWNoZWFibGUsXG4gIGtleTogc3RyaW5nLFxuICBsb2FkOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBvcHRpb25zOiBHZXRPclNldE9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IHJldHVybkNhY2hlZE9uRXJyb3IgPSBmYWxzZSwgY2FjaGVkT25FcnJvclR0bCA9IDAsIC4uLmNhY2hlYWJsZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gIGlmICghcmV0dXJuQ2FjaGVkT25FcnJvcikgcmV0dXJuIGNhY2hlLmdldE9yU2V0KGtleSwgbG9hZCwgY2FjaGVhYmxlT3B0aW9ucyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY2FjaGUuZ2V0T3JTZXQoXG4gICAgICBrZXksXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgbG9hZCgpO1xuICAgICAgICBhd2FpdCBjYWNoZS5zZXQoY2FjaGVkT25FcnJvcktleShrZXkpLCB2YWx1ZSwgeyB0dGw6IGNhY2hlZE9uRXJyb3JUdGwgfSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICB7IC4uLmNhY2hlYWJsZU9wdGlvbnMsIHRocm93RXJyb3JzOiB0cnVlIH0sXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZS5nZXQ8VD4oY2FjaGVkT25FcnJvcktleShrZXkpKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgaWYgKGNhY2hlYWJsZU9wdGlvbnMudGhyb3dFcnJvcnMpIHRocm93IGVycm9yO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbFZhbHVlRW52ZWxvcGUoY2FjaGU6IENhY2hlYWJsZSk6IHZvaWQge1xuICBjYWNoZS5vbkhvb2soQ2FjaGVhYmxlSG9va3MuQkVGT1JFX1NFVCwgKGl0ZW0pID0+IHtcbiAgICBpdGVtLnZhbHVlID0gZW52ZWxvcGUoaXRlbS52YWx1ZSk7XG4gIH0pO1xuICBjYWNoZS5vbkhvb2soQ2FjaGVhYmxlSG9va3MuQkVGT1JFX1NFVF9NQU5ZLCAoaXRlbXMpID0+IHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIGl0ZW0udmFsdWUgPSBlbnZlbG9wZShpdGVtLnZhbHVlKTtcbiAgfSk7XG4gIGNhY2hlLm9uSG9vayhDYWNoZWFibGVIb29rcy5BRlRFUl9HRVQsIChpdGVtKSA9PiB7XG4gICAgaWYgKGl0ZW0ucmVzdWx0KSBpdGVtLnJlc3VsdC52YWx1ZSA9IHVud3JhcChpdGVtLnJlc3VsdC52YWx1ZSk7XG4gIH0pO1xuICBjYWNoZS5vbkhvb2soQ2FjaGVhYmxlSG9va3MuQUZURVJfR0VUX01BTlksIChpdGVtKSA9PiB7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgaXRlbS5yZXN1bHQpIHtcbiAgICAgIGlmIChyZXN1bHQpIHJlc3VsdC52YWx1ZSA9IHVud3JhcChyZXN1bHQudmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVudmVsb3BlKHZhbHVlOiB1bmtub3duKTogVmFsdWVFbnZlbG9wZSB7XG4gIHJldHVybiB7IF9fZGJ4VG9vbHNDYWNoZUVudmVsb3BlOiBFTlZFTE9QRV9WRVJTSU9OLCB2YWx1ZSB9O1xufVxuXG5mdW5jdGlvbiB1bndyYXAodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzRW52ZWxvcGUodmFsdWUpID8gdmFsdWUudmFsdWUgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNFbnZlbG9wZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFZhbHVlRW52ZWxvcGUge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwiX19kYnhUb29sc0NhY2hlRW52ZWxvcGVcIiBpbiB2YWx1ZSAmJlxuICAgICh2YWx1ZSBhcyBWYWx1ZUVudmVsb3BlKS5fX2RieFRvb2xzQ2FjaGVFbnZlbG9wZSA9PT0gRU5WRUxPUEVfVkVSU0lPTiAmJlxuICAgIFwidmFsdWVcIiBpbiB2YWx1ZSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2FjaGVkT25FcnJvcktleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtFUlJPUl9WQUxVRV9QUkVGSVh9JHtrZXl9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dGxlTGV2ZWxzKFxuICBsZXZlbHM6IHJlYWRvbmx5IENhY2hlTGV2ZWxbXSxcbiAgb3BlcmF0aW9uOiAobGV2ZWw6IENhY2hlTGV2ZWwpID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+LFxuICBvcGVyYXRpb25OYW1lOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChsZXZlbHMubWFwKChsZXZlbCkgPT4gb3BlcmF0aW9uKGxldmVsKSkpO1xuICBjb25zdCBlcnJvcnMgPSByZXN1bHRzLmZsYXRNYXAoKHJlc3VsdCwgaW5kZXgpID0+XG4gICAgcmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiXG4gICAgICA/IFtcbiAgICAgICAgICBuZXcgRXJyb3IoYCR7bGV2ZWxzW2luZGV4XT8ubmFtZSA/PyBgbGV2ZWwtJHtpbmRleCArIDF9YH0gJHtvcGVyYXRpb25OYW1lfSBmYWlsZWRgLCB7XG4gICAgICAgICAgICBjYXVzZTogcmVzdWx0LnJlYXNvbixcbiAgICAgICAgICB9KSxcbiAgICAgICAgXVxuICAgICAgOiBbXSxcbiAgKTtcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBgQ2FjaGUgJHtvcGVyYXRpb25OYW1lfSBmYWlsZWRgKTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZVN0YXRlKGNhY2hlOiBDYWNoZWFibGUpOiBDYWNoZVN0YXRlIHtcbiAgY29uc3Qgc3RhdGUgPSBzdGF0ZXMuZ2V0KGNhY2hlKTtcbiAgaWYgKCFzdGF0ZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhY2hlIHdhcyBub3QgY3JlYXRlZCBieSBAZGJ4LXRvb2xzL2NhY2hlXCIpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmZ1bmN0aW9uIHNhZmVTZWdtZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlLnRyaW0oKSB8fCBcImRlZmF1bHRcIik7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aXZlSW50ZWdlcih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCByZXNvbHZlZCA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocmVzb2x2ZWQpIHx8IHJlc29sdmVkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuZnVuY3Rpb24gbm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHJlc29sdmVkID0gdmFsdWUgPz8gZmFsbGJhY2s7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihyZXNvbHZlZCkgfHwgcmVzb2x2ZWQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuIl19
package/package.json CHANGED
@@ -24,10 +24,11 @@
24
24
  "vitest": "3.2.4"
25
25
  },
26
26
  "dependencies": {
27
- "@dbx-tools/core": "^0.9.150",
28
- "@dbx-tools/shared-core": "^0.9.150",
27
+ "@dbx-tools/core": "^0.9.151",
28
+ "@dbx-tools/shared-core": "^0.9.151",
29
29
  "cacheable": "2.5.0",
30
30
  "env-paths": "^4.0.0",
31
+ "keyv": "5.6.0",
31
32
  "keyv-file": "5.3.5"
32
33
  },
33
34
  "main": "./lib/index.js",
@@ -52,7 +53,7 @@
52
53
  "./package.json": "./package.json"
53
54
  }
54
55
  },
55
- "version": "0.9.150",
56
+ "version": "0.9.151",
56
57
  "types": "./lib/index.d.ts",
57
58
  "dbxToolsConfig": {
58
59
  "tags": [
package/src/cache.ts CHANGED
@@ -11,13 +11,13 @@ import { errorUtils, log } from "@dbx-tools/shared-core";
11
11
  import {
12
12
  Cacheable,
13
13
  CacheableHooks,
14
- createKeyv,
15
14
  KeyvCacheableMemory,
16
15
  type CacheableOptions,
17
16
  type GetOrSetFunctionOptions,
18
17
  type KeyvStoreAdapter,
19
18
  } from "cacheable";
20
19
  import envPaths from "env-paths";
20
+ import { Keyv } from "keyv";
21
21
  import { KeyvFile } from "keyv-file";
22
22
 
23
23
  const DEFAULT_MAX_ENTRIES = 1_000;
@@ -281,17 +281,25 @@ export function createCache(options: CacheOptions = {}): Cacheable {
281
281
  DEFAULT_WRITE_DELAY_MS,
282
282
  "writeDelayMs",
283
283
  );
284
- const primary = createKeyv({
285
- lruSize: maxEntries,
286
- ttl: options.ttl,
287
- useClone: options.useClone ?? true,
284
+ const primary = new Keyv({
285
+ store: new KeyvCacheableMemory({
286
+ lruSize: maxEntries,
287
+ ttl: options.ttl,
288
+ useClone: options.useClone ?? true,
289
+ }),
290
+ ...(typeof options.ttl === "number" && Number.isInteger(options.ttl)
291
+ ? { ttl: options.ttl }
292
+ : {}),
288
293
  });
294
+ primary.serialize = undefined;
295
+ primary.deserialize = undefined;
289
296
  const adapter = options.levels?.length
290
297
  ? new TieredStoreAdapter(options.levels, writeDelayMs)
291
298
  : undefined;
299
+ const secondary = adapter ? new Keyv({ store: adapter }) : undefined;
292
300
  const cache = new Cacheable({
293
301
  primary,
294
- ...(adapter ? { secondary: adapter, nonBlocking: true } : {}),
302
+ ...(secondary ? { secondary, nonBlocking: true } : {}),
295
303
  ...(options.cacheId === undefined ? {} : { cacheId: options.cacheId }),
296
304
  ...(options.maxTtl === undefined ? {} : { maxTtl: options.maxTtl }),
297
305
  ...(options.namespace === undefined ? {} : { namespace: options.namespace }),