UNPKG

jsii-docgen

Version:

generates api docs for jsii modules

419 lines 62.3 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TranspileBase = exports.TranspiledTypeReference = exports.TranspiledType = exports.UnsupportedLanguageError = exports.Language = void 0;
exports.submoduleRelName = submoduleRelName;
const schema_1 = require("../schema");
/**
 * Supported languages to generate documentation in.
 */
class Language {
    /**
     * Transform a literal string to the `Language` object.
     *
     * Throws an `UnsupportedLanguageError` if the language is not supported.
     */
    static fromString(lang) {
        switch (lang) {
            case Language.TYPESCRIPT.name:
            case Language.TYPESCRIPT.targetName:
                return Language.TYPESCRIPT;
            case Language.PYTHON.name:
            case Language.PYTHON.targetName:
                return Language.PYTHON;
            case Language.JAVA.name:
            case Language.JAVA.targetName:
                return Language.JAVA;
            case Language.CSHARP.name:
            case Language.CSHARP.targetName:
                return Language.CSHARP;
            case Language.GO.name:
            case Language.GO.targetName:
                return Language.GO;
            default:
                throw new UnsupportedLanguageError(lang, Language.values());
        }
    }
    static values() {
        return [Language.TYPESCRIPT, Language.PYTHON, Language.JAVA, Language.CSHARP, Language.GO];
    }
    constructor({ name, targetName = name, validator }) {
        this.name = name;
        this.targetName = targetName;
        this.validator = validator;
    }
    isValidConfiguration(config) {
        // TypeScript does not need configuration, all other languages do
        if (config == null) {
            return this === Language.TYPESCRIPT;
        }
        return this.validator(config);
    }
    toString() {
        return this.name;
    }
}
exports.Language = Language;
/**
 * TypeScript.
 */
Language.TYPESCRIPT = new Language({ name: 'typescript', validator: () => true });
/**
 * Python.
 */
Language.PYTHON = new Language({ name: 'python', validator: validatePythonConfig });
/**
 * Java.
 */
Language.JAVA = new Language({ name: 'java', validator: validateJavaConfig });
/**
 * C#
 */
Language.CSHARP = new Language({ name: 'csharp', targetName: 'dotnet', validator: validateDotNetConfig });
/**
 *
 * Go
 */
Language.GO = new Language({ name: 'go', targetName: 'go', validator: validateGoConfig });
function validateDotNetConfig(config) {
    // See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/dotnet/
    return typeof config.namespace === 'string' && typeof config.packageId === 'string';
}
function validateJavaConfig(config) {
    var _a, _b;
    // See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/java/
    return typeof config.package === 'string' && typeof ((_a = config.maven) === null || _a === void 0 ? void 0 : _a.groupId) === 'string' && typeof ((_b = config.maven) === null || _b === void 0 ? void 0 : _b.artifactId) === 'string';
}
function validatePythonConfig(config) {
    // See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/python/
    return typeof config.module === 'string' && typeof config.distName === 'string';
}
function validateGoConfig(config) {
    // See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/go/
    return typeof config.moduleName === 'string';
}
class UnsupportedLanguageError extends Error {
    constructor(lang, supported) {
        super(`Unsupported language: ${lang}. Supported languages are: [${supported}]`);
    }
}
exports.UnsupportedLanguageError = UnsupportedLanguageError;
/**
 * Outcome of transpiling a generic jsii type.
 */
class TranspiledType {
    constructor(options) {
        this.source = options.source;
        this.language = options.language;
        this.fqn = options.fqn;
        this.name = options.name;
        this.namespace = options.namespace;
        this.module = options.module;
        this.submodule = options.submodule;
        this.submodulePath = options.submodulePath;
    }
    toJson() {
        return (0, schema_1.filterUndefined)({
            fqn: this.fqn,
            displayName: this.name,
            id: this.source.fqn,
            packageName: this.source.assembly.name,
            packageVersion: this.source.assembly.version,
            submodule: this.submodulePath,
        });
    }
}
exports.TranspiledType = TranspiledType;
/**
 * Outcome of transpiling a jsii type reference.
 */
class TranspiledTypeReference {
    /**
     * Create a type reference that represents a primitive.
     */
    static primitive(transpile, ref, primitive) {
        return new TranspiledTypeReference(transpile, ref, primitive);
    }
    /**
     * Create a type reference that represents any type.
     */
    static any(transpile, ref) {
        return new TranspiledTypeReference(transpile, ref, undefined, true);
    }
    /**
     * Create a type reference that represents the void (return) type.
     */
    static void(transpile, ref) {
        return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, undefined, undefined, undefined, true);
    }
    /**
     * Create a type reference that represents a concrete type.
     */
    static type(transpile, ref, type) {
        return new TranspiledTypeReference(transpile, ref, undefined, undefined, type);
    }
    /**
     * Create a type reference that represents an array of a type reference.
     */
    static arrayOfType(transpile, ref, tf) {
        return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, tf);
    }
    /**
     * Create a type reference that represents a map of a type reference.
     */
    static mapOfType(transpile, ref, tf) {
        return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, undefined, tf);
    }
    /**
     * Create a type reference that represents a union of a type references.
     */
    static unionOfTypes(transpile, ref, tfs) {
        return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, undefined, undefined, tfs);
    }
    constructor(
    /**
     * A transpiler
     */
    transpile, 
    /**
     * The original type reference.
     */
    ref, 
    /**
     * Primitive type ref.
     */
    primitive, 
    /**
     * 'Any' type ref
     */
    isAny, 
    /**
     * Concrete type.
     */
    type, 
    /**
     * Array of ref.
     */
    arrayOfType, 
    /**
     * Map of ref.
     */
    mapOfType, 
    /**
     * Union of ref.
     */
    unionOfTypes, 
    /**
     * 'Void' type ref.
     */
    isVoid) {
        this.transpile = transpile;
        this.ref = ref;
        this.primitive = primitive;
        this.isAny = isAny;
        this.type = type;
        this.arrayOfType = arrayOfType;
        this.mapOfType = mapOfType;
        this.unionOfTypes = unionOfTypes;
        this.isVoid = isVoid;
    }
    toString(options) {
        var _a, _b;
        const tFormatter = (_a = options === null || options === void 0 ? void 0 : options.typeFormatter) !== null && _a !== void 0 ? _a : ((t) => t.fqn);
        const sFormatter = (_b = options === null || options === void 0 ? void 0 : options.stringFormatter) !== null && _b !== void 0 ? _b : ((s) => s);
        if (this.primitive) {
            return sFormatter(this.primitive);
        }
        if (this.type) {
            return tFormatter(this.type);
        }
        if (this.isAny) {
            return sFormatter(this.transpile.any());
        }
        if (this.arrayOfType) {
            const ref = this.arrayOfType.toString(options);
            return this.transpile.listOf(ref);
        }
        if (this.mapOfType) {
            const ref = this.mapOfType.toString(options);
            return this.transpile.mapOf(ref);
        }
        if (this.unionOfTypes) {
            const refs = this.unionOfTypes.map((t) => t.toString(options));
            return this.transpile.unionOf(refs);
        }
        if (this.isVoid) {
            return sFormatter(this.transpile.void());
        }
        throw new Error(`Invalid type reference: ${this.ref.toString()}`);
    }
    toJson() {
        if (this.primitive) {
            return {
                formattingPattern: this.primitive,
            };
        }
        if (this.type) {
            if (!this.ref.fqn) {
                throw new Error(`Original type reference for ${this.type.fqn} does not have a fqn.`);
            }
            // If we are running in a test, report a fake stable version since types
            // may belong to dependency packages, which could be specified with caret
            // dependencies - this means the packageVersion of a type like
            // `construct.Construct` will be set to whichever version is installed.
            // This is okay in practice, but makes snapshot tests inconsistent.
            const IS_TEST_RUN = process.env.NODE_ENV === 'test';
            const packageVersion = IS_TEST_RUN ? '99.99.99' : this.type.source.assembly.version;
            return {
                formattingPattern: '%',
                types: [
                    (0, schema_1.filterUndefined)({
                        id: this.ref.fqn,
                        displayName: this.type.name,
                        fqn: this.type.fqn,
                        packageName: this.type.source.assembly.name,
                        packageVersion,
                        submodule: this.type.submodulePath,
                    }),
                ],
            };
        }
        if (this.isAny) {
            return {
                formattingPattern: this.transpile.any(),
            };
        }
        if (this.arrayOfType) {
            return {
                formattingPattern: this.transpile.listOf('%'),
                types: [this.arrayOfType.toJson()],
            };
        }
        if (this.mapOfType) {
            return {
                formattingPattern: this.transpile.mapOf('%'),
                types: [this.mapOfType.toJson()],
            };
        }
        if (this.unionOfTypes) {
            const inner = Array(this.unionOfTypes.length).fill('%');
            return {
                formattingPattern: this.transpile.unionOf(inner),
                types: this.unionOfTypes.map((t) => t.toJson()),
            };
        }
        throw new Error(`Invalid type reference: ${this.ref.toString()}`);
    }
}
exports.TranspiledTypeReference = TranspiledTypeReference;
/**
 * Common functionality between different transpilers.
 */
