mnemonica 1.0.7 → 1.0.9

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.
@@ -229,7 +229,7 @@ declare module 'mnemonica' {
229
229
  }
230
230
  }
231
231
 
232
- const RequestData = lookup('RequestData'); // typed constructor | undefined
232
+ const RequestData = lookup('RequestData'); // typed constructor
233
233
  ```
234
234
 
235
235
  ---
@@ -286,7 +286,7 @@ Because without the augmentation, `TypeRegistry` is empty and `lookup()` falls b
286
286
  export function lookup<const K extends keyof TypeRegistry>(
287
287
  this: unknown,
288
288
  TypeNestedPath: K
289
- ): TypeRegistry[K] | undefined;
289
+ ): TypeRegistry[K];
290
290
  export function lookup(
291
291
  this: unknown,
292
292
  TypeNestedPath: string
@@ -39,7 +39,7 @@ That bypasses the type system. The right answer is to teach TypeScript what the
39
39
 
40
40
  ## The mechanism in one paragraph
41
41
 
42
- `mnemonica` exports an empty `interface TypeRegistry {}`. `lookup<const K extends keyof TypeRegistry>(path: K)` returns `TypeRegistry[K] | undefined`. So a `declare module 'mnemonica' { interface TypeRegistry { ... } }` augmentation in your project — by hand, or generated by tactica — gives `lookup('Path.To.Type')` a fully typed return value. Zero casts.
42
+ `mnemonica` exports an empty `interface TypeRegistry {}`. `lookup<const K extends keyof TypeRegistry>(path: K)` returns `TypeRegistry[K]`. So a `declare module 'mnemonica' { interface TypeRegistry { ... } }` augmentation in your project — by hand, or generated by tactica — gives `lookup('Path.To.Type')` a fully typed return value. Zero casts.
43
43
 
44
44
  After augmentation, TypeScript knows:
45
45
  - The constructor arguments for each type
@@ -63,6 +63,24 @@ define('Parent.Child', function (this: Child, data: Data) {
63
63
  });
64
64
  ```
65
65
 
66
+ ## Export root constructors only when needed; never export subtypes
67
+
68
+ Subtypes live on the parent constructor and on parent instances. Exporting a subtype splits the Trie and usually loses the parent part of the chain.
69
+
70
+ ```typescript
71
+ // WRONG
72
+ export const Admin = User.define('Admin', function (this: Admin, data: AdminData) {
73
+ Object.assign(this, data);
74
+ });
75
+
76
+ // RIGHT
77
+ User.define('Admin', function (this: Admin, data: AdminData) {
78
+ Object.assign(this, data);
79
+ });
80
+ ```
81
+
82
+ Root constructors **may** be exported when tactica has generated standalone instance types that include the sub-constructor chain, so consumers can do `new user.Admin(...)`. Even then, `lookup('User')` is the safer default.
83
+
66
84
  ## Config Options
67
85
 
68
86
  | Option | Default | Description |
