ornamentum
Version:
Angular Toolkit
223 lines • 22.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { ReplaySubject, of } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { orderBy, get } from '../../utility/services/object-utility.class';
/**
* Data table resource service; Manage data table client side data querying.
* @template T
*/
export class DataTableResourceService {
/**
* Set data source stream to query.
* @param {?} dataSource Data source stream.
* @return {?}
*/
setDataSource(dataSource) {
this.dispose();
if (this.itemDataStream && !this.itemDataStream.closed) {
this.itemDataStream.complete();
}
this.itemDataStream = new ReplaySubject(1);
this.dataSourceSubscription = dataSource.subscribe((/**
* @param {?} items
* @return {?}
*/
(items) => {
this.itemDataStream.next(items);
}));
}
/**
* Query items by data table request params.
* @param {?} params Data table parameters object.
* @return {?} Query result stream.
*/
query(params) {
return this.itemDataStream.pipe(switchMap((/**
* @param {?} items
* @return {?}
*/
(items) => {
/** @type {?} */
let itemCount = items.length;
/** @type {?} */
let result = items.slice();
if (params.fields.length) {
/** @type {?} */
const filterFields = params.fields.filter((/**
* @param {?} field
* @return {?}
*/
field => field.filterable));
if (filterFields.length) {
result = items.filter((/**
* @param {?} item
* @return {?}
*/
item => {
return filterFields.every((/**
* @param {?} filterColumn
* @return {?}
*/
(filterColumn) => {
if (filterColumn.filterExpression) {
return filterColumn.filterExpression(item, filterColumn.field, filterColumn.filterValue);
}
if (filterColumn.filterValue === undefined || filterColumn.filterValue === '') {
return true;
}
/** @type {?} */
const fieldValue = get(item, filterColumn.field);
if (fieldValue === undefined) {
return true;
}
if (Array.isArray(filterColumn.filterValue)) {
return filterColumn.filterValue.length === 0 || filterColumn.filterValue.includes(fieldValue);
}
/** @type {?} */
const value = String(fieldValue).toLowerCase();
/** @type {?} */
const filterValue = String(filterColumn.filterValue).toLowerCase();
return value.includes(filterValue);
}));
}));
itemCount = result.length;
}
/** @type {?} */
const sortColumns = params.fields.filter((/**
* @param {?} column
* @return {?}
*/
(column) => {
return column.sortable && column.sortOrder !== '';
}));
if (sortColumns.length) {
/** @type {?} */
let orderedSortColumns = sortColumns;
if (sortColumns.length > 1) {
orderedSortColumns = sortColumns.concat().sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => {
return a.sortPriority - b.sortPriority;
}));
}
/** @type {?} */
const orderParams = orderedSortColumns.reduce((/**
* @param {?} accumulator
* @param {?} column
* @return {?}
*/
(accumulator, column) => {
if (accumulator) {
accumulator.fields.push(column.field);
accumulator.orders.push(column.sortOrder);
}
return accumulator;
}), {
fields: [],
orders: []
});
result = orderBy(result, orderParams.fields, orderParams.orders);
}
}
if (params.offset !== undefined) {
/** @type {?} */
const offset = params.offset + 1 > result.length ? 0 : params.offset;
if (params.limit === undefined) {
result = result.slice(offset, result.length);
}
else {
result = result.slice(offset, offset + params.limit);
}
}
return of({
items: result,
count: itemCount
});
})));
}
/**
* Extract data table filter options.
* @param {?} filterColumn Data table column component.
* @return {?} Filter options collection stream.
*/
extractFilterOptions(filterColumn) {
return this.itemDataStream.pipe(switchMap((/**
* @param {?} items
* @return {?}
*/
(items) => {
/** @type {?} */
const filteredItems = items
.reduce((/**
* @param {?} acc
* @param {?} item
* @param {?} index
* @return {?}
*/
(acc, item, index) => {
if (filterColumn.filterFieldMapper) {
return acc.concat(filterColumn.filterFieldMapper(item, index));
}
/** @type {?} */
const filterField = filterColumn.filterField || filterColumn.field;
/** @type {?} */
const filterValue = get(item, filterField);
acc.push({
key: filterValue,
value: filterValue
});
return acc;
}), [])
.filter((/**
* @param {?} value
* @param {?} index
* @param {?} self
* @return {?}
*/
(value, index, self) => {
return self.findIndex((/**
* @param {?} item
* @return {?}
*/
item => item.key === value.key)) === index;
}));
return of(filteredItems);
})));
}
/**
* Dispose client data source streams.
* @return {?}
*/
dispose() {
if (this.dataSourceSubscription) {
this.dataSourceSubscription.unsubscribe();
this.dataSourceSubscription = null;
}
if (this.itemDataStream && !this.itemDataStream.closed) {
this.itemDataStream.complete();
}
}
}
DataTableResourceService.decorators = [
{ type: Injectable }
];
if (false) {
/**
* @type {?}
* @private
*/
DataTableResourceService.prototype.itemDataStream;
/**
* @type {?}
* @private
*/
DataTableResourceService.prototype.dataSourceSubscription;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1yZXNvdXJjZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vb3JuYW1lbnR1bS8iLCJzb3VyY2VzIjpbImRhdGEtdGFibGUvc2VydmljZXMvZGF0YS10YWJsZS1yZXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBYyxhQUFhLEVBQWdCLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7Ozs7QUFhM0UsTUFBTSxPQUFPLHdCQUF3Qjs7Ozs7O0lBUTVCLGFBQWEsQ0FBQyxVQUEyQjtRQUM5QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFZixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRTtZQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGFBQWEsQ0FBTSxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBT00sS0FBSyxDQUFDLE1BQThCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQzdCLFNBQVM7Ozs7UUFBQyxDQUFDLEtBQVUsRUFBRSxFQUFFOztnQkFDbkIsU0FBUyxHQUFHLEtBQUssQ0FBQyxN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QUNoRTs7c0JBRUssV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLElBQUksWUFBWSxDQUFDLEtBQUs7O3NCQUM1RCxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUM7Z0JBQzFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7b0JBQ1AsR0FBRyxFQUFFLFdBQVc7b0JBQ2hCLEtBQUssRUFBRSxXQUFXO2lCQUNuQixDQUFDLENBQUM7Z0JBRUgsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEdBQUUsRUFBRSxDQUFDO2lCQUNMLE1BQU07Ozs7OztZQUFDLENBQUMsS0FBNEIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVM7Ozs7Z0JBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxHQUFHLEVBQUMsS0FBSyxLQUFLLENBQUM7WUFDbEUsQ0FBQyxFQUFDO1lBRUosT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxFQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7Ozs7O0lBS00sT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUU7WUFDdEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNoQztJQUNILENBQUM7OztZQTVKRixVQUFVOzs7Ozs7O0lBRVQsa0RBQTJDOzs7OztJQUMzQywwREFBNkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgb3JkZXJCeSwgZ2V0IH0gZnJvbSAnLi4vLi4vdXRpbGl0eS9zZXJ2aWNlcy9vYmplY3QtdXRpbGl0eS5jbGFzcyc7XG5cbmltcG9ydCB7IERhdGFUYWJsZVJlcXVlc3RQYXJhbXMgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS10YWJsZS1yZXF1ZXN0LXBhcmFtcy5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhVGFibGVRdWVyeVJlc3VsdCB9IGZyb20gJy4uL21vZGVscy9kYXRhLXRhYmxlLXF1ZXJ5LXJlc3VsdC5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJPcHRpb24gfSBmcm9tICcuLi9tb2RlbHMvZGF0YS10YWJsZS1maWx0ZXItb3B0aW9uLm1vZGVsJztcbmltcG9ydCB7IERhdGFUYWJsZVF1ZXJ5RmllbGQgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS10YWJsZS1xdWVyeS1maWVsZC5tb2RlbCc7XG5cbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZGF0YS10YWJsZS1jb2x1bW4vZGF0YS10YWJsZS1jb2x1bW4uY29tcG9uZW50JztcblxuLyoqXG4gKiBEYXRhIHRhYmxlIHJlc291cmNlIHNlcnZpY2U7IE1hbmFnZSBkYXRhIHRhYmxlIGNsaWVudCBzaWRlIGRhdGEgcXVlcnlpbmcuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVSZXNvdXJjZVNlcnZpY2U8VD4ge1xuICBwcml2YXRlIGl0ZW1EYXRhU3RyZWFtOiBSZXBsYXlTdWJqZWN0PFRbXT47XG4gIHByaXZhdGUgZGF0YVNvdXJjZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBTZXQgZGF0YSBzb3VyY2Ugc3RyZWFtIHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0gZGF0YVNvdXJjZSBEYXRhIHNvdXJjZSBzdHJlYW0uXG4gICAqL1xuICBwdWJsaWMgc2V0RGF0YVNvdXJjZShkYXRhU291cmNlOiBPYnNlcnZhYmxlPFRbXT4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2UoKTtcblxuICAgIGlmICh0aGlzLml0ZW1EYXRhU3RyZWFtICYmICF0aGlzLml0ZW1EYXRhU3RyZWFtLmNsb3NlZCkge1xuICAgICAgdGhpcy5pdGVtRGF0YVN0cmVhbS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbURhdGFTdHJlYW0gPSBuZXcgUmVwbGF5U3ViamVjdDxUW10+KDEpO1xuICAgIHRoaXMuZGF0YVNvdXJjZVN1YnNjcmlwdGlvbiA9IGRhdGFTb3VyY2Uuc3Vic2NyaWJlKChpdGVtczogVFtdKSA9PiB7XG4gICAgICB0aGlzLml0ZW1EYXRhU3RyZWFtLm5leHQoaXRlbXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IGl0ZW1zIGJ5IGRhdGEgdGFibGUgcmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSBwYXJhbXMgRGF0YSB0YWJsZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAgICogQHJldHVybiBRdWVyeSByZXN1bHQgc3RyZWFtLlxuICAgKi9cbiAgcHVibGljIHF1ZXJ5KHBhcmFtczogRGF0YVRhYmxlUmVxdWVzdFBhcmFtcyk6IE9ic2VydmFibGU8RGF0YVRhYmxlUXVlcnlSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtRGF0YVN0cmVhbS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChpdGVtczogVFtdKSA9PiB7XG4gICAgICAgIGxldCBpdGVtQ291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGxldCByZXN1bHQ6IFRbXSA9IGl0ZW1zLnNsaWNlKCk7XG5cbiAgICAgICAgaWYgKHBhcmFtcy5maWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyRmllbGRzID0gcGFyYW1zLmZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQuZmlsdGVyYWJsZSk7XG5cbiAgICAgICAgICBpZiAoZmlsdGVyRmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyRmllbGRzLmV2ZXJ5KChmaWx0ZXJDb2x1bW46IERhdGFUYWJsZVF1ZXJ5RmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyQ29sdW1uLmZpbHRlckV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJDb2x1bW4uZmlsdGVyRXhwcmVzc2lvbihpdGVtLCBmaWx0ZXJDb2x1bW4uZmllbGQsIGZpbHRlckNvbHVtbi5maWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlckNvbHVtbi5maWx0ZXJWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlckNvbHVtbi5maWx0ZXJWYWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBnZXQoaXRlbSwgZmlsdGVyQ29sdW1uLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJDb2x1bW4uZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyQ29sdW1uLmZpbHRlclZhbHVlLmxlbmd0aCA9PT0gMCB8fCBmaWx0ZXJDb2x1bW4uZmlsdGVyVmFsdWUuaW5jbHVkZXMoZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoZmllbGRWYWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IFN0cmluZyhmaWx0ZXJDb2x1bW4uZmlsdGVyVmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKGZpbHRlclZhbHVlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGl0ZW1Db3VudCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc29ydENvbHVtbnMgPSBwYXJhbXMuZmllbGRzLmZpbHRlcigoY29sdW1uOiBEYXRhVGFibGVRdWVyeUZpZWxkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0T3JkZXIgIT09ICcnO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHNvcnRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG9yZGVyZWRTb3J0Q29sdW1ucyA9IHNvcnRDb2x1bW5zO1xuICAgICAgICAgICAgaWYgKHNvcnRDb2x1bW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgb3JkZXJlZFNvcnRDb2x1bW5zID0gc29ydENvbHVtbnMuY29uY2F0KCkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnNvcnRQcmlvcml0eSAtIGIuc29ydFByaW9yaXR5O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb3JkZXJQYXJhbXMgPSBvcmRlcmVkU29ydENvbHVtbnMucmVkdWNlKChhY2N1bXVsYXRvcjogYW55LCBjb2x1bW46IERhdGFUYWJsZVF1ZXJ5RmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWNjdW11bGF0b3IpIHtcbiAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLmZpZWxkcy5wdXNoKGNvbHVtbi5maWVsZCk7XG4gICAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci5vcmRlcnMucHVzaChjb2x1bW4uc29ydE9yZGVyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgICAgICAgICAgIG9yZGVyczogW11cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmVzdWx0ID0gb3JkZXJCeShyZXN1bHQsIG9yZGVyUGFyYW1zLmZpZWxkcywgb3JkZXJQYXJhbXMub3JkZXJzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyYW1zLm9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyYW1zLm9mZnNldCArIDEgPiByZXN1bHQubGVuZ3RoID8gMCA6IHBhcmFtcy5vZmZzZXQ7XG5cbiAgICAgICAgICBpZiAocGFyYW1zLmxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZShvZmZzZXQsIHJlc3VsdC5sZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBwYXJhbXMubGltaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgaXRlbXM6IHJlc3VsdCxcbiAgICAgICAgICBjb3VudDogaXRlbUNvdW50XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgZGF0YSB0YWJsZSBmaWx0ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIGZpbHRlckNvbHVtbiBEYXRhIHRhYmxlIGNvbHVtbiBjb21wb25lbnQuXG4gICAqIEByZXR1cm4gRmlsdGVyIG9wdGlvbnMgY29sbGVjdGlvbiBzdHJlYW0uXG4gICAqL1xuICBwdWJsaWMgZXh0cmFjdEZpbHRlck9wdGlvbnMoZmlsdGVyQ29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpOiBPYnNlcnZhYmxlPERhdGFUYWJsZUZpbHRlck9wdGlvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbURhdGFTdHJlYW0ucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoaXRlbXM6IFRbXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zID0gaXRlbXNcbiAgICAgICAgICAucmVkdWNlKChhY2M6IERhdGFUYWJsZUZpbHRlck9wdGlvbltdLCBpdGVtOiBULCBpbmRleDogbnVtYmVyKTogRGF0YVRhYmxlRmlsdGVyT3B0aW9uW10gPT4ge1xuICAgICAgICAgICAgaWYgKGZpbHRlckNvbHVtbi5maWx0ZXJGaWVsZE1hcHBlcikge1xuICAgICAgICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChmaWx0ZXJDb2x1bW4uZmlsdGVyRmllbGRNYXBwZXIoaXRlbSwgaW5kZXgpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsdGVyRmllbGQgPSBmaWx0ZXJDb2x1bW4uZmlsdGVyRmllbGQgfHwgZmlsdGVyQ29sdW1uLmZpZWxkO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBnZXQoaXRlbSwgZmlsdGVyRmllbGQpO1xuICAgICAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgICAgICBrZXk6IGZpbHRlclZhbHVlLFxuICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyVmFsdWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIFtdKVxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlOiBEYXRhVGFibGVGaWx0ZXJPcHRpb24sIGluZGV4LCBzZWxmKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmtleSA9PT0gdmFsdWUua2V5KSA9PT0gaW5kZXg7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG9mKGZpbHRlcmVkSXRlbXMpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgY2xpZW50IGRhdGEgc291cmNlIHN0cmVhbXMuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhU291cmNlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZVN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXRlbURhdGFTdHJlYW0gJiYgIXRoaXMuaXRlbURhdGFTdHJlYW0uY2xvc2VkKSB7XG4gICAgICB0aGlzLml0ZW1EYXRhU3RyZWFtLmNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG4iXX0=