UNPKG

ngx-airbrush

Version:

Angular client for jsonapi/Graphiti backends

316 lines 21.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { JsonapiConverter } from './converters/jsonapi.converter'; import { ModelMetadata, AttributeMetadata } from './decorators/symboles'; import { ResourceSerializer } from './resource.serializer'; import { ResourceMetadataWrapper } from './resource-metadata.wrapper'; /** * @abstract */ export class ResourceBase { /** * @param {?=} data */ constructor(data) { this.modelInitialization = false; this.modelSerialization = false; this.__isRelation = false; if (!data) { return; } this.modelInitialization = true; this.id = data.id; this.assign(data); this.modelInitialization = false; } /** * @private * @return {?} */ get __wrapper() { if (!this.__mdwrapper) { this.__mdwrapper = new ResourceMetadataWrapper(this); } return this.__mdwrapper; } /** * @private * @return {?} */ get __serializer() { if (!this.__resSerializer) { this.__resSerializer = new ResourceSerializer(this); } return this.__resSerializer; } /** * @template T * @param {?} constructor * @param {?=} data * @return {?} */ static getModel(constructor, data) { /** @type {?} */ const ret = new JsonapiConverter().deserialize(data); return new constructor(ret); } /** * @template T * @param {?} constructor * @param {?} data * @param {?=} options * @return {?} */ static getAsRelationship(constructor, data, options) { if (!data) { return null; } options = Object.assign({ method: 'untouched', modelInit: false }, options); /** @type {?} */ let model; if (options.modelInit) { model = new constructor(data); } else { model = new constructor(); model.id = data.id; model.assign(data); } model.__isRelation = true; model.__method = options.method; return model; } /** * @return {?} */ isModelInitialization() { return this.modelInitialization; } /** * @return {?} */ get modelOptions() { return Reflect.getMetadata(ModelMetadata, this.constructor); } /** * @return {?} */ get type() { return this.modelOptions.type; } /** * @return {?} */ get hasBeenTouched() { /** @type {?} */ const touched = this.__isRelation && this.__method !== 'untouched'; return this.hasDirtyAttributes || this.hasDirtyBelongsTos || this.hasDirtyHasManys || touched; } /** * @return {?} */ get hasDirtyAttributes() { /** @type {?} */ const attributesMetadata = this[AttributeMetadata]; for (const propertyName in attributesMetadata) { if (attributesMetadata.hasOwnProperty(propertyName) && attributesMetadata[propertyName].hasDirtyAttributes) { return true; } } return false; } /** * @return {?} */ get hasDirtyBelongsTos() { /** @type {?} */ const keys = this.__wrapper.belongsToKeys({ defined: true }); /** @type {?} */ let touched = false; keys.forEach((/** * @param {?} key * @return {?} */ key => { touched = touched || this[key].hasBeenTouched; })); return touched; } /** * @return {?} */ get hasDirtyHasManys() { /** @type {?} */ const keys = this.__wrapper.hasManyKeys({ defined: true }); /** @type {?} */ let touched = false; keys.forEach((/** * @param {?} key * @return {?} */ key => { touched = touched || this[key].map((/** * @param {?} elt * @return {?} */ elt => elt.hasBeenTouched)).reduce((/** * @param {?} res * @param {?} bool * @return {?} */ (res, bool) => res || bool), false); })); return touched; } /** * @return {?} */ get isRelation() { return this.__isRelation; } /** * @return {?} */ get relationMethod() { if (this.__method !== 'untouched') { return this.__method; } if (!this.hasBeenTouched) { return 'untouched'; } if (this.id) { return 'update'; } return 'create'; } /** * @return {?} */ rollbackAttributes() { /** @type {?} */ const attributesMetadata = this[AttributeMetadata]; for (const propertyName in attributesMetadata) { if (attributesMetadata.hasOwnProperty(propertyName) && attributesMetadata[propertyName].hasDirtyAttributes) { this[propertyName] = attributesMetadata[propertyName].oldValue; } } } /** * @param {?} data * @return {?} */ assign(data) { /** @type {?} */ const clone = this.translateKeys(data); Object.assign(this, clone); if (this.__isRelation) { this.__method = this.relationMethod; } } /** * @return {?} */ disassociate() { this.__method = 'disassociate'; } /** * @return {?} */ destroy() { if (this.isRelation) { this.__method = 'destroy'; } else { throw new Error('Destroying resource is not supported! Use the service instead.'); } } /** * @return {?} */ toJsonapi() { return this.__serializer.toJsonapi(); } /** * @return {?} */ toHash() { return this.__serializer.toHash(); } /** * @return {?} */ sideload() { /** @type {?} */ const method = this.relationMethod; if (method === 'create' || method === 'untouched') { return; } /** @type {?} */ const type = this.modelOptions.type; return { id: this.id, type, __method: method, }; } /** * @return {?} */ serialize() { return this.__serializer.serialize(); } /** * @private * @param {?} obj * @return {?} */ translateKeys(obj) { if (obj.toHash) { obj = obj.toHash(); } /** @type {?} */ const filtred = {}; for (const oldkey in obj) { if (obj.hasOwnProperty(oldkey)) { /** @type {?} */ const newkey = this.__wrapper.frontendPropName(oldkey.toString()); if (newkey) { filtred[newkey] = obj[oldkey]; } } } return filtred; } } if (false) { /** @type {?} */ ResourceBase.prototype.id; /** @type {?} */ ResourceBase.prototype.modelInitialization; /** @type {?} */ ResourceBase.prototype.modelSerialization; /** * @type {?} * @private */ ResourceBase.prototype.__method; /** * @type {?} * @private */ ResourceBase.prototype.__isRelation; /** * @type {?} * @private */ ResourceBase.prototype.__mdwrapper; /** * @type {?} * @private */ ResourceBase.prototype.__resSerializer; /* Skipping unhandled member: [key: string]: any;*/ } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtYmFzZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1haXJicnVzaC8iLCJzb3VyY2VzIjpbImxpYi9yZXNvdXJjZS1iYXNlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7QUFLdEUsTUFBTSxPQUFnQixZQUFZOzs7O0lBMkNoQyxZQUFZLElBQTRCO1FBekNqQyx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBSTFCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBcUMzQixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3RCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDOzs7OztJQXhDRCxJQUFZLFNBQVM7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FBRTtRQUNoRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUFFRCxJQUFZLFlBQVk7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFB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Q0FBQyxNQUFNLEVBQUU7WUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQUU7O2NBRWpDLE9BQU8sR0FBRyxFQUFFO1FBQ2xCLEtBQUssTUFBTSxNQUFNLElBQUksR0FBRyxFQUFFO1lBQ3hCLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRTs7c0JBQ3hCLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDakUsSUFBSSxNQUFNLEVBQUU7b0JBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFBRTthQUMvQztTQUNGO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGOzs7SUE5S0MsMEJBQVc7O0lBQ1gsMkNBQW1DOztJQUNuQywwQ0FBa0M7Ozs7O0lBR2xDLGdDQUErQjs7Ozs7SUFDL0Isb0NBQTZCOzs7OztJQUM3QixtQ0FBNkM7Ozs7O0lBSzdDLHVDQUE0QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEpzb25hcGlDb252ZXJ0ZXIgfSBmcm9tICcuL2NvbnZlcnRlcnMvanNvbmFwaS5jb252ZXJ0ZXInO1xuaW1wb3J0IHsgSnNvbmFwaURvY3VtZW50LCBKc29uYXBpUmVzb3VyY2VSZXF1ZXN0LCBKc29uYXBpUmVzb3VyY2VNZXRob2QgfSBmcm9tICcuL2ludGVyZmFjZXMvanNvbmFwaS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTW9kZWxEZWNvcmF0b3JPcHRpb25zIH0gZnJvbSAnLi9kZWNvcmF0b3JzL29wdGlvbi5pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1vZGVsTWV0YWRhdGEsIEF0dHJpYnV0ZU1ldGFkYXRhIH0gZnJvbSAnLi9kZWNvcmF0b3JzL3N5bWJvbGVzJztcbmltcG9ydCB7IFJlc291cmNlU2VyaWFsaXplciB9IGZyb20gJy4vcmVzb3VyY2Uuc2VyaWFsaXplcic7XG5pbXBvcnQgeyBSZXNvdXJjZU1ldGFkYXRhV3JhcHBlciB9IGZyb20gJy4vcmVzb3VyY2UtbWV0YWRhdGEud3JhcHBlcic7XG5cblxudHlwZSBtZXRob2RBY3Rpb24gPSBKc29uYXBpUmVzb3VyY2VNZXRob2QgfCAndW50b3VjaGVkJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlc291cmNlQmFzZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyBtb2RlbEluaXRpYWxpemF0aW9uID0gZmFsc2U7XG4gIHB1YmxpYyBtb2RlbFNlcmlhbGl6YXRpb24gPSBmYWxzZTtcblxuLy8gdHNsaW50OmRpc2FibGU6IHZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfX21ldGhvZDogbWV0aG9kQWN0aW9uO1xuICBwcml2YXRlIF9faXNSZWxhdGlvbiA9IGZhbHNlO1xuICBwcml2YXRlIF9fbWR3cmFwcGVyOiBSZXNvdXJjZU1ldGFkYXRhV3JhcHBlcjtcbiAgcHJpdmF0ZSBnZXQgX193cmFwcGVyKCk6IFJlc291cmNlTWV0YWRhdGFXcmFwcGVyIHtcbiAgICBpZiAoIXRoaXMuX19tZHdyYXBwZXIpIHsgdGhpcy5fX21kd3JhcHBlciA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhV3JhcHBlcih0aGlzKTsgfVxuICAgIHJldHVybiB0aGlzLl9fbWR3cmFwcGVyO1xuICB9XG4gIHByaXZhdGUgX19yZXNTZXJpYWxpemVyOiBSZXNvdXJjZVNlcmlhbGl6ZXI7XG4gIHByaXZhdGUgZ2V0IF9fc2VyaWFsaXplcigpOiBSZXNvdXJjZVNlcmlhbGl6ZXIge1xuICAgIGlmICghdGhpcy5fX3Jlc1NlcmlhbGl6ZXIpIHsgdGhpcy5fX3Jlc1NlcmlhbGl6ZXIgPSBuZXcgUmVzb3VyY2VTZXJpYWxpemVyKHRoaXMpOyB9XG4gICAgcmV0dXJuIHRoaXMuX19yZXNTZXJpYWxpemVyO1xuICB9XG4vLyB0c2xpbnQ6ZW5hYmxlOiB2YXJpYWJsZS1uYW1lXG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xuXG4gIHN0YXRpYyBnZXRNb2RlbDxUIGV4dGVuZHMgUmVzb3VyY2VCYXNlPihjb25zdHJ1Y3RvcjogYW55LCBkYXRhPzogSnNvbmFwaURvY3VtZW50KTogVCB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEpzb25hcGlDb252ZXJ0ZXIoKS5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICByZXR1cm4gbmV3IGNvbnN0cnVjdG9yKHJldCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0QXNSZWxhdGlvbnNoaXA8VCBleHRlbmRzIFJlc291cmNlQmFzZT4oY29uc3RydWN0b3I6IGFueSwgZGF0YTogUmVzb3VyY2VCYXNlLCBvcHRpb25zPzogYW55KTogVCB7XG4gICAgaWYgKCFkYXRhKSB7IHJldHVybiBudWxsOyB9XG4gICAgb3B0aW9ucyA9IHsgbWV0aG9kOiAndW50b3VjaGVkJywgbW9kZWxJbml0OiBmYWxzZSwgLi4ub3B0aW9ucyB9O1xuICAgIGxldCBtb2RlbDogVDtcbiAgICBpZiAob3B0aW9ucy5tb2RlbEluaXQpIHtcbiAgICAgIG1vZGVsID0gbmV3IGNvbnN0cnVjdG9yKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlbCA9IG5ldyBjb25zdHJ1Y3RvcigpO1xuICAgICAgbW9kZWwuaWQgPSBkYXRhLmlkO1xuICAgICAgbW9kZWwuYXNzaWduKGRhdGEpO1xuICAgIH1cbiAgICBtb2RlbC5fX2lzUmVsYXRpb24gPSB0cnVlO1xuICAgIG1vZGVsLl9fbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZGF0YT86IFBhcnRpYWw8UmVzb3VyY2VCYXNlPikge1xuICAgIGlmICghZGF0YSkgeyByZXR1cm47IH1cbiAgICB0aGlzLm1vZGVsSW5pdGlhbGl6YXRpb24gPSB0cnVlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMuYXNzaWduKGRhdGEpO1xuICAgIHRoaXMubW9kZWxJbml0aWFsaXphdGlvbiA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzTW9kZWxJbml0aWFsaXphdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbEluaXRpYWxpemF0aW9uO1xuICB9XG5cbiAgZ2V0IG1vZGVsT3B0aW9ucygpOiBNb2RlbERlY29yYXRvck9wdGlvbnMge1xuICAgIHJldHVybiBSZWZsZWN0LmdldE1ldGFkYXRhKE1vZGVsTWV0YWRhdGEsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbE9wdGlvbnMudHlwZTtcbiAgfVxuXG4gIGdldCBoYXNCZWVuVG91Y2hlZCgpIHtcbiAgICBjb25zdCB0b3VjaGVkID0gdGhpcy5fX2lzUmVsYXRpb24gJiYgdGhpcy5fX21ldGhvZCAhPT0gJ3VudG91Y2hlZCc7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGlydHlBdHRyaWJ1dGVzIHx8IHRoaXMuaGFzRGlydHlCZWxvbmdzVG9zIHx8IHRoaXMuaGFzRGlydHlIYXNNYW55cyB8fCB0b3VjaGVkO1xuICB9XG5cbiAgZ2V0IGhhc0RpcnR5QXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzTWV0YWRhdGE6IGFueSA9IHRoaXNbQXR0cmlidXRlTWV0YWRhdGFdO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIGF0dHJpYnV0ZXNNZXRhZGF0YSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZXNNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpICYmIGF0dHJpYnV0ZXNNZXRhZGF0YVtwcm9wZXJ0eU5hbWVdLmhhc0RpcnR5QXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGhhc0RpcnR5QmVsb25nc1RvcygpOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXlzID0gdGhpcy5fX3dyYXBwZXIuYmVsb25nc1RvS2V5cyh7IGRlZmluZWQ6IHRydWUgfSk7XG5cbiAgICBsZXQgdG91Y2hlZCA9IGZhbHNlO1xuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdG91Y2hlZCA9IHRvdWNoZWQgfHwgdGhpc1trZXldLmhhc0JlZW5Ub3VjaGVkO1xuICAgIH0pO1xuICAgIHJldHVybiB0b3VjaGVkO1xuICB9XG5cbiAgZ2V0IGhhc0RpcnR5SGFzTWFueXMoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2V5cyA9IHRoaXMuX193cmFwcGVyLmhhc01hbnlLZXlzKHsgZGVmaW5lZDogdHJ1ZSB9KTtcblxuICAgIGxldCB0b3VjaGVkID0gZmFsc2U7XG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICB0b3VjaGVkID0gdG91Y2hlZCB8fCB0aGlzW2tleV0ubWFwKGVsdCA9PiBlbHQuaGFzQmVlblRvdWNoZWQpLnJlZHVjZSgocmVzLCBib29sKSA9PiByZXMgfHwgYm9vbCwgZmFsc2UpO1xuICAgIH0pO1xuICAgIHJldHVybiB0b3VjaGVkO1xuICB9XG5cbiAgZ2V0IGlzUmVsYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc1JlbGF0aW9uO1xuICB9XG5cbiAgZ2V0IHJlbGF0aW9uTWV0aG9kKCkge1xuICAgIGlmICh0aGlzLl9fbWV0aG9kICE9PSAndW50b3VjaGVkJykgeyByZXR1cm4gdGhpcy5fX21ldGhvZDsgfVxuICAgIGlmICghdGhpcy5oYXNCZWVuVG91Y2hlZCkgeyByZXR1cm4gJ3VudG91Y2hlZCc7IH1cbiAgICBpZiAodGhpcy5pZCkgeyByZXR1cm4gJ3VwZGF0ZSc7IH1cbiAgICByZXR1cm4gJ2NyZWF0ZSc7XG4gIH1cblxuICBwdWJsaWMgcm9sbGJhY2tBdHRyaWJ1dGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNNZXRhZGF0YTogYW55ID0gdGhpc1tBdHRyaWJ1dGVNZXRhZGF0YV07XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gYXR0cmlidXRlc01ldGFkYXRhKSB7XG4gICAgICBpZiAoYXR0cmlidXRlc01ldGFkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkgJiYgYXR0cmlidXRlc01ldGFkYXRhW3Byb3BlcnR5TmFtZV0uaGFzRGlydHlBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRoaXNbcHJvcGVydHlOYW1lXSA9IGF0dHJpYnV0ZXNNZXRhZGF0YVtwcm9wZXJ0eU5hbWVdLm9sZFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3NpZ24oZGF0YSkge1xuICAgIGNvbnN0IGNsb25lID0gdGhpcy50cmFuc2xhdGVLZXlzKGRhdGEpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2xvbmUpO1xuICAgIGlmICh0aGlzLl9faXNSZWxhdGlvbikge1xuICAgICAgdGhpcy5fX21ldGhvZCA9IHRoaXMucmVsYXRpb25NZXRob2Q7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc2Fzc29jaWF0ZSgpIHtcbiAgICB0aGlzLl9fbWV0aG9kID0gJ2Rpc2Fzc29jaWF0ZSc7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5pc1JlbGF0aW9uKSB7XG4gICAgICB0aGlzLl9fbWV0aG9kID0gJ2Rlc3Ryb3knO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rlc3Ryb3lpbmcgcmVzb3VyY2UgaXMgbm90IHN1cHBvcnRlZCEgVXNlIHRoZSBzZXJ2aWNlIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvSnNvbmFwaSgpOiBKc29uYXBpUmVzb3VyY2VSZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5fX3NlcmlhbGl6ZXIudG9Kc29uYXBpKCk7XG4gIH1cblxuICBwdWJsaWMgdG9IYXNoKCk6IHsgW2F0dHJOYW1lOiBzdHJpbmddOiBhbnk7IH0ge1xuICAgIHJldHVybiB0aGlzLl9fc2VyaWFsaXplci50b0hhc2goKTtcbiAgfVxuXG4gIHB1YmxpYyBzaWRlbG9hZCgpIHtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLnJlbGF0aW9uTWV0aG9kO1xuICAgIGlmIChtZXRob2QgPT09ICdjcmVhdGUnIHx8IG1ldGhvZCA9PT0gJ3VudG91Y2hlZCcpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5tb2RlbE9wdGlvbnMudHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHR5cGUsXG4gICAgICBfX21ldGhvZDogbWV0aG9kLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB0aGlzLl9fc2VyaWFsaXplci5zZXJpYWxpemUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlS2V5cyhvYmo6IGFueSkge1xuICAgIGlmIChvYmoudG9IYXNoKSB7IG9iaiA9IG9iai50b0hhc2goKTsgfVxuXG4gICAgY29uc3QgZmlsdHJlZCA9IHt9O1xuICAgIGZvciAoY29uc3Qgb2xka2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShvbGRrZXkpKSB7XG4gICAgICAgIGNvbnN0IG5ld2tleSA9IHRoaXMuX193cmFwcGVyLmZyb250ZW5kUHJvcE5hbWUob2xka2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAobmV3a2V5KSB7IGZpbHRyZWRbbmV3a2V5XSA9IG9ialtvbGRrZXldOyB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWx0cmVkO1xuICB9XG59XG4iXX0=