ngx-modialog-11
Version:
Modal / Dialog for Angular
204 lines • 24.6 kB
JavaScript
const PRIVATE_PREFIX = '$$';
const RESERVED_REGEX = /^(\$\$).*/;
function validateMethodName(name) {
if (!name) {
throw new Error(`Illegal method name. Empty method name is not allowed`);
}
else if (name in this) {
throw new Error(`A member name '${name}' already defined.`);
}
}
/**
* Returns a list of assigned property names (non private)
* @param subject
*/
function getAssignedPropertyNames(subject) {
return Object.getOwnPropertyNames(subject)
.filter(name => RESERVED_REGEX.test(name))
.map(name => name.substr(2));
}
export function privateKey(name) {
return PRIVATE_PREFIX + name;
}
function objectDefinePropertyValue(obj, propertyName, value) {
Object.defineProperty(obj, propertyName, {
configurable: false,
enumerable: false,
writable: false,
value
});
}
/**
* Given a FluentAssign instance, apply all of the supplied default values so calling
* instance.toJSON will return those values (does not create a setter function)
* @param instance
* @param defaultValues
*/
function applyDefaultValues(instance, defaultValues) {
Object.getOwnPropertyNames(defaultValues)
.forEach(name => instance[privateKey(name)] = defaultValues[name]);
}
/**
* Create a function for setting a value for a property on a given object.
* @param obj The object to apply the key & setter on.
* @param propertyName The name of the property on the object
* @param writeOnce If true will allow writing once (default: false)
*
* Example:
* let obj = new FluentAssign<any>;
* setAssignMethod(obj, 'myProp');
* obj.myProp('someValue');
* const result = obj.toJSON();
* console.log(result); //{ myProp: 'someValue' }
*
*
* let obj = new FluentAssign<any>;
* setAssignMethod(obj, 'myProp', true); // applying writeOnce
* obj.myProp('someValue');
* obj.myProp('someValue'); // ERROR: Overriding config property 'myProp' is not allowed.
*/
export function setAssignMethod(obj, propertyName, writeOnce = false) {
validateMethodName.call(obj, propertyName);
const key = privateKey(propertyName);
objectDefinePropertyValue(obj, propertyName, (value) => {
if (writeOnce && this.hasOwnProperty(key)) {
throw new Error(`Overriding config property '${propertyName}' is not allowed.`);
}
obj[key] = value;
return obj;
});
}
/**
* Create a function for setting a value that is an alias to an other setter function.
* @param obj The object to apply the key & setter on.
* @param propertyName The name of the property on the object
* @param srcPropertyName The name of the property on the object this alias points to
* @param hard If true, will set a readonly property on the object that returns
* the value of the source property. Default: false
*
* Example:
* let obj = new FluentAssign<any> ;
* setAssignMethod(obj, 'myProp');
* setAssignAlias(obj, 'myPropAlias', 'myProp');
* obj.myPropAlias('someValue');
* const result = obj.toJSON();
* console.log(result); //{ myProp: 'someValue' }
* result.myPropAlias // undefined
*
*
* let obj = new FluentAssign<any> ;
* setAssignMethod(obj, 'myProp');
* setAssignAlias(obj, 'myPropAlias', 'myProp', true); // setting a hard alias.
* obj.myPropAlias('someValue');
* const result = obj.toJSON();
* console.log(result); //{ myProp: 'someValue' }
* result.myPropAlias // someValue
*/
export function setAssignAlias(obj, propertyName, srcPropertyName, hard = false) {
validateMethodName.call(obj, propertyName);
objectDefinePropertyValue(obj, propertyName, (value) => {
obj[srcPropertyName](value);
return obj;
});
if (hard === true) {
const key = privateKey(propertyName), srcKey = privateKey(srcPropertyName);
Object.defineProperty(obj, key, {
configurable: false,
enumerable: false,
get: () => obj[srcKey]
});
}
}
/**
* Represent a fluent API factory wrapper for defining FluentAssign instances.
*/
export class FluentAssignFactory {
constructor(fluentAssign) {
this._fluentAssign =
fluentAssign instanceof FluentAssign ? fluentAssign : new FluentAssign();
}
/**
* Create a setter method on the FluentAssign instance.
* @param name The name of the setter function.
* @param defaultValue If set (not undefined) set's the value on the instance immediately.
*/
setMethod(name, defaultValue) {
setAssignMethod(this._fluentAssign, name);
if (defaultValue !== undefined) {
this._fluentAssign[name](defaultValue);
}
return this;
}
/**
* The FluentAssign instance.
*/
get fluentAssign() {
return this._fluentAssign;
}
}
/**
* Represent an object where every property is a function representing an assignment function.
* Calling each function with a value will assign the value to the object and return the object.
* Calling 'toJSON' returns an object with the same properties but this time representing the
* assigned values.
*
* This allows setting an object in a fluent API manner.
* Example:
let fluent = new FluentAssign<any>(undefined, ['some', 'went']);
fluent.some('thing').went('wrong').toJSON();
// { some: 'thing', went: 'wrong' }
*/
export class FluentAssign {
/**
*
* @param defaultValues An object representing default values for the underlying object.
* @param initialSetters A list of initial setters for this FluentAssign.
* @param baseType the class/type to create a new base. optional, {} is used if not supplied.
*/
constructor(defaultValues, initialSetters, baseType) {
if (Array.isArray(defaultValues)) {
defaultValues.forEach(d => applyDefaultValues(this, d));
}
else if (defaultValues) {
applyDefaultValues(this, defaultValues);
}
if (Array.isArray(initialSetters)) {
initialSetters.forEach(name => setAssignMethod(this, name));
}
if (baseType) {
this.__fluent$base__ = baseType;
}
}
/**
* Returns a FluentAssignFactory<FluentAssign<T>> ready to define a FluentAssign type.
* @param defaultValues An object representing default values for the instance.
* @param initialSetters A list of initial setters for the instance.
*/
static compose(defaultValues, initialSetters) {
return FluentAssign.composeWith(new FluentAssign(defaultValues, initialSetters));
}
/**
* Returns a FluentAssignFactory<Z> where Z is an instance of FluentAssign<?> or a derived
* class of it.
* @param fluentAssign An instance of FluentAssign<?> or a derived class of FluentAssign<?>.
*/
static composeWith(fluentAssign) {
return new FluentAssignFactory(fluentAssign);
}
toJSON() {
return getAssignedPropertyNames(this)
.reduce((obj, name) => {
const key = privateKey(name);
// re-define property descriptors (we dont want their value)
const propDesc = Object.getOwnPropertyDescriptor(this, key);
if (propDesc) {
Object.defineProperty(obj, name, propDesc);
}
else {
obj[name] = this[key];
}
return obj;
}, this.__fluent$base__ ? new this.__fluent$base__() : {});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1ZW50LWFzc2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tb2RpYWxvZy0xMS9zcmMvbGliL2ZyYW1ld29yay9mbHVlbnQtYXNzaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztBQUM1QixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUM7QUFFbkMsU0FBUyxrQkFBa0IsQ0FBQyxJQUFZO0lBQ3RDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7S0FDMUU7U0FBTSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDO0tBQzdEO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsd0JBQXdCLENBQUMsT0FBWTtJQUM1QyxPQUFPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7U0FDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNyQyxPQUFPLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQUMsR0FBUSxFQUFFLFlBQVksRUFBRSxLQUEyQjtJQUNwRixNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQU87UUFDNUMsWUFBWSxFQUFFLEtBQUs7UUFDbkIsVUFBVSxFQUFFLEtBQUs7UUFDakIsUUFBUSxFQUFFLEtBQUs7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SUFBSSxRQUFRLEVBQUU7Z0JBQ1osTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQzVDO2lCQUFNO2dCQUNDLEdBQUksQ0FBQyxJQUFJLENBQUMsR0FBUyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDckM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQU0sRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXh0ZW5kLCBhcnJheVVuaW9uIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5jb25zdCBQUklWQVRFX1BSRUZJWCA9ICckJCc7XHJcbmNvbnN0IFJFU0VSVkVEX1JFR0VYID0gL14oXFwkXFwkKS4qLztcclxuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlTWV0aG9kTmFtZShuYW1lOiBzdHJpbmcpIHtcclxuICBpZiAoIW5hbWUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgSWxsZWdhbCBtZXRob2QgbmFtZS4gRW1wdHkgbWV0aG9kIG5hbWUgaXMgbm90IGFsbG93ZWRgKTtcclxuICB9IGVsc2UgaWYgKG5hbWUgaW4gdGhpcykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBBIG1lbWJlciBuYW1lICcke25hbWV9JyBhbHJlYWR5IGRlZmluZWQuYCk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGxpc3Qgb2YgYXNzaWduZWQgcHJvcGVydHkgbmFtZXMgKG5vbiBwcml2YXRlKVxyXG4gKiBAcGFyYW0gc3ViamVjdFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzaWduZWRQcm9wZXJ0eU5hbWVzKHN1YmplY3Q6IGFueSk6IHN0cmluZ1tdIHtcclxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc3ViamVjdClcclxuICAgIC5maWx0ZXIobmFtZSA9PiBSRVNFUlZFRF9SRUdFWC50ZXN0KG5hbWUpKVxyXG4gICAgLm1hcChuYW1lID0+IG5hbWUuc3Vic3RyKDIpKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVLZXkobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gUFJJVkFURV9QUkVGSVggKyBuYW1lO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvYmplY3REZWZpbmVQcm9wZXJ0eVZhbHVlKG9iajogYW55LCBwcm9wZXJ0eU5hbWUsIHZhbHVlOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5TmFtZSwgPGFueT57XHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICB3cml0YWJsZTogZmFsc2UsXHJcbiAgICB2YWx1ZVxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogR2l2ZW4gYSBGbHVlbnRBc3NpZ24gaW5zdGFuY2UsIGFwcGx5IGFsbCBvZiB0aGUgc3VwcGxpZWQgZGVmYXVsdCB2YWx1ZXMgc28gY2FsbGluZ1xyXG4gKiBpbnN0YW5jZS50b0pTT04gd2lsbCByZXR1cm4gdGhvc2UgdmFsdWVzIChkb2VzIG5vdCBjcmVhdGUgYSBzZXR0ZXIgZnVuY3Rpb24pXHJcbiAqIEBwYXJhbSBpbnN0YW5jZVxyXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlc1xyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlEZWZhdWx0VmFsdWVzKGluc3RhbmNlOiBhbnksIGRlZmF1bHRWYWx1ZXM6IE9iamVjdCk6IHZvaWQge1xyXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRWYWx1ZXMpXHJcbiAgICAuZm9yRWFjaChuYW1lID0+ICg8YW55Pmluc3RhbmNlKVtwcml2YXRlS2V5KG5hbWUpXSA9ICg8YW55PmRlZmF1bHRWYWx1ZXMpW25hbWVdKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBnaXZlbiBvYmplY3QuXHJcbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBhcHBseSB0aGUga2V5ICYgc2V0dGVyIG9uLlxyXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0XHJcbiAqIEBwYXJhbSB3cml0ZU9uY2UgSWYgdHJ1ZSB3aWxsIGFsbG93IHdyaXRpbmcgb25jZSAoZGVmYXVsdDogZmFsc2UpXHJcbiAqXHJcbiAqIEV4YW1wbGU6XHJcbiAqIGxldCBvYmogPSBuZXcgRmx1ZW50QXNzaWduPGFueT47XHJcbiAqIHNldEFzc2lnbk1ldGhvZChvYmosICdteVByb3AnKTtcclxuICogb2JqLm15UHJvcCgnc29tZVZhbHVlJyk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IG9iai50b0pTT04oKTtcclxuICogY29uc29sZS5sb2cocmVzdWx0KTsgLy97IG15UHJvcDogJ3NvbWVWYWx1ZScgfVxyXG4gKlxyXG4gKlxyXG4gKiBsZXQgb2JqID0gbmV3IEZsdWVudEFzc2lnbjxhbnk+O1xyXG4gKiBzZXRBc3NpZ25NZXRob2Qob2JqLCAnbXlQcm9wJywgdHJ1ZSk7IC8vIGFwcGx5aW5nIHdyaXRlT25jZVxyXG4gKiBvYmoubXlQcm9wKCdzb21lVmFsdWUnKTtcclxuICogb2JqLm15UHJvcCgnc29tZVZhbHVlJyk7IC8vIEVSUk9SOiBPdmVycmlkaW5nIGNvbmZpZyBwcm9wZXJ0eSAnbXlQcm9wJyBpcyBub3QgYWxsb3dlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRBc3NpZ25NZXRob2Q8VD4ob2JqOiBULCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgd3JpdGVPbmNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICB2YWxpZGF0ZU1ldGhvZE5hbWUuY2FsbChvYmosIHByb3BlcnR5TmFtZSk7XHJcblxyXG4gIGNvbnN0IGtleSA9IHByaXZhdGVLZXkocHJvcGVydHlOYW1lKTtcclxuICBvYmplY3REZWZpbmVQcm9wZXJ0eVZhbHVlKG9iaiwgcHJvcGVydHlOYW1lLCAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgaWYgKHdyaXRlT25jZSAmJiB0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPdmVycmlkaW5nIGNvbmZpZyBwcm9wZXJ0eSAnJHtwcm9wZXJ0eU5hbWV9JyBpcyBub3QgYWxsb3dlZC5gKTtcclxuICAgIH1cclxuICAgIG9ialtrZXldID0gdmFsdWU7XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSB2YWx1ZSB0aGF0IGlzIGFuIGFsaWFzIHRvIGFuIG90aGVyIHNldHRlciBmdW5jdGlvbi5cclxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGFwcGx5IHRoZSBrZXkgJiBzZXR0ZXIgb24uXHJcbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9uIHRoZSBvYmplY3RcclxuICogQHBhcmFtIHNyY1Byb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdCB0aGlzIGFsaWFzIHBvaW50cyB0b1xyXG4gKiBAcGFyYW0gaGFyZCBJZiB0cnVlLCB3aWxsIHNldCBhIHJlYWRvbmx5IHByb3BlcnR5IG9uIHRoZSBvYmplY3QgdGhhdCByZXR1cm5zXHJcbiAqICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHNvdXJjZSBwcm9wZXJ0eS4gRGVmYXVsdDogZmFsc2VcclxuICpcclxuICogRXhhbXBsZTpcclxuICogbGV0IG9iaiA9IG5ldyBGbHVlbnRBc3NpZ248YW55PiA7XHJcbiAqIHNldEFzc2lnbk1ldGhvZChvYmosICdteVByb3AnKTtcclxuICogc2V0QXNzaWduQWxpYXMob2JqLCAnbXlQcm9wQWxpYXMnLCAnbXlQcm9wJyk7XHJcbiAqIG9iai5teVByb3BBbGlhcygnc29tZVZhbHVlJyk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IG9iai50b0pTT04oKTtcclxuICogY29uc29sZS5sb2cocmVzdWx0KTsgLy97IG15UHJvcDogJ3NvbWVWYWx1ZScgfVxyXG4gKiByZXN1bHQubXlQcm9wQWxpYXMgLy8gdW5kZWZpbmVkXHJcbiAqXHJcbiAqXHJcbiAqIGxldCBvYmogPSBuZXcgRmx1ZW50QXNzaWduPGFueT4gO1xyXG4gKiBzZXRBc3NpZ25NZXRob2Qob2JqLCAnbXlQcm9wJyk7XHJcbiAqIHNldEFzc2lnbkFsaWFzKG9iaiwgJ215UHJvcEFsaWFzJywgJ215UHJvcCcsIHRydWUpOyAvLyBzZXR0aW5nIGEgaGFyZCBhbGlhcy5cclxuICogb2JqLm15UHJvcEFsaWFzKCdzb21lVmFsdWUnKTtcclxuICogY29uc3QgcmVzdWx0ID0gb2JqLnRvSlNPTigpO1xyXG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvL3sgbXlQcm9wOiAnc29tZVZhbHVlJyB9XHJcbiAqIHJlc3VsdC5teVByb3BBbGlhcyAvLyBzb21lVmFsdWVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRBc3NpZ25BbGlhczxUPihvYmo6IFQsIHByb3BlcnR5TmFtZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHJvcGVydHlOYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICB2YWxpZGF0ZU1ldGhvZE5hbWUuY2FsbChvYmosIHByb3BlcnR5TmFtZSk7XHJcblxyXG4gIG9iamVjdERlZmluZVByb3BlcnR5VmFsdWUob2JqLCBwcm9wZXJ0eU5hbWUsICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICBvYmpbc3JjUHJvcGVydHlOYW1lXSh2YWx1ZSk7XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH0pO1xyXG5cclxuICBpZiAoaGFyZCA9PT0gdHJ1ZSkge1xyXG4gICAgY29uc3Qga2V5ID0gcHJpdmF0ZUtleShwcm9wZXJ0eU5hbWUpLFxyXG4gICAgICBzcmNLZXkgPSBwcml2YXRlS2V5KHNyY1Byb3BlcnR5TmFtZSk7XHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCA8YW55PntcclxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICAgIGdldDogKCkgPT4gb2JqW3NyY0tleV1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIERlc2NyaWJlcyBhIGZsdWVudCBhc3NpZ24gbWV0aG9kLlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZ2V0cyBhIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBpbnN0YW5jZSBpdCB3b3JrcyBvbi5cclxuICovXHJcbmV4cG9ydCB0eXBlIEZsdWVudEFzc2lnbk1ldGhvZDxULCBaPiA9ICh2YWx1ZTogVCkgPT4gWjtcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+IHtcclxuICBmbHVlbnRBc3NpZ246IFo7XHJcblxyXG4gIHNldE1ldGhvZChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+O1xyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50IGEgZmx1ZW50IEFQSSBmYWN0b3J5IHdyYXBwZXIgZm9yIGRlZmluaW5nIEZsdWVudEFzc2lnbiBpbnN0YW5jZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRmx1ZW50QXNzaWduRmFjdG9yeTxUPiB7XHJcbiAgcHJpdmF0ZSBfZmx1ZW50QXNzaWduOiBGbHVlbnRBc3NpZ248VD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGZsdWVudEFzc2lnbj86IEZsdWVudEFzc2lnbjxUPikge1xyXG4gICAgdGhpcy5fZmx1ZW50QXNzaWduID1cclxuICAgICAgZmx1ZW50QXNzaWduIGluc3RhbmNlb2YgRmx1ZW50QXNzaWduID8gZmx1ZW50QXNzaWduIDogPGFueT5uZXcgRmx1ZW50QXNzaWduKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBzZXR0ZXIgbWV0aG9kIG9uIHRoZSBGbHVlbnRBc3NpZ24gaW5zdGFuY2UuXHJcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHNldHRlciBmdW5jdGlvbi5cclxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIElmIHNldCAobm90IHVuZGVmaW5lZCkgc2V0J3MgdGhlIHZhbHVlIG9uIHRoZSBpbnN0YW5jZSBpbW1lZGlhdGVseS5cclxuICAgKi9cclxuICBzZXRNZXRob2QobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBGbHVlbnRBc3NpZ25GYWN0b3J5PFQ+IHtcclxuICAgIHNldEFzc2lnbk1ldGhvZCh0aGlzLl9mbHVlbnRBc3NpZ24sIG5hbWUpO1xyXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICg8YW55PnRoaXMuX2ZsdWVudEFzc2lnbilbbmFtZV0oZGVmYXVsdFZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIEZsdWVudEFzc2lnbiBpbnN0YW5jZS5cclxuICAgKi9cclxuICBnZXQgZmx1ZW50QXNzaWduKCk6IEZsdWVudEFzc2lnbjxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmx1ZW50QXNzaWduO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnQgYW4gb2JqZWN0IHdoZXJlIGV2ZXJ5IHByb3BlcnR5IGlzIGEgZnVuY3Rpb24gcmVwcmVzZW50aW5nIGFuIGFzc2lnbm1lbnQgZnVuY3Rpb24uXHJcbiAqIENhbGxpbmcgZWFjaCBmdW5jdGlvbiB3aXRoIGEgdmFsdWUgd2lsbCBhc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBvYmplY3QgYW5kIHJldHVybiB0aGUgb2JqZWN0LlxyXG4gKiBDYWxsaW5nICd0b0pTT04nIHJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBidXQgdGhpcyB0aW1lIHJlcHJlc2VudGluZyB0aGVcclxuICogYXNzaWduZWQgdmFsdWVzLlxyXG4gKlxyXG4gKiBUaGlzIGFsbG93cyBzZXR0aW5nIGFuIG9iamVjdCBpbiBhIGZsdWVudCBBUEkgbWFubmVyLlxyXG4gKiBFeGFtcGxlOlxyXG4gbGV0IGZsdWVudCA9IG5ldyBGbHVlbnRBc3NpZ248YW55Pih1bmRlZmluZWQsIFsnc29tZScsICd3ZW50J10pO1xyXG4gZmx1ZW50LnNvbWUoJ3RoaW5nJykud2VudCgnd3JvbmcnKS50b0pTT04oKTtcclxuIC8vIHsgc29tZTogJ3RoaW5nJywgd2VudDogJ3dyb25nJyB9XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRmx1ZW50QXNzaWduPFQ+IHtcclxuICBwcml2YXRlIF9fZmx1ZW50JGJhc2VfXzogbmV3ICgpID0+IFQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBGbHVlbnRBc3NpZ25GYWN0b3J5PEZsdWVudEFzc2lnbjxUPj4gcmVhZHkgdG8gZGVmaW5lIGEgRmx1ZW50QXNzaWduIHR5cGUuXHJcbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZXMgQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGluc3RhbmNlLlxyXG4gICAqIEBwYXJhbSBpbml0aWFsU2V0dGVycyBBIGxpc3Qgb2YgaW5pdGlhbCBzZXR0ZXJzIGZvciB0aGUgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgc3RhdGljIGNvbXBvc2U8VD4oZGVmYXVsdFZhbHVlcz86IFQsIGluaXRpYWxTZXR0ZXJzPzogc3RyaW5nW10pOiBGbHVlbnRBc3NpZ25GYWN0b3J5PFQ+IHtcclxuXHJcbiAgICByZXR1cm4gPGFueT5GbHVlbnRBc3NpZ24uY29tcG9zZVdpdGg8Rmx1ZW50QXNzaWduPFQ+PihcclxuICAgICAgbmV3IEZsdWVudEFzc2lnbjxUPihkZWZhdWx0VmFsdWVzLCBpbml0aWFsU2V0dGVycykpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEZsdWVudEFzc2lnbkZhY3Rvcnk8Wj4gd2hlcmUgWiBpcyBhbiBpbnN0YW5jZSBvZiBGbHVlbnRBc3NpZ248Pz4gb3IgYSBkZXJpdmVkXHJcbiAgICogY2xhc3Mgb2YgaXQuXHJcbiAgICogQHBhcmFtIGZsdWVudEFzc2lnbiBBbiBpbnN0YW5jZSBvZiBGbHVlbnRBc3NpZ248Pz4gb3IgYSBkZXJpdmVkIGNsYXNzIG9mIEZsdWVudEFzc2lnbjw/Pi5cclxuICAgKi9cclxuICBzdGF0aWMgY29tcG9zZVdpdGg8Wj4oZmx1ZW50QXNzaWduOiBaKTogSUZsdWVudEFzc2lnbkZhY3Rvcnk8Wj4ge1xyXG4gICAgcmV0dXJuIDxhbnk+bmV3IEZsdWVudEFzc2lnbkZhY3Rvcnk8YW55Pig8YW55PmZsdWVudEFzc2lnbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWVzIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB1bmRlcmx5aW5nIG9iamVjdC5cclxuICAgKiBAcGFyYW0gaW5pdGlhbFNldHRlcnMgQSBsaXN0IG9mIGluaXRpYWwgc2V0dGVycyBmb3IgdGhpcyBGbHVlbnRBc3NpZ24uXHJcbiAgICogQHBhcmFtIGJhc2VUeXBlIHRoZSBjbGFzcy90eXBlIHRvIGNyZWF0ZSBhIG5ldyBiYXNlLiBvcHRpb25hbCwge30gaXMgdXNlZCBpZiBub3Qgc3VwcGxpZWQuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoZGVmYXVsdFZhbHVlcz86IFQgfCBUW10sIGluaXRpYWxTZXR0ZXJzPzogc3RyaW5nW10sIGJhc2VUeXBlPzogbmV3ICgpID0+IFQpIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZXMpKSB7XHJcbiAgICAgIChkZWZhdWx0VmFsdWVzIGFzIEFycmF5PGFueT4pLmZvckVhY2goZCA9PiBhcHBseURlZmF1bHRWYWx1ZXModGhpcywgZCkpO1xyXG4gICAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWVzKSB7XHJcbiAgICAgIGFwcGx5RGVmYXVsdFZhbHVlcyh0aGlzLCBkZWZhdWx0VmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0aWFsU2V0dGVycykpIHtcclxuXHJcbiAgICAgIGluaXRpYWxTZXR0ZXJzLmZvckVhY2gobmFtZSA9PiBzZXRBc3NpZ25NZXRob2QodGhpcywgbmFtZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChiYXNlVHlwZSkge1xyXG4gICAgICB0aGlzLl9fZmx1ZW50JGJhc2VfXyA9IGJhc2VUeXBlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9KU09OKCk6IFQge1xyXG4gICAgcmV0dXJuIGdldEFzc2lnbmVkUHJvcGVydHlOYW1lcyh0aGlzKVxyXG4gICAgICAucmVkdWNlKChvYmo6IFQsIG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHByaXZhdGVLZXkobmFtZSk7XHJcbiAgICAgICAgLy8gcmUtZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3JzICh3ZSBkb250IHdhbnQgdGhlaXIgdmFsdWUpXHJcbiAgICAgICAgY29uc3QgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIGtleSk7XHJcbiAgICAgICAgaWYgKHByb3BEZXNjKSB7XHJcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCBwcm9wRGVzYyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICg8YW55Pm9iailbbmFtZV0gPSAoPGFueT50aGlzKVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICB9LCB0aGlzLl9fZmx1ZW50JGJhc2VfXyA/IG5ldyB0aGlzLl9fZmx1ZW50JGJhc2VfXygpIDogPGFueT57fSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==