UNPKG

ngx-modialog-10

Version:
401 lines 30.9 kB
/** * @fileoverview added by tsickle * Generated from: lib/framework/fluent-assign.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** @type {?} */ var PRIVATE_PREFIX = '$$'; /** @type {?} */ var RESERVED_REGEX = /^(\$\$).*/; /** * @param {?} name * @return {?} */ 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 * @return {?} */ function getAssignedPropertyNames(subject) { return Object.getOwnPropertyNames(subject) .filter((/** * @param {?} name * @return {?} */ function (name) { return RESERVED_REGEX.test(name); })) .map((/** * @param {?} name * @return {?} */ function (name) { return name.substr(2); })); } /** * @param {?} name * @return {?} */ export function privateKey(name) { return PRIVATE_PREFIX + name; } /** * @param {?} obj * @param {?} propertyName * @param {?} value * @return {?} */ function objectDefinePropertyValue(obj, propertyName, value) { Object.defineProperty(obj, propertyName, (/** @type {?} */ ({ configurable: false, enumerable: false, writable: false, value: 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 * @return {?} */ function applyDefaultValues(instance, defaultValues) { Object.getOwnPropertyNames(defaultValues) .forEach((/** * @param {?} name * @return {?} */ function (name) { return ((/** @type {?} */ (instance)))[privateKey(name)] = ((/** @type {?} */ (defaultValues)))[name]; })); } /** * Create a function for setting a value for a property on a given object. * @template T * @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. * @return {?} */ export function setAssignMethod(obj, propertyName, writeOnce) { var _this = this; if (writeOnce === void 0) { writeOnce = false; } validateMethodName.call(obj, propertyName); /** @type {?} */ var key = privateKey(propertyName); objectDefinePropertyValue(obj, propertyName, (/** * @param {?} value * @return {?} */ function (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. * @template T * @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 * @return {?} */ export function setAssignAlias(obj, propertyName, srcPropertyName, hard) { if (hard === void 0) { hard = false; } validateMethodName.call(obj, propertyName); objectDefinePropertyValue(obj, propertyName, (/** * @param {?} value * @return {?} */ function (value) { obj[srcPropertyName](value); return obj; })); if (hard === true) { /** @type {?} */ var key = privateKey(propertyName); /** @type {?} */ var srcKey_1 = privateKey(srcPropertyName); Object.defineProperty(obj, key, (/** @type {?} */ ({ configurable: false, enumerable: false, get: (/** * @return {?} */ function () { return obj[srcKey_1]; }) }))); } } /** * @record * @template Z */ export function IFluentAssignFactory() { } if (false) { /** @type {?} */ IFluentAssignFactory.prototype.fluentAssign; /** * @param {?} name * @param {?=} defaultValue * @return {?} */ IFluentAssignFactory.prototype.setMethod = function (name, defaultValue) { }; } /** * Represent a fluent API factory wrapper for defining FluentAssign instances. * @template T */ var /** * Represent a fluent API factory wrapper for defining FluentAssign instances. * @template T */ FluentAssignFactory = /** @class */ (function () { function FluentAssignFactory(fluentAssign) { this._fluentAssign = fluentAssign instanceof FluentAssign ? fluentAssign : (/** @type {?} */ (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. */ /** * 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. * @return {?} */ FluentAssignFactory.prototype.setMethod = /** * 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. * @return {?} */ function (name, defaultValue) { setAssignMethod(this._fluentAssign, name); if (defaultValue !== undefined) { ((/** @type {?} */ (this._fluentAssign)))[name](defaultValue); } return this; }; Object.defineProperty(FluentAssignFactory.prototype, "fluentAssign", { /** * The FluentAssign instance. */ get: /** * The FluentAssign instance. * @return {?} */ function () { return this._fluentAssign; }, enumerable: true, configurable: true }); return FluentAssignFactory; }()); /** * Represent a fluent API factory wrapper for defining FluentAssign instances. * @template T */ export { FluentAssignFactory }; if (false) { /** * @type {?} * @private */ FluentAssignFactory.prototype._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' } * @template T */ var /** * 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' } * @template T */ FluentAssign = /** @class */ (function () { /** * * @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. */ function FluentAssign(defaultValues, initialSetters, baseType) { var _this = this; if (Array.isArray(defaultValues)) { ((/** @type {?} */ (defaultValues))).forEach((/** * @param {?} d * @return {?} */ function (d) { return applyDefaultValues(_this, d); })); } else if (defaultValues) { applyDefaultValues(this, defaultValues); } if (Array.isArray(initialSetters)) { initialSetters.forEach((/** * @param {?} name * @return {?} */ function (name) { return 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. */ /** * Returns a FluentAssignFactory<FluentAssign<T>> ready to define a FluentAssign type. * @template T * @param {?=} defaultValues An object representing default values for the instance. * @param {?=} initialSetters A list of initial setters for the instance. * @return {?} */ FluentAssign.compose = /** * Returns a FluentAssignFactory<FluentAssign<T>> ready to define a FluentAssign type. * @template T * @param {?=} defaultValues An object representing default values for the instance. * @param {?=} initialSetters A list of initial setters for the instance. * @return {?} */ function (defaultValues, initialSetters) { return (/** @type {?} */ (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<?>. */ /** * Returns a FluentAssignFactory<Z> where Z is an instance of FluentAssign<?> or a derived * class of it. * @template Z * @param {?} fluentAssign An instance of FluentAssign<?> or a derived class of FluentAssign<?>. * @return {?} */ FluentAssign.composeWith = /** * Returns a FluentAssignFactory<Z> where Z is an instance of FluentAssign<?> or a derived * class of it. * @template Z * @param {?} fluentAssign An instance of FluentAssign<?> or a derived class of FluentAssign<?>. * @return {?} */ function (fluentAssign) { return (/** @type {?} */ (new FluentAssignFactory((/** @type {?} */ (fluentAssign))))); }; /** * @return {?} */ FluentAssign.prototype.toJSON = /** * @return {?} */ function () { var _this = this; return getAssignedPropertyNames(this) .reduce((/** * @param {?} obj * @param {?} name * @return {?} */ function (obj, name) { /** @type {?} */ var key = privateKey(name); // re-define property descriptors (we dont want their value) /** @type {?} */ var propDesc = Object.getOwnPropertyDescriptor(_this, key); if (propDesc) { Object.defineProperty(obj, name, propDesc); } else { ((/** @type {?} */ (obj)))[name] = ((/** @type {?} */ (_this)))[key]; } return obj; }), this.__fluent$base__ ? new this.__fluent$base__() : (/** @type {?} */ ({}))); }; return 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' } * @template T */ export { FluentAssign }; if (false) { /** * @type {?} * @private */ FluentAssign.prototype.__fluent$base__; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1ZW50LWFzc2lnbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tb2RpYWxvZy0xMC8iLCJzb3VyY2VzIjpbImxpYi9mcmFtZXdvcmsvZmx1ZW50LWFzc2lnbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7SUFFTSxjQUFjLEdBQUcsSUFBSTs7SUFDckIsY0FBYyxHQUFHLFdBQVc7Ozs7O0FBRWxDLFNBQVMsa0JBQWtCLENBQUMsSUFBWTtJQUN0QyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0tBQzFFO1NBQU0sSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQWtCLElBQUksdUJBQW9CLENBQUMsQ0FBQztLQUM3RDtBQUNILENBQUM7Ozs7OztBQU1ELFNBQVMsd0JBQXdCLENBQUMsT0FBWTtJQUM1QyxPQUFPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7U0FDdkMsTUFBTTs7OztJQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBekIsQ0FBeUIsRUFBQztTQUN6QyxHQUFHOzs7O0lBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFkLENBQWMsRUFBQyxDQUFDO0FBQ2pDLENBQUM7Ozs7O0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sY0FBYyxHQUFHLElBQUksQ0FBQztBQUMvQixDQUFDOzs7Ozs7O0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxHQUFRLEVBQUUsWUFBWSxFQUFFLEtBQTJCO0lBQ3BGLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxtQkFBSztRQUM1QyxZQUFZLEVBQUUsS0FBSztRQUNuQixVQUFVLEVBQUUsS0FBSztRQUNqQixRQUFRLEVBQUUs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RUQ7Ozs7T0FJRzs7Ozs7Ozs7SUFDSSx3QkFBVzs7Ozs7OztJQUFsQixVQUFzQixZQUFlO1FBQ25DLE9BQU8sbUJBQUssSUFBSSxtQkFBbUIsQ0FBTSxtQkFBSyxZQUFZLEVBQUEsQ0FBQyxFQUFBLENBQUM7SUFDOUQsQ0FBQzs7OztJQXlCRCw2QkFBTTs7O0lBQU47UUFBQSxpQkFhQztRQVpDLE9BQU8sd0JBQXdCLENBQUMsSUFBSSxDQUFDO2FBQ2xDLE1BQU07Ozs7O1FBQUMsVUFBQyxHQUFNLEVBQUUsSUFBWTs7Z0JBQ3JCLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDOzs7Z0JBRXRCLFFBQVEsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSSxFQUFFLEdBQUcsQ0FBQztZQUMzRCxJQUFJLFFBQVEsRUFBRTtnQkFDWixNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDNUM7aUJBQU07Z0JBQ0wsQ0FBQyxtQkFBSyxHQUFHLEVBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQUssS0FBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNyQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxHQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxtQkFBSyxFQUFFLEVBQUEsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDSCxtQkFBQztBQUFELENBQUMsQUE1REQsSUE0REM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBM0RDLHVDQUFxQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4dGVuZCwgYXJyYXlVbmlvbiB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBQUklWQVRFX1BSRUZJWCA9ICckJCc7XG5jb25zdCBSRVNFUlZFRF9SRUdFWCA9IC9eKFxcJFxcJCkuKi87XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWV0aG9kTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbGxlZ2FsIG1ldGhvZCBuYW1lLiBFbXB0eSBtZXRob2QgbmFtZSBpcyBub3QgYWxsb3dlZGApO1xuICB9IGVsc2UgaWYgKG5hbWUgaW4gdGhpcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQSBtZW1iZXIgbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBkZWZpbmVkLmApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYXNzaWduZWQgcHJvcGVydHkgbmFtZXMgKG5vbiBwcml2YXRlKVxuICogQHBhcmFtIHN1YmplY3RcbiAqL1xuZnVuY3Rpb24gZ2V0QXNzaWduZWRQcm9wZXJ0eU5hbWVzKHN1YmplY3Q6IGFueSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN1YmplY3QpXG4gICAgLmZpbHRlcihuYW1lID0+IFJFU0VSVkVEX1JFR0VYLnRlc3QobmFtZSkpXG4gICAgLm1hcChuYW1lID0+IG5hbWUuc3Vic3RyKDIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVLZXkobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBSSVZBVEVfUFJFRklYICsgbmFtZTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0RGVmaW5lUHJvcGVydHlWYWx1ZShvYmo6IGFueSwgcHJvcGVydHlOYW1lLCB2YWx1ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcGVydHlOYW1lLCA8YW55PntcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIEZsdWVudEFzc2lnbiBpbnN0YW5jZSwgYXBwbHkgYWxsIG9mIHRoZSBzdXBwbGllZCBkZWZhdWx0IHZhbHVlcyBzbyBjYWxsaW5nXG4gKiBpbnN0YW5jZS50b0pTT04gd2lsbCByZXR1cm4gdGhvc2UgdmFsdWVzIChkb2VzIG5vdCBjcmVhdGUgYSBzZXR0ZXIgZnVuY3Rpb24pXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWVzXG4gKi9cbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdFZhbHVlcyhpbnN0YW5jZTogYW55LCBkZWZhdWx0VmFsdWVzOiBPYmplY3QpOiB2b2lkIHtcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdFZhbHVlcylcbiAgICAuZm9yRWFjaChuYW1lID0+ICg8YW55Pmluc3RhbmNlKVtwcml2YXRlS2V5KG5hbWUpXSA9ICg8YW55PmRlZmF1bHRWYWx1ZXMpW25hbWVdKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiBmb3Igc2V0dGluZyBhIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgZ2l2ZW4gb2JqZWN0LlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGFwcGx5IHRoZSBrZXkgJiBzZXR0ZXIgb24uXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0XG4gKiBAcGFyYW0gd3JpdGVPbmNlIElmIHRydWUgd2lsbCBhbGxvdyB3cml0aW5nIG9uY2UgKGRlZmF1bHQ6IGZhbHNlKVxuICpcbiAqIEV4YW1wbGU6XG4gKiBsZXQgb2JqID0gbmV3IEZsdWVudEFzc2lnbjxhbnk+O1xuICogc2V0QXNzaWduTWV0aG9kKG9iaiwgJ215UHJvcCcpO1xuICogb2JqLm15UHJvcCgnc29tZVZhbHVlJyk7XG4gKiBjb25zdCByZXN1bHQgPSBvYmoudG9KU09OKCk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvL3sgbXlQcm9wOiAnc29tZVZhbHVlJyB9XG4gKlxuICpcbiAqIGxldCBvYmogPSBuZXcgRmx1ZW50QXNzaWduPGFueT47XG4gKiBzZXRBc3NpZ25NZXRob2Qob2JqLCAnbXlQcm9wJywgdHJ1ZSk7IC8vIGFwcGx5aW5nIHdyaXRlT25jZVxuICogb2JqLm15UHJvcCgnc29tZVZhbHVlJyk7XG4gKiBvYmoubXlQcm9wKCdzb21lVmFsdWUnKTsgLy8gRVJST1I6IE92ZXJyaWRpbmcgY29uZmlnIHByb3BlcnR5ICdteVByb3AnIGlzIG5vdCBhbGxvd2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0QXNzaWduTWV0aG9kPFQ+KG9iajogVCwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHdyaXRlT25jZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gIHZhbGlkYXRlTWV0aG9kTmFtZS5jYWxsKG9iaiwgcHJvcGVydHlOYW1lKTtcblxuICBjb25zdCBrZXkgPSBwcml2YXRlS2V5KHByb3BlcnR5TmFtZSk7XG4gIG9iamVjdERlZmluZVByb3BlcnR5VmFsdWUob2JqLCBwcm9wZXJ0eU5hbWUsICh2YWx1ZTogYW55KSA9PiB7XG4gICAgaWYgKHdyaXRlT25jZSAmJiB0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3ZlcnJpZGluZyBjb25maWcgcHJvcGVydHkgJyR7cHJvcGVydHlOYW1lfScgaXMgbm90IGFsbG93ZWQuYCk7XG4gICAgfVxuICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSB2YWx1ZSB0aGF0IGlzIGFuIGFsaWFzIHRvIGFuIG90aGVyIHNldHRlciBmdW5jdGlvbi5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBhcHBseSB0aGUga2V5ICYgc2V0dGVyIG9uLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdFxuICogQHBhcmFtIHNyY1Byb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdCB0aGlzIGFsaWFzIHBvaW50cyB0b1xuICogQHBhcmFtIGhhcmQgSWYgdHJ1ZSwgd2lsbCBzZXQgYSByZWFkb25seSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0IHRoYXQgcmV0dXJuc1xuICogICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgc291cmNlIHByb3BlcnR5LiBEZWZhdWx0OiBmYWxzZVxuICpcbiAqIEV4YW1wbGU6XG4gKiBsZXQgb2JqID0gbmV3IEZsdWVudEFzc2lnbjxhbnk+IDtcbiAqIHNldEFzc2lnbk1ldGhvZChvYmosICdteVByb3AnKTtcbiAqIHNldEFzc2lnbkFsaWFzKG9iaiwgJ215UHJvcEFsaWFzJywgJ215UHJvcCcpO1xuICogb2JqLm15UHJvcEFsaWFzKCdzb21lVmFsdWUnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IG9iai50b0pTT04oKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8veyBteVByb3A6ICdzb21lVmFsdWUnIH1cbiAqIHJlc3VsdC5teVByb3BBbGlhcyAvLyB1bmRlZmluZWRcbiAqXG4gKlxuICogbGV0IG9iaiA9IG5ldyBGbHVlbnRBc3NpZ248YW55PiA7XG4gKiBzZXRBc3NpZ25NZXRob2Qob2JqLCAnbXlQcm9wJyk7XG4gKiBzZXRBc3NpZ25BbGlhcyhvYmosICdteVByb3BBbGlhcycsICdteVByb3AnLCB0cnVlKTsgLy8gc2V0dGluZyBhIGhhcmQgYWxpYXMuXG4gKiBvYmoubXlQcm9wQWxpYXMoJ3NvbWVWYWx1ZScpO1xuICogY29uc3QgcmVzdWx0ID0gb2JqLnRvSlNPTigpO1xuICogY29uc29sZS5sb2cocmVzdWx0KTsgLy97IG15UHJvcDogJ3NvbWVWYWx1ZScgfVxuICogcmVzdWx0Lm15UHJvcEFsaWFzIC8vIHNvbWVWYWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0QXNzaWduQWxpYXM8VD4ob2JqOiBULCBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgdmFsaWRhdGVNZXRob2ROYW1lLmNhbGwob2JqLCBwcm9wZXJ0eU5hbWUpO1xuXG4gIG9iamVjdERlZmluZVByb3BlcnR5VmFsdWUob2JqLCBwcm9wZXJ0eU5hbWUsICh2YWx1ZTogYW55KSA9PiB7XG4gICAgb2JqW3NyY1Byb3BlcnR5TmFtZV0odmFsdWUpO1xuICAgIHJldHVybiBvYmo7XG4gIH0pO1xuXG4gIGlmIChoYXJkID09PSB0cnVlKSB7XG4gICAgY29uc3Qga2V5ID0gcHJpdmF0ZUtleShwcm9wZXJ0eU5hbWUpLFxuICAgICAgc3JjS2V5ID0gcHJpdmF0ZUtleShzcmNQcm9wZXJ0eU5hbWUpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCA8YW55PntcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGdldDogKCkgPT4gb2JqW3NyY0tleV1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIGZsdWVudCBhc3NpZ24gbWV0aG9kLlxuICogQSBmdW5jdGlvbiB0aGF0IGdldHMgYSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgaW5zdGFuY2UgaXQgd29ya3Mgb24uXG4gKi9cbmV4cG9ydCB0eXBlIEZsdWVudEFzc2lnbk1ldGhvZDxULCBaPiA9ICh2YWx1ZTogVCkgPT4gWjtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+IHtcbiAgZmx1ZW50QXNzaWduOiBaO1xuXG4gIHNldE1ldGhvZChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+O1xufVxuXG4vKipcbiAqIFJlcHJlc2VudCBhIGZsdWVudCBBUEkgZmFjdG9yeSB3cmFwcGVyIGZvciBkZWZpbmluZyBGbHVlbnRBc3NpZ24gaW5zdGFuY2VzLlxuICovXG5leHBvcnQgY2xhc3MgRmx1ZW50QXNzaWduRmFjdG9yeTxUPiB7XG4gIHByaXZhdGUgX2ZsdWVudEFzc2lnbjogRmx1ZW50QXNzaWduPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKGZsdWVudEFzc2lnbj86IEZsdWVudEFzc2lnbjxUPikge1xuICAgIHRoaXMuX2ZsdWVudEFzc2lnbiA9XG4gICAgICBmbHVlbnRBc3NpZ24gaW5zdGFuY2VvZiBGbHVlbnRBc3NpZ24gPyBmbHVlbnRBc3NpZ24gOiA8YW55Pm5ldyBGbHVlbnRBc3NpZ24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzZXR0ZXIgbWV0aG9kIG9uIHRoZSBGbHVlbnRBc3NpZ24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXR0ZXIgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgSWYgc2V0IChub3QgdW5kZWZpbmVkKSBzZXQncyB0aGUgdmFsdWUgb24gdGhlIGluc3RhbmNlIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgc2V0TWV0aG9kKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogRmx1ZW50QXNzaWduRmFjdG9yeTxUPiB7XG4gICAgc2V0QXNzaWduTWV0aG9kKHRoaXMuX2ZsdWVudEFzc2lnbiwgbmFtZSk7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAoPGFueT50aGlzLl9mbHVlbnRBc3NpZ24pW25hbWVdKGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBGbHVlbnRBc3NpZ24gaW5zdGFuY2UuXG4gICAqL1xuICBnZXQgZmx1ZW50QXNzaWduKCk6IEZsdWVudEFzc2lnbjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZsdWVudEFzc2lnbjtcbiAgfVxufVxuXG5cbi8qKlxuICogUmVwcmVzZW50IGFuIG9iamVjdCB3aGVyZSBldmVyeSBwcm9wZXJ0eSBpcyBhIGZ1bmN0aW9uIHJlcHJlc2VudGluZyBhbiBhc3NpZ25tZW50IGZ1bmN0aW9uLlxuICogQ2FsbGluZyBlYWNoIGZ1bmN0aW9uIHdpdGggYSB2YWx1ZSB3aWxsIGFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBvYmplY3QuXG4gKiBDYWxsaW5nICd0b0pTT04nIHJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBidXQgdGhpcyB0aW1lIHJlcHJlc2VudGluZyB0aGVcbiAqIGFzc2lnbmVkIHZhbHVlcy5cbiAqXG4gKiBUaGlzIGFsbG93cyBzZXR0aW5nIGFuIG9iamVjdCBpbiBhIGZsdWVudCBBUEkgbWFubmVyLlxuICogRXhhbXBsZTpcbiBsZXQgZmx1ZW50ID0gbmV3IEZsdWVudEFzc2lnbjxhbnk+KHVuZGVmaW5lZCwgWydzb21lJywgJ3dlbnQnXSk7XG4gZmx1ZW50LnNvbWUoJ3RoaW5nJykud2VudCgnd3JvbmcnKS50b0pTT04oKTtcbiAvLyB7IHNvbWU6ICd0aGluZycsIHdlbnQ6ICd3cm9uZycgfVxuICovXG5leHBvcnQgY2xhc3MgRmx1ZW50QXNzaWduPFQ+IHtcbiAgcHJpdmF0ZSBfX2ZsdWVudCRiYXNlX186IG5ldyAoKSA9PiBUO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgRmx1ZW50QXNzaWduRmFjdG9yeTxGbHVlbnRBc3NpZ248VD4+IHJlYWR5IHRvIGRlZmluZSBhIEZsdWVudEFzc2lnbiB0eXBlLlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlcyBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpbml0aWFsU2V0dGVycyBBIGxpc3Qgb2YgaW5pdGlhbCBzZXR0ZXJzIGZvciB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgY29tcG9zZTxUPihkZWZhdWx0VmFsdWVzPzogVCwgaW5pdGlhbFNldHRlcnM/OiBzdHJpbmdbXSk6IEZsdWVudEFzc2lnbkZhY3Rvcnk8VD4ge1xuXG4gICAgcmV0dXJuIDxhbnk+Rmx1ZW50QXNzaWduLmNvbXBvc2VXaXRoPEZsdWVudEFzc2lnbjxUPj4oXG4gICAgICBuZXcgRmx1ZW50QXNzaWduPFQ+KGRlZmF1bHRWYWx1ZXMsIGluaXRpYWxTZXR0ZXJzKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEZsdWVudEFzc2lnbkZhY3Rvcnk8Wj4gd2hlcmUgWiBpcyBhbiBpbnN0YW5jZSBvZiBGbHVlbnRBc3NpZ248Pz4gb3IgYSBkZXJpdmVkXG4gICAqIGNsYXNzIG9mIGl0LlxuICAgKiBAcGFyYW0gZmx1ZW50QXNzaWduIEFuIGluc3RhbmNlIG9mIEZsdWVudEFzc2lnbjw/PiBvciBhIGRlcml2ZWQgY2xhc3Mgb2YgRmx1ZW50QXNzaWduPD8+LlxuICAgKi9cbiAgc3RhdGljIGNvbXBvc2VXaXRoPFo+KGZsdWVudEFzc2lnbjogWik6IElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+IHtcbiAgICByZXR1cm4gPGFueT5uZXcgRmx1ZW50QXNzaWduRmFjdG9yeTxhbnk+KDxhbnk+Zmx1ZW50QXNzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlcyBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgdW5kZXJseWluZyBvYmplY3QuXG4gICAqIEBwYXJhbSBpbml0aWFsU2V0dGVycyBBIGxpc3Qgb2YgaW5pdGlhbCBzZXR0ZXJzIGZvciB0aGlzIEZsdWVudEFzc2lnbi5cbiAgICogQHBhcmFtIGJhc2VUeXBlIHRoZSBjbGFzcy90eXBlIHRvIGNyZWF0ZSBhIG5ldyBiYXNlLiBvcHRpb25hbCwge30gaXMgdXNlZCBpZiBub3Qgc3VwcGxpZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWVzPzogVCB8IFRbXSwgaW5pdGlhbFNldHRlcnM/OiBzdHJpbmdbXSwgYmFzZVR5cGU/OiBuZXcgKCkgPT4gVCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZXMpKSB7XG4gICAgICAoZGVmYXVsdFZhbHVlcyBhcyBBcnJheTxhbnk+KS5mb3JFYWNoKGQgPT4gYXBwbHlEZWZhdWx0VmFsdWVzKHRoaXMsIGQpKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZXMpIHtcbiAgICAgIGFwcGx5RGVmYXVsdFZhbHVlcyh0aGlzLCBkZWZhdWx0VmFsdWVzKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0aWFsU2V0dGVycykpIHtcblxuICAgICAgaW5pdGlhbFNldHRlcnMuZm9yRWFjaChuYW1lID0+IHNldEFzc2lnbk1ldGhvZCh0aGlzLCBuYW1lKSk7XG4gICAgfVxuXG4gICAgaWYgKGJhc2VUeXBlKSB7XG4gICAgICB0aGlzLl9fZmx1ZW50JGJhc2VfXyA9IGJhc2VUeXBlO1xuICAgIH1cbiAgfVxuXG4gIHRvSlNPTigpOiBUIHtcbiAgICByZXR1cm4gZ2V0QXNzaWduZWRQcm9wZXJ0eU5hbWVzKHRoaXMpXG4gICAgICAucmVkdWNlKChvYmo6IFQsIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBwcml2YXRlS2V5KG5hbWUpO1xuICAgICAgICAvLyByZS1kZWZpbmUgcHJvcGVydHkgZGVzY3JpcHRvcnMgKHdlIGRvbnQgd2FudCB0aGVpciB2YWx1ZSlcbiAgICAgICAgY29uc3QgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIGtleSk7XG4gICAgICAgIGlmIChwcm9wRGVzYykge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIHByb3BEZXNjKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAoPGFueT5vYmopW25hbWVdID0gKDxhbnk+dGhpcylba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSwgdGhpcy5fX2ZsdWVudCRiYXNlX18gPyBuZXcgdGhpcy5fX2ZsdWVudCRiYXNlX18oKSA6IDxhbnk+e30pO1xuICB9XG59XG4iXX0=