mm-m3-list
Version:
Created as a helper for H5-SDK in order to display a panel B of an M3 panel whether via Bookmark or SearchRequest. Do not use this library to load a transactional program or programs that will require to load thousands of data at one go. By default this
325 lines • 36 kB
JavaScript
import { Component, ViewChild, Input, EventEmitter, Output } from '@angular/core';
import { SohoDataGridComponent } from 'ids-enterprise-ng';
import { BehaviorSubject } from 'rxjs';
import { finalize } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@infor-up/m3-odin-angular";
import * as i2 from "ids-enterprise-ng";
import * as i3 from "@angular/common/http";
import * as i4 from "@angular/common";
class ProgramInstance {
constructor(formService, instanceId) {
this.formService = formService;
this.instanceId = instanceId;
}
executeCommand(commandType, commandValue, params) {
const request = {
commandType,
commandValue,
params,
instanceId: this.instanceId
};
return this.formService.executeRequest(request);
}
}
export class MMM3ListComponent {
constructor(formService, messageService, http) {
this.formService = formService;
this.messageService = messageService;
this.http = http;
/**
* Busy indicator
*/
this.isBusy = false;
/**
* Custom gridOptions. Column definitions will not be overrwitten
*/
this.gridOptions = undefined;
/**
* Columns to be ignored
*/
this.ignoredColumns = [];
/**
* Key-value pair to overwrite the column heading. Key would be the column name and value will be the overriding column label
*/
this.columnHeadings = {};
/**
* Flag if to add the default filterable column from bookmark
*/
this.useDefaultFilter = true;
/**
* List of columns that will have a filter
*/
this.filterables = [];
/**
* List of columns that are editable
*/
this.editables = [];
/**
* Number of page down request for a bookmark. Default would load upto 99 rows
*/
this.requestCount = 3;
/**
* If selection checkbox will be added as a column
*/
this.enableCheckbox = false;
/**
* Emits when first set of data has been loaded
*/
this.firstDataRetrieved = new EventEmitter();
/**
* Emits when data has been loaded
*/
this.dataRetrieved = new EventEmitter();
/**
* Subject and observable for shown records
*/
this.dataSubject$ = new BehaviorSubject([]);
this.data = this.dataSubject$.asObservable();
/**
* Will contain the complete data after all records has been loaded.
* Used for when the gridOption groupable is enabled
*/
this.allItems = [];
/**
* Default gridOptions
*/
this.defaultOptions = {
columns: [],
selectable: 'mixed',
disableRowDeactivation: true,
filterable: false,
paging: false,
rowHeight: 'short'
};
}
ngOnInit() {
this.allItems = [];
if (!this.gridOptions) {
this.gridOptions = this.defaultOptions;
}
else {
this.gridOptions = { ...this.defaultOptions, ...this.gridOptions };
}
}
onResponse(response) {
this.instanceId = response.instanceId;
if (response.result !== 0) {
this.onError(response);
return;
}
if (response.panel.list) {
const panel = response.panel;
const items = panel.list.items;
this.createColumns(panel);
this.allItems = [...this.allItems, ...items];
// Do not show initial data if groupable is used.
// All data needs to be retrieved before showing data.
if (!this.gridOptions.groupable) {
this.dataSubject$.next(items);
}
// Emit event that first set of records has been fetched
setTimeout(() => {
this.firstDataRetrieved.emit();
});
if (this.searchRequest) {
this.dataLoaded();
return;
}
if (this.bookmark && !this.searchRequest) {
if (items.length < 33) {
this.dataLoaded();
return;
}
const programInstance = new ProgramInstance(this.formService, this.instanceId);
this.loadAllRows(programInstance, 1);
}
}
else {
this.dataLoaded();
}
}
createColumns(panel) {
const columns = [];
if (this.gridOptions.columns.length === 0) {
if (this.enableCheckbox) {
columns.push({
id: 'selectionCheckbox',
sortable: false,
resizable: false,
width: 50,
formatter: Soho.Formatters.SelectionCheckbox,
align: 'center'
});
}
panel.list.columns.forEach((col) => {
if (this.ignoredColumns.indexOf(col.fullName) === -1) {
columns.push({
id: col.fullName,
field: col.fullName,
name: this.columnHeadings[col.fullName] ? this.columnHeadings[col.fullName] : col.header,
align: col.isRight ? 'right' : 'left',
filterType: col.positionField && this.useDefaultFilter || this.filterables.indexOf(col.fullName) > -1 ?
col.isRight ? 'integer' : 'text' : null,
editor: this.editables.indexOf(col.fullName) > -1 ? Soho.Editors.Input : null
});
}
});
if (this.additionalColumns) {
this.additionalColumns.forEach((column) => {
if (column.idx) {
columns.splice(column.idx, 0, column);
}
else {
columns.push(column);
}
});
}
this.dataGrid.updateColumns(columns, null);
}
}
/**
* Recursive funciton to load all rows
*/
loadAllRows(programInstance, count) {
if (count > this.requestCount) {
this.dataLoaded();
return;
}
programInstance.executeCommand('PAGE', 'DOWN').subscribe(response => {
const panel = response.panel;
if (panel.list.items.length === 0) {
this.dataLoaded();
return;
}
// Add new data to existing
const newItems = [...this.allItems, ...panel.list.items];
this.allItems = [...newItems];
if (!this.gridOptions.groupable) {
this.dataSubject$.next(newItems);
}
this.loadAllRows(programInstance, ++count);
});
}
openBookmark() {
this.allItems = [];
const defaultBookmark = {
isStateless: false,
values: {}
};
this.isBusy = true;
this.formService
.executeBookmark({ ...defaultBookmark, ...this.bookmark })
.subscribe((r) => this.onResponse(r), (r) => this.onError(r), () => {
if (!this.gridOptions.groupable) {
this.isBusy = false;
}
});
}
executeSearch() {
this.isBusy = true;
this.formService.executeSearch(this.searchRequest).subscribe((r) => {
this.onResponse(r);
}, (r) => {
this.onError(r);
}, () => {
this.isBusy = false;
});
}
selectedRows() {
const selectedRows = [];
this.dataGrid.selectedRows().forEach(item => {
selectedRows.push(item.data);
});
return selectedRows;
}
getItems() {
return this.dataGrid.dataset;
}
updateItems(items) {
this.dataSubject$.next(items);
}
dataLoaded() {
if (this.gridOptions.groupable) {
this.dataSubject$.next(this.allItems);
}
this.closeInstance();
}
closeInstance() {
this.formService
.executeCommand('CLOSE', this.instanceId)
.pipe(finalize(() => {
this.isBusy = false;
setTimeout(() => {
this.dataRetrieved.emit();
});
}))
.subscribe();
return;
}
onError(response) {
const message = response.message || 'Unable to open bookmark';
const buttons = [{ text: 'OK', click: (e, modal) => { modal.close(); } }];
this.messageService.error()
.title('Bookmark error')
.message(message)
.buttons(buttons)
.open();
}
}
MMM3ListComponent.ɵfac = function MMM3ListComponent_Factory(t) { return new (t || MMM3ListComponent)(i0.ɵɵdirectiveInject(i1.FormService), i0.ɵɵdirectiveInject(i2.SohoMessageService), i0.ɵɵdirectiveInject(i3.HttpClient)); };
MMM3ListComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MMM3ListComponent, selectors: [["mm-m3-list"]], viewQuery: function MMM3ListComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(SohoDataGridComponent, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dataGrid = _t.first);
} }, inputs: { bookmark: "bookmark", searchRequest: "searchRequest", gridOptions: "gridOptions", additionalColumns: "additionalColumns", ignoredColumns: "ignoredColumns", columnHeadings: "columnHeadings", useDefaultFilter: "useDefaultFilter", filterables: "filterables", editables: "editables", requestCount: "requestCount", enableCheckbox: "enableCheckbox" }, outputs: { firstDataRetrieved: "firstDataRetrieved", dataRetrieved: "dataRetrieved" }, decls: 3, vars: 6, consts: [["soho-busyindicator", "", 3, "activated", "displayDelay"], ["soho-datagrid", "", 3, "gridOptions", "data"]], template: function MMM3ListComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 0);
i0.ɵɵelement(1, "div", 1);
i0.ɵɵpipe(2, "async");
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵproperty("activated", ctx.isBusy)("displayDelay", 0);
i0.ɵɵadvance(1);
i0.ɵɵproperty("gridOptions", ctx.gridOptions)("data", i0.ɵɵpipeBind1(2, 4, ctx.data));
} }, dependencies: [i2.SohoBusyIndicatorDirective, i2.SohoDataGridComponent, i4.AsyncPipe], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MMM3ListComponent, [{
type: Component,
args: [{
selector: 'mm-m3-list',
template: `
<div soho-busyindicator [activated]="isBusy" [displayDelay]="0">
<div soho-datagrid [gridOptions]="gridOptions" [data]="data | async"></div>
</div>`
}]
}], function () { return [{ type: i1.FormService }, { type: i2.SohoMessageService }, { type: i3.HttpClient }]; }, { bookmark: [{
type: Input
}], searchRequest: [{
type: Input
}], gridOptions: [{
type: Input
}], additionalColumns: [{
type: Input
}], ignoredColumns: [{
type: Input
}], columnHeadings: [{
type: Input
}], useDefaultFilter: [{
type: Input
}], filterables: [{
type: Input
}], editables: [{
type: Input
}], requestCount: [{
type: Input
}], enableCheckbox: [{
type: Input
}], firstDataRetrieved: [{
type: Output
}], dataRetrieved: [{
type: Output
}], dataGrid: [{
type: ViewChild,
args: [SohoDataGridComponent]
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW0tbTMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tbS1tMy1saXN0L3NyYy9saWIvbW0tbTMtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHMUYsT0FBTyxFQUFFLHFCQUFxQixFQUFzQixNQUFNLG1CQUFtQixDQUFDO0FBRTlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFHMUMsTUFBTSxlQUFlO0lBR25CLFlBQVksV0FBd0IsRUFBRSxVQUFrQjtRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQsY0FBYyxDQUFDLFdBQW1CLEVBQUUsWUFBb0IsRUFBRSxNQUFlO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHO1lBQ2QsV0FBVztZQUNYLFlBQVk7WUFDWixNQUFNO1lBQ04sVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQVNELE1BQU0sT0FBTyxpQkFBaUI7SUF5RzVCLFlBQTZCLFdBQXdCLEVBQVUsY0FBa0MsRUFBVSxJQUFnQjtRQUE5RixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFvQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQVk7UUF4RzNIOztXQUVHO1FBQ0gsV0FBTSxHQUFHLEtBQUssQ0FBQztRQWlCZjs7V0FF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Qzs7a0ZBcFRVLGlCQUFpQjtvRUFBakIsaUJBQWlCO3VCQStFakIscUJBQXFCOzs7OztRQW5GaEMsOEJBQWdFO1FBQ2hFLHlCQUEyRTs7UUFDM0UsaUJBQU07O1FBRmtCLHNDQUFvQixtQkFBQTtRQUN6QixlQUEyQjtRQUEzQiw2Q0FBMkIsd0NBQUE7O3VGQUduQyxpQkFBaUI7Y0FQN0IsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSxZQUFZO2dCQUN0QixRQUFRLEVBQUU7OztTQUdIO2FBQ1I7d0hBZVUsUUFBUTtrQkFBaEIsS0FBSztZQUtHLGFBQWE7a0JBQXJCLEtBQUs7WUFLRyxXQUFXO2tCQUFuQixLQUFLO1lBS0csaUJBQWlCO2tCQUF6QixLQUFLO1lBS0csY0FBYztrQkFBdEIsS0FBSztZQUtHLGNBQWM7a0JBQXRCLEtBQUs7WUFLRyxnQkFBZ0I7a0JBQXhCLEtBQUs7WUFLRyxXQUFXO2tCQUFuQixLQUFLO1lBS0csU0FBUztrQkFBakIsS0FBSztZQUtHLFlBQVk7a0JBQXBCLEtBQUs7WUFLRyxjQUFjO2tCQUF0QixLQUFLO1lBS0ksa0JBQWtCO2tCQUEzQixNQUFNO1lBS0csYUFBYTtrQkFBdEIsTUFBTTtZQUsyQixRQUFRO2tCQUF6QyxTQUFTO21CQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJRm9ybVJlc3BvbnNlLCBJQm9va21hcmssIElTZWFyY2hSZXF1ZXN0LCBQYW5lbCB9IGZyb20gJ0BpbmZvci11cC9tMy1vZGluJztcclxuaW1wb3J0IHsgRm9ybVNlcnZpY2UgfSBmcm9tICdAaW5mb3ItdXAvbTMtb2Rpbi1hbmd1bGFyJztcclxuaW1wb3J0IHsgU29ob0RhdGFHcmlkQ29tcG9uZW50LCBTb2hvTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdpZHMtZW50ZXJwcmlzZS1uZyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5cclxuY2xhc3MgUHJvZ3JhbUluc3RhbmNlIHtcclxuICBmb3JtU2VydmljZTogRm9ybVNlcnZpY2U7XHJcbiAgaW5zdGFuY2VJZDogc3RyaW5nO1xyXG4gIGNvbnN0cnVjdG9yKGZvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSwgaW5zdGFuY2VJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZvcm1TZXJ2aWNlID0gZm9ybVNlcnZpY2U7XHJcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xyXG4gIH1cclxuXHJcbiAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZFR5cGU6IHN0cmluZywgY29tbWFuZFZhbHVlOiBzdHJpbmcsIHBhcmFtcz86IHN0cmluZyk6IE9ic2VydmFibGU8SUZvcm1SZXNwb25zZT4ge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgY29tbWFuZFR5cGUsXHJcbiAgICAgIGNvbW1hbmRWYWx1ZSxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmluc3RhbmNlSWRcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZm9ybVNlcnZpY2UuZXhlY3V0ZVJlcXVlc3QocmVxdWVzdCk7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ21tLW0zLWxpc3QnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgPGRpdiBzb2hvLWJ1c3lpbmRpY2F0b3IgW2FjdGl2YXRlZF09XCJpc0J1c3lcIiBbZGlzcGxheURlbGF5XT1cIjBcIj5cclxuICA8ZGl2IHNvaG8tZGF0YWdyaWQgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCIgW2RhdGFdPVwiZGF0YSB8IGFzeW5jXCI+PC9kaXY+XHJcbiAgPC9kaXY+YFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTU1NM0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8qKlxyXG4gICAqIEJ1c3kgaW5kaWNhdG9yXHJcbiAgICovXHJcbiAgaXNCdXN5ID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc3RhbmNlIGlkLiBXaWxsIGJlIHVzZWQgdG8gY2xvc2UgdGhlIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgYSBib29rbWFyayBsaXN0IGluIHRoZSBzZXJ2ZXJcclxuICAgKi9cclxuICBwcml2YXRlIGluc3RhbmNlSWQ6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQm9va21hcmsgZGVmaW5pdGlvbiB0byBvcGVuXHJcbiAgICovXHJcbiAgQElucHV0KCkgYm9va21hcms6IElCb29rbWFyaztcclxuXHJcbiAgLyoqXHJcbiAgICogU2VhcmNoIGRlZmluaXRpb24gdG8gb3BlblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNlYXJjaFJlcXVlc3Q6IElTZWFyY2hSZXF1ZXN0O1xyXG5cclxuICAvKipcclxuICAgKiBDdXN0b20gZ3JpZE9wdGlvbnMuIENvbHVtbiBkZWZpbml0aW9ucyB3aWxsIG5vdCBiZSBvdmVycndpdHRlblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGdyaWRPcHRpb25zOiBTb2hvRGF0YUdyaWRPcHRpb25zID0gdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBBZGRpdGlvbmFsIGNvbHVtbnNcclxuICAgKi9cclxuICBASW5wdXQoKSBhZGRpdGlvbmFsQ29sdW1uczogU29ob0RhdGFHcmlkQ29sdW1uW107XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbHVtbnMgdG8gYmUgaWdub3JlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGlnbm9yZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBLZXktdmFsdWUgcGFpciB0byBvdmVyd3JpdGUgdGhlIGNvbHVtbiBoZWFkaW5nLiBLZXkgd291bGQgYmUgdGhlIGNvbHVtbiBuYW1lIGFuZCB2YWx1ZSB3aWxsIGJlIHRoZSBvdmVycmlkaW5nIGNvbHVtbiBsYWJlbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNvbHVtbkhlYWRpbmdzID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIEZsYWcgaWYgdG8gYWRkIHRoZSBkZWZhdWx0IGZpbHRlcmFibGUgY29sdW1uIGZyb20gYm9va21hcmtcclxuICAgKi9cclxuICBASW5wdXQoKSB1c2VEZWZhdWx0RmlsdGVyID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogTGlzdCBvZiBjb2x1bW5zIHRoYXQgd2lsbCBoYXZlIGEgZmlsdGVyXHJcbiAgICovXHJcbiAgQElucHV0KCkgZmlsdGVyYWJsZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3Qgb2YgY29sdW1ucyB0aGF0IGFyZSBlZGl0YWJsZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGVkaXRhYmxlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogTnVtYmVyIG9mIHBhZ2UgZG93biByZXF1ZXN0IGZvciBhIGJvb2ttYXJrLiBEZWZhdWx0IHdvdWxkIGxvYWQgdXB0byA5OSByb3dzXHJcbiAgICovXHJcbiAgQElucHV0KCkgcmVxdWVzdENvdW50ID0gMztcclxuXHJcbiAgLyoqXHJcbiAgICogSWYgc2VsZWN0aW9uIGNoZWNrYm94IHdpbGwgYmUgYWRkZWQgYXMgYSBjb2x1bW5cclxuICAgKi9cclxuICBASW5wdXQoKSBlbmFibGVDaGVja2JveCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIGZpcnN0IHNldCBvZiBkYXRhIGhhcyBiZWVuIGxvYWRlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBmaXJzdERhdGFSZXRyaWV2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHdoZW4gZGF0YSBoYXMgYmVlbiBsb2FkZWRcclxuICAgKi9cclxuICBAT3V0cHV0KCkgZGF0YVJldHJpZXZlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGF0YSBncmlkIGluc3RhbmNlXHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZChTb2hvRGF0YUdyaWRDb21wb25lbnQpIGRhdGFHcmlkOiBTb2hvRGF0YUdyaWRDb21wb25lbnQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YmplY3QgYW5kIG9ic2VydmFibGUgZm9yIHNob3duIHJlY29yZHNcclxuICAgKi9cclxuICBwcml2YXRlIGRhdGFTdWJqZWN0JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xyXG4gIGRhdGEgPSB0aGlzLmRhdGFTdWJqZWN0JC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2lsbCBjb250YWluIHRoZSBjb21wbGV0ZSBkYXRhIGFmdGVyIGFsbCByZWNvcmRzIGhhcyBiZWVuIGxvYWRlZC5cclxuICAgKiBVc2VkIGZvciB3aGVuIHRoZSBncmlkT3B0aW9uIGdyb3VwYWJsZSBpcyBlbmFibGVkXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhbGxJdGVtcyA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBEZWZhdWx0IGdyaWRPcHRpb25zXHJcbiAgICovXHJcbiAgZGVmYXVsdE9wdGlvbnM6IFNvaG9EYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICBjb2x1bW5zOiBbXSwgICAgICAvLyBDYW5ub3QgYmUgb3ZlcndyaXR0ZW4gZnJvbSBoZXJlXHJcbiAgICBzZWxlY3RhYmxlOiAnbWl4ZWQnLFxyXG4gICAgZGlzYWJsZVJvd0RlYWN0aXZhdGlvbjogdHJ1ZSxcclxuICAgIGZpbHRlcmFibGU6IGZhbHNlLFxyXG4gICAgcGFnaW5nOiBmYWxzZSxcclxuICAgIHJvd0hlaWdodDogJ3Nob3J0J1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLCBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBTb2hvTWVzc2FnZVNlcnZpY2UsIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmFsbEl0ZW1zID0gW107XHJcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucyA9IHRoaXMuZGVmYXVsdE9wdGlvbnM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zID0gey4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsIC4uLnRoaXMuZ3JpZE9wdGlvbnN9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblJlc3BvbnNlKHJlc3BvbnNlOiBJRm9ybVJlc3BvbnNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmluc3RhbmNlSWQgPSByZXNwb25zZS5pbnN0YW5jZUlkO1xyXG5cclxuICAgIGlmIChyZXNwb25zZS5yZXN1bHQgIT09IDApIHtcclxuICAgICAgdGhpcy5vbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNwb25zZS5wYW5lbC5saXN0KSB7XHJcbiAgICAgIGNvbnN0IHBhbmVsID0gcmVzcG9uc2UucGFuZWw7XHJcbiAgICAgIGNvbnN0IGl0ZW1zID0gcGFuZWwubGlzdC5pdGVtcztcclxuXHJcbiAgICAgIHRoaXMuY3JlYXRlQ29sdW1ucyhwYW5lbCk7XHJcblxyXG4gICAgICB0aGlzLmFsbEl0ZW1zID0gWy4uLnRoaXMuYWxsSXRlbXMsIC4uLml0ZW1zXTtcclxuXHJcbiAgICAgIC8vIERvIG5vdCBzaG93IGluaXRpYWwgZGF0YSBpZiBncm91cGFibGUgaXMgdXNlZC5cclxuICAgICAgLy8gQWxsIGRhdGEgbmVlZHMgdG8gYmUgcmV0cmlldmVkIGJlZm9yZSBzaG93aW5nIGRhdGEuXHJcbiAgICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5ncm91cGFibGUpIHtcclxuICAgICAgICB0aGlzLmRhdGFTdWJqZWN0JC5uZXh0KGl0ZW1zKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRW1pdCBldmVudCB0aGF0IGZpcnN0IHNldCBvZiByZWNvcmRzIGhhcyBiZWVuIGZldGNoZWRcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maXJzdERhdGFSZXRyaWV2ZWQuZW1pdCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLmRhdGFMb2FkZWQoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmJvb2ttYXJrICYmICF0aGlzLnNlYXJjaFJlcXVlc3QpIHtcclxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIDwgMzMpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJvZ3JhbUluc3RhbmNlID0gbmV3IFByb2dyYW1JbnN0YW5jZSh0aGlzLmZvcm1TZXJ2aWNlLCB0aGlzLmluc3RhbmNlSWQpO1xyXG4gICAgICAgIHRoaXMubG9hZEFsbFJvd3MocHJvZ3JhbUluc3RhbmNlLCAxKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRhTG9hZGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNvbHVtbnMocGFuZWw6IFBhbmVsKSB7XHJcbiAgICBjb25zdCBjb2x1bW5zOiBTb2hvRGF0YUdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgaWYgKHRoaXMuZW5hYmxlQ2hlY2tib3gpIHtcclxuICAgICAgICBjb2x1bW5zLnB1c2goe1xyXG4gICAgICAgICAgaWQ6ICdzZWxlY3Rpb25DaGVja2JveCcsXHJcbiAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICByZXNpemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgd2lkdGg6IDUwLFxyXG4gICAgICAgICAgZm9ybWF0dGVyOiBTb2hvLkZvcm1hdHRlcnMuU2VsZWN0aW9uQ2hlY2tib3gsXHJcbiAgICAgICAgICBhbGlnbjogJ2NlbnRlcid9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcGFuZWwubGlzdC5jb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaWdub3JlZENvbHVtbnMuaW5kZXhPZihjb2wuZnVsbE5hbWUpID09PSAtMSkge1xyXG4gICAgICAgICAgY29sdW1ucy5wdXNoKHtcclxuICAgICAgICAgICAgaWQ6IGNvbC5mdWxsTmFtZSxcclxuICAgICAgICAgICAgZmllbGQ6IGNvbC5mdWxsTmFtZSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5jb2x1bW5IZWFkaW5nc1tjb2wuZnVsbE5hbWVdID8gdGhpcy5jb2x1bW5IZWFkaW5nc1tjb2wuZnVsbE5hbWVdIDogY29sLmhlYWRlcixcclxuICAgICAgICAgICAgYWxpZ246IGNvbC5pc1JpZ2h0ID8gJ3JpZ2h0JyA6ICdsZWZ0JyxcclxuICAgICAgICAgICAgZmlsdGVyVHlwZTogY29sLnBvc2l0aW9uRmllbGQgJiYgdGhpcy51c2VEZWZhdWx0RmlsdGVyIHx8IHRoaXMuZmlsdGVyYWJsZXMuaW5kZXhPZihjb2wuZnVsbE5hbWUpID4gLTEgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wuaXNSaWdodCA/ICdpbnRlZ2VyJyA6ICd0ZXh0JyA6IG51bGwsXHJcbiAgICAgICAgICAgIGVkaXRvcjogdGhpcy5lZGl0YWJsZXMuaW5kZXhPZihjb2wuZnVsbE5hbWUpID4gLTEgPyBTb2hvLkVkaXRvcnMuSW5wdXQgOiBudWxsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGhpcy5hZGRpdGlvbmFsQ29sdW1ucykge1xyXG4gICAgICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBTb2hvRGF0YUdyaWRDb2x1bW4gfCBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChjb2x1bW4uaWR4KSB7XHJcbiAgICAgICAgICAgIGNvbHVtbnMuc3BsaWNlKGNvbHVtbi5pZHgsIDAsIGNvbHVtbik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRhdGFHcmlkLnVwZGF0ZUNvbHVtbnMoY29sdW1ucywgbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWN1cnNpdmUgZnVuY2l0b24gdG8gbG9hZCBhbGwgcm93c1xyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZEFsbFJvd3MocHJvZ3JhbUluc3RhbmNlOiBQcm9ncmFtSW5zdGFuY2UsIGNvdW50OiBudW1iZXIpIHtcclxuICAgIGlmIChjb3VudCA+IHRoaXMucmVxdWVzdENvdW50KSB7XHJcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcHJvZ3JhbUluc3RhbmNlLmV4ZWN1dGVDb21tYW5kKCdQQUdFJywgJ0RPV04nKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICBjb25zdCBwYW5lbCA9IHJlc3BvbnNlLnBhbmVsO1xyXG4gICAgICBpZiAocGFuZWwubGlzdC5pdGVtcy5sZW5ndGggPT09IDApIHtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhTG9hZGVkKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBZGQgbmV3IGRhdGEgdG8gZXhpc3RpbmdcclxuICAgICAgY29uc3QgbmV3SXRlbXMgPSBbLi4udGhpcy5hbGxJdGVtcywgLi4ucGFuZWwubGlzdC5pdGVtc107XHJcblxyXG4gICAgICB0aGlzLmFsbEl0ZW1zID0gWy4uLm5ld0l0ZW1zXTtcclxuICAgICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmdyb3VwYWJsZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVN1YmplY3QkLm5leHQobmV3SXRlbXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvYWRBbGxSb3dzKHByb2dyYW1JbnN0YW5jZSwgKytjb3VudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9wZW5Cb29rbWFyaygpIHtcclxuICAgIHRoaXMuYWxsSXRlbXMgPSBbXTtcclxuICAgIGNvbnN0IGRlZmF1bHRCb29rbWFyazogSUJvb2ttYXJrID0ge1xyXG4gICAgICBpc1N0YXRlbGVzczogZmFsc2UsXHJcbiAgICAgIHZhbHVlczoge31cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pc0J1c3kgPSB0cnVlO1xyXG4gICAgdGhpcy5mb3JtU2VydmljZVxyXG4gICAgICAuZXhlY3V0ZUJvb2ttYXJrKHsuLi5kZWZhdWx0Qm9va21hcmssIC4uLnRoaXMuYm9va21hcmt9KVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBJRm9ybVJlc3BvbnNlKSA9PiB0aGlzLm9uUmVzcG9uc2UociksXHJcbiAgICAgICAgKHIpID0+IHRoaXMub25FcnJvcihyKSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuZ3JvdXBhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNCdXN5ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZXhlY3V0ZVNlYXJjaCgpIHtcclxuICAgIHRoaXMuaXNCdXN5ID0gdHJ1ZTtcclxuICAgIHRoaXMuZm9ybVNlcnZpY2UuZXhlY3V0ZVNlYXJjaCh0aGlzLnNlYXJjaFJlcXVlc3QpLnN1YnNjcmliZSgocjogSUZvcm1SZXNwb25zZSkgPT4ge1xyXG4gICAgICB0aGlzLm9uUmVzcG9uc2Uocik7XHJcbiAgICB9LCAocikgPT4ge1xyXG4gICAgICB0aGlzLm9uRXJyb3Iocik7XHJcbiAgICB9LCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNCdXN5ID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkUm93cygpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgdGhpcy5kYXRhR3JpZC5zZWxlY3RlZFJvd3MoKS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBzZWxlY3RlZFJvd3MucHVzaChpdGVtLmRhdGEpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRSb3dzO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhR3JpZC5kYXRhc2V0O1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSXRlbXMoaXRlbXM6IGFueSkge1xyXG4gICAgdGhpcy5kYXRhU3ViamVjdCQubmV4dChpdGVtcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRhdGFMb2FkZWQoKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5ncm91cGFibGUpIHtcclxuICAgICAgdGhpcy5kYXRhU3ViamVjdCQubmV4dCh0aGlzLmFsbEl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsb3NlSW5zdGFuY2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvc2VJbnN0YW5jZSgpIHtcclxuICAgIHRoaXMuZm9ybVNlcnZpY2VcclxuICAgICAgLmV4ZWN1dGVDb21tYW5kKCdDTE9TRScsIHRoaXMuaW5zdGFuY2VJZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0J1c3kgPSBmYWxzZTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFSZXRyaWV2ZWQuZW1pdCgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRXJyb3IocmVzcG9uc2U6IElGb3JtUmVzcG9uc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlIHx8ICdVbmFibGUgdG8gb3BlbiBib29rbWFyayc7XHJcbiAgICBjb25zdCBidXR0b25zID0gW3sgdGV4dDogJ09LJywgY2xpY2s6IChlOiBhbnksIG1vZGFsOiBhbnkpID0+IHsgbW9kYWwuY2xvc2UoKTsgfSB9XTtcclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoKVxyXG4gICAgLnRpdGxlKCdCb29rbWFyayBlcnJvcicpXHJcbiAgICAubWVzc2FnZShtZXNzYWdlKVxyXG4gICAgLmJ1dHRvbnMoYnV0dG9ucylcclxuICAgIC5vcGVuKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==