igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
354 lines • 39.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { IgxSorting, IgxDataRecordSorting } from './sorting-strategy';
import { IgxGrouping } from './grouping-strategy';
import { PagingError } from './paging-state.interface';
import { TreeGridFilteringStrategy } from '../grids/tree-grid/tree-grid.filtering.pipe';
import { FilteringStrategy } from './filtering-strategy';
import { cloneValue, mergeObjects } from '../core/utils';
import { TransactionType } from '../services/transaction/transaction';
/** @enum {string} */
const DataType = {
String: 'string',
Number: 'number',
Boolean: 'boolean',
Date: 'date',
};
export { DataType };
/**
* @hidden
*/
export class DataUtil {
/**
* @template T
* @param {?} data
* @param {?} expressions
* @param {?=} sorting
* @return {?}
*/
static sort(data, expressions, sorting = new IgxSorting()) {
return sorting.sort(data, expressions);
}
/**
* @param {?} hierarchicalData
* @param {?} expressions
* @param {?=} parent
* @return {?}
*/
static treeGridSort(hierarchicalData, expressions, parent) {
/** @type {?} */
let res = [];
hierarchicalData.forEach((hr) => {
/** @type {?} */
const rec = DataUtil.cloneTreeGridRecord(hr);
rec.parent = parent;
if (rec.children) {
rec.children = DataUtil.treeGridSort(rec.children, expressions, rec);
}
res.push(rec);
});
res = DataUtil.sort(res, expressions, new IgxDataRecordSorting());
return res;
}
/**
* @param {?} hierarchicalRecord
* @return {?}
*/
static cloneTreeGridRecord(hierarchicalRecord) {
/** @type {?} */
const rec = {
rowID: hierarchicalRecord.rowID,
data: hierarchicalRecord.data,
children: hierarchicalRecord.children,
isFilteredOutParent: hierarchicalRecord.isFilteredOutParent,
level: hierarchicalRecord.level,
expanded: hierarchicalRecord.expanded
};
return rec;
}
/**
* @template T
* @param {?} data
* @param {?} state
* @param {?=} groupsRecords
* @return {?}
*/
static group(data, state, groupsRecords = []) {
/** @type {?} */
const grouping = new IgxGrouping();
groupsRecords.splice(0, groupsRecords.length);
return grouping.groupBy(data, state.expressions, groupsRecords);
}
/**
* @param {?} groupData
* @param {?} state
* @return {?}
*/
static restoreGroups(groupData, state) {
if (state.expressions.length === 0) {
return groupData.data;
}
return this.restoreGroupsIterative(groupData, state);
}
/**
* @private
* @param {?} groupData
* @param {?} state
* @return {?}
*/
static restoreGroupsIterative(groupData, state) {
/** @type {?} */
const metadata = groupData.metadata;
/** @type {?} */
const result = [];
/** @type {?} */
const added = [];
/** @type {?} */
let chain;
/** @type {?} */
let i = 0;
/** @type {?} */
let j;
/** @type {?} */
let pointer;
/** @type {?} */
let expanded;
for (i = 0; i < metadata.length;) {
chain = [metadata[i]];
pointer = metadata[i].groupParent;
// break off if the parent is already added
while (pointer && added[0] !== pointer) {
chain.push(pointer);
if (added[0] && added[0].level === pointer.level) {
added.shift();
}
pointer = pointer.groupParent;
}
for (j = chain.length - 1; j >= 0; j--) {
result.push(chain[j]);
added.unshift(chain[j]);
/** @type {?} */
const hierarchy = this.getHierarchy(chain[j]);
/** @type {?} */
const expandState = state.expansion.find((s) => this.isHierarchyMatch(s.hierarchy || [{ fieldName: chain[j].expression.fieldName, value: chain[j].value }], hierarchy));
expanded = expandState ? expandState.expanded : state.defaultExpanded;
if (!expanded) {
break;
}
}
added.shift();
j = Math.max(j, 0);
/** @type {?} */
const start = chain[j].records.findIndex(r => r === groupData.data[i]);
/** @type {?} */
const end = Math.min(metadata.length - i + start, chain[j].records.length);
if (expanded) {
result.push(...chain[j].records.slice(start, end));
}
i += end - start;
}
return result;
}
/**
* @template T
* @param {?} data
* @param {?} state
* @return {?}
*/
static page(data, state) {
if (!state) {
return data;
}
/** @type {?} */
const len = data.length;
/** @type {?} */
const index = state.index;
/** @type {?} */
const res = [];
/** @type {?} */
const recordsPerPage = state.recordsPerPage;
state.metadata = {
countPages: 0,
countRecords: data.length,
error: PagingError.None
};
if (index < 0 || isNaN(index)) {
state.metadata.error = PagingError.IncorrectPageIndex;
return res;
}
if (recordsPerPage <= 0 || isNaN(recordsPerPage)) {
state.metadata.error = PagingError.IncorrectRecordsPerPage;
return res;
}
state.metadata.countPages = Math.ceil(len / recordsPerPage);
if (!len) {
return data;
}
if (index >= state.metadata.countPages) {
state.metadata.error = PagingError.IncorrectPageIndex;
return res;
}
return data.slice(index * recordsPerPage, (index + 1) * recordsPerPage);
}
/**
* @template T
* @param {?} data
* @param {?} state
* @return {?}
*/
static filter(data, state) {
if (!state.strategy) {
state.strategy = new FilteringStrategy();
}
return state.strategy.filter(data, state.expressionsTree);
}
/**
* @param {?} data
* @param {?} state
* @return {?}
*/
static treeGridFilter(data, state) {
if (!state.strategy) {
state.strategy = new TreeGridFilteringStrategy();
}
return state.strategy.filter(data, state.expressionsTree);
}
/**
* @param {?} gRow
* @return {?}
*/
static getHierarchy(gRow) {
/** @type {?} */
const hierarchy = [];
if (gRow !== undefined && gRow.expression) {
hierarchy.push({ fieldName: gRow.expression.fieldName, value: gRow.value });
while (gRow.groupParent) {
gRow = gRow.groupParent;
hierarchy.unshift({ fieldName: gRow.expression.fieldName, value: gRow.value });
}
}
return hierarchy;
}
/**
* @param {?} h1
* @param {?} h2
* @return {?}
*/
static isHierarchyMatch(h1, h2) {
if (h1.length !== h2.length) {
return false;
}
return h1.every((level, index) => {
return level.fieldName === h2[index].fieldName && level.value === h2[index].value;
});
}
/**
* Merges all changes from provided transactions into provided data collection
* @template T
* @param {?} data Collection to merge
* @param {?} transactions Transactions to merge into data
* @param {?=} primaryKey Primary key of the collection, if any
* @param {?=} deleteRows Should delete rows with DELETE transaction type from data
* @return {?} Provided data collections updated with all provided transactions
*/
static mergeTransactions(data, transactions, primaryKey, deleteRows = false) {
data.forEach((item, index) => {
/** @type {?} */
const rowId = primaryKey ? item[primaryKey] : item;
/** @type {?} */
const transaction = transactions.find(t => t.id === rowId);
if (transaction && transaction.type === TransactionType.UPDATE) {
data[index] = transaction.newValue;
}
});
if (deleteRows) {
transactions
.filter(t => t.type === TransactionType.DELETE)
.forEach(t => {
/** @type {?} */
const index = primaryKey ? data.findIndex(d => d[primaryKey] === t.id) : data.findIndex(d => d === t.id);
if (0 <= index && index < data.length) {
data.splice(index, 1);
}
});
}
data.push(...transactions
.filter(t => t.type === TransactionType.ADD)
.map(t => t.newValue));
return data;
}
/**
* Merges all changes from provided transactions into provided hierarchical data collection
* @param {?} data Collection to merge
* @param {?} transactions Transactions to merge into data
* @param {?} childDataKey Data key of child collections
* @param {?=} primaryKey Primary key of the collection, if any
* @param {?=} deleteRows Should delete rows with DELETE transaction type from data
* @return {?} Provided data collections updated with all provided transactions
*/
static mergeHierarchicalTransactions(data, transactions, childDataKey, primaryKey, deleteRows = false) {
for (const transaction of transactions) {
if (transaction.path) {
/** @type {?} */
const parent = this.findParentFromPath(data, primaryKey, childDataKey, transaction.path);
/** @type {?} */
let collection = parent ? parent[childDataKey] : data;
switch (transaction.type) {
case TransactionType.ADD:
// if there is no parent this is ADD row at root level
if (parent && !parent[childDataKey]) {
parent[childDataKey] = collection = [];
}
collection.push(transaction.newValue);
break;
case TransactionType.UPDATE:
/** @type {?} */
const updateIndex = collection.findIndex(x => x[primaryKey] === transaction.id);
if (updateIndex !== -1) {
collection[updateIndex] = mergeObjects(cloneValue(collection[updateIndex]), transaction.newValue);
}
break;
case TransactionType.DELETE:
if (deleteRows) {
/** @type {?} */
const deleteIndex = collection.findIndex(r => r[primaryKey] === transaction.id);
if (deleteIndex !== -1) {
collection.splice(deleteIndex, 1);
}
}
break;
}
}
else {
// if there is no path this is ADD row in root. Push the newValue to data
data.push(transaction.newValue);
}
}
return data;
}
/**
* @private
* @param {?} data
* @param {?} primaryKey
* @param {?} childDataKey
* @param {?} path
* @return {?}
*/
static findParentFromPath(data, primaryKey, childDataKey, path) {
/** @type {?} */
let collection = data;
/** @type {?} */
let result;
for (const id of path) {
result = collection && collection.find(x => x[primaryKey] === id);
if (!result) {
break;
}
collection = result[childDataKey];
}
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS11dGlsLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEUsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRSxPQUFPLEVBQWdCLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBS3JFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRXhGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBZSxlQUFlLEVBQTJCLE1BQU0scUNBQXFDLENBQUM7OztJQU14RyxRQUFTLFFBQVE7SUFDakIsUUFBUyxRQUFRO0lBQ2pCLFNBQVUsU0FBUztJQUNuQixNQUFPLE1BQU07Ozs7OztBQU1qQixNQUFNLE9BQU8sUUFBUTs7Ozs7Ozs7SUFDVixNQUFNLENBQUMsSUFBSSxDQUFJLElBQVMsRUFBRSxXQUFpQyxFQUFFLFVBQXNCLElBQUksVUFBVSxFQUFFO1FBQ3RHLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7Ozs7OztJQUVNLE1BQU0sQ0FBQyxZQUFZLENBQUMsZ0JBQW1DLEVBQzFELFdBQWlDLEVBQ2pDLE1BQXdCOztZQUNwQixHQUFHLEdBQXNCLEVBQUU7UUFDL0IsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBbUIsRUFBRSxFQUFFOztrQkFDdkMsR0FBRyxHQUFvQixRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQzdELEdB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UyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxFQUFFLENBQUM7NEJBQy9FLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dDQUNwQixVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQzs2QkFDckM7eUJBQ0o7d0JBQ0QsTUFBTTtpQkFDYjthQUNKO2lCQUFNO2dCQUNILDBFQUEwRTtnQkFDMUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbkM7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Ozs7Ozs7OztJQUVPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFXLEVBQUUsVUFBZSxFQUFFLFlBQWlCLEVBQUUsSUFBVzs7WUFDdEYsVUFBVSxHQUFVLElBQUk7O1lBQ3hCLE1BQVc7UUFFZixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRTtZQUNuQixNQUFNLEdBQUcsVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDVCxNQUFNO2FBQ1Q7WUFFRCxVQUFVLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUZpbHRlcmluZ1N0YXRlIH0gZnJvbSAnLi9maWx0ZXJpbmctc3RhdGUuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgSWd4U29ydGluZywgSWd4RGF0YVJlY29yZFNvcnRpbmcgfSBmcm9tICcuL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgSUdyb3VwQnlSZXN1bHQsIElneEdyb3VwaW5nIH0gZnJvbSAnLi9ncm91cGluZy1zdHJhdGVneSc7XG5cbmltcG9ydCB7IElQYWdpbmdTdGF0ZSwgUGFnaW5nRXJyb3IgfSBmcm9tICcuL3BhZ2luZy1zdGF0ZS5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBJR3JvdXBCeUV4cGFuZFN0YXRlLCBJR3JvdXBCeUtleSB9IGZyb20gJy4vZ3JvdXBieS1leHBhbmQtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcm91cEJ5UmVjb3JkIH0gZnJvbSAnLi9ncm91cGJ5LXJlY29yZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwaW5nU3RhdGUgfSBmcm9tICcuL2dyb3VwYnktc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRyZWVHcmlkRmlsdGVyaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi9ncmlkcy90cmVlLWdyaWQvdHJlZS1ncmlkLmZpbHRlcmluZy5waXBlJztcbmltcG9ydCB7IElTb3J0aW5nRXhwcmVzc2lvbiB9IGZyb20gJy4vc29ydGluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdTdHJhdGVneSB9IGZyb20gJy4vZmlsdGVyaW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IElUcmVlR3JpZFJlY29yZCB9IGZyb20gJy4uL2dyaWRzL3RyZWUtZ3JpZCc7XG5pbXBvcnQgeyBjbG9uZVZhbHVlLCBtZXJnZU9iamVjdHMgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblR5cGUsIEhpZXJhcmNoaWNhbFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNhY3Rpb24vdHJhbnNhY3Rpb24nO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIE51bWJlciA9ICdudW1iZXInLFxuICAgIEJvb2xlYW4gPSAnYm9vbGVhbicsXG4gICAgRGF0ZSA9ICdkYXRlJ1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIHNvcnQ8VD4oZGF0YTogVFtdLCBleHByZXNzaW9uczogSVNvcnRpbmdFeHByZXNzaW9uW10sIHNvcnRpbmc6IElneFNvcnRpbmcgPSBuZXcgSWd4U29ydGluZygpKTogVFtdIHtcbiAgICAgICAgcmV0dXJuIHNvcnRpbmcuc29ydChkYXRhLCBleHByZXNzaW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmVlR3JpZFNvcnQoaGllcmFyY2hpY2FsRGF0YTogSVRyZWVHcmlkUmVjb3JkW10sXG4gICAgICAgIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSxcbiAgICAgICAgcGFyZW50PzogSVRyZWVHcmlkUmVjb3JkKTogSVRyZWVHcmlkUmVjb3JkW10ge1xuICAgICAgICBsZXQgcmVzOiBJVHJlZUdyaWRSZWNvcmRbXSA9IFtdO1xuICAgICAgICBoaWVyYXJjaGljYWxEYXRhLmZvckVhY2goKGhyOiBJVHJlZUdyaWRSZWNvcmQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYzogSVRyZWVHcmlkUmVjb3JkID0gRGF0YVV0aWwuY2xvbmVUcmVlR3JpZFJlY29yZChocik7XG4gICAgICAgICAgICByZWMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgaWYgKHJlYy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIHJlYy5jaGlsZHJlbiA9IERhdGFVdGlsLnRyZWVHcmlkU29ydChyZWMuY2hpbGRyZW4sIGV4cHJlc3Npb25zLCByZWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnB1c2gocmVjKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzID0gRGF0YVV0aWwuc29ydChyZXMsIGV4cHJlc3Npb25zLCBuZXcgSWd4RGF0YVJlY29yZFNvcnRpbmcoKSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsb25lVHJlZUdyaWRSZWNvcmQoaGllcmFyY2hpY2FsUmVjb3JkOiBJVHJlZUdyaWRSZWNvcmQpIHtcbiAgICAgICAgY29uc3QgcmVjOiBJVHJlZUdyaWRSZWNvcmQgPSB7XG4gICAgICAgICAgICByb3dJRDogaGllcmFyY2hpY2FsUmVjb3JkLnJvd0lELFxuICAgICAgICAgICAgZGF0YTogaGllcmFyY2hpY2FsUmVjb3JkLmRhdGEsXG4gICAgICAgICAgICBjaGlsZHJlbjogaGllcmFyY2hpY2FsUmVjb3JkLmNoaWxkcmVuLFxuICAgICAgICAgICAgaXNGaWx0ZXJlZE91dFBhcmVudDogaGllcmFyY2hpY2FsUmVjb3JkLmlzRmlsdGVyZWRPdXRQYXJlbnQsXG4gICAgICAgICAgICBsZXZlbDogaGllcmFyY2hpY2FsUmVjb3JkLmxldmVsLFxuICAgICAgICAgICAgZXhwYW5kZWQ6IGhpZXJhcmNoaWNhbFJlY29yZC5leHBhbmRlZFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXA8VD4oZGF0YTogVFtdLCBzdGF0ZTogSUdyb3VwaW5nU3RhdGUsIGdyb3Vwc1JlY29yZHM6IGFueVtdID0gW10pOiBJR3JvdXBCeVJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGdyb3VwaW5nID0gbmV3IElneEdyb3VwaW5nKCk7XG4gICAgICAgIGdyb3Vwc1JlY29yZHMuc3BsaWNlKDAsIGdyb3Vwc1JlY29yZHMubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGdyb3VwaW5nLmdyb3VwQnkoZGF0YSwgc3RhdGUuZXhwcmVzc2lvbnMsIGdyb3Vwc1JlY29yZHMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHJlc3RvcmVHcm91cHMoZ3JvdXBEYXRhOiBJR3JvdXBCeVJlc3VsdCwgc3RhdGU6IElHcm91cGluZ1N0YXRlKTogYW55W10ge1xuICAgICAgICBpZiAoc3RhdGUuZXhwcmVzc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXBEYXRhLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdG9yZUdyb3Vwc0l0ZXJhdGl2ZShncm91cERhdGEsIHN0YXRlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVzdG9yZUdyb3Vwc0l0ZXJhdGl2ZShncm91cERhdGE6IElHcm91cEJ5UmVzdWx0LCBzdGF0ZTogSUdyb3VwaW5nU3RhdGUpOiBhbnlbXSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ3JvdXBEYXRhLm1ldGFkYXRhO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXSwgYWRkZWQgPSBbXTtcbiAgICAgICAgbGV0IGNoYWluOiBhbnlbXTtcbiAgICAgICAgbGV0IGkgPSAwLCBqO1xuICAgICAgICBsZXQgcG9pbnRlcjogSUdyb3VwQnlSZWNvcmQ7XG4gICAgICAgIGxldCBleHBhbmRlZDogYm9vbGVhbjtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG1ldGFkYXRhLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGNoYWluID0gW21ldGFkYXRhW2ldXTtcbiAgICAgICAgICAgIHBvaW50ZXIgPSBtZXRhZGF0YVtpXS5ncm91cFBhcmVudDtcbiAgICAgICAgICAgIC8vIGJyZWFrIG9mZiBpZiB0aGUgcGFyZW50IGlzIGFscmVhZHkgYWRkZWRcbiAgICAgICAgICAgIHdoaWxlIChwb2ludGVyICYmIGFkZGVkWzBdICE9PSBwb2ludGVyKSB7XG4gICAgICAgICAgICAgICAgY2hhaW4ucHVzaChwb2ludGVyKTtcbiAgICAgICAgICAgICAgICBpZiAoYWRkZWRbMF0gJiYgYWRkZWRbMF0ubGV2ZWwgPT09IHBvaW50ZXIubGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkZWQuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIuZ3JvdXBQYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGogPSBjaGFpbi5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoYWluW2pdKTtcbiAgICAgICAgICAgICAgICBhZGRlZC51bnNoaWZ0KGNoYWluW2pdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSB0aGlzLmdldEhpZXJhcmNoeShjaGFpbltqXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwYW5kU3RhdGU6IElHcm91cEJ5RXhwYW5kU3RhdGUgPSBzdGF0ZS5leHBhbnNpb24uZmluZCgocykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0hpZXJhcmNoeU1hdGNoKHMuaGllcmFyY2h5IHx8IFt7IGZpZWxkTmFtZTogY2hhaW5bal0uZXhwcmVzc2lvbi5maWVsZE5hbWUsIHZhbHVlOiBjaGFpbltqXS52YWx1ZSB9XSwgaGllcmFyY2h5KSk7XG4gICAgICAgICAgICAgICAgZXhwYW5kZWQgPSBleHBhbmRTdGF0ZSA/IGV4cGFuZFN0YXRlLmV4cGFuZGVkIDogc3RhdGUuZGVmYXVsdEV4cGFuZGVkO1xuICAgICAgICAgICAgICAgIGlmICghZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkZWQuc2hpZnQoKTtcbiAgICAgICAgICAgIGogPSBNYXRoLm1heChqLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gY2hhaW5bal0ucmVjb3Jkcy5maW5kSW5kZXgociA9PiByID09PSBncm91cERhdGEuZGF0YVtpXSk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihtZXRhZGF0YS5sZW5ndGggLSBpICsgc3RhcnQsIGNoYWluW2pdLnJlY29yZHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLmNoYWluW2pdLnJlY29yZHMuc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSArPSBlbmQgLSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHBhZ2U8VD4oZGF0YTogVFtdLCBzdGF0ZTogSVBhZ2luZ1N0YXRlKTogVFtdIHtcbiAgICAgICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gICAgICAgIGNvbnN0IHJlcyA9IFtdO1xuICAgICAgICBjb25zdCByZWNvcmRzUGVyUGFnZSA9IHN0YXRlLnJlY29yZHNQZXJQYWdlO1xuICAgICAgICBzdGF0ZS5tZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNvdW50UGFnZXM6IDAsXG4gICAgICAgICAgICBjb3VudFJlY29yZHM6IGRhdGEubGVuZ3RoLFxuICAgICAgICAgICAgZXJyb3I6IFBhZ2luZ0Vycm9yLk5vbmVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpc05hTihpbmRleCkpIHtcbiAgICAgICAgICAgIHN0YXRlLm1ldGFkYXRhLmVycm9yID0gUGFnaW5nRXJyb3IuSW5jb3JyZWN0UGFnZUluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjb3Jkc1BlclBhZ2UgPD0gMCB8fCBpc05hTihyZWNvcmRzUGVyUGFnZSkpIHtcbiAgICAgICAgICAgIHN0YXRlLm1ldGFkYXRhLmVycm9yID0gUGFnaW5nRXJyb3IuSW5jb3JyZWN0UmVjb3Jkc1BlclBhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1ldGFkYXRhLmNvdW50UGFnZXMgPSBNYXRoLmNlaWwobGVuIC8gcmVjb3Jkc1BlclBhZ2UpO1xuICAgICAgICBpZiAoIWxlbikge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ID49IHN0YXRlLm1ldGFkYXRhLmNvdW50UGFnZXMpIHtcbiAgICAgICAgICAgIHN0YXRlLm1ldGFkYXRhLmVycm9yID0gUGFnaW5nRXJyb3IuSW5jb3JyZWN0UGFnZUluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YS5zbGljZShpbmRleCAqIHJlY29yZHNQZXJQYWdlLCAoaW5kZXggKyAxKSAqIHJlY29yZHNQZXJQYWdlKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXI8VD4oZGF0YTogVFtdLCBzdGF0ZTogSUZpbHRlcmluZ1N0YXRlKTogVFtdIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zdHJhdGVneSkge1xuICAgICAgICAgICAgc3RhdGUuc3RyYXRlZ3kgPSBuZXcgRmlsdGVyaW5nU3RyYXRlZ3koKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGUuc3RyYXRlZ3kuZmlsdGVyKGRhdGEsIHN0YXRlLmV4cHJlc3Npb25zVHJlZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmVlR3JpZEZpbHRlcihkYXRhOiBJVHJlZUdyaWRSZWNvcmRbXSwgc3RhdGU6IElGaWx0ZXJpbmdTdGF0ZSk6IElUcmVlR3JpZFJlY29yZFtdIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zdHJhdGVneSkge1xuICAgICAgICAgICAgc3RhdGUuc3RyYXRlZ3kgPSBuZXcgVHJlZUdyaWRGaWx0ZXJpbmdTdHJhdGVneSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZS5zdHJhdGVneS5maWx0ZXIoZGF0YSwgc3RhdGUuZXhwcmVzc2lvbnNUcmVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEhpZXJhcmNoeShnUm93OiBJR3JvdXBCeVJlY29yZCk6IEFycmF5PElHcm91cEJ5S2V5PiB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeTogQXJyYXk8SUdyb3VwQnlLZXk+ID0gW107XG4gICAgICAgIGlmIChnUm93ICE9PSB1bmRlZmluZWQgJiYgZ1Jvdy5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICBoaWVyYXJjaHkucHVzaCh7IGZpZWxkTmFtZTogZ1Jvdy5leHByZXNzaW9uLmZpZWxkTmFtZSwgdmFsdWU6IGdSb3cudmFsdWUgfSk7XG4gICAgICAgICAgICB3aGlsZSAoZ1Jvdy5ncm91cFBhcmVudCkge1xuICAgICAgICAgICAgICAgIGdSb3cgPSBnUm93Lmdyb3VwUGFyZW50O1xuICAgICAgICAgICAgICAgIGhpZXJhcmNoeS51bnNoaWZ0KHsgZmllbGROYW1lOiBnUm93LmV4cHJlc3Npb24uZmllbGROYW1lLCB2YWx1ZTogZ1Jvdy52YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGllcmFyY2h5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNIaWVyYXJjaHlNYXRjaChoMTogQXJyYXk8SUdyb3VwQnlLZXk+LCBoMjogQXJyYXk8SUdyb3VwQnlLZXk+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChoMS5sZW5ndGggIT09IGgyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoMS5ldmVyeSgobGV2ZWwsIGluZGV4KTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbGV2ZWwuZmllbGROYW1lID09PSBoMltpbmRleF0uZmllbGROYW1lICYmIGxldmVsLnZhbHVlID09PSBoMltpbmRleF0udmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyBhbGwgY2hhbmdlcyBmcm9tIHByb3ZpZGVkIHRyYW5zYWN0aW9ucyBpbnRvIHByb3ZpZGVkIGRhdGEgY29sbGVjdGlvblxuICAgICAqIEBwYXJhbSBkYXRhIENvbGxlY3Rpb24gdG8gbWVyZ2VcbiAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25zIFRyYW5zYWN0aW9ucyB0byBtZXJnZSBpbnRvIGRhdGFcbiAgICAgKiBAcGFyYW0gcHJpbWFyeUtleSBQcmltYXJ5IGtleSBvZiB0aGUgY29sbGVjdGlvbiwgaWYgYW55XG4gICAgICogQHBhcmFtIGRlbGV0ZVJvd3MgU2hvdWxkIGRlbGV0ZSByb3dzIHdpdGggREVMRVRFIHRyYW5zYWN0aW9uIHR5cGUgZnJvbSBkYXRhXG4gICAgICogQHJldHVybnMgUHJvdmlkZWQgZGF0YSBjb2xsZWN0aW9ucyB1cGRhdGVkIHdpdGggYWxsIHByb3ZpZGVkIHRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VUcmFuc2FjdGlvbnM8VD4oZGF0YTogVFtdLCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10sIHByaW1hcnlLZXk/OiBhbnksIGRlbGV0ZVJvd3M6IGJvb2xlYW4gPSBmYWxzZSk6IFRbXSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb3dJZCA9IHByaW1hcnlLZXkgPyBpdGVtW3ByaW1hcnlLZXldIDogaXRlbTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb25zLmZpbmQodCA9PiB0LmlkID09PSByb3dJZCk7XG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb24gJiYgdHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlVQREFURSkge1xuICAgICAgICAgICAgICAgIGRhdGFbaW5kZXhdID0gdHJhbnNhY3Rpb24ubmV3VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZWxldGVSb3dzKSB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuREVMRVRFKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHByaW1hcnlLZXkgPyBkYXRhLmZpbmRJbmRleChkID0+IGRbcHJpbWFyeUtleV0gPT09IHQuaWQpIDogZGF0YS5maW5kSW5kZXgoZCA9PiBkID09PSB0LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnB1c2goLi4udHJhbnNhY3Rpb25zXG4gICAgICAgICAgICAuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKVxuICAgICAgICAgICAgLm1hcCh0ID0+IHQubmV3VmFsdWUpKTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgYWxsIGNoYW5nZXMgZnJvbSBwcm92aWRlZCB0cmFuc2FjdGlvbnMgaW50byBwcm92aWRlZCBoaWVyYXJjaGljYWwgZGF0YSBjb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIGRhdGEgQ29sbGVjdGlvbiB0byBtZXJnZVxuICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbnMgVHJhbnNhY3Rpb25zIHRvIG1lcmdlIGludG8gZGF0YVxuICAgICAqIEBwYXJhbSBjaGlsZERhdGFLZXkgRGF0YSBrZXkgb2YgY2hpbGQgY29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0gcHJpbWFyeUtleSBQcmltYXJ5IGtleSBvZiB0aGUgY29sbGVjdGlvbiwgaWYgYW55XG4gICAgICogQHBhcmFtIGRlbGV0ZVJvd3MgU2hvdWxkIGRlbGV0ZSByb3dzIHdpdGggREVMRVRFIHRyYW5zYWN0aW9uIHR5cGUgZnJvbSBkYXRhXG4gICAgICogQHJldHVybnMgUHJvdmlkZWQgZGF0YSBjb2xsZWN0aW9ucyB1cGRhdGVkIHdpdGggYWxsIHByb3ZpZGVkIHRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VIaWVyYXJjaGljYWxUcmFuc2FjdGlvbnMoXG4gICAgICAgIGRhdGE6IGFueVtdLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IEhpZXJhcmNoaWNhbFRyYW5zYWN0aW9uW10sXG4gICAgICAgIGNoaWxkRGF0YUtleTogYW55LFxuICAgICAgICBwcmltYXJ5S2V5PzogYW55LFxuICAgICAgICBkZWxldGVSb3dzOiBib29sZWFuID0gZmFsc2UpOiBhbnlbXSB7XG5cbiAgICAgICAgZm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5wYXRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5maW5kUGFyZW50RnJvbVBhdGgoZGF0YSwgcHJpbWFyeUtleSwgY2hpbGREYXRhS2V5LCB0cmFuc2FjdGlvbi5wYXRoKTtcbiAgICAgICAgICAgICAgICBsZXQgY29sbGVjdGlvbjogYW55W10gPSBwYXJlbnQgPyBwYXJlbnRbY2hpbGREYXRhS2V5XSA6IGRhdGE7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0cmFuc2FjdGlvbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFERDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBpcyBubyBwYXJlbnQgdGhpcyBpcyBBREQgcm93IGF0IHJvb3QgbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudFtjaGlsZERhdGFLZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50W2NoaWxkRGF0YUtleV0gPSBjb2xsZWN0aW9uID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2godHJhbnNhY3Rpb24ubmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlVQREFURTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUluZGV4ID0gY29sbGVjdGlvbi5maW5kSW5kZXgoeCA9PiB4W3ByaW1hcnlLZXldID09PSB0cmFuc2FjdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvblt1cGRhdGVJbmRleF0gPSBtZXJnZU9iamVjdHMoY2xvbmVWYWx1ZShjb2xsZWN0aW9uW3VwZGF0ZUluZGV4XSksIHRyYW5zYWN0aW9uLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5ERUxFVEU6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlUm93cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZUluZGV4ID0gY29sbGVjdGlvbi5maW5kSW5kZXgociA9PiByW3ByaW1hcnlLZXldID09PSB0cmFuc2FjdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnNwbGljZShkZWxldGVJbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgaWYgdGhlcmUgaXMgbm8gcGF0aCB0aGlzIGlzIEFERCByb3cgaW4gcm9vdC4gUHVzaCB0aGUgbmV3VmFsdWUgdG8gZGF0YVxuICAgICAgICAgICAgICAgIGRhdGEucHVzaCh0cmFuc2FjdGlvbi5uZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluZFBhcmVudEZyb21QYXRoKGRhdGE6IGFueVtdLCBwcmltYXJ5S2V5OiBhbnksIGNoaWxkRGF0YUtleTogYW55LCBwYXRoOiBhbnlbXSk6IGFueSB7XG4gICAgICAgIGxldCBjb2xsZWN0aW9uOiBhbnlbXSA9IGRhdGE7XG4gICAgICAgIGxldCByZXN1bHQ6IGFueTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHBhdGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbGxlY3Rpb24gJiYgY29sbGVjdGlvbi5maW5kKHggPT4geFtwcmltYXJ5S2V5XSA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29sbGVjdGlvbiA9IHJlc3VsdFtjaGlsZERhdGFLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iXX0=