class TranspileBase {
    constructor(language) {
        this.language = language;
        this.parentModulesCache = new Map();
        this.submodulesCache = new Map();
    }
    typeReference(ref) {
        if (ref.type) {
            const transpiled = this.type(ref.type);
            return TranspiledTypeReference.type(this, ref, transpiled);
        }
        if (ref.unionOfTypes) {
            const transpiled = ref.unionOfTypes.map((t) => this.typeReference(t));
            return TranspiledTypeReference.unionOfTypes(this, ref, transpiled);
        }
        if (ref.arrayOfType) {
            const transpiled = this.typeReference(ref.arrayOfType);
            return TranspiledTypeReference.arrayOfType(this, ref, transpiled);
        }
        if (ref.mapOfType) {
            const transpiled = this.typeReference(ref.mapOfType);
            return TranspiledTypeReference.mapOfType(this, ref, transpiled);
        }
        if (ref.isAny) {
            return TranspiledTypeReference.any(this, ref);
        }
        if (ref.primitive) {
            let transpiled;
            switch (ref.primitive) {
                case 'string':
                    transpiled = this.str();
                    break;
                case 'boolean':
                    transpiled = this.boolean();
                    break;
                case 'number':
                    transpiled = this.number();
                    break;
                case 'date':
                    transpiled = this.date();
                    break;
                case 'json':
                    transpiled = this.json();
                    break;
                default:
                    throw new Error(`Unsupported primitive type '${ref.primitive}'`);
            }
            return TranspiledTypeReference.primitive(this, ref, transpiled);
        }
        if (ref.void) {
            return TranspiledTypeReference.void(this, ref);
        }
        throw new Error(`Unsupported type: ${ref.toString()}`);
    }
    findSubmodule(type) {
        if (this.submodulesCache.has(type.fqn)) {
            return this.submodulesCache.get(type.fqn);
        }
        let submodule = undefined;
        if (type.namespace) {
            // if the type is in a submodule, the submodule name is the first
            // part of the namespace. we construct the full submodule fqn and search for it.
            const submoduleFqn = `${type.assembly.name}.${type.namespace.split('.')[0]}`;
            const submodules = type.assembly.allSubmodules.filter((s) => s.fqn === submoduleFqn);
            if (submodules.length > 1) {
                // can never happen, but the array data structure forces this handling.
                throw new Error(`Found multiple submodules with fqn ${submoduleFqn}`);
            }
            if (submodules.length === 0) {
                submodule = undefined;
            }
            // type is inside this submodule.
            submodule = submodules[0];
        }
        this.submodulesCache.set(type.fqn, submodule);
        return submodule;
    }
    getParentModule(moduleLike) {
        const cached = this.parentModulesCache.get(moduleLike.fqn);
        if (cached)
            return cached;
        const types = moduleLike.types;
        if (types.length === 0) {
            throw new Error(`unable to determine assembly since module does not have any types: ${moduleLike.fqn}`);
        }
        const parent = types[0].assembly;
        this.parentModulesCache.set(moduleLike.fqn, parent);
        return parent;
    }
    optionalityCompare(p1, p2) {
        if (!p1.optional && p2.optional) {
            return -1;
        }
        if (!p2.optional && p1.optional) {
            return 1;
        }
        return 0;
    }
}
exports.TranspileBase = TranspileBase;
/**
 * Return the root-relative name for a submodule
 *
 * Ex: for a submodule `asm.sub1.sub2`, return `sub1.sub2`.
 */
