@pebula/metap
Version:
meta-programming tools
524 lines • 30.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { isFunction } from '@pebula/utils';
import { targetStore as _targetStore, RelationMetadata, PropMetadata, ExcludeMetadata, TargetStore, TargetMetadata } from '@pebula/metap/internal';
import { Model } from '@pebula/metap';
import { Prop, Identity, Exclude, Relation } from '@pebula/metap';
/** @type {?} */
var targetStore = _targetStore;
/**
* @param {?} target
* @return {?}
*/
function getTargetMetaStore(target) {
return (/** @type {?} */ (targetStore.getTargetMeta(target)));
}
var TestTargetStore = /** @class */ (function (_super) {
tslib_1.__extends(TestTargetStore, _super);
function TestTargetStore() {
return _super !== null && _super.apply(this, arguments) || this;
}
/**
* @param {?} target
* @return {?}
*/
TestTargetStore.getTargetMeta = /**
* @param {?} target
* @return {?}
*/
function (target) {
return targetStore.builtTargets.get(target);
};
/**
* @template T
* @param {?} target
* @return {?}
*/
TestTargetStore.getModel = /**
* @template T
* @param {?} target
* @return {?}
*/
function (target) {
/** @type {?} */
var t = targetStore.getTargetMeta(target);
return t && t.model();
};
/**
* @return {?}
*/
TestTargetStore.clearAll = /**
* @return {?}
*/
function () {
targetStore.namedTargets.clear();
targetStore.builtTargets.clear();
targetStore.targets.clear();
targetStore.locals.clear();
};
/**
* @param {?} target
* @return {?}
*/
TestTargetStore.clear = /**
* @param {?} target
* @return {?}
*/
function (target) {
/** @type {?} */
var meta = targetStore.builtTargets.get(target);
if (meta) {
targetStore.namedTargets.delete(meta.model().resName);
targetStore.builtTargets.delete(target);
targetStore.targets.get(target).clear();
}
};
return TestTargetStore;
}(TargetStore));
export { TestTargetStore };
// @dynamic
var TestTargetMetadata = /** @class */ (function (_super) {
tslib_1.__extends(TestTargetMetadata, _super);
function TestTargetMetadata() {
return _super !== null && _super.apply(this, arguments) || this;
}
/**
* @template T, Z
* @param {?} type
* @return {?}
*/
TestTargetMetadata.getFactory = /**
* @template T, Z
* @param {?} type
* @return {?}
*/
function (type) {
return (/**
* @param {?} target
* @param {?} key
* @return {?}
*/
function (target, key) {
/** @type {?} */
var t = getTargetMetaStore(target);
if (t) {
return t.config.get(type, key);
}
});
};
/**
* @template T, Z
* @param {?} type
* @return {?}
*/
TestTargetMetadata.removeFactory = /**
* @template T, Z
* @param {?} type
* @return {?}
*/
function (type) {
return (/**
* @param {?} target
* @param {?} key
* @return {?}
*/
function (target, key) {
/** @type {?} */
var t = TestTargetStore.getTargetMeta(target);
if (t) {
return t.config.delete(type, key);
}
});
};
/**
* @param {?} target
* @param {?} key
* @param {?=} meta
* @return {?}
*/
TestTargetMetadata.addRelation = /**
* @param {?} target
* @param {?} key
* @param {?=} meta
* @return {?}
*/
function (target, key, meta) {
Relation(meta)(target.prototype, key);
};
/**
* @param {?} target
* @param {?} key
* @param {?=} meta
* @return {?}
*/
TestTargetMetadata.addProp = /**
* @param {?} target
* @param {?} key
* @param {?=} meta
* @return {?}
*/
function (target, key, meta) {
Prop(meta)(target.prototype, key);
};
/**
* @param {?} target
* @return {?}
*/
TestTargetMetadata.setExcludeClass = /**
* @param {?} target
* @return {?}
*/
function (target) {
Exclude()(target);
};
/**
* @param {?} target
* @param {?} key
* @param {?=} meta
* @return {?}
*/
TestTargetMetadata.addExclude = /**
* @param {?} target
* @param {?} key
* @param {?=} meta
* @return {?}
*/
function (target, key, meta) {
Exclude(meta)(target.prototype, key);
};
TestTargetMetadata.getRelation = TestTargetMetadata.getFactory(RelationMetadata);
TestTargetMetadata.getProp = TestTargetMetadata.getFactory(PropMetadata);
TestTargetMetadata.getExclude = TestTargetMetadata.getFactory(ExcludeMetadata);
TestTargetMetadata.removeRelation = TestTargetMetadata.removeFactory(RelationMetadata);
TestTargetMetadata.removeProp = TestTargetMetadata.removeFactory(PropMetadata);
TestTargetMetadata.removeExclude = TestTargetMetadata.removeFactory(ExcludeMetadata);
return TestTargetMetadata;
}(TargetMetadata));
export { TestTargetMetadata };
if (false) {
/** @type {?} */
TestTargetMetadata.getRelation;
/** @type {?} */
TestTargetMetadata.getProp;
/** @type {?} */
TestTargetMetadata.getExclude;
/** @type {?} */
TestTargetMetadata.removeRelation;
/** @type {?} */
TestTargetMetadata.removeProp;
/** @type {?} */
TestTargetMetadata.removeExclude;
}
/**
* @template T, Z
*/
var /**
* @template T, Z
*/
TargetMetaModifier = /** @class */ (function () {
function TargetMetaModifier(target) {
this.target = target;
}
/**
* @return {?}
*/
TargetMetaModifier.prototype.build = /**
* @return {?}
*/
function () {
targetStore
.getTargetMeta(this.target)
.model()
.build();
};
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
TargetMetaModifier.prototype.clear = /**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
function () {
TestTargetStore.clear((/** @type {?} */ (this)).target);
return (/** @type {?} */ (this));
};
/**
* Registers a new model
*
* > Clears the model from the registry before trying to register.
* @param metaArgs
* @param type
* @returns
*/
/**
* Registers a new model
*
* > Clears the model from the registry before trying to register.
* @template THIS,T
* @this {THIS}
* @param {?=} metaArgs
* @return {THIS}
*/
TargetMetaModifier.prototype.setModel = /**
* Registers a new model
*
* > Clears the model from the registry before trying to register.
* @template THIS,T
* @this {THIS}
* @param {?=} metaArgs
* @return {THIS}
*/
function (metaArgs) {
if (metaArgs === void 0) { metaArgs = undefined; }
(/** @type {?} */ (this)).clear();
Model(metaArgs)((/** @type {?} */ (this)).target);
return (/** @type {?} */ (this));
};
/**
* Set/Update/Remove the identity field.
* If key is empty will remove identity.
* @param key
* @returns
*/
/**
* Set/Update/Remove the identity field.
* If key is empty will remove identity.
* @template THIS
* @this {THIS}
* @param {?=} key
* @return {THIS}
*/
TargetMetaModifier.prototype.setIdentity = /**
* Set/Update/Remove the identity field.
* If key is empty will remove identity.
* @template THIS
* @this {THIS}
* @param {?=} key
* @return {THIS}
*/
function (key) {
Identity()((/** @type {?} */ (this)).target.prototype, key);
return (/** @type {?} */ (this));
};
/**
* Set exclusion/inclusion at the class level
* @param exclude
* @returns
*/
/**
* Set exclusion/inclusion at the class level
* @template THIS
* @this {THIS}
* @param {?} exclude
* @return {THIS}
*/
TargetMetaModifier.prototype.setExclude = /**
* Set exclusion/inclusion at the class level
* @template THIS
* @this {THIS}
* @param {?} exclude
* @return {THIS}
*/
function (exclude) {
if (!exclude) {
delete targetStore.getTargetMeta((/** @type {?} */ (this)).target).model().transformStrategy;
}
else {
TestTargetMetadata.setExcludeClass((/** @type {?} */ (this)).target);
}
return (/** @type {?} */ (this));
};
/**
* @template P
* @param {?} key
* @return {?}
*/
TargetMetaModifier.prototype.getProp = /**
* @template P
* @param {?} key
* @return {?}
*/
function (key) {
return TestTargetMetadata.getProp(this.target, key);
};
/**
* @template P
* @param {?} key
* @return {?}
*/
TargetMetaModifier.prototype.getType = /**
* @template P
* @param {?} key
* @return {?}
*/
function (key) {
return this.getProp(key).type;
};
/**
* @template P
* @param {?} key
* @return {?}
*/
TargetMetaModifier.prototype.getRelation = /**
* @template P
* @param {?} key
* @return {?}
*/
function (key) {
return TestTargetMetadata.getRelation(this.target, key);
};
/**
* @template P
* @param {?} key
* @return {?}
*/
TargetMetaModifier.prototype.getExclude = /**
* @template P
* @param {?} key
* @return {?}
*/
function (key) {
return TestTargetMetadata.getExclude(this.target, key);
};
/**
* @template THIS
* @this {THIS}
* @param {?} key
* @param {?=} meta
* @return {THIS}
*/
TargetMetaModifier.prototype.relation = /**
* @template THIS
* @this {THIS}
* @param {?} key
* @param {?=} meta
* @return {THIS}
*/
function (key, meta) {
TestTargetMetadata.removeRelation((/** @type {?} */ (this)).target, key);
if (typeof meta !== 'boolean') {
TestTargetMetadata.addRelation((/** @type {?} */ (this)).target, key.toString(), meta);
}
return (/** @type {?} */ (this));
};
/**
* Add or remove prop, to remove set meta to false
* @param key
* @param meta
* @param type
* @returns
*/
/**
* Add or remove prop, to remove set meta to false
* @template THIS
* @this {THIS}
* @param {?} key
* @param {?=} meta
* @param {?=} type
* @return {THIS}
*/
TargetMetaModifier.prototype.prop = /**
* Add or remove prop, to remove set meta to false
* @template THIS
* @this {THIS}
* @param {?} key
* @param {?=} meta
* @param {?=} type
* @return {THIS}
*/
function (key, meta, type) {
TestTargetMetadata.removeProp((/** @type {?} */ (this)).target, key);
if ((!type && isFunction(meta)) || isFunction(type)) {
((/** @type {?} */ (Reflect))).defineMetadata('design:type', type || meta, (/** @type {?} */ (this)).target.prototype, key);
}
if (typeof meta !== 'boolean' && !isFunction(meta)) {
TestTargetMetadata.addProp((/** @type {?} */ (this)).target, key.toString(), meta);
}
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @param {...?} args
* @return {THIS}
*/
TargetMetaModifier.prototype.props = /**
* @template THIS
* @this {THIS}
* @param {...?} args
* @return {THIS}
*/
function () {
var _this = this;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
args.forEach((/**
* @template THIS
* @this {THIS}
* @param {?} a
* @return {THIS}
*/
function (a) { return (/** @type {?} */ (_this)).prop(a); }));
return (/** @type {?} */ (this));
};
/**
* Add or remove exclude, to remove set meta to false
* @param key
* @param meta
* @returns
*/
/**
* Add or remove exclude, to remove set meta to false
* @template THIS
* @this {THIS}
* @param {?} key
* @param {?=} meta
* @return {THIS}
*/
TargetMetaModifier.prototype.exclude = /**
* Add or remove exclude, to remove set meta to false
* @template THIS
* @this {THIS}
* @param {?} key
* @param {?=} meta
* @return {THIS}
*/
function (key, meta) {
TestTargetMetadata.removeExclude((/** @type {?} */ (this)).target, key);
if (typeof meta !== 'boolean') {
TestTargetMetadata.addExclude((/** @type {?} */ (this)).target, key.toString(), meta);
}
return (/** @type {?} */ (this));
};
/**
* @template T, Z
* @param {?} target
* @return {?}
*/
TargetMetaModifier.create = /**
* @template T, Z
* @param {?} target
* @return {?}
*/
function (target) {
return new TargetMetaModifier(target);
};
return TargetMetaModifier;
}());
/**
* @template T, Z
*/
export { TargetMetaModifier };
if (false) {
/** @type {?} */
TargetMetaModifier.prototype.target;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kaWZpZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AcGVidWxhL21ldGFwL3Rlc3RpbmcvIiwic291cmNlcyI6WyJsaWIvbW9kaWZpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFDTCxXQUFXLElBQUksWUFBWSxFQUszQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsY0FBYyxFQUdmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOztJQUU1RCxXQUFXLEdBQW9CLFlBQVk7Ozs7O0FBRWpELFNBQVMsa0JBQWtCLENBQUMsTUFBVztJQUNyQyxPQUFPLG1CQUFBLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQU8sQ0FBQztBQUNsRCxDQUFDO0FBRUQ7SUFBcUMsMkNBQVc7SUFBaEQ7O0lBeUJBLENBQUM7Ozs7O0lBeEJRLDZCQUFhOzs7O0lBQXBCLFVBQXFCLE1BQVc7UUFDOUIsT0FBTyxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDOzs7Ozs7SUFFTSx3QkFBUTs7Ozs7SUFBZixVQUF5RCxNQUF3Qjs7WUFDekUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUssQ0FBQztJQUMzQixDQUFDOzs7O0lBRU0sd0JBQVE7OztJQUFmO1FBQ0UsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FB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QyxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7Ozs7SUFDSCxvQ0FBTzs7Ozs7Ozs7SUFBUCxVQUFRLEdBQVksRUFBRSxJQUFrQztRQUN0RCxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsbUJBQUEsSUFBSSxFQUFBLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELElBQUksT0FBTyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzdCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQztJQUNkLENBQUM7Ozs7OztJQUVNLHlCQUFNOzs7OztJQUFiLFVBQW9CLE1BQTBCO1FBQzVDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0gseUJBQUM7QUFBRCxDQUFDLEFBcElELElBb0lDOzs7Ozs7O0lBbklhLG9DQUFpQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRnVuY3Rpb24sIENvbnN0cnVjdG9yIH0gZnJvbSAnQHBlYnVsYS91dGlscyc7XG5pbXBvcnQge1xuICB0YXJnZXRTdG9yZSBhcyBfdGFyZ2V0U3RvcmUsXG4gIFByb3BNZXRhZGF0YUFyZ3MsXG4gIE1vZGVsTWV0YWRhdGFBcmdzLFxuICBFeGNsdWRlTWV0YWRhdGFBcmdzLFxuICBSZWxhdGlvbk1ldGFkYXRhQXJncyxcbiAgUmVsYXRpb25NZXRhZGF0YSxcbiAgUHJvcE1ldGFkYXRhLFxuICBFeGNsdWRlTWV0YWRhdGEsXG4gIFRhcmdldFN0b3JlLFxuICBUYXJnZXRNZXRhZGF0YSxcbiAgTW9kZWxNZXRhZGF0YSxcbiAgVHlwZU1ldGFkYXRhXG59IGZyb20gJ0BwZWJ1bGEvbWV0YXAvaW50ZXJuYWwnO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAcGVidWxhL21ldGFwJztcblxuaW1wb3J0IHsgUHJvcCwgSWRlbnRpdHksIEV4Y2x1ZGUsIFJlbGF0aW9uIH0gZnJvbSAnQHBlYnVsYS9tZXRhcCc7XG5cbmNvbnN0IHRhcmdldFN0b3JlOiBUZXN0VGFyZ2V0U3RvcmUgPSBfdGFyZ2V0U3RvcmU7XG5cbmZ1bmN0aW9uIGdldFRhcmdldE1ldGFTdG9yZSh0YXJnZXQ6IGFueSk6IFRlc3RUYXJnZXRNZXRhZGF0YSB7XG4gIHJldHVybiB0YXJnZXRTdG9yZS5nZXRUYXJnZXRNZXRhKHRhcmdldCkgYXMgYW55O1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdFRhcmdldFN0b3JlIGV4dGVuZHMgVGFyZ2V0U3RvcmUge1xuICBzdGF0aWMgZ2V0VGFyZ2V0TWV0YSh0YXJnZXQ6IGFueSk6IFRlc3RUYXJnZXRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRhcmdldFN0b3JlLmJ1aWx0VGFyZ2V0cy5nZXQodGFyZ2V0KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb2RlbDxUIGV4dGVuZHMgTW9kZWxNZXRhZGF0YSA9IE1vZGVsTWV0YWRhdGE+KHRhcmdldDogQ29uc3RydWN0b3I8YW55Pik6IFQge1xuICAgIGNvbnN0IHQgPSB0YXJnZXRTdG9yZS5nZXRUYXJnZXRNZXRhKHRhcmdldCk7XG4gICAgcmV0dXJuIHQgJiYgdC5tb2RlbDxUPigpO1xuICB9XG5cbiAgc3RhdGljIGNsZWFyQWxsKCk6IHZvaWQge1xuICAgIHRhcmdldFN0b3JlLm5hbWVkVGFyZ2V0cy5jbGVhcigpO1xuICAgIHRhcmdldFN0b3JlLmJ1aWx0VGFyZ2V0cy5jbGVhcigpO1xuICAgIHRhcmdldFN0b3JlLnRhcmdldHMuY2xlYXIoKTtcbiAgICB0YXJnZXRTdG9yZS5sb2NhbHMuY2xlYXIoKTtcbiAgfVxuXG4gIHN0YXRpYyBjbGVhcih0YXJnZXQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSB0YXJnZXRTdG9yZS5idWlsdFRhcmdldHMuZ2V0KHRhcmdldCk7XG4gICAgaWYgKG1ldGEpIHtcbiAgICAgIHRhcmdldFN0b3JlLm5hbWVkVGFyZ2V0cy5kZWxldGUobWV0YS5tb2RlbCgpLnJlc05hbWUpO1xuICAgICAgdGFyZ2V0U3RvcmUuYnVpbHRUYXJnZXRzLmRlbGV0ZSh0YXJnZXQpO1xuICAgICAgdGFyZ2V0U3RvcmUudGFyZ2V0cy5nZXQodGFyZ2V0KS5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIFRlc3RUYXJnZXRNZXRhZGF0YSBleHRlbmRzIFRhcmdldE1ldGFkYXRhIHtcbiAgc3RhdGljIGdldEZhY3Rvcnk8VCwgWj4odHlwZTogWiAmIENvbnN0cnVjdG9yPFQ+KTogKHRhcmdldDogYW55LCBrZXk6IGFueSkgPT4gVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHQgPSBnZXRUYXJnZXRNZXRhU3RvcmUodGFyZ2V0KTtcbiAgICAgIGlmICh0KSB7XG4gICAgICAgIHJldHVybiB0LmNvbmZpZy5nZXQodHlwZSwga2V5KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZUZhY3Rvcnk8VCwgWj4odHlwZTogWiAmIENvbnN0cnVjdG9yPFQ+KTogKHRhcmdldDogYW55LCBrZXk6IGFueSkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHQgPSBUZXN0VGFyZ2V0U3RvcmUuZ2V0VGFyZ2V0TWV0YSh0YXJnZXQpO1xuICAgICAgaWYgKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuY29uZmlnLmRlbGV0ZSh0eXBlLCBrZXkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0UmVsYXRpb24gPSBUZXN0VGFyZ2V0TWV0YWRhdGEuZ2V0RmFjdG9yeShSZWxhdGlvbk1ldGFkYXRhKTtcbiAgc3RhdGljIGdldFByb3AgPSBUZXN0VGFyZ2V0TWV0YWRhdGEuZ2V0RmFjdG9yeShQcm9wTWV0YWRhdGEpO1xuICBzdGF0aWMgZ2V0RXhjbHVkZSA9IFRlc3RUYXJnZXRNZXRhZGF0YS5nZXRGYWN0b3J5KEV4Y2x1ZGVNZXRhZGF0YSk7XG5cbiAgc3RhdGljIHJlbW92ZVJlbGF0aW9uID0gVGVzdFRhcmdldE1ldGFkYXRhLnJlbW92ZUZhY3RvcnkoUmVsYXRpb25NZXRhZGF0YSk7XG4gIHN0YXRpYyByZW1vdmVQcm9wID0gVGVzdFRhcmdldE1ldGFkYXRhLnJlbW92ZUZhY3RvcnkoUHJvcE1ldGFkYXRhKTtcbiAgc3RhdGljIHJlbW92ZUV4Y2x1ZGUgPSBUZXN0VGFyZ2V0TWV0YWRhdGEucmVtb3ZlRmFjdG9yeShFeGNsdWRlTWV0YWRhdGEpO1xuXG4gIHN0YXRpYyBhZGRSZWxhdGlvbihcbiAgICB0YXJnZXQ6IENvbnN0cnVjdG9yPGFueT4sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgbWV0YT86IFJlbGF0aW9uTWV0YWRhdGFBcmdzXG4gICk6IHZvaWQge1xuICAgIFJlbGF0aW9uKG1ldGEpKHRhcmdldC5wcm90b3R5cGUsIGtleSk7XG4gIH1cblxuICBzdGF0aWMgYWRkUHJvcChcbiAgICB0YXJnZXQ6IENvbnN0cnVjdG9yPGFueT4sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgbWV0YT86IFByb3BNZXRhZGF0YUFyZ3NcbiAgKTogdm9pZCB7XG4gICAgUHJvcChtZXRhKSh0YXJnZXQucHJvdG90eXBlLCBrZXkpO1xuICB9XG5cbiAgc3RhdGljIHNldEV4Y2x1ZGVDbGFzcyh0YXJnZXQ6IENvbnN0cnVjdG9yPGFueT4pOiB2b2lkIHtcbiAgICBFeGNsdWRlKCkodGFyZ2V0KTtcbiAgfVxuXG4gIHN0YXRpYyBhZGRFeGNsdWRlKFxuICAgIHRhcmdldDogQ29uc3RydWN0b3I8YW55PixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBtZXRhPzogRXhjbHVkZU1ldGFkYXRhQXJnc1xuICApOiB2b2lkIHtcbiAgICBFeGNsdWRlKG1ldGEpKHRhcmdldC5wcm90b3R5cGUsIGtleSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhcmdldE1ldGFNb2RpZmllcjxULCBaPiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0YXJnZXQ6IFogJiBDb25zdHJ1Y3RvcjxUPikge31cblxuICBidWlsZCgpOiB2b2lkIHtcbiAgICB0YXJnZXRTdG9yZVxuICAgICAgLmdldFRhcmdldE1ldGEodGhpcy50YXJnZXQpXG4gICAgICAubW9kZWwoKVxuICAgICAgLmJ1aWxkKCk7XG4gIH1cblxuICBjbGVhcigpOiB0aGlzIHtcbiAgICBUZXN0VGFyZ2V0U3RvcmUuY2xlYXIodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBtb2RlbFxuICAgKlxuICAgKiA+IENsZWFycyB0aGUgbW9kZWwgZnJvbSB0aGUgcmVnaXN0cnkgYmVmb3JlIHRyeWluZyB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIG1ldGFBcmdzXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzZXRNb2RlbDxUIGV4dGVuZHMgTW9kZWxNZXRhZGF0YUFyZ3M+KG1ldGFBcmdzOiBUID0gdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIE1vZGVsKG1ldGFBcmdzKSh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0L1VwZGF0ZS9SZW1vdmUgdGhlIGlkZW50aXR5IGZpZWxkLlxuICAgKiBJZiBrZXkgaXMgZW1wdHkgd2lsbCByZW1vdmUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybnNcbiAgICovXG4gIHNldElkZW50aXR5KGtleT86IGtleW9mIFQpOiB0aGlzIHtcbiAgICBJZGVudGl0eSgpKHRoaXMudGFyZ2V0LnByb3RvdHlwZSwga2V5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZXhjbHVzaW9uL2luY2x1c2lvbiBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICogQHBhcmFtIGV4Y2x1ZGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHNldEV4Y2x1ZGUoZXhjbHVkZTogYm9vbGVhbik6IHRoaXMge1xuICAgIGlmICghZXhjbHVkZSkge1xuICAgICAgZGVsZXRlIHRhcmdldFN0b3JlLmdldFRhcmdldE1ldGEodGhpcy50YXJnZXQpLm1vZGVsKCkudHJhbnNmb3JtU3RyYXRlZ3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIFRlc3RUYXJnZXRNZXRhZGF0YS5zZXRFeGNsdWRlQ2xhc3ModGhpcy50YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldFByb3A8UCBleHRlbmRzIGtleW9mIFQ+KGtleTogUCk6IFByb3BNZXRhZGF0YSB7XG4gICAgcmV0dXJuIFRlc3RUYXJnZXRNZXRhZGF0YS5nZXRQcm9wKHRoaXMudGFyZ2V0LCBrZXkpO1xuICB9XG5cbiAgZ2V0VHlwZTxQIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBQKTogVHlwZU1ldGFkYXRhIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKGtleSkudHlwZTtcbiAgfVxuXG4gIGdldFJlbGF0aW9uPFAgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IFApOiBSZWxhdGlvbk1ldGFkYXRhIHtcbiAgICByZXR1cm4gVGVzdFRhcmdldE1ldGFkYXRhLmdldFJlbGF0aW9uKHRoaXMudGFyZ2V0LCBrZXkpO1xuICB9XG5cbiAgZ2V0RXhjbHVkZTxQIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBQKTogRXhjbHVkZU1ldGFkYXRhIHtcbiAgICByZXR1cm4gVGVzdFRhcmdldE1ldGFkYXRhLmdldEV4Y2x1ZGUodGhpcy50YXJnZXQsIGtleSk7XG4gIH1cblxuICByZWxhdGlvbihrZXk6IGtleW9mIFQsIG1ldGE/OiBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IGZhbHNlKTogdGhpcyB7XG4gICAgVGVzdFRhcmdldE1ldGFkYXRhLnJlbW92ZVJlbGF0aW9uKHRoaXMudGFyZ2V0LCBrZXkpO1xuXG4gICAgaWYgKHR5cGVvZiBtZXRhICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIFRlc3RUYXJnZXRNZXRhZGF0YS5hZGRSZWxhdGlvbih0aGlzLnRhcmdldCwga2V5LnRvU3RyaW5nKCksIG1ldGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBvciByZW1vdmUgcHJvcCwgdG8gcmVtb3ZlIHNldCBtZXRhIHRvIGZhbHNlXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIG1ldGFcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByb3AoXG4gICAga2V5OiBrZXlvZiBULFxuICAgIG1ldGE/OiBQcm9wTWV0YWRhdGFBcmdzIHwgZmFsc2UgfCBGdW5jdGlvbixcbiAgICB0eXBlPzogRnVuY3Rpb25cbiAgKTogdGhpcyB7XG4gICAgVGVzdFRhcmdldE1ldGFkYXRhLnJlbW92ZVByb3AodGhpcy50YXJnZXQsIGtleSk7XG5cbiAgICBpZiAoKCF0eXBlICYmIGlzRnVuY3Rpb24obWV0YSkpIHx8IGlzRnVuY3Rpb24odHlwZSkpIHtcbiAgICAgIChSZWZsZWN0IGFzIGFueSkuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgICdkZXNpZ246dHlwZScsXG4gICAgICAgIHR5cGUgfHwgbWV0YSxcbiAgICAgICAgdGhpcy50YXJnZXQucHJvdG90eXBlLFxuICAgICAgICBrZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtZXRhICE9PSAnYm9vbGVhbicgJiYgIWlzRnVuY3Rpb24obWV0YSkpIHtcbiAgICAgIFRlc3RUYXJnZXRNZXRhZGF0YS5hZGRQcm9wKHRoaXMudGFyZ2V0LCBrZXkudG9TdHJpbmcoKSwgbWV0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcm9wcyguLi5hcmdzOiBBcnJheTxrZXlvZiBUPik6IHRoaXMge1xuICAgIGFyZ3MuZm9yRWFjaChhID0+IHRoaXMucHJvcChhKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG9yIHJlbW92ZSBleGNsdWRlLCB0byByZW1vdmUgc2V0IG1ldGEgdG8gZmFsc2VcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gbWV0YVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZXhjbHVkZShrZXk6IGtleW9mIFQsIG1ldGE/OiBFeGNsdWRlTWV0YWRhdGFBcmdzIHwgZmFsc2UpOiB0aGlzIHtcbiAgICBUZXN0VGFyZ2V0TWV0YWRhdGEucmVtb3ZlRXhjbHVkZSh0aGlzLnRhcmdldCwga2V5KTtcbiAgICBpZiAodHlwZW9mIG1ldGEgIT09ICdib29sZWFuJykge1xuICAgICAgVGVzdFRhcmdldE1ldGFkYXRhLmFkZEV4Y2x1ZGUodGhpcy50YXJnZXQsIGtleS50b1N0cmluZygpLCBtZXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlPFQsIFo+KHRhcmdldDogWiAmIENvbnN0cnVjdG9yPFQ+KTogVGFyZ2V0TWV0YU1vZGlmaWVyPFQsIFo+IHtcbiAgICByZXR1cm4gbmV3IFRhcmdldE1ldGFNb2RpZmllcih0YXJnZXQpO1xuICB9XG59XG4iXX0=