Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

json2jsii

Package Overview
Dependencies
Maintainers
1
Versions
879
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

json2jsii - npm Package Compare versions

Comparing version 0.1.103 to 0.1.104

7

CHANGELOG.md

@@ -5,2 +5,9 @@ # Changelog

### 0.1.104 (2020-11-16)
### Features
* type aliases ([#183](https://github.com/aws/json2jsii/issues/183)) ([d39695d](https://github.com/aws/json2jsii/commit/d39695dcdef3a6cee0723b28d0d85e1868a56200)), closes [awslabs/cdk8s#370](https://github.com/awslabs/cdk8s/issues/370)
### 0.1.103 (2020-11-16)

@@ -7,0 +14,0 @@

53

lib/type-generator.d.ts

@@ -37,14 +37,45 @@ import { JSONSchema4 } from 'json-schema';

/**
* Emit a type based on a JSON schema.
* Adds a JSON schema definition for a type name. This method does not emit the type
* but rather just registers the definition that will get resolved if this type is `$ref`ed.
*
* @param typeName The name of the type.
* @param def The JSON schema definition for this type
*/
addDefinition(typeName: string, def: JSONSchema4): void;
/**
* Overrides the definition of `fromTypeName` such that any references to it
* will be resolved as `toTypeName`. Bear in mind that the type name specified
* in `to` must either be defined as a definition (`addDefinition()`) _or_
* emitted as a custom type (`emitCustomType()`).
*/
addAlias(from: string, to: string): void;
/**
* Emit a type based on a JSON schema. If `def` is not specified, the
* definition of the type will be looked up in the `definitions` provided
* during initialization or via `addDefinition()`.
*
* @param typeName The name of th type
* @param def JSON schema
* @param def JSON schema. If not specified, the schema is looked up from
* `definitions` based on the type name
* @param structFqn FQN for the type (defaults to `typeName`)
* @returns The resolved type (not always the same as `typeName`)
*/
addType(typeName: string, def: JSONSchema4, structFqn?: string): string;
emitType(typeName: string, def?: JSONSchema4, structFqn?: string): string;
/**
* Emits code once to the output file.
* @param uniqueid A unique identifier for the code snippet (e.g. the name of the type)
* @param codeEmitter A function that will be called to emit the code.
* Registers a custom type and emits it. This will override any existing
* definitions for this type name.
*
* @param typeName The name of the type emitted by this handler.
* @param emitter A function that will be called to emit the code.
*/
addCode(uniqueid: string, codeEmitter: (code: Code) => void): void;
emitCustomType(typeName: string, emitter: (code: Code) => void): void;
/**
* @deprecated use `emitCustomType()`
*/
addCode(typeName: string, codeEmitter: (code: Code) => void): void;
/**
* Renders all emitted types to a string.
*
* Use `renderToCode()` in order to render output to an existing `Code` object.
*/
render(): string;

@@ -56,4 +87,12 @@ /**

*/
renderToCode(code: Code): void;
/**
* @deprecated use `renderToCode()`
*/
emitCode(code: Code): void;
/**
* @deprecated use `emitType()`
*/
addType(typeName: string, def?: JSONSchema4, structFqn?: string): string;
/**
* @returns true if this definition can be represented as a union or false if it cannot

@@ -60,0 +99,0 @@ */

@@ -23,3 +23,6 @@ "use strict";

this.exclude = (_a = options.exclude) !== null && _a !== void 0 ? _a : [];
this.definitions = (_b = options.definitions) !== null && _b !== void 0 ? _b : {};
this.definitions = {};
for (const [typeName, def] of Object.entries((_b = options.definitions) !== null && _b !== void 0 ? _b : {})) {
this.addDefinition(typeName, def);
}
}

@@ -49,8 +52,38 @@ /**

/**
* Emit a type based on a JSON schema.
* Adds a JSON schema definition for a type name. This method does not emit the type
* but rather just registers the definition that will get resolved if this type is `$ref`ed.
*
* @param typeName The name of the type.
* @param def The JSON schema definition for this type
*/
addDefinition(typeName, def) {
this.definitions[typeName] = def;
}
/**
* Overrides the definition of `fromTypeName` such that any references to it
* will be resolved as `toTypeName`. Bear in mind that the type name specified
* in `to` must either be defined as a definition (`addDefinition()`) _or_
* emitted as a custom type (`emitCustomType()`).
*/
addAlias(from, to) {
this.addDefinition(from, { $ref: `#/definitions/${to}` });
}
/**
* Emit a type based on a JSON schema. If `def` is not specified, the
* definition of the type will be looked up in the `definitions` provided
* during initialization or via `addDefinition()`.
*
* @param typeName The name of th type
* @param def JSON schema
* @param def JSON schema. If not specified, the schema is looked up from
* `definitions` based on the type name
* @param structFqn FQN for the type (defaults to `typeName`)
* @returns The resolved type (not always the same as `typeName`)
*/
addType(typeName, def, structFqn = typeName) {
emitType(typeName, def, structFqn = typeName) {
if (!def) {
def = this.definitions[typeName];
if (!def) {
throw new Error(`unable to find schema definition for ${typeName}`);
}
}
// callers expect that emit a type named `typeName` so we can't change it here

@@ -110,15 +143,28 @@ // but at least we can verify it's correct.

/**
* Emits code once to the output file.
* @param uniqueid A unique identifier for the code snippet (e.g. the name of the type)
* @param codeEmitter A function that will be called to emit the code.
* Registers a custom type and emits it. This will override any existing
* definitions for this type name.
*
* @param typeName The name of the type emitted by this handler.
* @param emitter A function that will be called to emit the code.
*/
addCode(uniqueid, codeEmitter) {
if (this.emittedTypes.has(uniqueid)) {
emitCustomType(typeName, emitter) {
if (this.emittedTypes.has(typeName)) {
return;
}
this.typesToEmit[uniqueid] = codeEmitter;
this.typesToEmit[typeName] = emitter;
}
/**
* @deprecated use `emitCustomType()`
*/
addCode(typeName, codeEmitter) {
return this.emitCustomType(typeName, codeEmitter);
}
/**
* Renders all emitted types to a string.
*
* Use `renderToCode()` in order to render output to an existing `Code` object.
*/
render() {
const code = new code_1.Code();
this.emitCode(code);
this.renderToCode(code);
return code.render();

@@ -131,3 +177,3 @@ }

*/
emitCode(code) {
renderToCode(code) {
while (Object.keys(this.typesToEmit).length) {

@@ -143,2 +189,14 @@ const name = Object.keys(this.typesToEmit)[0];

/**
* @deprecated use `renderToCode()`
*/
emitCode(code) {
return this.renderToCode(code);
}
/**
* @deprecated use `emitType()`
*/
addType(typeName, def, structFqn = typeName) {
return this.emitType(typeName, def, structFqn);
}
/**
* @returns true if this definition can be represented as a union or false if it cannot

@@ -250,3 +308,3 @@ */

const subtype = TypeGenerator.normalizeTypeName(propertyFqn.split('.').map(x => pascalCase(x)).join(''));
return this.addType(subtype, def, subtype);
return this.emitType(subtype, def, subtype);
}

@@ -263,4 +321,8 @@ typeForRef(def) {

const typeName = TypeGenerator.normalizeTypeName(comps[comps.length - 1]);
// if we already emitted a type with this type name, just return it
if (this.emittedTypes.has(typeName)) {
return typeName;
}
const schema = this.resolveReference(def);
return this.addType(typeName, schema, def.$ref);
return this.emitType(typeName, schema, def.$ref);
}

@@ -305,2 +367,2 @@ typeForArray(propertyFqn, def) {

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZS1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQXVDO0FBRXZDLDJDQUF1QztBQUN2QyxpQ0FBOEI7QUFHOUIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRSxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDO0FBZ0I1Qzs7R0FFRztBQUNILE1BQWEsYUFBYTtJQStCeEI7Ozs7T0FJRztJQUNILFlBQVksVUFBZ0MsRUFBRzs7UUFWOUIsZ0JBQVcsR0FBNkMsRUFBRyxDQUFDO1FBQzVELGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQVVoRCxJQUFJLENBQUMsT0FBTyxTQUFHLE9BQU8sQ0FBQyxPQUFPLG1DQUFJLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVyxTQUFHLE9BQU8sQ0FBQyxXQUFXLG1DQUFJLEVBQUcsQ0FBQztJQUNoRCxDQUFDO0lBckNEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFnQjtRQUM5QyxpRkFBaUY7UUFDakYsTUFBTSxFQUFFLEdBQUcsdUJBQXVCLENBQUM7UUFDbkMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxDQUFDO1FBQ04sR0FBRztZQUNELENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFO2dCQUNMLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztnQkFDNUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0RBQXNEO2dCQUN4RSxN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QVEsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFTyxVQUFVLENBQUMsR0FBVztRQUM1QixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNoQixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRjtBQS9WRCxzQ0ErVkM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLElBQVM7SUFDekMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsQ0FBUztJQUMzQixPQUFPLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2FtZWxDYXNlIGZyb20gJ2NhbWVsY2FzZSc7XG5pbXBvcnQgeyBKU09OU2NoZW1hNCB9IGZyb20gJ2pzb24tc2NoZW1hJztcbmltcG9ydCB7IHNuYWtlQ2FzZSB9IGZyb20gJ3NuYWtlLWNhc2UnO1xuaW1wb3J0IHsgQ29kZSB9IGZyb20gJy4vY29kZSc7XG5cblxuY29uc3QgUFJJTUlUSVZFX1RZUEVTID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2ludGVnZXInLCAnYm9vbGVhbiddO1xuY29uc3QgREVGSU5JVElPTlNfUFJFRklYID0gJyMvZGVmaW5pdGlvbnMvJztcblxuZXhwb3J0IGludGVyZmFjZSBUeXBlR2VuZXJhdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQYXR0ZXJucyBvZiB0eXBlIEZRTnMgdG8gZXhjbHVkZS5cbiAgICogQGRlZmF1bHQgLSBpbmNsdWRlIGFsbCB0eXBlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTY2hlbWEgZGVmaW5pdGlvbnMgZm9yIHJlc29sdmluZyAkcmVmc1xuICAgKiBAZGVmYXVsdCAtICRyZWZzIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAqL1xuICByZWFkb25seSBkZWZpbml0aW9ucz86IHsgW2RlZjogc3RyaW5nXTogSlNPTlNjaGVtYTQgfTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgdHlwZXNjcmlwdCB0eXBlcyBmcm9tIEpTT04gc2NoZW1hcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVHZW5lcmF0b3Ige1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGFsbC1jYXBzIGFjcm9ueW1zIChlLmcuIFwiVlBDXCIsIFwiRm9vQkFSWm9vRklHb29cIikgdG8gcGFzY2FsIGNhc2VcbiAgICogKGUuZy4gXCJWcGNcIiwgXCJGb29CYXJab29GaUdvb1wiKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplVHlwZU5hbWUodHlwZU5hbWU6IHN0cmluZykge1xuICAgIC8vIHN0YXJ0IHdpdGggdGhlIGZ1bGwgc3RyaW5nIGFuZCB0aGVuIHVzZSB0aGUgcmVnZXggdG8gbWF0Y2ggYWxsLWNhcHMgc2VxdWVuY2VzLlxuICAgIGNvbnN0IHJlID0gLyhbQS1aXSspKD86W15hLXpdfCQpL2c7XG4gICAgbGV0IHJlc3VsdCA9IHR5cGVOYW1lO1xuICAgIGxldCBtO1xuICAgIGRvIHtcbiAgICAgIG0gPSByZS5leGVjKHR5cGVOYW1lKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IHJlc3VsdC5zbGljZSgwLCBtLmluZGV4KTsgLy8gYWxsIHRoZSB0ZXh0IGJlZm9yZSB0aGUgc2VxdWVuY2VcbiAgICAgICAgY29uc3QgY2FwID0gbVsxXTsgLy8gZ3JvdXAgIzEgbWF0Y2hlcyB0aGUgYWxsLWNhcHMgc2VxdWVuY2Ugd2UgYXJlIGFmdGVyXG4gICAgICAgIGNvbnN0IHBhc2NhbCA9IGNhcFswXSArIGNhcC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpOyAvLyBjb252ZXJ0IHRvIHBhc2NhbCBjYXNlIGJ5IGxvd2VyY2FzaW5nIGFsbCBidXQgdGhlIGZpcnN0IGNoYXJcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSByZXN1bHQuc2xpY2UobS5pbmRleCArIHBhc2NhbC5sZW5ndGgpOyAvLyBhbGwgdGhlIHRleHQgYWZ0ZXIgdGhlIHNlcXVlbmNlXG4gICAgICAgIHJlc3VsdCA9IGJlZm9yZSArIHBhc2NhbCArIGFmdGVyOyAvLyBjb25jYXRcbiAgICAgIH1cbiAgICB9IHdoaWxlIChtKTtcblxuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9eLi8sIHJlc3VsdFswXS50b1VwcGVyQ2FzZSgpKTsgLy8gZW5zdXJlIGZpcnN0IGxldHRlciBpcyBjYXBpdGFsaXplZFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzVG9FbWl0OiB7IFtuYW1lOiBzdHJpbmddOiAoY29kZTogQ29kZSkgPT4gdm9pZCB9ID0geyB9O1xuICBwcml2YXRlIHJlYWRvbmx5IGVtaXR0ZWRUeXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGU6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmluaXRpb25zOiB7IFtkZWY6IHN0cmluZ106IEpTT05TY2hlbWE0IH07XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBzY2hlbWEgU2NoZW1hIGRlZmluaXRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUeXBlR2VuZXJhdG9yT3B0aW9ucyA9IHsgfSkge1xuICAgIHRoaXMuZXhjbHVkZSA9IG9wdGlvbnMuZXhjbHVkZSA/PyBbXTtcbiAgICB0aGlzLmRlZmluaXRpb25zID0gb3B0aW9ucy5kZWZpbml0aW9ucyA/PyB7IH07XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBhIHR5cGUgYmFzZWQgb24gYSBKU09OIHNjaGVtYS5cbiAgICogQHBhcmFtIHR5cGVOYW1lIFRoZSBuYW1lIG9mIHRoIHR5cGVcbiAgICogQHBhcmFtIGRlZiBKU09OIHNjaGVtYVxuICAgKiBAcGFyYW0gc3RydWN0RnFuIEZRTiBmb3IgdGhlIHR5cGUgKGRlZmF1bHRzIHRvIGB0eXBlTmFtZWApXG4gICAqL1xuICBwdWJsaWMgYWRkVHlwZSh0eXBlTmFtZTogc3RyaW5nLCBkZWY6IEpTT05TY2hlbWE0LCBzdHJ1Y3RGcW46IHN0cmluZyA9IHR5cGVOYW1lKTogc3RyaW5nIHtcbiAgICAvLyBjYWxsZXJzIGV4cGVjdCB0aGF0IGVtaXQgYSB0eXBlIG5hbWVkIGB0eXBlTmFtZWAgc28gd2UgY2FuJ3QgY2hhbmdlIGl0IGhlcmVcbiAgICAvLyBidXQgYXQgbGVhc3Qgd2UgY2FuIHZlcmlmeSBpdCdzIGNvcnJlY3QuXG4gICAgaWYgKFR5cGVHZW5lcmF0b3Iubm9ybWFsaXplVHlwZU5hbWUodHlwZU5hbWUpICE9PSB0eXBlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3R5cGVOYW1lfSBtdXN0IGJlIG5vcm1hbGl6ZWQgYmVmb3JlIGNhbGxpbmcgZW1pdFR5cGVgKTtcbiAgICB9XG5cbiAgICBpZiAoc3RydWN0RnFuLnN0YXJ0c1dpdGgoREVGSU5JVElPTlNfUFJFRklYKSkge1xuICAgICAgc3RydWN0RnFuID0gc3RydWN0RnFuLnN1YnN0cmluZyhERUZJTklUSU9OU19QUkVGSVgubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0V4Y2x1ZGVkKHN0cnVjdEZxbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSAke3N0cnVjdEZxbn0gY2Fubm90IGJlIGFkZGVkIHNpbmNlIGl0IG1hdGNoZXMgb25lIG9mIHRoZSBleGNsdXNpb24gcGF0dGVybnNgKTtcbiAgICB9XG5cbiAgICBpZiAoZGVmLiRyZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGVGb3JSZWYoZGVmKTtcbiAgICB9XG5cbiAgICAvLyB1bmlvbnMgKHVubGVzcyB0aGlzIGlzIGEgc3RydWN0LCBhbmQgdGhlbiB3ZSBqdXN0IGlnbm9yZSB0aGUgY29uc3RyYWludHMpXG4gICAgaWYgKGRlZi5vbmVPZiB8fCBkZWYuYW55T2YpIHtcbiAgICAgIGlmICh0aGlzLmVtaXRVbmlvbih0eXBlTmFtZSwgZGVmLCBzdHJ1Y3RGcW4pKSB7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gY2Fycnkgb24sIHdlIGNhbid0IHJlcHJlc2VudCB0aGlzIHNjaGVtYSBhcyBhIHVuaW9uICh5ZXQ/KVxuICAgIH1cblxuICAgIGlmIChkZWYudHlwZSA9PT0gJ3N0cmluZycgJiYgZGVmLmZvcm1hdCA9PT0gJ2RhdGUtdGltZScpIHtcbiAgICAgIHJldHVybiAnRGF0ZSc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChkZWYudHlwZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6IHJldHVybiAnYm9vbGVhbic7XG4gICAgICBjYXNlICdhcnJheSc6IHJldHVybiBgJHt0aGlzLnR5cGVGb3JBcnJheSh0eXBlTmFtZSwgZGVmKX1bXWA7XG4gICAgICBjYXNlICdhbnknOiByZXR1cm4gJ2FueSc7XG4gICAgICBjYXNlICdudWxsJzogcmV0dXJuICdhbnknO1xuICAgIH1cblxuICAgIGlmIChkZWYudHlwZSA9PT0gJ251bWJlcicgfHwgZGVmLnR5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgIH1cblxuICAgIGlmIChkZWYudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChkZWYuZm9ybWF0ID09PSAnZGF0ZS10aW1lJykge1xuICAgICAgICByZXR1cm4gJ0RhdGUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWYuZW51bSkgJiYgZGVmLmVudW0ubGVuZ3RoID4gMCAmJiAhZGVmLmVudW0uZmluZCh4ID0+IHR5cGVvZih4KSAhPT0gJ3N0cmluZycpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXRFbnVtKHR5cGVOYW1lLCBkZWYsIHN0cnVjdEZxbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICB9XG5cbiAgICAvLyBtYXBcbiAgICBpZiAoIWRlZi5wcm9wZXJ0aWVzICYmIGRlZi5hZGRpdGlvbmFsUHJvcGVydGllcyAmJiB0eXBlb2YoZGVmLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBgeyBba2V5OiBzdHJpbmddOiAke3RoaXMudHlwZUZvclByb3BlcnR5KHR5cGVOYW1lLCBkZWYuYWRkaXRpb25hbFByb3BlcnRpZXMpfSB9YDtcbiAgICB9XG5cbiAgICAvLyBzdHJ1Y3RcbiAgICBpZiAoZGVmLnByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZW1pdFN0cnVjdCh0eXBlTmFtZSwgZGVmLCBzdHJ1Y3RGcW4pO1xuICAgICAgcmV0dXJuIHR5cGVOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiAnYW55JztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBjb2RlIG9uY2UgdG8gdGhlIG91dHB1dCBmaWxlLlxuICAgKiBAcGFyYW0gdW5pcXVlaWQgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvZGUgc25pcHBldCAoZS5nLiB0aGUgbmFtZSBvZiB0aGUgdHlwZSlcbiAgICogQHBhcmFtIGNvZGVFbWl0dGVyIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBlbWl0IHRoZSBjb2RlLlxuICAgKi9cbiAgcHVibGljIGFkZENvZGUodW5pcXVlaWQ6IHN0cmluZywgY29kZUVtaXR0ZXI6IChjb2RlOiBDb2RlKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMuZW1pdHRlZFR5cGVzLmhhcyh1bmlxdWVpZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGVzVG9FbWl0W3VuaXF1ZWlkXSA9IGNvZGVFbWl0dGVyO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICBjb25zdCBjb2RlID0gbmV3IENvZGUoKTtcbiAgICB0aGlzLmVtaXRDb2RlKGNvZGUpO1xuICAgIHJldHVybiBjb2RlLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhbGwgdHlwZXMgdG8gYSBgQ29kZU1ha2VyYCB3aXRoIGFuIG9wZW4gZmlsZS5cbiAgICogVXNlIHRoaXMgbWV0aG9kIGluIGNhc2UgeW91IG5lZWQgdG8gYWRkIHRob3NlIHR5cGUgdG8gYW4gZXhpc3RpbmcgZmlsZS5cbiAgICogQHBhcmFtIGNvZGUgVGhlIGBDb2RlTWFrZXJgIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGVtaXRDb2RlKGNvZGU6IENvZGUpIHtcbiAgICB3aGlsZSAoT2JqZWN0LmtleXModGhpcy50eXBlc1RvRW1pdCkubGVuZ3RoKSB7XG4gICAgICBjb25zdCBuYW1lID0gT2JqZWN0LmtleXModGhpcy50eXBlc1RvRW1pdClbMF07XG4gICAgICBjb25zdCBlbWl0dGVyID0gdGhpcy50eXBlc1RvRW1pdFtuYW1lXTtcbiAgICAgIGVtaXR0ZXIoY29kZSk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnR5cGVzVG9FbWl0W25hbWVdO1xuICAgICAgdGhpcy5lbWl0dGVkVHlwZXMuYWRkKG5hbWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlZmluaXRpb24gY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgdW5pb24gb3IgZmFsc2UgaWYgaXQgY2Fubm90XG4gICAqL1xuICBwcml2YXRlIGVtaXRVbmlvbih0eXBlTmFtZTogc3RyaW5nLCBkZWY6IEpTT05TY2hlbWE0LCBmcW46IHN0cmluZykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGRlZi5vbmVPZiB8fCBkZWYuYW55T2YgfHwgW10pIHtcbiAgICAgIGlmICghc3VwcG9ydGVkVW5pb25PcHRpb25UeXBlKG9wdGlvbi50eXBlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBvcHRpb24udHlwZSA9PT0gJ2ludGVnZXInID8gJ251bWJlcicgOiBvcHRpb24udHlwZTtcbiAgICAgIG9wdGlvbnMucHVzaCh0eXBlKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZENvZGUodHlwZU5hbWUsIGNvZGUgPT4ge1xuICAgICAgdGhpcy5lbWl0RGVzY3JpcHRpb24oY29kZSwgZnFuLCBkZWYuZGVzY3JpcHRpb24pO1xuXG4gICAgICBjb2RlLm9wZW5CbG9jayhgZXhwb3J0IGNsYXNzICR7dHlwZU5hbWV9YCk7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSAnZnJvbScgKyB0eXBlWzBdLnRvVXBwZXJDYXNlKCkgKyB0eXBlLnN1YnN0cigxKTtcbiAgICAgICAgY29kZS5vcGVuQmxvY2soYHB1YmxpYyBzdGF0aWMgJHttZXRob2ROYW1lfSh2YWx1ZTogJHt0eXBlfSk6ICR7dHlwZU5hbWV9YCk7XG4gICAgICAgIGNvZGUubGluZShgcmV0dXJuIG5ldyAke3R5cGVOYW1lfSh2YWx1ZSk7YCk7XG4gICAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgfVxuXG4gICAgICBjb2RlLm9wZW5CbG9jaygncHJpdmF0ZSBjb25zdHJ1Y3Rvcih2YWx1ZTogYW55KScpO1xuICAgICAgY29kZS5saW5lKCdPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXFwncmVzb2x2ZVxcJywgeyB2YWx1ZTogKCkgPT4gdmFsdWUgfSk7Jyk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0cnVjdCh0eXBlTmFtZTogc3RyaW5nLCBzdHJ1Y3REZWY6IEpTT05TY2hlbWE0LCBzdHJ1Y3RGcW46IHN0cmluZykge1xuICAgIHRoaXMuYWRkQ29kZSh0eXBlTmFtZSwgY29kZSA9PiB7XG4gICAgICB0aGlzLmVtaXREZXNjcmlwdGlvbihjb2RlLCBzdHJ1Y3RGcW4sIHN0cnVjdERlZi5kZXNjcmlwdGlvbik7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgZXhwb3J0IGludGVyZmFjZSAke3R5cGVOYW1lfWApO1xuXG4gICAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcFNwZWNdIG9mIE9iamVjdC5lbnRyaWVzKHN0cnVjdERlZi5wcm9wZXJ0aWVzIHx8IHt9KSkge1xuXG4gICAgICAgIGlmIChwcm9wTmFtZS5zdGFydHNXaXRoKCd4LScpKSB7XG4gICAgICAgICAgY29udGludWU7IC8vIHNraXAgZXh0ZW5zaW9ucyBmb3Igbm93XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcE5hbWUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHdhcm5pbmc6IHByb3BlcnR5ICR7c3RydWN0RnFufS4ke3Byb3BOYW1lfSBvbWl0dGVkIHNpbmNlIGl0IGluY2x1ZGVzIGFuIHVuZGVyc2NvcmVgKTtcbiAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0UHJvcGVydHkoY29kZSwgcHJvcE5hbWUsIHByb3BTcGVjLCBzdHJ1Y3RGcW4sIHN0cnVjdERlZik7XG4gICAgICB9XG5cbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UHJvcGVydHkoY29kZTogQ29kZSwgbmFtZTogc3RyaW5nLCBwcm9wRGVmOiBKU09OU2NoZW1hNCwgc3RydWN0RnFuOiBzdHJpbmcsIHN0cnVjdERlZjogSlNPTlNjaGVtYTQpIHtcbiAgICBjb25zdCBvcmlnaW5hbE5hbWUgPSBuYW1lO1xuXG4gICAgLy8gaWYgbmFtZSBpcyBub3QgY2FtZWxDYXNlLCBjb252ZXJ0IGl0IHRvIGNhbWVsIGNhc2UsIGJ1dCB0aGlzIGlzIGxpa2VseSB0b1xuICAgIC8vIHByb2R1Y2UgaW52YWxpZCBvdXRwdXQgZHVyaW5nIHN5bnRoZXNpcywgc28gYWRkIHNvbWUgYW5ub3RhdGlvbiB0byB0aGUgZG9jcy5cbiAgICBpZiAobmFtZVswXSA9PT0gbmFtZVswXS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBuYW1lID0gY2FtZWxDYXNlKG5hbWUpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoICckJyAobGlrZSAkcmVmIG9yICRzY2hlbWEpLCB3ZSByZW1vdmUgdGhlIFwiJFwiXG4gICAgLy8gYW5kIGl0J3MgdGhlIHNhbWUgZGVhbCAtIHdpbGwgcHJvZHVjZSBpbnZhbGlkIG91dHB1dFxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJyQnKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdERlc2NyaXB0aW9uKGNvZGUsIGAke3N0cnVjdEZxbn0jJHtvcmlnaW5hbE5hbWV9YCwgcHJvcERlZi5kZXNjcmlwdGlvbik7XG4gICAgY29uc3QgcHJvcGVydHlUeXBlID0gdGhpcy50eXBlRm9yUHJvcGVydHkoYCR7c3RydWN0RnFufS4ke25hbWV9YCwgcHJvcERlZik7XG4gICAgY29uc3QgcmVxdWlyZWQgPSB0aGlzLmlzUHJvcGVydHlSZXF1aXJlZChuYW1lLCBzdHJ1Y3REZWYpO1xuICAgIGNvbnN0IG9wdGlvbmFsID0gcmVxdWlyZWQgPyAnJyA6ICc/JztcblxuICAgIGNvZGUubGluZShgcmVhZG9ubHkgJHtuYW1lfSR7b3B0aW9uYWx9OiAke3Byb3BlcnR5VHlwZX07YCk7XG4gICAgY29kZS5saW5lKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRFbnVtKHR5cGVOYW1lOiBzdHJpbmcsIGRlZjogSlNPTlNjaGVtYTQsIHN0cnVjdEZxbjogc3RyaW5nKSB7XG5cbiAgICB0aGlzLmFkZENvZGUodHlwZU5hbWUsIGNvZGUgPT4ge1xuXG4gICAgICBpZiAoIWRlZi5lbnVtIHx8IGRlZi5lbnVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGRlZmluaXRpb24gaXMgbm90IGFuIGVudW06ICR7SlNPTi5zdHJpbmdpZnkoZGVmKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZi50eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBvbmx5IGdlbmVyYXRlIHN0cmluZyBlbnVtcycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXREZXNjcmlwdGlvbihjb2RlLCBzdHJ1Y3RGcW4sIGRlZi5kZXNjcmlwdGlvbik7XG5cbiAgICAgIGNvZGUub3BlbkJsb2NrKGBleHBvcnQgZW51bSAke3R5cGVOYW1lfWApO1xuXG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGRlZi5lbnVtKSB7XG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG9ubHkgZ2VuZXJhdGUgZW51bXMgZm9yIHN0cmluZyB2YWx1ZXMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNsdWdnaWZ5IGFuZCB0dXJuIHRvIFVQUEVSX1NOQUtFX0NBU0VcbiAgICAgICAgY29uc3QgbWVtYmVyTmFtZSA9IHNuYWtlQ2FzZSh2YWx1ZS5yZXBsYWNlKC9bXmEtejAtOV0vZ2ksICdfJykpLnNwbGl0KCdfJykuZmlsdGVyKHggPT4geCkuam9pbignXycpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgY29kZS5saW5lKGAvKiogJHt2YWx1ZX0gKi9gKTtcbiAgICAgICAgY29kZS5saW5lKGAke21lbWJlck5hbWV9ID0gXCIke3ZhbHVlfVwiLGApO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0eXBlTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdERlc2NyaXB0aW9uKGNvZGU6IENvZGUsIGZxbjogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZywgYW5ub3RhdGlvbnM6IHsgW3R5cGU6IHN0cmluZ106IHN0cmluZyB9ID0geyB9KSB7XG4gICAgY29kZS5saW5lKCcvKionKTtcblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKC9cXCpcXC8vZywgJ18vJyk7XG5cbiAgICAgIGNvbnN0IGV4dHJhY3REZWZhdWx0ID0gL0RlZmF1bHRzP1xcVysodG98aXMpXFxXKyguKykvZy5leGVjKGRlc2NyaXB0aW9uKTtcbiAgICAgIGNvbnN0IGRlZiA9IGV4dHJhY3REZWZhdWx0ICYmIGV4dHJhY3REZWZhdWx0WzJdO1xuXG4gICAgICBjb2RlLmxpbmUoYCAqICR7ZGVzY3JpcHRpb259YCk7XG4gICAgICBpZiAoZGVmKSB7XG4gICAgICAgIGFubm90YXRpb25zLmRlZmF1bHQgPSBkZWY7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZSgnIConKTtcbiAgICB9XG5cbiAgICBhbm5vdGF0aW9ucy5zY2hlbWEgPSBmcW47XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYW5ub3RhdGlvbnMpKSB7XG4gICAgICBjb2RlLmxpbmUoYCAqIEAke3R5cGV9ICR7dmFsdWV9YCk7XG4gICAgfVxuXG4gICAgY29kZS5saW5lKCcgKi8nKTtcbiAgfVxuXG4gIHByaXZhdGUgdHlwZUZvclByb3BlcnR5KHByb3BlcnR5RnFuOiBzdHJpbmcsIGRlZjogSlNPTlNjaGVtYTQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnR5cGUgPSBUeXBlR2VuZXJhdG9yLm5vcm1hbGl6ZVR5cGVOYW1lKHByb3BlcnR5RnFuLnNwbGl0KCcuJykubWFwKHggPT4gcGFzY2FsQ2FzZSh4KSkuam9pbignJykpO1xuICAgIHJldHVybiB0aGlzLmFkZFR5cGUoc3VidHlwZSwgZGVmLCBzdWJ0eXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgdHlwZUZvclJlZihkZWY6IEpTT05TY2hlbWE0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmVmaXggPSAnIy9kZWZpbml0aW9ucy8nO1xuICAgIGlmICghZGVmLiRyZWYgfHwgIWRlZi4kcmVmLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkICRyZWYgJHtKU09OLnN0cmluZ2lmeShkZWYpfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRXhjbHVkZWQoZGVmLiRyZWYpKSB7XG4gICAgICByZXR1cm4gJ2FueSc7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHMgPSBkZWYuJHJlZi5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCB0eXBlTmFtZSA9IFR5cGVHZW5lcmF0b3Iubm9ybWFsaXplVHlwZU5hbWUoY29tcHNbY29tcHMubGVuZ3RoIC0gMV0pO1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMucmVzb2x2ZVJlZmVyZW5jZShkZWYpO1xuICAgIHJldHVybiB0aGlzLmFkZFR5cGUodHlwZU5hbWUsIHNjaGVtYSwgZGVmLiRyZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSB0eXBlRm9yQXJyYXkocHJvcGVydHlGcW46IHN0cmluZywgZGVmOiBKU09OU2NoZW1hNCk6IHN0cmluZyB7XG4gICAgaWYgKCFkZWYuaXRlbXMgfHwgdHlwZW9mKGRlZi5pdGVtcykgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGFycmF5IHR5cGUgJHtkZWYuaXRlbXN9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHlwZUZvclByb3BlcnR5KHByb3BlcnR5RnFuLCBkZWYuaXRlbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUmVmZXJlbmNlKGRlZjogSlNPTlNjaGVtYTQpOiBKU09OU2NoZW1hNCB7XG4gICAgY29uc3QgcmVmID0gZGVmLiRyZWY7XG4gICAgaWYgKCFyZWYgfHwgIXJlZi5zdGFydHNXaXRoKERFRklOSVRJT05TX1BSRUZJWCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIGEgbG9jYWwgcmVmZXJlbmNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9va3VwID0gcmVmLnN1YnN0cihERUZJTklUSU9OU19QUkVGSVgubGVuZ3RoKTtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuZGVmaW5pdGlvbnNbbG9va3VwXTtcbiAgICBpZiAoIWZvdW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuYWJsZSB0byBmaW5kIGEgZGVmaW5pdGlvbiBmb3IgdGhlICRyZWYgXCIke2xvb2t1cH1cImApO1xuICAgIH1cblxuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgaXNQcm9wZXJ0eVJlcXVpcmVkKHByb3BlcnR5OiBzdHJpbmcsIHN0cnVjdERlZjogSlNPTlNjaGVtYTQpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzdHJ1Y3REZWYucmVxdWlyZWQpICYmIHN0cnVjdERlZi5yZXF1aXJlZC5pbmNsdWRlcyhwcm9wZXJ0eSk7XG4gIH1cblxuICBwcml2YXRlIGlzRXhjbHVkZWQoZnFuOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdGhpcy5leGNsdWRlKSB7XG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAocGF0dGVybik7XG4gICAgICBpZiAocmUudGVzdChmcW4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdXBwb3J0ZWRVbmlvbk9wdGlvblR5cGUodHlwZTogYW55KTogdHlwZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZSAmJiAodHlwZW9mKHR5cGUpID09PSAnc3RyaW5nJyAmJiBQUklNSVRJVkVfVFlQRVMuaW5jbHVkZXModHlwZSkpO1xufVxuXG5mdW5jdGlvbiBwYXNjYWxDYXNlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjYW1lbENhc2UocywgeyBwYXNjYWxDYXNlOiB0cnVlIH0pO1xufSJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZS1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQXVDO0FBRXZDLDJDQUF1QztBQUN2QyxpQ0FBOEI7QUFHOUIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRSxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDO0FBZ0I1Qzs7R0FFRztBQUNILE1BQWEsYUFBYTtJQThCeEI7Ozs7T0FJRztJQUNILFlBQVksVUFBZ0MsRUFBRzs7UUFWOUIsZ0JBQVcsR0FBNkMsRUFBRyxDQUFDO1FBQzVELGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQVVoRCxJQUFJLENBQUMsT0FBTyxTQUFHLE9BQU8sQ0FBQyxPQUFPLG1DQUFJLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUV0QixLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sT0FBQyxPQUFPLENBQUMsV0FBVyxtQ0FBSSxFQUFFLENBQUMsRUFBRTtZQUN2RSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUF6Q0Q7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQWdCO1FBQzlDLGlGQUFpRjtRQUNqRixNQUFNLEVBQUUsR0FBRyx1QkFBdUIsQ0FBQztRQUNuQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUM7UUFDTixHQUFHO1lBQ0QsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsbUNBQW1DO2dCQUM1RSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzREFBc0Q7Z0JBQ3hFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsK0RBQStEO2dCQUNuSCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0NBQWtDO2dCQUN2RixNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxTQUFTO2FBQzVDO1NBQ0YsUUFBUSxDQUFDLEVBQUU7UUFFWixNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7UUFDN0YsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQXFCRDs7Ozs7O09BTUc7SUFDSSxhQUFhLENBQUMsUUFBZ0IsRUFBRSxHQUFnQjtRQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxRQUFRLENBQUMsSUFBWSxFQUFFLEVBQVU7UUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLFFBQVEsQ0FBQyxRQUFnQixFQUFFLEdBQWlCLEVBQUUsWUFBb0IsUUFBUTtRQUMvRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDUixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2FBQ3JFO1NBQ0Y7UUFFRCw4RUFBOEU7UUFDOUUsMkNBQTJDO1FBQzNDLElBQUksYUFBYSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsUUFBUSw2Q0FBNkMsQ0FBQyxDQUFDO1NBQzNFO1FBRUQsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7WUFDNUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUQ7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLFNBQVMsaUVBQWlFLENBQUMsQ0FBQztTQUNyRztRQUVELElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3QjtRQUVELDRFQUE0RTtRQUM1RSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtZQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDNUMsT0FBTyxRQUFRLENBQUM7YUFDakI7WUFFRCw2REFBNkQ7U0FDOUQ7UUFFRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFO1lBQ3ZELE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFFRCxRQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUU7WUFDaEIsS0FBSyxTQUFTLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQztZQUNqQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQzdELEtBQUssS0FBSyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUM7WUFDekIsS0FBSyxNQUFNLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQztTQUMzQjtRQUVELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDbkQsT0FBTyxRQUFRLENBQUM7U0FDakI7UUFFRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ3pCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0JBQzlCLE9BQU8sTUFBTSxDQUFDO2FBQ2Y7WUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUFFO2dCQUNqRyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQzthQUNoRDtZQUVELE9BQU8sUUFBUSxDQUFDO1NBQ2pCO1FBRUQsTUFBTTtRQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSxPQUFNLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ2hHLE9BQU8sb0JBQW9CLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7U0FDekY7UUFFRCxTQUFTO1FBQ1QsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxQyxPQUFPLFFBQVEsQ0FBQztTQUNqQjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGNBQWMsQ0FBQyxRQUFnQixFQUFFLE9BQTZCO1FBQ25FLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDbkMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxDQUFDLFFBQWdCLEVBQUUsV0FBaUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU07UUFDWCxNQUFNLElBQUksR0FBRyxJQUFJLFdBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxZQUFZLENBQUMsSUFBVTtRQUM1QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUMzQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxJQUFVO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPLENBQUMsUUFBZ0IsRUFBRSxHQUFpQixFQUFFLFlBQW9CLFFBQVE7UUFDOUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUyxDQUFDLFFBQWdCLEVBQUUsR0FBZ0IsRUFBRSxHQUFXO1FBQy9ELE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDcEMsS0FBSyxNQUFNLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFO1lBQ2pELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRWpELElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFM0MsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQUU7Z0JBQzFCLE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsVUFBVSxXQUFXLElBQUksTUFBTSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsUUFBUSxVQUFVLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ25CO1lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsbUVBQW1FLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFbEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sVUFBVSxDQUFDLFFBQWdCLEVBQUUsU0FBc0IsRUFBRSxTQUFpQjtRQUM1RSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFL0MsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRTtnQkFFN0UsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM3QixTQUFTLENBQUMsMEJBQTBCO2lCQUNyQztnQkFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLFNBQVMsSUFBSSxRQUFRLDBDQUEwQyxDQUFDLENBQUM7b0JBQ3BHLFNBQVMsQ0FBQyxPQUFPO2lCQUNsQjtnQkFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQzthQUNuRTtZQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBVSxFQUFFLElBQVksRUFBRSxPQUFvQixFQUFFLFNBQWlCLEVBQUUsU0FBc0I7UUFDNUcsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRTFCLDRFQUE0RTtRQUM1RSwrRUFBK0U7UUFDL0UsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3JDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEI7UUFFRCx3RUFBd0U7UUFDeEUsdURBQXVEO1FBQ3ZELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN4QixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEdBQUcsU0FBUyxJQUFJLFlBQVksRUFBRSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsU0FBUyxJQUFJLElBQUksRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUVyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxHQUFHLFFBQVEsS0FBSyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFTyxRQUFRLENBQUMsUUFBZ0IsRUFBRSxHQUFnQixFQUFFLFNBQWlCO1FBRXBFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBRTVCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDdEU7WUFFRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7YUFDbkQ7WUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXZELElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRTFDLEtBQUssTUFBTSxLQUFLLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtnQkFDNUIsSUFBSSxPQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFO29CQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7aUJBQzlEO2dCQUVELHdDQUF3QztnQkFDeEMsTUFBTSxVQUFVLEdBQUcsc0JBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBRWxILElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUM7YUFDMUM7WUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8sZUFBZSxDQUFDLElBQVUsRUFBRSxHQUFXLEVBQUUsV0FBb0IsRUFBRSxjQUEwQyxFQUFHO1FBQ2xILElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakIsSUFBSSxXQUFXLEVBQUU7WUFDZixXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFakQsTUFBTSxjQUFjLEdBQUcsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sR0FBRyxHQUFHLGNBQWMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsV0FBVyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7YUFDM0I7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pCO1FBRUQsV0FBVyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFFekIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRU8sZUFBZSxDQUFDLFdBQW1CLEVBQUUsR0FBZ0I7UUFDM0QsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekcsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLFVBQVUsQ0FBQyxHQUFnQjtRQUNqQyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM3QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRSxtRUFBbUU7UUFDbkUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuQyxPQUFPLFFBQVEsQ0FBQztTQUNqQjtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLFlBQVksQ0FBQyxXQUFtQixFQUFFLEdBQWdCO1FBQ3hELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLE9BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEdBQWdCO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7U0FDaEQ7UUFFRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDekU7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLFNBQXNCO1FBQ2pFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVPLFVBQVUsQ0FBQyxHQUFXO1FBQzVCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxNQUFNLEVBQUUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBdGFELHNDQXNhQztBQUVELFNBQVMsd0JBQXdCLENBQUMsSUFBUztJQUN6QyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxDQUFTO0lBQzNCLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjYW1lbENhc2UgZnJvbSAnY2FtZWxjYXNlJztcbmltcG9ydCB7IEpTT05TY2hlbWE0IH0gZnJvbSAnanNvbi1zY2hlbWEnO1xuaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnc25ha2UtY2FzZSc7XG5pbXBvcnQgeyBDb2RlIH0gZnJvbSAnLi9jb2RlJztcblxuXG5jb25zdCBQUklNSVRJVkVfVFlQRVMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnaW50ZWdlcicsICdib29sZWFuJ107XG5jb25zdCBERUZJTklUSU9OU19QUkVGSVggPSAnIy9kZWZpbml0aW9ucy8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVHZW5lcmF0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhdHRlcm5zIG9mIHR5cGUgRlFOcyB0byBleGNsdWRlLlxuICAgKiBAZGVmYXVsdCAtIGluY2x1ZGUgYWxsIHR5cGVzXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNjaGVtYSBkZWZpbml0aW9ucyBmb3IgcmVzb2x2aW5nICRyZWZzXG4gICAqIEBkZWZhdWx0IC0gJHJlZnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlZmluaXRpb25zPzogeyBbZGVmOiBzdHJpbmddOiBKU09OU2NoZW1hNCB9O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0eXBlc2NyaXB0IHR5cGVzIGZyb20gSlNPTiBzY2hlbWFzLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZUdlbmVyYXRvciB7XG4gIC8qKlxuICAgKiBDb252ZXJ0IGFsbC1jYXBzIGFjcm9ueW1zIChlLmcuIFwiVlBDXCIsIFwiRm9vQkFSWm9vRklHb29cIikgdG8gcGFzY2FsIGNhc2VcbiAgICogKGUuZy4gXCJWcGNcIiwgXCJGb29CYXJab29GaUdvb1wiKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplVHlwZU5hbWUodHlwZU5hbWU6IHN0cmluZykge1xuICAgIC8vIHN0YXJ0IHdpdGggdGhlIGZ1bGwgc3RyaW5nIGFuZCB0aGVuIHVzZSB0aGUgcmVnZXggdG8gbWF0Y2ggYWxsLWNhcHMgc2VxdWVuY2VzLlxuICAgIGNvbnN0IHJlID0gLyhbQS1aXSspKD86W15hLXpdfCQpL2c7XG4gICAgbGV0IHJlc3VsdCA9IHR5cGVOYW1lO1xuICAgIGxldCBtO1xuICAgIGRvIHtcbiAgICAgIG0gPSByZS5leGVjKHR5cGVOYW1lKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IHJlc3VsdC5zbGljZSgwLCBtLmluZGV4KTsgLy8gYWxsIHRoZSB0ZXh0IGJlZm9yZSB0aGUgc2VxdWVuY2VcbiAgICAgICAgY29uc3QgY2FwID0gbVsxXTsgLy8gZ3JvdXAgIzEgbWF0Y2hlcyB0aGUgYWxsLWNhcHMgc2VxdWVuY2Ugd2UgYXJlIGFmdGVyXG4gICAgICAgIGNvbnN0IHBhc2NhbCA9IGNhcFswXSArIGNhcC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpOyAvLyBjb252ZXJ0IHRvIHBhc2NhbCBjYXNlIGJ5IGxvd2VyY2FzaW5nIGFsbCBidXQgdGhlIGZpcnN0IGNoYXJcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSByZXN1bHQuc2xpY2UobS5pbmRleCArIHBhc2NhbC5sZW5ndGgpOyAvLyBhbGwgdGhlIHRleHQgYWZ0ZXIgdGhlIHNlcXVlbmNlXG4gICAgICAgIHJlc3VsdCA9IGJlZm9yZSArIHBhc2NhbCArIGFmdGVyOyAvLyBjb25jYXRcbiAgICAgIH1cbiAgICB9IHdoaWxlIChtKTtcblxuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9eLi8sIHJlc3VsdFswXS50b1VwcGVyQ2FzZSgpKTsgLy8gZW5zdXJlIGZpcnN0IGxldHRlciBpcyBjYXBpdGFsaXplZFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzVG9FbWl0OiB7IFtuYW1lOiBzdHJpbmddOiAoY29kZTogQ29kZSkgPT4gdm9pZCB9ID0geyB9O1xuICBwcml2YXRlIHJlYWRvbmx5IGVtaXR0ZWRUeXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGU6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmluaXRpb25zOiB7IFtkZWY6IHN0cmluZ106IEpTT05TY2hlbWE0IH07XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBzY2hlbWEgU2NoZW1hIGRlZmluaXRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUeXBlR2VuZXJhdG9yT3B0aW9ucyA9IHsgfSkge1xuICAgIHRoaXMuZXhjbHVkZSA9IG9wdGlvbnMuZXhjbHVkZSA/PyBbXTtcbiAgICB0aGlzLmRlZmluaXRpb25zID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlTmFtZSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLmRlZmluaXRpb25zID8/IHt9KSkge1xuICAgICAgdGhpcy5hZGREZWZpbml0aW9uKHR5cGVOYW1lLCBkZWYpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgSlNPTiBzY2hlbWEgZGVmaW5pdGlvbiBmb3IgYSB0eXBlIG5hbWUuIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVtaXQgdGhlIHR5cGVcbiAgICogYnV0IHJhdGhlciBqdXN0IHJlZ2lzdGVycyB0aGUgZGVmaW5pdGlvbiB0aGF0IHdpbGwgZ2V0IHJlc29sdmVkIGlmIHRoaXMgdHlwZSBpcyBgJHJlZmBlZC5cbiAgICpcbiAgICogQHBhcmFtIHR5cGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0eXBlLlxuICAgKiBAcGFyYW0gZGVmIFRoZSBKU09OIHNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGlzIHR5cGVcbiAgICovXG4gIHB1YmxpYyBhZGREZWZpbml0aW9uKHR5cGVOYW1lOiBzdHJpbmcsIGRlZjogSlNPTlNjaGVtYTQpIHtcbiAgICB0aGlzLmRlZmluaXRpb25zW3R5cGVOYW1lXSA9IGRlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGRlZmluaXRpb24gb2YgYGZyb21UeXBlTmFtZWAgc3VjaCB0aGF0IGFueSByZWZlcmVuY2VzIHRvIGl0XG4gICAqIHdpbGwgYmUgcmVzb2x2ZWQgYXMgYHRvVHlwZU5hbWVgLiBCZWFyIGluIG1pbmQgdGhhdCB0aGUgdHlwZSBuYW1lIHNwZWNpZmllZFxuICAgKiBpbiBgdG9gIG11c3QgZWl0aGVyIGJlIGRlZmluZWQgYXMgYSBkZWZpbml0aW9uIChgYWRkRGVmaW5pdGlvbigpYCkgX29yX1xuICAgKiBlbWl0dGVkIGFzIGEgY3VzdG9tIHR5cGUgKGBlbWl0Q3VzdG9tVHlwZSgpYCkuXG4gICAqL1xuICBwdWJsaWMgYWRkQWxpYXMoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKSB7XG4gICAgdGhpcy5hZGREZWZpbml0aW9uKGZyb20sIHsgJHJlZjogYCMvZGVmaW5pdGlvbnMvJHt0b31gIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYSB0eXBlIGJhc2VkIG9uIGEgSlNPTiBzY2hlbWEuIElmIGBkZWZgIGlzIG5vdCBzcGVjaWZpZWQsIHRoZVxuICAgKiBkZWZpbml0aW9uIG9mIHRoZSB0eXBlIHdpbGwgYmUgbG9va2VkIHVwIGluIHRoZSBgZGVmaW5pdGlvbnNgIHByb3ZpZGVkXG4gICAqIGR1cmluZyBpbml0aWFsaXphdGlvbiBvciB2aWEgYGFkZERlZmluaXRpb24oKWAuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlTmFtZSBUaGUgbmFtZSBvZiB0aCB0eXBlXG4gICAqIEBwYXJhbSBkZWYgSlNPTiBzY2hlbWEuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBzY2hlbWEgaXMgbG9va2VkIHVwIGZyb21cbiAgICogYGRlZmluaXRpb25zYCBiYXNlZCBvbiB0aGUgdHlwZSBuYW1lXG4gICAqIEBwYXJhbSBzdHJ1Y3RGcW4gRlFOIGZvciB0aGUgdHlwZSAoZGVmYXVsdHMgdG8gYHR5cGVOYW1lYClcbiAgICogQHJldHVybnMgVGhlIHJlc29sdmVkIHR5cGUgKG5vdCBhbHdheXMgdGhlIHNhbWUgYXMgYHR5cGVOYW1lYClcbiAgICovXG4gIHB1YmxpYyBlbWl0VHlwZSh0eXBlTmFtZTogc3RyaW5nLCBkZWY/OiBKU09OU2NoZW1hNCwgc3RydWN0RnFuOiBzdHJpbmcgPSB0eXBlTmFtZSk6IHN0cmluZyB7XG4gICAgaWYgKCFkZWYpIHtcbiAgICAgIGRlZiA9IHRoaXMuZGVmaW5pdGlvbnNbdHlwZU5hbWVdO1xuICAgICAgaWYgKCFkZWYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmFibGUgdG8gZmluZCBzY2hlbWEgZGVmaW5pdGlvbiBmb3IgJHt0eXBlTmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxsZXJzIGV4cGVjdCB0aGF0IGVtaXQgYSB0eXBlIG5hbWVkIGB0eXBlTmFtZWAgc28gd2UgY2FuJ3QgY2hhbmdlIGl0IGhlcmVcbiAgICAvLyBidXQgYXQgbGVhc3Qgd2UgY2FuIHZlcmlmeSBpdCdzIGNvcnJlY3QuXG4gICAgaWYgKFR5cGVHZW5lcmF0b3Iubm9ybWFsaXplVHlwZU5hbWUodHlwZU5hbWUpICE9PSB0eXBlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3R5cGVOYW1lfSBtdXN0IGJlIG5vcm1hbGl6ZWQgYmVmb3JlIGNhbGxpbmcgZW1pdFR5cGVgKTtcbiAgICB9XG5cbiAgICBpZiAoc3RydWN0RnFuLnN0YXJ0c1dpdGgoREVGSU5JVElPTlNfUFJFRklYKSkge1xuICAgICAgc3RydWN0RnFuID0gc3RydWN0RnFuLnN1YnN0cmluZyhERUZJTklUSU9OU19QUkVGSVgubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0V4Y2x1ZGVkKHN0cnVjdEZxbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSAke3N0cnVjdEZxbn0gY2Fubm90IGJlIGFkZGVkIHNpbmNlIGl0IG1hdGNoZXMgb25lIG9mIHRoZSBleGNsdXNpb24gcGF0dGVybnNgKTtcbiAgICB9XG5cbiAgICBpZiAoZGVmLiRyZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGVGb3JSZWYoZGVmKTtcbiAgICB9XG5cbiAgICAvLyB1bmlvbnMgKHVubGVzcyB0aGlzIGlzIGEgc3RydWN0LCBhbmQgdGhlbiB3ZSBqdXN0IGlnbm9yZSB0aGUgY29uc3RyYWludHMpXG4gICAgaWYgKGRlZi5vbmVPZiB8fCBkZWYuYW55T2YpIHtcbiAgICAgIGlmICh0aGlzLmVtaXRVbmlvbih0eXBlTmFtZSwgZGVmLCBzdHJ1Y3RGcW4pKSB7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gY2Fycnkgb24sIHdlIGNhbid0IHJlcHJlc2VudCB0aGlzIHNjaGVtYSBhcyBhIHVuaW9uICh5ZXQ/KVxuICAgIH1cblxuICAgIGlmIChkZWYudHlwZSA9PT0gJ3N0cmluZycgJiYgZGVmLmZvcm1hdCA9PT0gJ2RhdGUtdGltZScpIHtcbiAgICAgIHJldHVybiAnRGF0ZSc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChkZWYudHlwZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6IHJldHVybiAnYm9vbGVhbic7XG4gICAgICBjYXNlICdhcnJheSc6IHJldHVybiBgJHt0aGlzLnR5cGVGb3JBcnJheSh0eXBlTmFtZSwgZGVmKX1bXWA7XG4gICAgICBjYXNlICdhbnknOiByZXR1cm4gJ2FueSc7XG4gICAgICBjYXNlICdudWxsJzogcmV0dXJuICdhbnknO1xuICAgIH1cblxuICAgIGlmIChkZWYudHlwZSA9PT0gJ251bWJlcicgfHwgZGVmLnR5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgIH1cblxuICAgIGlmIChkZWYudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChkZWYuZm9ybWF0ID09PSAnZGF0ZS10aW1lJykge1xuICAgICAgICByZXR1cm4gJ0RhdGUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWYuZW51bSkgJiYgZGVmLmVudW0ubGVuZ3RoID4gMCAmJiAhZGVmLmVudW0uZmluZCh4ID0+IHR5cGVvZih4KSAhPT0gJ3N0cmluZycpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXRFbnVtKHR5cGVOYW1lLCBkZWYsIHN0cnVjdEZxbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICB9XG5cbiAgICAvLyBtYXBcbiAgICBpZiAoIWRlZi5wcm9wZXJ0aWVzICYmIGRlZi5hZGRpdGlvbmFsUHJvcGVydGllcyAmJiB0eXBlb2YoZGVmLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBgeyBba2V5OiBzdHJpbmddOiAke3RoaXMudHlwZUZvclByb3BlcnR5KHR5cGVOYW1lLCBkZWYuYWRkaXRpb25hbFByb3BlcnRpZXMpfSB9YDtcbiAgICB9XG5cbiAgICAvLyBzdHJ1Y3RcbiAgICBpZiAoZGVmLnByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZW1pdFN0cnVjdCh0eXBlTmFtZSwgZGVmLCBzdHJ1Y3RGcW4pO1xuICAgICAgcmV0dXJuIHR5cGVOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiAnYW55JztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gdHlwZSBhbmQgZW1pdHMgaXQuIFRoaXMgd2lsbCBvdmVycmlkZSBhbnkgZXhpc3RpbmdcbiAgICogZGVmaW5pdGlvbnMgZm9yIHRoaXMgdHlwZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHR5cGUgZW1pdHRlZCBieSB0aGlzIGhhbmRsZXIuXG4gICAqIEBwYXJhbSBlbWl0dGVyIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBlbWl0IHRoZSBjb2RlLlxuICAgKi9cbiAgcHVibGljIGVtaXRDdXN0b21UeXBlKHR5cGVOYW1lOiBzdHJpbmcsIGVtaXR0ZXI6IChjb2RlOiBDb2RlKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMuZW1pdHRlZFR5cGVzLmhhcyh0eXBlTmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGVzVG9FbWl0W3R5cGVOYW1lXSA9IGVtaXR0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBlbWl0Q3VzdG9tVHlwZSgpYFxuICAgKi9cbiAgcHVibGljIGFkZENvZGUodHlwZU5hbWU6IHN0cmluZywgY29kZUVtaXR0ZXI6IChjb2RlOiBDb2RlKSA9PiB2b2lkKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdEN1c3RvbVR5cGUodHlwZU5hbWUsIGNvZGVFbWl0dGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGFsbCBlbWl0dGVkIHR5cGVzIHRvIGEgc3RyaW5nLlxuICAgKlxuICAgKiBVc2UgYHJlbmRlclRvQ29kZSgpYCBpbiBvcmRlciB0byByZW5kZXIgb3V0cHV0IHRvIGFuIGV4aXN0aW5nIGBDb2RlYCBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29kZSA9IG5ldyBDb2RlKCk7XG4gICAgdGhpcy5yZW5kZXJUb0NvZGUoY29kZSk7XG4gICAgcmV0dXJuIGNvZGUucmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGFsbCB0eXBlcyB0byBhIGBDb2RlTWFrZXJgIHdpdGggYW4gb3BlbiBmaWxlLlxuICAgKiBVc2UgdGhpcyBtZXRob2QgaW4gY2FzZSB5b3UgbmVlZCB0byBhZGQgdGhvc2UgdHlwZSB0byBhbiBleGlzdGluZyBmaWxlLlxuICAgKiBAcGFyYW0gY29kZSBUaGUgYENvZGVNYWtlcmAgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyVG9Db2RlKGNvZGU6IENvZGUpIHtcbiAgICB3aGlsZSAoT2JqZWN0LmtleXModGhpcy50eXBlc1RvRW1pdCkubGVuZ3RoKSB7XG4gICAgICBjb25zdCBuYW1lID0gT2JqZWN0LmtleXModGhpcy50eXBlc1RvRW1pdClbMF07XG4gICAgICBjb25zdCBlbWl0dGVyID0gdGhpcy50eXBlc1RvRW1pdFtuYW1lXTtcbiAgICAgIGVtaXR0ZXIoY29kZSk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnR5cGVzVG9FbWl0W25hbWVdO1xuICAgICAgdGhpcy5lbWl0dGVkVHlwZXMuYWRkKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYHJlbmRlclRvQ29kZSgpYFxuICAgKi9cbiAgcHVibGljIGVtaXRDb2RlKGNvZGU6IENvZGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJUb0NvZGUoY29kZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBlbWl0VHlwZSgpYFxuICAgKi9cbiAgcHVibGljIGFkZFR5cGUodHlwZU5hbWU6IHN0cmluZywgZGVmPzogSlNPTlNjaGVtYTQsIHN0cnVjdEZxbjogc3RyaW5nID0gdHlwZU5hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVtaXRUeXBlKHR5cGVOYW1lLCBkZWYsIHN0cnVjdEZxbik7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlZmluaXRpb24gY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgdW5pb24gb3IgZmFsc2UgaWYgaXQgY2Fubm90XG4gICAqL1xuICBwcml2YXRlIGVtaXRVbmlvbih0eXBlTmFtZTogc3RyaW5nLCBkZWY6IEpTT05TY2hlbWE0LCBmcW46IHN0cmluZykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGRlZi5vbmVPZiB8fCBkZWYuYW55T2YgfHwgW10pIHtcbiAgICAgIGlmICghc3VwcG9ydGVkVW5pb25PcHRpb25UeXBlKG9wdGlvbi50eXBlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBvcHRpb24udHlwZSA9PT0gJ2ludGVnZXInID8gJ251bWJlcicgOiBvcHRpb24udHlwZTtcbiAgICAgIG9wdGlvbnMucHVzaCh0eXBlKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZENvZGUodHlwZU5hbWUsIGNvZGUgPT4ge1xuICAgICAgdGhpcy5lbWl0RGVzY3JpcHRpb24oY29kZSwgZnFuLCBkZWYuZGVzY3JpcHRpb24pO1xuXG4gICAgICBjb2RlLm9wZW5CbG9jayhgZXhwb3J0IGNsYXNzICR7dHlwZU5hbWV9YCk7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSAnZnJvbScgKyB0eXBlWzBdLnRvVXBwZXJDYXNlKCkgKyB0eXBlLnN1YnN0cigxKTtcbiAgICAgICAgY29kZS5vcGVuQmxvY2soYHB1YmxpYyBzdGF0aWMgJHttZXRob2ROYW1lfSh2YWx1ZTogJHt0eXBlfSk6ICR7dHlwZU5hbWV9YCk7XG4gICAgICAgIGNvZGUubGluZShgcmV0dXJuIG5ldyAke3R5cGVOYW1lfSh2YWx1ZSk7YCk7XG4gICAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgfVxuXG4gICAgICBjb2RlLm9wZW5CbG9jaygncHJpdmF0ZSBjb25zdHJ1Y3Rvcih2YWx1ZTogYW55KScpO1xuICAgICAgY29kZS5saW5lKCdPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXFwncmVzb2x2ZVxcJywgeyB2YWx1ZTogKCkgPT4gdmFsdWUgfSk7Jyk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0cnVjdCh0eXBlTmFtZTogc3RyaW5nLCBzdHJ1Y3REZWY6IEpTT05TY2hlbWE0LCBzdHJ1Y3RGcW46IHN0cmluZykge1xuICAgIHRoaXMuYWRkQ29kZSh0eXBlTmFtZSwgY29kZSA9PiB7XG4gICAgICB0aGlzLmVtaXREZXNjcmlwdGlvbihjb2RlLCBzdHJ1Y3RGcW4sIHN0cnVjdERlZi5kZXNjcmlwdGlvbik7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgZXhwb3J0IGludGVyZmFjZSAke3R5cGVOYW1lfWApO1xuXG4gICAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcFNwZWNdIG9mIE9iamVjdC5lbnRyaWVzKHN0cnVjdERlZi5wcm9wZXJ0aWVzIHx8IHt9KSkge1xuXG4gICAgICAgIGlmIChwcm9wTmFtZS5zdGFydHNXaXRoKCd4LScpKSB7XG4gICAgICAgICAgY29udGludWU7IC8vIHNraXAgZXh0ZW5zaW9ucyBmb3Igbm93XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcE5hbWUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHdhcm5pbmc6IHByb3BlcnR5ICR7c3RydWN0RnFufS4ke3Byb3BOYW1lfSBvbWl0dGVkIHNpbmNlIGl0IGluY2x1ZGVzIGFuIHVuZGVyc2NvcmVgKTtcbiAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0UHJvcGVydHkoY29kZSwgcHJvcE5hbWUsIHByb3BTcGVjLCBzdHJ1Y3RGcW4sIHN0cnVjdERlZik7XG4gICAgICB9XG5cbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UHJvcGVydHkoY29kZTogQ29kZSwgbmFtZTogc3RyaW5nLCBwcm9wRGVmOiBKU09OU2NoZW1hNCwgc3RydWN0RnFuOiBzdHJpbmcsIHN0cnVjdERlZjogSlNPTlNjaGVtYTQpIHtcbiAgICBjb25zdCBvcmlnaW5hbE5hbWUgPSBuYW1lO1xuXG4gICAgLy8gaWYgbmFtZSBpcyBub3QgY2FtZWxDYXNlLCBjb252ZXJ0IGl0IHRvIGNhbWVsIGNhc2UsIGJ1dCB0aGlzIGlzIGxpa2VseSB0b1xuICAgIC8vIHByb2R1Y2UgaW52YWxpZCBvdXRwdXQgZHVyaW5nIHN5bnRoZXNpcywgc28gYWRkIHNvbWUgYW5ub3RhdGlvbiB0byB0aGUgZG9jcy5cbiAgICBpZiAobmFtZVswXSA9PT0gbmFtZVswXS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBuYW1lID0gY2FtZWxDYXNlKG5hbWUpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoICckJyAobGlrZSAkcmVmIG9yICRzY2hlbWEpLCB3ZSByZW1vdmUgdGhlIFwiJFwiXG4gICAgLy8gYW5kIGl0J3MgdGhlIHNhbWUgZGVhbCAtIHdpbGwgcHJvZHVjZSBpbnZhbGlkIG91dHB1dFxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJyQnKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdERlc2NyaXB0aW9uKGNvZGUsIGAke3N0cnVjdEZxbn0jJHtvcmlnaW5hbE5hbWV9YCwgcHJvcERlZi5kZXNjcmlwdGlvbik7XG4gICAgY29uc3QgcHJvcGVydHlUeXBlID0gdGhpcy50eXBlRm9yUHJvcGVydHkoYCR7c3RydWN0RnFufS4ke25hbWV9YCwgcHJvcERlZik7XG4gICAgY29uc3QgcmVxdWlyZWQgPSB0aGlzLmlzUHJvcGVydHlSZXF1aXJlZChuYW1lLCBzdHJ1Y3REZWYpO1xuICAgIGNvbnN0IG9wdGlvbmFsID0gcmVxdWlyZWQgPyAnJyA6ICc/JztcblxuICAgIGNvZGUubGluZShgcmVhZG9ubHkgJHtuYW1lfSR7b3B0aW9uYWx9OiAke3Byb3BlcnR5VHlwZX07YCk7XG4gICAgY29kZS5saW5lKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRFbnVtKHR5cGVOYW1lOiBzdHJpbmcsIGRlZjogSlNPTlNjaGVtYTQsIHN0cnVjdEZxbjogc3RyaW5nKSB7XG5cbiAgICB0aGlzLmFkZENvZGUodHlwZU5hbWUsIGNvZGUgPT4ge1xuXG4gICAgICBpZiAoIWRlZi5lbnVtIHx8IGRlZi5lbnVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGRlZmluaXRpb24gaXMgbm90IGFuIGVudW06ICR7SlNPTi5zdHJpbmdpZnkoZGVmKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZi50eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBvbmx5IGdlbmVyYXRlIHN0cmluZyBlbnVtcycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXREZXNjcmlwdGlvbihjb2RlLCBzdHJ1Y3RGcW4sIGRlZi5kZXNjcmlwdGlvbik7XG5cbiAgICAgIGNvZGUub3BlbkJsb2NrKGBleHBvcnQgZW51bSAke3R5cGVOYW1lfWApO1xuXG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGRlZi5lbnVtKSB7XG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG9ubHkgZ2VuZXJhdGUgZW51bXMgZm9yIHN0cmluZyB2YWx1ZXMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNsdWdnaWZ5IGFuZCB0dXJuIHRvIFVQUEVSX1NOQUtFX0NBU0VcbiAgICAgICAgY29uc3QgbWVtYmVyTmFtZSA9IHNuYWtlQ2FzZSh2YWx1ZS5yZXBsYWNlKC9bXmEtejAtOV0vZ2ksICdfJykpLnNwbGl0KCdfJykuZmlsdGVyKHggPT4geCkuam9pbignXycpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgY29kZS5saW5lKGAvKiogJHt2YWx1ZX0gKi9gKTtcbiAgICAgICAgY29kZS5saW5lKGAke21lbWJlck5hbWV9ID0gXCIke3ZhbHVlfVwiLGApO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0eXBlTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdERlc2NyaXB0aW9uKGNvZGU6IENvZGUsIGZxbjogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZywgYW5ub3RhdGlvbnM6IHsgW3R5cGU6IHN0cmluZ106IHN0cmluZyB9ID0geyB9KSB7XG4gICAgY29kZS5saW5lKCcvKionKTtcblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKC9cXCpcXC8vZywgJ18vJyk7XG5cbiAgICAgIGNvbnN0IGV4dHJhY3REZWZhdWx0ID0gL0RlZmF1bHRzP1xcVysodG98aXMpXFxXKyguKykvZy5leGVjKGRlc2NyaXB0aW9uKTtcbiAgICAgIGNvbnN0IGRlZiA9IGV4dHJhY3REZWZhdWx0ICYmIGV4dHJhY3REZWZhdWx0WzJdO1xuXG4gICAgICBjb2RlLmxpbmUoYCAqICR7ZGVzY3JpcHRpb259YCk7XG4gICAgICBpZiAoZGVmKSB7XG4gICAgICAgIGFubm90YXRpb25zLmRlZmF1bHQgPSBkZWY7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZSgnIConKTtcbiAgICB9XG5cbiAgICBhbm5vdGF0aW9ucy5zY2hlbWEgPSBmcW47XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYW5ub3RhdGlvbnMpKSB7XG4gICAgICBjb2RlLmxpbmUoYCAqIEAke3R5cGV9ICR7dmFsdWV9YCk7XG4gICAgfVxuXG4gICAgY29kZS5saW5lKCcgKi8nKTtcbiAgfVxuXG4gIHByaXZhdGUgdHlwZUZvclByb3BlcnR5KHByb3BlcnR5RnFuOiBzdHJpbmcsIGRlZjogSlNPTlNjaGVtYTQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnR5cGUgPSBUeXBlR2VuZXJhdG9yLm5vcm1hbGl6ZVR5cGVOYW1lKHByb3BlcnR5RnFuLnNwbGl0KCcuJykubWFwKHggPT4gcGFzY2FsQ2FzZSh4KSkuam9pbignJykpO1xuICAgIHJldHVybiB0aGlzLmVtaXRUeXBlKHN1YnR5cGUsIGRlZiwgc3VidHlwZSk7XG4gIH1cblxuICBwcml2YXRlIHR5cGVGb3JSZWYoZGVmOiBKU09OU2NoZW1hNCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gJyMvZGVmaW5pdGlvbnMvJztcbiAgICBpZiAoIWRlZi4kcmVmIHx8ICFkZWYuJHJlZi5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCAkcmVmICR7SlNPTi5zdHJpbmdpZnkoZGVmKX1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0V4Y2x1ZGVkKGRlZi4kcmVmKSkge1xuICAgICAgcmV0dXJuICdhbnknO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBzID0gZGVmLiRyZWYuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgdHlwZU5hbWUgPSBUeXBlR2VuZXJhdG9yLm5vcm1hbGl6ZVR5cGVOYW1lKGNvbXBzW2NvbXBzLmxlbmd0aCAtIDFdKTtcblxuICAgIC8vIGlmIHdlIGFscmVhZHkgZW1pdHRlZCBhIHR5cGUgd2l0aCB0aGlzIHR5cGUgbmFtZSwganVzdCByZXR1cm4gaXRcbiAgICBpZiAodGhpcy5lbWl0dGVkVHlwZXMuaGFzKHR5cGVOYW1lKSkge1xuICAgICAgcmV0dXJuIHR5cGVOYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMucmVzb2x2ZVJlZmVyZW5jZShkZWYpO1xuICAgIHJldHVybiB0aGlzLmVtaXRUeXBlKHR5cGVOYW1lLCBzY2hlbWEsIGRlZi4kcmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgdHlwZUZvckFycmF5KHByb3BlcnR5RnFuOiBzdHJpbmcsIGRlZjogSlNPTlNjaGVtYTQpOiBzdHJpbmcge1xuICAgIGlmICghZGVmLml0ZW1zIHx8IHR5cGVvZihkZWYuaXRlbXMpICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhcnJheSB0eXBlICR7ZGVmLml0ZW1zfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnR5cGVGb3JQcm9wZXJ0eShwcm9wZXJ0eUZxbiwgZGVmLml0ZW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVJlZmVyZW5jZShkZWY6IEpTT05TY2hlbWE0KTogSlNPTlNjaGVtYTQge1xuICAgIGNvbnN0IHJlZiA9IGRlZi4kcmVmO1xuICAgIGlmICghcmVmIHx8ICFyZWYuc3RhcnRzV2l0aChERUZJTklUSU9OU19QUkVGSVgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBhIGxvY2FsIHJlZmVyZW5jZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvb2t1cCA9IHJlZi5zdWJzdHIoREVGSU5JVElPTlNfUFJFRklYLmxlbmd0aCk7XG4gICAgY29uc3QgZm91bmQgPSB0aGlzLmRlZmluaXRpb25zW2xvb2t1cF07XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmFibGUgdG8gZmluZCBhIGRlZmluaXRpb24gZm9yIHRoZSAkcmVmIFwiJHtsb29rdXB9XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGlzUHJvcGVydHlSZXF1aXJlZChwcm9wZXJ0eTogc3RyaW5nLCBzdHJ1Y3REZWY6IEpTT05TY2hlbWE0KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc3RydWN0RGVmLnJlcXVpcmVkKSAmJiBzdHJ1Y3REZWYucmVxdWlyZWQuaW5jbHVkZXMocHJvcGVydHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0V4Y2x1ZGVkKGZxbjogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuZXhjbHVkZSkge1xuICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xuICAgICAgaWYgKHJlLnRlc3QoZnFuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydGVkVW5pb25PcHRpb25UeXBlKHR5cGU6IGFueSk6IHR5cGUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGUgJiYgKHR5cGVvZih0eXBlKSA9PT0gJ3N0cmluZycgJiYgUFJJTUlUSVZFX1RZUEVTLmluY2x1ZGVzKHR5cGUpKTtcbn1cblxuZnVuY3Rpb24gcGFzY2FsQ2FzZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY2FtZWxDYXNlKHMsIHsgcGFzY2FsQ2FzZTogdHJ1ZSB9KTtcbn0iXX0=

2

package.json

@@ -124,3 +124,3 @@ {

},
"version": "0.1.103",
"version": "0.1.104",
"jest": {

@@ -127,0 +127,0 @@ "clearMocks": true,

@@ -27,3 +27,4 @@ # json2jsii

g.addType('Person', {
// definitions can also be added like this:
g.addDefinition('Person', {
required: [ 'name' ],

@@ -42,2 +43,5 @@ properties: {

// this will emit the specified type & recursively all the referenced types.
g.emitType('Person');
fs.writeFileSync('gen/ts/person.ts', await g.render());

@@ -91,2 +95,31 @@ ```

## Use cases
### Type aliases
It is possible to offer an alias to a type definition using `addAlias(from,
to)`. The type generator will resolve any references to the original type with
the alias:
```ts
const gen = new TypeGenerator();
gen.addDefinition('TypeA', { type: 'object', properties: { ref: { $ref: '#/definitions/TypeB' } } } );
gen.addDefinition('TypeC', { type: 'object', properties: { field: { type: 'string' } } });
gen.addAlias('TypeB', 'TypeC');
gen.emitType('TypeA');
```
This will output:
```ts
interface TypeA {
readonly ref: TypeC;
}
interface TypeC {
readonly field: string;
}
```
## Language bindings

@@ -93,0 +126,0 @@

{
"version": "0.1.103"
"version": "0.1.104"
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc