@orbit/record-cache
Version:
Orbit base classes used to access and maintain a set of records.
211 lines • 29.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsyncQueryOperators = void 0;
const data_1 = require("@orbit/data");
const records_1 = require("@orbit/records");
const utils_1 = require("@orbit/utils");
exports.AsyncQueryOperators = {
async findRecord(cache, expression, options) {
const { record } = expression;
const currentRecord = await cache.getRecordAsync(record);
if (!currentRecord) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
}
return currentRecord;
},
async findRecords(cache, expression,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
options) {
const exp = expression;
let results = await cache.getRecordsAsync(exp.records || exp.type);
if (exp.filter) {
results = filterRecords(results, exp.filter);
}
if (exp.sort) {
results = sortRecords(results, exp.sort);
}
if (exp.page) {
results = paginateRecords(results, exp.page);
}
return results;
},
async findRelatedRecords(cache, expression, options) {
const exp = expression;
const { record, relationship } = exp;
const relatedIds = await cache.getRelatedRecordsAsync(record, relationship);
if (!relatedIds || relatedIds.length === 0) {
if (!(await cache.getRecordAsync(record))) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
else {
return undefined;
}
}
return [];
}
let results = await cache.getRecordsAsync(relatedIds);
if (exp.filter) {
results = filterRecords(results, exp.filter);
}
if (exp.sort) {
results = sortRecords(results, exp.sort);
}
if (exp.page) {
results = paginateRecords(results, exp.page);
}
return results;
},
async findRelatedRecord(cache, expression, options) {
const exp = expression;
const { record, relationship } = exp;
const relatedId = await cache.getRelatedRecordAsync(record, relationship);
if (relatedId) {
return (await cache.getRecordAsync(relatedId)) || null;
}
else {
if (!(await cache.getRecordAsync(record))) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
else {
return undefined;
}
}
return null;
}
}
};
function filterRecords(records, filters) {
return records.filter((record) => {
for (let i = 0, l = filters.length; i < l; i++) {
if (!applyFilter(record, filters[i])) {
return false;
}
}
return true;
});
}
function applyFilter(record, filter) {
if (filter.kind === 'attribute') {
let actual = (0, utils_1.deepGet)(record, ['attributes', filter.attribute]);
if (actual === undefined) {
return false;
}
let expected = filter.value;
switch (filter.op) {
case 'equal':
return actual === expected;
case 'gt':
return actual > expected;
case 'gte':
return actual >= expected;
case 'lt':
return actual < expected;
case 'lte':
return actual <= expected;
default:
throw new data_1.QueryExpressionParseError('Filter operation ${filter.op} not recognized for Store.');
}
}
else if (filter.kind === 'relatedRecords') {
let actual = (0, utils_1.deepGet)(record, [
'relationships',
filter.relation,
'data'
]);
if (actual === undefined) {
return false;
}
let expected = filter.records;
switch (filter.op) {
case 'equal':
return (actual.length === expected.length &&
expected.every((e) => actual.some((a) => a.id === e.id && a.type === e.type)));
case 'all':
return expected.every((e) => actual.some((a) => a.id === e.id && a.type === e.type));
case 'some':
return expected.some((e) => actual.some((a) => a.id === e.id && a.type === e.type));
case 'none':
return !expected.some((e) => actual.some((a) => a.id === e.id && a.type === e.type));
default:
throw new data_1.QueryExpressionParseError('Filter operation ${filter.op} not recognized for Store.');
}
}
else if (filter.kind === 'relatedRecord') {
let actual = (0, utils_1.deepGet)(record, ['relationships', filter.relation, 'data']);
if (actual === undefined) {
return false;
}
let expected = filter.record;
switch (filter.op) {
case 'equal':
if (actual === null) {
return expected === null;
}
else {
if (Array.isArray(expected)) {
return expected.some((e) => actual.type === e.type && actual.id === e.id);
}
else if (expected) {
return actual.type === expected.type && actual.id === expected.id;
}
else {
return false;
}
}
default:
throw new data_1.QueryExpressionParseError('Filter operation ${filter.op} not recognized for Store.');
}
}
return false;
}
function sortRecords(records, sortSpecifiers) {
const comparisonValues = new Map();
records.forEach((record) => {
comparisonValues.set(record, sortSpecifiers.map((sortSpecifier) => {
if (sortSpecifier.kind === 'attribute') {
return (0, utils_1.deepGet)(record, [
'attributes',
sortSpecifier.attribute
]);
}
else {
throw new data_1.QueryExpressionParseError('Sort specifier ${sortSpecifier.kind} not recognized for Store.');
}
}));
});
const comparisonOrders = sortSpecifiers.map((sortExpression) => sortExpression.order === 'descending' ? -1 : 1);
return records.sort((record1, record2) => {
const values1 = comparisonValues.get(record1);
const values2 = comparisonValues.get(record2);
for (let i = 0; i < sortSpecifiers.length; i++) {
if (values1[i] < values2[i]) {
return -comparisonOrders[i];
}
else if (values1[i] > values2[i]) {
return comparisonOrders[i];
}
else if ((0, utils_1.isNone)(values1[i]) && !(0, utils_1.isNone)(values2[i])) {
return comparisonOrders[i];
}
else if ((0, utils_1.isNone)(values2[i]) && !(0, utils_1.isNone)(values1[i])) {
return -comparisonOrders[i];
}
}
return 0;
});
}
function paginateRecords(records, paginationOptions) {
if (paginationOptions.limit !== undefined) {
let offset = paginationOptions.offset === undefined ? 0 : paginationOptions.offset;
let limit = paginationOptions.limit;
return records.slice(offset, offset + limit);
}
else {
throw new data_1.QueryExpressionParseError('Pagination options not recognized for Store. Please specify `offset` and `limit`.');
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtcXVlcnktb3BlcmF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZXJhdG9ycy9hc3luYy1xdWVyeS1vcGVyYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0NBQXdFO0FBQ3hFLDRDQVl3QjtBQUN4Qix3Q0FBcUQ7QUFXeEMsUUFBQSxtQkFBbUIsR0FBNkI7SUFDM0QsS0FBSyxDQUFDLFVBQVUsQ0FDZCxLQUEwQixFQUMxQixVQUFpQyxFQUNqQyxPQUF3QjtRQUV4QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBd0IsQ0FBQztRQUM1QyxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekQsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixJQUFJLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSx1QkFBdUIsRUFBRTtnQkFDcEMsTUFBTSxJQUFJLGlDQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FDZixLQUEwQixFQUMxQixVQUFpQztJQUNqQyw2REFBNkQ7SUFDN0QsT0FBd0I7UUFFeEIsTUFBTSxHQUFHLEdBQUcsVUFBeUIsQ0FBQztRQUN0QyxJQUFJLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ2QsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ1osT0FBTyxHQUFH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QWlCLENBQUMsS0FBSyxDQUFDO1FBRXBDLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO0tBQzlDO1NBQU07UUFDTCxNQUFNLElBQUksZ0NBQXlCLENBQ2pDLG1GQUFtRixDQUNwRixDQUFDO0tBQ0g7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUXVlcnlFeHByZXNzaW9uUGFyc2VFcnJvciwgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdAb3JiaXQvZGF0YSc7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGVTb3J0U3BlY2lmaWVyLFxuICBGaW5kUmVjb3JkLFxuICBGaW5kUmVjb3JkcyxcbiAgRmluZFJlbGF0ZWRSZWNvcmQsXG4gIEZpbmRSZWxhdGVkUmVjb3JkcyxcbiAgSW5pdGlhbGl6ZWRSZWNvcmQsXG4gIFJlY29yZElkZW50aXR5LFxuICBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbixcbiAgUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICBSZWNvcmRRdWVyeUV4cHJlc3Npb25SZXN1bHQsXG4gIFNvcnRTcGVjaWZpZXJcbn0gZnJvbSAnQG9yYml0L3JlY29yZHMnO1xuaW1wb3J0IHsgZGVlcEdldCwgRGljdCwgaXNOb25lIH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IEFzeW5jUmVjb3JkQWNjZXNzb3IgfSBmcm9tICcuLi9yZWNvcmQtYWNjZXNzb3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jUXVlcnlPcGVyYXRvciB7XG4gIChcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBleHByZXNzaW9uOiBSZWNvcmRRdWVyeUV4cHJlc3Npb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkUXVlcnlFeHByZXNzaW9uUmVzdWx0Pjtcbn1cblxuZXhwb3J0IGNvbnN0IEFzeW5jUXVlcnlPcGVyYXRvcnM6IERpY3Q8QXN5bmNRdWVyeU9wZXJhdG9yPiA9IHtcbiAgYXN5bmMgZmluZFJlY29yZChcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBleHByZXNzaW9uOiBSZWNvcmRRdWVyeUV4cHJlc3Npb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkUXVlcnlFeHByZXNzaW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyByZWNvcmQgfSA9IGV4cHJlc3Npb24gYXMgRmluZFJlY29yZDtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKTtcblxuICAgIGlmICghY3VycmVudFJlY29yZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFJlY29yZDtcbiAgfSxcblxuICBhc3luYyBmaW5kUmVjb3JkcyhcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBleHByZXNzaW9uOiBSZWNvcmRRdWVyeUV4cHJlc3Npb24sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPEluaXRpYWxpemVkUmVjb3JkW10+IHtcbiAgICBjb25zdCBleHAgPSBleHByZXNzaW9uIGFzIEZpbmRSZWNvcmRzO1xuICAgIGxldCByZXN1bHRzID0gYXdhaXQgY2FjaGUuZ2V0UmVjb3Jkc0FzeW5jKGV4cC5yZWNvcmRzIHx8IGV4cC50eXBlKTtcbiAgICBpZiAoZXhwLmZpbHRlcikge1xuICAgICAgcmVzdWx0cyA9IGZpbHRlclJlY29yZHMocmVzdWx0cywgZXhwLmZpbHRlcik7XG4gICAgfVxuICAgIGlmIChleHAuc29ydCkge1xuICAgICAgcmVzdWx0cyA9IHNvcnRSZWNvcmRzKHJlc3VsdHMsIGV4cC5zb3J0KTtcbiAgICB9XG4gICAgaWYgKGV4cC5wYWdlKSB7XG4gICAgICByZXN1bHRzID0gcGFnaW5hdGVSZWNvcmRzKHJlc3VsdHMsIGV4cC5wYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH0sXG5cbiAgYXN5bmMgZmluZFJlbGF0ZWRSZWNvcmRzKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIGV4cHJlc3Npb246IFJlY29yZFF1ZXJ5RXhwcmVzc2lvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUHJvbWlzZTxJbml0aWFsaXplZFJlY29yZFtdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXhwID0gZXhwcmVzc2lvbiBhcyBGaW5kUmVsYXRlZFJlY29yZHM7XG4gICAgY29uc3QgeyByZWNvcmQsIHJlbGF0aW9uc2hpcCB9ID0gZXhwO1xuICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBjYWNoZS5nZXRSZWxhdGVkUmVjb3Jkc0FzeW5jKHJlY29yZCwgcmVsYXRpb25zaGlwKTtcbiAgICBpZiAoIXJlbGF0ZWRJZHMgfHwgcmVsYXRlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmICghKGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWNoZS5nZXRSZWNvcmRzQXN5bmMocmVsYXRlZElkcyk7XG5cbiAgICBpZiAoZXhwLmZpbHRlcikge1xuICAgICAgcmVzdWx0cyA9IGZpbHRlclJlY29yZHMocmVzdWx0cywgZXhwLmZpbHRlcik7XG4gICAgfVxuICAgIGlmIChleHAuc29ydCkge1xuICAgICAgcmVzdWx0cyA9IHNvcnRSZWNvcmRzKHJlc3VsdHMsIGV4cC5zb3J0KTtcbiAgICB9XG4gICAgaWYgKGV4cC5wYWdlKSB7XG4gICAgICByZXN1bHRzID0gcGFnaW5hdGVSZWNvcmRzKHJlc3VsdHMsIGV4cC5wYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH0sXG5cbiAgYXN5bmMgZmluZFJlbGF0ZWRSZWNvcmQoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgZXhwcmVzc2lvbjogUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPEluaXRpYWxpemVkUmVjb3JkIHwgbnVsbCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGV4cCA9IGV4cHJlc3Npb24gYXMgRmluZFJlbGF0ZWRSZWNvcmQ7XG4gICAgY29uc3QgeyByZWNvcmQsIHJlbGF0aW9uc2hpcCB9ID0gZXhwO1xuICAgIGNvbnN0IHJlbGF0ZWRJZCA9IGF3YWl0IGNhY2hlLmdldFJlbGF0ZWRSZWNvcmRBc3luYyhyZWNvcmQsIHJlbGF0aW9uc2hpcCk7XG5cbiAgICBpZiAocmVsYXRlZElkKSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlbGF0ZWRJZCkpIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gZmlsdGVyUmVjb3JkcyhyZWNvcmRzOiBJbml0aWFsaXplZFJlY29yZFtdLCBmaWx0ZXJzOiBhbnlbXSkge1xuICByZXR1cm4gcmVjb3Jkcy5maWx0ZXIoKHJlY29yZCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICghYXBwbHlGaWx0ZXIocmVjb3JkLCBmaWx0ZXJzW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlGaWx0ZXIocmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCwgZmlsdGVyOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKGZpbHRlci5raW5kID09PSAnYXR0cmlidXRlJykge1xuICAgIGxldCBhY3R1YWwgPSBkZWVwR2V0KHJlY29yZCwgWydhdHRyaWJ1dGVzJywgZmlsdGVyLmF0dHJpYnV0ZV0pO1xuICAgIGlmIChhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgZXhwZWN0ZWQgPSBmaWx0ZXIudmFsdWU7XG4gICAgc3dpdGNoIChmaWx0ZXIub3ApIHtcbiAgICAgIGNhc2UgJ2VxdWFsJzpcbiAgICAgICAgcmV0dXJuIGFjdHVhbCA9PT0gZXhwZWN0ZWQ7XG4gICAgICBjYXNlICdndCc6XG4gICAgICAgIHJldHVybiBhY3R1YWwgPiBleHBlY3RlZDtcbiAgICAgIGNhc2UgJ2d0ZSc6XG4gICAgICAgIHJldHVybiBhY3R1YWwgPj0gZXhwZWN0ZWQ7XG4gICAgICBjYXNlICdsdCc6XG4gICAgICAgIHJldHVybiBhY3R1YWwgPCBleHBlY3RlZDtcbiAgICAgIGNhc2UgJ2x0ZSc6XG4gICAgICAgIHJldHVybiBhY3R1YWwgPD0gZXhwZWN0ZWQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFeHByZXNzaW9uUGFyc2VFcnJvcihcbiAgICAgICAgICAnRmlsdGVyIG9wZXJhdGlvbiAke2ZpbHRlci5vcH0gbm90IHJlY29nbml6ZWQgZm9yIFN0b3JlLidcbiAgICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZmlsdGVyLmtpbmQgPT09ICdyZWxhdGVkUmVjb3JkcycpIHtcbiAgICBsZXQgYWN0dWFsOiBSZWNvcmRJZGVudGl0eVtdID0gZGVlcEdldChyZWNvcmQsIFtcbiAgICAgICdyZWxhdGlvbnNoaXBzJyxcbiAgICAgIGZpbHRlci5yZWxhdGlvbixcbiAgICAgICdkYXRhJ1xuICAgIF0pO1xuICAgIGlmIChhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgZXhwZWN0ZWQ6IFJlY29yZElkZW50aXR5W10gPSBmaWx0ZXIucmVjb3JkcztcbiAgICBzd2l0Y2ggKGZpbHRlci5vcCkge1xuICAgICAgY2FzZSAnZXF1YWwnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGFjdHVhbC5sZW5ndGggPT09IGV4cGVjdGVkLmxlbmd0aCAmJlxuICAgICAgICAgIGV4cGVjdGVkLmV2ZXJ5KChlKSA9PlxuICAgICAgICAgICAgYWN0dWFsLnNvbWUoKGEpID0+IGEuaWQgPT09IGUuaWQgJiYgYS50eXBlID09PSBlLnR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkLmV2ZXJ5KChlKSA9PlxuICAgICAgICAgIGFjdHVhbC5zb21lKChhKSA9PiBhLmlkID09PSBlLmlkICYmIGEudHlwZSA9PT0gZS50eXBlKVxuICAgICAgICApO1xuICAgICAgY2FzZSAnc29tZSc6XG4gICAgICAgIHJldHVybiBleHBlY3RlZC5zb21lKChlKSA9PlxuICAgICAgICAgIGFjdHVhbC5zb21lKChhKSA9PiBhLmlkID09PSBlLmlkICYmIGEudHlwZSA9PT0gZS50eXBlKVxuICAgICAgICApO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVybiAhZXhwZWN0ZWQuc29tZSgoZSkgPT5cbiAgICAgICAgICBhY3R1YWwuc29tZSgoYSkgPT4gYS5pZCA9PT0gZS5pZCAmJiBhLnR5cGUgPT09IGUudHlwZSlcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBRdWVyeUV4cHJlc3Npb25QYXJzZUVycm9yKFxuICAgICAgICAgICdGaWx0ZXIgb3BlcmF0aW9uICR7ZmlsdGVyLm9wfSBub3QgcmVjb2duaXplZCBmb3IgU3RvcmUuJ1xuICAgICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmaWx0ZXIua2luZCA9PT0gJ3JlbGF0ZWRSZWNvcmQnKSB7XG4gICAgbGV0IGFjdHVhbCA9IGRlZXBHZXQocmVjb3JkLCBbJ3JlbGF0aW9uc2hpcHMnLCBmaWx0ZXIucmVsYXRpb24sICdkYXRhJ10pO1xuICAgIGlmIChhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgZXhwZWN0ZWQgPSBmaWx0ZXIucmVjb3JkO1xuICAgIHN3aXRjaCAoZmlsdGVyLm9wKSB7XG4gICAgICBjYXNlICdlcXVhbCc6XG4gICAgICAgIGlmIChhY3R1YWwgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQuc29tZShcbiAgICAgICAgICAgICAgKGUpID0+IGFjdHVhbC50eXBlID09PSBlLnR5cGUgJiYgYWN0dWFsLmlkID09PSBlLmlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhY3R1YWwudHlwZSA9PT0gZXhwZWN0ZWQudHlwZSAmJiBhY3R1YWwuaWQgPT09IGV4cGVjdGVkLmlkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFeHByZXNzaW9uUGFyc2VFcnJvcihcbiAgICAgICAgICAnRmlsdGVyIG9wZXJhdGlvbiAke2ZpbHRlci5vcH0gbm90IHJlY29nbml6ZWQgZm9yIFN0b3JlLidcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzb3J0UmVjb3JkcyhcbiAgcmVjb3JkczogSW5pdGlhbGl6ZWRSZWNvcmRbXSxcbiAgc29ydFNwZWNpZmllcnM6IFNvcnRTcGVjaWZpZXJbXVxuKTogSW5pdGlhbGl6ZWRSZWNvcmRbXSB7XG4gIGNvbnN0IGNvbXBhcmlzb25WYWx1ZXMgPSBuZXcgTWFwKCk7XG5cbiAgcmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQpID0+IHtcbiAgICBjb21wYXJpc29uVmFsdWVzLnNldChcbiAgICAgIHJlY29yZCxcbiAgICAgIHNvcnRTcGVjaWZpZXJzLm1hcCgoc29ydFNwZWNpZmllcikgPT4ge1xuICAgICAgICBpZiAoc29ydFNwZWNpZmllci5raW5kID09PSAnYXR0cmlidXRlJykge1xuICAgICAgICAgIHJldHVybiBkZWVwR2V0KHJlY29yZCwgW1xuICAgICAgICAgICAgJ2F0dHJpYnV0ZXMnLFxuICAgICAgICAgICAgKHNvcnRTcGVjaWZpZXIgYXMgQXR0cmlidXRlU29ydFNwZWNpZmllcikuYXR0cmlidXRlXG4gICAgICAgICAgXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXhwcmVzc2lvblBhcnNlRXJyb3IoXG4gICAgICAgICAgICAnU29ydCBzcGVjaWZpZXIgJHtzb3J0U3BlY2lmaWVyLmtpbmR9IG5vdCByZWNvZ25pemVkIGZvciBTdG9yZS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcblxuICBjb25zdCBjb21wYXJpc29uT3JkZXJzID0gc29ydFNwZWNpZmllcnMubWFwKChzb3J0RXhwcmVzc2lvbikgPT5cbiAgICBzb3J0RXhwcmVzc2lvbi5vcmRlciA9PT0gJ2Rlc2NlbmRpbmcnID8gLTEgOiAxXG4gICk7XG5cbiAgcmV0dXJuIHJlY29yZHMuc29ydCgocmVjb3JkMSwgcmVjb3JkMikgPT4ge1xuICAgIGNvbnN0IHZhbHVlczEgPSBjb21wYXJpc29uVmFsdWVzLmdldChyZWNvcmQxKTtcbiAgICBjb25zdCB2YWx1ZXMyID0gY29tcGFyaXNvblZhbHVlcy5nZXQocmVjb3JkMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0U3BlY2lmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlczFbaV0gPCB2YWx1ZXMyW2ldKSB7XG4gICAgICAgIHJldHVybiAtY29tcGFyaXNvbk9yZGVyc1tpXTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWVzMVtpXSA+IHZhbHVlczJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25PcmRlcnNbaV07XG4gICAgICB9IGVsc2UgaWYgKGlzTm9uZSh2YWx1ZXMxW2ldKSAmJiAhaXNOb25lKHZhbHVlczJbaV0pKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJpc29uT3JkZXJzW2ldO1xuICAgICAgfSBlbHNlIGlmIChpc05vbmUodmFsdWVzMltpXSkgJiYgIWlzTm9uZSh2YWx1ZXMxW2ldKSkge1xuICAgICAgICByZXR1cm4gLWNvbXBhcmlzb25PcmRlcnNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFnaW5hdGVSZWNvcmRzKFxuICByZWNvcmRzOiBJbml0aWFsaXplZFJlY29yZFtdLFxuICBwYWdpbmF0aW9uT3B0aW9uczogYW55XG4pOiBJbml0aWFsaXplZFJlY29yZFtdIHtcbiAgaWYgKHBhZ2luYXRpb25PcHRpb25zLmxpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb2Zmc2V0ID1cbiAgICAgIHBhZ2luYXRpb25PcHRpb25zLm9mZnNldCA9PT0gdW5kZWZpbmVkID8gMCA6IHBhZ2luYXRpb25PcHRpb25zLm9mZnNldDtcbiAgICBsZXQgbGltaXQgPSBwYWdpbmF0aW9uT3B0aW9ucy5saW1pdDtcblxuICAgIHJldHVybiByZWNvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGltaXQpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBRdWVyeUV4cHJlc3Npb25QYXJzZUVycm9yKFxuICAgICAgJ1BhZ2luYXRpb24gb3B0aW9ucyBub3QgcmVjb2duaXplZCBmb3IgU3RvcmUuIFBsZWFzZSBzcGVjaWZ5IGBvZmZzZXRgIGFuZCBgbGltaXRgLidcbiAgICApO1xuICB9XG59XG4iXX0=