ngx-airbrush
Version:
Angular client for jsonapi/Graphiti backends
316 lines • 21.9 kB
JavaScript
/**
* @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=