package/AGENTS.md CHANGED
@@ -105,7 +105,7 @@ export interface TypeRegistry {
105
105
  export function lookup<const K extends keyof TypeRegistry>(
106
106
  this: unknown,
107
107
  TypeNestedPath: K
108
- ): TypeRegistry[K] | undefined;
108
+ ): TypeRegistry[K];
109
109
  export function lookup(
110
110
  this: unknown,
111
111
  TypeNestedPath: string
package/README.md CHANGED
@@ -60,6 +60,8 @@ getProps(engineer); // { __type__, __parent__, __args__, __timestamp
60
60
 
61
61
  The key inversion: `new` is called on the *parent instance* (`alice`), not on the class. Every `Employee` remembers which specific `Person` it came from. The prototype chain is a path; the path is the identity.
62
62
 
63
+ > **Typed projects:** subtypes must never be `export`ed — they live on the parent constructor and on parent instances. Root constructors may be exported only when tactica has generated standalone instance types that carry the subtype chain, but `lookup('Person')` is the safer default and keeps consumers decoupled from the model file.
64
+
63
65
  ---
64
66
 
65
67
  ## The four data mistakes mnemonica fixes
package/build/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- import type { CreateTypesCollectionFunction, IDEF, hook, hooksTypes, constructorOptions, Proto, Constructor, DecoratedClass, TypeClass, TypeAbsorber, MnemonicaModule, InstanceResult, Merge } from './types';
1
+ import type { CreateTypesCollectionFunction, IDEF, hook, hooksTypes, constructorOptions, Proto, IDefinitorInstance, Constructor, DecoratedClass, TypeClass, MnemonicaModule, InstanceResult, Merge } from './types';
2
2
  export declare const isClass: (fn: import("./api/types/compileNewModificatorFunctionBody").ConstructHandler) => boolean, findSubTypeFromParent: (instance: import("./api/utils/index").parentSub | object | undefined, subType: string) => import("./api/utils/index").parentSub | null;
3
3
  export type { IDEF, TypeConstructor, TypeConstructorBase, InstanceOfTypeRegistry, LiteralKeysOf, ParentPath, PathOfInstance, AllParentPrefixes, ParentPathOfInstance, _Internal_TC_, Proto, ProtoFlat, hooksOpts, hook, hooksTypes, TypesCollection } from './types';
4
4
  export interface TypeRegistry {
5
5
  }
6
6
  export { getProps, setProps } from './api/types/Props';
7
7
  export declare const defaultTypes: import("./types").TypesCollection;
8
- export declare const define: TypeAbsorber;
9
- export declare function lookup<const K extends keyof TypeRegistry>(this: unknown, TypeNestedPath: K): TypeRegistry[K] | undefined;
8
+ export declare function define<T extends object, P extends object = object, N extends Proto<P, T> = Proto<P, T>, R extends IDefinitorInstance<N> = IDefinitorInstance<N>>(this: unknown, TypeName?: string | CallableFunction | NewableFunction, constructHandler?: IDEF<T> | CallableFunction | NewableFunction | object | boolean, config?: constructorOptions): R;
9
+ export declare function lookup<const K extends keyof TypeRegistry>(this: unknown, TypeNestedPath: K): TypeRegistry[K];
10
10
  export declare function lookup(this: unknown, TypeNestedPath: string): TypeClass | undefined;
11
11
  export declare const apply: <E extends object, T extends object, S extends Proto<E, T>>(entity: E, Ctor: IDEF<T>, args?: unknown[]) => InstanceResult<Merge<E, T>>;
12
12
  export declare const call: <E extends object, T extends object, S extends Proto<E, T>>(entity: E, Ctor: IDEF<T>, ...args: unknown[]) => InstanceResult<Merge<E, T>>;
package/build/index.js CHANGED
@@ -37,7 +37,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  var _a;
39
39
  Object.defineProperty(exports, "__esModule", { value: true });
40
- exports.defineStackCleaner = exports.utils = exports.errors = exports.defaultCollection = exports.createTypesCollection = exports.ErrorMessages = exports.TYPE_TITLE_PREFIX = exports.MNEMOSYNE = exports.MNEMONICA = exports.SymbolConfig = exports.SymbolDefaultTypesCollection = exports.SymbolConstructorName = exports.SymbolParentType = exports._lookup = exports._define = exports.mnemonica = exports.registerHook = exports.decorate = exports.bind = exports.call = exports.apply = exports.define = exports.defaultTypes = exports.setProps = exports.getProps = exports.findSubTypeFromParent = exports.isClass = void 0;
40
+ exports.defineStackCleaner = exports.utils = exports.errors = exports.defaultCollection = exports.createTypesCollection = exports.ErrorMessages = exports.TYPE_TITLE_PREFIX = exports.MNEMOSYNE = exports.MNEMONICA = exports.SymbolConfig = exports.SymbolDefaultTypesCollection = exports.SymbolConstructorName = exports.SymbolParentType = exports._lookup = exports._define = exports.mnemonica = exports.registerHook = exports.decorate = exports.bind = exports.call = exports.apply = exports.defaultTypes = exports.setProps = exports.getProps = exports.findSubTypeFromParent = exports.isClass = void 0;
41
+ exports.define = define;
41
42
  exports.lookup = lookup;
42
43
  const index_1 = __importDefault(require("./api/utils/index"));
43
44
  exports.isClass = index_1.default.isClass, exports.findSubTypeFromParent = index_1.default.findSubTypeFromParent;
@@ -56,12 +57,12 @@ function checkThis(pointer) {
56
57
  const result = pointer === exports.mnemonica || pointer === exports;
57
58
  return result;
58
59
  }
59
- exports.define = function (TypeName, constructHandler, config) {
60
+ function define(TypeName, constructHandler, config) {
60
61
  const types = checkThis(this) ? exports.defaultTypes : this || exports.defaultTypes;
61
62
  const defineResult = types
62
63
  .define(TypeName, constructHandler, config);
63
64
  return defineResult;
64
- };
65
+ }
65
66
  function lookup(TypeNestedPath) {
66
67
  const types = checkThis(this) ? exports.defaultTypes : this || exports.defaultTypes;
67
68
  const lookupResult = types.lookup(TypeNestedPath);
@@ -108,7 +109,7 @@ const decorate = function (target, config) {
108
109
  const decorator = function (cstr) {
109
110
  const { name } = cstr;
110
111
  if (parentType === undefined) {
111
- const decoratorResult = (0, exports.define)(name, cstr, opts);
112
+ const decoratorResult = define(name, cstr, opts);
112
113
  return decoratorResult;
113
114
  }
114
115
  const parent = parentType;
@@ -122,7 +123,7 @@ const registerHook = function (Ctor, hookType, cb) {
122
123
  Ctor.registerHook(hookType, cb);
123
124
  };
124
125
  exports.registerHook = registerHook;
125
- exports.mnemonica = Object.entries(Object.assign(Object.assign(Object.assign({ define: exports.define,
126
+ exports.mnemonica = Object.entries(Object.assign(Object.assign(Object.assign({ define,
126
127
  lookup,
127
128
  apply: exports.apply,
128
129
  call: exports.call,
@@ -148,4 +149,4 @@ var utils_1 = require("./utils");
148
149
  Object.defineProperty(exports, "utils", { enumerable: true, get: function () { return utils_1.utils; } });
149
150
  var utils_2 = require("./utils");
150
151
  Object.defineProperty(exports, "defineStackCleaner", { enumerable: true, get: function () { return utils_2.defineStackCleaner; } });
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0diLHdCQVFDO0FBcEdELDhEQUEyQztBQUUxQyxlQUFPLEdBRUosZUFBVSxVQURiLDZCQUFxQixHQUNsQixlQUFVLHVCQUFDO0FBa0NmLDJDQUUyQjtBQUQxQixpR0FBQSxRQUFRLE9BQUE7QUFBRSxpR0FBQSxRQUFRLE9BQUE7QUFHbkIsMkNBQXdDO0FBQ3hDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxxQkFBUyxDQUFDO0FBRTFCLHdEQUEwQztBQUMxQywrQ0FBNEM7QUFFNUMsTUFBTSxFQUFFLDBCQUEwQixFQUFFLEdBQUcseUJBQVcsQ0FBQyxXQUFXLENBQUM7QUFFL0Qsc0VBQStDO0FBQy9DLE1BQU0sRUFBRSw2QkFBNkIsRUFBRSxHQUFHLG1CQUFVLENBQUM7QUFFdEMsb0JBQVksR0FBTSx5QkFBVyxjQUFDO0FBRTdDLFNBQVMsU0FBUyxDQUFDLE9BQW9EO0lBQ3RFLE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxpQkFBUyxJQUFJLE9BQU8sS0FBSyxPQUFPLENBQUM7SUFDNUQsT0FBTyxNQUFNLENBQUM7QUFDZixDQUFDO0FBSVksUUFBQSxNQUFNLEdBQUcsVUFTckIsUUFBc0QsRUFFdEQsZ0JBQWtGLEVBQ2xGLE1BQTJCO0lBRTNCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLG9CQUFZLENBQUM7SUFFcEUsTUFBTSxZQUFZLEdBQUksS0FBa0M7U0FDdEQsTUFBTSxDQUNOLFFBQWtCLEVBQ2xCLGdCQUEyQixFQUMzQixNQUFNLENBQ1UsQ0FBQztJQUNuQixPQUFPLFlBQVksQ0FBQztBQUNyQixDQUFpQixDQUFD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Wiw2QkFBcUIsR0FRbEIsaUJBQVMsd0JBUFosb0NBQTRCLEdBT3pCLGlCQUFTLCtCQU5aLG9CQUFZLEdBTVQsaUJBQVMsZUFMWixpQkFBUyxHQUtOLGlCQUFTLFlBSlosaUJBQVMsR0FJTixpQkFBUyxZQUhaLHlCQUFpQixHQUdkLGlCQUFTLG9CQUZaLHFCQUFhLEdBRVYsaUJBQVMsZUFBQztBQUdELFFBQUEscUJBQXFCLEdBQ2pDLGlCQUFTLENBQUMscUJBQXNELENBQUM7QUFHckQsUUFBQSxpQkFBaUIsR0FBSSxvQkFBa0QsQ0FBQyxRQUFRLENBQUM7QUFDakYsUUFBQSxNQUFNLEdBQUcseUJBQVcsQ0FBQyxXQUFXLENBQUM7QUFFOUMsaUNBQWdDO0FBQXZCLDhGQUFBLEtBQUssT0FBQTtBQUNkLGlDQUE2QztBQUFwQywyR0FBQSxrQkFBa0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHNwYWNlLWJlZm9yZS1mdW5jdGlvbi1wYXJlbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdHlwZSB7XG5cdENyZWF0ZVR5cGVzQ29sbGVjdGlvbkZ1bmN0aW9uLFxuXHRJREVGLFxuXHRob29rLFxuXHRob29rc1R5cGVzLFxuXHRjb25zdHJ1Y3Rvck9wdGlvbnMsXG5cdFByb3RvLFxuXHRJRGVmaW5pdG9ySW5zdGFuY2UsXG5cdENvbnN0cnVjdG9yLFxuXHREZWNvcmF0ZWRDbGFzcyxcblx0VHlwZUNsYXNzLFxuXHRUeXBlQWJzb3JiZXIsXG5cdE1uZW1vbmljYU1vZHVsZSxcblx0SW5zdGFuY2VSZXN1bHQsXG5cdE1lcmdlXG59IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgVHlwZXNVdGlscyBmcm9tICcuL2FwaS91dGlscy9pbmRleCc7XG5leHBvcnQgY29uc3Qge1xuXHRpc0NsYXNzLFxuXHRmaW5kU3ViVHlwZUZyb21QYXJlbnQsXG59ID0gVHlwZXNVdGlscztcblxuZXhwb3J0IHR5cGUge1xuXHRJREVGLCBUeXBlQ29uc3RydWN0b3IsIFR5cGVDb25zdHJ1Y3RvckJhc2UsXG5cdEluc3RhbmNlT2ZUeXBlUmVnaXN0cnksIExpdGVyYWxLZXlzT2YsIFBhcmVudFBhdGgsIFBhdGhPZkluc3RhbmNlLFxuXHRBbGxQYXJlbnRQcmVmaXhlcywgUGFyZW50UGF0aE9mSW5zdGFuY2UsXG5cdF9JbnRlcm5hbF9UQ18sIFByb3RvLCBQcm90b0ZsYXQsXG5cdGhvb2tzT3B0cywgaG9vaywgaG9va3NUeXBlcywgVHlwZXNDb2xsZWN0aW9uXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFR5cGUtc2FmZSByZWdpc3RyeSBmb3IgbW5lbW9uaWNhIHR5cGVzLlxuICpcbiAqIFRoaXMgaW50ZXJmYWNlIHN0YXJ0cyBlbXB0eS4gQXBwbGljYXRpb24gY29kZSBvciBgQG1uZW1vbmljYS90YWN0aWNhYFxuICogYXVnbWVudHMgaXQgdGhyb3VnaCBUeXBlU2NyaXB0IG1vZHVsZSBkZWNsYXJhdGlvbiBtZXJnaW5nOlxuICpcbiAqIGBgYHRzXG4gKiBkZWNsYXJlIG1vZHVsZSAnbW5lbW9uaWNhJyB7XG4gKiAgIGludGVyZmFjZSBUeXBlUmVnaXN0cnkge1xuICogICAgICdNeVR5cGUnOiBUeXBlQ29uc3RydWN0b3I8TXlUeXBlSW5zdGFuY2U+O1xuICogICAgICdNeVR5cGUuU3ViVHlwZSc6IFR5cGVDb25zdHJ1Y3RvcjxTdWJUeXBlSW5zdGFuY2U+O1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBPbmNlIGF1Z21lbnRlZCwgYGxvb2t1cCgnTXlUeXBlJylgIGFuZCBgdXRpbHMucGFyZW50KGluc3RhbmNlLCAnTXlUeXBlJylgXG4gKiByZXNvbHZlIGtleXMgYWdhaW5zdCB0aGlzIHJlZ2lzdHJ5LiBVbmF1Z21lbnRlZCBrZXlzIGZhbGwgYmFjayB0byB0aGUgYnJvYWRcbiAqIGBUeXBlQ2xhc3MgfCB1bmRlZmluZWRgIHJldHVybiB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVSZWdpc3RyeSB7XG5cdC8vIEludGVudGlvbmFsbHkgZW1wdHkuIEF1Z21lbnQgdGhpcyBpbnRlcmZhY2UgdmlhIGRlY2xhcmF0aW9uIG1lcmdpbmdcblx0Ly8gKGhhbmQtd3JpdHRlbiBvciBnZW5lcmF0ZWQgYnkgQG1uZW1vbmljYS90YWN0aWNhKSB0byBlbmFibGUgdHlwZWRcblx0Ly8gdXRpbGl0aWVzIGxpa2UgbG9va3VwKCkgYW5kIHBhcmVudCgpLlxufVxuZXhwb3J0IHtcblx0Z2V0UHJvcHMsIHNldFByb3BzIFxufSBmcm9tICcuL2FwaS90eXBlcy9Qcm9wcyc7XG5cbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmNvbnN0IHsgb2RwIH0gPSBjb25zdGFudHM7XG5cbmltcG9ydCAqIGFzIGVycm9yc0FwaSBmcm9tICcuL2FwaS9lcnJvcnMnO1xuaW1wb3J0IHsgZGVzY3JpcHRvcnMgfSBmcm9tICcuL2Rlc2NyaXB0b3JzJztcblxuY29uc3QgeyBXUk9OR19NT0RJRklDQVRJT05fUEFUVEVSTiB9ID0gZGVzY3JpcHRvcnMuRXJyb3JzVHlwZXM7XG5cbmltcG9ydCBtbmVtb3N5bmVzIGZyb20gJy4vYXBpL3R5cGVzL01uZW1vc3luZSc7XG5jb25zdCB7IHByZXBhcmVTdWJ0eXBlRm9yQ29uc3RydWN0aW9uIH0gPSBtbmVtb3N5bmVzO1xuXG5leHBvcnQgY29uc3QgeyBkZWZhdWx0VHlwZXMsIH0gPSBkZXNjcmlwdG9ycztcblxuZnVuY3Rpb24gY2hlY2tUaGlzKHBvaW50ZXI6IHR5cGVvZiBtbmVtb25pY2EgfCB0eXBlb2YgZXhwb3J0cyB8IHVua25vd24pOiBib29sZWFuIHtcblx0Y29uc3QgcmVzdWx0ID0gcG9pbnRlciA9PT0gbW5lbW9uaWNhIHx8IHBvaW50ZXIgPT09IGV4cG9ydHM7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cblxuLy8gRGVmaW5lIGZ1bmN0aW9uIHVzaW5nIFR5cGVBYnNvcmJlciBpbnRlcmZhY2Ugd2l0aCBwcm9wZXIgdHlwZSBjYXN0aW5nXG5leHBvcnQgY29uc3QgZGVmaW5lID0gZnVuY3Rpb24gPFxuXHRUIGV4dGVuZHMgb2JqZWN0LFxuXHRQIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0LFxuXHROIGV4dGVuZHMgUHJvdG88UCwgVD4gPSBQcm90bzxQLCBUPixcblxuXHQvLyBoZXJlIElEZWZpbml0b3JJbnN0YW5jZSBpcyBhIENPTlNUUlVDVE9SICEhIVxuXHRSIGV4dGVuZHMgSURlZmluaXRvckluc3RhbmNlPE4+ID0gSURlZmluaXRvckluc3RhbmNlPE4+XG4+KFxuXHR0aGlzOiB1bmtub3duLFxuXHRUeXBlTmFtZT86IHN0cmluZyB8IENhbGxhYmxlRnVuY3Rpb24gfCBOZXdhYmxlRnVuY3Rpb24sXG5cdC8vIEFsbG93IGJvdGggc3RyaWN0IElERUYgYW5kIG1vcmUgZmxleGlibGUgZnVuY3Rpb24gc2lnbmF0dXJlc1xuXHRjb25zdHJ1Y3RIYW5kbGVyPzogSURFRjxUPiB8IENhbGxhYmxlRnVuY3Rpb24gfCBOZXdhYmxlRnVuY3Rpb24gfCBvYmplY3QgfCBib29sZWFuLFxuXHRjb25maWc/OiBjb25zdHJ1Y3Rvck9wdGlvbnMsXG4pOiBSIHtcblx0Y29uc3QgdHlwZXMgPSBjaGVja1RoaXModGhpcykgPyBkZWZhdWx0VHlwZXMgOiB0aGlzIHx8IGRlZmF1bHRUeXBlcztcblx0Ly8gVHlwZSBhc3NlcnRpb24gbmVlZGVkIGJlY2F1c2UgVHlwZXNDb2xsZWN0aW9uUHJveHkgaXMgYSBQcm94eVxuXHRjb25zdCBkZWZpbmVSZXN1bHQgPSAodHlwZXMgYXMgeyBkZWZpbmU6IFR5cGVBYnNvcmJlciB9KVxuXHRcdC5kZWZpbmUoXG5cdFx0XHRUeXBlTmFtZSBhcyBzdHJpbmcsXG5cdFx0XHRjb25zdHJ1Y3RIYW5kbGVyIGFzIElERUY8VD4sXG5cdFx0XHRjb25maWdcblx0XHQpIGFzIHVua25vd24gYXMgUjtcblx0cmV0dXJuIGRlZmluZVJlc3VsdDtcbn0gYXMgVHlwZUFic29yYmVyO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9va3VwPGNvbnN0IEsgZXh0ZW5kcyBrZXlvZiBUeXBlUmVnaXN0cnk+KFxuXHR0aGlzOiB1bmtub3duLFxuXHRUeXBlTmVzdGVkUGF0aDogS1xuKTogVHlwZVJlZ2lzdHJ5W0tdIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cCh0aGlzOiB1bmtub3duLCBUeXBlTmVzdGVkUGF0aDogc3RyaW5nKTogVHlwZUNsYXNzIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cChcblx0dGhpczogdW5rbm93bixcblx0VHlwZU5lc3RlZFBhdGg6IHN0cmluZ1xuKTogVHlwZUNsYXNzIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgdHlwZXMgPSBjaGVja1RoaXModGhpcykgPyBkZWZhdWx0VHlwZXMgOiB0aGlzIHx8IGRlZmF1bHRUeXBlcztcblx0Ly8gVHlwZSBhc3NlcnRpb24gbmVlZGVkIGJlY2F1c2UgVHlwZXNDb2xsZWN0aW9uUHJveHkgaXMgYSBQcm94eVxuXHRjb25zdCBsb29rdXBSZXN1bHQgPSAodHlwZXMgYXMgeyBsb29rdXA6IChwYXRoOiBzdHJpbmcpID0+IFR5cGVDbGFzcyB8IHVuZGVmaW5lZCB9KS5sb29rdXAoVHlwZU5lc3RlZFBhdGgpO1xuXHRyZXR1cm4gbG9va3VwUmVzdWx0O1xufVxuXG5cbmNvbnN0ICRydW4gPSBmdW5jdGlvbiA8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdCwgUyBleHRlbmRzIFByb3RvPEUsIFQ+Pihcblx0ZW50aXR5OiBFLFxuXHRDdG9yOiBJREVGPFQ+LFxuXHRhcmdzOiB1bmtub3duW11cbik6IHtcblx0XHRba2V5IGluIGtleW9mIFNdOiBTW2tleV1cblx0fSB7XG5cblx0Ly8gZGVidWdnZXI7XG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgLSBleHRyYWN0aW5nIFR5cGVOYW1lIGZyb20gZnVuY3Rpb25cblx0Y29uc3QgeyBUeXBlTmFtZSB9ID0gQ3Rvcjtcblx0Y29uc3QgQ3N0ciA9IHByZXBhcmVTdWJ0eXBlRm9yQ29uc3RydWN0aW9uKFxuXHRcdFR5cGVOYW1lLFxuXHRcdGVudGl0eVxuXHQpIGFzIHVua25vd24gYXMgeyBuZXcoLi4uYXJzOiB1bmtub3duW10pOiB1bmtub3duIH07XG5cdC8vIFRPRE86IGNoZWNrIGxpbmVzIGJlbG93IGFuZCBpZiBDb25zdHJ1Y3RvciBpcyBub3QgbW5lbW9uaXplZCAuLi5cblx0aWYgKENzdHIgPT09IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IEVycm9yQ3RvciA9IFdST05HX01PRElGSUNBVElPTl9QQVRURVJOIGFzIHVua25vd24gYXMgbmV3IChtc2c6IHN0cmluZykgPT4gRXJyb3I7XG5cdFx0dGhyb3cgbmV3IEVycm9yQ3RvcihgWyAke1R5cGVOYW1lfSBdIGlzIG5vdCBkZWZpbmVkIGFzIGEgVHlwZSBDb25zdHJ1Y3RvciBvbiB1c2VkIGluc3RhbmNlYCk7XG5cdH1cblx0Y29uc3QgcnVuUmVzdWx0ID0gbmV3IENzdHIoLi4uYXJncyk7XG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgLSByZXR1cm5pbmcgcmVzdWx0IGFzIG1lcmdlZCBwcm90byB0eXBlXG5cdHJldHVybiBydW5SZXN1bHQ7XG59O1xuXG4vLyBUT0RPOiBhcHBseSBpbnN0YW5jZSAudG8gdHlwZSAud2l0aCBhcmd1bWVudHNcbmV4cG9ydCBjb25zdCBhcHBseSA9IGZ1bmN0aW9uIDxFIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgb2JqZWN0LCBTIGV4dGVuZHMgUHJvdG88RSwgVD4+KFxuXHRlbnRpdHk6IEUsXG5cdEN0b3I6IElERUY8VD4sXG5cdGFyZ3M6IHVua25vd25bXSA9IFtdXG4pOiBJbnN0YW5jZVJlc3VsdDxNZXJnZTxFLCBUPj4ge1xuXHRjb25zdCBydW5SZXN1bHQgPSAkcnVuPEUsIFQsIFM+KFxuXHRcdGVudGl0eSxcblx0XHRDdG9yLFxuXHRcdGFyZ3Ncblx0KTtcblx0Y29uc3QgcmVzdWx0ID0gcnVuUmVzdWx0IGFzIHVua25vd24gYXMgSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gVE9ETzogY2FsbCB0eXBlIC5ieSBpbnN0YW5jZSAud2l0aCBhcmd1bWVudHNcbmV4cG9ydCBjb25zdCBjYWxsID0gZnVuY3Rpb24gPEUgZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyBvYmplY3QsIFMgZXh0ZW5kcyBQcm90bzxFLCBUPj4oXG5cdGVudGl0eTogRSxcblx0Q3RvcjogSURFRjxUPixcblx0Li4uYXJnczogdW5rbm93bltdXG4pOiBJbnN0YW5jZVJlc3VsdDxNZXJnZTxFLCBUPj4ge1xuXHRjb25zdCBydW5SZXN1bHQgPSAkcnVuPEUsIFQsIFM+KFxuXHRcdGVudGl0eSxcblx0XHRDdG9yLFxuXHRcdGFyZ3Ncblx0KTtcblx0Y29uc3QgcmVzdWx0ID0gcnVuUmVzdWx0IGFzIHVua25vd24gYXMgSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gVE9ETzogYmluZCB0eXBlIC53aXRoIGluc3RhbmNlIOKGkiAoLi4uYXJncylcbmV4cG9ydCBjb25zdCBiaW5kID0gZnVuY3Rpb24gPEUgZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyBvYmplY3QsIFMgZXh0ZW5kcyBQcm90bzxFLCBUPj4oXG5cdGVudGl0eTogRSxcblx0Q3RvcjogSURFRjxUPlxuKTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+IHtcblx0Y29uc3QgcmVzdWx0ID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuXHRcdGNvbnN0IHJ1blJlc3VsdCA9ICRydW48RSwgVCwgUz4oXG5cdFx0XHRlbnRpdHksXG5cdFx0XHRDdG9yLFxuXHRcdFx0YXJnc1xuXHRcdCk7XG5cdFx0Y29uc3QgdHlwZWRSZXN1bHQgPSBydW5SZXN1bHQgYXMgdW5rbm93biBhcyBJbnN0YW5jZVJlc3VsdDxNZXJnZTxFLCBUPj47XG5cdFx0cmV0dXJuIHR5cGVkUmVzdWx0O1xuXHR9O1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGRlY29yYXRlID0gZnVuY3Rpb24gPFxuXHRUIGV4dGVuZHMgQ29uc3RydWN0b3I8b2JqZWN0PiB8IGNvbnN0cnVjdG9yT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuPihcblx0dGFyZ2V0PzogVCxcblx0Y29uZmlnPzogY29uc3RydWN0b3JPcHRpb25zXG4pOiA8VSBleHRlbmRzIENvbnN0cnVjdG9yPG9iamVjdD4+KGNzdHI6IFUpID0+IERlY29yYXRlZENsYXNzPFU+IHtcblx0Y29uc3Qgb3B0cyA9IChjb25maWcgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0JyAmJiAhKHRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSlcblx0XHQ/IHRhcmdldCBhcyBjb25zdHJ1Y3Rvck9wdGlvbnNcblx0XHQ6IGNvbmZpZztcblxuXHRjb25zdCBwYXJlbnRUeXBlID0gKHRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuXHRcdD8gdGFyZ2V0IGFzIENvbnN0cnVjdG9yPG9iamVjdD5cblx0XHQ6IHVuZGVmaW5lZDtcblxuXHRjb25zdCBkZWNvcmF0b3IgPSBmdW5jdGlvbiA8VSBleHRlbmRzIENvbnN0cnVjdG9yPG9iamVjdD4+KGNzdHI6IFUpOiBEZWNvcmF0ZWRDbGFzczxVPiB7XG5cdFx0Y29uc3QgeyBuYW1lIH0gPSBjc3RyO1xuXHRcdGlmIChwYXJlbnRUeXBlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGRlY29yYXRvclJlc3VsdCA9IGRlZmluZShcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0Y3N0ciBhcyBJREVGPG9iamVjdD4sXG5cdFx0XHRcdG9wdHNcblx0XHRcdCkgYXMgdW5rbm93biBhcyBEZWNvcmF0ZWRDbGFzczxVPjtcblx0XHRcdHJldHVybiBkZWNvcmF0b3JSZXN1bHQ7XG5cdFx0fVxuXHRcdGNvbnN0IHBhcmVudCA9IHBhcmVudFR5cGUgYXMgdW5rbm93biBhcyB7XG5cdFx0XHRkZWZpbmU6IFR5cGVBYnNvcmJlcjtcblx0XHR9O1xuXHRcdGNvbnN0IGRlZmluZVJlc3VsdCA9IHBhcmVudC5kZWZpbmUoXG5cdFx0XHRuYW1lLFxuXHRcdFx0Y3N0ciBhcyBJREVGPG9iamVjdD4sXG5cdFx0XHRvcHRzXG5cdFx0KSBhcyB1bmtub3duIGFzIERlY29yYXRlZENsYXNzPFU+O1xuXHRcdHJldHVybiBkZWZpbmVSZXN1bHQ7XG5cdH07XG5cdHJldHVybiBkZWNvcmF0b3I7XG59O1xuXG5cbmV4cG9ydCBjb25zdCByZWdpc3Rlckhvb2sgPSBmdW5jdGlvbiA8VCBleHRlbmRzIENvbnN0cnVjdG9yPFQ+Pihcblx0Q3RvcjogRGVjb3JhdGVkQ2xhc3M8VD4sXG5cdGhvb2tUeXBlOiBob29rc1R5cGVzLFxuXHRjYjogaG9va1xuKTogdm9pZCB7XG5cdEN0b3IucmVnaXN0ZXJIb29rKFxuXHRcdGhvb2tUeXBlLFxuXHRcdGNiXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgbW5lbW9uaWNhID0gT2JqZWN0LmVudHJpZXMoe1xuXG5cdGRlZmluZSxcblx0bG9va3VwLFxuXHRhcHBseSxcblx0Y2FsbCxcblx0YmluZCxcblx0ZGVjb3JhdGUsXG5cdHJlZ2lzdGVySG9vayxcblxuXHQuLi5kZXNjcmlwdG9ycyxcblxuXHQuLi5lcnJvcnNBcGksXG5cdC4uLmNvbnN0YW50cyxcblxufSkucmVkdWNlKFxuXHQoYWNjOiB7IFtpbmRleDogc3RyaW5nXTogdW5rbm93biB9LCBlbnRyeTogW3N0cmluZywgdW5rbm93bl0pID0+IHtcblx0XHRjb25zdCBbIG5hbWUsIGNvZGUgXSA9IGVudHJ5O1xuXHRcdG9kcChcblx0XHRcdGFjYyxcblx0XHRcdG5hbWUsXG5cdFx0XHR7XG5cdFx0XHRcdGdldCgpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29kZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZW51bWVyYWJsZSA6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXHRcdHJldHVybiBhY2M7XG5cdH0sXG5cdHt9XG4pIGFzIE1uZW1vbmljYU1vZHVsZTtcblxuaW1wb3J0ICogYXMgYXBpIGZyb20gJy4vYXBpJztcblxuZXhwb3J0IGNvbnN0IHtcblx0ZGVmaW5lOiBfZGVmaW5lLFxuXHRsb29rdXA6IF9sb29rdXBcbn0gPSBhcGkudHlwZXM7XG5cbmV4cG9ydCBjb25zdCB7XG5cblx0U3ltYm9sUGFyZW50VHlwZSxcblx0U3ltYm9sQ29uc3RydWN0b3JOYW1lLFxuXHRTeW1ib2xEZWZhdWx0VHlwZXNDb2xsZWN0aW9uLFxuXHRTeW1ib2xDb25maWcsXG5cdE1ORU1PTklDQSxcblx0TU5FTU9TWU5FLFxuXHRUWVBFX1RJVExFX1BSRUZJWCxcblx0RXJyb3JNZXNzYWdlcyxcblxufSA9IG1uZW1vbmljYTtcblxuLy8gRXhwb3J0IGNyZWF0ZVR5cGVzQ29sbGVjdGlvbiB3aXRoIHByb3BlciB0eXBlXG5leHBvcnQgY29uc3QgY3JlYXRlVHlwZXNDb2xsZWN0aW9uOiBDcmVhdGVUeXBlc0NvbGxlY3Rpb25GdW5jdGlvbiA9XG5cdG1uZW1vbmljYS5jcmVhdGVUeXBlc0NvbGxlY3Rpb24gYXMgQ3JlYXRlVHlwZXNDb2xsZWN0aW9uRnVuY3Rpb247XG5cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb2xsZWN0aW9uID0gKGRlZmF1bHRUeXBlcyBhcyB7IHN1YnR5cGVzOiBNYXA8c3RyaW5nLCBvYmplY3Q+IH0pLnN1YnR5cGVzO1xuZXhwb3J0IGNvbnN0IGVycm9ycyA9IGRlc2NyaXB0b3JzLkVycm9yc1R5cGVzO1xuXG5leHBvcnQgeyB1dGlscyB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IHsgZGVmaW5lU3RhY2tDbGVhbmVyIH0gZnJvbSAnLi91dGlscyc7XG4vKiBlc2xpbnQtZW5hYmxlIHNwYWNlLWJlZm9yZS1mdW5jdGlvbi1wYXJlbiAqL1xuIl19
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0ZiLHdCQXNCQztBQU9ELHdCQVFDO0FBcEdELDhEQUEyQztBQUUxQyxlQUFPLEdBRUosZUFBVSxVQURiLDZCQUFxQixHQUNsQixlQUFVLHVCQUFDO0FBa0NmLDJDQUUyQjtBQUQxQixpR0FBQSxRQUFRLE9BQUE7QUFBRSxpR0FBQSxRQUFRLE9BQUE7QUFHbkIsMkNBQXdDO0FBQ3hDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxxQkFBUyxDQUFDO0FBRTFCLHdEQUEwQztBQUMxQywrQ0FBNEM7QUFFNUMsTUFBTSxFQUFFLDBCQUEwQixFQUFFLEdBQUcseUJBQVcsQ0FBQyxXQUFXLENBQUM7QUFFL0Qsc0VBQStDO0FBQy9DLE1BQU0sRUFBRSw2QkFBNkIsRUFBRSxHQUFHLG1CQUFVLENBQUM7QUFFdEMsb0JBQVksR0FBTSx5QkFBVyxjQUFDO0FBRTdDLFNBQVMsU0FBUyxDQUFDLE9BQW9EO0lBQ3RFLE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxpQkFBUyxJQUFJLE9BQU8sS0FBSyxPQUFPLENBQUM7SUFDNUQsT0FBTyxNQUFNLENBQUM7QUFDZixDQUFDO0FBS0QsU0FBZ0IsTUFBTSxDQVFyQixRQUFzRCxFQUV0RCxnQkFBa0YsRUFDbEYsTUFBMkI7SUFFM0IsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksb0JBQVksQ0FBQztJQUVwRSxNQUFNLFlBQVksR0FBSSxLQUFrQztTQUN0RCxNQUFNLENBQ04sUUFBa0IsRUFDbEIsZ0JBQTJCLEVBQzNCLE1BQU0sQ0FDVSxDQUFDO0lBQ25CLE9BQU8sWUFBWSxDQUFDO0FBQ3JCLENB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LGlCQUFTLHdCQVBaLG9DQUE0QixHQU96QixpQkFBUywrQkFOWixvQkFBWSxHQU1ULGlCQUFTLGVBTFosaUJBQVMsR0FLTixpQkFBUyxZQUpaLGlCQUFTLEdBSU4saUJBQVMsWUFIWix5QkFBaUIsR0FHZCxpQkFBUyxvQkFGWixxQkFBYSxHQUVWLGlCQUFTLGVBQUM7QUFHRCxRQUFBLHFCQUFxQixHQUNqQyxpQkFBUyxDQUFDLHFCQUFzRCxDQUFDO0FBR3JELFFBQUEsaUJBQWlCLEdBQUksb0JBQWtELENBQUMsUUFBUSxDQUFDO0FBQ2pGLFFBQUEsTUFBTSxHQUFHLHlCQUFXLENBQUMsV0FBVyxDQUFDO0FBRTlDLGlDQUFnQztBQUF2Qiw4RkFBQSxLQUFLLE9BQUE7QUFDZCxpQ0FBNkM7QUFBcEMsMkdBQUEsa0JBQWtCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBzcGFjZS1iZWZvcmUtZnVuY3Rpb24tcGFyZW4gKi9cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHR5cGUge1xuXHRDcmVhdGVUeXBlc0NvbGxlY3Rpb25GdW5jdGlvbixcblx0SURFRixcblx0aG9vayxcblx0aG9va3NUeXBlcyxcblx0Y29uc3RydWN0b3JPcHRpb25zLFxuXHRQcm90byxcblx0SURlZmluaXRvckluc3RhbmNlLFxuXHRDb25zdHJ1Y3Rvcixcblx0RGVjb3JhdGVkQ2xhc3MsXG5cdFR5cGVDbGFzcyxcblx0VHlwZUFic29yYmVyLFxuXHRNbmVtb25pY2FNb2R1bGUsXG5cdEluc3RhbmNlUmVzdWx0LFxuXHRNZXJnZVxufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IFR5cGVzVXRpbHMgZnJvbSAnLi9hcGkvdXRpbHMvaW5kZXgnO1xuZXhwb3J0IGNvbnN0IHtcblx0aXNDbGFzcyxcblx0ZmluZFN1YlR5cGVGcm9tUGFyZW50LFxufSA9IFR5cGVzVXRpbHM7XG5cbmV4cG9ydCB0eXBlIHtcblx0SURFRiwgVHlwZUNvbnN0cnVjdG9yLCBUeXBlQ29uc3RydWN0b3JCYXNlLFxuXHRJbnN0YW5jZU9mVHlwZVJlZ2lzdHJ5LCBMaXRlcmFsS2V5c09mLCBQYXJlbnRQYXRoLCBQYXRoT2ZJbnN0YW5jZSxcblx0QWxsUGFyZW50UHJlZml4ZXMsIFBhcmVudFBhdGhPZkluc3RhbmNlLFxuXHRfSW50ZXJuYWxfVENfLCBQcm90bywgUHJvdG9GbGF0LFxuXHRob29rc09wdHMsIGhvb2ssIGhvb2tzVHlwZXMsIFR5cGVzQ29sbGVjdGlvblxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUeXBlLXNhZmUgcmVnaXN0cnkgZm9yIG1uZW1vbmljYSB0eXBlcy5cbiAqXG4gKiBUaGlzIGludGVyZmFjZSBzdGFydHMgZW1wdHkuIEFwcGxpY2F0aW9uIGNvZGUgb3IgYEBtbmVtb25pY2EvdGFjdGljYWBcbiAqIGF1Z21lbnRzIGl0IHRocm91Z2ggVHlwZVNjcmlwdCBtb2R1bGUgZGVjbGFyYXRpb24gbWVyZ2luZzpcbiAqXG4gKiBgYGB0c1xuICogZGVjbGFyZSBtb2R1bGUgJ21uZW1vbmljYScge1xuICogICBpbnRlcmZhY2UgVHlwZVJlZ2lzdHJ5IHtcbiAqICAgICAnTXlUeXBlJzogVHlwZUNvbnN0cnVjdG9yPE15VHlwZUluc3RhbmNlPjtcbiAqICAgICAnTXlUeXBlLlN1YlR5cGUnOiBUeXBlQ29uc3RydWN0b3I8U3ViVHlwZUluc3RhbmNlPjtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogT25jZSBhdWdtZW50ZWQsIGBsb29rdXAoJ015VHlwZScpYCBhbmQgYHV0aWxzLnBhcmVudChpbnN0YW5jZSwgJ015VHlwZScpYFxuICogcmVzb2x2ZSBrZXlzIGFnYWluc3QgdGhpcyByZWdpc3RyeS4gVW5hdWdtZW50ZWQga2V5cyBmYWxsIGJhY2sgdG8gdGhlIGJyb2FkXG4gKiBgVHlwZUNsYXNzIHwgdW5kZWZpbmVkYCByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlUmVnaXN0cnkge1xuXHQvLyBJbnRlbnRpb25hbGx5IGVtcHR5LiBBdWdtZW50IHRoaXMgaW50ZXJmYWNlIHZpYSBkZWNsYXJhdGlvbiBtZXJnaW5nXG5cdC8vIChoYW5kLXdyaXR0ZW4gb3IgZ2VuZXJhdGVkIGJ5IEBtbmVtb25pY2EvdGFjdGljYSkgdG8gZW5hYmxlIHR5cGVkXG5cdC8vIHV0aWxpdGllcyBsaWtlIGxvb2t1cCgpIGFuZCBwYXJlbnQoKS5cbn1cbmV4cG9ydCB7XG5cdGdldFByb3BzLCBzZXRQcm9wcyBcbn0gZnJvbSAnLi9hcGkvdHlwZXMvUHJvcHMnO1xuXG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5jb25zdCB7IG9kcCB9ID0gY29uc3RhbnRzO1xuXG5pbXBvcnQgKiBhcyBlcnJvcnNBcGkgZnJvbSAnLi9hcGkvZXJyb3JzJztcbmltcG9ydCB7IGRlc2NyaXB0b3JzIH0gZnJvbSAnLi9kZXNjcmlwdG9ycyc7XG5cbmNvbnN0IHsgV1JPTkdfTU9ESUZJQ0FUSU9OX1BBVFRFUk4gfSA9IGRlc2NyaXB0b3JzLkVycm9yc1R5cGVzO1xuXG5pbXBvcnQgbW5lbW9zeW5lcyBmcm9tICcuL2FwaS90eXBlcy9NbmVtb3N5bmUnO1xuY29uc3QgeyBwcmVwYXJlU3VidHlwZUZvckNvbnN0cnVjdGlvbiB9ID0gbW5lbW9zeW5lcztcblxuZXhwb3J0IGNvbnN0IHsgZGVmYXVsdFR5cGVzLCB9ID0gZGVzY3JpcHRvcnM7XG5cbmZ1bmN0aW9uIGNoZWNrVGhpcyhwb2ludGVyOiB0eXBlb2YgbW5lbW9uaWNhIHwgdHlwZW9mIGV4cG9ydHMgfCB1bmtub3duKTogYm9vbGVhbiB7XG5cdGNvbnN0IHJlc3VsdCA9IHBvaW50ZXIgPT09IG1uZW1vbmljYSB8fCBwb2ludGVyID09PSBleHBvcnRzO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5cblxuLy8gRGVmaW5lIGZ1bmN0aW9uIHVzaW5nIFR5cGVBYnNvcmJlciBpbnRlcmZhY2Ugd2l0aCBwcm9wZXIgdHlwZSBjYXN0aW5nXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lIDxcblx0VCBleHRlbmRzIG9iamVjdCxcblx0UCBleHRlbmRzIG9iamVjdCA9IG9iamVjdCxcblx0TiBleHRlbmRzIFByb3RvPFAsIFQ+ID0gUHJvdG88UCwgVD4sXG5cdC8vIGhlcmUgSURlZmluaXRvckluc3RhbmNlIGlzIGEgQ09OU1RSVUNUT1IgISEhXG5cdFIgZXh0ZW5kcyBJRGVmaW5pdG9ySW5zdGFuY2U8Tj4gPSBJRGVmaW5pdG9ySW5zdGFuY2U8Tj4sXG4+KFxuXHR0aGlzOiB1bmtub3duLFxuXHRUeXBlTmFtZT86IHN0cmluZyB8IENhbGxhYmxlRnVuY3Rpb24gfCBOZXdhYmxlRnVuY3Rpb24sXG5cdC8vIEFsbG93IGJvdGggc3RyaWN0IElERUYgYW5kIG1vcmUgZmxleGlibGUgZnVuY3Rpb24gc2lnbmF0dXJlc1xuXHRjb25zdHJ1Y3RIYW5kbGVyPzogSURFRjxUPiB8IENhbGxhYmxlRnVuY3Rpb24gfCBOZXdhYmxlRnVuY3Rpb24gfCBvYmplY3QgfCBib29sZWFuLFxuXHRjb25maWc/OiBjb25zdHJ1Y3Rvck9wdGlvbnMsXG4pOiBSIHtcblx0Y29uc3QgdHlwZXMgPSBjaGVja1RoaXModGhpcykgPyBkZWZhdWx0VHlwZXMgOiB0aGlzIHx8IGRlZmF1bHRUeXBlcztcblx0Ly8gVHlwZSBhc3NlcnRpb24gbmVlZGVkIGJlY2F1c2UgVHlwZXNDb2xsZWN0aW9uUHJveHkgaXMgYSBQcm94eVxuXHRjb25zdCBkZWZpbmVSZXN1bHQgPSAodHlwZXMgYXMgeyBkZWZpbmU6IFR5cGVBYnNvcmJlciB9KVxuXHRcdC5kZWZpbmUoXG5cdFx0XHRUeXBlTmFtZSBhcyBzdHJpbmcsXG5cdFx0XHRjb25zdHJ1Y3RIYW5kbGVyIGFzIElERUY8VD4sXG5cdFx0XHRjb25maWdcblx0XHQpIGFzIHVua25vd24gYXMgUjtcblx0cmV0dXJuIGRlZmluZVJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cDxjb25zdCBLIGV4dGVuZHMga2V5b2YgVHlwZVJlZ2lzdHJ5Pihcblx0dGhpczogdW5rbm93bixcblx0VHlwZU5lc3RlZFBhdGg6IEtcbik6IFR5cGVSZWdpc3RyeVtLXTtcbmV4cG9ydCBmdW5jdGlvbiBsb29rdXAodGhpczogdW5rbm93biwgVHlwZU5lc3RlZFBhdGg6IHN0cmluZyk6IFR5cGVDbGFzcyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBsb29rdXAoXG5cdHRoaXM6IHVua25vd24sXG5cdFR5cGVOZXN0ZWRQYXRoOiBzdHJpbmdcbik6IFR5cGVDbGFzcyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHR5cGVzID0gY2hlY2tUaGlzKHRoaXMpID8gZGVmYXVsdFR5cGVzIDogdGhpcyB8fCBkZWZhdWx0VHlwZXM7XG5cdC8vIFR5cGUgYXNzZXJ0aW9uIG5lZWRlZCBiZWNhdXNlIFR5cGVzQ29sbGVjdGlvblByb3h5IGlzIGEgUHJveHlcblx0Y29uc3QgbG9va3VwUmVzdWx0ID0gKHR5cGVzIGFzIHsgbG9va3VwOiAocGF0aDogc3RyaW5nKSA9PiBUeXBlQ2xhc3MgfCB1bmRlZmluZWQgfSkubG9va3VwKFR5cGVOZXN0ZWRQYXRoKTtcblx0cmV0dXJuIGxvb2t1cFJlc3VsdDtcbn1cblxuXG5jb25zdCAkcnVuID0gZnVuY3Rpb24gPEUgZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyBvYmplY3QsIFMgZXh0ZW5kcyBQcm90bzxFLCBUPj4oXG5cdGVudGl0eTogRSxcblx0Q3RvcjogSURFRjxUPixcblx0YXJnczogdW5rbm93bltdXG4pOiB7XG5cdFx0W2tleSBpbiBrZXlvZiBTXTogU1trZXldXG5cdH0ge1xuXG5cdC8vIGRlYnVnZ2VyO1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gZXh0cmFjdGluZyBUeXBlTmFtZSBmcm9tIGZ1bmN0aW9uXG5cdGNvbnN0IHsgVHlwZU5hbWUgfSA9IEN0b3I7XG5cdGNvbnN0IENzdHIgPSBwcmVwYXJlU3VidHlwZUZvckNvbnN0cnVjdGlvbihcblx0XHRUeXBlTmFtZSxcblx0XHRlbnRpdHlcblx0KSBhcyB1bmtub3duIGFzIHsgbmV3KC4uLmFyczogdW5rbm93bltdKTogdW5rbm93biB9O1xuXHQvLyBUT0RPOiBjaGVjayBsaW5lcyBiZWxvdyBhbmQgaWYgQ29uc3RydWN0b3IgaXMgbm90IG1uZW1vbml6ZWQgLi4uXG5cdGlmIChDc3RyID09PSB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBFcnJvckN0b3IgPSBXUk9OR19NT0RJRklDQVRJT05fUEFUVEVSTiBhcyB1bmtub3duIGFzIG5ldyAobXNnOiBzdHJpbmcpID0+IEVycm9yO1xuXHRcdHRocm93IG5ldyBFcnJvckN0b3IoYFsgJHtUeXBlTmFtZX0gXSBpcyBub3QgZGVmaW5lZCBhcyBhIFR5cGUgQ29uc3RydWN0b3Igb24gdXNlZCBpbnN0YW5jZWApO1xuXHR9XG5cdGNvbnN0IHJ1blJlc3VsdCA9IG5ldyBDc3RyKC4uLmFyZ3MpO1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gcmV0dXJuaW5nIHJlc3VsdCBhcyBtZXJnZWQgcHJvdG8gdHlwZVxuXHRyZXR1cm4gcnVuUmVzdWx0O1xufTtcblxuLy8gVE9ETzogYXBwbHkgaW5zdGFuY2UgLnRvIHR5cGUgLndpdGggYXJndW1lbnRzXG5leHBvcnQgY29uc3QgYXBwbHkgPSBmdW5jdGlvbiA8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdCwgUyBleHRlbmRzIFByb3RvPEUsIFQ+Pihcblx0ZW50aXR5OiBFLFxuXHRDdG9yOiBJREVGPFQ+LFxuXHRhcmdzOiB1bmtub3duW10gPSBbXVxuKTogSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+IHtcblx0Y29uc3QgcnVuUmVzdWx0ID0gJHJ1bjxFLCBULCBTPihcblx0XHRlbnRpdHksXG5cdFx0Q3Rvcixcblx0XHRhcmdzXG5cdCk7XG5cdGNvbnN0IHJlc3VsdCA9IHJ1blJlc3VsdCBhcyB1bmtub3duIGFzIEluc3RhbmNlUmVzdWx0PE1lcmdlPEUsIFQ+Pjtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIFRPRE86IGNhbGwgdHlwZSAuYnkgaW5zdGFuY2UgLndpdGggYXJndW1lbnRzXG5leHBvcnQgY29uc3QgY2FsbCA9IGZ1bmN0aW9uIDxFIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgb2JqZWN0LCBTIGV4dGVuZHMgUHJvdG88RSwgVD4+KFxuXHRlbnRpdHk6IEUsXG5cdEN0b3I6IElERUY8VD4sXG5cdC4uLmFyZ3M6IHVua25vd25bXVxuKTogSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+IHtcblx0Y29uc3QgcnVuUmVzdWx0ID0gJHJ1bjxFLCBULCBTPihcblx0XHRlbnRpdHksXG5cdFx0Q3Rvcixcblx0XHRhcmdzXG5cdCk7XG5cdGNvbnN0IHJlc3VsdCA9IHJ1blJlc3VsdCBhcyB1bmtub3duIGFzIEluc3RhbmNlUmVzdWx0PE1lcmdlPEUsIFQ+Pjtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIFRPRE86IGJpbmQgdHlwZSAud2l0aCBpbnN0YW5jZSDihpIgKC4uLmFyZ3MpXG5leHBvcnQgY29uc3QgYmluZCA9IGZ1bmN0aW9uIDxFIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgb2JqZWN0LCBTIGV4dGVuZHMgUHJvdG88RSwgVD4+KFxuXHRlbnRpdHk6IEUsXG5cdEN0b3I6IElERUY8VD5cbik6ICguLi5hcmdzOiB1bmtub3duW10pID0+IEluc3RhbmNlUmVzdWx0PE1lcmdlPEUsIFQ+PiB7XG5cdGNvbnN0IHJlc3VsdCA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRjb25zdCBydW5SZXN1bHQgPSAkcnVuPEUsIFQsIFM+KFxuXHRcdFx0ZW50aXR5LFxuXHRcdFx0Q3Rvcixcblx0XHRcdGFyZ3Ncblx0XHQpO1xuXHRcdGNvbnN0IHR5cGVkUmVzdWx0ID0gcnVuUmVzdWx0IGFzIHVua25vd24gYXMgSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xuXHRcdHJldHVybiB0eXBlZFJlc3VsdDtcblx0fTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWNvcmF0ZSA9IGZ1bmN0aW9uIDxcblx0VCBleHRlbmRzIENvbnN0cnVjdG9yPG9iamVjdD4gfCBjb25zdHJ1Y3Rvck9wdGlvbnMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbj4oXG5cdHRhcmdldD86IFQsXG5cdGNvbmZpZz86IGNvbnN0cnVjdG9yT3B0aW9uc1xuKTogPFUgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxvYmplY3Q+Pihjc3RyOiBVKSA9PiBEZWNvcmF0ZWRDbGFzczxVPiB7XG5cdGNvbnN0IG9wdHMgPSAoY29uZmlnID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvbikpXG5cdFx0PyB0YXJnZXQgYXMgY29uc3RydWN0b3JPcHRpb25zXG5cdFx0OiBjb25maWc7XG5cblx0Y29uc3QgcGFyZW50VHlwZSA9ICh0YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvbilcblx0XHQ/IHRhcmdldCBhcyBDb25zdHJ1Y3RvcjxvYmplY3Q+XG5cdFx0OiB1bmRlZmluZWQ7XG5cblx0Y29uc3QgZGVjb3JhdG9yID0gZnVuY3Rpb24gPFUgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxvYmplY3Q+Pihjc3RyOiBVKTogRGVjb3JhdGVkQ2xhc3M8VT4ge1xuXHRcdGNvbnN0IHsgbmFtZSB9ID0gY3N0cjtcblx0XHRpZiAocGFyZW50VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBkZWNvcmF0b3JSZXN1bHQgPSBkZWZpbmUoXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdGNzdHIgYXMgSURFRjxvYmplY3Q+LFxuXHRcdFx0XHRvcHRzXG5cdFx0XHQpIGFzIHVua25vd24gYXMgRGVjb3JhdGVkQ2xhc3M8VT47XG5cdFx0XHRyZXR1cm4gZGVjb3JhdG9yUmVzdWx0O1xuXHRcdH1cblx0XHRjb25zdCBwYXJlbnQgPSBwYXJlbnRUeXBlIGFzIHVua25vd24gYXMge1xuXHRcdFx0ZGVmaW5lOiBUeXBlQWJzb3JiZXI7XG5cdFx0fTtcblx0XHRjb25zdCBkZWZpbmVSZXN1bHQgPSBwYXJlbnQuZGVmaW5lKFxuXHRcdFx0bmFtZSxcblx0XHRcdGNzdHIgYXMgSURFRjxvYmplY3Q+LFxuXHRcdFx0b3B0c1xuXHRcdCkgYXMgdW5rbm93biBhcyBEZWNvcmF0ZWRDbGFzczxVPjtcblx0XHRyZXR1cm4gZGVmaW5lUmVzdWx0O1xuXHR9O1xuXHRyZXR1cm4gZGVjb3JhdG9yO1xufTtcblxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJIb29rID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxUPj4oXG5cdEN0b3I6IERlY29yYXRlZENsYXNzPFQ+LFxuXHRob29rVHlwZTogaG9va3NUeXBlcyxcblx0Y2I6IGhvb2tcbik6IHZvaWQge1xuXHRDdG9yLnJlZ2lzdGVySG9vayhcblx0XHRob29rVHlwZSxcblx0XHRjYlxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IG1uZW1vbmljYSA9IE9iamVjdC5lbnRyaWVzKHtcblxuXHRkZWZpbmUsXG5cdGxvb2t1cCxcblx0YXBwbHksXG5cdGNhbGwsXG5cdGJpbmQsXG5cdGRlY29yYXRlLFxuXHRyZWdpc3Rlckhvb2ssXG5cblx0Li4uZGVzY3JpcHRvcnMsXG5cblx0Li4uZXJyb3JzQXBpLFxuXHQuLi5jb25zdGFudHMsXG5cbn0pLnJlZHVjZShcblx0KGFjYzogeyBbaW5kZXg6IHN0cmluZ106IHVua25vd24gfSwgZW50cnk6IFtzdHJpbmcsIHVua25vd25dKSA9PiB7XG5cdFx0Y29uc3QgWyBuYW1lLCBjb2RlIF0gPSBlbnRyeTtcblx0XHRvZHAoXG5cdFx0XHRhY2MsXG5cdFx0XHRuYW1lLFxuXHRcdFx0e1xuXHRcdFx0XHRnZXQoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvZGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVudW1lcmFibGUgOiB0cnVlXG5cdFx0XHR9XG5cdFx0KTtcblx0XHRyZXR1cm4gYWNjO1xuXHR9LFxuXHR7fVxuKSBhcyBNbmVtb25pY2FNb2R1bGU7XG5cbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuL2FwaSc7XG5cbmV4cG9ydCBjb25zdCB7XG5cdGRlZmluZTogX2RlZmluZSxcblx0bG9va3VwOiBfbG9va3VwXG59ID0gYXBpLnR5cGVzO1xuXG5leHBvcnQgY29uc3Qge1xuXG5cdFN5bWJvbFBhcmVudFR5cGUsXG5cdFN5bWJvbENvbnN0cnVjdG9yTmFtZSxcblx0U3ltYm9sRGVmYXVsdFR5cGVzQ29sbGVjdGlvbixcblx0U3ltYm9sQ29uZmlnLFxuXHRNTkVNT05JQ0EsXG5cdE1ORU1PU1lORSxcblx0VFlQRV9USVRMRV9QUkVGSVgsXG5cdEVycm9yTWVzc2FnZXMsXG5cbn0gPSBtbmVtb25pY2E7XG5cbi8vIEV4cG9ydCBjcmVhdGVUeXBlc0NvbGxlY3Rpb24gd2l0aCBwcm9wZXIgdHlwZVxuZXhwb3J0IGNvbnN0IGNyZWF0ZVR5cGVzQ29sbGVjdGlvbjogQ3JlYXRlVHlwZXNDb2xsZWN0aW9uRnVuY3Rpb24gPVxuXHRtbmVtb25pY2EuY3JlYXRlVHlwZXNDb2xsZWN0aW9uIGFzIENyZWF0ZVR5cGVzQ29sbGVjdGlvbkZ1bmN0aW9uO1xuXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sbGVjdGlvbiA9IChkZWZhdWx0VHlwZXMgYXMgeyBzdWJ0eXBlczogTWFwPHN0cmluZywgb2JqZWN0PiB9KS5zdWJ0eXBlcztcbmV4cG9ydCBjb25zdCBlcnJvcnMgPSBkZXNjcmlwdG9ycy5FcnJvcnNUeXBlcztcblxuZXhwb3J0IHsgdXRpbHMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB7IGRlZmluZVN0YWNrQ2xlYW5lciB9IGZyb20gJy4vdXRpbHMnO1xuLyogZXNsaW50LWVuYWJsZSBzcGFjZS1iZWZvcmUtZnVuY3Rpb24tcGFyZW4gKi9cbiJdfQ==
@@ -281,7 +281,7 @@ export interface MnemonicaModule {
281
281
  define: TypeAbsorber;
282
282
  lookup: {
283
283
  (TypeNestedPath: string): TypeClass | undefined;
284
- <const K extends keyof TypeRegistry>(TypeNestedPath: K): TypeRegistry[K] | undefined;
284
+ <const K extends keyof TypeRegistry>(TypeNestedPath: K): TypeRegistry[K];
285
285
  };
286
286
  apply: ApplyFunction;
287
287
  call: CallFunction;
@@ -1,3 +1,3 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5cbmltcG9ydCB0eXBlIHsgVHlwZVJlZ2lzdHJ5IH0gZnJvbSAnLi4vaW5kZXgnO1xuXG4vLyBQcm9wcyB0eXBlIGZvciBnZXRQcm9wcy9zZXRQcm9wc1xuZXhwb3J0IHR5cGUgUHJvcHNUeXBlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8vIENvcmUgdHlwZSBkZWZpbml0aW9ucyBmb3IgbW5lbW9uaWNhXG5cbi8vIEJhc2UgY29uc3RydWN0b3IgZnVuY3Rpb24gdHlwZSAtIGNhbiBiZSBhIGNsYXNzIGNvbnN0cnVjdG9yIG9yIGEgZnVuY3Rpb24uXG4vLyBBcmdzIGRlZmF1bHRzIHRvIHVua25vd25bXSBzbyBJREVGPFQ+IGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlO1xuLy8gc3VwcGx5IEFyZ3MgdG8gZ2V0IHR5cGVkIGNvbnN0cnVjdG9yIHBhcmFtczogSURFRjxNeVR5cGUsIFtzdHJpbmcsIG51bWJlcl0+XG5leHBvcnQgdHlwZSBJREVGPFQsIEFyZ3MgZXh0ZW5kcyB1bmtub3duW10gPSB1bmtub3duW10+ID0geyBuZXcoKTogVCB9IHwgeyAodGhpczogVCwgLi4uYXJnczogQXJncyk6IHZvaWQgfTtcblxuLy8gRXJyb3IgbWVzc2FnZSB0eXBlcyAtIGFsbCBlcnJvciBtZXNzYWdlcyBhcmUgc3RyaW5nc1xuZXhwb3J0IHR5cGUgRXJyb3JNZXNzYWdlS2V5ID1cblx0fCAnQkFTRV9FUlJPUl9NRVNTQUdFJ1xuXHR8ICdIQU5ETEVSX01VU1RfQkVfQV9GVU5DVElPTidcblx0fCAnV1JPTkdfVFlQRV9ERUZJTklUSU9OJ1xuXHR8ICdXUk9OR19JTlNUQU5DRV9JTlZPQ0FUSU9OJ1xuXHR8ICdXUk9OR19NT0RJRklDQVRJT05fUEFUVEVSTidcblx0fCAnQUxSRUFEWV9ERUNMQVJFRCdcblx0fCAnV1JPTkdfQVJHVU1FTlRTX1VTRUQnXG5cdHwgJ1dST05HX0hPT0tfVFlQRSdcblx0fCAnTUlTU0lOR19IT09LX0NBTExCQUNLJ1xuXHR8ICdNSVNTSU5HX0NBTExCQUNLX0FSR1VNRU5UJ1xuXHR8ICdPUFRJT05TX0VSUk9SJ1xuXHR8ICdXUk9OR19TVEFDS19DTEVBTkVSJztcblx0Ly8gfCAnVFlQRU5BTUVfTVVTVF9CRV9BX1NUUklORydcblx0Ly8gfCAnRkxPV19DSEVDS0VSX1JFREVGSU5JVElPTidcblxuLy8gRXJyb3IgbWVzc2FnZXMgb2JqZWN0IHR5cGVcbmV4cG9ydCB0eXBlIEVycm9yTWVzc2FnZXMgPSBSZWNvcmQ8RXJyb3JNZXNzYWdlS2V5LCBzdHJpbmc+O1xuXG4vLyBIb29rIGNhbGxiYWNrIOKAlCBwYXNzZWQgdG8gcmVnaXN0ZXJIb29rIGFuZCBpbnZva2VkIGJ5IGludm9rZUhvb2tcbmV4cG9ydCBpbnRlcmZhY2UgaG9vayBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQob3B0czogaG9va3NPcHRzKTogdW5rbm93bjtcbn1cblxuLy8gRXJyb3IgY29uc3RydWN0b3IgZnJvbSBjb25zdHJ1Y3RFcnJvciAtIGNvbnN0cnVjdGFibGUgZnVuY3Rpb24gd2l0aCBwcm90b3R5cGVcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3RvciB7XG5cdG5ldyhhZGRpdGlvbj86IHN0cmluZywgc3RhY2s/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IEVycm9yO1xuXHQobmFtZTogc3RyaW5nKTogRXJyb3I7XG5cdHByb3RvdHlwZToge1xuXHRcdGNvbnN0cnVjdG9yOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHR9O1xufVxuXG4vLyBFcnJvcnMgdHlwZXMgbWFwIC0gaW5kZXhhYmxlIHJlY29yZCBvZiBlcnJvciBjb25zdHJ1Y3RvcnNcbmV4cG9ydCB0eXBlIEVycm9yc1R5cGVzTWFwID0gUmVjb3JkPHN0cmluZywgTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcj47XG5cbi8vIE1uZW1vbmljYSBlcnJvciBpbnRlcmZhY2UgZm9yIGV4dGVuZGVkIEVycm9yIG9iamVjdHNcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGV4Y2VwdGlvblJlYXNvbj86IEVycm9yO1xuXHRyZWFzb25zPzogRXJyb3JbXTtcblx0c3VycGx1cz86IEVycm9yW107XG59XG5cbi8qKlxuICogSW50ZXJuYWwgVHlwZSBDb25zdHJ1Y3Rvci5cbiAqIFwiVHlwZVwiIGhlcmUgaXMgdXNlZCBpbiB0aGUgQ29tcHV0ZXIgU2NpZW5jZSBzZW5zZSDigJQgYW4gaW50ZXJmYWNlL2NvbnRyYWN0XG4gKiBkZXNjcmliaW5nIHdoYXQgYSBjb25zdHJ1Y3RvciBtdXN0IHNhdGlzZnkgKGJvdGggYG5ld2AtYWJsZSBhbmQgY2FsbGFibGUpLlxuICogVEMgPSBUeXBlIENvbnN0cnVjdG9yOyBcIkludGVybmFsXCIgbWVhbnMgdGhpcyBpcyB0aGUgbGlicmFyeSdzIG93biBjb25zdHJ1Y3RvclxuICogc2hhcGUsIGRpc3RpbmN0IGZyb20gdXNlci1mYWNpbmcgVHlwZUNvbnN0cnVjdG9yIGJlbG93LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIF9JbnRlcm5hbF9UQ188Q29uc3RydWN0b3JJbnN0YW5jZSBleHRlbmRzIG9iamVjdD4ge1xuXHRuZXcoLi4uYXJnczogdW5rbm93bltdKTogQ29uc3RydWN0b3JJbnN0YW5jZTtcblx0KHRoaXM6IENvbnN0cnVjdG9ySW5zdGFuY2UsIC4uLmFyZ3M6IHVua25vd25bXSk6IENvbnN0cnVjdG9ySW5zdGFuY2U7XG5cdHJlYWRvbmx5IHByb3RvdHlwZTogQ29uc3RydWN0b3JJbnN0YW5jZSAmIHtcblx0XHRyZWFkb25seSBjb25zdHJ1Y3RvcjogX0ludGVybmFsX1RDXzxDb25zdHJ1Y3Rvckluc3RhbmNlPlxuXHR9O1xufVxuXG4vKipcbiAqIFB1YmxpYyBhbGlhcyBmb3IgX0ludGVybmFsX1RDXyDigJQgdGhlIHNoYXBlIG9mIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyByZXR1cm5lZCBieSBgZGVmaW5lKClgLlxuICogQXVnbWVudGVkIGJ5IHRhY3RpY2EtZ2VuZXJhdGVkIFR5cGVSZWdpc3RyeSB0byBiZWNvbWUgdXNlci1zcGVjaWZpYyB0eXBlcy5cbiAqIEtlcHQgYXMgYSBuYW1lZCBhbGlhcyAocmF0aGVyIHRoYW4gaW5saW5pbmcgX0ludGVybmFsX1RDXykgc28gdGFjdGljYSBjYW4gcmVmZXJlbmNlIGl0XG4gKiBjbGVhbmx5IGluIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZUNvbnN0cnVjdG9yPENvbnN0cnVjdG9ySW5zdGFuY2UgZXh0ZW5kcyBvYmplY3Q+ID0gX0ludGVybmFsX1RDXzxDb25zdHJ1Y3Rvckluc3RhbmNlPjtcblxuLyoqXG4gKiBNaW5pbWFsIGNvbnN0cnVjdG9yIHNoYXBlIHVzZWQgZm9yIHRoZSBUeXBlUmVnaXN0cnkgaW5kZXggc2lnbmF0dXJlLlxuICogSXQgYWNjZXB0cyBhbnkgbW5lbW9uaWNhLWNvbXBhdGlibGUgY29uc3RydWN0b3IsIGJ1dCBkZWxpYmVyYXRlbHkgcmV0dXJuc1xuICogYG9iamVjdGAgc28gdW5hdWdtZW50ZWQgcmVnaXN0cnkgbG9va3VwcyBhcmUgbm90IHVzZWZ1bCB3aXRob3V0IGFuIGV4cGxpY2l0XG4gKiBwZXIta2V5IGNvbnN0cnVjdG9yIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZUNvbnN0cnVjdG9yQmFzZSB7XG5cdG5ldyAoLi4uYXJnczogdW5rbm93bltdKTogb2JqZWN0O1xufVxuXG4vKipcbiAqIEluc3RhbmNlIHR5cGUgcHJvZHVjZWQgYnkgYSBUeXBlUmVnaXN0cnkgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlT2ZUeXBlUmVnaXN0cnk8SyBleHRlbmRzIGtleW9mIFR5cGVSZWdpc3RyeT4gPVxuXHRUeXBlUmVnaXN0cnlbS10gZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gaW5mZXIgUiA/IFIgOiBuZXZlcjtcblxuXG4vKipcbiAqIEV4dHJhY3Qgb25seSB0aGUgbGl0ZXJhbCBzdHJpbmcga2V5cyBvZiBhIHR5cGUsIGZpbHRlcmluZyBvdXQgZ2VuZXJpY1xuICogaW5kZXggc2lnbmF0dXJlcy4gVGhpcyBsZXRzIHVzIGl0ZXJhdGUgb3ZlciBhdWdtZW50ZWQgVHlwZVJlZ2lzdHJ5IGtleXNcbiAqIHdpdGhvdXQgcGlja2luZyB1cCB0aGUgYFtrZXk6IHN0cmluZ11gIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgTGl0ZXJhbEtleXNPZjxUPiA9IGtleW9mIFQgZXh0ZW5kcyBpbmZlciBLXG5cdD8gSyBleHRlbmRzIHN0cmluZ1xuXHRcdD8gc3RyaW5nIGV4dGVuZHMgSyA/IG5ldmVyIDogS1xuXHRcdDogbmV2ZXJcblx0OiBuZXZlcjtcblxuLyoqXG4gKiBHaXZlbiBhIGRvdHRlZCBUeXBlUmVnaXN0cnkga2V5LCBleHRyYWN0IHRoZSBwYXJlbnQgcGF0aC5cbiAqIGBQYXJlbnRQYXRoPCdBLkIuQyc+YCDihpIgYCdBLkInYC5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyZW50UGF0aDxLIGV4dGVuZHMgc3RyaW5nPiA9XG5cdEsgZXh0ZW5kcyBgJHtpbmZlciBQfS4ke3N0cmluZ31gID8gUCA6IG5ldmVyO1xuXG4vKipcbiAqIEdpdmVuIGEgZG90dGVkIFR5cGVSZWdpc3RyeSBrZXksIHJldHVybiB0aGUgdW5pb24gb2YgYWxsIGFuY2VzdG9yIHByZWZpeGVzLlxuICogYEFsbFBhcmVudFByZWZpeGVzPCdBLkIuQyc+YCDihpIgYCdBJyB8ICdBLkInYC5cbiAqL1xuZXhwb3J0IHR5cGUgQWxsUGFyZW50UHJlZml4ZXM8SyBleHRlbmRzIHN0cmluZz4gPVxuXHRLIGV4dGVuZHMgYCR7aW5mZXIgUH0uJHtzdHJpbmd9YCA/IFAgfCBBbGxQYXJlbnRQcmVmaXhlczxQPiA6IG5ldmVyO1xuXG4vKipcbiAqIEdpdmVuIGEgcGFyZW50IHBhdGgsIHJldHVybiB0aGUgdW5pb24gb2YgVHlwZVJlZ2lzdHJ5IGtleXMgdGhhdCBhcmUgZGlyZWN0XG4gKiBvciBpbmRpcmVjdCBjaGlsZHJlbiBvZiB0aGF0IHBhdGguXG4gKi9cbmV4cG9ydCB0eXBlIENoaWxkS2V5c09mPFAgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuXHRbSyBpbiBrZXlvZiBUeXBlUmVnaXN0cnldOiBLIGV4dGVuZHMgYCR7UH0uJHtzdHJpbmd9YCA/IEsgOiBuZXZlclxufVtrZXlvZiBUeXBlUmVnaXN0cnldO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluc3RhbmNlIHR5cGUsIGZpbmQgdGhlIFR5cGVSZWdpc3RyeSBrZXkocykgd2hvc2UgY29uc3RydWN0b3JcbiAqIHJldHVybnMgdGhhdCBpbnN0YW5jZSB0eXBlLiBUaGlzIGludmVydHMgdGhlIHJlZ2lzdHJ5IGF0IHRoZSB0eXBlIGxldmVsXG4gKiBzbyB1dGlsaXRpZXMgbGlrZSBgcGFyZW50KClgIGNhbiBkZXJpdmUgYW4gaW5zdGFuY2UncyBwYXRoIGZyb20gaXRzXG4gKiB0eXBlIGFsb25lLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT2ZJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0W0sgaW4gTGl0ZXJhbEtleXNPZjxUeXBlUmVnaXN0cnk+XTogVHlwZVJlZ2lzdHJ5W0tdIGV4dGVuZHMgbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IGluZmVyIFJcblx0XHQ/IFQgZXh0ZW5kcyBSID8gSyA6IG5ldmVyXG5cdFx0OiBuZXZlclxufVtMaXRlcmFsS2V5c09mPFR5cGVSZWdpc3RyeT5dO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluc3RhbmNlIHR5cGUsIHJldHVybiB0aGUgdW5pb24gb2YgVHlwZVJlZ2lzdHJ5IHBhdGhzIHRoYXQgYXJlXG4gKiB2YWxpZCBwYXJlbnQgbG9va3VwcyBmb3IgdGhhdCBpbnN0YW5jZS4gUm9vdCB0eXBlcyBwcm9kdWNlIGBuZXZlcmAgYmVjYXVzZVxuICogdGhleSBoYXZlIG5vIHBhcmVudCBwYXRoLlxuICovXG5leHBvcnQgdHlwZSBQYXJlbnRQYXRoT2ZJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0W0sgaW4gTGl0ZXJhbEtleXNPZjxUeXBlUmVnaXN0cnk+XTogVHlwZVJlZ2lzdHJ5W0tdIGV4dGVuZHMgbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IGluZmVyIFJcblx0XHQ/IFQgZXh0ZW5kcyBSID8gQWxsUGFyZW50UHJlZml4ZXM8Sz4gOiBuZXZlclxuXHRcdDogbmV2ZXJcbn1bTGl0ZXJhbEtleXNPZjxUeXBlUmVnaXN0cnk+XTtcblxuLy8gSG9vayB0eXBlc1xuZXhwb3J0IHR5cGUgaG9va3NUeXBlcyA9ICdwcmVDcmVhdGlvbicgfCAncG9zdENyZWF0aW9uJyB8ICdjcmVhdGlvbkVycm9yJztcblxuLy8gSG9vayBvcHRpb25zIHBhc3NlZCB0byBob29rIGNhbGxiYWNrc1xuLy8gUCA9IHBhcmVudCAvIGV4aXN0ZW50IGluc3RhbmNlIChwcm90bylcbi8vIFQgPSBjaGlsZCAvIGluaGVyaXRlZCBpbnN0YW5jZSAodHlwZSBiZWluZyBjcmVhdGVkKVxuZXhwb3J0IHR5cGUgaG9va3NPcHRzPFAgPSBvYmplY3QsIFQgPSBQPiA9IHtcblx0VHlwZU5hbWU6IHN0cmluZztcblx0dHlwZTogVHlwZURlZjtcblx0YXJnczogdW5rbm93bltdO1xuXHRleGlzdGVudEluc3RhbmNlOiBQO1xuXHRpbmhlcml0ZWRJbnN0YW5jZT86IFQ7XG5cdGNyZWF0b3I/OiB7IHRocm93TW9kaWZpY2F0aW9uRXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB9O1xufTtcblxuLy8gQ2FsbGJhY2sgcGFzc2VkIGludG8gTW9kaWZpY2F0aW9uQ29uc3RydWN0b3IgdG8gYXR0YWNoIGludGVybmFsIHByb3BzIHRvIHRoZSBwcm90b3R5cGVcbmV4cG9ydCBpbnRlcmZhY2UgQWRkUHJvcHNDYWxsYmFjayBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQocHJvdG86IG9iamVjdCk6IHZvaWQ7XG59XG5cbi8vIE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yOiB3aXJlcyBwcm90b3R5cGUgY2hhaW4gZHVyaW5nIGluc3RhbmNlIGNyZWF0aW9uXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdChcblx0XHR0aGlzOiBvYmplY3QsXG5cdFx0TW9kaWZpY2F0b3JUeXBlOiBNbmVtb25pY2FDb25zdHJ1Y3Rvcixcblx0XHRNb2RpZmljYXRvclR5cGVQcm90b3R5cGU6IG9iamVjdCxcblx0XHRfYWRkUHJvcHM6IEFkZFByb3BzQ2FsbGJhY2tcblx0KTogTW5lbW9uaWNhQ29uc3RydWN0b3I7XG59XG5cbi8vIEZhY3RvcnkgdGhhdCByZXR1cm5zIGEgTW9kaWZpY2F0aW9uQ29uc3RydWN0b3IgKHVzZWQgaW4gY29uc3RydWN0b3JPcHRpb25zKVxuZXhwb3J0IGludGVyZmFjZSBNb2RpZmljYXRpb25Db25zdHJ1Y3RvckZhY3RvcnkgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KCk6IE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yO1xufVxuXG4vLyBGYWN0b3J5IHRoYXQgcmV0dXJucyBhIE1uZW1vbmljYUNvbnN0cnVjdG9yIChzdG9yZWQgaW4gVHlwZURlZi5jb25zdHJ1Y3RIYW5kbGVyKVxuZXhwb3J0IGludGVyZmFjZSBNbmVtb25pY2FDb25zdHJ1Y3RvckZhY3RvcnkgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KCk6IE1uZW1vbmljYUNvbnN0cnVjdG9yO1xufVxuXG4vLyBNYXJrcyB0aGUgdG9wIG9mIGEgY2FwdHVyZWQgc3RhY2sgdHJhY2UgKHBhc3NlZCB0byBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSBhcyBjb25zdHJ1Y3Rvck9wdClcbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tCb3VuZGFyeSBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge31cblxuLy8gQSB3cmFwcGFibGUgdXRpbGl0eSBtZXRob2Qg4oCUIGFueSBjYWxsYWJsZSB0aGF0IHdyYXBUaGlzKCkgY2FuIHByb3h5XG5leHBvcnQgaW50ZXJmYWNlIFdyYXBwYWJsZU1ldGhvZCBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge31cblxuLy8gQ29uc3RydWN0b3Igb3B0aW9ucyBmb3IgZGVmaW5lXG5leHBvcnQgdHlwZSBjb25zdHJ1Y3Rvck9wdGlvbnMgPSB7XG5cdC8vIGV4cGxpY2l0IGRlY2xhcmF0aW9uIHdlIHdpc2ggdXNlXG5cdC8vIGFuIG9sZCBzdHlsZSBiYXNlZCBjb25zdHJ1Y3RvcnNcblx0TW9kaWZpY2F0aW9uQ29uc3RydWN0b3I/OiBNb2RpZmljYXRpb25Db25zdHJ1Y3RvckZhY3RvcnksXG5cdC8vIHNoYWxsIG9yIG5vdCB3ZSB1c2Ugc3RyaWN0IGNoZWNraW5nXG5cdC8vIGZvciBjcmVhdGlvbiBzdWItaW5zdGFuY2VzIE9ubHkgZnJvbSBjdXJyZW50IHR5cGVcblx0Ly8gb3Igd2UgbWlnaHQgdXNlIHVwLW5lc3RlZCBzdWItaW5zdGFuY2VzIGZyb20gY2hhaW5cblx0c3RyaWN0Q2hhaW4/OiBib29sZWFuLFxuXHQvLyBzaG91bGQgd2UgdXNlIGZvcmNlZCBlcnJvcnMgY2hlY2tpbmdcblx0Ly8gdG8gbWFrZSBhbGwgaW5oZXJpdGVkIHR5cGVzIGVycm9yZWRcblx0Ly8gaWYgdGhlcmUgaXMgYW4gZXJyb3Igc29tZXdoZXJlIGluIGNoYWluXG5cdGJsb2NrRXJyb3JzPzogYm9vbGVhbixcblx0Ly8gaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGNvbGxlY3Qgc3RhY2tcblx0Ly8gYXMgYSBfX3N0YWNrX18gcHJvdG90eXBlIHByb3BlcnR5XG5cdC8vIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBpbnN0YW5jZSBjcmVhdGlvblxuXHRzdWJtaXRTdGFjaz86IGJvb2xlYW4sXG5cdC8vIGF3YWl0IG5ldyBDb25zdHJ1Y3RvcigpXG5cdC8vIG11c3QgcmV0dXJuIHZhbHVlXG5cdGF3YWl0UmV0dXJuPzogYm9vbGVhbixcblx0Ly8gRm9yY2UgY2xhc3MgbW9kZSAoYXV0by1kZXRlY3RlZCBieSBkZWZhdWx0KVxuXHRhc0NsYXNzPzogYm9vbGVhbixcbn07XG5cbi8vIFN1YnR5cGVzIG1hcCAtIHJlcHJlc2VudHMgdGhlIHN1YnR5cGVzIHByb3BlcnR5XG5leHBvcnQgdHlwZSBTdWJ0eXBlc01hcCA9IE1hcDxzdHJpbmcsIFR5cGVDbGFzcz47XG5cbi8vIFR5cGUgZGVmaW5pdGlvbiBvYmplY3QgKGludGVybmFsIHByb3BlcnRpZXMpXG5leHBvcnQgdHlwZSBUeXBlRGVmID0ge1xuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHRwcm90bzogb2JqZWN0O1xuXHRpc1N1YlR5cGU6IGJvb2xlYW47XG5cdHN1YnR5cGVzOiBTdWJ0eXBlc01hcDtcblx0Y29sbGVjdGlvbjogQ29sbGVjdGlvbkRlZjtcblx0Y29uZmlnOiBjb25zdHJ1Y3Rvck9wdGlvbnM7XG5cdHBhcmVudFR5cGU/OiBUeXBlRGVmO1xuXHRjb25zdHJ1Y3RIYW5kbGVyOiBNbmVtb25pY2FDb25zdHJ1Y3RvckZhY3Rvcnk7XG5cdHRpdGxlOiBzdHJpbmc7XG5cdGhvb2tzOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8aG9vaz4+O1xuXHRpbnZva2VIb29rOiAoaG9va1R5cGU6IGhvb2tzVHlwZXMsIG9wdHM6IGhvb2tzT3B0cykgPT4gU2V0PHVua25vd24+O1xuXHRwcm90b3R5cGU6IHVua25vd247XG5cdHN0YWNrPzogc3RyaW5nO1xuXHRbU3ltYm9sLmhhc0luc3RhbmNlXTogKGluc3RhbmNlOiBvYmplY3QpID0+IGJvb2xlYW47XG59O1xuXG4vLyBDb2xsZWN0aW9uIGRlZmluaXRpb25cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25EZWYgPSBIb29rYWJsZSAmIHtcblx0ZGVmaW5lOiBUeXBlQWJzb3JiZXI7XG5cdGxvb2t1cDogVHlwZUxvb2t1cDtcblx0c3VidHlwZXM6IFN1YnR5cGVzTWFwO1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuLy8gVHlwZSBsb29rdXAgZnVuY3Rpb24gdHlwZTogbWF5IGhhdmUgYXVnbWVudGF0aW9uIGJ5IFRhY3RpY2EgcmUtZGVmaW5pdGlvblxuZXhwb3J0IGludGVyZmFjZSBUeXBlTG9va3VwIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdCh0aGlzOiBNYXA8c3RyaW5nLCB1bmtub3duPiwgVHlwZU5lc3RlZFBhdGg6IHN0cmluZyk6IFR5cGVDbGFzcyB8IHVuZGVmaW5lZDtcbn1cblxuLy8gU3BlY2lmaWNhdGlvbiBmb3IgY2hhaW5lZCBzdWJ0eXBlIGNyZWF0aW9uIHdpdGggLnRoZW4oKVxuZXhwb3J0IGludGVyZmFjZSBUaGVuU3BlYyB7XG5cdHN1YnR5cGU6IG9iamVjdDtcblx0YXJnczogdW5rbm93bltdO1xuXHRuYW1lPzogc3RyaW5nO1xufVxuXG4vLyBDb250ZXh0IG9iamVjdCBwYXNzZWQgdGhyb3VnaCB0aGUgSW5zdGFuY2VDcmVhdG9yIHBpcGVsaW5lXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlQ3JlYXRvckNvbnRleHQge1xuXHR0eXBlOiBUeXBlRGVmO1xuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHRleGlzdGVudEluc3RhbmNlOiBvYmplY3Q7XG5cdGFyZ3M6IHVua25vd25bXTtcblx0TW9kaWZpY2F0aW9uQ29uc3RydWN0b3I6IE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yO1xuXHRNb2RpZmljYXRvclR5cGU6IE1uZW1vbmljYUNvbnN0cnVjdG9yO1xuXHRJbnN0YW5jZU1vZGlmaWNhdG9yOiBNbmVtb25pY2FDb25zdHJ1Y3Rvcjtcblx0aW5oZXJpdGVkSW5zdGFuY2U6IG9iamVjdCB8IFByb21pc2U8b2JqZWN0Pjtcblx0Y29uZmlnOiBjb25zdHJ1Y3Rvck9wdGlvbnM7XG5cdHByb3RvOiBvYmplY3Q7XG5cdF9fcHJvdG9fcHJvdG9fXz86IG9iamVjdDtcblx0c3RhY2s/OiBzdHJpbmdbXTtcblxuXHRnZXRFeGlzdGVudEFzeW5jU3RhY2soZXhpc3RlbnRJbnN0YW5jZTogb2JqZWN0KTogdW5rbm93bjtcblx0cG9zdFByb2Nlc3NpbmcoY29udGludWF0aW9uT2Y/OiBUeXBlRGVmKTogdm9pZDtcblx0bWFrZUF3YWl0ZXIodHlwZTogVHlwZURlZiwgdGhlbj86IFRoZW5TcGVjKTogUHJvbWlzZTxvYmplY3Q+O1xuXHRhZGRUaGVuKHRoZW46IFRoZW5TcGVjKTogdm9pZDtcblx0aW52b2tlUHJlSG9va3MoKTogdm9pZDtcblx0aW52b2tlUG9zdEhvb2tzKCk6IHsgdHlwZTogU2V0PHVua25vd24+OyBjb2xsZWN0aW9uOiBTZXQ8dW5rbm93bj4gfTtcblx0dGhyb3dNb2RpZmljYXRpb25FcnJvcihlcnJvcjogTW5lbW9uaWNhRXJyb3IpOiB2b2lkO1xufVxuXG4vKipcbiAqIFByb3RvIG1lcmdlIHR5cGUgLSBjb21iaW5lcyBwYXJlbnQgYW5kIGNoaWxkIHR5cGVzIHdpdGhvdXQgcHJvcGVydHkgY29uZmxpY3RzLlxuICpcbiAqIFdoZW4gYSBzdWJ0eXBlIGlzIGRlZmluZWQgZnJvbSBhIHBhcmVudCBpbnN0YW5jZSwgd2Ugd2FudCB0aGUgY2hpbGQgcHJvcGVydGllc1xuICogdG8gdGFrZSBwcmVjZWRlbmNlLiBgRXhjbHVkZTxrZXlvZiBQLCBrZXlvZiBUPmAgcmVtb3ZlcyBvdmVybGFwcGluZyBrZXlzIGZyb20gUCxcbiAqIHNvIGBQaWNrPFAsIC4uLj5gIG9ubHkgYnJpbmdzIGluIHBhcmVudCBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QgY2xhc2ggd2l0aCBjaGlsZC5cbiAqXG4gKiBSZXN1bHQ6IGNoaWxkIFQgZ2V0cyBhbGwgaXRzIG93biBwcm9wcywgcGx1cyBwYXJlbnQncyBub24tb3ZlcmxhcHBpbmcgcHJvcHMuXG4gKi9cbmV4cG9ydCB0eXBlIFByb3RvPFAgZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyBvYmplY3Q+ID0gVCAmIFBpY2s8UCwgRXhjbHVkZTxrZXlvZiBQLCBrZXlvZiBUPj47XG5cblxuLy8gZXhwb3J0IHR5cGUgUHJvdG9GbGF0PFxuLy8gXHRQIGV4dGVuZHMgb2JqZWN0LFxuLy8gXHRUIGV4dGVuZHMgb2JqZWN0LFxuLy8gXHRGIGV4dGVuZHMgUHJvdG88UCwgVD4gPSBQcm90bzxQLCBUPlxuLy8gPiA9IHsgW2tleSBpbiBrZXlvZiBGXTogRltrZXldfSA7XG5cbmV4cG9ydCB0eXBlIFByb3RvRmxhdDxcblx0UCBleHRlbmRzIG9iamVjdCxcblx0VCBleHRlbmRzIG9iamVjdCxcblx0TCBleHRlbmRzIEV4Y2x1ZGU8a2V5b2YgUCwga2V5b2YgVD4gPSBFeGNsdWRlPGtleW9mIFAsIGtleW9mIFQ+LFxuPiA9IHtcbiAgICBba2V5IGluIGtleW9mIFRdOiBUW2tleV07XG59ICYge1xuXHRba2V5IGluIExdOiBQW2tleV07XG59O1xuXG4vLyBNbmVtb25pY2EgaW5zdGFuY2UgbWV0aG9kIGtleXMuIFRoZXNlIGFyZSBmaWx0ZXJlZCBvdXQgb2YgZXh0cmFjdGVkL21lcmdlZFxuLy8gZmllbGQtb25seSB2aWV3cyBiZWNhdXNlIHRoZXkgYmVsb25nIHRvIHRoZSBwcm90b3R5cGUsIG5vdCB0byB0aGUgdXNlcidzXG4vLyBlbnVtZXJhYmxlIGRhdGEgcHJvcGVydGllcy5cbmV4cG9ydCB0eXBlIE1uZW1vbmljYUluc3RhbmNlTWV0aG9kS2V5cyA9XG5cdCdleHRyYWN0JyB8ICdwaWNrJyB8ICdwYXJlbnQnIHwgJ2Nsb25lJyB8ICdmb3JrJyB8ICdleGNlcHRpb24nIHwgJ3NpYmxpbmcnO1xuXG5leHBvcnQgdHlwZSBGbGF0dGVuPEY+ID0geyBba2V5IGluIGtleW9mIEZdOiBGW2tleV0gfVxuXG4vLyBFeHRyYWN0ZWQ8VD46IHRoZSBzaGFwZSByZXR1cm5lZCBieSB1dGlscy5leHRyYWN0KGluc3RhbmNlKS5cbi8vIEl0IGNvbnRhaW5zIHRoZSBlbnVtZXJhYmxlIHN0cmluZy1rZXllZCB1c2VyIHByb3BlcnRpZXMgb2YgdGhlIGluc3RhbmNlLFxuLy8gb21pdHRpbmcgTW5lbW9uaWNhSW5zdGFuY2UgbWV0aG9kcyAoZXh0cmFjdCwgcGljaywgcGFyZW50LCBjbG9uZSwgZm9yayxcbi8vIGV4Y2VwdGlvbiwgc2libGluZykuIE9wdGlvbmFsaXR5IGlzIHByZXNlcnZlZCBmcm9tIHRoZSBzb3VyY2UgdHlwZS5cbi8vIFRoZSBgJiB7fWAgdHJpY2sgZm9yY2VzIFR5cGVTY3JpcHQgdG8gZXhwYW5kIHRoZSBhbGlhcyBpbiBob3ZlciB0b29sdGlwc1xuLy8gc28gaXQgcmVuZGVycyBhcyBhIHBsYWluIG9iamVjdCBsaXRlcmFsIGluc3RlYWQgb2YgXCJFeHRyYWN0ZWQ8ey4uLn0+XCIuXG5leHBvcnQgdHlwZSBFeHRyYWN0ZWQ8VCBleHRlbmRzIG9iamVjdD4gPSB7XG5cdFtLIGluIGtleW9mIFQgYXMgSyBleHRlbmRzIHN0cmluZyA/IChLIGV4dGVuZHMgTW5lbW9uaWNhSW5zdGFuY2VNZXRob2RLZXlzID8gbmV2ZXIgOiBLKSA6IG5ldmVyXTogVFtLXTtcbn0gJiB7fTtcblxuLy8gUGFyc2VkPFQ+OiB0aGUgc2hhcGUgcmV0dXJuZWQgYnkgdXRpbHMucGFyc2UoaW5zdGFuY2UpLlxuLy8gSXQgaXMgYSBvbmUtbGV2ZWwgc25hcHNob3Qgb2YgdGhlIGluc3RhbmNlJ3MgcHJvdG90eXBlIGNoYWluLlxuLy8gYHByb3BzYCBjb250YWlucyB0aGUgaW5zdGFuY2UncyBlbnVtZXJhYmxlIHVzZXIgcHJvcGVydGllcztcbi8vIGBqb2ludGAgY29udGFpbnMgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGNvcGllZCBmcm9tIHRoZSBpbW1lZGlhdGUgcHJvdG90eXBlO1xuLy8gYHBhcmVudGAgaXMgdGhlIG5leHQgbGluayB1cCB0aGUgY2hhaW4gKGN1cnJlbnRseSBub3QgcmVjdXJzaXZlbHkgcGFyc2VkKS5cbmV4cG9ydCB0eXBlIFBhcnNlZDxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRwcm9wczogRXh0cmFjdGVkPFQ+O1xuXHRzZWxmOiBUO1xuXHRwcm90bzogb2JqZWN0O1xuXHRqb2ludDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdHBhcmVudDogb2JqZWN0IHwgdW5kZWZpbmVkO1xufTtcblxuLy8gU2libGluZyB0eXBlIGFjY2Vzc29yXG5leHBvcnQgaW50ZXJmYWNlIFNpYmxpbmdBY2Nlc3NvciB7XG5cdChTaWJsaW5nVHlwZU5hbWU6IHN0cmluZyk6IFR5cGVDbGFzcyB8IHVuZGVmaW5lZDtcblx0W2tleTogc3RyaW5nXTogVHlwZUNsYXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vLyBNbmVtb25pY2EgaW5zdGFuY2UgbWV0aG9kcyBpbnRlcmZhY2UgKG9wdC1pbikuXG4vLyBUaGVzZSBtZXRob2RzIHVzZWQgdG8gYmUgYXV0by1pbmplY3RlZCBvbnRvIGV2ZXJ5IGluc3RhbmNlLiBUaGV5IGFyZSBub3dcbi8vIGF2YWlsYWJsZSBvbmx5IHdoZW4gYSB0eXBlIGV4cGxpY2l0bHkgYWRkcyB0aGVtIHRvIGl0cyBwcm90b3R5cGUuXG4vLyBVc2VycyBjYW4gc3RpbGwgdXNlIHRoaXMgaW50ZXJmYWNlIHRvIHR5cGUgdGhlaXIgb3duIHJvb3QtbGV2ZWwgaGVscGVycy5cbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhSW5zdGFuY2U8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuXHRleHRyYWN0KCk6IEV4dHJhY3RlZDxUPjtcblx0cGljazxLIGV4dGVuZHMga2V5b2YgVD4oLi4ua2V5czogKEsgfCBLW10pW10pOiB7IFtQIGluIEtdOiBUW1BdIH0gJiB7fTtcblx0cGljayguLi5rZXlzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRwYXJlbnQoKTogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRwYXJlbnQ8SyBleHRlbmRzIFBhcmVudFBhdGhPZkluc3RhbmNlPHRoaXM+ICYgc3RyaW5nPihcblx0XHRjb25zdHJ1Y3Rvckxvb2t1cFBhdGg6IEtcblx0KTogSW5zdGFuY2VPZlR5cGVSZWdpc3RyeTxLPiB8IHVuZGVmaW5lZDtcblx0cGFyZW50KGNvbnN0cnVjdG9yTG9va3VwUGF0aDogc3RyaW5nKTogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRyZWFkb25seSBjbG9uZTogdGhpcztcblx0Zm9yayguLi5mb3JrQXJnczogdW5rbm93bltdKTogdGhpcztcblx0ZXhjZXB0aW9uKGVycm9yOiBFcnJvciwgLi4uYXJnczogdW5rbm93bltdKTogRXJyb3I7XG5cdHJlYWRvbmx5IHNpYmxpbmc6IFNpYmxpbmdBY2Nlc3Nvcjtcbn1cblxuLy8gSW5zdGFuY2UgcHJvcGVydGllcyBmb3IgX19zZWxmX18gcmVmZXJlbmNlXG4vLyBUaGlzIG1lcmdlcyBpbnRlcm5hbCBwcm9wcyB3aXRoIHRoZSBpbnN0YW5jZSBtZXRob2RzXG4vLyBJbnRlcm5hbCBpbnN0YW5jZSBwcm9wZXJ0aWVzIChub24tZW51bWVyYWJsZSlcbi8vIFRoZXNlIGFyZSBhbHdheXMgcHJlc2VudCBvbiBpbnN0YW5jZXMgYnV0IGFjY2Vzc2VkIHZpYSBnZXRQcm9wcy9zZXRQcm9wc1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VJbnRlcm5hbFByb3BzID0ge1xuXHRfX3Byb3RvX3Byb3RvX186IG9iamVjdDtcblx0X19hcmdzX186IHVua25vd25bXTtcblx0X19jb2xsZWN0aW9uX186IENvbGxlY3Rpb25EZWY7XG5cdF9fc3VidHlwZXNfXzogTWFwPHN0cmluZywgb2JqZWN0Pjtcblx0X190eXBlX186IFR5cGVEZWY7XG5cdF9fcGFyZW50X186IG9iamVjdDtcblx0X19zdGFja19fPzogc3RyaW5nO1xuXHRfX2NyZWF0b3JfXzogSW5zdGFuY2VDcmVhdG9yQ29udGV4dDtcblx0X190aW1lc3RhbXBfXzogbnVtYmVyO1xufTtcblxuLy8gQ29tYmluZWQgUHJvcHMgdHlwZSBmb3IgaW50ZXJuYWwgdXNlIGluc2lkZSAuL3NyY1xuZXhwb3J0IHR5cGUgUHJvcHMgPSBJbnN0YW5jZUludGVybmFsUHJvcHMgJiB7XG5cdF9fc2VsZl9fOiBJbnN0YW5jZUludGVybmFsUHJvcHM7XG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59O1xuXG4vLyBDb21iaW5lZCBpbnN0YW5jZSB0eXBlOiBwbGFpbiBvYmplY3Qgd2l0aCB0aGUgdXNlcidzIGZpZWxkcyBvbmx5LlxuLy8gSW5zdGFuY2UgbWV0aG9kcyAoZXh0cmFjdCwgcGljaywgZm9yaywgZXRjLikgYXJlIG5vIGxvbmdlciBhdXRvLWluamVjdGVkLlxuLy8gVGhlIGlubGluZSBtYXBwZWQgdHlwZSBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIEZsYXR0ZW4gYWxpYXMgc28gdGhhdCBob3ZlclxuLy8gdG9vbHRpcHMgc2hvdyB0aGUgYWN0dWFsIGZpZWxkIG9iamVjdCBsaXRlcmFsIGZpcnN0LCBub3QgXCJGbGF0dGVuPHsuLi59PlwiLlxuZXhwb3J0IHR5cGUgSW5zdGFuY2VSZXN1bHQ8XG4gIE4gZXh0ZW5kcyBvYmplY3QsXG4+ID0geyBbSyBpbiBrZXlvZiBOXTogTltLXSB9O1xuXG4vLyBEZWZpbml0b3IgaW5zdGFuY2UgLSB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24gcmV0dXJuZWQgYnkgZGVmaW5lXG4vLyBOID0gaW5zdGFuY2UgdHlwZSAocHJvcGVydGllcyBhdmFpbGFibGUgb24gaW5zdGFuY2VzKVxuLy8gUyA9IHN1YnR5cGVzIG1hcFxuZXhwb3J0IGludGVyZmFjZSBJRGVmaW5pdG9ySW5zdGFuY2U8XG5cdE4gZXh0ZW5kcyBvYmplY3QsXG5cdFIgZXh0ZW5kcyBJbnN0YW5jZVJlc3VsdDxOPiA9IEluc3RhbmNlUmVzdWx0PE4+XG4+IHtcblxuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHRwcm90b3R5cGU6IE47XG5cblx0XG5cdC8vIHRoZSBsaW5lIGJlbG93IGRlY2xhcmVzIGEgYG5ldyAuLi5gIGludm9jYXRpb24sXG5cdC8vIHNvIG1ha2VzIGludGVyZmFjZSBjb25zdHJ1Y3RpYmxlXG5cdC8vIG5ldyguLi5hcmdzOiB1bmtub3duW10pOiB7IFtrZXkgaW4ga2V5b2YgUl06IFJba2V5XSB9O1xuXHRuZXcoLi4uYXJnczogdW5rbm93bltdKTogUjtcblxuXHRcblx0Ly8gVE9ETzogbmVlZCBjaGVjayBpZiBsaW5lIGJlbG93IHdvcmtzXG5cdC8vIGFsc28gVFMgaGludGluZyBjaGVjayBhcyB3ZWxsXG5cdC8vIHRoZSBsaW5lIGJlbG93IHNob3VsZCBtYWtlIGlzIGEgQGRlY29yYXRlIGRlY29yYXRvciB3b3JraW5nXG5cdCguLi5hcmdzOiB1bmtub3duW10pOiBJRGVmaW5pdG9ySW5zdGFuY2U8Uj47XG5cblxuXHQvLyBEZWZpbmUgbWV0aG9kIHRoYXQgY29tYmluZXMgcGFyZW50IE4gd2l0aCBuZXcgdHlwZSBUIHVzaW5nIFByb3RvXG5cdGRlZmluZTxcblx0XHRUIGV4dGVuZHMgb2JqZWN0LFxuXG5cdFx0Ly8gdGhpcyB3aWxsIGJlIGluc3RhbmNlIHR5cGUgZm9yIHN1Yi10eXBlICEhIVxuXHRcdC8vIEYgZXh0ZW5kcyBGbGF0dGVuPFByb3RvPE4sIFQ+PlxuXHRcdEYgZXh0ZW5kcyBQcm90bzxOLCBUPlxuXHQ+KFxuXHRcdFR5cGVPclR5cGVOYW1lOiBzdHJpbmcgfCBDYWxsYWJsZUZ1bmN0aW9uLFxuXHRcdGNvbnN0cnVjdEhhbmRsZXJPckNvbmZpZz86IElERUY8VD4gfCBvYmplY3QgfCBib29sZWFuIHwgQ2FsbGFibGVGdW5jdGlvbixcblx0XHRjb25maWdPclVuZGVmaW5lZD86IGNvbnN0cnVjdG9yT3B0aW9ucyB8IENhbGxhYmxlRnVuY3Rpb24gfCBib29sZWFuXG5cdCk6IElEZWZpbml0b3JJbnN0YW5jZTxGPjtcblx0XG5cdGxvb2t1cDogVHlwZUxvb2t1cDtcblx0XG5cdHJlZ2lzdGVySG9vayhob29rVHlwZTogaG9va3NUeXBlcywgY2I6IGhvb2spOiB2b2lkO1xuXHRcblx0XG5cdHN1YnR5cGVzOiBTdWJ0eXBlc01hcDtcblx0XG5cdC8vIEludGVybmFsIHByb3BlcnRpZXMgYWNjZXNzZWQgYnkgdGVzdHNcblx0X190eXBlX18/OiBUeXBlRGVmO1xuXHRjb2xsZWN0aW9uPzogQ29sbGVjdGlvbkRlZjtcblxuXHQvKlxuXHQvLyBBbGxvdyBkeW5hbWljIHByb3BlcnR5IGFjY2VzcyBmb3Igc3VidHlwZXNcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0Ki9cbn1cblxuLy8gVHlwZSBhYnNvcmJlciBmdW5jdGlvbiB0eXBlIC0gdXNlZCBmb3IgZGVmaW5pbmcgc3VidHlwZXNcbi8vIFN1cHBvcnRzIG11bHRpcGxlIGNhbGxpbmcgY29udmVudGlvbnM6XG4vLyAxLiBNb2Rlcm46IGRlZmluZShUeXBlTmFtZSwgY29uc3RydWN0SGFuZGxlciwgY29uZmlnPylcbi8vIDIuIExlZ2FjeTogZGVmaW5lKGNvbnN0cnVjdEhhbmRsZXIsIGNvbmZpZz8pIC0gVHlwZU5hbWUgZnJvbSBjb25zdHJ1Y3RvciBuYW1lXG4vLyAzLiBOZXN0ZWQ6IHBhcmVudFR5cGUuZGVmaW5lKFR5cGVOYW1lLCBjb25zdHJ1Y3RIYW5kbGVyLCBjb25maWc/KVxuZXhwb3J0IGludGVyZmFjZSBUeXBlQWJzb3JiZXIgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0PFQgZXh0ZW5kcyBvYmplY3Q+KFxuXHRcdHRoaXM6IHVua25vd24sXG5cdFx0VHlwZU9yVHlwZU5hbWU6IHN0cmluZyB8IENhbGxhYmxlRnVuY3Rpb24sXG5cdFx0Y29uc3RydWN0SGFuZGxlck9yQ29uZmlnPzogSURFRjxUPiB8IG9iamVjdCB8IGJvb2xlYW4gfCBDYWxsYWJsZUZ1bmN0aW9uLFxuXHRcdGNvbmZpZ09yVW5kZWZpbmVkPzogY29uc3RydWN0b3JPcHRpb25zIHwgQ2FsbGFibGVGdW5jdGlvbiB8IGJvb2xlYW5cblx0KTogSURlZmluaXRvckluc3RhbmNlPFQ+O1xufVxuXG4vLyBUeXBlc0NvbGxlY3Rpb24gaW50ZXJmYWNlIGZvciBjcmVhdGVUeXBlc0NvbGxlY3Rpb25cbi8vIFRoaXMgcmVwcmVzZW50cyB0aGUgYWN0dWFsIHJldHVybiB0eXBlIG9mIGNyZWF0ZVR5cGVzQ29sbGVjdGlvblxuZXhwb3J0IGludGVyZmFjZSBUeXBlc0NvbGxlY3Rpb24gZXh0ZW5kcyBIb29rYWJsZSB7XG5cdGRlZmluZTogVHlwZUFic29yYmVyO1xuXHRsb29rdXA6IFR5cGVMb29rdXA7XG5cdHN1YnR5cGVzOiBTdWJ0eXBlc01hcDtcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gU2hhcmVkIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHN1cHBvcnQgaG9va3MgKFR5cGVEZWYgYW5kIENvbGxlY3Rpb25EZWYpXG5leHBvcnQgaW50ZXJmYWNlIEhvb2thYmxlIHtcblx0aG9va3M6IFJlY29yZDxzdHJpbmcsIFNldDxob29rPj47XG5cdGludm9rZUhvb2soaG9va1R5cGU6IGhvb2tzVHlwZXMsIG9wdHM6IGhvb2tzT3B0cyk6IFNldDx1bmtub3duPjtcblx0cmVnaXN0ZXJIb29rKGhvb2tUeXBlOiBob29rc1R5cGVzLCBjYjogaG9vayk6IHZvaWQ7XG5cdHJlZ2lzdGVyRmxvd0NoZWNrZXIoY2I6IChvcHRzOiBvYmplY3QpID0+IHVua25vd24pOiB2b2lkO1xufVxuXG4vLyBjcmVhdGVUeXBlc0NvbGxlY3Rpb24gZnVuY3Rpb24gdHlwZVxuZXhwb3J0IHR5cGUgQ3JlYXRlVHlwZXNDb2xsZWN0aW9uRnVuY3Rpb24gPSAoY29uZmlnPzogY29uc3RydWN0b3JPcHRpb25zKSA9PiBUeXBlc0NvbGxlY3Rpb247XG5cbi8vIFR5cGUgY2xhc3MgLSBiYXNlIHR5cGUgY29uc3RydWN0b3JcbmV4cG9ydCB0eXBlIFR5cGVDbGFzcyA9IElEZWZpbml0b3JJbnN0YW5jZTxvYmplY3Q+O1xuXG4vLyBNbmVtb25pY2EgY29uc3RydWN0b3Ig4oCUIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiByZXR1cm5lZCBieSBjb25zdHJ1Y3RIYW5kbGVyKClcbi8vIEhhcyBTeW1ib2xDb25zdHJ1Y3Rvck5hbWUgYXR0YWNoZWQgYW5kIGlzIGJvdGggbmV3YWJsZSBhbmQgY2FsbGFibGVcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhQ29uc3RydWN0b3IgZXh0ZW5kcyBOZXdhYmxlRnVuY3Rpb24ge1xuXHRuZXcgKC4uLmFyZ3M6IHVua25vd25bXSk6IG9iamVjdDtcblx0KHRoaXM6IG9iamVjdCwgLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93bjtcblx0W2tleTogc3ltYm9sXTogdW5rbm93bjtcbn1cblxuLy8gVHlwZSBkZXNjcmlwdG9yIGluc3RhbmNlIOKAlCBpbnRlcm5hbCBzaGFwZSBvZiBUeXBlRGVzY3JpcHRvciBvYmplY3RzXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVEZXNjcmlwdG9yRGVmaW5lIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdChcblx0XHRUeXBlT3JUeXBlTmFtZTogc3RyaW5nIHwgQ2FsbGFibGVGdW5jdGlvbixcblx0XHRjb25zdHJ1Y3RIYW5kbGVyT3JDb25maWc/OiBDYWxsYWJsZUZ1bmN0aW9uIHwgb2JqZWN0LFxuXHRcdGNvbmZpZz86IG9iamVjdFxuXHQpOiBUeXBlQ2xhc3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZURlc2NyaXB0b3JMb29rdXAgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KFR5cGVOZXN0ZWRQYXRoOiBzdHJpbmcpOiBUeXBlQ2xhc3MgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFR5cGVEZXNjcmlwdG9ySW5zdGFuY2UgPSB7XG5cdGRlZmluZTogVHlwZURlc2NyaXB0b3JEZWZpbmU7XG5cdGxvb2t1cDogVHlwZURlc2NyaXB0b3JMb29rdXA7XG5cdHN1YnR5cGVzOiBNYXA8c3RyaW5nLCBvYmplY3Q+O1xuXHRUeXBlTmFtZTogc3RyaW5nO1xufTtcblxuLy8gQ29uc3RydWN0b3IgdHlwZSBmb3IgZGVjb3JhdGUgZnVuY3Rpb25cbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSBvYmplY3Q+ID0gbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQ7XG5cbi8vIERlY29yYXRlZCBjbGFzcyB0eXBlIC0gaW5jbHVkZXMgY2FsbCBzaWduYXR1cmUgZm9yIGRlY29yYXRvciBwYXR0ZXJuXG5leHBvcnQgdHlwZSBEZWNvcmF0ZWRDbGFzczxUIGV4dGVuZHMgQ29uc3RydWN0b3I8b2JqZWN0Pj4gPVxuXHRUICZcblx0KDxVIGV4dGVuZHMgQ29uc3RydWN0b3I8b2JqZWN0Pj4odGFyZ2V0OiBVKSA9PiBEZWNvcmF0ZWRDbGFzczxVPikgJiB7XG5cdFx0ZGVmaW5lOiBUeXBlQWJzb3JiZXI7XG5cdFx0cmVnaXN0ZXJIb29rKGhvb2tUeXBlOiBob29rc1R5cGVzLCBjYjogaG9vayk6IHZvaWQ7XG5cdFx0bG9va3VwOiBUeXBlTG9va3VwO1xuXHRcdFR5cGVOYW1lOiBzdHJpbmc7XG5cdH07XG5cbi8vIEhlbHBlcjogbWVyZ2UgcGFyZW50IGVudGl0eSAoRSkgYW5kIGNoaWxkIGNvbnN0cnVjdG9yIGluc3RhbmNlIChUKSBpbnRvIGFcbi8vIHNpbmdsZSBmbGF0IG9iamVjdCB0eXBlLCBmaWx0ZXJpbmcgb3V0IE1uZW1vbmljYUluc3RhbmNlIG1ldGhvZCBuYW1lcy5cbi8vIFVzZWQgYnkgYXBwbHkvY2FsbC9iaW5kLlxuZXhwb3J0IHR5cGUgTWVyZ2U8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4gPSB7XG5cdFtLIGluIGtleW9mIFQgfCBrZXlvZiBFIGFzIEsgZXh0ZW5kcyBNbmVtb25pY2FJbnN0YW5jZU1ldGhvZEtleXMgPyBuZXZlciA6IEtdOlxuXHRcdEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IEVbSyAmIGtleW9mIEVdO1xufTtcblxuLy8gQXBwbHkvQ2FsbC9CaW5kIGZ1bmN0aW9uIHR5cGVzXG4vLyBUaGUgcmV0dXJuIHR5cGUgbWVyZ2VzIHRoZSBwYXJlbnQgZW50aXR5IGZpZWxkcyB3aXRoIHRoZSBjaGlsZCBjb25zdHJ1Y3RvclxuLy8gZmllbGRzIChmaWx0ZXJpbmcgb3V0IE1uZW1vbmljYUluc3RhbmNlIG1ldGhvZCBuYW1lcyksIHByb2R1Y2luZyB0aGUgc2FtZVxuLy8gYHsgZmllbGRzIH1gIGhvdmVyIHN0eWxlIGFzIGBuZXcgVHlwZSgpYC5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlGdW5jdGlvbiBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQ8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4oXG5cdFx0ZW50aXR5OiBFLFxuXHRcdENvbnN0cnVjdG9yOiBJREVGPFQ+LFxuXHRcdGFyZ3M/OiB1bmtub3duW11cblx0KTogSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxGdW5jdGlvbiBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQ8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4oXG5cdFx0ZW50aXR5OiBFLFxuXHRcdENvbnN0cnVjdG9yOiBJREVGPFQ+LFxuXHRcdC4uLmFyZ3M6IHVua25vd25bXVxuXHQpOiBJbnN0YW5jZVJlc3VsdDxNZXJnZTxFLCBUPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmluZEZ1bmN0aW9uIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdDxFIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgb2JqZWN0Pihcblx0XHRlbnRpdHk6IEUsXG5cdFx0Q29uc3RydWN0b3I6IElERUY8VD5cblx0KTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xufVxuXG4vLyBVdGlscyBvYmplY3QgdHlwZVxuZXhwb3J0IGludGVyZmFjZSBVdGlsc0NvbGxlY3Rpb24ge1xuXHRleHRyYWN0PFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBUKTogRXh0cmFjdGVkPFQ+O1xuXHRwaWNrPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPihpbnN0YW5jZTogVCwgLi4uYXJnczogKEsgfCBLW10pW10pOiB7IFtQIGluIEtdOiBUW1BdIH0gJiB7fTtcblx0cGljazxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCwgLi4uYXJnczogKHN0cmluZyB8IHN0cmluZ1tdKVtdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdGNsb25lPFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBUKTogVDtcblx0Zm9yazxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCk6ICh0aGlzOiBvYmplY3QsIC4uLmZvcmtBcmdzOiB1bmtub3duW10pID0+IFQ7XG5cdHNpYmxpbmcoaW5zdGFuY2U6IG9iamVjdCk6IFNpYmxpbmdBY2Nlc3Nvcjtcblx0Y29sbGVjdENvbnN0cnVjdG9yczogKGluc3RhbmNlOiBvYmplY3QsIGZsYXQ/OiBib29sZWFuKSA9PiAoQ2FsbGFibGVGdW5jdGlvbiB8IHN0cmluZylbXTtcblx0bWVyZ2U8QSBleHRlbmRzIG9iamVjdCwgQiBleHRlbmRzIG9iamVjdD4oXG5cdFx0YTogQSxcblx0XHRiOiBCLFxuXHRcdC4uLmFyZ3M6IHVua25vd25bXVxuXHQpOiBJbnN0YW5jZVJlc3VsdDxNZXJnZTxCLCBBPj47XG5cdHBhcnNlPFQgZXh0ZW5kcyBvYmplY3Q+KHNlbGY6IFQpOiBQYXJzZWQ8VD47XG5cdHBhcmVudDxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCk6IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0cGFyZW50PFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBQYXJlbnRQYXRoT2ZJbnN0YW5jZTxUPiAmIHN0cmluZz4oXG5cdFx0aW5zdGFuY2U6IFQsXG5cdFx0cGF0aDogS1xuXHQpOiBJbnN0YW5jZU9mVHlwZVJlZ2lzdHJ5PEs+IHwgdW5kZWZpbmVkO1xuXHRwYXJlbnQ8VCBleHRlbmRzIG9iamVjdD4oaW5zdGFuY2U6IFQsIHBhdGg6IHN0cmluZyk6IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0dG9KU09OPFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBUKTogc3RyaW5nO1xuXHRba2V5OiBzdHJpbmddOiBDYWxsYWJsZUZ1bmN0aW9uO1xufVxuXG4vLyBNYWluIG1uZW1vbmljYSBtb2R1bGUgaW50ZXJmYWNlIC0gcmVwcmVzZW50cyB0aGUgZXhwb3J0ZWQgbW9kdWxlIG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSBNbmVtb25pY2FNb2R1bGUge1xuXHQvLyBDb3JlIGZ1bmN0aW9uc1xuXHRkZWZpbmU6IFR5cGVBYnNvcmJlcjtcblx0bG9va3VwOiB7XG5cdFx0KFR5cGVOZXN0ZWRQYXRoOiBzdHJpbmcpOiBUeXBlQ2xhc3MgfCB1bmRlZmluZWQ7XG5cdFx0PGNvbnN0IEsgZXh0ZW5kcyBrZXlvZiBUeXBlUmVnaXN0cnk+KFR5cGVOZXN0ZWRQYXRoOiBLKTogVHlwZVJlZ2lzdHJ5W0tdIHwgdW5kZWZpbmVkO1xuXHR9O1xuXHRhcHBseTogQXBwbHlGdW5jdGlvbjtcblx0Y2FsbDogQ2FsbEZ1bmN0aW9uO1xuXHRiaW5kOiBCaW5kRnVuY3Rpb247XG5cdGRlY29yYXRlOiA8VCBleHRlbmRzIENvbnN0cnVjdG9yPG9iamVjdD4gfCBjb25zdHJ1Y3Rvck9wdGlvbnMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuXHRcdHRhcmdldD86IFQsXG5cdFx0Y29uZmlnPzogY29uc3RydWN0b3JPcHRpb25zXG5cdCkgPT4gPFUgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxvYmplY3Q+Pihjc3RyOiBVKSA9PiBEZWNvcmF0ZWRDbGFzczxVPjtcblx0cmVnaXN0ZXJIb29rOiA8VCBleHRlbmRzIG9iamVjdD4oQ29uc3RydWN0b3I6IElERUY8VD4sIGhvb2tUeXBlOiBob29rc1R5cGVzLCBjYjogaG9vaykgPT4gdm9pZDtcblxuXHQvLyBEZXNjcmlwdG9yc1xuXHRkZWZhdWx0VHlwZXM6IFR5cGVzQ29sbGVjdGlvbjtcblxuXHQvLyBFcnJvcnNcblx0QkFTRV9NTkVNT05JQ0FfRVJST1I6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX1RZUEVfREVGSU5JVElPTjogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0V1JPTkdfSU5TVEFOQ0VfSU5WT0NBVElPTjogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0V1JPTkdfTU9ESUZJQ0FUSU9OX1BBVFRFUk46IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdEFMUkVBRFlfREVDTEFSRUQ6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX0FSR1VNRU5UU19VU0VEOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRXUk9OR19IT09LX1RZUEU6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdE1JU1NJTkdfQ0FMTEJBQ0tfQVJHVU1FTlQ6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdC8vIEZMT1dfQ0hFQ0tFUl9SRURFRklOSVRJT046IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdE1JU1NJTkdfSE9PS19DQUxMQkFDSzogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0VFlQRU5BTUVfTVVTVF9CRV9BX1NUUklORzogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0SEFORExFUl9NVVNUX0JFX0FfRlVOQ1RJT046IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdE9QVElPTlNfRVJST1I6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX1NUQUNLX0NMRUFORVI6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cblx0Ly8gQ29uc3RhbnRzXG5cdE1ORU1PTklDQTogc3RyaW5nO1xuXHRNTkVNT1NZTkU6IHN0cmluZztcblx0U3ltYm9sUGFyZW50VHlwZTogc3ltYm9sO1xuXHRTeW1ib2xDb25zdHJ1Y3Rvck5hbWU6IHN5bWJvbDtcblx0U3ltYm9sRGVmYXVsdFR5cGVzQ29sbGVjdGlvbjogc3ltYm9sO1xuXHRTeW1ib2xDb25maWc6IHN5bWJvbDtcblx0VFlQRV9USVRMRV9QUkVGSVg6IHN0cmluZztcblx0RXJyb3JNZXNzYWdlczogRXJyb3JNZXNzYWdlcztcblxuXHQvLyBVdGlsc1xuXHR1dGlsczogVXRpbHNDb2xsZWN0aW9uO1xuXHRnZXRQcm9wczogKGluc3RhbmNlOiBvYmplY3QpID0+IFByb3BzVHlwZSB8IHVuZGVmaW5lZDtcblx0c2V0UHJvcHM6IChpbnN0YW5jZTogb2JqZWN0LCB2YWx1ZXM6IG9iamVjdCkgPT4gc3RyaW5nW10gfCBmYWxzZTtcblx0ZmluZFN1YlR5cGVGcm9tUGFyZW50OiAoaW5zdGFuY2U6IG9iamVjdCB8IHVuZGVmaW5lZCwgc3ViVHlwZTogc3RyaW5nKSA9PiBvYmplY3QgfCBudWxsO1xuXHRpc0NsYXNzOiAoZm46IENhbGxhYmxlRnVuY3Rpb24pID0+IGJvb2xlYW47XG5cblx0Ly8gY3JlYXRlVHlwZXNDb2xsZWN0aW9uXG5cdGNyZWF0ZVR5cGVzQ29sbGVjdGlvbjogQ3JlYXRlVHlwZXNDb2xsZWN0aW9uRnVuY3Rpb247XG5cblx0Ly8gQWxsb3cgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG4iXX0=
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5cbmltcG9ydCB0eXBlIHsgVHlwZVJlZ2lzdHJ5IH0gZnJvbSAnLi4vaW5kZXgnO1xuXG4vLyBQcm9wcyB0eXBlIGZvciBnZXRQcm9wcy9zZXRQcm9wc1xuZXhwb3J0IHR5cGUgUHJvcHNUeXBlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8vIENvcmUgdHlwZSBkZWZpbml0aW9ucyBmb3IgbW5lbW9uaWNhXG5cbi8vIEJhc2UgY29uc3RydWN0b3IgZnVuY3Rpb24gdHlwZSAtIGNhbiBiZSBhIGNsYXNzIGNvbnN0cnVjdG9yIG9yIGEgZnVuY3Rpb24uXG4vLyBBcmdzIGRlZmF1bHRzIHRvIHVua25vd25bXSBzbyBJREVGPFQ+IGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlO1xuLy8gc3VwcGx5IEFyZ3MgdG8gZ2V0IHR5cGVkIGNvbnN0cnVjdG9yIHBhcmFtczogSURFRjxNeVR5cGUsIFtzdHJpbmcsIG51bWJlcl0+XG5leHBvcnQgdHlwZSBJREVGPFQsIEFyZ3MgZXh0ZW5kcyB1bmtub3duW10gPSB1bmtub3duW10+ID0geyBuZXcoKTogVCB9IHwgeyAodGhpczogVCwgLi4uYXJnczogQXJncyk6IHZvaWQgfTtcblxuLy8gRXJyb3IgbWVzc2FnZSB0eXBlcyAtIGFsbCBlcnJvciBtZXNzYWdlcyBhcmUgc3RyaW5nc1xuZXhwb3J0IHR5cGUgRXJyb3JNZXNzYWdlS2V5ID1cblx0fCAnQkFTRV9FUlJPUl9NRVNTQUdFJ1xuXHR8ICdIQU5ETEVSX01VU1RfQkVfQV9GVU5DVElPTidcblx0fCAnV1JPTkdfVFlQRV9ERUZJTklUSU9OJ1xuXHR8ICdXUk9OR19JTlNUQU5DRV9JTlZPQ0FUSU9OJ1xuXHR8ICdXUk9OR19NT0RJRklDQVRJT05fUEFUVEVSTidcblx0fCAnQUxSRUFEWV9ERUNMQVJFRCdcblx0fCAnV1JPTkdfQVJHVU1FTlRTX1VTRUQnXG5cdHwgJ1dST05HX0hPT0tfVFlQRSdcblx0fCAnTUlTU0lOR19IT09LX0NBTExCQUNLJ1xuXHR8ICdNSVNTSU5HX0NBTExCQUNLX0FSR1VNRU5UJ1xuXHR8ICdPUFRJT05TX0VSUk9SJ1xuXHR8ICdXUk9OR19TVEFDS19DTEVBTkVSJztcblx0Ly8gfCAnVFlQRU5BTUVfTVVTVF9CRV9BX1NUUklORydcblx0Ly8gfCAnRkxPV19DSEVDS0VSX1JFREVGSU5JVElPTidcblxuLy8gRXJyb3IgbWVzc2FnZXMgb2JqZWN0IHR5cGVcbmV4cG9ydCB0eXBlIEVycm9yTWVzc2FnZXMgPSBSZWNvcmQ8RXJyb3JNZXNzYWdlS2V5LCBzdHJpbmc+O1xuXG4vLyBIb29rIGNhbGxiYWNrIOKAlCBwYXNzZWQgdG8gcmVnaXN0ZXJIb29rIGFuZCBpbnZva2VkIGJ5IGludm9rZUhvb2tcbmV4cG9ydCBpbnRlcmZhY2UgaG9vayBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQob3B0czogaG9va3NPcHRzKTogdW5rbm93bjtcbn1cblxuLy8gRXJyb3IgY29uc3RydWN0b3IgZnJvbSBjb25zdHJ1Y3RFcnJvciAtIGNvbnN0cnVjdGFibGUgZnVuY3Rpb24gd2l0aCBwcm90b3R5cGVcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3RvciB7XG5cdG5ldyhhZGRpdGlvbj86IHN0cmluZywgc3RhY2s/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IEVycm9yO1xuXHQobmFtZTogc3RyaW5nKTogRXJyb3I7XG5cdHByb3RvdHlwZToge1xuXHRcdGNvbnN0cnVjdG9yOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHR9O1xufVxuXG4vLyBFcnJvcnMgdHlwZXMgbWFwIC0gaW5kZXhhYmxlIHJlY29yZCBvZiBlcnJvciBjb25zdHJ1Y3RvcnNcbmV4cG9ydCB0eXBlIEVycm9yc1R5cGVzTWFwID0gUmVjb3JkPHN0cmluZywgTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcj47XG5cbi8vIE1uZW1vbmljYSBlcnJvciBpbnRlcmZhY2UgZm9yIGV4dGVuZGVkIEVycm9yIG9iamVjdHNcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGV4Y2VwdGlvblJlYXNvbj86IEVycm9yO1xuXHRyZWFzb25zPzogRXJyb3JbXTtcblx0c3VycGx1cz86IEVycm9yW107XG59XG5cbi8qKlxuICogSW50ZXJuYWwgVHlwZSBDb25zdHJ1Y3Rvci5cbiAqIFwiVHlwZVwiIGhlcmUgaXMgdXNlZCBpbiB0aGUgQ29tcHV0ZXIgU2NpZW5jZSBzZW5zZSDigJQgYW4gaW50ZXJmYWNlL2NvbnRyYWN0XG4gKiBkZXNjcmliaW5nIHdoYXQgYSBjb25zdHJ1Y3RvciBtdXN0IHNhdGlzZnkgKGJvdGggYG5ld2AtYWJsZSBhbmQgY2FsbGFibGUpLlxuICogVEMgPSBUeXBlIENvbnN0cnVjdG9yOyBcIkludGVybmFsXCIgbWVhbnMgdGhpcyBpcyB0aGUgbGlicmFyeSdzIG93biBjb25zdHJ1Y3RvclxuICogc2hhcGUsIGRpc3RpbmN0IGZyb20gdXNlci1mYWNpbmcgVHlwZUNvbnN0cnVjdG9yIGJlbG93LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIF9JbnRlcm5hbF9UQ188Q29uc3RydWN0b3JJbnN0YW5jZSBleHRlbmRzIG9iamVjdD4ge1xuXHRuZXcoLi4uYXJnczogdW5rbm93bltdKTogQ29uc3RydWN0b3JJbnN0YW5jZTtcblx0KHRoaXM6IENvbnN0cnVjdG9ySW5zdGFuY2UsIC4uLmFyZ3M6IHVua25vd25bXSk6IENvbnN0cnVjdG9ySW5zdGFuY2U7XG5cdHJlYWRvbmx5IHByb3RvdHlwZTogQ29uc3RydWN0b3JJbnN0YW5jZSAmIHtcblx0XHRyZWFkb25seSBjb25zdHJ1Y3RvcjogX0ludGVybmFsX1RDXzxDb25zdHJ1Y3Rvckluc3RhbmNlPlxuXHR9O1xufVxuXG4vKipcbiAqIFB1YmxpYyBhbGlhcyBmb3IgX0ludGVybmFsX1RDXyDigJQgdGhlIHNoYXBlIG9mIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyByZXR1cm5lZCBieSBgZGVmaW5lKClgLlxuICogQXVnbWVudGVkIGJ5IHRhY3RpY2EtZ2VuZXJhdGVkIFR5cGVSZWdpc3RyeSB0byBiZWNvbWUgdXNlci1zcGVjaWZpYyB0eXBlcy5cbiAqIEtlcHQgYXMgYSBuYW1lZCBhbGlhcyAocmF0aGVyIHRoYW4gaW5saW5pbmcgX0ludGVybmFsX1RDXykgc28gdGFjdGljYSBjYW4gcmVmZXJlbmNlIGl0XG4gKiBjbGVhbmx5IGluIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZUNvbnN0cnVjdG9yPENvbnN0cnVjdG9ySW5zdGFuY2UgZXh0ZW5kcyBvYmplY3Q+ID0gX0ludGVybmFsX1RDXzxDb25zdHJ1Y3Rvckluc3RhbmNlPjtcblxuLyoqXG4gKiBNaW5pbWFsIGNvbnN0cnVjdG9yIHNoYXBlIHVzZWQgZm9yIHRoZSBUeXBlUmVnaXN0cnkgaW5kZXggc2lnbmF0dXJlLlxuICogSXQgYWNjZXB0cyBhbnkgbW5lbW9uaWNhLWNvbXBhdGlibGUgY29uc3RydWN0b3IsIGJ1dCBkZWxpYmVyYXRlbHkgcmV0dXJuc1xuICogYG9iamVjdGAgc28gdW5hdWdtZW50ZWQgcmVnaXN0cnkgbG9va3VwcyBhcmUgbm90IHVzZWZ1bCB3aXRob3V0IGFuIGV4cGxpY2l0XG4gKiBwZXIta2V5IGNvbnN0cnVjdG9yIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZUNvbnN0cnVjdG9yQmFzZSB7XG5cdG5ldyAoLi4uYXJnczogdW5rbm93bltdKTogb2JqZWN0O1xufVxuXG4vKipcbiAqIEluc3RhbmNlIHR5cGUgcHJvZHVjZWQgYnkgYSBUeXBlUmVnaXN0cnkgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlT2ZUeXBlUmVnaXN0cnk8SyBleHRlbmRzIGtleW9mIFR5cGVSZWdpc3RyeT4gPVxuXHRUeXBlUmVnaXN0cnlbS10gZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gaW5mZXIgUiA/IFIgOiBuZXZlcjtcblxuXG4vKipcbiAqIEV4dHJhY3Qgb25seSB0aGUgbGl0ZXJhbCBzdHJpbmcga2V5cyBvZiBhIHR5cGUsIGZpbHRlcmluZyBvdXQgZ2VuZXJpY1xuICogaW5kZXggc2lnbmF0dXJlcy4gVGhpcyBsZXRzIHVzIGl0ZXJhdGUgb3ZlciBhdWdtZW50ZWQgVHlwZVJlZ2lzdHJ5IGtleXNcbiAqIHdpdGhvdXQgcGlja2luZyB1cCB0aGUgYFtrZXk6IHN0cmluZ11gIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgTGl0ZXJhbEtleXNPZjxUPiA9IGtleW9mIFQgZXh0ZW5kcyBpbmZlciBLXG5cdD8gSyBleHRlbmRzIHN0cmluZ1xuXHRcdD8gc3RyaW5nIGV4dGVuZHMgSyA/IG5ldmVyIDogS1xuXHRcdDogbmV2ZXJcblx0OiBuZXZlcjtcblxuLyoqXG4gKiBHaXZlbiBhIGRvdHRlZCBUeXBlUmVnaXN0cnkga2V5LCBleHRyYWN0IHRoZSBwYXJlbnQgcGF0aC5cbiAqIGBQYXJlbnRQYXRoPCdBLkIuQyc+YCDihpIgYCdBLkInYC5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyZW50UGF0aDxLIGV4dGVuZHMgc3RyaW5nPiA9XG5cdEsgZXh0ZW5kcyBgJHtpbmZlciBQfS4ke3N0cmluZ31gID8gUCA6IG5ldmVyO1xuXG4vKipcbiAqIEdpdmVuIGEgZG90dGVkIFR5cGVSZWdpc3RyeSBrZXksIHJldHVybiB0aGUgdW5pb24gb2YgYWxsIGFuY2VzdG9yIHByZWZpeGVzLlxuICogYEFsbFBhcmVudFByZWZpeGVzPCdBLkIuQyc+YCDihpIgYCdBJyB8ICdBLkInYC5cbiAqL1xuZXhwb3J0IHR5cGUgQWxsUGFyZW50UHJlZml4ZXM8SyBleHRlbmRzIHN0cmluZz4gPVxuXHRLIGV4dGVuZHMgYCR7aW5mZXIgUH0uJHtzdHJpbmd9YCA/IFAgfCBBbGxQYXJlbnRQcmVmaXhlczxQPiA6IG5ldmVyO1xuXG4vKipcbiAqIEdpdmVuIGEgcGFyZW50IHBhdGgsIHJldHVybiB0aGUgdW5pb24gb2YgVHlwZVJlZ2lzdHJ5IGtleXMgdGhhdCBhcmUgZGlyZWN0XG4gKiBvciBpbmRpcmVjdCBjaGlsZHJlbiBvZiB0aGF0IHBhdGguXG4gKi9cbmV4cG9ydCB0eXBlIENoaWxkS2V5c09mPFAgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuXHRbSyBpbiBrZXlvZiBUeXBlUmVnaXN0cnldOiBLIGV4dGVuZHMgYCR7UH0uJHtzdHJpbmd9YCA/IEsgOiBuZXZlclxufVtrZXlvZiBUeXBlUmVnaXN0cnldO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluc3RhbmNlIHR5cGUsIGZpbmQgdGhlIFR5cGVSZWdpc3RyeSBrZXkocykgd2hvc2UgY29uc3RydWN0b3JcbiAqIHJldHVybnMgdGhhdCBpbnN0YW5jZSB0eXBlLiBUaGlzIGludmVydHMgdGhlIHJlZ2lzdHJ5IGF0IHRoZSB0eXBlIGxldmVsXG4gKiBzbyB1dGlsaXRpZXMgbGlrZSBgcGFyZW50KClgIGNhbiBkZXJpdmUgYW4gaW5zdGFuY2UncyBwYXRoIGZyb20gaXRzXG4gKiB0eXBlIGFsb25lLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT2ZJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0W0sgaW4gTGl0ZXJhbEtleXNPZjxUeXBlUmVnaXN0cnk+XTogVHlwZVJlZ2lzdHJ5W0tdIGV4dGVuZHMgbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IGluZmVyIFJcblx0XHQ/IFQgZXh0ZW5kcyBSID8gSyA6IG5ldmVyXG5cdFx0OiBuZXZlclxufVtMaXRlcmFsS2V5c09mPFR5cGVSZWdpc3RyeT5dO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluc3RhbmNlIHR5cGUsIHJldHVybiB0aGUgdW5pb24gb2YgVHlwZVJlZ2lzdHJ5IHBhdGhzIHRoYXQgYXJlXG4gKiB2YWxpZCBwYXJlbnQgbG9va3VwcyBmb3IgdGhhdCBpbnN0YW5jZS4gUm9vdCB0eXBlcyBwcm9kdWNlIGBuZXZlcmAgYmVjYXVzZVxuICogdGhleSBoYXZlIG5vIHBhcmVudCBwYXRoLlxuICovXG5leHBvcnQgdHlwZSBQYXJlbnRQYXRoT2ZJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0W0sgaW4gTGl0ZXJhbEtleXNPZjxUeXBlUmVnaXN0cnk+XTogVHlwZVJlZ2lzdHJ5W0tdIGV4dGVuZHMgbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IGluZmVyIFJcblx0XHQ/IFQgZXh0ZW5kcyBSID8gQWxsUGFyZW50UHJlZml4ZXM8Sz4gOiBuZXZlclxuXHRcdDogbmV2ZXJcbn1bTGl0ZXJhbEtleXNPZjxUeXBlUmVnaXN0cnk+XTtcblxuLy8gSG9vayB0eXBlc1xuZXhwb3J0IHR5cGUgaG9va3NUeXBlcyA9ICdwcmVDcmVhdGlvbicgfCAncG9zdENyZWF0aW9uJyB8ICdjcmVhdGlvbkVycm9yJztcblxuLy8gSG9vayBvcHRpb25zIHBhc3NlZCB0byBob29rIGNhbGxiYWNrc1xuLy8gUCA9IHBhcmVudCAvIGV4aXN0ZW50IGluc3RhbmNlIChwcm90bylcbi8vIFQgPSBjaGlsZCAvIGluaGVyaXRlZCBpbnN0YW5jZSAodHlwZSBiZWluZyBjcmVhdGVkKVxuZXhwb3J0IHR5cGUgaG9va3NPcHRzPFAgPSBvYmplY3QsIFQgPSBQPiA9IHtcblx0VHlwZU5hbWU6IHN0cmluZztcblx0dHlwZTogVHlwZURlZjtcblx0YXJnczogdW5rbm93bltdO1xuXHRleGlzdGVudEluc3RhbmNlOiBQO1xuXHRpbmhlcml0ZWRJbnN0YW5jZT86IFQ7XG5cdGNyZWF0b3I/OiB7IHRocm93TW9kaWZpY2F0aW9uRXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB9O1xufTtcblxuLy8gQ2FsbGJhY2sgcGFzc2VkIGludG8gTW9kaWZpY2F0aW9uQ29uc3RydWN0b3IgdG8gYXR0YWNoIGludGVybmFsIHByb3BzIHRvIHRoZSBwcm90b3R5cGVcbmV4cG9ydCBpbnRlcmZhY2UgQWRkUHJvcHNDYWxsYmFjayBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQocHJvdG86IG9iamVjdCk6IHZvaWQ7XG59XG5cbi8vIE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yOiB3aXJlcyBwcm90b3R5cGUgY2hhaW4gZHVyaW5nIGluc3RhbmNlIGNyZWF0aW9uXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdChcblx0XHR0aGlzOiBvYmplY3QsXG5cdFx0TW9kaWZpY2F0b3JUeXBlOiBNbmVtb25pY2FDb25zdHJ1Y3Rvcixcblx0XHRNb2RpZmljYXRvclR5cGVQcm90b3R5cGU6IG9iamVjdCxcblx0XHRfYWRkUHJvcHM6IEFkZFByb3BzQ2FsbGJhY2tcblx0KTogTW5lbW9uaWNhQ29uc3RydWN0b3I7XG59XG5cbi8vIEZhY3RvcnkgdGhhdCByZXR1cm5zIGEgTW9kaWZpY2F0aW9uQ29uc3RydWN0b3IgKHVzZWQgaW4gY29uc3RydWN0b3JPcHRpb25zKVxuZXhwb3J0IGludGVyZmFjZSBNb2RpZmljYXRpb25Db25zdHJ1Y3RvckZhY3RvcnkgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KCk6IE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yO1xufVxuXG4vLyBGYWN0b3J5IHRoYXQgcmV0dXJucyBhIE1uZW1vbmljYUNvbnN0cnVjdG9yIChzdG9yZWQgaW4gVHlwZURlZi5jb25zdHJ1Y3RIYW5kbGVyKVxuZXhwb3J0IGludGVyZmFjZSBNbmVtb25pY2FDb25zdHJ1Y3RvckZhY3RvcnkgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KCk6IE1uZW1vbmljYUNvbnN0cnVjdG9yO1xufVxuXG4vLyBNYXJrcyB0aGUgdG9wIG9mIGEgY2FwdHVyZWQgc3RhY2sgdHJhY2UgKHBhc3NlZCB0byBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSBhcyBjb25zdHJ1Y3Rvck9wdClcbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tCb3VuZGFyeSBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge31cblxuLy8gQSB3cmFwcGFibGUgdXRpbGl0eSBtZXRob2Qg4oCUIGFueSBjYWxsYWJsZSB0aGF0IHdyYXBUaGlzKCkgY2FuIHByb3h5XG5leHBvcnQgaW50ZXJmYWNlIFdyYXBwYWJsZU1ldGhvZCBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge31cblxuLy8gQ29uc3RydWN0b3Igb3B0aW9ucyBmb3IgZGVmaW5lXG5leHBvcnQgdHlwZSBjb25zdHJ1Y3Rvck9wdGlvbnMgPSB7XG5cdC8vIGV4cGxpY2l0IGRlY2xhcmF0aW9uIHdlIHdpc2ggdXNlXG5cdC8vIGFuIG9sZCBzdHlsZSBiYXNlZCBjb25zdHJ1Y3RvcnNcblx0TW9kaWZpY2F0aW9uQ29uc3RydWN0b3I/OiBNb2RpZmljYXRpb25Db25zdHJ1Y3RvckZhY3RvcnksXG5cdC8vIHNoYWxsIG9yIG5vdCB3ZSB1c2Ugc3RyaWN0IGNoZWNraW5nXG5cdC8vIGZvciBjcmVhdGlvbiBzdWItaW5zdGFuY2VzIE9ubHkgZnJvbSBjdXJyZW50IHR5cGVcblx0Ly8gb3Igd2UgbWlnaHQgdXNlIHVwLW5lc3RlZCBzdWItaW5zdGFuY2VzIGZyb20gY2hhaW5cblx0c3RyaWN0Q2hhaW4/OiBib29sZWFuLFxuXHQvLyBzaG91bGQgd2UgdXNlIGZvcmNlZCBlcnJvcnMgY2hlY2tpbmdcblx0Ly8gdG8gbWFrZSBhbGwgaW5oZXJpdGVkIHR5cGVzIGVycm9yZWRcblx0Ly8gaWYgdGhlcmUgaXMgYW4gZXJyb3Igc29tZXdoZXJlIGluIGNoYWluXG5cdGJsb2NrRXJyb3JzPzogYm9vbGVhbixcblx0Ly8gaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGNvbGxlY3Qgc3RhY2tcblx0Ly8gYXMgYSBfX3N0YWNrX18gcHJvdG90eXBlIHByb3BlcnR5XG5cdC8vIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBpbnN0YW5jZSBjcmVhdGlvblxuXHRzdWJtaXRTdGFjaz86IGJvb2xlYW4sXG5cdC8vIGF3YWl0IG5ldyBDb25zdHJ1Y3RvcigpXG5cdC8vIG11c3QgcmV0dXJuIHZhbHVlXG5cdGF3YWl0UmV0dXJuPzogYm9vbGVhbixcblx0Ly8gRm9yY2UgY2xhc3MgbW9kZSAoYXV0by1kZXRlY3RlZCBieSBkZWZhdWx0KVxuXHRhc0NsYXNzPzogYm9vbGVhbixcbn07XG5cbi8vIFN1YnR5cGVzIG1hcCAtIHJlcHJlc2VudHMgdGhlIHN1YnR5cGVzIHByb3BlcnR5XG5leHBvcnQgdHlwZSBTdWJ0eXBlc01hcCA9IE1hcDxzdHJpbmcsIFR5cGVDbGFzcz47XG5cbi8vIFR5cGUgZGVmaW5pdGlvbiBvYmplY3QgKGludGVybmFsIHByb3BlcnRpZXMpXG5leHBvcnQgdHlwZSBUeXBlRGVmID0ge1xuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHRwcm90bzogb2JqZWN0O1xuXHRpc1N1YlR5cGU6IGJvb2xlYW47XG5cdHN1YnR5cGVzOiBTdWJ0eXBlc01hcDtcblx0Y29sbGVjdGlvbjogQ29sbGVjdGlvbkRlZjtcblx0Y29uZmlnOiBjb25zdHJ1Y3Rvck9wdGlvbnM7XG5cdHBhcmVudFR5cGU/OiBUeXBlRGVmO1xuXHRjb25zdHJ1Y3RIYW5kbGVyOiBNbmVtb25pY2FDb25zdHJ1Y3RvckZhY3Rvcnk7XG5cdHRpdGxlOiBzdHJpbmc7XG5cdGhvb2tzOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8aG9vaz4+O1xuXHRpbnZva2VIb29rOiAoaG9va1R5cGU6IGhvb2tzVHlwZXMsIG9wdHM6IGhvb2tzT3B0cykgPT4gU2V0PHVua25vd24+O1xuXHRwcm90b3R5cGU6IHVua25vd247XG5cdHN0YWNrPzogc3RyaW5nO1xuXHRbU3ltYm9sLmhhc0luc3RhbmNlXTogKGluc3RhbmNlOiBvYmplY3QpID0+IGJvb2xlYW47XG59O1xuXG4vLyBDb2xsZWN0aW9uIGRlZmluaXRpb25cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25EZWYgPSBIb29rYWJsZSAmIHtcblx0ZGVmaW5lOiBUeXBlQWJzb3JiZXI7XG5cdGxvb2t1cDogVHlwZUxvb2t1cDtcblx0c3VidHlwZXM6IFN1YnR5cGVzTWFwO1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuLy8gVHlwZSBsb29rdXAgZnVuY3Rpb24gdHlwZTogbWF5IGhhdmUgYXVnbWVudGF0aW9uIGJ5IFRhY3RpY2EgcmUtZGVmaW5pdGlvblxuZXhwb3J0IGludGVyZmFjZSBUeXBlTG9va3VwIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdCh0aGlzOiBNYXA8c3RyaW5nLCB1bmtub3duPiwgVHlwZU5lc3RlZFBhdGg6IHN0cmluZyk6IFR5cGVDbGFzcyB8IHVuZGVmaW5lZDtcbn1cblxuLy8gU3BlY2lmaWNhdGlvbiBmb3IgY2hhaW5lZCBzdWJ0eXBlIGNyZWF0aW9uIHdpdGggLnRoZW4oKVxuZXhwb3J0IGludGVyZmFjZSBUaGVuU3BlYyB7XG5cdHN1YnR5cGU6IG9iamVjdDtcblx0YXJnczogdW5rbm93bltdO1xuXHRuYW1lPzogc3RyaW5nO1xufVxuXG4vLyBDb250ZXh0IG9iamVjdCBwYXNzZWQgdGhyb3VnaCB0aGUgSW5zdGFuY2VDcmVhdG9yIHBpcGVsaW5lXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlQ3JlYXRvckNvbnRleHQge1xuXHR0eXBlOiBUeXBlRGVmO1xuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHRleGlzdGVudEluc3RhbmNlOiBvYmplY3Q7XG5cdGFyZ3M6IHVua25vd25bXTtcblx0TW9kaWZpY2F0aW9uQ29uc3RydWN0b3I6IE1vZGlmaWNhdGlvbkNvbnN0cnVjdG9yO1xuXHRNb2RpZmljYXRvclR5cGU6IE1uZW1vbmljYUNvbnN0cnVjdG9yO1xuXHRJbnN0YW5jZU1vZGlmaWNhdG9yOiBNbmVtb25pY2FDb25zdHJ1Y3Rvcjtcblx0aW5oZXJpdGVkSW5zdGFuY2U6IG9iamVjdCB8IFByb21pc2U8b2JqZWN0Pjtcblx0Y29uZmlnOiBjb25zdHJ1Y3Rvck9wdGlvbnM7XG5cdHByb3RvOiBvYmplY3Q7XG5cdF9fcHJvdG9fcHJvdG9fXz86IG9iamVjdDtcblx0c3RhY2s/OiBzdHJpbmdbXTtcblxuXHRnZXRFeGlzdGVudEFzeW5jU3RhY2soZXhpc3RlbnRJbnN0YW5jZTogb2JqZWN0KTogdW5rbm93bjtcblx0cG9zdFByb2Nlc3NpbmcoY29udGludWF0aW9uT2Y/OiBUeXBlRGVmKTogdm9pZDtcblx0bWFrZUF3YWl0ZXIodHlwZTogVHlwZURlZiwgdGhlbj86IFRoZW5TcGVjKTogUHJvbWlzZTxvYmplY3Q+O1xuXHRhZGRUaGVuKHRoZW46IFRoZW5TcGVjKTogdm9pZDtcblx0aW52b2tlUHJlSG9va3MoKTogdm9pZDtcblx0aW52b2tlUG9zdEhvb2tzKCk6IHsgdHlwZTogU2V0PHVua25vd24+OyBjb2xsZWN0aW9uOiBTZXQ8dW5rbm93bj4gfTtcblx0dGhyb3dNb2RpZmljYXRpb25FcnJvcihlcnJvcjogTW5lbW9uaWNhRXJyb3IpOiB2b2lkO1xufVxuXG4vKipcbiAqIFByb3RvIG1lcmdlIHR5cGUgLSBjb21iaW5lcyBwYXJlbnQgYW5kIGNoaWxkIHR5cGVzIHdpdGhvdXQgcHJvcGVydHkgY29uZmxpY3RzLlxuICpcbiAqIFdoZW4gYSBzdWJ0eXBlIGlzIGRlZmluZWQgZnJvbSBhIHBhcmVudCBpbnN0YW5jZSwgd2Ugd2FudCB0aGUgY2hpbGQgcHJvcGVydGllc1xuICogdG8gdGFrZSBwcmVjZWRlbmNlLiBgRXhjbHVkZTxrZXlvZiBQLCBrZXlvZiBUPmAgcmVtb3ZlcyBvdmVybGFwcGluZyBrZXlzIGZyb20gUCxcbiAqIHNvIGBQaWNrPFAsIC4uLj5gIG9ubHkgYnJpbmdzIGluIHBhcmVudCBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QgY2xhc2ggd2l0aCBjaGlsZC5cbiAqXG4gKiBSZXN1bHQ6IGNoaWxkIFQgZ2V0cyBhbGwgaXRzIG93biBwcm9wcywgcGx1cyBwYXJlbnQncyBub24tb3ZlcmxhcHBpbmcgcHJvcHMuXG4gKi9cbmV4cG9ydCB0eXBlIFByb3RvPFAgZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyBvYmplY3Q+ID0gVCAmIFBpY2s8UCwgRXhjbHVkZTxrZXlvZiBQLCBrZXlvZiBUPj47XG5cblxuLy8gZXhwb3J0IHR5cGUgUHJvdG9GbGF0PFxuLy8gXHRQIGV4dGVuZHMgb2JqZWN0LFxuLy8gXHRUIGV4dGVuZHMgb2JqZWN0LFxuLy8gXHRGIGV4dGVuZHMgUHJvdG88UCwgVD4gPSBQcm90bzxQLCBUPlxuLy8gPiA9IHsgW2tleSBpbiBrZXlvZiBGXTogRltrZXldfSA7XG5cbmV4cG9ydCB0eXBlIFByb3RvRmxhdDxcblx0UCBleHRlbmRzIG9iamVjdCxcblx0VCBleHRlbmRzIG9iamVjdCxcblx0TCBleHRlbmRzIEV4Y2x1ZGU8a2V5b2YgUCwga2V5b2YgVD4gPSBFeGNsdWRlPGtleW9mIFAsIGtleW9mIFQ+LFxuPiA9IHtcbiAgICBba2V5IGluIGtleW9mIFRdOiBUW2tleV07XG59ICYge1xuXHRba2V5IGluIExdOiBQW2tleV07XG59O1xuXG4vLyBNbmVtb25pY2EgaW5zdGFuY2UgbWV0aG9kIGtleXMuIFRoZXNlIGFyZSBmaWx0ZXJlZCBvdXQgb2YgZXh0cmFjdGVkL21lcmdlZFxuLy8gZmllbGQtb25seSB2aWV3cyBiZWNhdXNlIHRoZXkgYmVsb25nIHRvIHRoZSBwcm90b3R5cGUsIG5vdCB0byB0aGUgdXNlcidzXG4vLyBlbnVtZXJhYmxlIGRhdGEgcHJvcGVydGllcy5cbmV4cG9ydCB0eXBlIE1uZW1vbmljYUluc3RhbmNlTWV0aG9kS2V5cyA9XG5cdCdleHRyYWN0JyB8ICdwaWNrJyB8ICdwYXJlbnQnIHwgJ2Nsb25lJyB8ICdmb3JrJyB8ICdleGNlcHRpb24nIHwgJ3NpYmxpbmcnO1xuXG5leHBvcnQgdHlwZSBGbGF0dGVuPEY+ID0geyBba2V5IGluIGtleW9mIEZdOiBGW2tleV0gfVxuXG4vLyBFeHRyYWN0ZWQ8VD46IHRoZSBzaGFwZSByZXR1cm5lZCBieSB1dGlscy5leHRyYWN0KGluc3RhbmNlKS5cbi8vIEl0IGNvbnRhaW5zIHRoZSBlbnVtZXJhYmxlIHN0cmluZy1rZXllZCB1c2VyIHByb3BlcnRpZXMgb2YgdGhlIGluc3RhbmNlLFxuLy8gb21pdHRpbmcgTW5lbW9uaWNhSW5zdGFuY2UgbWV0aG9kcyAoZXh0cmFjdCwgcGljaywgcGFyZW50LCBjbG9uZSwgZm9yayxcbi8vIGV4Y2VwdGlvbiwgc2libGluZykuIE9wdGlvbmFsaXR5IGlzIHByZXNlcnZlZCBmcm9tIHRoZSBzb3VyY2UgdHlwZS5cbi8vIFRoZSBgJiB7fWAgdHJpY2sgZm9yY2VzIFR5cGVTY3JpcHQgdG8gZXhwYW5kIHRoZSBhbGlhcyBpbiBob3ZlciB0b29sdGlwc1xuLy8gc28gaXQgcmVuZGVycyBhcyBhIHBsYWluIG9iamVjdCBsaXRlcmFsIGluc3RlYWQgb2YgXCJFeHRyYWN0ZWQ8ey4uLn0+XCIuXG5leHBvcnQgdHlwZSBFeHRyYWN0ZWQ8VCBleHRlbmRzIG9iamVjdD4gPSB7XG5cdFtLIGluIGtleW9mIFQgYXMgSyBleHRlbmRzIHN0cmluZyA/IChLIGV4dGVuZHMgTW5lbW9uaWNhSW5zdGFuY2VNZXRob2RLZXlzID8gbmV2ZXIgOiBLKSA6IG5ldmVyXTogVFtLXTtcbn0gJiB7fTtcblxuLy8gUGFyc2VkPFQ+OiB0aGUgc2hhcGUgcmV0dXJuZWQgYnkgdXRpbHMucGFyc2UoaW5zdGFuY2UpLlxuLy8gSXQgaXMgYSBvbmUtbGV2ZWwgc25hcHNob3Qgb2YgdGhlIGluc3RhbmNlJ3MgcHJvdG90eXBlIGNoYWluLlxuLy8gYHByb3BzYCBjb250YWlucyB0aGUgaW5zdGFuY2UncyBlbnVtZXJhYmxlIHVzZXIgcHJvcGVydGllcztcbi8vIGBqb2ludGAgY29udGFpbnMgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGNvcGllZCBmcm9tIHRoZSBpbW1lZGlhdGUgcHJvdG90eXBlO1xuLy8gYHBhcmVudGAgaXMgdGhlIG5leHQgbGluayB1cCB0aGUgY2hhaW4gKGN1cnJlbnRseSBub3QgcmVjdXJzaXZlbHkgcGFyc2VkKS5cbmV4cG9ydCB0eXBlIFBhcnNlZDxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRwcm9wczogRXh0cmFjdGVkPFQ+O1xuXHRzZWxmOiBUO1xuXHRwcm90bzogb2JqZWN0O1xuXHRqb2ludDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdHBhcmVudDogb2JqZWN0IHwgdW5kZWZpbmVkO1xufTtcblxuLy8gU2libGluZyB0eXBlIGFjY2Vzc29yXG5leHBvcnQgaW50ZXJmYWNlIFNpYmxpbmdBY2Nlc3NvciB7XG5cdChTaWJsaW5nVHlwZU5hbWU6IHN0cmluZyk6IFR5cGVDbGFzcyB8IHVuZGVmaW5lZDtcblx0W2tleTogc3RyaW5nXTogVHlwZUNsYXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vLyBNbmVtb25pY2EgaW5zdGFuY2UgbWV0aG9kcyBpbnRlcmZhY2UgKG9wdC1pbikuXG4vLyBUaGVzZSBtZXRob2RzIHVzZWQgdG8gYmUgYXV0by1pbmplY3RlZCBvbnRvIGV2ZXJ5IGluc3RhbmNlLiBUaGV5IGFyZSBub3dcbi8vIGF2YWlsYWJsZSBvbmx5IHdoZW4gYSB0eXBlIGV4cGxpY2l0bHkgYWRkcyB0aGVtIHRvIGl0cyBwcm90b3R5cGUuXG4vLyBVc2VycyBjYW4gc3RpbGwgdXNlIHRoaXMgaW50ZXJmYWNlIHRvIHR5cGUgdGhlaXIgb3duIHJvb3QtbGV2ZWwgaGVscGVycy5cbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhSW5zdGFuY2U8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuXHRleHRyYWN0KCk6IEV4dHJhY3RlZDxUPjtcblx0cGljazxLIGV4dGVuZHMga2V5b2YgVD4oLi4ua2V5czogKEsgfCBLW10pW10pOiB7IFtQIGluIEtdOiBUW1BdIH0gJiB7fTtcblx0cGljayguLi5rZXlzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRwYXJlbnQoKTogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRwYXJlbnQ8SyBleHRlbmRzIFBhcmVudFBhdGhPZkluc3RhbmNlPHRoaXM+ICYgc3RyaW5nPihcblx0XHRjb25zdHJ1Y3Rvckxvb2t1cFBhdGg6IEtcblx0KTogSW5zdGFuY2VPZlR5cGVSZWdpc3RyeTxLPiB8IHVuZGVmaW5lZDtcblx0cGFyZW50KGNvbnN0cnVjdG9yTG9va3VwUGF0aDogc3RyaW5nKTogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRyZWFkb25seSBjbG9uZTogdGhpcztcblx0Zm9yayguLi5mb3JrQXJnczogdW5rbm93bltdKTogdGhpcztcblx0ZXhjZXB0aW9uKGVycm9yOiBFcnJvciwgLi4uYXJnczogdW5rbm93bltdKTogRXJyb3I7XG5cdHJlYWRvbmx5IHNpYmxpbmc6IFNpYmxpbmdBY2Nlc3Nvcjtcbn1cblxuLy8gSW5zdGFuY2UgcHJvcGVydGllcyBmb3IgX19zZWxmX18gcmVmZXJlbmNlXG4vLyBUaGlzIG1lcmdlcyBpbnRlcm5hbCBwcm9wcyB3aXRoIHRoZSBpbnN0YW5jZSBtZXRob2RzXG4vLyBJbnRlcm5hbCBpbnN0YW5jZSBwcm9wZXJ0aWVzIChub24tZW51bWVyYWJsZSlcbi8vIFRoZXNlIGFyZSBhbHdheXMgcHJlc2VudCBvbiBpbnN0YW5jZXMgYnV0IGFjY2Vzc2VkIHZpYSBnZXRQcm9wcy9zZXRQcm9wc1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VJbnRlcm5hbFByb3BzID0ge1xuXHRfX3Byb3RvX3Byb3RvX186IG9iamVjdDtcblx0X19hcmdzX186IHVua25vd25bXTtcblx0X19jb2xsZWN0aW9uX186IENvbGxlY3Rpb25EZWY7XG5cdF9fc3VidHlwZXNfXzogTWFwPHN0cmluZywgb2JqZWN0Pjtcblx0X190eXBlX186IFR5cGVEZWY7XG5cdF9fcGFyZW50X186IG9iamVjdDtcblx0X19zdGFja19fPzogc3RyaW5nO1xuXHRfX2NyZWF0b3JfXzogSW5zdGFuY2VDcmVhdG9yQ29udGV4dDtcblx0X190aW1lc3RhbXBfXzogbnVtYmVyO1xufTtcblxuLy8gQ29tYmluZWQgUHJvcHMgdHlwZSBmb3IgaW50ZXJuYWwgdXNlIGluc2lkZSAuL3NyY1xuZXhwb3J0IHR5cGUgUHJvcHMgPSBJbnN0YW5jZUludGVybmFsUHJvcHMgJiB7XG5cdF9fc2VsZl9fOiBJbnN0YW5jZUludGVybmFsUHJvcHM7XG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59O1xuXG4vLyBDb21iaW5lZCBpbnN0YW5jZSB0eXBlOiBwbGFpbiBvYmplY3Qgd2l0aCB0aGUgdXNlcidzIGZpZWxkcyBvbmx5LlxuLy8gSW5zdGFuY2UgbWV0aG9kcyAoZXh0cmFjdCwgcGljaywgZm9yaywgZXRjLikgYXJlIG5vIGxvbmdlciBhdXRvLWluamVjdGVkLlxuLy8gVGhlIGlubGluZSBtYXBwZWQgdHlwZSBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIEZsYXR0ZW4gYWxpYXMgc28gdGhhdCBob3ZlclxuLy8gdG9vbHRpcHMgc2hvdyB0aGUgYWN0dWFsIGZpZWxkIG9iamVjdCBsaXRlcmFsIGZpcnN0LCBub3QgXCJGbGF0dGVuPHsuLi59PlwiLlxuZXhwb3J0IHR5cGUgSW5zdGFuY2VSZXN1bHQ8XG4gIE4gZXh0ZW5kcyBvYmplY3QsXG4+ID0geyBbSyBpbiBrZXlvZiBOXTogTltLXSB9O1xuXG4vLyBEZWZpbml0b3IgaW5zdGFuY2UgLSB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24gcmV0dXJuZWQgYnkgZGVmaW5lXG4vLyBOID0gaW5zdGFuY2UgdHlwZSAocHJvcGVydGllcyBhdmFpbGFibGUgb24gaW5zdGFuY2VzKVxuLy8gUyA9IHN1YnR5cGVzIG1hcFxuZXhwb3J0IGludGVyZmFjZSBJRGVmaW5pdG9ySW5zdGFuY2U8XG5cdE4gZXh0ZW5kcyBvYmplY3QsXG5cdFIgZXh0ZW5kcyBJbnN0YW5jZVJlc3VsdDxOPiA9IEluc3RhbmNlUmVzdWx0PE4+XG4+IHtcblxuXHRUeXBlTmFtZTogc3RyaW5nO1xuXHRwcm90b3R5cGU6IE47XG5cblx0XG5cdC8vIHRoZSBsaW5lIGJlbG93IGRlY2xhcmVzIGEgYG5ldyAuLi5gIGludm9jYXRpb24sXG5cdC8vIHNvIG1ha2VzIGludGVyZmFjZSBjb25zdHJ1Y3RpYmxlXG5cdC8vIG5ldyguLi5hcmdzOiB1bmtub3duW10pOiB7IFtrZXkgaW4ga2V5b2YgUl06IFJba2V5XSB9O1xuXHRuZXcoLi4uYXJnczogdW5rbm93bltdKTogUjtcblxuXHRcblx0Ly8gVE9ETzogbmVlZCBjaGVjayBpZiBsaW5lIGJlbG93IHdvcmtzXG5cdC8vIGFsc28gVFMgaGludGluZyBjaGVjayBhcyB3ZWxsXG5cdC8vIHRoZSBsaW5lIGJlbG93IHNob3VsZCBtYWtlIGlzIGEgQGRlY29yYXRlIGRlY29yYXRvciB3b3JraW5nXG5cdCguLi5hcmdzOiB1bmtub3duW10pOiBJRGVmaW5pdG9ySW5zdGFuY2U8Uj47XG5cblxuXHQvLyBEZWZpbmUgbWV0aG9kIHRoYXQgY29tYmluZXMgcGFyZW50IE4gd2l0aCBuZXcgdHlwZSBUIHVzaW5nIFByb3RvXG5cdGRlZmluZTxcblx0XHRUIGV4dGVuZHMgb2JqZWN0LFxuXG5cdFx0Ly8gdGhpcyB3aWxsIGJlIGluc3RhbmNlIHR5cGUgZm9yIHN1Yi10eXBlICEhIVxuXHRcdC8vIEYgZXh0ZW5kcyBGbGF0dGVuPFByb3RvPE4sIFQ+PlxuXHRcdEYgZXh0ZW5kcyBQcm90bzxOLCBUPlxuXHQ+KFxuXHRcdFR5cGVPclR5cGVOYW1lOiBzdHJpbmcgfCBDYWxsYWJsZUZ1bmN0aW9uLFxuXHRcdGNvbnN0cnVjdEhhbmRsZXJPckNvbmZpZz86IElERUY8VD4gfCBvYmplY3QgfCBib29sZWFuIHwgQ2FsbGFibGVGdW5jdGlvbixcblx0XHRjb25maWdPclVuZGVmaW5lZD86IGNvbnN0cnVjdG9yT3B0aW9ucyB8IENhbGxhYmxlRnVuY3Rpb24gfCBib29sZWFuXG5cdCk6IElEZWZpbml0b3JJbnN0YW5jZTxGPjtcblx0XG5cdGxvb2t1cDogVHlwZUxvb2t1cDtcblx0XG5cdHJlZ2lzdGVySG9vayhob29rVHlwZTogaG9va3NUeXBlcywgY2I6IGhvb2spOiB2b2lkO1xuXHRcblx0XG5cdHN1YnR5cGVzOiBTdWJ0eXBlc01hcDtcblx0XG5cdC8vIEludGVybmFsIHByb3BlcnRpZXMgYWNjZXNzZWQgYnkgdGVzdHNcblx0X190eXBlX18/OiBUeXBlRGVmO1xuXHRjb2xsZWN0aW9uPzogQ29sbGVjdGlvbkRlZjtcblxuXHQvKlxuXHQvLyBBbGxvdyBkeW5hbWljIHByb3BlcnR5IGFjY2VzcyBmb3Igc3VidHlwZXNcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0Ki9cbn1cblxuLy8gVHlwZSBhYnNvcmJlciBmdW5jdGlvbiB0eXBlIC0gdXNlZCBmb3IgZGVmaW5pbmcgc3VidHlwZXNcbi8vIFN1cHBvcnRzIG11bHRpcGxlIGNhbGxpbmcgY29udmVudGlvbnM6XG4vLyAxLiBNb2Rlcm46IGRlZmluZShUeXBlTmFtZSwgY29uc3RydWN0SGFuZGxlciwgY29uZmlnPylcbi8vIDIuIExlZ2FjeTogZGVmaW5lKGNvbnN0cnVjdEhhbmRsZXIsIGNvbmZpZz8pIC0gVHlwZU5hbWUgZnJvbSBjb25zdHJ1Y3RvciBuYW1lXG4vLyAzLiBOZXN0ZWQ6IHBhcmVudFR5cGUuZGVmaW5lKFR5cGVOYW1lLCBjb25zdHJ1Y3RIYW5kbGVyLCBjb25maWc/KVxuZXhwb3J0IGludGVyZmFjZSBUeXBlQWJzb3JiZXIgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0PFQgZXh0ZW5kcyBvYmplY3Q+KFxuXHRcdHRoaXM6IHVua25vd24sXG5cdFx0VHlwZU9yVHlwZU5hbWU6IHN0cmluZyB8IENhbGxhYmxlRnVuY3Rpb24sXG5cdFx0Y29uc3RydWN0SGFuZGxlck9yQ29uZmlnPzogSURFRjxUPiB8IG9iamVjdCB8IGJvb2xlYW4gfCBDYWxsYWJsZUZ1bmN0aW9uLFxuXHRcdGNvbmZpZ09yVW5kZWZpbmVkPzogY29uc3RydWN0b3JPcHRpb25zIHwgQ2FsbGFibGVGdW5jdGlvbiB8IGJvb2xlYW5cblx0KTogSURlZmluaXRvckluc3RhbmNlPFQ+O1xufVxuXG4vLyBUeXBlc0NvbGxlY3Rpb24gaW50ZXJmYWNlIGZvciBjcmVhdGVUeXBlc0NvbGxlY3Rpb25cbi8vIFRoaXMgcmVwcmVzZW50cyB0aGUgYWN0dWFsIHJldHVybiB0eXBlIG9mIGNyZWF0ZVR5cGVzQ29sbGVjdGlvblxuZXhwb3J0IGludGVyZmFjZSBUeXBlc0NvbGxlY3Rpb24gZXh0ZW5kcyBIb29rYWJsZSB7XG5cdGRlZmluZTogVHlwZUFic29yYmVyO1xuXHRsb29rdXA6IFR5cGVMb29rdXA7XG5cdHN1YnR5cGVzOiBTdWJ0eXBlc01hcDtcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gU2hhcmVkIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHN1cHBvcnQgaG9va3MgKFR5cGVEZWYgYW5kIENvbGxlY3Rpb25EZWYpXG5leHBvcnQgaW50ZXJmYWNlIEhvb2thYmxlIHtcblx0aG9va3M6IFJlY29yZDxzdHJpbmcsIFNldDxob29rPj47XG5cdGludm9rZUhvb2soaG9va1R5cGU6IGhvb2tzVHlwZXMsIG9wdHM6IGhvb2tzT3B0cyk6IFNldDx1bmtub3duPjtcblx0cmVnaXN0ZXJIb29rKGhvb2tUeXBlOiBob29rc1R5cGVzLCBjYjogaG9vayk6IHZvaWQ7XG5cdHJlZ2lzdGVyRmxvd0NoZWNrZXIoY2I6IChvcHRzOiBvYmplY3QpID0+IHVua25vd24pOiB2b2lkO1xufVxuXG4vLyBjcmVhdGVUeXBlc0NvbGxlY3Rpb24gZnVuY3Rpb24gdHlwZVxuZXhwb3J0IHR5cGUgQ3JlYXRlVHlwZXNDb2xsZWN0aW9uRnVuY3Rpb24gPSAoY29uZmlnPzogY29uc3RydWN0b3JPcHRpb25zKSA9PiBUeXBlc0NvbGxlY3Rpb247XG5cbi8vIFR5cGUgY2xhc3MgLSBiYXNlIHR5cGUgY29uc3RydWN0b3JcbmV4cG9ydCB0eXBlIFR5cGVDbGFzcyA9IElEZWZpbml0b3JJbnN0YW5jZTxvYmplY3Q+O1xuXG4vLyBNbmVtb25pY2EgY29uc3RydWN0b3Ig4oCUIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiByZXR1cm5lZCBieSBjb25zdHJ1Y3RIYW5kbGVyKClcbi8vIEhhcyBTeW1ib2xDb25zdHJ1Y3Rvck5hbWUgYXR0YWNoZWQgYW5kIGlzIGJvdGggbmV3YWJsZSBhbmQgY2FsbGFibGVcbmV4cG9ydCBpbnRlcmZhY2UgTW5lbW9uaWNhQ29uc3RydWN0b3IgZXh0ZW5kcyBOZXdhYmxlRnVuY3Rpb24ge1xuXHRuZXcgKC4uLmFyZ3M6IHVua25vd25bXSk6IG9iamVjdDtcblx0KHRoaXM6IG9iamVjdCwgLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93bjtcblx0W2tleTogc3ltYm9sXTogdW5rbm93bjtcbn1cblxuLy8gVHlwZSBkZXNjcmlwdG9yIGluc3RhbmNlIOKAlCBpbnRlcm5hbCBzaGFwZSBvZiBUeXBlRGVzY3JpcHRvciBvYmplY3RzXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVEZXNjcmlwdG9yRGVmaW5lIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdChcblx0XHRUeXBlT3JUeXBlTmFtZTogc3RyaW5nIHwgQ2FsbGFibGVGdW5jdGlvbixcblx0XHRjb25zdHJ1Y3RIYW5kbGVyT3JDb25maWc/OiBDYWxsYWJsZUZ1bmN0aW9uIHwgb2JqZWN0LFxuXHRcdGNvbmZpZz86IG9iamVjdFxuXHQpOiBUeXBlQ2xhc3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZURlc2NyaXB0b3JMb29rdXAgZXh0ZW5kcyBDYWxsYWJsZUZ1bmN0aW9uIHtcblx0KFR5cGVOZXN0ZWRQYXRoOiBzdHJpbmcpOiBUeXBlQ2xhc3MgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFR5cGVEZXNjcmlwdG9ySW5zdGFuY2UgPSB7XG5cdGRlZmluZTogVHlwZURlc2NyaXB0b3JEZWZpbmU7XG5cdGxvb2t1cDogVHlwZURlc2NyaXB0b3JMb29rdXA7XG5cdHN1YnR5cGVzOiBNYXA8c3RyaW5nLCBvYmplY3Q+O1xuXHRUeXBlTmFtZTogc3RyaW5nO1xufTtcblxuLy8gQ29uc3RydWN0b3IgdHlwZSBmb3IgZGVjb3JhdGUgZnVuY3Rpb25cbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSBvYmplY3Q+ID0gbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQ7XG5cbi8vIERlY29yYXRlZCBjbGFzcyB0eXBlIC0gaW5jbHVkZXMgY2FsbCBzaWduYXR1cmUgZm9yIGRlY29yYXRvciBwYXR0ZXJuXG5leHBvcnQgdHlwZSBEZWNvcmF0ZWRDbGFzczxUIGV4dGVuZHMgQ29uc3RydWN0b3I8b2JqZWN0Pj4gPVxuXHRUICZcblx0KDxVIGV4dGVuZHMgQ29uc3RydWN0b3I8b2JqZWN0Pj4odGFyZ2V0OiBVKSA9PiBEZWNvcmF0ZWRDbGFzczxVPikgJiB7XG5cdFx0ZGVmaW5lOiBUeXBlQWJzb3JiZXI7XG5cdFx0cmVnaXN0ZXJIb29rKGhvb2tUeXBlOiBob29rc1R5cGVzLCBjYjogaG9vayk6IHZvaWQ7XG5cdFx0bG9va3VwOiBUeXBlTG9va3VwO1xuXHRcdFR5cGVOYW1lOiBzdHJpbmc7XG5cdH07XG5cbi8vIEhlbHBlcjogbWVyZ2UgcGFyZW50IGVudGl0eSAoRSkgYW5kIGNoaWxkIGNvbnN0cnVjdG9yIGluc3RhbmNlIChUKSBpbnRvIGFcbi8vIHNpbmdsZSBmbGF0IG9iamVjdCB0eXBlLCBmaWx0ZXJpbmcgb3V0IE1uZW1vbmljYUluc3RhbmNlIG1ldGhvZCBuYW1lcy5cbi8vIFVzZWQgYnkgYXBwbHkvY2FsbC9iaW5kLlxuZXhwb3J0IHR5cGUgTWVyZ2U8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4gPSB7XG5cdFtLIGluIGtleW9mIFQgfCBrZXlvZiBFIGFzIEsgZXh0ZW5kcyBNbmVtb25pY2FJbnN0YW5jZU1ldGhvZEtleXMgPyBuZXZlciA6IEtdOlxuXHRcdEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IEVbSyAmIGtleW9mIEVdO1xufTtcblxuLy8gQXBwbHkvQ2FsbC9CaW5kIGZ1bmN0aW9uIHR5cGVzXG4vLyBUaGUgcmV0dXJuIHR5cGUgbWVyZ2VzIHRoZSBwYXJlbnQgZW50aXR5IGZpZWxkcyB3aXRoIHRoZSBjaGlsZCBjb25zdHJ1Y3RvclxuLy8gZmllbGRzIChmaWx0ZXJpbmcgb3V0IE1uZW1vbmljYUluc3RhbmNlIG1ldGhvZCBuYW1lcyksIHByb2R1Y2luZyB0aGUgc2FtZVxuLy8gYHsgZmllbGRzIH1gIGhvdmVyIHN0eWxlIGFzIGBuZXcgVHlwZSgpYC5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlGdW5jdGlvbiBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQ8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4oXG5cdFx0ZW50aXR5OiBFLFxuXHRcdENvbnN0cnVjdG9yOiBJREVGPFQ+LFxuXHRcdGFyZ3M/OiB1bmtub3duW11cblx0KTogSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxGdW5jdGlvbiBleHRlbmRzIENhbGxhYmxlRnVuY3Rpb24ge1xuXHQ8RSBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIG9iamVjdD4oXG5cdFx0ZW50aXR5OiBFLFxuXHRcdENvbnN0cnVjdG9yOiBJREVGPFQ+LFxuXHRcdC4uLmFyZ3M6IHVua25vd25bXVxuXHQpOiBJbnN0YW5jZVJlc3VsdDxNZXJnZTxFLCBUPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmluZEZ1bmN0aW9uIGV4dGVuZHMgQ2FsbGFibGVGdW5jdGlvbiB7XG5cdDxFIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgb2JqZWN0Pihcblx0XHRlbnRpdHk6IEUsXG5cdFx0Q29uc3RydWN0b3I6IElERUY8VD5cblx0KTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gSW5zdGFuY2VSZXN1bHQ8TWVyZ2U8RSwgVD4+O1xufVxuXG4vLyBVdGlscyBvYmplY3QgdHlwZVxuZXhwb3J0IGludGVyZmFjZSBVdGlsc0NvbGxlY3Rpb24ge1xuXHRleHRyYWN0PFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBUKTogRXh0cmFjdGVkPFQ+O1xuXHRwaWNrPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPihpbnN0YW5jZTogVCwgLi4uYXJnczogKEsgfCBLW10pW10pOiB7IFtQIGluIEtdOiBUW1BdIH0gJiB7fTtcblx0cGljazxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCwgLi4uYXJnczogKHN0cmluZyB8IHN0cmluZ1tdKVtdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdGNsb25lPFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBUKTogVDtcblx0Zm9yazxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCk6ICh0aGlzOiBvYmplY3QsIC4uLmZvcmtBcmdzOiB1bmtub3duW10pID0+IFQ7XG5cdHNpYmxpbmcoaW5zdGFuY2U6IG9iamVjdCk6IFNpYmxpbmdBY2Nlc3Nvcjtcblx0Y29sbGVjdENvbnN0cnVjdG9yczogKGluc3RhbmNlOiBvYmplY3QsIGZsYXQ/OiBib29sZWFuKSA9PiAoQ2FsbGFibGVGdW5jdGlvbiB8IHN0cmluZylbXTtcblx0bWVyZ2U8QSBleHRlbmRzIG9iamVjdCwgQiBleHRlbmRzIG9iamVjdD4oXG5cdFx0YTogQSxcblx0XHRiOiBCLFxuXHRcdC4uLmFyZ3M6IHVua25vd25bXVxuXHQpOiBJbnN0YW5jZVJlc3VsdDxNZXJnZTxCLCBBPj47XG5cdHBhcnNlPFQgZXh0ZW5kcyBvYmplY3Q+KHNlbGY6IFQpOiBQYXJzZWQ8VD47XG5cdHBhcmVudDxUIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVCk6IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0cGFyZW50PFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBQYXJlbnRQYXRoT2ZJbnN0YW5jZTxUPiAmIHN0cmluZz4oXG5cdFx0aW5zdGFuY2U6IFQsXG5cdFx0cGF0aDogS1xuXHQpOiBJbnN0YW5jZU9mVHlwZVJlZ2lzdHJ5PEs+IHwgdW5kZWZpbmVkO1xuXHRwYXJlbnQ8VCBleHRlbmRzIG9iamVjdD4oaW5zdGFuY2U6IFQsIHBhdGg6IHN0cmluZyk6IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0dG9KU09OPFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBUKTogc3RyaW5nO1xuXHRba2V5OiBzdHJpbmddOiBDYWxsYWJsZUZ1bmN0aW9uO1xufVxuXG4vLyBNYWluIG1uZW1vbmljYSBtb2R1bGUgaW50ZXJmYWNlIC0gcmVwcmVzZW50cyB0aGUgZXhwb3J0ZWQgbW9kdWxlIG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSBNbmVtb25pY2FNb2R1bGUge1xuXHQvLyBDb3JlIGZ1bmN0aW9uc1xuXHRkZWZpbmU6IFR5cGVBYnNvcmJlcjtcblx0bG9va3VwOiB7XG5cdFx0KFR5cGVOZXN0ZWRQYXRoOiBzdHJpbmcpOiBUeXBlQ2xhc3MgfCB1bmRlZmluZWQ7XG5cdFx0PGNvbnN0IEsgZXh0ZW5kcyBrZXlvZiBUeXBlUmVnaXN0cnk+KFR5cGVOZXN0ZWRQYXRoOiBLKTogVHlwZVJlZ2lzdHJ5W0tdO1xuXHR9O1xuXHRhcHBseTogQXBwbHlGdW5jdGlvbjtcblx0Y2FsbDogQ2FsbEZ1bmN0aW9uO1xuXHRiaW5kOiBCaW5kRnVuY3Rpb247XG5cdGRlY29yYXRlOiA8VCBleHRlbmRzIENvbnN0cnVjdG9yPG9iamVjdD4gfCBjb25zdHJ1Y3Rvck9wdGlvbnMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuXHRcdHRhcmdldD86IFQsXG5cdFx0Y29uZmlnPzogY29uc3RydWN0b3JPcHRpb25zXG5cdCkgPT4gPFUgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxvYmplY3Q+Pihjc3RyOiBVKSA9PiBEZWNvcmF0ZWRDbGFzczxVPjtcblx0cmVnaXN0ZXJIb29rOiA8VCBleHRlbmRzIG9iamVjdD4oQ29uc3RydWN0b3I6IElERUY8VD4sIGhvb2tUeXBlOiBob29rc1R5cGVzLCBjYjogaG9vaykgPT4gdm9pZDtcblxuXHQvLyBEZXNjcmlwdG9yc1xuXHRkZWZhdWx0VHlwZXM6IFR5cGVzQ29sbGVjdGlvbjtcblxuXHQvLyBFcnJvcnNcblx0QkFTRV9NTkVNT05JQ0FfRVJST1I6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX1RZUEVfREVGSU5JVElPTjogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0V1JPTkdfSU5TVEFOQ0VfSU5WT0NBVElPTjogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0V1JPTkdfTU9ESUZJQ0FUSU9OX1BBVFRFUk46IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdEFMUkVBRFlfREVDTEFSRUQ6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX0FSR1VNRU5UU19VU0VEOiBNbmVtb25pY2FFcnJvckNvbnN0cnVjdG9yO1xuXHRXUk9OR19IT09LX1RZUEU6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdE1JU1NJTkdfQ0FMTEJBQ0tfQVJHVU1FTlQ6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdC8vIEZMT1dfQ0hFQ0tFUl9SRURFRklOSVRJT046IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdE1JU1NJTkdfSE9PS19DQUxMQkFDSzogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0VFlQRU5BTUVfTVVTVF9CRV9BX1NUUklORzogTW5lbW9uaWNhRXJyb3JDb25zdHJ1Y3Rvcjtcblx0SEFORExFUl9NVVNUX0JFX0FfRlVOQ1RJT046IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdE9QVElPTlNfRVJST1I6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cdFdST05HX1NUQUNLX0NMRUFORVI6IE1uZW1vbmljYUVycm9yQ29uc3RydWN0b3I7XG5cblx0Ly8gQ29uc3RhbnRzXG5cdE1ORU1PTklDQTogc3RyaW5nO1xuXHRNTkVNT1NZTkU6IHN0cmluZztcblx0U3ltYm9sUGFyZW50VHlwZTogc3ltYm9sO1xuXHRTeW1ib2xDb25zdHJ1Y3Rvck5hbWU6IHN5bWJvbDtcblx0U3ltYm9sRGVmYXVsdFR5cGVzQ29sbGVjdGlvbjogc3ltYm9sO1xuXHRTeW1ib2xDb25maWc6IHN5bWJvbDtcblx0VFlQRV9USVRMRV9QUkVGSVg6IHN0cmluZztcblx0RXJyb3JNZXNzYWdlczogRXJyb3JNZXNzYWdlcztcblxuXHQvLyBVdGlsc1xuXHR1dGlsczogVXRpbHNDb2xsZWN0aW9uO1xuXHRnZXRQcm9wczogKGluc3RhbmNlOiBvYmplY3QpID0+IFByb3BzVHlwZSB8IHVuZGVmaW5lZDtcblx0c2V0UHJvcHM6IChpbnN0YW5jZTogb2JqZWN0LCB2YWx1ZXM6IG9iamVjdCkgPT4gc3RyaW5nW10gfCBmYWxzZTtcblx0ZmluZFN1YlR5cGVGcm9tUGFyZW50OiAoaW5zdGFuY2U6IG9iamVjdCB8IHVuZGVmaW5lZCwgc3ViVHlwZTogc3RyaW5nKSA9PiBvYmplY3QgfCBudWxsO1xuXHRpc0NsYXNzOiAoZm46IENhbGxhYmxlRnVuY3Rpb24pID0+IGJvb2xlYW47XG5cblx0Ly8gY3JlYXRlVHlwZXNDb2xsZWN0aW9uXG5cdGNyZWF0ZVR5cGVzQ29sbGVjdGlvbjogQ3JlYXRlVHlwZXNDb2xsZWN0aW9uRnVuY3Rpb247XG5cblx0Ly8gQWxsb3cgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG4iXX0=
@@ -12,7 +12,7 @@ export interface TypeRegistry {
12
12
  export function lookup<const K extends keyof TypeRegistry>(
13
13
  this: unknown,
14
14
  TypeNestedPath: K
15
- ): TypeRegistry[K] | undefined;
15
+ ): TypeRegistry[K];
16
16
  export function lookup(
17
17
  this: unknown,
18
18
  TypeNestedPath: string
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mnemonica",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "AI-agent ready instance inheritance system for JavaScript/TypeScript via prototype chains",
5
5
  "type": "commonjs",
6
6
  "main": "./build/index.js",
@@ -27,7 +27,6 @@
27
27
  "CONTRIBUTING.md",
28
28
  ".ai",
29
29
  "docs",
30
- "examples",
31
30
  "src",
32
31
  "module",
33
32
  "build"
@@ -98,7 +97,7 @@
98
97
  "devDependencies": {
99
98
  "@eslint/eslintrc": "^3.3.5",
100
99
  "@eslint/js": "^9.21.0",
101
- "@mnemonica/tactica": "^0.1.2",
100
+ "@mnemonica/tactica": "^0.1.3",
102
101
  "@types/jest": "^29.5.14",
103
102
  "@types/node": "^22.19.21",
104
103
  "@typescript-eslint/eslint-plugin": "^8.61.1",
@@ -119,7 +118,7 @@
119
118
  "nyc": "^17.1.0",
120
119
  "oxlint": "^0.16.12",
121
120
  "ts-jest": "^29.4.11",
122
- "typeomatica": "^0.3.57",
121
+ "typeomatica": "^0.3.59",
123
122
  "typescript": "^6.0.3"
124
123
  },
125
124
  "engines": {
package/src/index.ts CHANGED
@@ -79,14 +79,14 @@ function checkThis(pointer: typeof mnemonica | typeof exports | unknown): boolea
79
79
  }
80
80
 
81
81
 
82
+
82
83
  // Define function using TypeAbsorber interface with proper type casting
83
- export const define = function <
84
+ export function define <
84
85
  T extends object,
85
86
  P extends object = object,
86
87
  N extends Proto<P, T> = Proto<P, T>,
87
-
88
88
  // here IDefinitorInstance is a CONSTRUCTOR !!!
89
- R extends IDefinitorInstance<N> = IDefinitorInstance<N>
89
+ R extends IDefinitorInstance<N> = IDefinitorInstance<N>,
90
90
  >(
91
91
  this: unknown,
92
92
  TypeName?: string | CallableFunction | NewableFunction,
@@ -103,12 +103,12 @@ export const define = function <
103
103
  config
104
104
  ) as unknown as R;
105
105
  return defineResult;
106
- } as TypeAbsorber;
106
+ }
107
107
 
108
108
  export function lookup<const K extends keyof TypeRegistry>(
109
109
  this: unknown,
110
110
  TypeNestedPath: K
111
- ): TypeRegistry[K] | undefined;
111
+ ): TypeRegistry[K];
112
112
  export function lookup(this: unknown, TypeNestedPath: string): TypeClass | undefined;
113
113
  export function lookup(
114
114
  this: unknown,
@@ -601,7 +601,7 @@ export interface MnemonicaModule {
601
601
  define: TypeAbsorber;
602
602
  lookup: {
603
603
  (TypeNestedPath: string): TypeClass | undefined;
604
- <const K extends keyof TypeRegistry>(TypeNestedPath: K): TypeRegistry[K] | undefined;
604
+ <const K extends keyof TypeRegistry>(TypeNestedPath: K): TypeRegistry[K];
605
605
  };
606
606
  apply: ApplyFunction;
607
607
  call: CallFunction;
@@ -1,12 +0,0 @@
1
- 'use strict';
2
-
3
- const sss = async function () {
4
- this.m = 1;
5
- };
6
-
7
- console.log(Object.hasOwnProperty.call(sss, 'prototype'));
8
- try {
9
- new sss;
10
- } catch (error) {
11
- console.error(error);
12
- }
@@ -1,23 +0,0 @@
1
- const name = 'ClassName';
2
-
3
- const pointer = class {
4
- constructor () {
5
- this.name = this.constructor.name;
6
- }
7
- };
8
-
9
- console.log( ( new pointer ).name );
10
-
11
-
12
- const reNamer = {};
13
-
14
- reNamer[ name ] = pointer;
15
- Object.defineProperty( reNamer[ name ].prototype.constructor, 'name', {
16
- get () {
17
- return name;
18
- }
19
- } );
20
-
21
- console.log( ( new reNamer[ name ] ).name );
22
-
23
- console.log( ( new pointer ).name );
@@ -1,40 +0,0 @@
1
- # Examples
2
-
3
- Standalone scripts that demonstrate edge cases and document JavaScript /
4
- Node.js behaviors that mnemonica has to work around. They are runnable
5
- from the project root after `npm run build`:
6
-
7
- ```bash
8
- npm run example:async # AsyncNewTest.js
9
- npm run example:rename # ClassReName.js
10
- npm run example:v8bug # v8bug.js
11
- ```
12
-
13
- ## AsyncNewTest.js
14
-
15
- Minimal demonstration that an `async function` does **not** have a
16
- `prototype` property and therefore cannot be invoked with `new`. Mnemonica
17
- must detect this case and route async constructors through a different
18
- path. Useful when reasoning about why `define(name, async fn)` needs
19
- special handling.
20
-
21
- ## ClassReName.js
22
-
23
- Shows how `Object.defineProperty(Ctor.prototype.constructor, 'name', …)`
24
- gives a class a runtime-renamed `constructor.name`. This is the technique
25
- mnemonica uses internally to make every defined type's instance report
26
- its declared `TypeName`, instead of the literal source-level identifier.
27
- The "v8 bug" referenced in `v8bug.js` is the reason this technique
28
- matters.
29
-
30
- ## v8bug.js
31
-
32
- Documents a Node.js 22 regression in how `Object.prototype.hasOwnProperty`
33
- treats the `stack` property of objects whose prototype chain includes an
34
- `Error`. On Node 20 it returns `true` after assignment; on Node 22+ V8
35
- optimizes the assignment away unless `Object.defineProperty` is used.
36
- Mnemonica's stack-cleaning logic must use the getter pattern shown at the
37
- bottom of the file for cross-version compatibility.
38
-
39
- These are regression notes, not tutorials. For user-facing examples and
40
- the public API, start with [`README.md`](../README.md).
package/examples/v8bug.js DELETED
@@ -1,64 +0,0 @@
1
- 'use strict';
2
-
3
-
4
- // though Error.prototype.stack is non standard
5
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/stack
6
-
7
- const myErrorObject = new Error('my error');
8
- myErrorObject.prop = 123;
9
- const hop = (o, p) => Object.prototype.hasOwnProperty.call(o, p);
10
-
11
- // nodejs v20 & v22 it works properly
12
- console.log(hop(myErrorObject, 'stack'));
13
- // and for Firefox this property above just does not exists at all
14
- // hop(Object.getPrototypeOf(myErrorObject), 'stack');
15
-
16
-
17
- const myIntermediateObject = {};
18
-
19
- Object.setPrototypeOf(myIntermediateObject, myErrorObject);
20
-
21
- console.log(myIntermediateObject instanceof Error);
22
-
23
- myIntermediateObject.stack = myErrorObject.stack;
24
- // it doesn't matter which value you assign there,
25
- // for example uncomment the next line
26
- // myIntermediateObject.stack = 'myErrorObject.stack';
27
- myIntermediateObject.prop = 123;
28
-
29
- // this works properly for node.js v20, but not for v22
30
- console.log(':', hop(myIntermediateObject, 'stack'));
31
- console.log(':', hop(myIntermediateObject, 'prop'));
32
-
33
- const myCorrectedObject = {};
34
- Object.setPrototypeOf(myCorrectedObject, myErrorObject);
35
- console.log(myCorrectedObject instanceof Error);
36
-
37
- Object.defineProperty(myCorrectedObject, 'stack', {
38
- get () {
39
- return myErrorObject.stack;
40
- }
41
- });
42
-
43
- // nodejs v20 & v22 it works properly
44
- console.log(hop(myCorrectedObject, 'stack'));
45
-
46
-
47
-
48
- // so for objects with Error in prototoype chain
49
- // it optimizes .stack property
50
-
51
- // general behaviour works correctly for both
52
- const base = {
53
- stack : 'str',
54
- prop : 123
55
- };
56
-
57
- const sup = {};
58
-
59
- Object.setPrototypeOf(sup, base);
60
-
61
- sup.stack = 'str';
62
- sup.prop = 123;
63
- console.log(hop(sup, 'stack'));
64
- console.log(hop(sup, 'prop'));