function submoduleRelName(submodule) {
    return submodule.fqn.split('.').slice(1).join('.');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RvY2dlbi90cmFuc3BpbGUvdHJhbnNwaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWc1QkEsNENBRUM7QUFqNUJELHNDQUFvRTtBQUVwRTs7R0FFRztBQUNILE1BQWEsUUFBUTtJQTJCbkI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBWTtRQUNuQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUM5QixLQUFLLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVTtnQkFDakMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQzdCLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQzdCLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN6QixLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3hCLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVO2dCQUMzQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdkIsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMxQixLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDN0IsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3pCLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDdEIsS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDLFVBQVU7Z0JBQ3pCLE9BQU8sUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyQjtnQkFDRSxNQUFNLElBQUksd0JBQXdCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lB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QU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHsgZmlsdGVyVW5kZWZpbmVkLCBKc2lpRW50aXR5LCBUeXBlU2NoZW1hIH0gZnJvbSAnLi4vc2NoZW1hJztcblxuLyoqXG4gKiBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIHRvIGdlbmVyYXRlIGRvY3VtZW50YXRpb24gaW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW5ndWFnZSB7XG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFU0NSSVBUID0gbmV3IExhbmd1YWdlKHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB2YWxpZGF0b3I6ICgpID0+IHRydWUgfSk7XG5cbiAgLyoqXG4gICAqIFB5dGhvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFlUSE9OID0gbmV3IExhbmd1YWdlKHsgbmFtZTogJ3B5dGhvbicsIHZhbGlkYXRvcjogdmFsaWRhdGVQeXRob25Db25maWcgfSk7XG5cbiAgLyoqXG4gICAqIEphdmEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEpBVkEgPSBuZXcgTGFuZ3VhZ2UoeyBuYW1lOiAnamF2YScsIHZhbGlkYXRvcjogdmFsaWRhdGVKYXZhQ29uZmlnIH0pO1xuXG4gIC8qKlxuICAgKiBDI1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDU0hBUlAgPSBuZXcgTGFuZ3VhZ2UoeyBuYW1lOiAnY3NoYXJwJywgdGFyZ2V0TmFtZTogJ2RvdG5ldCcsIHZhbGlkYXRvcjogdmFsaWRhdGVEb3ROZXRDb25maWcgfSk7XG5cbiAgLyoqXG4gICAqXG4gICAqIEdvXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdPID0gbmV3IExhbmd1YWdlKHsgbmFtZTogJ2dvJywgdGFyZ2V0TmFtZTogJ2dvJywgdmFsaWRhdG9yOiB2YWxpZGF0ZUdvQ29uZmlnIH0pO1xuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gYSBsaXRlcmFsIHN0cmluZyB0byB0aGUgYExhbmd1YWdlYCBvYmplY3QuXG4gICAqXG4gICAqIFRocm93cyBhbiBgVW5zdXBwb3J0ZWRMYW5ndWFnZUVycm9yYCBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHN1cHBvcnRlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyhsYW5nOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKGxhbmcpIHtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuVFlQRVNDUklQVC5uYW1lOlxuICAgICAgY2FzZSBMYW5ndWFnZS5UWVBFU0NSSVBULnRhcmdldE5hbWU6XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5UWVBFU0NSSVBUO1xuICAgICAgY2FzZSBMYW5ndWFnZS5QWVRIT04ubmFtZTpcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuUFlUSE9OLnRhcmdldE5hbWU6XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5QWVRIT047XG4gICAgICBjYXNlIExhbmd1YWdlLkpBVkEubmFtZTpcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuSkFWQS50YXJnZXROYW1lOlxuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuSkFWQTtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuQ1NIQVJQLm5hbWU6XG4gICAgICBjYXNlIExhbmd1YWdlLkNTSEFSUC50YXJnZXROYW1lOlxuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuQ1NIQVJQO1xuICAgICAgY2FzZSBMYW5ndWFnZS5HTy5uYW1lOlxuICAgICAgY2FzZSBMYW5ndWFnZS5HTy50YXJnZXROYW1lOlxuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuR087XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRMYW5ndWFnZUVycm9yKGxhbmcsIExhbmd1YWdlLnZhbHVlcygpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHZhbHVlcygpIHtcbiAgICByZXR1cm4gW0xhbmd1YWdlLlRZUEVTQ1JJUFQsIExhbmd1YWdlLlBZVEhPTiwgTGFuZ3VhZ2UuSkFWQSwgTGFuZ3VhZ2UuQ1NIQVJQLCBMYW5ndWFnZS5HT107XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcjogKGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICB7IG5hbWUsIHRhcmdldE5hbWUgPSBuYW1lLCB2YWxpZGF0b3IgfToge1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdGFyZ2V0TmFtZT86IHN0cmluZztcbiAgICAgIHZhbGlkYXRvcjogKGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lO1xuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIGlzVmFsaWRDb25maWd1cmF0aW9uKGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAvLyBUeXBlU2NyaXB0IGRvZXMgbm90IG5lZWQgY29uZmlndXJhdGlvbiwgYWxsIG90aGVyIGxhbmd1YWdlcyBkb1xuICAgIGlmIChjb25maWcgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMgPT09IExhbmd1YWdlLlRZUEVTQ1JJUFQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yKGNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRG90TmV0Q29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW4ge1xuICAvLyBTZWU6IGh0dHBzOi8vYXdzLmdpdGh1Yi5pby9qc2lpL3VzZXItZ3VpZGVzL2xpYi1hdXRob3IvY29uZmlndXJhdGlvbi90YXJnZXRzL2RvdG5ldC9cbiAgcmV0dXJuIHR5cGVvZiBjb25maWcubmFtZXNwYWNlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgY29uZmlnLnBhY2thZ2VJZCA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSmF2YUNvbmZpZyhjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuIHtcbiAgLy8gU2VlOiBodHRwczovL2F3cy5naXRodWIuaW8vanNpaS91c2VyLWd1aWRlcy9saWItYXV0aG9yL2NvbmZpZ3VyYXRpb24vdGFyZ2V0cy9qYXZhL1xuICByZXR1cm4gdHlwZW9mIGNvbmZpZy5wYWNrYWdlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgY29uZmlnLm1hdmVuPy5ncm91cElkID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgY29uZmlnLm1hdmVuPy5hcnRpZmFjdElkID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQeXRob25Db25maWcoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gIC8vIFNlZTogaHR0cHM6Ly9hd3MuZ2l0aHViLmlvL2pzaWkvdXNlci1ndWlkZXMvbGliLWF1dGhvci9jb25maWd1cmF0aW9uL3RhcmdldHMvcHl0aG9uL1xuICByZXR1cm4gdHlwZW9mIGNvbmZpZy5tb2R1bGUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBjb25maWcuZGlzdE5hbWUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdvQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW4ge1xuICAvLyBTZWU6IGh0dHBzOi8vYXdzLmdpdGh1Yi5pby9qc2lpL3VzZXItZ3VpZGVzL2xpYi1hdXRob3IvY29uZmlndXJhdGlvbi90YXJnZXRzL2dvL1xuICByZXR1cm4gdHlwZW9mIGNvbmZpZy5tb2R1bGVOYW1lID09PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkTGFuZ3VhZ2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobGFuZzogc3RyaW5nLCBzdXBwb3J0ZWQ6IExhbmd1YWdlW10pIHtcbiAgICBzdXBlcihgVW5zdXBwb3J0ZWQgbGFuZ3VhZ2U6ICR7bGFuZ30uIFN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOiBbJHtzdXBwb3J0ZWR9XWApO1xuICB9XG59XG5cbi8qKlxuICogT3V0Y29tZSBvZiB0cmFuc3BpbGluZyBhIGpzaWkgc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcGlsZWRTdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVHJhbnNwaWxlZFR5cGU7XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbXBvcnQgc3RhdGVtZW50IG5lZWRlZCBpbiBvcmRlciB0byB1c2UgdGhpcyBzdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBpbXBvcnQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEhvdyB0byBpbml0aWFsaXplIHRoaXMgc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbGl6YXRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBjbGFzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkQ2xhc3Mge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVHJhbnNwaWxlZFR5cGU7XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBjYWxsYWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkQ2FsbGFibGUge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSBwYXJlbnQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudFR5cGU6IFRyYW5zcGlsZWRUeXBlO1xuICAvKipcbiAgICogSG93IGEgc2lnbmF0dXJlIG9mIHRoZSBjYWxsYWJsZSBsb29rcyBsaWtlLiBJbiBzb21lIGxhbmd1YWdlc1xuICAgKiAobGlrZSBKYXZhKSwgYSBjYWxsYWJsZSBtYXkgYmUgdHJhbnNsaXRlcmF0ZWQgdG8gbXVsdGlwbGUgb3ZlcmxvYWRlZFxuICAgKiBtZXRob2RzLCBzbyB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgc2lnbmF0dXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmF0dXJlczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbXBvcnQgc3RhdGVtZW50IG5lZWRlZCBpbiBvcmRlciB0byB1c2UgdGhpcyBjYWxsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydDogc3RyaW5nO1xuICAvKipcbiAgICogSG93IGEgaW52b2NhdGlvbnMgb2YgdGhpcyBjYWxsYWJsZSBsb29rIGxpa2UuIEluIHNvbWUgbGFuZ3VhZ2VzXG4gICAqIChsaWtlIEphdmEpLCBhIGNhbGxhYmxlIG1heSBiZSB0cmFuc2xpdGVyYXRlZCB0byBtdWx0aXBsZSBvdmVybG9hZGVkXG4gICAqIG1ldGhvZHMsIHNvIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnZvY2F0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGludm9jYXRpb25zOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBqc2lpIHBhcmFtZXRlcnMgdGhpcyBjYWxsYWJsZSBhY2NlcHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyczogcmVmbGVjdC5QYXJhbWV0ZXJbXTtcbiAgLyoqXG4gICAqIFRoZSAodHJhbnNwaWxlZCkgcmV0dXJuIHR5cGUgLSB0aGlzIGlzIHVuZGVmaW5lZCBpZiB2b2lkIG9yIGluaXRpYWxpemVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0dXJuVHlwZT86IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlO1xufVxuXG4vKipcbiAqIE91dGNvbWUgb2YgdHJhbnNwaWxpbmcgYSBqc2lpIHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkUGFyYW1ldGVyIGV4dGVuZHMgVHJhbnNwaWxlZFByb3BlcnR5IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwYXJhbWV0ZXIgaXMgdmFyaWFkaWMuXG4gICAqL1xuICByZWFkb25seSB2YXJpYWRpYzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBpbnRlcmZhY2UgKG5vdCBkYXRhIHR5cGUpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcGlsZWRJbnRlcmZhY2Uge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVHJhbnNwaWxlZFR5cGU7XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEgZ2VuZXJpYyBqc2lpIHR5cGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc3BpbGVkVHlwZSB7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgdHlwZSB0aGlzIHdhcyB0cmFuc2xpdGVyYXRlZCBmcm9tLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZTogcmVmbGVjdC5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJhbnNsaXRlcmF0aW9uIGxhbmd1YWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhbmd1YWdlOiBMYW5ndWFnZTtcblxuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIHNwZWNpZmljIGZxbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmcW46IHN0cmluZztcbiAgLyoqXG4gICAqIFNpbXBsZSBuYW1lIG9mIHRoZSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIE5hbWVzcGFjZSBvZiB0aGUgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgbW9kdWxlIG5hbWUgdGhlIHR5cGUgYmVsb25ncyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2R1bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBzcGVjaWZpYyBzdWJtb2R1bGUgbmFtZSB0aGUgdHlwZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1Ym1vZHVsZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZS1pbmRlcGVuZGVudCBuYW1lIG9mIHRoZSBzdWJtb2R1bGUgdGhlIHR5cGUgYmVsb25ncyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdWJtb2R1bGVQYXRoPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgc291cmNlOiByZWZsZWN0LlR5cGU7XG4gICAgbGFuZ3VhZ2U6IExhbmd1YWdlO1xuICAgIGZxbjogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gICAgbW9kdWxlOiBzdHJpbmc7XG4gICAgc3VibW9kdWxlPzogc3RyaW5nO1xuICAgIHN1Ym1vZHVsZVBhdGg/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0aGlzLnNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICAgIHRoaXMubGFuZ3VhZ2UgPSBvcHRpb25zLmxhbmd1YWdlO1xuICAgIHRoaXMuZnFuID0gb3B0aW9ucy5mcW47XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgIHRoaXMubmFtZXNwYWNlID0gb3B0aW9ucy5uYW1lc3BhY2U7XG4gICAgdGhpcy5tb2R1bGUgPSBvcHRpb25zLm1vZHVsZTtcbiAgICB0aGlzLnN1Ym1vZHVsZSA9IG9wdGlvbnMuc3VibW9kdWxlO1xuICAgIHRoaXMuc3VibW9kdWxlUGF0aCA9IG9wdGlvbnMuc3VibW9kdWxlUGF0aDtcbiAgfVxuXG4gIHRvSnNvbigpOiBKc2lpRW50aXR5IHtcbiAgICByZXR1cm4gZmlsdGVyVW5kZWZpbmVkKHtcbiAgICAgIGZxbjogdGhpcy5mcW4sXG4gICAgICBkaXNwbGF5TmFtZTogdGhpcy5uYW1lLFxuICAgICAgaWQ6IHRoaXMuc291cmNlLmZxbixcbiAgICAgIHBhY2thZ2VOYW1lOiB0aGlzLnNvdXJjZS5hc3NlbWJseS5uYW1lLFxuICAgICAgcGFja2FnZVZlcnNpb246IHRoaXMuc291cmNlLmFzc2VtYmx5LnZlcnNpb24sXG4gICAgICBzdWJtb2R1bGU6IHRoaXMuc3VibW9kdWxlUGF0aCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGhvdyB0byByZW5kZXIgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZVRvU3RyaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUeXBlIGZvcm1hdHRlci5cbiAgICovXG4gIHR5cGVGb3JtYXR0ZXI/OiAodHlwZTogVHJhbnNwaWxlZFR5cGUpID0+IHN0cmluZztcbiAgLyoqXG4gICAqIFN0cmluZyBmb3JtYXR0ZXIuXG4gICAqL1xuICBzdHJpbmdGb3JtYXR0ZXI/OiAodHlwZU5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIE91dGNvbWUgb2YgdHJhbnNwaWxpbmcgYSBqc2lpIHR5cGUgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJpbWl0aXZlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwcmltaXRpdmUoXG4gICAgdHJhbnNwaWxlOiBUcmFuc3BpbGUsXG4gICAgcmVmOiByZWZsZWN0LlR5cGVSZWZlcmVuY2UsXG4gICAgcHJpbWl0aXZlOiBzdHJpbmcsXG4gICk6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlKHRyYW5zcGlsZSwgcmVmLCBwcmltaXRpdmUpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0eXBlIHJlZmVyZW5jZSB0aGF0IHJlcHJlc2VudHMgYW55IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFueShcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgKTogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UodHJhbnNwaWxlLCByZWYsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgdm9pZCAocmV0dXJuKSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2b2lkKFxuICAgIHRyYW5zcGlsZTogVHJhbnNwaWxlLFxuICAgIHJlZjogcmVmbGVjdC5UeXBlUmVmZXJlbmNlLFxuICApOiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZShcbiAgICAgIHRyYW5zcGlsZSxcbiAgICAgIHJlZixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgY29uY3JldGUgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHlwZShcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0eXBlOiBUcmFuc3BpbGVkVHlwZSxcbiAgKTogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UoXG4gICAgICB0cmFuc3BpbGUsXG4gICAgICByZWYsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0eXBlLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyBhbiBhcnJheSBvZiBhIHR5cGUgcmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhcnJheU9mVHlwZShcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0ZjogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICk6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlKFxuICAgICAgdHJhbnNwaWxlLFxuICAgICAgcmVmLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGYsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgbWFwIG9mIGEgdHlwZSByZWZlcmVuY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hcE9mVHlwZShcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0ZjogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICk6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlKFxuICAgICAgdHJhbnNwaWxlLFxuICAgICAgcmVmLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGYsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgdW5pb24gb2YgYSB0eXBlIHJlZmVyZW5jZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVuaW9uT2ZUeXBlcyhcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0ZnM6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlW10sXG4gICk6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlKFxuICAgICAgdHJhbnNwaWxlLFxuICAgICAgcmVmLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGZzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIEEgdHJhbnNwaWxlclxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNwaWxlOiBUcmFuc3BpbGUsXG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHR5cGUgcmVmZXJlbmNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmOiByZWZsZWN0LlR5cGVSZWZlcmVuY2UsXG4gICAgLyoqXG4gICAgICogUHJpbWl0aXZlIHR5cGUgcmVmLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpbWl0aXZlPzogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqICdBbnknIHR5cGUgcmVmXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBpc0FueT86IGJvb2xlYW4sXG4gICAgLyoqXG4gICAgICogQ29uY3JldGUgdHlwZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU/OiBUcmFuc3BpbGVkVHlwZSxcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiByZWYuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcnJheU9mVHlwZT86IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLFxuICAgIC8qKlxuICAgICAqIE1hcCBvZiByZWYuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXBPZlR5cGU/OiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSxcbiAgICAvKipcbiAgICAgKiBVbmlvbiBvZiByZWYuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB1bmlvbk9mVHlwZXM/OiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZVtdLFxuICAgIC8qKlxuICAgICAqICdWb2lkJyB0eXBlIHJlZi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzVm9pZD86IGJvb2xlYW4sXG4gICkge31cblxuICBwdWJsaWMgdG9TdHJpbmcob3B0aW9ucz86IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlVG9TdHJpbmdPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCB0Rm9ybWF0dGVyID0gb3B0aW9ucz8udHlwZUZvcm1hdHRlciA/PyAoKHQpID0+IHQuZnFuKTtcbiAgICBjb25zdCBzRm9ybWF0dGVyID0gb3B0aW9ucz8uc3RyaW5nRm9ybWF0dGVyID8/ICgocykgPT4gcyk7XG4gICAgaWYgKHRoaXMucHJpbWl0aXZlKSB7XG4gICAgICByZXR1cm4gc0Zvcm1hdHRlcih0aGlzLnByaW1pdGl2ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUpIHtcbiAgICAgIHJldHVybiB0Rm9ybWF0dGVyKHRoaXMudHlwZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQW55KSB7XG4gICAgICByZXR1cm4gc0Zvcm1hdHRlcih0aGlzLnRyYW5zcGlsZS5hbnkoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFycmF5T2ZUeXBlKSB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLmFycmF5T2ZUeXBlLnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNwaWxlLmxpc3RPZihyZWYpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXBPZlR5cGUpIHtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMubWFwT2ZUeXBlLnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNwaWxlLm1hcE9mKHJlZik7XG4gICAgfVxuICAgIGlmICh0aGlzLnVuaW9uT2ZUeXBlcykge1xuICAgICAgY29uc3QgcmVmcyA9IHRoaXMudW5pb25PZlR5cGVzLm1hcCgodCkgPT4gdC50b1N0cmluZyhvcHRpb25zKSk7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc3BpbGUudW5pb25PZihyZWZzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNWb2lkKSB7XG4gICAgICByZXR1cm4gc0Zvcm1hdHRlcih0aGlzLnRyYW5zcGlsZS52b2lkKCkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZSByZWZlcmVuY2U6ICR7dGhpcy5yZWYudG9TdHJpbmcoKX1gKTtcbiAgfVxuXG4gIHB1YmxpYyB0b0pzb24oKTogVHlwZVNjaGVtYSB7XG4gICAgaWYgKHRoaXMucHJpbWl0aXZlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXR0aW5nUGF0dGVybjogdGhpcy5wcmltaXRpdmUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUpIHtcbiAgICAgIGlmICghdGhpcy5yZWYuZnFuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT3JpZ2luYWwgdHlwZSByZWZlcmVuY2UgZm9yICR7dGhpcy50eXBlLmZxbn0gZG9lcyBub3QgaGF2ZSBhIGZxbi5gKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgaW4gYSB0ZXN0LCByZXBvcnQgYSBmYWtlIHN0YWJsZSB2ZXJzaW9uIHNpbmNlIHR5cGVzXG4gICAgICAvLyBtYXkgYmVsb25nIHRvIGRlcGVuZGVuY3kgcGFja2FnZXMsIHdoaWNoIGNvdWxkIGJlIHNwZWNpZmllZCB3aXRoIGNhcmV0XG4gICAgICAvLyBkZXBlbmRlbmNpZXMgLSB0aGlzIG1lYW5zIHRoZSBwYWNrYWdlVmVyc2lvbiBvZiBhIHR5cGUgbGlrZVxuICAgICAgLy8gYGNvbnN0cnVjdC5Db25zdHJ1Y3RgIHdpbGwgYmUgc2V0IHRvIHdoaWNoZXZlciB2ZXJzaW9uIGlzIGluc3RhbGxlZC5cbiAgICAgIC8vIFRoaXMgaXMgb2theSBpbiBwcmFjdGljZSwgYnV0IG1ha2VzIHNuYXBzaG90IHRlc3RzIGluY29uc2lzdGVudC5cbiAgICAgIGNvbnN0IElTX1RFU1RfUlVOID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JztcbiAgICAgIGNvbnN0IHBhY2thZ2VWZXJzaW9uID0gSVNfVEVTVF9SVU4gPyAnOTkuOTkuOTknIDogdGhpcy50eXBlLnNvdXJjZS5hc3NlbWJseS52ZXJzaW9uO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXR0aW5nUGF0dGVybjogJyUnLFxuICAgICAgICB0eXBlczogW1xuICAgICAgICAgIGZpbHRlclVuZGVmaW5lZCh7XG4gICAgICAgICAgICBpZDogdGhpcy5yZWYuZnFuLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMudHlwZS5uYW1lLFxuICAgICAgICAgICAgZnFuOiB0aGlzLnR5cGUuZnFuLFxuICAgICAgICAgICAgcGFja2FnZU5hbWU6IHRoaXMudHlwZS5zb3VyY2UuYXNzZW1ibHkubmFtZSxcbiAgICAgICAgICAgIHBhY2thZ2VWZXJzaW9uLFxuICAgICAgICAgICAgc3VibW9kdWxlOiB0aGlzLnR5cGUuc3VibW9kdWxlUGF0aCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNBbnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdHRpbmdQYXR0ZXJuOiB0aGlzLnRyYW5zcGlsZS5hbnkoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXJyYXlPZlR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdHRpbmdQYXR0ZXJuOiB0aGlzLnRyYW5zcGlsZS5saXN0T2YoJyUnKSxcbiAgICAgICAgdHlwZXM6IFt0aGlzLmFycmF5T2ZUeXBlLnRvSnNvbigpXSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLm1hcE9mVHlwZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0dGluZ1BhdHRlcm46IHRoaXMudHJhbnNwaWxlLm1hcE9mKCclJyksXG4gICAgICAgIHR5cGVzOiBbdGhpcy5tYXBPZlR5cGUudG9Kc29uKCldLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMudW5pb25PZlR5cGVzKSB7XG4gICAgICBjb25zdCBpbm5lciA9IEFycmF5KHRoaXMudW5pb25PZlR5cGVzLmxlbmd0aCkuZmlsbCgnJScpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0dGluZ1BhdHRlcm46IHRoaXMudHJhbnNwaWxlLnVuaW9uT2YoaW5uZXIpLFxuICAgICAgICB0eXBlczogdGhpcy51bmlvbk9mVHlwZXMubWFwKCh0KSA9PiB0LnRvSnNvbigpKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHR5cGUgcmVmZXJlbmNlOiAke3RoaXMucmVmLnRvU3RyaW5nKCl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkUHJvcGVydHkge1xuICAvKipcbiAgICogVGhlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgKHRyYW5zcGlsZWQpIHBhcmVudCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50VHlwZTogVHJhbnNwaWxlZFR5cGU7XG4gIC8qKlxuICAgKiBUaGUgKHRyYW5zcGlsZWQpIHR5cGUgcmVmZXJlbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZVJlZmVyZW5jZTogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2U7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgaXRzIGdldHRlciBpZiB0aGUgbGFuZ3VhZ2VcbiAgICogc3VwcG9ydHMgdGhhdC5cbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3V0Y29tZSBvZiB0cmFuc3BpbGluZyBhIGpzaWkgZW51bS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkRW51bSB7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgZnFuLlxuICAgKi9cbiAgcmVhZG9ubHkgZnFuOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEgc3BlY2lmaWMgZW51bSBtZW1iZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwaWxlZEVudW1NZW1iZXIge1xuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIHNwZWNpZmljIGZxbi5cbiAgICovXG4gIHJlYWRvbmx5IGZxbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3V0Y29tZSBvZiB0cmFuc3BpbGluZyBhIG1vZHVsZSBsaWtlIG9iamVjdC4gKEFzc2VtYmx5IHwgU3VibW9kdWxlKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcGlsZWRNb2R1bGVMaWtlIHtcbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBzcGVjaWZpYyBtb2R1bGUgbmFtZS5cbiAgICpcbiAgICogSW4gY2FzZSB0aGUgbW9kdWxlIGxpa2Ugb2JqZWN0IGlzIGEgc3VibW9kdWxlLCB0aGlzIHNob3VsZCBjb250YWluXG4gICAqIG9ubHkgdGhlIHJvb3QgbW9kdWxlIG5hbWUuXG4gICAqXG4gICAqIEluIGNhc2UgdGhlIG1vZHVsZSBsaWtlIG9iamVjdCBpcyB0aGUgcm9vdCBtb2R1bGUsIHRoaXMgc2hvdWxkIGNvbnRhaW5cbiAgICogdGhlIG1vZHVsZSBmcW4uXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKlxuICAgKiAgIGBhd3MtY2RrLWxpYmAgLT4gYGF3c19jZGtgXG4gICAqICAgYGF3cy1jZGstbGliLmF3c19la3NgIC0+IGBhd3NfY2RrYFxuICAgKiAgIGBAYXdzLWNkay9hd3MtZWtzYCAtPiBgYXdzX2Nkay5hd3NfZWtzYFxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIHNwZWNpZmljIHN1Ym1vZHVsZSBuYW1lLlxuICAgKlxuICAgKiBJbiBjYXNlIHRoZSBtb2R1bGUgbGlrZSBvYmplY3QgaXMgYSBzdWJtb2R1bGUsIHRoaXMgc2hvdWxkIGNvbnRhaW5cbiAgICogb25seSB0aGUgc3VibW9kdWxlIG5hbWUuXG4gICAqXG4gICAqIEluIGNhc2UgdGhlIG1vZHVsZSBsaWtlIG9iamVjdCBpcyB0aGUgcm9vdCBtb2R1bGUsIHRoaXMgc2hvdWxkIGJlIHVuZGVmaW5lZFxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICpcbiAgICogICBgYXdzLWNkay1saWJgIC0+IHVuZGVmaW5lZFxuICAgKiAgIGBhd3MtY2RrLWxpYi5hd3NfZWtzYCAtPiBgYXdzX2Vrc2BcbiAgICogICBgQGF3cy1jZGsvYXdzLWVrc2AgLT4gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBzdWJtb2R1bGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTGFuZ3VhZ2UgdHJhbnNwaWxpbmcgZm9yIGpzaWkgdHlwZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwaWxlIHtcbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBvZiB0aGUgdHJhbnNwaWxlci5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBMYW5ndWFnZTtcblxuICAvKipcbiAgICogSG93IGxpbmtzIHRvIHR5cGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0ICcje2Zxbn0nXG4gICAqL1xuICByZWFkb25seSBsaW5rRm9ybWF0dGVyPzogKHR5cGU6IFRyYW5zcGlsZWRUeXBlKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRyYW5zcGlsZSBhIG1vZHVsZSBsaWtlIG9iamVjdCAoQXNzZW1ibHkgfCBTdWJtb2R1bGUpXG4gICAqL1xuICBtb2R1bGVMaWtlKG1vZHVsZUxpa2U6IHJlZmxlY3QuTW9kdWxlTGlrZSk6IFRyYW5zcGlsZWRNb2R1bGVMaWtlO1xuXG4gIC8qKlxuICAgKiBUcmFuc3BpbGUgYSBjYWxsYWJsZSAobWV0aG9kLCBzdGF0aWMgZnVuY3Rpb24sIGluaXRpYWxpemVyKS5cbiAgICogSW4gc29tZSBsYW5ndWFnZXMgc3VjaCBhcyBKYXZhLCBhIHNpbmdsZSBjYWxsYWJsZSBtYXkgZ2VuZXJhdGUgbXVsdGlwbGVcbiAgICogb3ZlcmxvYWRlZCBtZXRob2RzIHRvIHN1cHBvcnQgb3B0aW9uYWwgcGFyYW1ldGVycy5cbiAgICovXG4gIGNhbGxhYmxlKGNhbGxhYmxlOiByZWZsZWN0LkNhbGxhYmxlKTogVHJhbnNwaWxlZENhbGxhYmxlO1xuXG4gIC8qKlxuICAgKiBUcmFuc3BpbGUgYSBjbGFzcy5cbiAgICovXG4gIGNsYXNzKGtsYXNzOiByZWZsZWN0LkNsYXNzVHlwZSk6IFRyYW5zcGlsZWRDbGFzcztcblxuICAvKipcbiAgICogVHJhbnNwaWxlIGEgc3RydWN0IChkYXRhIHR5cGUgaW50ZXJmYWNlKS5cbiAgICovXG4gIHN0cnVjdChzdHJ1Y3Q6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSk6IFRyYW5zcGlsZWRTdHJ1Y3Q7XG5cbiAgLyoqXG4gICAqIFRyYW5zcGlsZSBhbiBpbnRlcmZhY2UgKG5vbiBkYXRhIHR5cGUpLlxuICAgKi9cbiAgaW50ZXJmYWNlKGlmYWNlOiByZWZsZWN0LkludGVyZmFjZVR5cGUpOiBUcmFuc3BpbGVkSW50ZXJmYWNlO1xuXG4gIC8qKlxuICAgKiBUcmFuc3BpbGUgYSBwYXJhbWV0ZXIuXG4gICAqL1xuICBwYXJhbWV0ZXIocGFyYW1ldGVyOiByZWZsZWN0LlBhcmFtZXRlcik6IFRyYW5zcGlsZWRQYXJhbWV0ZXI7XG5cbiAgLyoqXG4gICAqIFRyYW5zcGlsZSBhIHByb3BlcnR5LlxuICAgKi9cbiAgcHJvcGVydHkocHJvcGVydHk6IHJlZmxlY3QuUHJvcGVydHkpOiBUcmFuc3BpbGVkUHJvcGVydHk7XG5cbiAgLyoqXG4gICAqIFRyYW5zcGlsZSBhbiBlbnVtLlxuICAgKi9cbiAgZW51bShlbnU6IHJlZmxlY3QuRW51bVR5cGUpOiBUcmFuc3BpbGVkRW51bTtcblxuICAvKipcbiAgICogVHJhbnNwaWxlIGFuIGVudW0gbWVtYmVyLlxuICAgKi9cbiAgZW51bU1lbWJlcihlbTogcmVmbGVjdC5FbnVtTWVtYmVyKTogVHJhbnNwaWxlZEVudW1NZW1iZXI7XG5cbiAgLyoqXG4gICAqIFRyYW5zcGlsZSBhIHR5cGUuXG4gICAqL1xuICB0eXBlKHR5cGU6IHJlZmxlY3QuVHlwZSk6IFRyYW5zcGlsZWRUeXBlO1xuXG4gIC8qKlxuICAgKiBUcmFuc3BpbGUgKHJlY3Vyc2l2ZWx5KSBhIHR5cGUgcmVmZXJlbmNlLlxuICAgKi9cbiAgdHlwZVJlZmVyZW5jZSh0eXBlUmVmZXJlbmNlOiByZWZsZWN0LlR5cGVSZWZlcmVuY2UpOiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZTtcblxuICAvKipcbiAgICogSG93IGEgdW5pb24gbG9va3MgbGlrZSBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLlxuICAgKi9cbiAgdW5pb25PZih0eXBlczogc3RyaW5nW10pOiBzdHJpbmc7XG5cbiAgLyoqXG4gICogSG93IGEgdmFyaWFkaWMgcGFyYW1ldGVyIGxvb2tzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuXG4gICovXG4gIHZhcmlhZGljT2YodHlwZTogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgYSBsaXN0IGxvb2tzIGxpa2UgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS5cbiAgICovXG4gIGxpc3RPZih0eXBlOiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBhIG1hcCBsb29rcyBsaWtlIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuXG4gICAqL1xuICBtYXBPZih0eXBlOiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgJ2FueScgdHlwZSBpcyByZXByZXNlbnRlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLlxuICAgKi9cbiAgYW55KCk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IHRoZSAndm9pZCcgKHJldHVybikgdHlwZSBpcyByZXByZXNlbnRlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLlxuICAgKi9cbiAgdm9pZCgpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgJ3N0cmluZycgdHlwZSBpcyByZXByZXNlbnRlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLlxuICAgKi9cbiAgc3RyKCk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IHRoZSAnbnVtYmVyJyB0eXBlIGlzIHJlcHJlc2VudGVkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuXG4gICAqL1xuICBudW1iZXIoKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlICdib29sZWFuJyB0eXBlIGlzIHJlcHJlc2VudGVkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuXG4gICAqL1xuICBib29sZWFuKCk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IHRoZSAnanNvbicgdHlwZSBpcyByZXByZXNlbnRlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLlxuICAgKi9cbiAganNvbigpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgJ2RhdGUnIHR5cGUgaXMgcmVwcmVzZW50ZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS5cbiAgICovXG4gIGRhdGUoKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgYSByZWFkbWUgaXMgZGlzcGxheWVkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuXG4gICAqL1xuICByZWFkbWUocmVhZG1lOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbi8vIGludGVyZmFjZSBtZXJnaW5nIHNvIHdlIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50IHRoZXNlIG1ldGhvZHNcbi8vIGluIHRoZSBhYnN0cmFjdCBjbGFzcy5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwaWxlQmFzZSBleHRlbmRzIFRyYW5zcGlsZSB7fVxuXG4vKipcbiAqIENvbW1vbiBmdW5jdGlvbmFsaXR5IGJldHdlZW4gZGlmZmVyZW50IHRyYW5zcGlsZXJzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNwaWxlQmFzZSBpbXBsZW1lbnRzIFRyYW5zcGlsZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRNb2R1bGVzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgcmVmbGVjdC5Bc3NlbWJseT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJtb2R1bGVzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgcmVmbGVjdC5TdWJtb2R1bGUgfCB1bmRlZmluZWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGxhbmd1YWdlOiBMYW5ndWFnZSkge31cblxuICBwdWJsaWMgdHlwZVJlZmVyZW5jZShyZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSk6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICBpZiAocmVmLnR5cGUpIHtcbiAgICAgIGNvbnN0IHRyYW5zcGlsZWQgPSB0aGlzLnR5cGUocmVmLnR5cGUpO1xuICAgICAgcmV0dXJuIFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLnR5cGUodGhpcywgcmVmLCB0cmFuc3BpbGVkKTtcbiAgICB9XG5cbiAgICBpZiAocmVmLnVuaW9uT2ZUeXBlcykge1xuICAgICAgY29uc3QgdHJhbnNwaWxlZCA9IHJlZi51bmlvbk9mVHlwZXMubWFwKCh0KSA9PiB0aGlzLnR5cGVSZWZlcmVuY2UodCkpO1xuICAgICAgcmV0dXJuIFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLnVuaW9uT2ZUeXBlcyh0aGlzLCByZWYsIHRyYW5zcGlsZWQpO1xuICAgIH1cblxuICAgIGlmIChyZWYuYXJyYXlPZlR5cGUpIHtcbiAgICAgIGNvbnN0IHRyYW5zcGlsZWQgPSB0aGlzLnR5cGVSZWZlcmVuY2UocmVmLmFycmF5T2ZUeXBlKTtcbiAgICAgIHJldHVybiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZS5hcnJheU9mVHlwZSh0aGlzLCByZWYsIHRyYW5zcGlsZWQpO1xuICAgIH1cblxuICAgIGlmIChyZWYubWFwT2ZUeXBlKSB7XG4gICAgICBjb25zdCB0cmFuc3BpbGVkID0gdGhpcy50eXBlUmVmZXJlbmNlKHJlZi5tYXBPZlR5cGUpO1xuICAgICAgcmV0dXJuIFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLm1hcE9mVHlwZSh0aGlzLCByZWYsIHRyYW5zcGlsZWQpO1xuICAgIH1cblxuICAgIGlmIChyZWYuaXNBbnkpIHtcbiAgICAgIHJldHVybiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZS5hbnkodGhpcywgcmVmKTtcbiAgICB9XG5cbiAgICBpZiAocmVmLnByaW1pdGl2ZSkge1xuICAgICAgbGV0IHRyYW5zcGlsZWQ7XG4gICAgICBzd2l0Y2ggKHJlZi5wcmltaXRpdmUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICB0cmFuc3BpbGVkID0gdGhpcy5zdHIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgdHJhbnNwaWxlZCA9IHRoaXMuYm9vbGVhbigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgIHRyYW5zcGlsZWQgPSB0aGlzLm51bWJlcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICB0cmFuc3BpbGVkID0gdGhpcy5kYXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgIHRyYW5zcGlsZWQgPSB0aGlzLmpzb24oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHByaW1pdGl2ZSB0eXBlICcke3JlZi5wcmltaXRpdmV9J2ApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLnByaW1pdGl2ZSh0aGlzLCByZWYsIHRyYW5zcGlsZWQpO1xuICAgIH1cblxuICAgIGlmIChyZWYudm9pZCkge1xuICAgICAgcmV0dXJuIFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLnZvaWQodGhpcywgcmVmKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7cmVmLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmluZFN1Ym1vZHVsZSh0eXBlOiByZWZsZWN0LlR5cGUpOiByZWZsZWN0LlN1Ym1vZHVsZSB8IHVuZGVmaW5lZCB7XG5cbiAgICBpZiAodGhpcy5zdWJtb2R1bGVzQ2FjaGUuaGFzKHR5cGUuZnFuKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3VibW9kdWxlc0NhY2hlLmdldCh0eXBlLmZxbik7XG4gICAgfVxuXG4gICAgbGV0IHN1Ym1vZHVsZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZS5uYW1lc3BhY2UpIHtcbiAgICAgIC8vIGlmIHRoZSB0eXBlIGlzIGluIGEgc3VibW9kdWxlLCB0aGUgc3VibW9kdWxlIG5hbWUgaXMgdGhlIGZpcnN0XG4gICAgICAvLyBwYXJ0IG9mIHRoZSBuYW1lc3BhY2UuIHdlIGNvbnN0cnVjdCB0aGUgZnVsbCBzdWJtb2R1bGUgZnFuIGFuZCBzZWFyY2ggZm9yIGl0LlxuICAgICAgY29uc3Qgc3VibW9kdWxlRnFuID0gYCR7dHlwZS5hc3NlbWJseS5uYW1lfS4ke3R5cGUubmFtZXNwYWNlLnNwbGl0KCcuJylbMF19YDtcbiAgICAgIGNvbnN0IHN1Ym1vZHVsZXMgPSB0eXBlLmFzc2VtYmx5LmFsbFN1Ym1vZHVsZXMuZmlsdGVyKFxuICAgICAgICAocykgPT4gcy5mcW4gPT09IHN1Ym1vZHVsZUZxbixcbiAgICAgICk7XG5cbiAgICAgIGlmIChzdWJtb2R1bGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gY2FuIG5ldmVyIGhhcHBlbiwgYnV0IHRoZSBhcnJheSBkYXRhIHN0cnVjdHVyZSBmb3JjZXMgdGhpcyBoYW5kbGluZy5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCBtdWx0aXBsZSBzdWJtb2R1bGVzIHdpdGggZnFuICR7c3VibW9kdWxlRnFufWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3VibW9kdWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3VibW9kdWxlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyB0eXBlIGlzIGluc2lkZSB0aGlzIHN1Ym1vZHVsZS5cbiAgICAgIHN1Ym1vZHVsZSA9IHN1Ym1vZHVsZXNbMF07XG4gICAgfVxuXG4gICAgdGhpcy5zdWJtb2R1bGVzQ2FjaGUuc2V0KHR5cGUuZnFuLCBzdWJtb2R1bGUpO1xuICAgIHJldHVybiBzdWJtb2R1bGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UGFyZW50TW9kdWxlKG1vZHVsZUxpa2U6IHJlZmxlY3QuTW9kdWxlTGlrZSk6IHJlZmxlY3QuQXNzZW1ibHkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucGFyZW50TW9kdWxlc0NhY2hlLmdldChtb2R1bGVMaWtlLmZxbik7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICAgIGNvbnN0IHR5cGVzID0gbW9kdWxlTGlrZS50eXBlcztcbiAgICBpZiAodHlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuYWJsZSB0byBkZXRlcm1pbmUgYXNzZW1ibHkgc2luY2UgbW9kdWxlIGRvZXMgbm90IGhhdmUgYW55IHR5cGVzOiAke21vZHVsZUxpa2UuZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSB0eXBlc1swXS5hc3NlbWJseTtcbiAgICB0aGlzLnBhcmVudE1vZHVsZXNDYWNoZS5zZXQobW9kdWxlTGlrZS5mcW4sIHBhcmVudCk7XG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvcHRpb25hbGl0eUNvbXBhcmUoXG4gICAgcDE6IHJlZmxlY3QuUGFyYW1ldGVyLFxuICAgIHAyOiByZWZsZWN0LlBhcmFtZXRlcixcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIXAxLm9wdGlvbmFsICYmIHAyLm9wdGlvbmFsKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmICghcDIub3B0aW9uYWwgJiYgcDEub3B0aW9uYWwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcm9vdC1yZWxhdGl2ZSBuYW1lIGZvciBhIHN1Ym1vZHVsZVxuICpcbiAqIEV4OiBmb3IgYSBzdWJtb2R1bGUgYGFzbS5zdWIxLnN1YjJgLCByZXR1cm4gYHN1YjEuc3ViMmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJtb2R1bGVSZWxOYW1lKHN1Ym1vZHVsZTogcmVmbGVjdC5TdWJtb2R1bGUpIHtcbiAgcmV0dXJuIHN1Ym1vZHVsZS5mcW4uc3BsaXQoJy4nKS5zbGljZSgxKS5qb2luKCcuJyk7XG59XG4iXX0=