UNPKG

@orbit/record-cache

Version:

Orbit base classes used to access and maintain a set of records.

246 lines 34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AsyncInverseTransformOperators = void 0; const records_1 = require("@orbit/records"); const utils_1 = require("@orbit/utils"); exports.AsyncInverseTransformOperators = { async addRecord(cache, operation, // eslint-disable-next-line @typescript-eslint/no-unused-vars options) { const op = operation; const { type, id } = op.record; const current = await cache.getRecordAsync(op.record); if (current) { if ((0, utils_1.eq)(current, op.record)) { return; } else { return { op: 'updateRecord', record: current }; } } else { return { op: 'removeRecord', record: { type, id } }; } }, async updateRecord(cache, operation, options) { const op = operation; const currentRecord = await cache.getRecordAsync(op.record); const replacement = op.record; const { type, id } = replacement; if (currentRecord) { let result = { type, id }; let changed = false; ['attributes', 'keys'].forEach((grouping) => { if (replacement[grouping]) { Object.keys(replacement[grouping]).forEach((field) => { let value = replacement[grouping][field]; let currentValue = (0, utils_1.deepGet)(currentRecord, [grouping, field]); if (!(0, utils_1.eq)(value, currentValue)) { changed = true; (0, utils_1.deepSet)(result, [grouping, field], currentValue === undefined ? null : currentValue); } }); } }); if (replacement.relationships) { Object.keys(replacement.relationships).forEach((field) => { let data = (0, utils_1.deepGet)(replacement, ['relationships', field, 'data']); if (data !== undefined) { let currentData = (0, utils_1.deepGet)(currentRecord, [ 'relationships', field, 'data' ]); let relationshipChanged; if (Array.isArray(data)) { if (currentData) { relationshipChanged = !(0, records_1.equalRecordIdentitySets)(currentData, data); } else { relationshipChanged = true; currentData = []; } } else { if (currentData) { relationshipChanged = !(0, records_1.equalRecordIdentities)(currentData, data); } else { relationshipChanged = true; currentData = null; } } if (relationshipChanged) { changed = true; (0, utils_1.deepSet)(result, ['relationships', field, 'data'], currentData); } } }); } if (changed) { return { op: 'updateRecord', record: result }; } } else { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { throw new records_1.RecordNotFoundException(type, id); } else { return { op: 'removeRecord', record: { type, id } }; } } }, async removeRecord(cache, operation, options) { const op = operation; const { record } = op; const currentRecord = await cache.getRecordAsync(record); if (currentRecord) { return { op: 'addRecord', record: currentRecord }; } else { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { throw new records_1.RecordNotFoundException(record.type, record.id); } } }, async replaceKey(cache, operation, options) { const op = operation; const { record, key } = op; const currentRecord = await cache.getRecordAsync(record); if (currentRecord === undefined) { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { throw new records_1.RecordNotFoundException(record.type, record.id); } } const currentValue = currentRecord && (0, utils_1.deepGet)(currentRecord, ['keys', key]); if (!(0, utils_1.eq)(currentValue, op.value)) { const { type, id } = op.record; return { op: 'replaceKey', record: { type, id }, key, value: currentValue }; } }, async replaceAttribute(cache, operation, options) { const op = operation; const { record, attribute } = op; const currentRecord = await cache.getRecordAsync(record); if (currentRecord === undefined) { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { throw new records_1.RecordNotFoundException(record.type, record.id); } } const currentValue = currentRecord && (0, utils_1.deepGet)(currentRecord, ['attributes', attribute]); if (!(0, utils_1.eq)(currentValue, op.value)) { const { type, id } = record; return { op: 'replaceAttribute', record: { type, id }, attribute, value: currentValue }; } }, async addToRelatedRecords(cache, operation, options) { const op = operation; const { record, relationship, relatedRecord } = op; const currentRelatedRecords = await cache.getRelatedRecordsAsync(record, relationship); if (currentRelatedRecords === undefined) { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { if ((await cache.getRecordAsync(record)) === undefined) { throw new records_1.RecordNotFoundException(record.type, record.id); } } } if (currentRelatedRecords === undefined || !(0, records_1.recordsInclude)(currentRelatedRecords, relatedRecord)) { return { op: 'removeFromRelatedRecords', record, relationship, relatedRecord }; } }, async removeFromRelatedRecords(cache, operation, options) { const op = operation; const { record, relationship, relatedRecord } = op; const currentRelatedRecords = await cache.getRelatedRecordsAsync(record, relationship); if (currentRelatedRecords === undefined) { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { if ((await cache.getRecordAsync(record)) === undefined) { throw new records_1.RecordNotFoundException(record.type, record.id); } } } if (currentRelatedRecords !== undefined && (0, records_1.recordsInclude)(currentRelatedRecords, relatedRecord)) { return { op: 'addToRelatedRecords', record, relationship, relatedRecord }; } }, async replaceRelatedRecords(cache, operation, options) { const op = operation; const { record, relationship, relatedRecords } = op; const currentRelatedRecords = await cache.getRelatedRecordsAsync(record, relationship); if (currentRelatedRecords === undefined) { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { if ((await cache.getRecordAsync(record)) === undefined) { throw new records_1.RecordNotFoundException(record.type, record.id); } } } if (currentRelatedRecords === undefined || !(0, records_1.equalRecordIdentitySets)(currentRelatedRecords, relatedRecords)) { return { op: 'replaceRelatedRecords', record, relationship, relatedRecords: currentRelatedRecords || [] }; } }, async replaceRelatedRecord(cache, operation, options) { const op = operation; const { record, relationship, relatedRecord } = op; const currentRelatedRecord = await cache.getRelatedRecordAsync(record, relationship); if (currentRelatedRecord === undefined) { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { if ((await cache.getRecordAsync(record)) === undefined) { throw new records_1.RecordNotFoundException(record.type, record.id); } } } if (currentRelatedRecord === undefined || !(0, records_1.equalRecordIdentities)(currentRelatedRecord, relatedRecord)) { return { op: 'replaceRelatedRecord', record, relationship, relatedRecord: currentRelatedRecord || null }; } } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtaW52ZXJzZS10cmFuc2Zvcm0tb3BlcmF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZXJhdG9ycy9hc3luYy1pbnZlcnNlLXRyYW5zZm9ybS1vcGVyYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNENBaUJ3QjtBQUN4Qix3Q0FBMEQ7QUFXN0MsUUFBQSw4QkFBOEIsR0FBd0M7SUFDakYsS0FBSyxDQUFDLFNBQVMsQ0FDYixLQUEwQixFQUMxQixTQUEwQjtJQUMxQiw2REFBNkQ7SUFDN0QsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLEdBQUcsU0FBK0IsQ0FBQztRQUMzQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0RCxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksSUFBQSxVQUFFLEVBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDMUIsT0FBTzthQUNSO2lCQUFNO2dCQUNMLE9BQU87b0JBQ0wsRUFBRSxFQUFFLGNBQWM7b0JBQ2xCLE1BQU0sRUFBRSxPQUFPO2lCQUNoQixDQUFDO2FBQ0g7U0FDRjthQUFNO1lBQ0wsT0FBTztnQkFDTCxFQUFFLEVBQUUsY0FBYztnQkFDbEIsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTthQUNyQixDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FDaEIsS0FBMEIsRUFDMUIsU0FBMEIsRUFDMUIsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLEdBQUcsU0FBa0MsQ0FBQztRQUM5QyxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFD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QUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDM0Q7YUFDRjtTQUNGO1FBRUQsSUFDRSxvQkFBb0IsS0FBSyxTQUFTO1lBQ2xDLENBQUMsSUFBQSwrQkFBcUIsRUFDcEIsb0JBQXNDLEVBQ3RDLGFBQStCLENBQ2hDLEVBQ0Q7WUFDQSxPQUFPO2dCQUNMLEVBQUUsRUFBRSxzQkFBc0I7Z0JBQzFCLE1BQU07Z0JBQ04sWUFBWTtnQkFDWixhQUFhLEVBQUUsb0JBQW9CLElBQUksSUFBSTthQUM1QyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnQG9yYml0L2RhdGEnO1xuaW1wb3J0IHtcbiAgQWRkUmVjb3JkT3BlcmF0aW9uLFxuICBBZGRUb1JlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uLFxuICBlcXVhbFJlY29yZElkZW50aXRpZXMsXG4gIGVxdWFsUmVjb3JkSWRlbnRpdHlTZXRzLFxuICBJbml0aWFsaXplZFJlY29yZCxcbiAgUmVjb3JkSWRlbnRpdHksXG4gIFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uLFxuICBSZWNvcmRPcGVyYXRpb24sXG4gIHJlY29yZHNJbmNsdWRlLFxuICBSZW1vdmVGcm9tUmVsYXRlZFJlY29yZHNPcGVyYXRpb24sXG4gIFJlbW92ZVJlY29yZE9wZXJhdGlvbixcbiAgUmVwbGFjZUF0dHJpYnV0ZU9wZXJhdGlvbixcbiAgUmVwbGFjZUtleU9wZXJhdGlvbixcbiAgUmVwbGFjZVJlbGF0ZWRSZWNvcmRPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVjb3Jkc09wZXJhdGlvbixcbiAgVXBkYXRlUmVjb3JkT3BlcmF0aW9uXG59IGZyb20gJ0BvcmJpdC9yZWNvcmRzJztcbmltcG9ydCB7IGRlZXBHZXQsIGRlZXBTZXQsIERpY3QsIGVxIH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IEFzeW5jUmVjb3JkQWNjZXNzb3IgfSBmcm9tICcuLi9yZWNvcmQtYWNjZXNzb3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jSW52ZXJzZVRyYW5zZm9ybU9wZXJhdG9yIHtcbiAgKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCBjb25zdCBBc3luY0ludmVyc2VUcmFuc2Zvcm1PcGVyYXRvcnM6IERpY3Q8QXN5bmNJbnZlcnNlVHJhbnNmb3JtT3BlcmF0b3I+ID0ge1xuICBhc3luYyBhZGRSZWNvcmQoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIEFkZFJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHR5cGUsIGlkIH0gPSBvcC5yZWNvcmQ7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKG9wLnJlY29yZCk7XG5cbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgaWYgKGVxKGN1cnJlbnQsIG9wLnJlY29yZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcDogJ3VwZGF0ZVJlY29yZCcsXG4gICAgICAgICAgcmVjb3JkOiBjdXJyZW50XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAncmVtb3ZlUmVjb3JkJyxcbiAgICAgICAgcmVjb3JkOiB7IHR5cGUsIGlkIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHVwZGF0ZVJlY29yZChcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUHJvbWlzZTxSZWNvcmRPcGVyYXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBVcGRhdGVSZWNvcmRPcGVyYXRpb247XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKG9wLnJlY29yZCk7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQ6IEluaXRpYWxpemVkUmVjb3JkID0gb3AucmVjb3JkO1xuICAgIGNvbnN0IHsgdHlwZSwgaWQgfSA9IHJlcGxhY2VtZW50O1xuXG4gICAgaWYgKGN1cnJlbnRSZWNvcmQpIHtcbiAgICAgIGxldCByZXN1bHQgPSB7IHR5cGUsIGlkIH07XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICBbJ2F0dHJpYnV0ZXMnLCAna2V5cyddLmZvckVhY2goKGdyb3VwaW5nKSA9PiB7XG4gICAgICAgIGlmICgocmVwbGFjZW1lbnQgYXMgYW55KVtncm91cGluZ10pIHtcbiAgICAgICAgICBPYmplY3Qua2V5cygocmVwbGFjZW1lbnQgYXMgYW55KVtncm91cGluZ10pLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSAocmVwbGFjZW1lbnQgYXMgYW55KVtncm91cGluZ11bZmllbGRdO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRWYWx1ZSA9IGRlZXBHZXQoY3VycmVudFJlY29yZCwgW2dyb3VwaW5nLCBmaWVsZF0pO1xuICAgICAgICAgICAgaWYgKCFlcSh2YWx1ZSwgY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZGVlcFNldChcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgW2dyb3VwaW5nLCBmaWVsZF0sXG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VycmVudFZhbHVlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVwbGFjZW1lbnQucmVsYXRpb25zaGlwcykge1xuICAgICAgICBPYmplY3Qua2V5cyhyZXBsYWNlbWVudC5yZWxhdGlvbnNoaXBzKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIGxldCBkYXRhID0gZGVlcEdldChyZXBsYWNlbWVudCwgWydyZWxhdGlvbnNoaXBzJywgZmllbGQsICdkYXRhJ10pO1xuICAgICAgICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50RGF0YSA9IGRlZXBHZXQoY3VycmVudFJlY29yZCwgW1xuICAgICAgICAgICAgICAncmVsYXRpb25zaGlwcycsXG4gICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAnZGF0YSdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgbGV0IHJlbGF0aW9uc2hpcENoYW5nZWQ7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENoYW5nZWQgPSAhZXF1YWxSZWNvcmRJZGVudGl0eVNldHMoXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YSxcbiAgICAgICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENoYW5nZWQgPSAhZXF1YWxSZWNvcmRJZGVudGl0aWVzKGN1cnJlbnREYXRhLCBkYXRhKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0YSA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGRlZXBTZXQocmVzdWx0LCBbJ3JlbGF0aW9uc2hpcHMnLCBmaWVsZCwgJ2RhdGEnXSwgY3VycmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb3A6ICd1cGRhdGVSZWNvcmQnLFxuICAgICAgICAgIHJlY29yZDogcmVzdWx0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24odHlwZSwgaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcDogJ3JlbW92ZVJlY29yZCcsXG4gICAgICAgICAgcmVjb3JkOiB7IHR5cGUsIGlkIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgcmVtb3ZlUmVjb3JkKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlbW92ZVJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCB9ID0gb3A7XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCk7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICdhZGRSZWNvcmQnLFxuICAgICAgICByZWNvcmQ6IGN1cnJlbnRSZWNvcmRcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHJlcGxhY2VLZXkoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkT3BlcmF0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgUmVwbGFjZUtleU9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwga2V5IH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKTtcblxuICAgIGlmIChjdXJyZW50UmVjb3JkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY3VycmVudFJlY29yZCAmJiBkZWVwR2V0KGN1cnJlbnRSZWNvcmQsIFsna2V5cycsIGtleV0pO1xuXG4gICAgaWYgKCFlcShjdXJyZW50VmFsdWUsIG9wLnZhbHVlKSkge1xuICAgICAgY29uc3QgeyB0eXBlLCBpZCB9ID0gb3AucmVjb3JkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ3JlcGxhY2VLZXknLFxuICAgICAgICByZWNvcmQ6IHsgdHlwZSwgaWQgfSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogY3VycmVudFZhbHVlXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICBhc3luYyByZXBsYWNlQXR0cmlidXRlKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlcGxhY2VBdHRyaWJ1dGVPcGVyYXRpb247XG4gICAgY29uc3QgeyByZWNvcmQsIGF0dHJpYnV0ZSB9ID0gb3A7XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCk7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9XG4gICAgICBjdXJyZW50UmVjb3JkICYmIGRlZXBHZXQoY3VycmVudFJlY29yZCwgWydhdHRyaWJ1dGVzJywgYXR0cmlidXRlXSk7XG5cbiAgICBpZiAoIWVxKGN1cnJlbnRWYWx1ZSwgb3AudmFsdWUpKSB7XG4gICAgICBjb25zdCB7IHR5cGUsIGlkIH0gPSByZWNvcmQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAncmVwbGFjZUF0dHJpYnV0ZScsXG4gICAgICAgIHJlY29yZDogeyB0eXBlLCBpZCB9LFxuICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgIHZhbHVlOiBjdXJyZW50VmFsdWVcbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIGFkZFRvUmVsYXRlZFJlY29yZHMoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkT3BlcmF0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgQWRkVG9SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkIH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVsYXRlZFJlY29yZHMgPSBhd2FpdCBjYWNoZS5nZXRSZWxhdGVkUmVjb3Jkc0FzeW5jKFxuICAgICAgcmVjb3JkLFxuICAgICAgcmVsYXRpb25zaGlwXG4gICAgKTtcblxuICAgIGlmIChjdXJyZW50UmVsYXRlZFJlY29yZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIGlmICgoYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRSZWxhdGVkUmVjb3JkcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhcmVjb3Jkc0luY2x1ZGUoY3VycmVudFJlbGF0ZWRSZWNvcmRzLCByZWxhdGVkUmVjb3JkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICdyZW1vdmVGcm9tUmVsYXRlZFJlY29yZHMnLFxuICAgICAgICByZWNvcmQsXG4gICAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgICAgcmVsYXRlZFJlY29yZFxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgcmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlbW92ZUZyb21SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkIH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVsYXRlZFJlY29yZHMgPSBhd2FpdCBjYWNoZS5nZXRSZWxhdGVkUmVjb3Jkc0FzeW5jKFxuICAgICAgcmVjb3JkLFxuICAgICAgcmVsYXRpb25zaGlwXG4gICAgKTtcblxuICAgIGlmIChjdXJyZW50UmVsYXRlZFJlY29yZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIGlmICgoYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRSZWxhdGVkUmVjb3JkcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICByZWNvcmRzSW5jbHVkZShjdXJyZW50UmVsYXRlZFJlY29yZHMsIHJlbGF0ZWRSZWNvcmQpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ2FkZFRvUmVsYXRlZFJlY29yZHMnLFxuICAgICAgICByZWNvcmQsXG4gICAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgICAgcmVsYXRlZFJlY29yZFxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgcmVwbGFjZVJlbGF0ZWRSZWNvcmRzKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlcGxhY2VSZWxhdGVkUmVjb3Jkc09wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkcyB9ID0gb3A7XG4gICAgY29uc3QgY3VycmVudFJlbGF0ZWRSZWNvcmRzID0gYXdhaXQgY2FjaGUuZ2V0UmVsYXRlZFJlY29yZHNBc3luYyhcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcFxuICAgICk7XG5cbiAgICBpZiAoY3VycmVudFJlbGF0ZWRSZWNvcmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICBpZiAoKGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCkpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjdXJyZW50UmVsYXRlZFJlY29yZHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIWVxdWFsUmVjb3JkSWRlbnRpdHlTZXRzKGN1cnJlbnRSZWxhdGVkUmVjb3JkcywgcmVsYXRlZFJlY29yZHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ3JlcGxhY2VSZWxhdGVkUmVjb3JkcycsXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgICByZWxhdGVkUmVjb3JkczogY3VycmVudFJlbGF0ZWRSZWNvcmRzIHx8IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICBhc3luYyByZXBsYWNlUmVsYXRlZFJlY29yZChcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUHJvbWlzZTxSZWNvcmRPcGVyYXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZXBsYWNlUmVsYXRlZFJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkIH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVsYXRlZFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlbGF0ZWRSZWNvcmRBc3luYyhcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcFxuICAgICk7XG5cbiAgICBpZiAoY3VycmVudFJlbGF0ZWRSZWNvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIGlmICgoYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRSZWxhdGVkUmVjb3JkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICFlcXVhbFJlY29yZElkZW50aXRpZXMoXG4gICAgICAgIGN1cnJlbnRSZWxhdGVkUmVjb3JkIGFzIFJlY29yZElkZW50aXR5LFxuICAgICAgICByZWxhdGVkUmVjb3JkIGFzIFJlY29yZElkZW50aXR5XG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ3JlcGxhY2VSZWxhdGVkUmVjb3JkJyxcbiAgICAgICAgcmVjb3JkLFxuICAgICAgICByZWxhdGlvbnNoaXAsXG4gICAgICAgIHJlbGF0ZWRSZWNvcmQ6IGN1cnJlbnRSZWxhdGVkUmVjb3JkIHx8IG51bGxcbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xuIl19