@orbit/record-cache
Version:
Orbit base classes used to access and maintain a set of records.
186 lines • 25.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SimpleRecordTransformBuffer = void 0;
const utils_1 = require("@orbit/utils");
const records_1 = require("@orbit/records");
const sync_record_cache_1 = require("./sync-record-cache");
function serializeRecordRelationshipIdentity(rri) {
return `${(0, records_1.serializeRecordIdentity)(rri.record)}::${rri.relationship}`;
}
function deserializeRecordRelationshipIdentity(rri) {
const [record, relationship] = rri.split('::');
return { record: (0, records_1.deserializeRecordIdentity)(record), relationship };
}
class SimpleRecordTransformBuffer extends sync_record_cache_1.SyncRecordCache {
constructor(settings) {
super(settings);
this.resetState();
}
resetState() {
this._state = {
records: {},
inverseRelationships: {}
};
}
startTrackingChanges() {
this._delta = {
records: {},
inverseRelationships: {}
};
}
stopTrackingChanges() {
var _a, _b, _c, _d;
if (this._delta === undefined) {
throw new Error(`Changes are not being tracked. Call 'startTrackingChanges' before 'stopTrackingChanges'`);
}
let { records, inverseRelationships } = this._delta;
let changeset = {};
for (let rid of Object.keys(records)) {
let rv = records[rid];
if (rv === null) {
changeset.removeRecords = (_a = changeset.removeRecords) !== null && _a !== void 0 ? _a : [];
changeset.removeRecords.push((0, records_1.deserializeRecordIdentity)(rid));
}
else {
changeset.setRecords = (_b = changeset.setRecords) !== null && _b !== void 0 ? _b : [];
changeset.setRecords.push(rv);
}
}
for (let rid of Object.keys(inverseRelationships)) {
let relatedRecord = (0, records_1.deserializeRecordIdentity)(rid);
let rels = inverseRelationships[rid];
for (let rel of Object.keys(rels)) {
let rv = rels[rel];
let { record, relationship } = deserializeRecordRelationshipIdentity(rel);
let rri = { relatedRecord, record, relationship };
if (rv === null) {
changeset.removeInverseRelationships =
(_c = changeset.removeInverseRelationships) !== null && _c !== void 0 ? _c : [];
changeset.removeInverseRelationships.push(rri);
}
else {
changeset.addInverseRelationships =
(_d = changeset.addInverseRelationships) !== null && _d !== void 0 ? _d : [];
changeset.addInverseRelationships.push(rri);
}
}
}
this._delta = undefined;
return changeset;
}
getRecordSync(identity) {
var _a;
return (_a = this._state.records[(0, records_1.serializeRecordIdentity)(identity)]) !== null && _a !== void 0 ? _a : undefined;
}
getRecordsSync(typeOrIdentities) {
if (typeof typeOrIdentities === 'string') {
return (0, utils_1.objectValues)(this._state.records[typeOrIdentities]);
}
else if (Array.isArray(typeOrIdentities)) {
const records = [];
const identities = typeOrIdentities;
for (let i of identities) {
let record = this.getRecordSync(i);
if (record) {
records.push(record);
}
}
return records;
}
else {
throw new Error('typeOrIdentities must be specified in getRecordsSync');
}
}
setRecordSync(record) {
this._state.records[(0, records_1.serializeRecordIdentity)(record)] = record;
if (this._delta) {
this._delta.records[(0, records_1.serializeRecordIdentity)(record)] = record;
}
}
setRecordsSync(records) {
records.forEach((record) => this.setRecordSync(record));
}
removeRecordSync(recordIdentity) {
const record = this.getRecordSync(recordIdentity);
if (record) {
delete this._state.records[(0, records_1.serializeRecordIdentity)(record)];
if (this._delta) {
this._delta.records[(0, records_1.serializeRecordIdentity)(record)] = null;
}
return record;
}
else {
return undefined;
}
}
removeRecordsSync(recordIdentities) {
const records = [];
for (let recordIdentity of recordIdentities) {
let record = this.getRecordSync(recordIdentity);
if (record) {
records.push(record);
delete this._state.records[(0, records_1.serializeRecordIdentity)(record)];
if (this._delta) {
this._delta.records[(0, records_1.serializeRecordIdentity)(record)] = null;
}
}
}
return records;
}
getInverseRelationshipsSync(recordIdentityOrIdentities) {
if (Array.isArray(recordIdentityOrIdentities)) {
let relationships = [];
recordIdentityOrIdentities.forEach((record) => {
Array.prototype.push(relationships, this._getInverseRelationshipsSync(record));
});
return relationships;
}
else {
return this._getInverseRelationshipsSync(recordIdentityOrIdentities);
}
}
addInverseRelationshipsSync(relationships) {
var _a, _b;
for (let relationship of relationships) {
const ri = (0, records_1.serializeRecordIdentity)(relationship.relatedRecord);
const rri = serializeRecordRelationshipIdentity(relationship);
const rels = (_a = this._state.inverseRelationships[ri]) !== null && _a !== void 0 ? _a : {};
rels[rri] = relationship;
this._state.inverseRelationships[ri] = rels;
if (this._delta) {
const rels = (_b = this._delta.inverseRelationships[ri]) !== null && _b !== void 0 ? _b : {};
rels[rri] = relationship;
this._delta.inverseRelationships[ri] = rels;
}
}
}
removeInverseRelationshipsSync(relationships) {
var _a;
for (let relationship of relationships) {
const ri = (0, records_1.serializeRecordIdentity)(relationship.relatedRecord);
const rri = serializeRecordRelationshipIdentity(relationship);
const rels = this._state.inverseRelationships[ri];
if (rels) {
rels[rri] = null;
if (this._delta) {
const rels = (_a = this._delta.inverseRelationships[ri]) !== null && _a !== void 0 ? _a : {};
rels[rri] = null;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// Protected methods
/////////////////////////////////////////////////////////////////////////////
_getInverseRelationshipsSync(recordIdentity) {
let relationships = this._state.inverseRelationships[(0, records_1.serializeRecordIdentity)(recordIdentity)];
if (relationships) {
return (0, utils_1.objectValues)(relationships).filter((r) => r !== null);
}
else {
return [];
}
}
}
exports.SimpleRecordTransformBuffer = SimpleRecordTransformBuffer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXJlY29yZC10cmFuc2Zvcm0tYnVmZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbXBsZS1yZWNvcmQtdHJhbnNmb3JtLWJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3Q0FBa0Q7QUFDbEQsNENBS3dCO0FBRXhCLDJEQUErRTtBQUcvRSxTQUFTLG1DQUFtQyxDQUMxQyxHQUErQjtJQUUvQixPQUFPLEdBQUcsSUFBQSxpQ0FBdUIsRUFBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxTQUFTLHFDQUFxQyxDQUM1QyxHQUFXO0lBRVgsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBQSxtQ0FBeUIsRUFBQyxNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUNyRSxDQUFDO0FBT0QsTUFBYSwyQkFDWCxTQUFRLG1DQUFlO0lBS3ZCLFlBQVksUUFBaUM7UUFDM0MsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixPQUFPLEVBQUUsRUFBRTtZQUNYLG9CQUFvQixFQUFFLEVBQUU7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU8sRUFBRSxFQUFFO1lBQ1gsb0JBQW9CLEVBQUUsRUFBRTtTQUN6QixDQUFDO0lBQ0osQ0FBQztJQUVELG1CQUFtQjs7UUFDakIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUNi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QUN4RCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUNsQjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLG9CQUFvQjtJQUNwQiw2RUFBNkU7SUFFbkUsNEJBQTRCLENBQ3BDLGNBQThCO1FBRTlCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQ2xELElBQUEsaUNBQXVCLEVBQUMsY0FBYyxDQUFDLENBQ3hDLENBQUM7UUFDRixJQUFJLGFBQWEsRUFBRTtZQUNqQixPQUFPLElBQUEsb0JBQVksRUFBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUM5RDthQUFNO1lBQ0wsT0FBTyxFQUFFLENBQUM7U0FDWDtJQUNILENBQUM7Q0FDRjtBQTdNRCxrRUE2TUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaWN0LCBvYmplY3RWYWx1ZXMgfSBmcm9tICdAb3JiaXQvdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGVzZXJpYWxpemVSZWNvcmRJZGVudGl0eSxcbiAgSW5pdGlhbGl6ZWRSZWNvcmQsXG4gIFJlY29yZElkZW50aXR5LFxuICBzZXJpYWxpemVSZWNvcmRJZGVudGl0eVxufSBmcm9tICdAb3JiaXQvcmVjb3Jkcyc7XG5pbXBvcnQgeyBSZWNvcmRDaGFuZ2VzZXQsIFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5IH0gZnJvbSAnLi9yZWNvcmQtYWNjZXNzb3InO1xuaW1wb3J0IHsgU3luY1JlY29yZENhY2hlLCBTeW5jUmVjb3JkQ2FjaGVTZXR0aW5ncyB9IGZyb20gJy4vc3luYy1yZWNvcmQtY2FjaGUnO1xuaW1wb3J0IHsgUmVjb3JkVHJhbnNmb3JtQnVmZmVyIH0gZnJvbSAnLi9yZWNvcmQtdHJhbnNmb3JtLWJ1ZmZlcic7XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5KFxuICBycmk6IFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5XG4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocnJpLnJlY29yZCl9Ojoke3JyaS5yZWxhdGlvbnNoaXB9YDtcbn1cblxuZnVuY3Rpb24gZGVzZXJpYWxpemVSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eShcbiAgcnJpOiBzdHJpbmdcbik6IHsgcmVjb3JkOiBSZWNvcmRJZGVudGl0eTsgcmVsYXRpb25zaGlwOiBzdHJpbmcgfSB7XG4gIGNvbnN0IFtyZWNvcmQsIHJlbGF0aW9uc2hpcF0gPSBycmkuc3BsaXQoJzo6Jyk7XG4gIHJldHVybiB7IHJlY29yZDogZGVzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWNvcmQpLCByZWxhdGlvbnNoaXAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVSZWNvcmRUcmFuc2Zvcm1CdWZmZXJTdGF0ZSB7XG4gIHJlY29yZHM6IERpY3Q8SW5pdGlhbGl6ZWRSZWNvcmQgfCBudWxsPjtcbiAgaW52ZXJzZVJlbGF0aW9uc2hpcHM6IERpY3Q8RGljdDxSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eSB8IG51bGw+Pjtcbn1cblxuZXhwb3J0IGNsYXNzIFNpbXBsZVJlY29yZFRyYW5zZm9ybUJ1ZmZlclxuICBleHRlbmRzIFN5bmNSZWNvcmRDYWNoZVxuICBpbXBsZW1lbnRzIFJlY29yZFRyYW5zZm9ybUJ1ZmZlciB7XG4gIHByb3RlY3RlZCBfc3RhdGUhOiBTaW1wbGVSZWNvcmRUcmFuc2Zvcm1CdWZmZXJTdGF0ZTtcbiAgcHJvdGVjdGVkIF9kZWx0YT86IFNpbXBsZVJlY29yZFRyYW5zZm9ybUJ1ZmZlclN0YXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBTeW5jUmVjb3JkQ2FjaGVTZXR0aW5ncykge1xuICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICB0aGlzLnJlc2V0U3RhdGUoKTtcbiAgfVxuXG4gIHJlc2V0U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUgPSB7XG4gICAgICByZWNvcmRzOiB7fSxcbiAgICAgIGludmVyc2VSZWxhdGlvbnNoaXBzOiB7fVxuICAgIH07XG4gIH1cblxuICBzdGFydFRyYWNraW5nQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWx0YSA9IHtcbiAgICAgIHJlY29yZHM6IHt9LFxuICAgICAgaW52ZXJzZVJlbGF0aW9uc2hpcHM6IHt9XG4gICAgfTtcbiAgfVxuXG4gIHN0b3BUcmFja2luZ0NoYW5nZXMoKTogUmVjb3JkQ2hhbmdlc2V0IHtcbiAgICBpZiAodGhpcy5fZGVsdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2hhbmdlcyBhcmUgbm90IGJlaW5nIHRyYWNrZWQuIENhbGwgJ3N0YXJ0VHJhY2tpbmdDaGFuZ2VzJyBiZWZvcmUgJ3N0b3BUcmFja2luZ0NoYW5nZXMnYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgeyByZWNvcmRzLCBpbnZlcnNlUmVsYXRpb25zaGlwcyB9ID0gdGhpcy5fZGVsdGE7XG4gICAgbGV0IGNoYW5nZXNldDogUmVjb3JkQ2hhbmdlc2V0ID0ge307XG5cbiAgICBmb3IgKGxldCByaWQgb2YgT2JqZWN0LmtleXMocmVjb3JkcykpIHtcbiAgICAgIGxldCBydiA9IHJlY29yZHNbcmlkXTtcbiAgICAgIGlmIChydiA9PT0gbnVsbCkge1xuICAgICAgICBjaGFuZ2VzZXQucmVtb3ZlUmVjb3JkcyA9IGNoYW5nZXNldC5yZW1vdmVSZWNvcmRzID8/IFtdO1xuICAgICAgICBjaGFuZ2VzZXQucmVtb3ZlUmVjb3Jkcy5wdXNoKGRlc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmlkKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFuZ2VzZXQuc2V0UmVjb3JkcyA9IGNoYW5nZXNldC5zZXRSZWNvcmRzID8/IFtdO1xuICAgICAgICBjaGFuZ2VzZXQuc2V0UmVjb3Jkcy5wdXNoKHJ2KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCByaWQgb2YgT2JqZWN0LmtleXMoaW52ZXJzZVJlbGF0aW9uc2hpcHMpKSB7XG4gICAgICBsZXQgcmVsYXRlZFJlY29yZCA9IGRlc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmlkKTtcbiAgICAgIGxldCByZWxzID0gaW52ZXJzZVJlbGF0aW9uc2hpcHNbcmlkXTtcbiAgICAgIGZvciAobGV0IHJlbCBvZiBPYmplY3Qua2V5cyhyZWxzKSkge1xuICAgICAgICBsZXQgcnYgPSByZWxzW3JlbF07XG4gICAgICAgIGxldCB7IHJlY29yZCwgcmVsYXRpb25zaGlwIH0gPSBkZXNlcmlhbGl6ZVJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5KFxuICAgICAgICAgIHJlbFxuICAgICAgICApO1xuICAgICAgICBsZXQgcnJpID0geyByZWxhdGVkUmVjb3JkLCByZWNvcmQsIHJlbGF0aW9uc2hpcCB9O1xuICAgICAgICBpZiAocnYgPT09IG51bGwpIHtcbiAgICAgICAgICBjaGFuZ2VzZXQucmVtb3ZlSW52ZXJzZVJlbGF0aW9uc2hpcHMgPVxuICAgICAgICAgICAgY2hhbmdlc2V0LnJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXBzID8/IFtdO1xuICAgICAgICAgIGNoYW5nZXNldC5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwcy5wdXNoKHJyaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhbmdlc2V0LmFkZEludmVyc2VSZWxhdGlvbnNoaXBzID1cbiAgICAgICAgICAgIGNoYW5nZXNldC5hZGRJbnZlcnNlUmVsYXRpb25zaGlwcyA/PyBbXTtcbiAgICAgICAgICBjaGFuZ2VzZXQuYWRkSW52ZXJzZVJlbGF0aW9uc2hpcHMucHVzaChycmkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsdGEgPSB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gY2hhbmdlc2V0O1xuICB9XG5cbiAgZ2V0UmVjb3JkU3luYyhpZGVudGl0eTogUmVjb3JkSWRlbnRpdHkpOiBJbml0aWFsaXplZFJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLnJlY29yZHNbc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkoaWRlbnRpdHkpXSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRSZWNvcmRzU3luYyhcbiAgICB0eXBlT3JJZGVudGl0aWVzPzogc3RyaW5nIHwgUmVjb3JkSWRlbnRpdHlbXVxuICApOiBJbml0aWFsaXplZFJlY29yZFtdIHtcbiAgICBpZiAodHlwZW9mIHR5cGVPcklkZW50aXRpZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2JqZWN0VmFsdWVzKHRoaXMuX3N0YXRlLnJlY29yZHNbdHlwZU9ySWRlbnRpdGllc10pO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0eXBlT3JJZGVudGl0aWVzKSkge1xuICAgICAgY29uc3QgcmVjb3JkczogSW5pdGlhbGl6ZWRSZWNvcmRbXSA9IFtdO1xuICAgICAgY29uc3QgaWRlbnRpdGllczogUmVjb3JkSWRlbnRpdHlbXSA9IHR5cGVPcklkZW50aXRpZXM7XG4gICAgICBmb3IgKGxldCBpIG9mIGlkZW50aXRpZXMpIHtcbiAgICAgICAgbGV0IHJlY29yZCA9IHRoaXMuZ2V0UmVjb3JkU3luYyhpKTtcbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjb3JkcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlT3JJZGVudGl0aWVzIG11c3QgYmUgc3BlY2lmaWVkIGluIGdldFJlY29yZHNTeW5jJyk7XG4gICAgfVxuICB9XG5cbiAgc2V0UmVjb3JkU3luYyhyZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUucmVjb3Jkc1tzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWNvcmQpXSA9IHJlY29yZDtcbiAgICBpZiAodGhpcy5fZGVsdGEpIHtcbiAgICAgIHRoaXMuX2RlbHRhLnJlY29yZHNbc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmVjb3JkKV0gPSByZWNvcmQ7XG4gICAgfVxuICB9XG5cbiAgc2V0UmVjb3Jkc1N5bmMocmVjb3JkczogSW5pdGlhbGl6ZWRSZWNvcmRbXSk6IHZvaWQge1xuICAgIHJlY29yZHMuZm9yRWFjaCgocmVjb3JkKSA9PiB0aGlzLnNldFJlY29yZFN5bmMocmVjb3JkKSk7XG4gIH1cblxuICByZW1vdmVSZWNvcmRTeW5jKFxuICAgIHJlY29yZElkZW50aXR5OiBSZWNvcmRJZGVudGl0eVxuICApOiBJbml0aWFsaXplZFJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5nZXRSZWNvcmRTeW5jKHJlY29yZElkZW50aXR5KTtcbiAgICBpZiAocmVjb3JkKSB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RhdGUucmVjb3Jkc1tzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWNvcmQpXTtcbiAgICAgIGlmICh0aGlzLl9kZWx0YSkge1xuICAgICAgICB0aGlzLl9kZWx0YS5yZWNvcmRzW3NlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCldID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlUmVjb3Jkc1N5bmMocmVjb3JkSWRlbnRpdGllczogUmVjb3JkSWRlbnRpdHlbXSk6IEluaXRpYWxpemVkUmVjb3JkW10ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBbXTtcbiAgICBmb3IgKGxldCByZWNvcmRJZGVudGl0eSBvZiByZWNvcmRJZGVudGl0aWVzKSB7XG4gICAgICBsZXQgcmVjb3JkID0gdGhpcy5nZXRSZWNvcmRTeW5jKHJlY29yZElkZW50aXR5KTtcbiAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZS5yZWNvcmRzW3NlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCldO1xuICAgICAgICBpZiAodGhpcy5fZGVsdGEpIHtcbiAgICAgICAgICB0aGlzLl9kZWx0YS5yZWNvcmRzW3NlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCldID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIGdldEludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhcbiAgICByZWNvcmRJZGVudGl0eU9ySWRlbnRpdGllczogUmVjb3JkSWRlbnRpdHkgfCBSZWNvcmRJZGVudGl0eVtdXG4gICk6IFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5W10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlY29yZElkZW50aXR5T3JJZGVudGl0aWVzKSkge1xuICAgICAgbGV0IHJlbGF0aW9uc2hpcHM6IFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5W10gPSBbXTtcbiAgICAgIHJlY29yZElkZW50aXR5T3JJZGVudGl0aWVzLmZvckVhY2goKHJlY29yZCkgPT4ge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaChcbiAgICAgICAgICByZWxhdGlvbnNoaXBzLFxuICAgICAgICAgIHRoaXMuX2dldEludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhyZWNvcmQpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZWxhdGlvbnNoaXBzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHNTeW5jKHJlY29yZElkZW50aXR5T3JJZGVudGl0aWVzKTtcbiAgICB9XG4gIH1cblxuICBhZGRJbnZlcnNlUmVsYXRpb25zaGlwc1N5bmMoXG4gICAgcmVsYXRpb25zaGlwczogUmVjb3JkUmVsYXRpb25zaGlwSWRlbnRpdHlbXVxuICApOiB2b2lkIHtcbiAgICBmb3IgKGxldCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmkgPSBzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWxhdGlvbnNoaXAucmVsYXRlZFJlY29yZCk7XG4gICAgICBjb25zdCBycmkgPSBzZXJpYWxpemVSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eShyZWxhdGlvbnNoaXApO1xuICAgICAgY29uc3QgcmVscyA9IHRoaXMuX3N0YXRlLmludmVyc2VSZWxhdGlvbnNoaXBzW3JpXSA/PyB7fTtcbiAgICAgIHJlbHNbcnJpXSA9IHJlbGF0aW9uc2hpcDtcbiAgICAgIHRoaXMuX3N0YXRlLmludmVyc2VSZWxhdGlvbnNoaXBzW3JpXSA9IHJlbHM7XG4gICAgICBpZiAodGhpcy5fZGVsdGEpIHtcbiAgICAgICAgY29uc3QgcmVscyA9IHRoaXMuX2RlbHRhLmludmVyc2VSZWxhdGlvbnNoaXBzW3JpXSA/PyB7fTtcbiAgICAgICAgcmVsc1tycmldID0gcmVsYXRpb25zaGlwO1xuICAgICAgICB0aGlzLl9kZWx0YS5pbnZlcnNlUmVsYXRpb25zaGlwc1tyaV0gPSByZWxzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhcbiAgICByZWxhdGlvbnNoaXBzOiBSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eVtdXG4gICk6IHZvaWQge1xuICAgIGZvciAobGV0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByaSA9IHNlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlbGF0aW9uc2hpcC5yZWxhdGVkUmVjb3JkKTtcbiAgICAgIGNvbnN0IHJyaSA9IHNlcmlhbGl6ZVJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5KHJlbGF0aW9uc2hpcCk7XG4gICAgICBjb25zdCByZWxzID0gdGhpcy5fc3RhdGUuaW52ZXJzZVJlbGF0aW9uc2hpcHNbcmldO1xuXG4gICAgICBpZiAocmVscykge1xuICAgICAgICByZWxzW3JyaV0gPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fZGVsdGEpIHtcbiAgICAgICAgICBjb25zdCByZWxzID0gdGhpcy5fZGVsdGEuaW52ZXJzZVJlbGF0aW9uc2hpcHNbcmldID8/IHt9O1xuICAgICAgICAgIHJlbHNbcnJpXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBQcm90ZWN0ZWQgbWV0aG9kc1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIHByb3RlY3RlZCBfZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHNTeW5jKFxuICAgIHJlY29yZElkZW50aXR5OiBSZWNvcmRJZGVudGl0eVxuICApOiBSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eVtdIHtcbiAgICBsZXQgcmVsYXRpb25zaGlwcyA9IHRoaXMuX3N0YXRlLmludmVyc2VSZWxhdGlvbnNoaXBzW1xuICAgICAgc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmVjb3JkSWRlbnRpdHkpXG4gICAgXTtcbiAgICBpZiAocmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIG9iamVjdFZhbHVlcyhyZWxhdGlvbnNoaXBzKS5maWx0ZXIoKHIpID0+IHIgIT09IG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG59XG4iXX0=