pretur.clay
Version:
Client-side immutability helper
164 lines • 24.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var lodash_1 = require("lodash");
var actions_1 = require("./actions");
function FieldsEqual(fields1, fields2) {
var fields1Keys = Object.keys(fields1);
var fields2Keys = Object.keys(fields2);
if (fields1Keys.length !== fields2Keys.length) {
return false;
}
if (fields1Keys.length === 0) {
return true;
}
if (lodash_1.xor(fields1Keys, fields2Keys).length !== 0) {
return false;
}
for (var _i = 0, fields1Keys_1 = fields1Keys; _i < fields1Keys_1.length; _i++) {
var key = fields1Keys_1[_i];
if (fields1[key] !== fields2[key]) {
return false;
}
}
return true;
}
var Record = /** @class */ (function () {
function Record(fields, error, state, original, identifier) {
if (state === void 0) { state = 'normal'; }
if (fields instanceof Record) {
return fields;
}
this.identifier = typeof identifier === 'symbol' ? identifier : Symbol();
this.original = original ? original : this;
this.state = state;
this.fields = fields;
this.error = error;
}
Object.defineProperty(Record.prototype, "modified", {
get: function () {
return this.original !== this;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Record.prototype, "valid", {
get: function () {
for (var _i = 0, _a = Object.keys(this.fields); _i < _a.length; _i++) {
var key = _a[_i];
if (!this.fields[key].valid) {
return false;
}
}
return !this.error;
},
enumerable: true,
configurable: true
});
Record.prototype.reduce = function (action) {
if (actions_1.CLAY_CLEAR.is(this.identifier, action)) {
return this.original;
}
if (actions_1.CLAY_REPLACE.is(this.identifier, action)) {
return action.payload;
}
if (actions_1.CLAY_SET_FIELD.is(this.identifier, action)) {
if (!action.payload) {
return this;
}
if (this.fields[action.payload.field] === action.payload.value) {
return this;
}
var fieldsWithNew = tslib_1.__assign({}, this.fields, (_a = {}, _a[action.payload.field] = action.payload.value, _a));
if (FieldsEqual(this.original.fields, fieldsWithNew) &&
this.original.state === this.state &&
lodash_1.isEqual(this.original.error, this.error)) {
return this.original;
}
return new Record(fieldsWithNew, this.error, this.state, this.original, this.identifier);
}
if (actions_1.CLAY_SET_ERROR.is(this.identifier, action)) {
if (lodash_1.isEqual(this.error, action.payload)) {
return this;
}
if (FieldsEqual(this.original.fields, this.fields) &&
this.original.state === this.state &&
lodash_1.isEqual(this.original.error, action.payload)) {
return this.original;
}
return new Record(this.fields, action.payload, this.state, this.original, this.identifier);
}
if (actions_1.CLAY_SET_STATE.is(this.identifier, action)) {
if (this.state === action.payload) {
return this;
}
if (FieldsEqual(this.original.fields, this.fields) &&
this.original.state === action.payload &&
lodash_1.isEqual(this.original.error, this.error)) {
return this.original;
}
return new Record(this.fields, this.error, action.payload, this.original, this.identifier);
}
if (actions_1.CLAY_SET_REMOVED_AND_RESET.is(this.identifier, action)) {
return new Record(this.original.fields, this.original.error, 'removed', this.original, this.identifier);
}
var fieldKeys = Object.keys(this.fields);
var newFields = {};
var modified = false;
var original = true;
for (var _i = 0, fieldKeys_1 = fieldKeys; _i < fieldKeys_1.length; _i++) {
var key = fieldKeys_1[_i];
newFields[key] = this.fields[key].reduce(action);
if (newFields[key] !== this.fields[key]) {
modified = true;
}
if (newFields[key] !== this.original.fields[key]) {
original = false;
}
}
if (modified) {
if (original &&
this.original.state === this.state &&
lodash_1.isEqual(this.original.error, this.error)) {
return this.original;
}
return new Record(newFields, this.error, this.state, this.original, this.identifier);
}
return this;
var _a;
};
Record.prototype.clear = function (dispatch) {
dispatch(actions_1.CLAY_CLEAR.create.unicast(this.identifier));
};
Record.prototype.replace = function (dispatch, by) {
dispatch(actions_1.CLAY_REPLACE.create.unicast(this.identifier, by));
};
Record.prototype.setField = function (dispatch, field, value) {
dispatch(actions_1.CLAY_SET_FIELD.create.unicast(this.identifier, { field: field, value: value }));
};
Record.prototype.setError = function (dispatch, error) {
dispatch(actions_1.CLAY_SET_ERROR.create.unicast(this.identifier, error));
};
Record.prototype.setState = function (dispatch, state) {
dispatch(actions_1.CLAY_SET_STATE.create.unicast(this.identifier, state));
};
Record.prototype.remove = function (dispatch) {
if (this.state === 'normal') {
dispatch(actions_1.CLAY_SET_REMOVED_AND_RESET.create.unicast(this.identifier));
}
if (this.state === 'new') {
dispatch(actions_1.CLAY_REMOVE.create.broadcast(this.identifier));
}
};
Record.prototype.discard = function (dispatch) {
dispatch(actions_1.CLAY_REMOVE.create.broadcast(this.identifier));
};
Record.prototype.unremove = function (dispatch) {
if (this.state === 'removed') {
dispatch(actions_1.CLAY_SET_STATE.create.unicast(this.identifier, 'normal'));
}
};
return Record;
}());
exports.Record = Record;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1JlY29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBc0M7QUFNdEMscUNBUW1CO0FBRW5CLHFCQUF5QyxPQUFrQixFQUFFLE9BQWtCO0lBQzdFLElBQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsSUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsRUFBRSxDQUFDLENBQUMsWUFBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELEdBQUcsQ0FBQyxDQUFjLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVztRQUF4QixJQUFNLEdBQUcsb0JBQUE7UUFDWixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2YsQ0FBQztLQUNGO0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDtJQU9FLGdCQUNFLE1BQWlCLEVBQ2pCLEtBQXVCLEVBQ3ZCLEtBQXVCLEVBQ3ZCLFFBQW9CLEVBQ3BCLFVBQW1C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TUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLHdCQUFPLEdBQWQsVUFBZSxRQUFrQjtRQUMvQixRQUFRLENBQUMscUJBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSx5QkFBUSxHQUFmLFVBQWdCLFFBQWtCO1FBQ2hDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM3QixRQUFRLENBQUMsd0JBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUNILGFBQUM7QUFBRCxDQUFDLEFBak5ELElBaU5DO0FBak5ZLHdCQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeG9yLCBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgU3BlY1R5cGUgfSBmcm9tICdwcmV0dXIuc3BlYyc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ3ByZXR1ci52YWxpZGF0aW9uJztcclxuaW1wb3J0IHsgQWN0aW9uLCBEaXNwYXRjaCB9IGZyb20gJ3JlZHVjaWJsZS1ub2RlJztcclxuaW1wb3J0IHsgQ2xheSwgU3RhdGUgfSBmcm9tICcuL2NsYXknO1xyXG5pbXBvcnQgeyBGaWVsZHMgfSBmcm9tICcuL2ZpZWxkcyc7XHJcbmltcG9ydCB7XHJcbiAgQ0xBWV9DTEVBUixcclxuICBDTEFZX1JFUExBQ0UsXHJcbiAgQ0xBWV9TRVRfRklFTEQsXHJcbiAgQ0xBWV9TRVRfRVJST1IsXHJcbiAgQ0xBWV9TRVRfU1RBVEUsXHJcbiAgQ0xBWV9SRU1PVkUsXHJcbiAgQ0xBWV9TRVRfUkVNT1ZFRF9BTkRfUkVTRVQsXHJcbn0gZnJvbSAnLi9hY3Rpb25zJztcclxuXHJcbmZ1bmN0aW9uIEZpZWxkc0VxdWFsPFQgZXh0ZW5kcyBTcGVjVHlwZT4oZmllbGRzMTogRmllbGRzPFQ+LCBmaWVsZHMyOiBGaWVsZHM8VD4pOiBib29sZWFuIHtcclxuICBjb25zdCBmaWVsZHMxS2V5cyA9IE9iamVjdC5rZXlzKGZpZWxkczEpO1xyXG4gIGNvbnN0IGZpZWxkczJLZXlzID0gT2JqZWN0LmtleXMoZmllbGRzMik7XHJcbiAgaWYgKGZpZWxkczFLZXlzLmxlbmd0aCAhPT0gZmllbGRzMktleXMubGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpZiAoZmllbGRzMUtleXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGlmICh4b3IoZmllbGRzMUtleXMsIGZpZWxkczJLZXlzKS5sZW5ndGggIT09IDApIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGZvciAoY29uc3Qga2V5IG9mIGZpZWxkczFLZXlzKSB7XHJcbiAgICBpZiAoZmllbGRzMVtrZXldICE9PSBmaWVsZHMyW2tleV0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29yZDxUIGV4dGVuZHMgU3BlY1R5cGU+IGltcGxlbWVudHMgQ2xheTxSZWNvcmQ8VD4+IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3ltYm9sO1xyXG4gIHB1YmxpYyByZWFkb25seSBvcmlnaW5hbDogdGhpcztcclxuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGU6IFN0YXRlO1xyXG4gIHB1YmxpYyByZWFkb25seSBmaWVsZHM6IEZpZWxkczxUPjtcclxuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3I6IFZhbGlkYXRpb25FcnJvcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBmaWVsZHM6IEZpZWxkczxUPixcclxuICAgIGVycm9yPzogVmFsaWRhdGlvbkVycm9yLFxyXG4gICAgc3RhdGU6IFN0YXRlID0gJ25vcm1hbCcsXHJcbiAgICBvcmlnaW5hbD86IFJlY29yZDxUPixcclxuICAgIGlkZW50aWZpZXI/OiBzeW1ib2wsXHJcbiAgKSB7XHJcbiAgICBpZiAoZmllbGRzIGluc3RhbmNlb2YgUmVjb3JkKSB7XHJcbiAgICAgIHJldHVybiBmaWVsZHM7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlkZW50aWZpZXIgPSB0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3N5bWJvbCcgPyBpZGVudGlmaWVyIDogU3ltYm9sKCk7XHJcbiAgICB0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWwgPyA8dGhpcz5vcmlnaW5hbCA6IHRoaXM7XHJcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XHJcbiAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcclxuICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbW9kaWZpZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbCAhPT0gdGhpcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmZpZWxkcykpIHtcclxuICAgICAgaWYgKCF0aGlzLmZpZWxkc1trZXldLnZhbGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICF0aGlzLmVycm9yO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZHVjZShhY3Rpb246IEFjdGlvbjxhbnk+KTogdGhpcyB7XHJcbiAgICBpZiAoQ0xBWV9DTEVBUi5pcyh0aGlzLmlkZW50aWZpZXIsIGFjdGlvbikpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKENMQVlfUkVQTEFDRS5pcyh0aGlzLmlkZW50aWZpZXIsIGFjdGlvbikpIHtcclxuICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDTEFZX1NFVF9GSUVMRC5pcyh0aGlzLmlkZW50aWZpZXIsIGFjdGlvbikpIHtcclxuICAgICAgaWYgKCFhY3Rpb24ucGF5bG9hZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5maWVsZHNbYWN0aW9uLnBheWxvYWQuZmllbGRdID09PSBhY3Rpb24ucGF5bG9hZC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBmaWVsZHNXaXRoTmV3ID0gPEZpZWxkczxUPj57XHJcbiAgICAgICAgLi4uKDxhbnk+dGhpcy5maWVsZHMpLFxyXG4gICAgICAgIFthY3Rpb24ucGF5bG9hZC5maWVsZF06IGFjdGlvbi5wYXlsb2FkLnZhbHVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIEZpZWxkc0VxdWFsKHRoaXMub3JpZ2luYWwuZmllbGRzLCBmaWVsZHNXaXRoTmV3KSAmJlxyXG4gICAgICAgIHRoaXMub3JpZ2luYWwuc3RhdGUgPT09IHRoaXMuc3RhdGUgJiZcclxuICAgICAgICBpc0VxdWFsKHRoaXMub3JpZ2luYWwuZXJyb3IsIHRoaXMuZXJyb3IpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gPHRoaXM+bmV3IFJlY29yZChcclxuICAgICAgICBmaWVsZHNXaXRoTmV3LFxyXG4gICAgICAgIHRoaXMuZXJyb3IsXHJcbiAgICAgICAgdGhpcy5zdGF0ZSxcclxuICAgICAgICB0aGlzLm9yaWdpbmFsLFxyXG4gICAgICAgIHRoaXMuaWRlbnRpZmllcixcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQ0xBWV9TRVRfRVJST1IuaXModGhpcy5pZGVudGlmaWVyLCBhY3Rpb24pKSB7XHJcbiAgICAgIGlmIChpc0VxdWFsKHRoaXMuZXJyb3IsIGFjdGlvbi5wYXlsb2FkKSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgRmllbGRzRXF1YWwodGhpcy5vcmlnaW5hbC5maWVsZHMsIHRoaXMuZmllbGRzKSAmJlxyXG4gICAgICAgIHRoaXMub3JpZ2luYWwuc3RhdGUgPT09IHRoaXMuc3RhdGUgJiZcclxuICAgICAgICBpc0VxdWFsKHRoaXMub3JpZ2luYWwuZXJyb3IsIGFjdGlvbi5wYXlsb2FkKVxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDx0aGlzPm5ldyBSZWNvcmQoXHJcbiAgICAgICAgdGhpcy5maWVsZHMsXHJcbiAgICAgICAgYWN0aW9uLnBheWxvYWQsXHJcbiAgICAgICAgdGhpcy5zdGF0ZSxcclxuICAgICAgICB0aGlzLm9yaWdpbmFsLFxyXG4gICAgICAgIHRoaXMuaWRlbnRpZmllcixcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQ0xBWV9TRVRfU1RBVEUuaXModGhpcy5pZGVudGlmaWVyLCBhY3Rpb24pKSB7XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSBhY3Rpb24ucGF5bG9hZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgRmllbGRzRXF1YWwodGhpcy5vcmlnaW5hbC5maWVsZHMsIHRoaXMuZmllbGRzKSAmJlxyXG4gICAgICAgIHRoaXMub3JpZ2luYWwuc3RhdGUgPT09IGFjdGlvbi5wYXlsb2FkICYmXHJcbiAgICAgICAgaXNFcXVhbCh0aGlzLm9yaWdpbmFsLmVycm9yLCB0aGlzLmVycm9yKVxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDx0aGlzPm5ldyBSZWNvcmQoXHJcbiAgICAgICAgdGhpcy5maWVsZHMsXHJcbiAgICAgICAgdGhpcy5lcnJvcixcclxuICAgICAgICBhY3Rpb24ucGF5bG9hZCxcclxuICAgICAgICB0aGlzLm9yaWdpbmFsLFxyXG4gICAgICAgIHRoaXMuaWRlbnRpZmllcixcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQ0xBWV9TRVRfUkVNT1ZFRF9BTkRfUkVTRVQuaXModGhpcy5pZGVudGlmaWVyLCBhY3Rpb24pKSB7XHJcbiAgICAgIHJldHVybiA8dGhpcz5uZXcgUmVjb3JkKFxyXG4gICAgICAgIHRoaXMub3JpZ2luYWwuZmllbGRzLFxyXG4gICAgICAgIHRoaXMub3JpZ2luYWwuZXJyb3IsXHJcbiAgICAgICAgJ3JlbW92ZWQnLFxyXG4gICAgICAgIHRoaXMub3JpZ2luYWwsXHJcbiAgICAgICAgdGhpcy5pZGVudGlmaWVyLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpZWxkS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZmllbGRzKTtcclxuICAgIGNvbnN0IG5ld0ZpZWxkcyA9IDxGaWVsZHM8VD4+e307XHJcbiAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcclxuICAgIGxldCBvcmlnaW5hbCA9IHRydWU7XHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgb2YgZmllbGRLZXlzKSB7XHJcbiAgICAgIG5ld0ZpZWxkc1trZXldID0gdGhpcy5maWVsZHNba2V5XS5yZWR1Y2UoYWN0aW9uKTtcclxuXHJcbiAgICAgIGlmIChuZXdGaWVsZHNba2V5XSAhPT0gdGhpcy5maWVsZHNba2V5XSkge1xyXG4gICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5ld0ZpZWxkc1trZXldICE9PSB0aGlzLm9yaWdpbmFsLmZpZWxkc1trZXldKSB7XHJcbiAgICAgICAgb3JpZ2luYWwgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChtb2RpZmllZCkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgb3JpZ2luYWwgJiZcclxuICAgICAgICB0aGlzLm9yaWdpbmFsLnN0YXRlID09PSB0aGlzLnN0YXRlICYmXHJcbiAgICAgICAgaXNFcXVhbCh0aGlzLm9yaWdpbmFsLmVycm9yLCB0aGlzLmVycm9yKVxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDx0aGlzPm5ldyBSZWNvcmQoXHJcbiAgICAgICAgbmV3RmllbGRzLFxyXG4gICAgICAgIHRoaXMuZXJyb3IsXHJcbiAgICAgICAgdGhpcy5zdGF0ZSxcclxuICAgICAgICB0aGlzLm9yaWdpbmFsLFxyXG4gICAgICAgIHRoaXMuaWRlbnRpZmllcixcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhcihkaXNwYXRjaDogRGlzcGF0Y2gpOiB2b2lkIHtcclxuICAgIGRpc3BhdGNoKENMQVlfQ0xFQVIuY3JlYXRlLnVuaWNhc3QodGhpcy5pZGVudGlmaWVyKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVwbGFjZShkaXNwYXRjaDogRGlzcGF0Y2gsIGJ5OiB0aGlzKTogdm9pZCB7XHJcbiAgICBkaXNwYXRjaChDTEFZX1JFUExBQ0UuY3JlYXRlLnVuaWNhc3QodGhpcy5pZGVudGlmaWVyLCBieSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZpZWxkPEsgZXh0ZW5kcyBrZXlvZiBGaWVsZHM8VD4+KGRpc3BhdGNoOiBEaXNwYXRjaCwgZmllbGQ6IEssIHZhbHVlOiBGaWVsZHM8VD5bS10pIHtcclxuICAgIGRpc3BhdGNoKENMQVlfU0VUX0ZJRUxELmNyZWF0ZS51bmljYXN0KHRoaXMuaWRlbnRpZmllciwgeyBmaWVsZCwgdmFsdWUgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEVycm9yKGRpc3BhdGNoOiBEaXNwYXRjaCwgZXJyb3I6IFZhbGlkYXRpb25FcnJvcik6IHZvaWQge1xyXG4gICAgZGlzcGF0Y2goQ0xBWV9TRVRfRVJST1IuY3JlYXRlLnVuaWNhc3QodGhpcy5pZGVudGlmaWVyLCBlcnJvcikpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFN0YXRlKGRpc3BhdGNoOiBEaXNwYXRjaCwgc3RhdGU6IFN0YXRlKTogdm9pZCB7XHJcbiAgICBkaXNwYXRjaChDTEFZX1NFVF9TVEFURS5jcmVhdGUudW5pY2FzdCh0aGlzLmlkZW50aWZpZXIsIHN0YXRlKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlKGRpc3BhdGNoOiBEaXNwYXRjaCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdub3JtYWwnKSB7XHJcbiAgICAgIGRpc3BhdGNoKENMQVlfU0VUX1JFTU9WRURfQU5EX1JFU0VULmNyZWF0ZS51bmljYXN0KHRoaXMuaWRlbnRpZmllcikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnN0YXRlID09PSAnbmV3Jykge1xyXG4gICAgICBkaXNwYXRjaChDTEFZX1JFTU9WRS5jcmVhdGUuYnJvYWRjYXN0KHRoaXMuaWRlbnRpZmllcikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc2NhcmQoZGlzcGF0Y2g6IERpc3BhdGNoKTogdm9pZCB7XHJcbiAgICBkaXNwYXRjaChDTEFZX1JFTU9WRS5jcmVhdGUuYnJvYWRjYXN0KHRoaXMuaWRlbnRpZmllcikpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVucmVtb3ZlKGRpc3BhdGNoOiBEaXNwYXRjaCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdyZW1vdmVkJykge1xyXG4gICAgICBkaXNwYXRjaChDTEFZX1NFVF9TVEFURS5jcmVhdGUudW5pY2FzdCh0aGlzLmlkZW50aWZpZXIsICdub3JtYWwnKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==