UNPKG

@orbit/record-cache

Version:

Orbit base classes used to access and maintain a set of records.

101 lines 18.2 kB
import { AsyncOperationProcessor } from '../async-operation-processor'; import { getInverseRelationship, getInverseRelationships, getAllInverseRelationships, getInverseRelationshipRemovalOps } from './utils/cache-integrity-utils'; /** * An operation processor that ensures that a cache's data is consistent and * doesn't contain any dead references. * * This is achieved by maintaining a mapping of reverse relationships for each * record. When a record is removed, any references to it can also be identified * and removed. */ export class AsyncCacheIntegrityProcessor extends AsyncOperationProcessor { async after(operation) { switch (operation.op) { case 'replaceRelatedRecord': await this.removeInverseRelationship(operation.record, operation.relationship, await this.accessor.getRelatedRecordAsync(operation.record, operation.relationship)); return []; case 'replaceRelatedRecords': await this.removeInverseRelationships(operation.record, operation.relationship, await this.accessor.getRelatedRecordsAsync(operation.record, operation.relationship)); return []; case 'removeFromRelatedRecords': await this.removeInverseRelationship(operation.record, operation.relationship, operation.relatedRecord); return []; case 'removeRecord': await this.removeAllInverseRelationships(operation.record); return []; case 'updateRecord': await this.removeAllInverseRelationships(operation.record); return []; default: return []; } } async finally(operation) { switch (operation.op) { case 'replaceRelatedRecord': await this.addInverseRelationship(operation.record, operation.relationship, operation.relatedRecord); return []; case 'replaceRelatedRecords': await this.addInverseRelationships(operation.record, operation.relationship, operation.relatedRecords); return []; case 'addToRelatedRecords': await this.addInverseRelationship(operation.record, operation.relationship, operation.relatedRecord); return []; case 'addRecord': await this.addAllInverseRelationships(operation.record); return []; case 'updateRecord': await this.addAllInverseRelationships(operation.record); return []; case 'removeRecord': return await this.clearInverseRelationshipOps(operation.record); default: return []; } } async addInverseRelationship(record, relationship, relatedRecord) { let inverseRelationship = getInverseRelationship(this.accessor.schema, record, relationship, relatedRecord); if (inverseRelationship) { await this.accessor.addInverseRelationshipsAsync([inverseRelationship]); } } async addInverseRelationships(record, relationship, relatedRecords) { let inverseRelationships = getInverseRelationships(this.accessor.schema, record, relationship, relatedRecords); if (inverseRelationships) { await this.accessor.addInverseRelationshipsAsync(inverseRelationships); } } async addAllInverseRelationships(record) { let inverseRelationships = getAllInverseRelationships(this.accessor.schema, record); if (inverseRelationships.length > 0) { await this.accessor.addInverseRelationshipsAsync(inverseRelationships); } } async removeInverseRelationship(record, relationship, relatedRecord) { let inverseRelationship = getInverseRelationship(this.accessor.schema, record, relationship, relatedRecord); if (inverseRelationship) { await this.accessor.removeInverseRelationshipsAsync([ inverseRelationship ]); } } async removeInverseRelationships(record, relationship, relatedRecords) { let inverseRelationships = getInverseRelationships(this.accessor.schema, record, relationship, relatedRecords); if (inverseRelationships.length > 0) { await this.accessor.removeInverseRelationshipsAsync(inverseRelationships); } } async removeAllInverseRelationships(record) { const currentRecord = await this.accessor.getRecordAsync(record); if (currentRecord) { const inverseRelationships = getAllInverseRelationships(this.accessor.schema, currentRecord); if (inverseRelationships.length > 0) { await this.accessor.removeInverseRelationshipsAsync(inverseRelationships); } } } async clearInverseRelationshipOps(record) { return getInverseRelationshipRemovalOps(this.accessor.schema, await this.accessor.getInverseRelationshipsAsync(record)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtY2FjaGUtaW50ZWdyaXR5LXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVyYXRpb24tcHJvY2Vzc29ycy9hc3luYy1jYWNoZS1pbnRlZ3JpdHktcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLDBCQUEwQixFQUMxQixnQ0FBZ0MsRUFDakMsTUFBTSwrQkFBK0IsQ0FBQztBQUV2Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLDRCQUE2QixTQUFRLHVCQUF1QjtJQUN2RSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQTBCO1FBQ3BDLFFBQVEsU0FBUyxDQUFDLEVBQUUsRUFBRTtZQUNwQixLQUFLLHNCQUFzQjtnQkFDekIsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQ2xDLFNBQVMsQ0FBQyxNQUFNLEVBQ2hCLFNBQVMsQ0FBQyxZQUFZLEVBQ3RCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FDdkMsU0FBUyxDQUFDLE1BQU0sRUFDaEIsU0FBUyxDQUFDLFlBQVksQ0FDdkIsQ0FDRixDQUFDO2dCQUNGLE9BQU8sRUFBRSxDQUFDO1lBRVosS0FBSyx1QkFBdUI7Z0JBQzFCLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUNuQyxTQUFTLENBQUMsTUFBTSxFQUNoQixTQUFTLENBQUMsWUFBWSxFQUN0QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQ3hDLFNBQVMsQ0FBQyxNQUFNLEVBQ2hCLFNBQVMsQ0FBQyxZQUFZLENBQ3ZCLENBQ0YsQ0FBQztnQkFDRixPQUFPLEVBQUUsQ0FBQztZQUVaLEtBQUssMEJBQTBCO2dCQUM3QixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FDbEMsU0FBUyxDQUFDLE1BQU0s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QixDQUNqRCxvQkFBb0IsQ0FDckIsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRVMsS0FBSyxDQUFDLDJCQUEyQixDQUN6QyxNQUFzQjtRQUV0QixPQUFPLGdDQUFnQyxDQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDcEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUN6RCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5pdGlhbGl6ZWRSZWNvcmQsXG4gIFJlY29yZElkZW50aXR5LFxuICBSZWNvcmRPcGVyYXRpb25cbn0gZnJvbSAnQG9yYml0L3JlY29yZHMnO1xuaW1wb3J0IHsgQXN5bmNPcGVyYXRpb25Qcm9jZXNzb3IgfSBmcm9tICcuLi9hc3luYy1vcGVyYXRpb24tcHJvY2Vzc29yJztcbmltcG9ydCB7XG4gIGdldEludmVyc2VSZWxhdGlvbnNoaXAsXG4gIGdldEludmVyc2VSZWxhdGlvbnNoaXBzLFxuICBnZXRBbGxJbnZlcnNlUmVsYXRpb25zaGlwcyxcbiAgZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcFJlbW92YWxPcHNcbn0gZnJvbSAnLi91dGlscy9jYWNoZS1pbnRlZ3JpdHktdXRpbHMnO1xuXG4vKipcbiAqIEFuIG9wZXJhdGlvbiBwcm9jZXNzb3IgdGhhdCBlbnN1cmVzIHRoYXQgYSBjYWNoZSdzIGRhdGEgaXMgY29uc2lzdGVudCBhbmRcbiAqIGRvZXNuJ3QgY29udGFpbiBhbnkgZGVhZCByZWZlcmVuY2VzLlxuICpcbiAqIFRoaXMgaXMgYWNoaWV2ZWQgYnkgbWFpbnRhaW5pbmcgYSBtYXBwaW5nIG9mIHJldmVyc2UgcmVsYXRpb25zaGlwcyBmb3IgZWFjaFxuICogcmVjb3JkLiBXaGVuIGEgcmVjb3JkIGlzIHJlbW92ZWQsIGFueSByZWZlcmVuY2VzIHRvIGl0IGNhbiBhbHNvIGJlIGlkZW50aWZpZWRcbiAqIGFuZCByZW1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgQXN5bmNDYWNoZUludGVncml0eVByb2Nlc3NvciBleHRlbmRzIEFzeW5jT3BlcmF0aW9uUHJvY2Vzc29yIHtcbiAgYXN5bmMgYWZ0ZXIob3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24pOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbltdPiB7XG4gICAgc3dpdGNoIChvcGVyYXRpb24ub3ApIHtcbiAgICAgIGNhc2UgJ3JlcGxhY2VSZWxhdGVkUmVjb3JkJzpcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwKFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWNvcmQsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0aW9uc2hpcCxcbiAgICAgICAgICBhd2FpdCB0aGlzLmFjY2Vzc29yLmdldFJlbGF0ZWRSZWNvcmRBc3luYyhcbiAgICAgICAgICAgIG9wZXJhdGlvbi5yZWNvcmQsXG4gICAgICAgICAgICBvcGVyYXRpb24ucmVsYXRpb25zaGlwXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGNhc2UgJ3JlcGxhY2VSZWxhdGVkUmVjb3Jkcyc6XG4gICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlSW52ZXJzZVJlbGF0aW9uc2hpcHMoXG4gICAgICAgICAgb3BlcmF0aW9uLnJlY29yZCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRpb25zaGlwLFxuICAgICAgICAgIGF3YWl0IHRoaXMuYWNjZXNzb3IuZ2V0UmVsYXRlZFJlY29yZHNBc3luYyhcbiAgICAgICAgICAgIG9wZXJhdGlvbi5yZWNvcmQsXG4gICAgICAgICAgICBvcGVyYXRpb24ucmVsYXRpb25zaGlwXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGNhc2UgJ3JlbW92ZUZyb21SZWxhdGVkUmVjb3Jkcyc6XG4gICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlSW52ZXJzZVJlbGF0aW9uc2hpcChcbiAgICAgICAgICBvcGVyYXRpb24ucmVjb3JkLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGlvbnNoaXAsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0ZWRSZWNvcmRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICBjYXNlICdyZW1vdmVSZWNvcmQnOlxuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUFsbEludmVyc2VSZWxhdGlvbnNoaXBzKG9wZXJhdGlvbi5yZWNvcmQpO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGNhc2UgJ3VwZGF0ZVJlY29yZCc6XG4gICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQWxsSW52ZXJzZVJlbGF0aW9uc2hpcHMob3BlcmF0aW9uLnJlY29yZCk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZpbmFsbHkob3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24pOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbltdPiB7XG4gICAgc3dpdGNoIChvcGVyYXRpb24ub3ApIHtcbiAgICAgIGNhc2UgJ3JlcGxhY2VSZWxhdGVkUmVjb3JkJzpcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRJbnZlcnNlUmVsYXRpb25zaGlwKFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWNvcmQsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0aW9uc2hpcCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRlZFJlY29yZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGNhc2UgJ3JlcGxhY2VSZWxhdGVkUmVjb3Jkcyc6XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkSW52ZXJzZVJlbGF0aW9uc2hpcHMoXG4gICAgICAgICAgb3BlcmF0aW9uLnJlY29yZCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRpb25zaGlwLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGVkUmVjb3Jkc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGNhc2UgJ2FkZFRvUmVsYXRlZFJlY29yZHMnOlxuICAgICAgICBhd2FpdCB0aGlzLmFkZEludmVyc2VSZWxhdGlvbnNoaXAoXG4gICAgICAgICAgb3BlcmF0aW9uLnJlY29yZCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRpb25zaGlwLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGVkUmVjb3JkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAnYWRkUmVjb3JkJzpcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRBbGxJbnZlcnNlUmVsYXRpb25zaGlwcyhvcGVyYXRpb24ucmVjb3JkKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICBjYXNlICd1cGRhdGVSZWNvcmQnOlxuICAgICAgICBhd2FpdCB0aGlzLmFkZEFsbEludmVyc2VSZWxhdGlvbnNoaXBzKG9wZXJhdGlvbi5yZWNvcmQpO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGNhc2UgJ3JlbW92ZVJlY29yZCc6XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsZWFySW52ZXJzZVJlbGF0aW9uc2hpcE9wcyhvcGVyYXRpb24ucmVjb3JkKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhZGRJbnZlcnNlUmVsYXRpb25zaGlwKFxuICAgIHJlY29yZDogUmVjb3JkSWRlbnRpdHksXG4gICAgcmVsYXRpb25zaGlwOiBzdHJpbmcsXG4gICAgcmVsYXRlZFJlY29yZDogUmVjb3JkSWRlbnRpdHkgfCBudWxsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbnZlcnNlUmVsYXRpb25zaGlwID0gZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcChcbiAgICAgIHRoaXMuYWNjZXNzb3Iuc2NoZW1hLFxuICAgICAgcmVjb3JkLFxuICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgcmVsYXRlZFJlY29yZFxuICAgICk7XG4gICAgaWYgKGludmVyc2VSZWxhdGlvbnNoaXApIHtcbiAgICAgIGF3YWl0IHRoaXMuYWNjZXNzb3IuYWRkSW52ZXJzZVJlbGF0aW9uc2hpcHNBc3luYyhbaW52ZXJzZVJlbGF0aW9uc2hpcF0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhZGRJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICByZWNvcmQ6IFJlY29yZElkZW50aXR5LFxuICAgIHJlbGF0aW9uc2hpcDogc3RyaW5nLFxuICAgIHJlbGF0ZWRSZWNvcmRzOiBSZWNvcmRJZGVudGl0eVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbnZlcnNlUmVsYXRpb25zaGlwcyA9IGdldEludmVyc2VSZWxhdGlvbnNoaXBzKFxuICAgICAgdGhpcy5hY2Nlc3Nvci5zY2hlbWEsXG4gICAgICByZWNvcmQsXG4gICAgICByZWxhdGlvbnNoaXAsXG4gICAgICByZWxhdGVkUmVjb3Jkc1xuICAgICk7XG4gICAgaWYgKGludmVyc2VSZWxhdGlvbnNoaXBzKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjY2Vzc29yLmFkZEludmVyc2VSZWxhdGlvbnNoaXBzQXN5bmMoaW52ZXJzZVJlbGF0aW9uc2hpcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhZGRBbGxJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbnZlcnNlUmVsYXRpb25zaGlwcyA9IGdldEFsbEludmVyc2VSZWxhdGlvbnNoaXBzKFxuICAgICAgdGhpcy5hY2Nlc3Nvci5zY2hlbWEsXG4gICAgICByZWNvcmRcbiAgICApO1xuICAgIGlmIChpbnZlcnNlUmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjY2Vzc29yLmFkZEludmVyc2VSZWxhdGlvbnNoaXBzQXN5bmMoaW52ZXJzZVJlbGF0aW9uc2hpcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwKFxuICAgIHJlY29yZDogUmVjb3JkSWRlbnRpdHksXG4gICAgcmVsYXRpb25zaGlwOiBzdHJpbmcsXG4gICAgcmVsYXRlZFJlY29yZD86IFJlY29yZElkZW50aXR5IHwgbnVsbFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW52ZXJzZVJlbGF0aW9uc2hpcCA9IGdldEludmVyc2VSZWxhdGlvbnNoaXAoXG4gICAgICB0aGlzLmFjY2Vzc29yLnNjaGVtYSxcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgIHJlbGF0ZWRSZWNvcmRcbiAgICApO1xuICAgIGlmIChpbnZlcnNlUmVsYXRpb25zaGlwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjY2Vzc29yLnJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXBzQXN5bmMoW1xuICAgICAgICBpbnZlcnNlUmVsYXRpb25zaGlwXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVtb3ZlSW52ZXJzZVJlbGF0aW9uc2hpcHMoXG4gICAgcmVjb3JkOiBSZWNvcmRJZGVudGl0eSxcbiAgICByZWxhdGlvbnNoaXA6IHN0cmluZyxcbiAgICByZWxhdGVkUmVjb3Jkcz86IFJlY29yZElkZW50aXR5W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGludmVyc2VSZWxhdGlvbnNoaXBzID0gZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHMoXG4gICAgICB0aGlzLmFjY2Vzc29yLnNjaGVtYSxcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgIHJlbGF0ZWRSZWNvcmRzXG4gICAgKTtcbiAgICBpZiAoaW52ZXJzZVJlbGF0aW9uc2hpcHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5hY2Nlc3Nvci5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwc0FzeW5jKGludmVyc2VSZWxhdGlvbnNoaXBzKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVtb3ZlQWxsSW52ZXJzZVJlbGF0aW9uc2hpcHMoXG4gICAgcmVjb3JkOiBSZWNvcmRJZGVudGl0eVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gYXdhaXQgdGhpcy5hY2Nlc3Nvci5nZXRSZWNvcmRBc3luYyhyZWNvcmQpO1xuICAgIGlmIChjdXJyZW50UmVjb3JkKSB7XG4gICAgICBjb25zdCBpbnZlcnNlUmVsYXRpb25zaGlwcyA9IGdldEFsbEludmVyc2VSZWxhdGlvbnNoaXBzKFxuICAgICAgICB0aGlzLmFjY2Vzc29yLnNjaGVtYSxcbiAgICAgICAgY3VycmVudFJlY29yZFxuICAgICAgKTtcbiAgICAgIGlmIChpbnZlcnNlUmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWNjZXNzb3IucmVtb3ZlSW52ZXJzZVJlbGF0aW9uc2hpcHNBc3luYyhcbiAgICAgICAgICBpbnZlcnNlUmVsYXRpb25zaGlwc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjbGVhckludmVyc2VSZWxhdGlvbnNoaXBPcHMoXG4gICAgcmVjb3JkOiBSZWNvcmRJZGVudGl0eVxuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbltdPiB7XG4gICAgcmV0dXJuIGdldEludmVyc2VSZWxhdGlvbnNoaXBSZW1vdmFsT3BzKFxuICAgICAgdGhpcy5hY2Nlc3Nvci5zY2hlbWEsXG4gICAgICBhd2FpdCB0aGlzLmFjY2Vzc29yLmdldEludmVyc2VSZWxhdGlvbnNoaXBzQXN5bmMocmVjb3JkKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==