gy-foo
Version:
A library that contains all models for the gy-web-project.
240 lines • 25.5 kB
JavaScript
import { __assign, __read, __spread, __values } from "tslib";
import { Occurrence } from './occurrence.model';
import { ModeFlags } from '../enums/modeFlags.enum';
var Entity = /** @class */ (function () {
function Entity(entity, keepModes) {
if (keepModes === void 0) { keepModes = true; }
if (entity) {
if (entity instanceof Entity) {
this.structure = entity.getStructure();
this.occs = this.convertOccurences(entity.getOccs(), keepModes) || [];
}
else {
this.structure = entity.structure;
this.occs = this.convertOccurences(entity.occs, keepModes) || [];
}
}
else {
this.structure = {};
this.occs = [];
}
}
/**
* Checks if entity has the structure of an entity
* @param entity entity to check
*/
Entity.isEntity = function (entity) {
return entity && entity.occs ? true : false;
};
/**
* Gets the number of the Occurrences of this Entity
*/
Entity.prototype.getOccsLength = function () {
return this.occs.length;
};
/**
* Get all Occurences of this entity.
*/
Entity.prototype.getOccs = function () {
return this.occs;
};
/**
* Sets all Occurrences of the Entity to the given array.
* @param occs array of the new Occurrences
*/
Entity.prototype.setOccs = function (occs) {
this.occs = occs;
};
/**
* Checks if the given occurence is in this Entity
* @param pk the pk of the occurrence
*/
Entity.prototype.hasOcc = function (pk) {
return this.occs.find(function (occ) { return occ.getPk() === pk; }) != null;
};
/**
* Sets the given Occurence on the given value. If pk is missing, the first Occurrence is set.
* @param occ the new Occurrence
* @param pk the pk of the Occurrence
*/
Entity.prototype.setOcc = function (occ, pk) {
if (pk) {
this.occs = this.occs.map(function (oldOcc) {
if (oldOcc.getPk() === pk) {
return occ;
}
else {
return oldOcc;
}
});
}
else {
this.occs[0] = occ;
}
};
/**
* Gets the Occurrence with the given pk, if no pk is given it gets the first Occurence
* @param pk PK of the Occurrence
*/
Entity.prototype.getOcc = function (pk) {
if (pk) {
return this.occs.find(function (occ) { return occ.getPk() === pk; });
}
else {
var occ = void 0;
if (this.occs && this.occs.length > 0) {
occ = this.occs[0];
}
else {
occ = new Occurrence();
this.addOcc(occ);
}
return occ;
}
};
/**
* Gets the structure of the Entity
*/
Entity.prototype.getStructure = function () {
return this.structure;
};
/**
* Adds an Occurrence to the Entity
* @param occ the new Occurrence
* @param modeFlag decides, if the add mode should be set for occ
* @param isUserChange is that a User Change
* @returns the pk of the new Occ
*/
Entity.prototype.addOcc = function (occ, add, isUserChange) {
var addFlag = add !== undefined && add !== null ? add : true;
if (!occ) {
occ = new Occurrence();
}
occ.setMode({ add: addFlag });
if (isUserChange) {
occ.setModified(true, false);
}
if (!occ.getPk()) {
var pk = 'new_';
var index_1 = 1;
this.occs.forEach(function (occ) {
if (occ.getPk().substr(0, 4) === 'new_' && Number(occ.getPk().substr(4)) >= index_1) {
index_1 = Number(occ.getPk().substr(4)) + 1;
}
});
pk += index_1;
occ.addPk(pk);
}
if (!occ.getStructure() || !Object.keys(occ.getStructure()).length) {
occ.setStructure(this.structure);
}
var occIndex = this.occs.findIndex(function (o) { return o.getPk() === occ.getPk(); });
if (occIndex >= 0) {
this.occs[occIndex] = occ;
}
else {
this.occs.push(occ);
}
return occ.getPk();
};
/**
* Copys an Occurrence to the Entity
* @param pk pk of the occurrence that should be copied
* @param modeFlag decides, if the copy mode should be set for the new occ
* @param isUserChange is this a User Change?
* @returns the pk of the new Occ
*/
Entity.prototype.copyOcc = function (pk, cpy, isUserChange) {
var cpyFlag = cpy !== undefined && cpy !== null ? cpy : true;
var occ = this.getOcc(pk);
var addFlag = occ.getMode() === 'add';
if (addFlag) {
cpyFlag = false;
}
var copyCount = this.occs.filter(function (o) { return o.getPk().search(new RegExp('^(?:copy_)?' + occ.getPk())) >= 0; }).length;
var copyOcc = new Occurrence({
pk: 'copy_' + occ.getPk() + '#' + copyCount,
data: __assign({}, occ.getData()),
structure: occ.getStructure(),
meta: occ.getMeta(),
}, { add: addFlag, cpy: cpyFlag });
if (isUserChange) {
occ.setModified(true, false);
}
this.occs.push(copyOcc);
return copyOcc.getPk();
};
/**
* Adds the Occurrences of an Entity to this Occurrences
* @param entity the Entity that should be added
*/
Entity.prototype.addEntity = function (entity) {
var _a;
var _this = this;
(_a = this.occs).push.apply(_a, __spread(this.convertOccurences(entity.occs).filter(function (occ) { return !_this.hasOcc(occ.getPk()); })));
};
Entity.prototype.convertOccurences = function (occs, keepModes) {
var _this = this;
if (keepModes === void 0) { keepModes = true; }
return occs.map(function (occ) {
return occ instanceof Occurrence
? occ
: new Occurrence(occ.pk ? occ : { pk: occ._pk, data: occ, structure: _this.structure || {} }, keepModes
? {
add: (occ.data != null ? occ.data._mode : occ._mode) === ModeFlags.ADD,
cpy: (occ.data != null ? occ.data._mode : occ._mode) === ModeFlags.CPY,
del: (occ.data != null ? occ.data._mode : occ._mode) === ModeFlags.DEL,
}
: null);
});
};
/**
* Sets the modified flag for all occs in the entity
* @param modified occ is modified?
* @param setSubEntites should the modified flag be set also in the subentites? (default: false)
*/
Entity.prototype.setModified = function (modified, setSubEntites) {
var e_1, _a;
if (setSubEntites === void 0) { setSubEntites = false; }
try {
for (var _b = __values(this.getOccs()), _c = _b.next(); !_c.done; _c = _b.next()) {
var occ = _c.value;
occ.setModified(modified, setSubEntites);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
};
/**
* Has the Entity been modified?
* @param checkSubEnt check Subentities (default: true)
*/
Entity.prototype.isModified = function (checkSubEnt) {
var e_2, _a;
if (checkSubEnt === void 0) { checkSubEnt = true; }
try {
for (var _b = __values(this.getOccs()), _c = _b.next(); !_c.done; _c = _b.next()) {
var occ = _c.value;
if (occ.isModified(checkSubEnt)) {
return true;
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_2) throw e_2.error; }
}
return false;
};
return Entity;
}());
export { Entity };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ3ktZm9vLyIsInNvdXJjZXMiOlsibGliL21vZGVscy9lbnRpdHkubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQ7SUFJRSxnQkFBWSxNQUFxRSxFQUFFLFNBQWdCO1FBQWhCLDBCQUFBLEVBQUEsZ0JBQWdCO1FBQ2pHLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxNQUFNLFlBQVksTUFBTSxFQUFFO2dCQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUN2RTtpQkFBTTtnQkFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2xFO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGVBQVEsR0FBZixVQUFnQixNQUFjO1FBQzVCLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILDhCQUFhLEdBQWI7UUFDRSxPQUFPLElB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QUFFLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLEdBQUc7cUJBQ3ZFO29CQUNILENBQUMsQ0FBQyxJQUFJLENBQ1QsQ0FBQztRQUNSLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCw0QkFBVyxHQUFYLFVBQVksUUFBaUIsRUFBRSxhQUE4Qjs7UUFBOUIsOEJBQUEsRUFBQSxxQkFBOEI7O1lBQzNELEtBQWtCLElBQUEsS0FBQSxTQUFBLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQSxnQkFBQSw0QkFBRTtnQkFBN0IsSUFBTSxHQUFHLFdBQUE7Z0JBQ1osR0FBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDMUM7Ozs7Ozs7OztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCwyQkFBVSxHQUFWLFVBQVcsV0FBMkI7O1FBQTNCLDRCQUFBLEVBQUEsa0JBQTJCOztZQUNwQyxLQUFrQixJQUFBLEtBQUEsU0FBQSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUEsZ0JBQUEsNEJBQUU7Z0JBQTdCLElBQU0sR0FBRyxXQUFBO2dCQUNaLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDL0IsT0FBTyxJQUFJLENBQUM7aUJBQ2I7YUFDRjs7Ozs7Ozs7O1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0gsYUFBQztBQUFELENBQUMsQUFsT0QsSUFrT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPY2N1cnJlbmNlIH0gZnJvbSAnLi9vY2N1cnJlbmNlLm1vZGVsJztcbmltcG9ydCB7IEVudGl0eVN0cnVjdHVyZSB9IGZyb20gJy4vZW50aXR5U3RydWN0dXJlLm1vZGVsJztcbmltcG9ydCB7IE1vZGVGbGFncyB9IGZyb20gJy4uL2VudW1zL21vZGVGbGFncy5lbnVtJztcblxuZXhwb3J0IGNsYXNzIEVudGl0eSB7XG4gIHByaXZhdGUgb2NjczogT2NjdXJyZW5jZVtdO1xuICBwcml2YXRlIHN0cnVjdHVyZTogRW50aXR5U3RydWN0dXJlO1xuXG4gIGNvbnN0cnVjdG9yKGVudGl0eT86IHsgc3RydWN0dXJlOiBFbnRpdHlTdHJ1Y3R1cmU7IG9jY3M/OiBPY2N1cnJlbmNlW10gfSB8IEVudGl0eSwga2VlcE1vZGVzID0gdHJ1ZSkge1xuICAgIGlmIChlbnRpdHkpIHtcbiAgICAgIGlmIChlbnRpdHkgaW5zdGFuY2VvZiBFbnRpdHkpIHtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSBlbnRpdHkuZ2V0U3RydWN0dXJlKCk7XG4gICAgICAgIHRoaXMub2NjcyA9IHRoaXMuY29udmVydE9jY3VyZW5jZXMoZW50aXR5LmdldE9jY3MoKSwga2VlcE1vZGVzKSB8fCBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RydWN0dXJlID0gZW50aXR5LnN0cnVjdHVyZTtcbiAgICAgICAgdGhpcy5vY2NzID0gdGhpcy5jb252ZXJ0T2NjdXJlbmNlcyhlbnRpdHkub2Njcywga2VlcE1vZGVzKSB8fCBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSB7fTtcbiAgICAgIHRoaXMub2NjcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZW50aXR5IGhhcyB0aGUgc3RydWN0dXJlIG9mIGFuIGVudGl0eVxuICAgKiBAcGFyYW0gZW50aXR5IGVudGl0eSB0byBjaGVja1xuICAgKi9cbiAgc3RhdGljIGlzRW50aXR5KGVudGl0eTogRW50aXR5KSB7XG4gICAgcmV0dXJuIGVudGl0eSAmJiBlbnRpdHkub2NjcyA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGhlIE9jY3VycmVuY2VzIG9mIHRoaXMgRW50aXR5XG4gICAqL1xuICBnZXRPY2NzTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLm9jY3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgT2NjdXJlbmNlcyBvZiB0aGlzIGVudGl0eS5cbiAgICovXG4gIGdldE9jY3MoKSB7XG4gICAgcmV0dXJuIHRoaXMub2NjcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFsbCBPY2N1cnJlbmNlcyBvZiB0aGUgRW50aXR5IHRvIHRoZSBnaXZlbiBhcnJheS5cbiAgICogQHBhcmFtIG9jY3MgYXJyYXkgb2YgdGhlIG5ldyBPY2N1cnJlbmNlc1xuICAgKi9cbiAgc2V0T2NjcyhvY2NzOiBPY2N1cnJlbmNlW10pIHtcbiAgICB0aGlzLm9jY3MgPSBvY2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2NjdXJlbmNlIGlzIGluIHRoaXMgRW50aXR5XG4gICAqIEBwYXJhbSBwayB0aGUgcGsgb2YgdGhlIG9jY3VycmVuY2VcbiAgICovXG4gIGhhc09jYyhwazogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub2Njcy5maW5kKChvY2MpID0+IG9jYy5nZXRQaygpID09PSBwaykgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnaXZlbiBPY2N1cmVuY2Ugb24gdGhlIGdpdmVuIHZhbHVlLiBJZiBwayBpcyBtaXNzaW5nLCB0aGUgZmlyc3QgT2NjdXJyZW5jZSBpcyBzZXQuXG4gICAqIEBwYXJhbSBvY2MgdGhlIG5ldyBPY2N1cnJlbmNlXG4gICAqIEBwYXJhbSBwayB0aGUgcGsgb2YgdGhlIE9jY3VycmVuY2VcbiAgICovXG4gIHNldE9jYyhvY2M6IE9jY3VycmVuY2UsIHBrPzogc3RyaW5nKSB7XG4gICAgaWYgKHBrKSB7XG4gICAgICB0aGlzLm9jY3MgPSB0aGlzLm9jY3MubWFwKChvbGRPY2MpID0+IHtcbiAgICAgICAgaWYgKG9sZE9jYy5nZXRQaygpID09PSBwaykge1xuICAgICAgICAgIHJldHVybiBvY2M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9sZE9jYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub2Njc1swXSA9IG9jYztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgT2NjdXJyZW5jZSB3aXRoIHRoZSBnaXZlbiBwaywgaWYgbm8gcGsgaXMgZ2l2ZW4gaXQgZ2V0cyB0aGUgZmlyc3QgT2NjdXJlbmNlXG4gICAqIEBwYXJhbSBwayBQSyBvZiB0aGUgT2NjdXJyZW5jZVxuICAgKi9cbiAgZ2V0T2NjKHBrPzogc3RyaW5nKTogT2NjdXJyZW5jZSB7XG4gICAgaWYgKHBrKSB7XG4gICAgICByZXR1cm4gdGhpcy5vY2NzLmZpbmQoKG9jYykgPT4gb2NjLmdldFBrKCkgPT09IHBrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG9jYztcbiAgICAgIGlmICh0aGlzLm9jY3MgJiYgdGhpcy5vY2NzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb2NjID0gdGhpcy5vY2NzWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2NjID0gbmV3IE9jY3VycmVuY2UoKTtcbiAgICAgICAgdGhpcy5hZGRPY2Mob2NjKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvY2M7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgRW50aXR5XG4gICAqL1xuICBnZXRTdHJ1Y3R1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gT2NjdXJyZW5jZSB0byB0aGUgRW50aXR5XG4gICAqIEBwYXJhbSBvY2MgdGhlIG5ldyBPY2N1cnJlbmNlXG4gICAqIEBwYXJhbSBtb2RlRmxhZyBkZWNpZGVzLCBpZiB0aGUgYWRkIG1vZGUgc2hvdWxkIGJlIHNldCBmb3Igb2NjXG4gICAqIEBwYXJhbSBpc1VzZXJDaGFuZ2UgaXMgdGhhdCBhIFVzZXIgQ2hhbmdlXG4gICAqIEByZXR1cm5zIHRoZSBwayBvZiB0aGUgbmV3IE9jY1xuICAgKi9cbiAgYWRkT2NjKG9jYz86IE9jY3VycmVuY2UsIGFkZD86IGJvb2xlYW4sIGlzVXNlckNoYW5nZT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBhZGRGbGFnID0gYWRkICE9PSB1bmRlZmluZWQgJiYgYWRkICE9PSBudWxsID8gYWRkIDogdHJ1ZTtcbiAgICBpZiAoIW9jYykge1xuICAgICAgb2NjID0gbmV3IE9jY3VycmVuY2UoKTtcbiAgICB9XG4gICAgb2NjLnNldE1vZGUoeyBhZGQ6IGFkZEZsYWcgfSk7XG4gICAgaWYgKGlzVXNlckNoYW5nZSkge1xuICAgICAgb2NjLnNldE1vZGlmaWVkKHRydWUsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKCFvY2MuZ2V0UGsoKSkge1xuICAgICAgbGV0IHBrID0gJ25ld18nO1xuICAgICAgbGV0IGluZGV4ID0gMTtcbiAgICAgIHRoaXMub2Njcy5mb3JFYWNoKChvY2MpID0+IHtcbiAgICAgICAgaWYgKG9jYy5nZXRQaygpLnN1YnN0cigwLCA0KSA9PT0gJ25ld18nICYmIE51bWJlcihvY2MuZ2V0UGsoKS5zdWJzdHIoNCkpID49IGluZGV4KSB7XG4gICAgICAgICAgaW5kZXggPSBOdW1iZXIob2NjLmdldFBrKCkuc3Vic3RyKDQpKSArIDE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcGsgKz0gaW5kZXg7XG4gICAgICBvY2MuYWRkUGsocGspO1xuICAgIH1cblxuICAgIGlmICghb2NjLmdldFN0cnVjdHVyZSgpIHx8ICFPYmplY3Qua2V5cyhvY2MuZ2V0U3RydWN0dXJlKCkpLmxlbmd0aCkge1xuICAgICAgb2NjLnNldFN0cnVjdHVyZSh0aGlzLnN0cnVjdHVyZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2NjSW5kZXggPSB0aGlzLm9jY3MuZmluZEluZGV4KChvKSA9PiBvLmdldFBrKCkgPT09IG9jYy5nZXRQaygpKTtcbiAgICBpZiAob2NjSW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5vY2NzW29jY0luZGV4XSA9IG9jYztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vY2NzLnB1c2gob2NjKTtcbiAgICB9XG4gICAgcmV0dXJuIG9jYy5nZXRQaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHlzIGFuIE9jY3VycmVuY2UgdG8gdGhlIEVudGl0eVxuICAgKiBAcGFyYW0gcGsgcGsgb2YgdGhlIG9jY3VycmVuY2UgdGhhdCBzaG91bGQgYmUgY29waWVkXG4gICAqIEBwYXJhbSBtb2RlRmxhZyBkZWNpZGVzLCBpZiB0aGUgY29weSBtb2RlIHNob3VsZCBiZSBzZXQgZm9yIHRoZSBuZXcgb2NjXG4gICAqIEBwYXJhbSBpc1VzZXJDaGFuZ2UgaXMgdGhpcyBhIFVzZXIgQ2hhbmdlP1xuICAgKiBAcmV0dXJucyB0aGUgcGsgb2YgdGhlIG5ldyBPY2NcbiAgICovXG4gIGNvcHlPY2MocGs6IHN0cmluZywgY3B5PzogYm9vbGVhbiwgaXNVc2VyQ2hhbmdlPzogYm9vbGVhbikge1xuICAgIGxldCBjcHlGbGFnID0gY3B5ICE9PSB1bmRlZmluZWQgJiYgY3B5ICE9PSBudWxsID8gY3B5IDogdHJ1ZTtcbiAgICBjb25zdCBvY2MgPSB0aGlzLmdldE9jYyhwayk7XG4gICAgY29uc3QgYWRkRmxhZyA9IG9jYy5nZXRNb2RlKCkgPT09ICdhZGQnO1xuICAgIGlmIChhZGRGbGFnKSB7XG4gICAgICBjcHlGbGFnID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNvcHlDb3VudCA9IHRoaXMub2Njcy5maWx0ZXIoKG8pID0+IG8uZ2V0UGsoKS5zZWFyY2gobmV3IFJlZ0V4cCgnXig/OmNvcHlfKT8nICsgb2NjLmdldFBrKCkpKSA+PSAwKS5sZW5ndGg7XG5cbiAgICBjb25zdCBjb3B5T2NjID0gbmV3IE9jY3VycmVuY2UoXG4gICAgICB7XG4gICAgICAgIHBrOiAnY29weV8nICsgb2NjLmdldFBrKCkgKyAnIycgKyBjb3B5Q291bnQsXG4gICAgICAgIGRhdGE6IHsgLi4ub2NjLmdldERhdGEoKSB9LFxuICAgICAgICBzdHJ1Y3R1cmU6IG9jYy5nZXRTdHJ1Y3R1cmUoKSxcbiAgICAgICAgbWV0YTogb2NjLmdldE1ldGEoKSxcbiAgICAgIH0sXG4gICAgICB7IGFkZDogYWRkRmxhZywgY3B5OiBjcHlGbGFnIH1cbiAgICApO1xuICAgIGlmIChpc1VzZXJDaGFuZ2UpIHtcbiAgICAgIG9jYy5zZXRNb2RpZmllZCh0cnVlLCBmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMub2Njcy5wdXNoKGNvcHlPY2MpO1xuICAgIHJldHVybiBjb3B5T2NjLmdldFBrKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgT2NjdXJyZW5jZXMgb2YgYW4gRW50aXR5IHRvIHRoaXMgT2NjdXJyZW5jZXNcbiAgICogQHBhcmFtIGVudGl0eSB0aGUgRW50aXR5IHRoYXQgc2hvdWxkIGJlIGFkZGVkXG4gICAqL1xuICBhZGRFbnRpdHkoZW50aXR5OiBFbnRpdHkpIHtcbiAgICB0aGlzLm9jY3MucHVzaCguLi50aGlzLmNvbnZlcnRPY2N1cmVuY2VzKGVudGl0eS5vY2NzKS5maWx0ZXIoKG9jYykgPT4gIXRoaXMuaGFzT2NjKG9jYy5nZXRQaygpKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0T2NjdXJlbmNlcyhcbiAgICBvY2NzOiAoT2NjdXJyZW5jZSB8IHsgcGs6IHN0cmluZzsgc3RydWN0dXJlOiBFbnRpdHlTdHJ1Y3R1cmU7IGRhdGE/OiBvYmplY3QgfSB8IGFueSlbXSxcbiAgICBrZWVwTW9kZXMgPSB0cnVlXG4gICk6IE9jY3VycmVuY2VbXSB7XG4gICAgcmV0dXJuIG9jY3MubWFwKChvY2MpID0+IHtcbiAgICAgIHJldHVybiBvY2MgaW5zdGFuY2VvZiBPY2N1cnJlbmNlXG4gICAgICAgID8gb2NjXG4gICAgICAgIDogbmV3IE9jY3VycmVuY2UoXG4gICAgICAgICAgICBvY2MucGsgPyBvY2MgOiB7IHBrOiBvY2MuX3BrLCBkYXRhOiBvY2MsIHN0cnVjdHVyZTogdGhpcy5zdHJ1Y3R1cmUgfHwge30gfSxcbiAgICAgICAgICAgIGtlZXBNb2Rlc1xuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIGFkZDogKG9jYy5kYXRhICE9IG51bGwgPyBvY2MuZGF0YS5fbW9kZSA6IG9jYy5fbW9kZSkgPT09IE1vZGVGbGFncy5BREQsXG4gICAgICAgICAgICAgICAgICBjcHk6IChvY2MuZGF0YSAhPSBudWxsID8gb2NjLmRhdGEuX21vZGUgOiBvY2MuX21vZGUpID09PSBNb2RlRmxhZ3MuQ1BZLFxuICAgICAgICAgICAgICAgICAgZGVsOiAob2NjLmRhdGEgIT0gbnVsbCA/IG9jYy5kYXRhLl9tb2RlIDogb2NjLl9tb2RlKSA9PT0gTW9kZUZsYWdzLkRFTCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbW9kaWZpZWQgZmxhZyBmb3IgYWxsIG9jY3MgaW4gdGhlIGVudGl0eVxuICAgKiBAcGFyYW0gbW9kaWZpZWQgb2NjIGlzIG1vZGlmaWVkP1xuICAgKiBAcGFyYW0gc2V0U3ViRW50aXRlcyBzaG91bGQgdGhlIG1vZGlmaWVkIGZsYWcgYmUgc2V0IGFsc28gaW4gdGhlIHN1YmVudGl0ZXM/IChkZWZhdWx0OiBmYWxzZSlcbiAgICovXG4gIHNldE1vZGlmaWVkKG1vZGlmaWVkOiBib29sZWFuLCBzZXRTdWJFbnRpdGVzOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9jYyBvZiB0aGlzLmdldE9jY3MoKSkge1xuICAgICAgb2NjLnNldE1vZGlmaWVkKG1vZGlmaWVkLCBzZXRTdWJFbnRpdGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFzIHRoZSBFbnRpdHkgYmVlbiBtb2RpZmllZD9cbiAgICogQHBhcmFtIGNoZWNrU3ViRW50IGNoZWNrIFN1YmVudGl0aWVzIChkZWZhdWx0OiB0cnVlKVxuICAgKi9cbiAgaXNNb2RpZmllZChjaGVja1N1YkVudDogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IG9jYyBvZiB0aGlzLmdldE9jY3MoKSkge1xuICAgICAgaWYgKG9jYy5pc01vZGlmaWVkKGNoZWNrU3ViRW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=