UNPKG

@kephas/reflection

Version:

Provides reflection capabilities, like TypeInfoRegistry, ITypeInfo, and IProperty.

111 lines 16.5 kB
import { Serializable } from '@kephas/core'; import { ElementInfo } from './elementInfo'; import { PropertyInfo } from './propertyInfo'; import { ReflectionError } from './reflectionError'; import { TypeName } from './typeName'; /** * Provides reflective information about a type. * * @export * @class TypeInfo * @extends {ElementInfo} */ export class TypeInfo extends ElementInfo { /** * Creates an instance of TypeInfo. * * @param {string} name The type name. * @param {string} [namespace] The type namespace. * @param {string} [fullName] Optional. The full name of the type. * @param {DisplayInfo} [displayInfo] Optional. The display information. * @param {IPropertyInfo[]} [properties] Optional. The properties. * @param {Type<*>} [type] Optional. The instantiable type. * @param {boolean} [isArray] Optional. Indicates whether the type is an array. * @param {boolean} [isEnum] Optional. Indicates whether the type is an enumeration. * @param {*} [defaultValue] Optional. The type's default value. * @param {ITypeInfoRegistry} [registry] The root type info registry. * @memberof TypeInfo */ constructor({ name, namespace, fullName, displayInfo, properties, type, isArray, isEnum, defaultValue, registry, ...args }) { super({ name: TypeInfo._getName(name, type), fullName: fullName || TypeInfo._getFullName(name, namespace, type), displayInfo, registry, ...args }); this.type = type; this.namespace = TypeInfo._getNamespace(namespace, type); properties = properties && properties.map(p => new PropertyInfo({ ...p, declaringType: this, registry })); this.properties = (properties || []); if (this.type) { Serializable.setTypeFullName(this.type, this.fullName); } this.isEnum = !!isEnum; this.isArray = !!isArray; this.defaultValue = defaultValue; } /** * Gets a value indicating whether this type is the boolean type. * * @type {boolean} True if the type is the boolean type, false otherwise. * @memberof TypeInfo */ get isBoolean() { return this.fullName === TypeName.BooleanTypeName; } /** * Gets a value indicating whether this type is the number type. * * @type {boolean} True if the type is the number type, false otherwise. * @memberof TypeInfo */ get isNumber() { return this.fullName === TypeName.NumberTypeName; } /** * Gets a value indicating whether this type is the string type. * * @type {boolean} True if the type is the string type, false otherwise. * @memberof TypeInfo */ get isString() { return this.fullName === TypeName.StringTypeName; } /** * Gets a value indicating whether this type is the symbol type. * * @type {boolean} True if the type is the symbol type, false otherwise. * @memberof TypeInfo */ get isSymbol() { return this.fullName === TypeName.SymbolTypeName; } /** * Gets a value indicating whether this type is the any type. * * @type {boolean} True if the type is the any type, false otherwise. * @memberof TypeInfo */ get isAny() { return this.fullName === TypeName.AnyTypeName; } static _getName(name, type) { if (name) { return name; } if (type) { return type.name; } throw new ReflectionError('Either the name or the type name should be provided.'); } static _getFullName(name, namespace, type) { name = TypeInfo._getName(name, type); namespace = TypeInfo._getNamespace(namespace, type); return namespace ? `${namespace}.${name}` : name; } static _getNamespace(namespace, type) { return namespace || (type ? Serializable.getTypeNamespace(type) : undefined); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZUluZm8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZXBoYXMvcmVmbGVjdGlvbi9zcmMvbGliL3R5cGVJbmZvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQVEsTUFBTSxjQUFjLENBQUM7QUFFbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLFFBQVMsU0FBUSxXQUFXO0lBa0dyQzs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILFlBQ0ksRUFDSSxJQUFJLEVBQ0osU0FBUyxFQUNULFFBQVEsRUFDUixXQUFXLEVBQ1gsVUFBVSxFQUNWLElBQUksRUFDSixPQUFPLEVBQ1AsTUFBTSxFQUNOLFlBQVksRUFDWixRQUFRLEVBQ1IsR0FBRyxJQUFJLEVBd0JWO1FBQ0QsS0FBSyxDQUFDO1lBQ0YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztZQUNuQyxRQUFRLEVBQUUsUUFBUSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUM7WUFDbEUsV0FBVztZQUNYLFFBQVE7WUFDUixHQUFHLElBQUk7U0FDVixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pELFVBQVUsR0FBRyxVQUFVLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQW9CLENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1gsWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMxRDtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDckMsQ0FBQztJQXZIRDs7Ozs7T0FLRztJQUNILElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ2xELENBQUM7SUF5RU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFhLEVBQUUsSUFBZ0I7UUFDbkQsSUFBSSxJQUFJLEVBQUU7WUFDTixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxJQUFJLEVBQUU7WUFDTixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDcEI7UUFFRCxNQUFNLElBQUksZUFBZSxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVPLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBYSxFQUFFLFNBQWtCLEVBQUUsSUFBZ0I7UUFDM0UsSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRCxDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFrQixFQUFFLElBQWdCO1FBQzdELE9BQU8sU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcmlhbGl6YWJsZSwgVHlwZSB9IGZyb20gJ0BrZXBoYXMvY29yZSc7XHJcbmltcG9ydCB7IERpc3BsYXlJbmZvIH0gZnJvbSAnLi9kaXNwbGF5SW5mbyc7XHJcbmltcG9ydCB7IEVsZW1lbnRJbmZvIH0gZnJvbSAnLi9lbGVtZW50SW5mbyc7XHJcbmltcG9ydCB7IElQcm9wZXJ0eUluZm8sIElUeXBlSW5mbywgSVR5cGVJbmZvUmVnaXN0cnkgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eUluZm8gfSBmcm9tICcuL3Byb3BlcnR5SW5mbyc7XHJcbmltcG9ydCB7IFJlZmxlY3Rpb25FcnJvciB9IGZyb20gJy4vcmVmbGVjdGlvbkVycm9yJztcclxuaW1wb3J0IHsgVHlwZU5hbWUgfSBmcm9tICcuL3R5cGVOYW1lJztcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyByZWZsZWN0aXZlIGluZm9ybWF0aW9uIGFib3V0IGEgdHlwZS5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgVHlwZUluZm9cclxuICogQGV4dGVuZHMge0VsZW1lbnRJbmZvfVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFR5cGVJbmZvIGV4dGVuZHMgRWxlbWVudEluZm8gaW1wbGVtZW50cyBJVHlwZUluZm8ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAbWVtYmVyb2YgVHlwZUluZm9cclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgbmFtZXNwYWNlPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdHlwZSdzIHByb3BlcnRpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0lJUHJvcGVydHlJbmZvW119XHJcbiAgICAgKiBAbWVtYmVyb2YgVHlwZUluZm9cclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgcHJvcGVydGllczogSVByb3BlcnR5SW5mb1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIFR5cGVJbmZvXHJcbiAgICAgKi9cclxuICAgIHJlYWRvbmx5IHR5cGU/OiBUeXBlPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Kn1cclxuICAgICAqIEBtZW1iZXJvZiBUeXBlSW5mb1xyXG4gICAgICovXHJcbiAgICByZWFkb25seSBkZWZhdWx0VmFsdWU/OiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhbiBhcnJheS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdHlwZSBpcyBhbiBhcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQG1lbWJlcm9mIFR5cGVJbmZvXHJcbiAgICAgKi9cclxuICAgIHJlYWRvbmx5IGlzQXJyYXk6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhbiBlbnVtZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdHlwZSBpcyBhbiBlbnVtZXJhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQG1lbWJlcm9mIFR5cGVJbmZvXHJcbiAgICAgKi9cclxuICAgIHJlYWRvbmx5IGlzRW51bTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB0eXBlIGlzIHRoZSBib29sZWFuIHR5cGUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR5cGUgaXMgdGhlIGJvb2xlYW4gdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQG1lbWJlcm9mIFR5cGVJbmZvXHJcbiAgICAgKi9cclxuICAgIGdldCBpc0Jvb2xlYW4oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVsbE5hbWUgPT09IFR5cGVOYW1lLkJvb2xlYW5UeXBlTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB0eXBlIGlzIHRoZSBudW1iZXIgdHlwZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdHlwZSBpcyB0aGUgbnVtYmVyIHR5cGUsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgICAqIEBtZW1iZXJvZiBUeXBlSW5mb1xyXG4gICAgICovXHJcbiAgICBnZXQgaXNOdW1iZXIoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVsbE5hbWUgPT09IFR5cGVOYW1lLk51bWJlclR5cGVOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHR5cGUgaXMgdGhlIHN0cmluZyB0eXBlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtib29sZWFufSBUcnVlIGlmIHRoZSB0eXBlIGlzIHRoZSBzdHJpbmcgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQG1lbWJlcm9mIFR5cGVJbmZvXHJcbiAgICAgKi9cclxuICAgIGdldCBpc1N0cmluZygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mdWxsTmFtZSA9PT0gVHlwZU5hbWUuU3RyaW5nVHlwZU5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgdHlwZSBpcyB0aGUgc3ltYm9sIHR5cGUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR5cGUgaXMgdGhlIHN5bWJvbCB0eXBlLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAbWVtYmVyb2YgVHlwZUluZm9cclxuICAgICAqL1xyXG4gICAgZ2V0IGlzU3ltYm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZ1bGxOYW1lID09PSBUeXBlTmFtZS5TeW1ib2xUeXBlTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB0eXBlIGlzIHRoZSBhbnkgdHlwZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdHlwZSBpcyB0aGUgYW55IHR5cGUsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgICAqIEBtZW1iZXJvZiBUeXBlSW5mb1xyXG4gICAgICovXHJcbiAgICBnZXQgaXNBbnkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVsbE5hbWUgPT09IFR5cGVOYW1lLkFueVR5cGVOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUeXBlSW5mby5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgdHlwZSBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2VdIFRoZSB0eXBlIG5hbWVzcGFjZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZnVsbE5hbWVdIE9wdGlvbmFsLiBUaGUgZnVsbCBuYW1lIG9mIHRoZSB0eXBlLlxyXG4gICAgICogQHBhcmFtIHtEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXSBPcHRpb25hbC4gVGhlIGRpc3BsYXkgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge0lQcm9wZXJ0eUluZm9bXX0gW3Byb3BlcnRpZXNdIE9wdGlvbmFsLiBUaGUgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSB7VHlwZTwqPn0gW3R5cGVdIE9wdGlvbmFsLiBUaGUgaW5zdGFudGlhYmxlIHR5cGUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0FycmF5XSBPcHRpb25hbC4gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHR5cGUgaXMgYW4gYXJyYXkuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0VudW1dIE9wdGlvbmFsLiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHlwZSBpcyBhbiBlbnVtZXJhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gT3B0aW9uYWwuIFRoZSB0eXBlJ3MgZGVmYXVsdCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7SVR5cGVJbmZvUmVnaXN0cnl9IFtyZWdpc3RyeV0gVGhlIHJvb3QgdHlwZSBpbmZvIHJlZ2lzdHJ5LlxyXG4gICAgICogQG1lbWJlcm9mIFR5cGVJbmZvXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZSxcclxuICAgICAgICAgICAgbmFtZXNwYWNlLFxyXG4gICAgICAgICAgICBmdWxsTmFtZSxcclxuICAgICAgICAgICAgZGlzcGxheUluZm8sXHJcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXHJcbiAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgIGlzQXJyYXksXHJcbiAgICAgICAgICAgIGlzRW51bSxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxyXG4gICAgICAgICAgICByZWdpc3RyeSxcclxuICAgICAgICAgICAgLi4uYXJnc1xyXG4gICAgICAgIH06IHtcclxuICAgICAgICAgICAgbmFtZT86IHN0cmluZztcclxuICAgICAgICAgICAgbmFtZXNwYWNlPzogc3RyaW5nO1xyXG4gICAgICAgICAgICBmdWxsTmFtZT86IHN0cmluZztcclxuICAgICAgICAgICAgZGlzcGxheUluZm8/OiBEaXNwbGF5SW5mbztcclxuICAgICAgICAgICAgcHJvcGVydGllcz86IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHN0cmluZztcclxuICAgICAgICAgICAgICAgIGZ1bGxOYW1lPzogc3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheUluZm8/OiBEaXNwbGF5SW5mbztcclxuICAgICAgICAgICAgICAgIHZhbHVlVHlwZT86IElUeXBlSW5mbyB8IHN0cmluZztcclxuICAgICAgICAgICAgICAgIGNhblJlYWQ/OiBib29sZWFuO1xyXG4gICAgICAgICAgICAgICAgY2FuV3JpdGU/OiBib29sZWFuO1xyXG4gICAgICAgICAgICAgICAgaXNSZXF1aXJlZD86IGJvb2xlYW47XHJcbiAgICAgICAgICAgICAgICBpc1N0YXRpYz86IGJvb2xlYW47XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU/OiBhbnk7XHJcbiAgICAgICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbiAgICAgICAgICAgIH1bXTtcclxuICAgICAgICAgICAgdHlwZT86IFR5cGU8YW55PjtcclxuICAgICAgICAgICAgaXNBcnJheT86IGJvb2xlYW47XHJcbiAgICAgICAgICAgIGlzRW51bT86IGJvb2xlYW47XHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT86IGFueTtcclxuICAgICAgICAgICAgcmVnaXN0cnk/OiBJVHlwZUluZm9SZWdpc3RyeTtcclxuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xyXG4gICAgICAgIH0pIHtcclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIG5hbWU6IFR5cGVJbmZvLl9nZXROYW1lKG5hbWUsIHR5cGUpLFxyXG4gICAgICAgICAgICBmdWxsTmFtZTogZnVsbE5hbWUgfHwgVHlwZUluZm8uX2dldEZ1bGxOYW1lKG5hbWUsIG5hbWVzcGFjZSwgdHlwZSksXHJcbiAgICAgICAgICAgIGRpc3BsYXlJbmZvLFxyXG4gICAgICAgICAgICByZWdpc3RyeSxcclxuICAgICAgICAgICAgLi4uYXJnc1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XHJcbiAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBUeXBlSW5mby5fZ2V0TmFtZXNwYWNlKG5hbWVzcGFjZSwgdHlwZSk7XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy5tYXAocCA9PiBuZXcgUHJvcGVydHlJbmZvKHsgLi4ucCwgZGVjbGFyaW5nVHlwZTogdGhpcywgcmVnaXN0cnkgfSkpO1xyXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IChwcm9wZXJ0aWVzIHx8IFtdKSBhcyBJUHJvcGVydHlJbmZvW107XHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSkge1xyXG4gICAgICAgICAgICBTZXJpYWxpemFibGUuc2V0VHlwZUZ1bGxOYW1lKHRoaXMudHlwZSwgdGhpcy5mdWxsTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNFbnVtID0gISFpc0VudW07XHJcbiAgICAgICAgdGhpcy5pc0FycmF5ID0gISFpc0FycmF5O1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIF9nZXROYW1lKG5hbWU/OiBzdHJpbmcsIHR5cGU/OiBUeXBlPGFueT4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGUubmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBSZWZsZWN0aW9uRXJyb3IoJ0VpdGhlciB0aGUgbmFtZSBvciB0aGUgdHlwZSBuYW1lIHNob3VsZCBiZSBwcm92aWRlZC4nKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfZ2V0RnVsbE5hbWUobmFtZT86IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nLCB0eXBlPzogVHlwZTxhbnk+KTogc3RyaW5nIHtcclxuICAgICAgICBuYW1lID0gVHlwZUluZm8uX2dldE5hbWUobmFtZSwgdHlwZSk7XHJcbiAgICAgICAgbmFtZXNwYWNlID0gVHlwZUluZm8uX2dldE5hbWVzcGFjZShuYW1lc3BhY2UsIHR5cGUpO1xyXG4gICAgICAgIHJldHVybiBuYW1lc3BhY2UgPyBgJHtuYW1lc3BhY2V9LiR7bmFtZX1gIDogbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfZ2V0TmFtZXNwYWNlKG5hbWVzcGFjZT86IHN0cmluZywgdHlwZT86IFR5cGU8YW55Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSB8fCAodHlwZSA/IFNlcmlhbGl6YWJsZS5nZXRUeXBlTmFtZXNwYWNlKHR5cGUpIDogdW5kZWZpbmVkKTtcclxuICAgIH1cclxufVxyXG4iXX0=