pretur.clay
Version:
Client-side immutability helper
208 lines • 34.1 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 isPath(path) {
return Array.isArray(path) && path.length > 0;
}
function getFilters(query, path) {
var target = isPath(path) ? getInclude(query, path) : query;
if (!target || !target.filters) {
return {};
}
return target.filters;
}
exports.getFilters = getFilters;
function getInclude(query, path) {
if (!isPath(path)) {
return;
}
var include = lodash_1.get(query, lodash_1.flatten(lodash_1.zip(lodash_1.fill(lodash_1.compact(path), 'include'), lodash_1.compact(path))));
if (include === true) {
return {};
}
if (!include) {
return;
}
return include;
}
exports.getInclude = getInclude;
function setInclude(query, include, path) {
if (isPath(path)) {
lodash_1.setWith(query, lodash_1.flatten(lodash_1.zip(lodash_1.fill(lodash_1.compact(path), 'include'), lodash_1.compact(path))), include, Object);
}
}
exports.setInclude = setInclude;
var Querier = /** @class */ (function () {
function Querier(scope, model, query, count, identifier) {
this.identifier = typeof identifier === 'symbol' ? identifier : Symbol();
this.count = count;
this.scope = scope;
this.model = model;
this.query = query;
}
Querier.prototype.reduce = function (action) {
if (actions_1.CLAY_SET_QUERY_ATTRIBUTES.is(this.identifier, action)) {
if (lodash_1.isEqual(this.query.attributes, action.payload)) {
return this;
}
var newQuery = lodash_1.omit(this.query, 'attributes');
if (Array.isArray(action.payload)) {
var attributes = lodash_1.compact(action.payload);
if (attributes.length > 0) {
newQuery.attributes = attributes;
}
}
if (newQuery.pagination) {
newQuery.pagination = { skip: 0, take: newQuery.pagination.take };
}
return new Querier(this.scope, this.model, newQuery, this.count, this.identifier);
}
if (actions_1.CLAY_SET_QUERY_FILTERS.is(this.identifier, action)) {
if (!action.payload) {
return this;
}
var _a = action.payload, path = _a.path, filters = _a.filters;
var target = isPath(path) ? getInclude(this.query, path) : this.query;
if (target && lodash_1.isEqual(target.filters, filters)) {
return this;
}
var newQuery = void 0;
if (isPath(path)) {
var include = lodash_1.omit(getInclude(this.query, path), 'filters');
if (filters) {
include.filters = filters;
}
newQuery = lodash_1.cloneDeep(this.query);
setInclude(newQuery, include, path);
}
else {
newQuery = lodash_1.omit(this.query, 'filters');
if (filters) {
newQuery.filters = filters;
}
}
if (newQuery.pagination) {
newQuery.pagination = { skip: 0, take: newQuery.pagination.take };
}
return new Querier(this.scope, this.model, newQuery, this.count, this.identifier);
}
if (actions_1.CLAY_SET_QUERY_PAGINATION.is(this.identifier, action)) {
if (lodash_1.isEqual(this.query.pagination, action.payload)) {
return this;
}
var newQuery = lodash_1.omit(this.query, 'pagination');
if (action.payload) {
newQuery.pagination = action.payload;
}
return new Querier(this.scope, this.model, newQuery, this.count, this.identifier);
}
if (actions_1.CLAY_SET_QUERY_ORDER.is(this.identifier, action)) {
if (lodash_1.isEqual(this.query.order, action.payload)) {
return this;
}
var newQuery = lodash_1.omit(this.query, 'order');
if (action.payload) {
newQuery.order = action.payload;
}
if (newQuery.pagination) {
newQuery.pagination = { skip: 0, take: newQuery.pagination.take };
}
return new Querier(this.scope, this.model, newQuery, this.count, this.identifier);
}
if (actions_1.CLAY_SET_QUERY_EXTRA.is(this.identifier, action)) {
if (!action.payload || lodash_1.isEqual(this.query.extra, action.payload.extra)) {
return this;
}
var newQuery = tslib_1.__assign({}, this.query, { extra: action.payload.extra });
if (action.payload.resetPagination && newQuery.pagination) {
newQuery.pagination = { skip: 0, take: newQuery.pagination.take };
}
return new Querier(this.scope, this.model, newQuery, this.count, this.identifier);
}
if (actions_1.CLAY_SET_QUERIEIR_COUNT.is(this.identifier, action)) {
if (this.count === action.payload) {
return this;
}
return new Querier(this.scope, this.model, this.query, action.payload, this.identifier);
}
if (actions_1.CLAY_RESET_QUERIEIR.is(this.identifier, action)) {
if (!action.payload) {
return this;
}
return new Querier(this.scope, this.model, action.payload, undefined, this.identifier);
}
if (actions_1.CLAY_REFRESH.is(this.identifier, action)) {
if (!action.payload || this.count === action.payload.count) {
return this;
}
return new Querier(this.scope, this.model, this.query, action.payload.count, this.identifier);
}
return this;
};
Querier.prototype.setAttributes = function (dispatch, attributes) {
dispatch(actions_1.CLAY_SET_QUERY_ATTRIBUTES.create.unicast(this.identifier, attributes));
};
Querier.prototype.resetFilters = function (dispatch, filters, path) {
dispatch(actions_1.CLAY_SET_QUERY_FILTERS.create.unicast(this.identifier, { filters: filters, path: path }));
};
Querier.prototype.setFilter = function (dispatch, field, filter, path) {
var target = isPath(path) ? getInclude(this.query, path) : this.query;
var filters = target ? tslib_1.__assign({}, target.filters) : {};
filters[field] = filter;
dispatch(actions_1.CLAY_SET_QUERY_FILTERS.create.unicast(this.identifier, { filters: filters, path: path }));
};
Querier.prototype.clearFilter = function (dispatch, field, path) {
var target = isPath(path) ? getInclude(this.query, path) : this.query;
if (!target || !target.filters) {
return;
}
var filters = lodash_1.omit(target.filters, field);
dispatch(actions_1.CLAY_SET_QUERY_FILTERS.create.unicast(this.identifier, { filters: filters, path: path }));
};
Querier.prototype.setPagination = function (dispatch, skip, take) {
if (skip === void 0) { skip = 0; }
if (take === void 0) { take = 0; }
dispatch(actions_1.CLAY_SET_QUERY_PAGINATION.create.unicast(this.identifier, { skip: skip, take: take }));
};
Querier.prototype.setOrder = function (dispatch, field, ordering, chain) {
var targetOrdering = ordering;
if (typeof targetOrdering !== 'string') {
if (!this.query.order || this.query.order.field !== field) {
targetOrdering = 'ASC';
}
else {
switch (this.query.order.ordering) {
case 'NONE':
targetOrdering = 'ASC';
break;
case 'ASC':
targetOrdering = 'DESC';
break;
default:
targetOrdering = 'NONE';
break;
}
}
}
dispatch(actions_1.CLAY_SET_QUERY_ORDER.create.unicast(this.identifier, {
chain: chain,
field: field,
ordering: targetOrdering,
}));
};
Querier.prototype.setExtra = function (dispatch, extra, resetPagination) {
if (resetPagination === void 0) { resetPagination = false; }
dispatch(actions_1.CLAY_SET_QUERY_EXTRA.create.unicast(this.identifier, { extra: extra, resetPagination: resetPagination }));
};
Querier.prototype.setCount = function (dispatch, count) {
dispatch(actions_1.CLAY_SET_QUERIEIR_COUNT.create.unicast(this.identifier, count));
};
Querier.prototype.reset = function (dispatch, query) {
dispatch(actions_1.CLAY_RESET_QUERIEIR.create.unicast(this.identifier, query));
};
return Querier;
}());
exports.Querier = Querier;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9RdWVyaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUE2RjtBQUk3RixxQ0FTbUI7QUFFbkIsZ0JBQWdCLElBQWU7SUFDN0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELG9CQUEyQixLQUFpQixFQUFFLElBQWU7SUFDM0QsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDOUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFQRCxnQ0FPQztBQUVELG9CQUEyQixLQUFpQixFQUFFLElBQWU7SUFDM0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sQ0FBQztJQUNULENBQUM7SUFFRCxJQUFNLE9BQU8sR0FBRyxZQUFHLENBQUMsS0FBSyxFQUFFLGdCQUFPLENBQUMsWUFBRyxDQUFDLGFBQUksQ0FBQyxnQkFBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGdCQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEYsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckIsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNaLENBQUM7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a0IsRUFBRSxLQUFXLEVBQUUsZUFBdUI7UUFBdkIsZ0NBQUEsRUFBQSx1QkFBdUI7UUFDdEUsUUFBUSxDQUFDLDhCQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssT0FBQSxFQUFFLGVBQWUsaUJBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRU0sMEJBQVEsR0FBZixVQUFnQixRQUFrQixFQUFFLEtBQWM7UUFDaEQsUUFBUSxDQUFDLGlDQUF1QixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTSx1QkFBSyxHQUFaLFVBQWEsUUFBa0IsRUFBRSxLQUFlO1FBQzlDLFFBQVEsQ0FBQyw2QkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0gsY0FBQztBQUFELENBQUMsQUF2T0QsSUF1T0M7QUF2T1ksMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0VxdWFsLCBvbWl0LCBjb21wYWN0LCBmbGF0dGVuLCB6aXAsIGZpbGwsIGdldCwgc2V0V2l0aCwgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgU3BlY1R5cGUsIEFueVNwZWMgfSBmcm9tICdwcmV0dXIuc3BlYyc7XHJcbmltcG9ydCB7IFJlZHVjaWJsZSwgQWN0aW9uLCBEaXNwYXRjaCB9IGZyb20gJ3JlZHVjaWJsZS1ub2RlJztcclxuaW1wb3J0IHsgUXVlcnksIFN1YlF1ZXJ5LCBGaWx0ZXIsIE9yZGVyaW5nIH0gZnJvbSAncHJldHVyLnN5bmMnO1xyXG5pbXBvcnQge1xyXG4gIENMQVlfUkVGUkVTSCxcclxuICBDTEFZX1NFVF9RVUVSWV9BVFRSSUJVVEVTLFxyXG4gIENMQVlfU0VUX1FVRVJZX0ZJTFRFUlMsXHJcbiAgQ0xBWV9TRVRfUVVFUllfUEFHSU5BVElPTixcclxuICBDTEFZX1NFVF9RVUVSWV9PUkRFUixcclxuICBDTEFZX1NFVF9RVUVSWV9FWFRSQSxcclxuICBDTEFZX1NFVF9RVUVSSUVJUl9DT1VOVCxcclxuICBDTEFZX1JFU0VUX1FVRVJJRUlSLFxyXG59IGZyb20gJy4vYWN0aW9ucyc7XHJcblxyXG5mdW5jdGlvbiBpc1BhdGgocGF0aD86IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF0aCkgJiYgcGF0aC5sZW5ndGggPiAwO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsdGVycyhxdWVyeTogUXVlcnk8YW55PiwgcGF0aD86IHN0cmluZ1tdKTogRmlsdGVyPGFueT4ge1xyXG4gIGNvbnN0IHRhcmdldCA9IGlzUGF0aChwYXRoKSA/IGdldEluY2x1ZGUocXVlcnksIHBhdGgpIDogcXVlcnk7XHJcbiAgaWYgKCF0YXJnZXQgfHwgIXRhcmdldC5maWx0ZXJzKSB7XHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGFyZ2V0LmZpbHRlcnM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmNsdWRlKHF1ZXJ5OiBRdWVyeTxhbnk+LCBwYXRoPzogc3RyaW5nW10pOiBTdWJRdWVyeTxhbnk+IHwgdW5kZWZpbmVkIHtcclxuICBpZiAoIWlzUGF0aChwYXRoKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaW5jbHVkZSA9IGdldChxdWVyeSwgZmxhdHRlbih6aXAoZmlsbChjb21wYWN0KHBhdGgpLCAnaW5jbHVkZScpLCBjb21wYWN0KHBhdGgpKSkpO1xyXG5cclxuICBpZiAoaW5jbHVkZSA9PT0gdHJ1ZSkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuXHJcbiAgaWYgKCFpbmNsdWRlKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaW5jbHVkZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEluY2x1ZGU8VCBleHRlbmRzIFNwZWNUeXBlLCBTIGV4dGVuZHMgU3BlY1R5cGUgPSBTcGVjVHlwZT4oXHJcbiAgcXVlcnk6IFF1ZXJ5PFQ+LFxyXG4gIGluY2x1ZGU6IFN1YlF1ZXJ5PFM+LFxyXG4gIHBhdGg/OiBzdHJpbmdbXSxcclxuKTogdm9pZCB7XHJcbiAgaWYgKGlzUGF0aChwYXRoKSkge1xyXG4gICAgc2V0V2l0aChxdWVyeSwgZmxhdHRlbih6aXAoZmlsbChjb21wYWN0KHBhdGgpLCAnaW5jbHVkZScpLCBjb21wYWN0KHBhdGgpKSksIGluY2x1ZGUsIE9iamVjdCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUXVlcmllcjxUIGV4dGVuZHMgU3BlY1R5cGU+IGltcGxlbWVudHMgUmVkdWNpYmxlPFF1ZXJpZXI8VD4+IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3ltYm9sO1xyXG4gIHB1YmxpYyByZWFkb25seSBjb3VudD86IG51bWJlcjtcclxuICBwdWJsaWMgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgbW9kZWw6IFRbJ25hbWUnXTtcclxuICBwdWJsaWMgcmVhZG9ubHkgcXVlcnk6IFF1ZXJ5PFQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHNjb3BlOiBzdHJpbmcsIG1vZGVsOiBUWyduYW1lJ10sIHF1ZXJ5OiBRdWVyeTxUPiwgY291bnQ/OiBudW1iZXIsIGlkZW50aWZpZXI/OiBzeW1ib2wsXHJcbiAgKSB7XHJcbiAgICB0aGlzLmlkZW50aWZpZXIgPSB0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3N5bWJvbCcgPyBpZGVudGlmaWVyIDogU3ltYm9sKCk7XHJcbiAgICB0aGlzLmNvdW50ID0gY291bnQ7XHJcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XHJcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XHJcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVkdWNlKGFjdGlvbjogQWN0aW9uPGFueT4pOiB0aGlzIHtcclxuICAgIGlmIChDTEFZX1NFVF9RVUVSWV9BVFRSSUJVVEVTLmlzKHRoaXMuaWRlbnRpZmllciwgYWN0aW9uKSkge1xyXG4gICAgICBpZiAoaXNFcXVhbCh0aGlzLnF1ZXJ5LmF0dHJpYnV0ZXMsIGFjdGlvbi5wYXlsb2FkKSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuZXdRdWVyeSA9IG9taXQodGhpcy5xdWVyeSwgJ2F0dHJpYnV0ZXMnKTtcclxuXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFjdGlvbi5wYXlsb2FkKSkge1xyXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSA8KGtleW9mIFRbJ2ZpZWxkcyddKVtdPmNvbXBhY3QoYWN0aW9uLnBheWxvYWQpO1xyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIG5ld1F1ZXJ5LmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5ld1F1ZXJ5LnBhZ2luYXRpb24pIHtcclxuICAgICAgICBuZXdRdWVyeS5wYWdpbmF0aW9uID0geyBza2lwOiAwLCB0YWtlOiBuZXdRdWVyeS5wYWdpbmF0aW9uLnRha2UgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDx0aGlzPm5ldyBRdWVyaWVyKHRoaXMuc2NvcGUsIHRoaXMubW9kZWwsIG5ld1F1ZXJ5LCB0aGlzLmNvdW50LCB0aGlzLmlkZW50aWZpZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDTEFZX1NFVF9RVUVSWV9GSUxURVJTLmlzKHRoaXMuaWRlbnRpZmllciwgYWN0aW9uKSkge1xyXG4gICAgICBpZiAoIWFjdGlvbi5wYXlsb2FkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgcGF0aCwgZmlsdGVycyB9ID0gYWN0aW9uLnBheWxvYWQ7XHJcblxyXG4gICAgICBjb25zdCB0YXJnZXQgPSBpc1BhdGgocGF0aCkgPyBnZXRJbmNsdWRlKHRoaXMucXVlcnksIHBhdGgpIDogdGhpcy5xdWVyeTtcclxuXHJcbiAgICAgIGlmICh0YXJnZXQgJiYgaXNFcXVhbCh0YXJnZXQuZmlsdGVycywgZmlsdGVycykpIHtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG5ld1F1ZXJ5OiBRdWVyeTxUPjtcclxuXHJcbiAgICAgIGlmIChpc1BhdGgocGF0aCkpIHtcclxuICAgICAgICBjb25zdCBpbmNsdWRlID0gb21pdChnZXRJbmNsdWRlKHRoaXMucXVlcnksIHBhdGgpLCAnZmlsdGVycycpO1xyXG4gICAgICAgIGlmIChmaWx0ZXJzKSB7XHJcbiAgICAgICAgICBpbmNsdWRlLmZpbHRlcnMgPSBmaWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXdRdWVyeSA9IGNsb25lRGVlcCh0aGlzLnF1ZXJ5KTtcclxuICAgICAgICBzZXRJbmNsdWRlPEFueVNwZWM+KG5ld1F1ZXJ5LCA8YW55PmluY2x1ZGUsIHBhdGgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5ld1F1ZXJ5ID0gb21pdCh0aGlzLnF1ZXJ5LCAnZmlsdGVycycpO1xyXG4gICAgICAgIGlmIChmaWx0ZXJzKSB7XHJcbiAgICAgICAgICBuZXdRdWVyeS5maWx0ZXJzID0gPEZpbHRlcjxUPj5maWx0ZXJzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5ld1F1ZXJ5LnBhZ2luYXRpb24pIHtcclxuICAgICAgICBuZXdRdWVyeS5wYWdpbmF0aW9uID0geyBza2lwOiAwLCB0YWtlOiBuZXdRdWVyeS5wYWdpbmF0aW9uLnRha2UgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDx0aGlzPm5ldyBRdWVyaWVyKHRoaXMuc2NvcGUsIHRoaXMubW9kZWwsIG5ld1F1ZXJ5LCB0aGlzLmNvdW50LCB0aGlzLmlkZW50aWZpZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDTEFZX1NFVF9RVUVSWV9QQUdJTkFUSU9OLmlzKHRoaXMuaWRlbnRpZmllciwgYWN0aW9uKSkge1xyXG4gICAgICBpZiAoaXNFcXVhbCh0aGlzLnF1ZXJ5LnBhZ2luYXRpb24sIGFjdGlvbi5wYXlsb2FkKSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuZXdRdWVyeSA9IG9taXQodGhpcy5xdWVyeSwgJ3BhZ2luYXRpb24nKTtcclxuXHJcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZCkge1xyXG4gICAgICAgIG5ld1F1ZXJ5LnBhZ2luYXRpb24gPSBhY3Rpb24ucGF5bG9hZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDx0aGlzPm5ldyBRdWVyaWVyKHRoaXMuc2NvcGUsIHRoaXMubW9kZWwsIG5ld1F1ZXJ5LCB0aGlzLmNvdW50LCB0aGlzLmlkZW50aWZpZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDTEFZX1NFVF9RVUVSWV9PUkRFUi5pcyh0aGlzLmlkZW50aWZpZXIsIGFjdGlvbikpIHtcclxuICAgICAgaWYgKGlzRXF1YWwodGhpcy5xdWVyeS5vcmRlciwgYWN0aW9uLnBheWxvYWQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5ld1F1ZXJ5ID0gb21pdCh0aGlzLnF1ZXJ5LCAnb3JkZXInKTtcclxuXHJcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZCkge1xyXG4gICAgICAgIG5ld1F1ZXJ5Lm9yZGVyID0gYWN0aW9uLnBheWxvYWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZXdRdWVyeS5wYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgbmV3UXVlcnkucGFnaW5hdGlvbiA9IHsgc2tpcDogMCwgdGFrZTogbmV3UXVlcnkucGFnaW5hdGlvbi50YWtlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiA8dGhpcz5uZXcgUXVlcmllcih0aGlzLnNjb3BlLCB0aGlzLm1vZGVsLCBuZXdRdWVyeSwgdGhpcy5jb3VudCwgdGhpcy5pZGVudGlmaWVyKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQ0xBWV9TRVRfUVVFUllfRVhUUkEuaXModGhpcy5pZGVudGlmaWVyLCBhY3Rpb24pKSB7XHJcbiAgICAgIGlmICghYWN0aW9uLnBheWxvYWQgfHwgaXNFcXVhbCh0aGlzLnF1ZXJ5LmV4dHJhLCBhY3Rpb24ucGF5bG9hZC5leHRyYSkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbmV3UXVlcnkgPSB7IC4uLnRoaXMucXVlcnksIGV4dHJhOiBhY3Rpb24ucGF5bG9hZC5leHRyYSB9O1xyXG5cclxuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnJlc2V0UGFnaW5hdGlvbiAmJiBuZXdRdWVyeS5wYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgbmV3UXVlcnkucGFnaW5hdGlvbiA9IHsgc2tpcDogMCwgdGFrZTogbmV3UXVlcnkucGFnaW5hdGlvbi50YWtlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiA8dGhpcz5uZXcgUXVlcmllcih0aGlzLnNjb3BlLCB0aGlzLm1vZGVsLCBuZXdRdWVyeSwgdGhpcy5jb3VudCwgdGhpcy5pZGVudGlmaWVyKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQ0xBWV9TRVRfUVVFUklFSVJfQ09VTlQuaXModGhpcy5pZGVudGlmaWVyLCBhY3Rpb24pKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvdW50ID09PSBhY3Rpb24ucGF5bG9hZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gPHRoaXM+bmV3IFF1ZXJpZXIodGhpcy5zY29wZSwgdGhpcy5tb2RlbCwgdGhpcy5xdWVyeSwgYWN0aW9uLnBheWxvYWQsIHRoaXMuaWRlbnRpZmllcik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKENMQVlfUkVTRVRfUVVFUklFSVIuaXModGhpcy5pZGVudGlmaWVyLCBhY3Rpb24pKSB7XHJcbiAgICAgIGlmICghYWN0aW9uLnBheWxvYWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDx0aGlzPm5ldyBRdWVyaWVyKHRoaXMuc2NvcGUsIHRoaXMubW9kZWwsIGFjdGlvbi5wYXlsb2FkLCB1bmRlZmluZWQsIHRoaXMuaWRlbnRpZmllcik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKENMQVlfUkVGUkVTSC5pcyh0aGlzLmlkZW50aWZpZXIsIGFjdGlvbikpIHtcclxuICAgICAgaWYgKCFhY3Rpb24ucGF5bG9hZCB8fCB0aGlzLmNvdW50ID09PSBhY3Rpb24ucGF5bG9hZC5jb3VudCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gPHRoaXM+bmV3IFF1ZXJpZXIoXHJcbiAgICAgICAgdGhpcy5zY29wZSwgdGhpcy5tb2RlbCwgdGhpcy5xdWVyeSwgYWN0aW9uLnBheWxvYWQuY291bnQsIHRoaXMuaWRlbnRpZmllcixcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGVzKGRpc3BhdGNoOiBEaXNwYXRjaCwgYXR0cmlidXRlcz86IChrZXlvZiBUWydmaWVsZHMnXSlbXSk6IHZvaWQge1xyXG4gICAgZGlzcGF0Y2goQ0xBWV9TRVRfUVVFUllfQVRUUklCVVRFUy5jcmVhdGUudW5pY2FzdCh0aGlzLmlkZW50aWZpZXIsIGF0dHJpYnV0ZXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldEZpbHRlcnMoXHJcbiAgICBkaXNwYXRjaDogRGlzcGF0Y2gsXHJcbiAgICBmaWx0ZXJzPzogRmlsdGVyPFQ+LFxyXG4gICAgcGF0aD86IHN0cmluZ1tdLFxyXG4gICk6IHZvaWQge1xyXG4gICAgZGlzcGF0Y2goQ0xBWV9TRVRfUVVFUllfRklMVEVSUy5jcmVhdGUudW5pY2FzdCh0aGlzLmlkZW50aWZpZXIsIHsgZmlsdGVycywgcGF0aCB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RmlsdGVyKFxyXG4gICAgZGlzcGF0Y2g6IERpc3BhdGNoLFxyXG4gICAgZmllbGQ6IGtleW9mIFRbJ2ZpZWxkcyddLFxyXG4gICAgZmlsdGVyOiBhbnksXHJcbiAgICBwYXRoPzogc3RyaW5nW10sXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBpc1BhdGgocGF0aCkgPyBnZXRJbmNsdWRlKHRoaXMucXVlcnksIHBhdGgpIDogdGhpcy5xdWVyeTtcclxuICAgIGNvbnN0IGZpbHRlcnM6IGFueSA9IHRhcmdldCA/IHsgLi4udGFyZ2V0LmZpbHRlcnMgfSA6IHt9O1xyXG5cclxuICAgIGZpbHRlcnNbZmllbGRdID0gZmlsdGVyO1xyXG5cclxuICAgIGRpc3BhdGNoKENMQVlfU0VUX1FVRVJZX0ZJTFRFUlMuY3JlYXRlLnVuaWNhc3QodGhpcy5pZGVudGlmaWVyLCB7IGZpbHRlcnMsIHBhdGggfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRmlsdGVyKGRpc3BhdGNoOiBEaXNwYXRjaCwgZmllbGQ6IGtleW9mIFRbJ2ZpZWxkcyddLCBwYXRoPzogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGlzUGF0aChwYXRoKSA/IGdldEluY2x1ZGUodGhpcy5xdWVyeSwgcGF0aCkgOiB0aGlzLnF1ZXJ5O1xyXG5cclxuICAgIGlmICghdGFyZ2V0IHx8ICF0YXJnZXQuZmlsdGVycykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmlsdGVycyA9IG9taXQodGFyZ2V0LmZpbHRlcnMsIGZpZWxkKTtcclxuXHJcbiAgICBkaXNwYXRjaChDTEFZX1NFVF9RVUVSWV9GSUxURVJTLmNyZWF0ZS51bmljYXN0KHRoaXMuaWRlbnRpZmllciwgeyBmaWx0ZXJzLCBwYXRoIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRQYWdpbmF0aW9uKGRpc3BhdGNoOiBEaXNwYXRjaCwgc2tpcCA9IDAsIHRha2UgPSAwKTogdm9pZCB7XHJcbiAgICBkaXNwYXRjaChDTEFZX1NFVF9RVUVSWV9QQUdJTkFUSU9OLmNyZWF0ZS51bmljYXN0KHRoaXMuaWRlbnRpZmllciwgeyBza2lwLCB0YWtlIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRPcmRlcihkaXNwYXRjaDogRGlzcGF0Y2gsIGZpZWxkOiBzdHJpbmcsIG9yZGVyaW5nPzogT3JkZXJpbmcsIGNoYWluPzogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGxldCB0YXJnZXRPcmRlcmluZzogT3JkZXJpbmcgfCB1bmRlZmluZWQgPSBvcmRlcmluZztcclxuXHJcbiAgICBpZiAodHlwZW9mIHRhcmdldE9yZGVyaW5nICE9PSAnc3RyaW5nJykge1xyXG4gICAgICBpZiAoIXRoaXMucXVlcnkub3JkZXIgfHwgdGhpcy5xdWVyeS5vcmRlci5maWVsZCAhPT0gZmllbGQpIHtcclxuICAgICAgICB0YXJnZXRPcmRlcmluZyA9ICdBU0MnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5xdWVyeS5vcmRlci5vcmRlcmluZykge1xyXG4gICAgICAgICAgY2FzZSAnTk9ORSc6XHJcbiAgICAgICAgICAgIHRhcmdldE9yZGVyaW5nID0gJ0FTQyc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnQVNDJzpcclxuICAgICAgICAgICAgdGFyZ2V0T3JkZXJpbmcgPSAnREVTQyc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgdGFyZ2V0T3JkZXJpbmcgPSAnTk9ORSc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc3BhdGNoKENMQVlfU0VUX1FVRVJZX09SREVSLmNyZWF0ZS51bmljYXN0KHRoaXMuaWRlbnRpZmllciwge1xyXG4gICAgICBjaGFpbixcclxuICAgICAgZmllbGQsXHJcbiAgICAgIG9yZGVyaW5nOiB0YXJnZXRPcmRlcmluZyxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRFeHRyYShkaXNwYXRjaDogRGlzcGF0Y2gsIGV4dHJhPzogYW55LCByZXNldFBhZ2luYXRpb24gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgZGlzcGF0Y2goQ0xBWV9TRVRfUVVFUllfRVhUUkEuY3JlYXRlLnVuaWNhc3QodGhpcy5pZGVudGlmaWVyLCB7IGV4dHJhLCByZXNldFBhZ2luYXRpb24gfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENvdW50KGRpc3BhdGNoOiBEaXNwYXRjaCwgY291bnQ/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGRpc3BhdGNoKENMQVlfU0VUX1FVRVJJRUlSX0NPVU5ULmNyZWF0ZS51bmljYXN0KHRoaXMuaWRlbnRpZmllciwgY291bnQpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldChkaXNwYXRjaDogRGlzcGF0Y2gsIHF1ZXJ5OiBRdWVyeTxUPik6IHZvaWQge1xyXG4gICAgZGlzcGF0Y2goQ0xBWV9SRVNFVF9RVUVSSUVJUi5jcmVhdGUudW5pY2FzdCh0aGlzLmlkZW50aWZpZXIsIHF1ZXJ5KSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==