@sachin9822/reports-lib 0.0.209 → 0.0.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +13 -12
- package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +4 -3
- package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +1 -1
- package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +1 -1
- package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +700 -0
- package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +1 -1
- package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +3 -3
- package/esm2020/lib/components/funding-report/funding-report.component.mjs +3 -3
- package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +4 -3
- package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +3 -3
- package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +1 -1
- package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +311 -0
- package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +7 -6
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +1 -1
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +6 -0
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +5 -0
- package/esm2020/lib/reports-lib.module.mjs +15 -5
- package/esm2020/lib/services/report.service.mjs +62 -4
- package/esm2020/lib/shared/export-generic.service.mjs +10 -1
- package/esm2020/lib/shared/search-filter/search-filter.component.mjs +525 -189
- package/esm2020/public-api.mjs +5 -1
- package/fesm2015/sachin9822-reports-lib.mjs +1715 -330
- package/fesm2015/sachin9822-reports-lib.mjs.map +1 -1
- package/fesm2020/sachin9822-reports-lib.mjs +1721 -329
- package/fesm2020/sachin9822-reports-lib.mjs.map +1 -1
- package/lib/assets/images/Search.svg +9 -9
- package/lib/assets/svg-loaders/blue-tail-spin.svg +31 -31
- package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +78 -0
- package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +68 -0
- package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +1 -1
- package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +4 -0
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +13 -0
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +23 -0
- package/lib/reports-lib.module.d.ts +12 -10
- package/lib/services/report.service.d.ts +11 -1
- package/lib/shared/search-filter/search-filter.component.d.ts +7 -5
- package/package.json +1 -1
- package/public-api.d.ts +4 -0
|
@@ -0,0 +1,700 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { themeAlpine } from '@ag-grid-community/theming';
|
|
3
|
+
import { ComponentLoadingStates } from '../../models/component-loading-states';
|
|
4
|
+
import { GenericExportService } from '../../shared/export-generic.service';
|
|
5
|
+
// import { formatDate } from '@angular/common';
|
|
6
|
+
// import { ComponentLoadingStates } from 'src/app/models/component-loading-states';
|
|
7
|
+
// import { GenericExportService } from 'src/app/shared/export-generic.service';
|
|
8
|
+
// import { ExportOptions } from 'projects/reports-lib/src/lib/shared/export-generic.service';
|
|
9
|
+
// import { Injectable } from '@angular/core';
|
|
10
|
+
// import jsPDF from 'jspdf';
|
|
11
|
+
// import 'jspdf-autotable';
|
|
12
|
+
import * as ExcelJS from 'exceljs';
|
|
13
|
+
import * as FileSaver from 'file-saver';
|
|
14
|
+
import { formatDate } from '@angular/common';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../../services/report.service";
|
|
17
|
+
import * as i2 from "ag-grid-angular";
|
|
18
|
+
import * as i3 from "@angular/common";
|
|
19
|
+
import * as i4 from "../../shared/page-size-selector/page-size-selector.component";
|
|
20
|
+
import * as i5 from "../../shared/metadata/metadata.component";
|
|
21
|
+
import * as i6 from "@ng-bootstrap/ng-bootstrap";
|
|
22
|
+
import * as i7 from "../../shared/loader/loader.component";
|
|
23
|
+
import * as i8 from "../../shared/search-filter/search-filter.component";
|
|
24
|
+
export class BranchActivitySendSummaryReportComponent {
|
|
25
|
+
constructor(reportService, ngZone) {
|
|
26
|
+
this.reportService = reportService;
|
|
27
|
+
this.ngZone = ngZone;
|
|
28
|
+
this.dataMap = {};
|
|
29
|
+
this.filteredData = {};
|
|
30
|
+
this.proxyData = {};
|
|
31
|
+
this.selectedExportOption = 'excel';
|
|
32
|
+
this.gridApis = [];
|
|
33
|
+
this.user = "";
|
|
34
|
+
this.ComponentLoadingState = ComponentLoadingStates;
|
|
35
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
|
36
|
+
this.ReportName = "Branch Activity Send Summary";
|
|
37
|
+
this.exportService = inject(GenericExportService);
|
|
38
|
+
this.searchCriteria = [];
|
|
39
|
+
// flags
|
|
40
|
+
this.showMessage = false;
|
|
41
|
+
this.noDataFound = false;
|
|
42
|
+
this.isFormValid = false;
|
|
43
|
+
this.clearSearch = false;
|
|
44
|
+
this.isTotalSummary = false;
|
|
45
|
+
this.columnDefs = [
|
|
46
|
+
{
|
|
47
|
+
field: 'businessDateTime', headerName: 'Business Date', flex: 1, wrapText: true, autoHeight: true, headerClass: 'ag-left-aligned-header', minWidth: 70, width: 70, tooltipField: 'businessDateTime',
|
|
48
|
+
valueFormatter: (params) => {
|
|
49
|
+
const row = params.data;
|
|
50
|
+
if (row && row.payinCCcode === 'Total') {
|
|
51
|
+
return ''; // hide date for total row
|
|
52
|
+
}
|
|
53
|
+
return params.value;
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{ field: 'product', headerName: 'Product', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, width: 120, tooltipField: 'product' },
|
|
57
|
+
{ field: 'payoutCCcode', headerName: 'Receive Currency', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, width: 110, tooltipField: 'payoutCCcode' },
|
|
58
|
+
{ field: 'payoutAmount', headerName: 'Receive Amount', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 120, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payoutAmount' },
|
|
59
|
+
{ field: 'payinCCcode', headerName: 'Send Currency', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 90, tooltipField: 'payinCCcode' },
|
|
60
|
+
{ field: 'payinAmount', headerName: 'Send Amount', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 120, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payinAmount' },
|
|
61
|
+
{ field: 'transactionCommissionAmount', headerName: 'Service Fee', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'transactionCommissionAmount' },
|
|
62
|
+
{ field: 'tax', headerName: 'Tax', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'tax' },
|
|
63
|
+
{ field: 'totalPayinAmount', headerName: 'Total Send Amount', minWidth: 100, flex: 1, wrapText: true, autoHeight: true, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'totalPayinAmount' },
|
|
64
|
+
{ field: 'transactionCount', headerName: 'Transaction Count', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'txnCount' },
|
|
65
|
+
{ field: 'status', headerName: 'Transaction Status', minWidth: 100, flex: 1, wrapText: true, autoHeight: true, tooltipField: 'status' }
|
|
66
|
+
];
|
|
67
|
+
this.defaultColDef = {
|
|
68
|
+
sortable: true,
|
|
69
|
+
filter: true,
|
|
70
|
+
resizable: true,
|
|
71
|
+
minwidth: 40,
|
|
72
|
+
wrapHeaderText: true,
|
|
73
|
+
autoHeaderHeight: true,
|
|
74
|
+
suppressSizeToFit: false,
|
|
75
|
+
wrapText: true
|
|
76
|
+
};
|
|
77
|
+
// rowClassRules = {
|
|
78
|
+
// debugger
|
|
79
|
+
// 'total-row': params => params.data?.isTotalRow
|
|
80
|
+
// };
|
|
81
|
+
this.rowClassRules = {
|
|
82
|
+
'total-row': (params) => {
|
|
83
|
+
console.log('Row Data:', params.data.isTotalRow);
|
|
84
|
+
if (params.data.isTotalRow) {
|
|
85
|
+
return params.data?.isTotalRow;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
this.rowData = [];
|
|
90
|
+
this.reportTheme = themeAlpine.withParams({
|
|
91
|
+
headerFontSize: '10px',
|
|
92
|
+
fontFamily: ['Arial', 'sans-serif'],
|
|
93
|
+
fontSize: '9px'
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
ngOnInit() {
|
|
97
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
98
|
+
// Check if User is falcon user or fossilUser
|
|
99
|
+
if (sessionStorage.getItem('fossilusername')) {
|
|
100
|
+
this.sysUserId = sessionStorage.getItem('fossilusername');
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
this.sysUserId = sessionStorage.getItem('ezremitusername');
|
|
104
|
+
}
|
|
105
|
+
this.sysUserId = this.sysUserId.replace(/^["'](.*)["']$/, '$1');
|
|
106
|
+
this.user = this.sysUserId;
|
|
107
|
+
console.log("System User Id : " + this.sysUserId);
|
|
108
|
+
}
|
|
109
|
+
filter(text) {
|
|
110
|
+
this.searchText = text;
|
|
111
|
+
if (this.searchText == null) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (this.searchText?.length === 0) {
|
|
115
|
+
this.filteredData = structuredClone(this.dataMap);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
this.searchText = this.searchText?.trim()?.toLowerCase();
|
|
119
|
+
for (const [key, entries] of Object.entries(this.proxyData)) {
|
|
120
|
+
const filteredData = entries.filter(entry => Object.values(entry)
|
|
121
|
+
.some(val => {
|
|
122
|
+
let a = val?.toString().toLowerCase();
|
|
123
|
+
if (a == null) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
return a?.search(this.searchText) == -1 ? false : true;
|
|
127
|
+
}));
|
|
128
|
+
this.filteredData[key] = filteredData;
|
|
129
|
+
}
|
|
130
|
+
this.filteredData;
|
|
131
|
+
}
|
|
132
|
+
onGridReady(params, id) {
|
|
133
|
+
params.api.sizeColumnsToFit();
|
|
134
|
+
this.gridColumnApi = params.columnApi;
|
|
135
|
+
this.gridApis[id] = params.api;
|
|
136
|
+
params.columnApi.setColumnVisible('businessDateTime', !this.isTotalSummary);
|
|
137
|
+
params.api.sizeColumnsToFit();
|
|
138
|
+
}
|
|
139
|
+
handleExport(option) {
|
|
140
|
+
this.selectedExportOption = option;
|
|
141
|
+
if (!this.hasAnyGroups()) {
|
|
142
|
+
alert("There is no data to export based on your current filter.");
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// If no data, do nothing.
|
|
146
|
+
if (!this.filteredData || Object.keys(this.filteredData).length === 0) {
|
|
147
|
+
alert("No data to export");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const title = "Branch Activity Send Summary";
|
|
151
|
+
const reportTimeFormatter = this.dateValueFormatter('dd/MM/yyyy hh:mm a');
|
|
152
|
+
const metadata = [
|
|
153
|
+
['Report Period ', this.fromDate + " - " + this.toDate],
|
|
154
|
+
['Report User & Time', this.user ? this.user + " @ " + this.reportDate : '' + " @ " + this.reportDate],
|
|
155
|
+
];
|
|
156
|
+
// --- search criteria ---
|
|
157
|
+
const searchCriteria = this.searchCriteria;
|
|
158
|
+
//const columns = this.columnDefs;
|
|
159
|
+
//exclude Business Date col for Total Summary Report.
|
|
160
|
+
let columns = [...this.columnDefs];
|
|
161
|
+
const summaryReport = this.searchCriteria.find(x => x[0] === 'Summary Report:')?.[1];
|
|
162
|
+
if (summaryReport === 'Total Summary') {
|
|
163
|
+
columns = columns.filter(col => col.field !== 'businessDateTime');
|
|
164
|
+
}
|
|
165
|
+
// const data = this.dataMap;
|
|
166
|
+
const cleanedData = {};
|
|
167
|
+
Object.keys(this.dataMap).forEach(key => {
|
|
168
|
+
cleanedData[key] = this.dataMap[key].map(row => {
|
|
169
|
+
if (row.isTotalRow) {
|
|
170
|
+
return {
|
|
171
|
+
...row,
|
|
172
|
+
businessDateTime: '',
|
|
173
|
+
product: '',
|
|
174
|
+
receiveCurrency: '',
|
|
175
|
+
receiveAmount: ''
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return row;
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
const data = cleanedData;
|
|
182
|
+
const options = {
|
|
183
|
+
currencyFields: [
|
|
184
|
+
'payoutAmount', 'payinAmount', 'transactionCommissionAmount', 'tax', 'totalPayinAmount'
|
|
185
|
+
],
|
|
186
|
+
// specify all date fields expected
|
|
187
|
+
dateFields: [],
|
|
188
|
+
dateFieldFormats: {
|
|
189
|
+
txnDateAndTime: 'dd/MM/yyyy hh:mm a',
|
|
190
|
+
cancellationBranchDateTime: 'dd/MM/yyyy HH:mm',
|
|
191
|
+
cancellationBusinessDate: 'dd/MM/yyyy'
|
|
192
|
+
},
|
|
193
|
+
specialDecimalFields: {
|
|
194
|
+
rate: 8 // future field with 8 decimal places
|
|
195
|
+
},
|
|
196
|
+
groupByKey: true
|
|
197
|
+
};
|
|
198
|
+
switch (this.selectedExportOption) {
|
|
199
|
+
case 'excel':
|
|
200
|
+
this.exportToExcel({ title, metadata, searchCriteria, columns, data, options });
|
|
201
|
+
break;
|
|
202
|
+
case 'pdf':
|
|
203
|
+
this.exportService.exportToPdf({ title, metadata, searchCriteria, columns, data, options });
|
|
204
|
+
break;
|
|
205
|
+
case 'csv':
|
|
206
|
+
this.exportService.exportToCsv({ title, metadata, searchCriteria, columns, data, options });
|
|
207
|
+
break;
|
|
208
|
+
default:
|
|
209
|
+
alert("Please select an export format.");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async exportToExcel({ title, metadata, searchCriteria, columns, data, options = {} }) {
|
|
213
|
+
const workbook = new ExcelJS.Workbook();
|
|
214
|
+
const worksheet = workbook.addWorksheet(title);
|
|
215
|
+
// ===================== PRE CALC =====================
|
|
216
|
+
const headerLabels = ['Sr No', ...columns.map(col => col.headerName || col.field)];
|
|
217
|
+
const totalCols = headerLabels.length;
|
|
218
|
+
const titleStartCol = 4;
|
|
219
|
+
const titleColLetter = String.fromCharCode(64 + titleStartCol);
|
|
220
|
+
const titleMergeEnd = String.fromCharCode(64 + totalCols);
|
|
221
|
+
// ===================== LOGO =====================
|
|
222
|
+
if (this.logoBase64) {
|
|
223
|
+
const base64Data = this.logoBase64.replace(/^data:image\/\w+;base64,/, '');
|
|
224
|
+
const imageId = workbook.addImage({
|
|
225
|
+
base64: base64Data,
|
|
226
|
+
extension: 'png',
|
|
227
|
+
});
|
|
228
|
+
worksheet.addImage(imageId, {
|
|
229
|
+
tl: { col: 0, row: 0 },
|
|
230
|
+
ext: { width: 145, height: 66 }
|
|
231
|
+
});
|
|
232
|
+
worksheet.getRow(1).height = 24;
|
|
233
|
+
worksheet.getRow(2).height = 22;
|
|
234
|
+
worksheet.getRow(3).height = 22;
|
|
235
|
+
}
|
|
236
|
+
// ===================== TITLE =====================
|
|
237
|
+
worksheet.mergeCells(`${titleColLetter}1:${titleMergeEnd}1`);
|
|
238
|
+
const titleCell = worksheet.getRow(1).getCell(titleStartCol);
|
|
239
|
+
titleCell.value = title;
|
|
240
|
+
titleCell.font = { bold: true, size: 16 };
|
|
241
|
+
titleCell.alignment = { vertical: 'middle', horizontal: 'left' };
|
|
242
|
+
// ===================== METADATA =====================
|
|
243
|
+
let metaRowStart = 4;
|
|
244
|
+
metadata.forEach(([label, value], idx) => {
|
|
245
|
+
const row = worksheet.getRow(metaRowStart + idx);
|
|
246
|
+
row.getCell(1).value = {
|
|
247
|
+
richText: [
|
|
248
|
+
{ text: `${label} : `, font: { bold: true } },
|
|
249
|
+
{ text: value ?? '', font: { bold: false } }
|
|
250
|
+
]
|
|
251
|
+
};
|
|
252
|
+
worksheet.mergeCells(`A${row.number}:${titleMergeEnd}${row.number}`);
|
|
253
|
+
});
|
|
254
|
+
let currentRow = metaRowStart + metadata.length;
|
|
255
|
+
worksheet.getRow(++currentRow).height = 6;
|
|
256
|
+
currentRow++;
|
|
257
|
+
// ===================== SEARCH CRITERIA =====================
|
|
258
|
+
worksheet.mergeCells(currentRow, 1, currentRow, 6);
|
|
259
|
+
worksheet.getCell(currentRow, 1).value = 'Search Criteria:-';
|
|
260
|
+
worksheet.getCell(currentRow, 1).font = { bold: true };
|
|
261
|
+
currentRow += 2;
|
|
262
|
+
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
263
|
+
const left = searchCriteria[i];
|
|
264
|
+
const right = searchCriteria[i + 1];
|
|
265
|
+
const row = worksheet.getRow(currentRow++);
|
|
266
|
+
worksheet.mergeCells(row.number, 1, row.number, 3);
|
|
267
|
+
row.getCell(1).value = {
|
|
268
|
+
richText: [
|
|
269
|
+
{ text: (left?.[0] ?? '') + ' ', font: { bold: true } },
|
|
270
|
+
{ text: left?.[1] ?? '' }
|
|
271
|
+
]
|
|
272
|
+
};
|
|
273
|
+
row.getCell(1).alignment = { wrapText: true, vertical: 'middle' };
|
|
274
|
+
if (right) {
|
|
275
|
+
worksheet.mergeCells(row.number, 4, row.number, 6);
|
|
276
|
+
row.getCell(4).value = {
|
|
277
|
+
richText: [
|
|
278
|
+
{ text: (right?.[0] ?? '') + ' ', font: { bold: true } },
|
|
279
|
+
{ text: right?.[1] ?? '' }
|
|
280
|
+
]
|
|
281
|
+
};
|
|
282
|
+
row.getCell(4).alignment = { wrapText: true, vertical: 'middle' };
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
currentRow++;
|
|
286
|
+
// ===================== HEADER ROW =====================
|
|
287
|
+
const headerRow = worksheet.getRow(currentRow++);
|
|
288
|
+
headerLabels.forEach((header, i) => {
|
|
289
|
+
const cell = headerRow.getCell(i + 1);
|
|
290
|
+
cell.value = header;
|
|
291
|
+
cell.font = { bold: true };
|
|
292
|
+
cell.fill = {
|
|
293
|
+
type: 'pattern',
|
|
294
|
+
pattern: 'solid',
|
|
295
|
+
fgColor: { argb: 'D9D9D9' }
|
|
296
|
+
};
|
|
297
|
+
cell.alignment = { vertical: 'middle', horizontal: 'center' };
|
|
298
|
+
cell.border = {
|
|
299
|
+
top: { style: 'thin' },
|
|
300
|
+
bottom: { style: 'thin' },
|
|
301
|
+
left: { style: 'thin' },
|
|
302
|
+
right: { style: 'thin' }
|
|
303
|
+
};
|
|
304
|
+
});
|
|
305
|
+
headerRow.eachCell((cell) => {
|
|
306
|
+
if (cell.value === 'Transaction Count') {
|
|
307
|
+
cell.value = 'Transaction\nCount';
|
|
308
|
+
cell.alignment = {
|
|
309
|
+
horizontal: 'center',
|
|
310
|
+
vertical: 'middle',
|
|
311
|
+
wrapText: true
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
// ===================== DATA SECTION =====================
|
|
316
|
+
let rowIdx = currentRow;
|
|
317
|
+
let serialNumber = 1;
|
|
318
|
+
if (options.groupByKey && !Array.isArray(data)) {
|
|
319
|
+
for (const [group, items] of Object.entries(data)) {
|
|
320
|
+
const groupRow = worksheet.getRow(rowIdx++);
|
|
321
|
+
groupRow.getCell(1).value = group;
|
|
322
|
+
groupRow.font = { bold: true };
|
|
323
|
+
worksheet.mergeCells(`A${groupRow.number}:${titleMergeEnd}${groupRow.number}`);
|
|
324
|
+
items.forEach((item) => {
|
|
325
|
+
const rowData = this.prepareTableRows([item], columns, options)[0];
|
|
326
|
+
const dataRow = worksheet.getRow(rowIdx++);
|
|
327
|
+
const fullRow = [
|
|
328
|
+
!item?.isTotalRow ? serialNumber++ : '',
|
|
329
|
+
...rowData
|
|
330
|
+
];
|
|
331
|
+
fullRow.forEach((val, cIdx) => {
|
|
332
|
+
const cell = dataRow.getCell(cIdx + 1);
|
|
333
|
+
// cell.value = val;
|
|
334
|
+
//added by bharati for
|
|
335
|
+
const field = columns[cIdx - 1]?.field;
|
|
336
|
+
// ✅ Amount fields (Receive Amount, Send Amount, Total Send Amount etc.)
|
|
337
|
+
/*
|
|
338
|
+
if (
|
|
339
|
+
field=='totalPayinAmount'||
|
|
340
|
+
field=='payinAmount'||
|
|
341
|
+
field === 'transactionCommissionAmount' ||
|
|
342
|
+
field === 'tax'
|
|
343
|
+
) {
|
|
344
|
+
if (val !== '' && val !== null && val !== undefined) {
|
|
345
|
+
cell.value = Number(val);
|
|
346
|
+
cell.numFmt = '#,##0.000';
|
|
347
|
+
cell.alignment = { horizontal: 'right', vertical: 'middle' };
|
|
348
|
+
} else {
|
|
349
|
+
cell.value = '';
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
cell.value = val;
|
|
354
|
+
} */
|
|
355
|
+
if (item?.isTotalRow && field === 'receiveAmount') {
|
|
356
|
+
cell.value = '';
|
|
357
|
+
}
|
|
358
|
+
else if (field?.toLowerCase().includes('amount') ||
|
|
359
|
+
field === 'serviceFee' ||
|
|
360
|
+
field === 'tax') {
|
|
361
|
+
if (val !== '' && val !== null && val !== undefined) {
|
|
362
|
+
cell.value = val; // already number
|
|
363
|
+
cell.numFmt = '#,##0.000'; // Excel formatting
|
|
364
|
+
cell.alignment = { horizontal: 'right', vertical: 'middle' };
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
cell.value = '';
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
cell.value = val;
|
|
372
|
+
}
|
|
373
|
+
cell.border = {
|
|
374
|
+
top: { style: 'thin' },
|
|
375
|
+
bottom: { style: 'thin' },
|
|
376
|
+
left: { style: 'thin' },
|
|
377
|
+
right: { style: 'thin' }
|
|
378
|
+
};
|
|
379
|
+
});
|
|
380
|
+
if (item?.isTotalRow) {
|
|
381
|
+
dataRow.eachCell(cell => {
|
|
382
|
+
cell.font = {
|
|
383
|
+
...cell.font,
|
|
384
|
+
bold: true,
|
|
385
|
+
size: 12
|
|
386
|
+
};
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
this.prepareTableRows(data, columns, options)
|
|
394
|
+
.forEach((rowData, index) => {
|
|
395
|
+
const dataRow = worksheet.getRow(rowIdx++);
|
|
396
|
+
const originalItem = data[index];
|
|
397
|
+
const fullRow = [
|
|
398
|
+
!originalItem?.isTotalRow ? serialNumber++ : '',
|
|
399
|
+
...rowData
|
|
400
|
+
];
|
|
401
|
+
fullRow.forEach((val, cIdx) => {
|
|
402
|
+
const cell = dataRow.getCell(cIdx + 1);
|
|
403
|
+
//cell.value = val;
|
|
404
|
+
/* if (cIdx === 0) {
|
|
405
|
+
cell.value = val;
|
|
406
|
+
} else {
|
|
407
|
+
|
|
408
|
+
const field = columns[cIdx - 1]?.field;
|
|
409
|
+
|
|
410
|
+
if (
|
|
411
|
+
field=='totalPayinAmount'||
|
|
412
|
+
field=='payinAmount'||
|
|
413
|
+
field === 'transactionCommissionAmount' ||
|
|
414
|
+
field === 'tax'
|
|
415
|
+
) {
|
|
416
|
+
cell.value = Number(val);
|
|
417
|
+
cell.numFmt = '#,##0.000';
|
|
418
|
+
cell.alignment = { horizontal: 'right', vertical: 'middle' };
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
cell.value = val;
|
|
422
|
+
}
|
|
423
|
+
} */
|
|
424
|
+
const field = columns[cIdx - 1]?.field;
|
|
425
|
+
if (cIdx === 0) {
|
|
426
|
+
cell.value = val;
|
|
427
|
+
}
|
|
428
|
+
else if (originalItem?.isTotalRow && field === 'receiveAmount') {
|
|
429
|
+
cell.value = '';
|
|
430
|
+
}
|
|
431
|
+
else if (field?.toLowerCase().includes('amount') ||
|
|
432
|
+
field === 'serviceFee' ||
|
|
433
|
+
field === 'tax') {
|
|
434
|
+
if (val !== '' && val !== null && val !== undefined) {
|
|
435
|
+
cell.value = val; // already number
|
|
436
|
+
cell.numFmt = '#,##0.000'; // Excel formatting
|
|
437
|
+
cell.alignment = { horizontal: 'right', vertical: 'middle' };
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
cell.value = '';
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
cell.value = val;
|
|
445
|
+
}
|
|
446
|
+
cell.border = {
|
|
447
|
+
top: { style: 'thin' },
|
|
448
|
+
bottom: { style: 'thin' },
|
|
449
|
+
left: { style: 'thin' },
|
|
450
|
+
right: { style: 'thin' }
|
|
451
|
+
};
|
|
452
|
+
});
|
|
453
|
+
if (originalItem?.isTotalRow) {
|
|
454
|
+
dataRow.eachCell(cell => {
|
|
455
|
+
cell.font = {
|
|
456
|
+
...cell.font,
|
|
457
|
+
bold: true,
|
|
458
|
+
size: 12
|
|
459
|
+
};
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
// ===================== AUTO WIDTH =====================
|
|
465
|
+
for (let i = 1; i <= totalCols; i++) {
|
|
466
|
+
let maxLength = 10;
|
|
467
|
+
worksheet.eachRow({ includeEmpty: true }, (row) => {
|
|
468
|
+
const cell = row.getCell(i);
|
|
469
|
+
if (cell.isMerged)
|
|
470
|
+
return;
|
|
471
|
+
let cellValue = '';
|
|
472
|
+
if (cell.value == null) {
|
|
473
|
+
cellValue = '';
|
|
474
|
+
}
|
|
475
|
+
else if (typeof cell.value === 'object' && 'richText' in cell.value) {
|
|
476
|
+
cellValue = cell.value.richText.map(rt => rt.text).join('');
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
cellValue = cell.value.toString();
|
|
480
|
+
}
|
|
481
|
+
maxLength = Math.max(maxLength, cellValue.length);
|
|
482
|
+
});
|
|
483
|
+
worksheet.getColumn(i).width = Math.min(maxLength, 50);
|
|
484
|
+
}
|
|
485
|
+
//new code:bharati
|
|
486
|
+
worksheet.columns.forEach((column, index) => {
|
|
487
|
+
if (index === 0)
|
|
488
|
+
return; // skip Sr No
|
|
489
|
+
const field = columns[index - 1]?.field;
|
|
490
|
+
if (field === 'payinAmount') {
|
|
491
|
+
column.width = 14;
|
|
492
|
+
}
|
|
493
|
+
if (field === 'payoutAmount') {
|
|
494
|
+
column.width = 15;
|
|
495
|
+
}
|
|
496
|
+
if (field === 'transactionCount') {
|
|
497
|
+
column.width = 14;
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
// worksheet.columns.forEach((column) => {
|
|
501
|
+
// if (column.header === 'Send Amount') {
|
|
502
|
+
// column.width = 25;
|
|
503
|
+
// }
|
|
504
|
+
// });
|
|
505
|
+
// ===================== SAVE FILE =====================
|
|
506
|
+
const buffer = await workbook.xlsx.writeBuffer();
|
|
507
|
+
FileSaver.saveAs(new Blob([buffer], {
|
|
508
|
+
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
509
|
+
}), title.replace(/\s/g, '-') + '.xlsx');
|
|
510
|
+
}
|
|
511
|
+
// private prepareTableRows(data: any[], columns: any[], options: ExportOptions = {}): any[][] {
|
|
512
|
+
// const {
|
|
513
|
+
// excludeFields = [],
|
|
514
|
+
// currencyFields = [],
|
|
515
|
+
// dateFields = [],
|
|
516
|
+
// dateFieldFormats = {},
|
|
517
|
+
// specialDecimalFields = {}
|
|
518
|
+
// } = options;
|
|
519
|
+
// const filtered = columns.filter(c =>
|
|
520
|
+
// c.field && !excludeFields.some(f => c.field.toLowerCase().includes(f))
|
|
521
|
+
// );
|
|
522
|
+
// return data.map((row) => ([
|
|
523
|
+
// ...filtered.map(col => {
|
|
524
|
+
// let value = row[col.field];
|
|
525
|
+
// // Format date fields with custom formats if specified
|
|
526
|
+
// if (col.field && (dateFields.includes(col.field) || col.field in dateFieldFormats)) {
|
|
527
|
+
// const format = dateFieldFormats[col.field] || 'dd/MM/yyyy';
|
|
528
|
+
// value = this.formatDateByFormat(value, format);
|
|
529
|
+
// }
|
|
530
|
+
// // Format special decimal fields with specific decimals
|
|
531
|
+
// else if (col.field && col.field in specialDecimalFields && value != null) {
|
|
532
|
+
// const decimals = specialDecimalFields[col.field];
|
|
533
|
+
// value = parseFloat(value).toFixed(decimals);
|
|
534
|
+
// }
|
|
535
|
+
// // Format regular currency fields with 3 decimals
|
|
536
|
+
// else if (col.field && currencyFields.includes(col.field) && value != null) {
|
|
537
|
+
// value = parseFloat(value).toFixed(3);
|
|
538
|
+
// }
|
|
539
|
+
// return value ?? '';
|
|
540
|
+
// })
|
|
541
|
+
// ]));
|
|
542
|
+
// }
|
|
543
|
+
prepareTableRows(data, columns, options = {}) {
|
|
544
|
+
const { excludeFields = [], currencyFields = [], dateFields = [], dateFieldFormats = {}, specialDecimalFields = {} } = options;
|
|
545
|
+
const filtered = columns.filter(c => c.field && !excludeFields.some(f => c.field.toLowerCase().includes(f)));
|
|
546
|
+
return data.map((row) => ([
|
|
547
|
+
...filtered.map(col => {
|
|
548
|
+
let value = row[col.field];
|
|
549
|
+
// ✅ Date formatting (keep as string)
|
|
550
|
+
if (col.field &&
|
|
551
|
+
(dateFields.includes(col.field) || col.field in dateFieldFormats)) {
|
|
552
|
+
const format = dateFieldFormats[col.field] || 'dd/MM/yyyy';
|
|
553
|
+
value = this.formatDateByFormat(value, format);
|
|
554
|
+
}
|
|
555
|
+
// ✅ Special decimal fields → return NUMBER (no toFixed)
|
|
556
|
+
else if (col.field &&
|
|
557
|
+
col.field in specialDecimalFields &&
|
|
558
|
+
value != null) {
|
|
559
|
+
value = Number(value);
|
|
560
|
+
}
|
|
561
|
+
// ✅ Currency fields → return NUMBER (no toFixed)
|
|
562
|
+
else if (col.field &&
|
|
563
|
+
currencyFields.includes(col.field) &&
|
|
564
|
+
value != null) {
|
|
565
|
+
value = Number(value);
|
|
566
|
+
}
|
|
567
|
+
return value ?? '';
|
|
568
|
+
})
|
|
569
|
+
]));
|
|
570
|
+
}
|
|
571
|
+
formatDateByFormat(val, format) {
|
|
572
|
+
// Helper to pad single digits
|
|
573
|
+
const pad = (n) => n.toString().padStart(2, '0');
|
|
574
|
+
// Parse date for "DD/MM/YYYY hh:mm AM/PM" format manually
|
|
575
|
+
if (typeof val === 'string' && /^\d{2}\/\d{2}\/\d{4} \d{2}:\d{2} [AP]M$/.test(val)) {
|
|
576
|
+
const parts = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}) ([AP]M)$/);
|
|
577
|
+
if (!parts)
|
|
578
|
+
return '';
|
|
579
|
+
let [, dd, mm, yyyy, hh, min, ampm] = parts;
|
|
580
|
+
let hours = parseInt(hh, 10);
|
|
581
|
+
if (ampm === 'PM' && hours !== 12)
|
|
582
|
+
hours += 12;
|
|
583
|
+
if (ampm === 'AM' && hours === 12)
|
|
584
|
+
hours = 0;
|
|
585
|
+
val = new Date(parseInt(yyyy, 10), parseInt(mm, 10) - 1, parseInt(dd, 10), hours, parseInt(min, 10));
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
val = new Date(val);
|
|
589
|
+
}
|
|
590
|
+
if (isNaN(val.getTime()))
|
|
591
|
+
return '';
|
|
592
|
+
const dt = val;
|
|
593
|
+
switch (format) {
|
|
594
|
+
case 'dd/MM/yyyy hh:mm a': { // 11/07/2025 10:56 PM
|
|
595
|
+
let hours12 = dt.getHours() % 12 || 12;
|
|
596
|
+
let ampm = dt.getHours() >= 12 ? 'PM' : 'AM';
|
|
597
|
+
return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()} ${pad(hours12)}:${pad(dt.getMinutes())} ${ampm}`;
|
|
598
|
+
}
|
|
599
|
+
case 'dd/MM/yyyy HH:mm': { // 28/07/2025 13:08
|
|
600
|
+
return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()} ${pad(dt.getHours())}:${pad(dt.getMinutes())}`;
|
|
601
|
+
}
|
|
602
|
+
case 'dd/MM/yyyy': { // 28/07/2025
|
|
603
|
+
return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()}`;
|
|
604
|
+
}
|
|
605
|
+
default:
|
|
606
|
+
return dt.toLocaleString();
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
dateValueFormatter(format) {
|
|
610
|
+
return (params) => {
|
|
611
|
+
if (!params.value)
|
|
612
|
+
return '';
|
|
613
|
+
try {
|
|
614
|
+
return formatDate(params.value, format, 'en-US');
|
|
615
|
+
}
|
|
616
|
+
catch {
|
|
617
|
+
return '';
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
getKeys(obj) {
|
|
622
|
+
return obj ? Object.keys(obj) : [];
|
|
623
|
+
}
|
|
624
|
+
hasAnyGroups() {
|
|
625
|
+
return this.filteredData && this.getKeys(this.filteredData).length > 0;
|
|
626
|
+
}
|
|
627
|
+
formatAmount(params) {
|
|
628
|
+
const value = params?.value;
|
|
629
|
+
if (value !== null && value !== undefined && value !== '') {
|
|
630
|
+
const num = Number(value);
|
|
631
|
+
return (Math.trunc(num * 1000) / 1000).toFixed(3);
|
|
632
|
+
}
|
|
633
|
+
return '';
|
|
634
|
+
}
|
|
635
|
+
handleSearch(criteria) {
|
|
636
|
+
this.searchCriteria = criteria.searchCriteria;
|
|
637
|
+
this.reportDate = new Date().toISOString();
|
|
638
|
+
this.reportDate = formatDate(this.reportDate, 'dd/MM/yyyy hh:mm a', 'en-US');
|
|
639
|
+
const modal = criteria.modal;
|
|
640
|
+
this.user = criteria.sysUserID;
|
|
641
|
+
this.fromDate = formatDate(modal.fromDate, 'dd/MM/yyyy hh:mm a', 'en-US').slice(0, 10);
|
|
642
|
+
this.toDate = formatDate(modal.toDate, 'dd/MM/yyyy hh:mm a', 'en-US').slice(0, 10);
|
|
643
|
+
console.log(modal);
|
|
644
|
+
// Code For Meta Data
|
|
645
|
+
this.leftData = {
|
|
646
|
+
'Report Period': this.fromDate + " - " + this.toDate,
|
|
647
|
+
};
|
|
648
|
+
this.metaDataTwo = {
|
|
649
|
+
'Report User & Time': this.user + " @ " + this.reportDate,
|
|
650
|
+
};
|
|
651
|
+
const isTotalSummary = modal.summaryReport === 'Total Summary';
|
|
652
|
+
this.isTotalSummary = isTotalSummary;
|
|
653
|
+
const searchData = {
|
|
654
|
+
"StartDate": modal.fromDate,
|
|
655
|
+
"EndDate": modal.toDate,
|
|
656
|
+
"SendCountryCode": modal.sendCountry,
|
|
657
|
+
"RecvCountryCode": modal.receiveCountry,
|
|
658
|
+
"BusinessPartnerCode": modal.client,
|
|
659
|
+
"TransactionStatus": modal.transactionStatus.join(","),
|
|
660
|
+
"PayoutCurrency": modal.receiveCurrency,
|
|
661
|
+
"TransactionType": modal.product,
|
|
662
|
+
"BranchCode": modal.branch,
|
|
663
|
+
"SummaryReport": modal.summaryReport
|
|
664
|
+
};
|
|
665
|
+
this.showMessage = true;
|
|
666
|
+
this.clearSearch = true;
|
|
667
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
|
668
|
+
this.reportService.getBranchActivitySendSummaryReport(searchData).subscribe({
|
|
669
|
+
next: (data) => {
|
|
670
|
+
console.log(data);
|
|
671
|
+
this.dataMap = JSON.parse(JSON.stringify(data));
|
|
672
|
+
this.filteredData = data;
|
|
673
|
+
this.noDataFound = Object.keys(this.filteredData).length == 0 ? true : false;
|
|
674
|
+
this.proxyData = structuredClone(data);
|
|
675
|
+
this.paginationArray = new Array(Object.keys(this.filteredData).length).fill(15);
|
|
676
|
+
this.showMessage = Object.keys(this.filteredData).length == 0 ? true : false;
|
|
677
|
+
this.showReport = true;
|
|
678
|
+
},
|
|
679
|
+
error: (err) => {
|
|
680
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
681
|
+
this.clearSearch = false;
|
|
682
|
+
},
|
|
683
|
+
complete: () => {
|
|
684
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
685
|
+
this.showReport = true;
|
|
686
|
+
this.clearSearch = false;
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
handleFormValid(isValid) {
|
|
691
|
+
this.isFormValid = isValid;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
BranchActivitySendSummaryReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendSummaryReportComponent, deps: [{ token: i1.ReportService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
695
|
+
BranchActivitySendSummaryReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BranchActivitySendSummaryReportComponent, selector: "lib-branch-activity-send-summary-report", ngImport: i0, template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\">\r\n</lib-search-filter >\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section *ngIf=\"showReport && isFormValid && !clearSearch\" class=\"my-2\">\r\n <ng-container *ngIf=\"!noDataFound\">\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\" [metaDataTwo]=\"metaDataTwo\"(exportEvent)=\"handleExport($event)\" (searchEvent)=\"filter($event)\"></lib-metadata>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let item of filteredData | keyvalue; let i = index\">\r\n <ngb-panel *ngIf=\"item.value.length > 0\" [id]=\"'panel-' + i\">\r\n\r\n <ng-template ngbPanelTitle style=\"height: 10%;\">\r\n <label\r\n class=\"panel-cls\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"item?.value?.length\"\r\n [defaultSize]=\"'15'\" [gridApi]=\"gridApis[i]\">\r\n ></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"width: 100%;height: 380px;\"\r\n [columnDefs]=\"columnDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [rowData]=\"item.value\" \r\n [rowHeight]=\"20\"\r\n [headerHeight]=\"22\"\r\n [pagination]=\"true\" \r\n [paginationPageSize]=\"paginationArray[i]\" \r\n [rowClassRules]=\"rowClassRules\"\r\n (gridReady)=\"onGridReady($event,i)\"\r\n >\r\n </ag-grid-angular>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </ng-container>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data found matching your search criteria.\r\n </div>\r\n</section>", styles: [".btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}.transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important;font-size:11px!important}\n"], dependencies: [{ kind: "component", type: i2.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PageSizeSelectorComponent, selector: "lib-page-size-selector", inputs: ["pageSizeArray", "defaultSize", "totalEntries", "gridApi"] }, { kind: "component", type: i5.MetadataComponent, selector: "lib-metadata", inputs: ["metaDataOne", "metaDataTwo", "showmetaDataOne", "showmetaDataTwo", "reportName"], outputs: ["searchEvent", "exportEvent"] }, { kind: "component", type: i6.NgbAccordion, selector: "ngb-accordion", inputs: ["animation", "activeIds", "closeOthers", "destroyOnHide", "type"], outputs: ["panelChange", "shown", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i6.NgbPanel, selector: "ngb-panel", inputs: ["disabled", "id", "title", "type", "cardClass"], outputs: ["shown", "hidden"] }, { kind: "directive", type: i6.NgbPanelTitle, selector: "ng-template[ngbPanelTitle]" }, { kind: "directive", type: i6.NgbPanelContent, selector: "ng-template[ngbPanelContent]" }, { kind: "component", type: i7.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i8.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName", "initialFilters"], outputs: ["searchClicked", "formValid"] }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }] });
|
|
696
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendSummaryReportComponent, decorators: [{
|
|
697
|
+
type: Component,
|
|
698
|
+
args: [{ selector: 'lib-branch-activity-send-summary-report', template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\">\r\n</lib-search-filter >\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section *ngIf=\"showReport && isFormValid && !clearSearch\" class=\"my-2\">\r\n <ng-container *ngIf=\"!noDataFound\">\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\" [metaDataTwo]=\"metaDataTwo\"(exportEvent)=\"handleExport($event)\" (searchEvent)=\"filter($event)\"></lib-metadata>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let item of filteredData | keyvalue; let i = index\">\r\n <ngb-panel *ngIf=\"item.value.length > 0\" [id]=\"'panel-' + i\">\r\n\r\n <ng-template ngbPanelTitle style=\"height: 10%;\">\r\n <label\r\n class=\"panel-cls\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"item?.value?.length\"\r\n [defaultSize]=\"'15'\" [gridApi]=\"gridApis[i]\">\r\n ></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"width: 100%;height: 380px;\"\r\n [columnDefs]=\"columnDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [rowData]=\"item.value\" \r\n [rowHeight]=\"20\"\r\n [headerHeight]=\"22\"\r\n [pagination]=\"true\" \r\n [paginationPageSize]=\"paginationArray[i]\" \r\n [rowClassRules]=\"rowClassRules\"\r\n (gridReady)=\"onGridReady($event,i)\"\r\n >\r\n </ag-grid-angular>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </ng-container>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data found matching your search criteria.\r\n </div>\r\n</section>", styles: [".btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}.transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important;font-size:11px!important}\n"] }]
|
|
699
|
+
}], ctorParameters: function () { return [{ type: i1.ReportService }, { type: i0.NgZone }]; } });
|
|
700
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmNoLWFjdGl2aXR5LXNlbmQtc3VtbWFyeS1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0L2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFrQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBaUIsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUUxRixnREFBZ0Q7QUFDaEQsb0ZBQW9GO0FBQ3BGLGdGQUFnRjtBQUNoRiw4RkFBOEY7QUFDOUYsOENBQThDO0FBQzlDLDZCQUE2QjtBQUM3Qiw0QkFBNEI7QUFDM0IsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTyx3Q0FBd0M7SUFzRm5ELFlBQW9CLGFBQTRCLEVBQVUsTUFBYztRQUFwRCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLFdB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O2tCQUxwRCxTQUFTOytCQUNFLHlDQUF5QyIsInNvdXJjZXNDb250ZW50IjpbIiBpbXBvcnQgeyBDb21wb25lbnQsIE5nWm9uZSwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuIC8vIGltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuIGltcG9ydCB7IENvbERlZiwgR3JpZEFwaSwgR3JpZFJlYWR5RXZlbnQgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcbiBpbXBvcnQgeyB0aGVtZUFscGluZSB9IGZyb20gJ0BhZy1ncmlkLWNvbW11bml0eS90aGVtaW5nJztcclxuaW1wb3J0IHsgQnJhbmNoQWN0aXZpdHlSZXBvcnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvYnJhbmNoLWFjdGl2aXR5LXJlcG9ydC9icmFuY2gtYWN0aXZpdHktc2VuZC1yZXBvcnQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkaW5nU3RhdGVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbXBvbmVudC1sb2FkaW5nLXN0YXRlcyc7XHJcbmltcG9ydCB7IEV4cG9ydE9wdGlvbnMsIEdlbmVyaWNFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2V4cG9ydC1nZW5lcmljLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuLy8gaW1wb3J0IHsgQ29tcG9uZW50TG9hZGluZ1N0YXRlcyB9IGZyb20gJ3NyYy9hcHAvbW9kZWxzL2NvbXBvbmVudC1sb2FkaW5nLXN0YXRlcyc7XHJcbi8vIGltcG9ydCB7IEdlbmVyaWNFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnc3JjL2FwcC9zaGFyZWQvZXhwb3J0LWdlbmVyaWMuc2VydmljZSc7XHJcbi8vIGltcG9ydCB7IEV4cG9ydE9wdGlvbnMgfSBmcm9tICdwcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NoYXJlZC9leHBvcnQtZ2VuZXJpYy5zZXJ2aWNlJztcclxuLy8gaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG4vLyBpbXBvcnQganNQREYgZnJvbSAnanNwZGYnO1xyXG4vLyBpbXBvcnQgJ2pzcGRmLWF1dG90YWJsZSc7XHJcbiBpbXBvcnQgKiBhcyBFeGNlbEpTIGZyb20gJ2V4Y2VsanMnO1xyXG4gaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWJyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYnJhbmNoLWFjdGl2aXR5LXNlbmQtc3VtbWFyeS1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEJyYW5jaEFjdGl2aXR5U2VuZFN1bW1hcnlSZXBvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGRhdGFNYXA6IFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+ID0ge31cclxuICBmaWx0ZXJlZERhdGE6IFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+ID0ge31cclxuICBwcm94eURhdGE6IFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+ID0ge31cclxuICBzaG93UmVwb3J0OiBib29sZWFuO1xyXG4gIHBhZ2luYXRpb25BcnJheTogYW55W107XHJcbiAgc2VsZWN0ZWRFeHBvcnRPcHRpb24gPSAnZXhjZWwnO1xyXG4gIGdyaWRBcGlzOiBHcmlkQXBpW10gPSBbXTtcclxuICBncmlkQ29sdW1uQXBpO1xyXG4gIHVzZXI6IHN0cmluZyA9IFwiXCI7XHJcbiAgcmVwb3J0RGF0ZTogc3RyaW5nO1xyXG4gIGZyb21EYXRlOiBzdHJpbmc7XHJcbiAgdG9EYXRlOiBzdHJpbmc7XHJcbiAgc2VhcmNoVGV4dDogc3RyaW5nO1xyXG4gIGJ1ZmZlcjogYW55O1xyXG4gIHN5c1VzZXJJZDogc3RyaW5nO1xyXG4gIHByaXZhdGUgbG9nb0Jhc2U2NDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIENvbXBvbmVudExvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXM7XHJcbiAgbG9hZGluZ1N0YXRlOiBDb21wb25lbnRMb2FkaW5nU3RhdGVzID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Mb2FkaW5nO1xyXG4gIFJlcG9ydE5hbWU6IHN0cmluZyA9IFwiQnJhbmNoIEFjdGl2aXR5IFNlbmQgU3VtbWFyeVwiO1xyXG4gIGxlZnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIG1ldGFEYXRhVHdvOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIGV4cG9ydFNlcnZpY2U6IEdlbmVyaWNFeHBvcnRTZXJ2aWNlID0gaW5qZWN0KEdlbmVyaWNFeHBvcnRTZXJ2aWNlKTtcclxuICBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gW107XHJcblxyXG4gIC8vIGZsYWdzXHJcbiAgc2hvd01lc3NhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBub0RhdGFGb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzRm9ybVZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2xlYXJTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1RvdGFsU3VtbWFyeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvbHVtbkRlZnM6IENvbERlZjxCcmFuY2hBY3Rpdml0eVJlcG9ydD5bXSA9IFtcclxuXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAnYnVzaW5lc3NEYXRlVGltZScsIGhlYWRlck5hbWU6ICdCdXNpbmVzcyBEYXRlJywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIGhlYWRlckNsYXNzOiAnYWctbGVmdC1hbGlnbmVkLWhlYWRlcicsIG1pbldpZHRoOiA3MCwgd2lkdGg6IDcwLCB0b29sdGlwRmllbGQ6ICdidXNpbmVzc0RhdGVUaW1lJyxcclxuICAgICAgdmFsdWVGb3JtYXR0ZXI6IChwYXJhbXMpID0+IHtcclxuICAgICAgICBjb25zdCByb3cgPSBwYXJhbXMuZGF0YSBhcyBCcmFuY2hBY3Rpdml0eVJlcG9ydCB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChyb3cgJiYgcm93LnBheWluQ0Njb2RlID09PSAnVG90YWwnKSB7XHJcbiAgICAgICAgICByZXR1cm4gJyc7IC8vIGhpZGUgZGF0ZSBmb3IgdG90YWwgcm93XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcGFyYW1zLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgeyBmaWVsZDogJ3Byb2R1Y3QnLCBoZWFkZXJOYW1lOiAnUHJvZHVjdCcsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogODAsIHdpZHRoOiAxMjAsIHRvb2x0aXBGaWVsZDogJ3Byb2R1Y3QnIH0sXHJcbiAgICB7IGZpZWxkOiAncGF5b3V0Q0Njb2RlJywgaGVhZGVyTmFtZTogJ1JlY2VpdmUgQ3VycmVuY3knLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDkwLCB3aWR0aDogMTEwLCB0b29sdGlwRmllbGQ6ICdwYXlvdXRDQ2NvZGUnIH0sXHJcbiAgICB7IGZpZWxkOiAncGF5b3V0QW1vdW50JywgaGVhZGVyTmFtZTogJ1JlY2VpdmUgQW1vdW50JywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIG1pbldpZHRoOiA5MCwgbWF4V2lkdGg6IDEyMCwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3BheW91dEFtb3VudCcgfSxcclxuICAgIHsgZmllbGQ6ICdwYXlpbkNDY29kZScsIGhlYWRlck5hbWU6ICdTZW5kIEN1cnJlbmN5JywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIG1pbldpZHRoOiA5MCwgbWF4V2lkdGg6IDkwLCB0b29sdGlwRmllbGQ6ICdwYXlpbkNDY29kZScgfSxcclxuICAgIHsgZmllbGQ6ICdwYXlpbkFtb3VudCcsIGhlYWRlck5hbWU6ICdTZW5kIEFtb3VudCcsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogODAsIG1heFdpZHRoOiAxMjAsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCBjb21wYWN0LWNlbGwnLCB0b29sdGlwRmllbGQ6ICdwYXlpbkFtb3VudCcgfSxcclxuICAgIHsgZmllbGQ6ICd0cmFuc2FjdGlvbkNvbW1pc3Npb25BbW91bnQnLCBoZWFkZXJOYW1lOiAnU2VydmljZSBGZWUnLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDkwLCBtYXhXaWR0aDogMTAwLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwgY29tcGFjdC1jZWxsJywgdG9vbHRpcEZpZWxkOiAndHJhbnNhY3Rpb25Db21taXNzaW9uQW1vdW50JyB9LFxyXG4gICAgeyBmaWVsZDogJ3RheCcsIGhlYWRlck5hbWU6ICdUYXgnLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDgwLCBtYXhXaWR0aDogMTAwLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwgY29tcGFjdC1jZWxsJywgdG9vbHRpcEZpZWxkOiAndGF4JyB9LFxyXG4gICAgeyBmaWVsZDogJ3RvdGFsUGF5aW5BbW91bnQnLCBoZWFkZXJOYW1lOiAnVG90YWwgU2VuZCBBbW91bnQnLCBtaW5XaWR0aDogMTAwLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3RvdGFsUGF5aW5BbW91bnQnIH0sXHJcbiAgICB7IGZpZWxkOiAndHJhbnNhY3Rpb25Db3VudCcsIGhlYWRlck5hbWU6ICdUcmFuc2FjdGlvbiBDb3VudCcsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogODAsIG1heFdpZHRoOiAxMDAsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCBjb21wYWN0LWNlbGwnLCB0b29sdGlwRmllbGQ6ICd0eG5Db3VudCcgfSxcclxuICAgIHsgZmllbGQ6ICdzdGF0dXMnLCBoZWFkZXJOYW1lOiAnVHJhbnNhY3Rpb24gU3RhdHVzJywgbWluV2lkdGg6IDEwMCwgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIHRvb2x0aXBGaWVsZDogJ3N0YXR1cycgfVxyXG4gIF07XHJcblxyXG5cclxuICBkZWZhdWx0Q29sRGVmID0ge1xyXG4gICAgc29ydGFibGU6IHRydWUsXHJcbiAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICBtaW53aWR0aDogNDAsXHJcbiAgICB3cmFwSGVhZGVyVGV4dDogdHJ1ZSxcclxuICAgIGF1dG9IZWFkZXJIZWlnaHQ6IHRydWUsXHJcbiAgICBzdXBwcmVzc1NpemVUb0ZpdDogZmFsc2UsXHJcbiAgICB3cmFwVGV4dDogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIC8vIHJvd0NsYXNzUnVsZXMgPSB7XHJcbiAgLy8gICBkZWJ1Z2dlclxyXG4gIC8vICAgJ3RvdGFsLXJvdyc6IHBhcmFtcyA9PiBwYXJhbXMuZGF0YT8uaXNUb3RhbFJvd1xyXG4gIC8vIH07XHJcblxyXG4gIHJvd0NsYXNzUnVsZXMgPSB7XHJcbiAgICAndG90YWwtcm93JzogKHBhcmFtcykgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnUm93IERhdGE6JywgcGFyYW1zLmRhdGEuaXNUb3RhbFJvdyk7XHJcbiAgICAgIGlmIChwYXJhbXMuZGF0YS5pc1RvdGFsUm93KSB7XHJcbiAgICAgICAgcmV0dXJuIHBhcmFtcy5kYXRhPy5pc1RvdGFsUm93O1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJvd0RhdGE6IEJyYW5jaEFjdGl2aXR5UmVwb3J0W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZXBvcnRTZXJ2aWNlOiBSZXBvcnRTZXJ2aWNlLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7IH1cclxuXHJcbiAgcmVwb3J0VGhlbWUgPSB0aGVtZUFscGluZS53aXRoUGFyYW1zKHtcclxuICAgIGhlYWRlckZvbnRTaXplOiAnMTBweCcsXHJcbiAgICBmb250RmFtaWx5OiBbJ0FyaWFsJywgJ3NhbnMtc2VyaWYnXSxcclxuICAgIGZvbnRTaXplOiAnOXB4J1xyXG4gIH0pO1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgIC8vIENoZWNrIGlmIFVzZXIgaXMgZmFsY29uIHVzZXIgb3IgZm9zc2lsVXNlclxyXG4gICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvc3NpbHVzZXJuYW1lJykpIHtcclxuICAgICAgdGhpcy5zeXNVc2VySWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3NzaWx1c2VybmFtZScpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zeXNVc2VySWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdlenJlbWl0dXNlcm5hbWUnKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3lzVXNlcklkID0gdGhpcy5zeXNVc2VySWQucmVwbGFjZSgvXltcIiddKC4qKVtcIiddJC8sICckMScpO1xyXG4gICAgdGhpcy51c2VyID0gdGhpcy5zeXNVc2VySWQ7XHJcbiAgICBjb25zb2xlLmxvZyhcIlN5c3RlbSBVc2VyIElkIDogXCIgKyB0aGlzLnN5c1VzZXJJZCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXIodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB0ZXh0O1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlYXJjaFRleHQ/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLmRhdGFNYXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaFRleHQ/LnRyaW0oKT8udG9Mb3dlckNhc2UoKTtcclxuICAgIGZvciAoY29uc3QgW2tleSwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wcm94eURhdGEpKSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGVudHJpZXMuZmlsdGVyKGVudHJ5ID0+IE9iamVjdC52YWx1ZXMoZW50cnkpXHJcbiAgICAgICAgLnNvbWUodmFsID0+IHtcclxuICAgICAgICAgIGxldCBhOiBzdHJpbmcgPSB2YWw/LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgIGlmKGEgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBhPy5zZWFyY2godGhpcy5zZWFyY2hUZXh0KSA9PSAtMSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgICAgICB9KSlcclxuXHJcbiAgICAgIHRoaXMuZmlsdGVyZWREYXRhW2tleV0gPSBmaWx0ZXJlZERhdGE7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZpbHRlcmVkRGF0YTtcclxuICB9XHJcblxyXG4gIG9uR3JpZFJlYWR5KHBhcmFtczogR3JpZFJlYWR5RXZlbnQsIGlkOiBudW1iZXIpIHtcclxuICAgIHBhcmFtcy5hcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gICAgdGhpcy5ncmlkQ29sdW1uQXBpID0gcGFyYW1zLmNvbHVtbkFwaTtcclxuICAgIHRoaXMuZ3JpZEFwaXNbaWRdID0gcGFyYW1zLmFwaTtcclxuICAgIHBhcmFtcy5jb2x1bW5BcGkuc2V0Q29sdW1uVmlzaWJsZSgnYnVzaW5lc3NEYXRlVGltZScsICF0aGlzLmlzVG90YWxTdW1tYXJ5KTtcclxuICAgIHBhcmFtcy5hcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXhwb3J0KG9wdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uID0gb3B0aW9uO1xyXG4gICAgaWYgKCF0aGlzLmhhc0FueUdyb3VwcygpKSB7XHJcbiAgICAgIGFsZXJ0KFwiVGhlcmUgaXMgbm8gZGF0YSB0byBleHBvcnQgYmFzZWQgb24geW91ciBjdXJyZW50IGZpbHRlci5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIElmIG5vIGRhdGEsIGRvIG5vdGhpbmcuXHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWREYXRhIHx8IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgYWxlcnQoXCJObyBkYXRhIHRvIGV4cG9ydFwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGl0bGUgPSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kIFN1bW1hcnlcIjtcclxuICAgIGNvbnN0IHJlcG9ydFRpbWVGb3JtYXR0ZXIgPSB0aGlzLmRhdGVWYWx1ZUZvcm1hdHRlcignZGQvTU0veXl5eSBoaDptbSBhJyk7XHJcbiAgICBjb25zdCBtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICBbJ1JlcG9ydCBQZXJpb2QgJywgdGhpcy5mcm9tRGF0ZSArIFwiIC0gXCIgKyB0aGlzLnRvRGF0ZV0sXHJcbiAgICAgIFsnUmVwb3J0IFVzZXIgJiBUaW1lJywgdGhpcy51c2VyID8gdGhpcy51c2VyICsgXCIgQCBcIiArIHRoaXMucmVwb3J0RGF0ZSA6ICcnICsgXCIgQCBcIiArIHRoaXMucmVwb3J0RGF0ZV0sXHJcbiAgICBdO1xyXG4gICAgLy8gLS0tIHNlYXJjaCBjcml0ZXJpYSAtLS1cclxuICAgIGNvbnN0IHNlYXJjaENyaXRlcmlhOiBbc3RyaW5nLCBzdHJpbmddW10gPSB0aGlzLnNlYXJjaENyaXRlcmlhO1xyXG4gICAgLy9jb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5EZWZzO1xyXG5cclxuICAgIC8vZXhjbHVkZSBCdXNpbmVzcyBEYXRlIGNvbCBmb3IgVG90YWwgU3VtbWFyeSBSZXBvcnQuXHJcbiAgICBsZXQgY29sdW1ucyA9IFsuLi50aGlzLmNvbHVtbkRlZnNdO1xyXG4gICAgY29uc3Qgc3VtbWFyeVJlcG9ydCA9IHRoaXMuc2VhcmNoQ3JpdGVyaWEuZmluZCh4ID0+IHhbMF0gPT09ICdTdW1tYXJ5IFJlcG9ydDonKT8uWzFdO1xyXG4gICAgIFxyXG4gICAgaWYgKHN1bW1hcnlSZXBvcnQgPT09ICdUb3RhbCBTdW1tYXJ5Jykge1xyXG4gICAgICBjb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5maWVsZCAhPT0gJ2J1c2luZXNzRGF0ZVRpbWUnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25zdCBkYXRhID0gdGhpcy5kYXRhTWFwO1xyXG4gICAgY29uc3QgY2xlYW5lZERhdGEgPSB7fTtcclxuXHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLmRhdGFNYXApLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgY2xlYW5lZERhdGFba2V5XSA9IHRoaXMuZGF0YU1hcFtrZXldLm1hcChyb3cgPT4ge1xyXG4gICAgICAgIGlmIChyb3cuaXNUb3RhbFJvdykge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICBidXNpbmVzc0RhdGVUaW1lOiAnJyxcclxuICAgICAgICAgICAgcHJvZHVjdDogJycsXHJcbiAgICAgICAgICAgIHJlY2VpdmVDdXJyZW5jeTogJycsXHJcbiAgICAgICAgICAgIHJlY2VpdmVBbW91bnQ6ICcnXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcm93O1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGRhdGEgPSBjbGVhbmVkRGF0YTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIGN1cnJlbmN5RmllbGRzOiBbXHJcbiAgICAgICAgJ3BheW91dEFtb3VudCcsICdwYXlpbkFtb3VudCcsICd0cmFuc2FjdGlvbkNvbW1pc3Npb25BbW91bnQnLCAndGF4JywgJ3RvdGFsUGF5aW5BbW91bnQnXHJcbiAgICAgIF0sXHJcbiAgICAgIC8vIHNwZWNpZnkgYWxsIGRhdGUgZmllbGRzIGV4cGVjdGVkXHJcbiAgICAgIGRhdGVGaWVsZHM6IFtdLFxyXG5cclxuICAgICAgZGF0ZUZpZWxkRm9ybWF0czoge1xyXG4gICAgICAgIHR4bkRhdGVBbmRUaW1lOiAnZGQvTU0veXl5eSBoaDptbSBhJyxcclxuICAgICAgICBjYW5jZWxsYXRpb25CcmFuY2hEYXRlVGltZTogJ2RkL01NL3l5eXkgSEg6bW0nLFxyXG4gICAgICAgIGNhbmNlbGxhdGlvbkJ1c2luZXNzRGF0ZTogJ2RkL01NL3l5eXknXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBzcGVjaWFsRGVjaW1hbEZpZWxkczoge1xyXG4gICAgICAgIHJhdGU6IDggICAgICAgLy8gZnV0dXJlIGZpZWxkIHdpdGggOCBkZWNpbWFsIHBsYWNlc1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgZ3JvdXBCeUtleTogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24pIHtcclxuICAgICAgY2FzZSAnZXhjZWwnOlxyXG4gICAgICAgIHRoaXMuZXhwb3J0VG9FeGNlbCh7IHRpdGxlLCBtZXRhZGF0YSwgc2VhcmNoQ3JpdGVyaWEsIGNvbHVtbnMsIGRhdGEsIG9wdGlvbnMgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3BkZic6XHJcbiAgICAgICAgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydFRvUGRmKHsgdGl0bGUsIG1ldGFkYXRhLCBzZWFyY2hDcml0ZXJpYSwgY29sdW1ucywgZGF0YSwgb3B0aW9ucyB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY3N2JzpcclxuICAgICAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0VG9Dc3YoeyB0aXRsZSwgbWV0YWRhdGEsIHNlYXJjaENyaXRlcmlhLCBjb2x1bW5zLCBkYXRhLCBvcHRpb25zIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGFsZXJ0KFwiUGxlYXNlIHNlbGVjdCBhbiBleHBvcnQgZm9ybWF0LlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGV4cG9ydFRvRXhjZWwoe1xyXG4gICAgdGl0bGUsXHJcbiAgICBtZXRhZGF0YSxcclxuICAgIHNlYXJjaENyaXRlcmlhLFxyXG4gICAgY29sdW1ucyxcclxuICAgIGRhdGEsXHJcbiAgICBvcHRpb25zID0ge31cclxuICB9OiB7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgbWV0YWRhdGE6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICAgIHNlYXJjaENyaXRlcmlhOiBbc3RyaW5nLCBzdHJpbmddW107XHJcbiAgICBjb2x1bW5zOiBhbnlbXTtcclxuICAgIGRhdGE6IGFueVtdIHwgUmVjb3JkPHN0cmluZywgYW55W10+O1xyXG4gICAgb3B0aW9ucz86IEV4cG9ydE9wdGlvbnM7XHJcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGNvbnN0IHdvcmtib29rID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldCh0aXRsZSk7XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IFBSRSBDQUxDID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgY29uc3QgaGVhZGVyTGFiZWxzID0gWydTciBObycsIC4uLmNvbHVtbnMubWFwKGNvbCA9PiBjb2wuaGVhZGVyTmFtZSB8fCBjb2wuZmllbGQpXTtcclxuICAgIGNvbnN0IHRvdGFsQ29scyA9IGhlYWRlckxhYmVscy5sZW5ndGg7XHJcblxyXG4gICAgY29uc3QgdGl0bGVTdGFydENvbCA9IDQ7XHJcbiAgICBjb25zdCB0aXRsZUNvbExldHRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjQgKyB0aXRsZVN0YXJ0Q29sKTtcclxuICAgIGNvbnN0IHRpdGxlTWVyZ2VFbmQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDY0ICsgdG90YWxDb2xzKTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gTE9HTyA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIGlmICh0aGlzLmxvZ29CYXNlNjQpIHtcclxuICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IHRoaXMubG9nb0Jhc2U2NC5yZXBsYWNlKC9eZGF0YTppbWFnZVxcL1xcdys7YmFzZTY0LC8sICcnKTtcclxuXHJcbiAgICAgIGNvbnN0IGltYWdlSWQgPSB3b3JrYm9vay5hZGRJbWFnZSh7XHJcbiAgICAgICAgYmFzZTY0OiBiYXNlNjREYXRhLFxyXG4gICAgICAgIGV4dGVuc2lvbjogJ3BuZycsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgd29ya3NoZWV0LmFkZEltYWdlKGltYWdlSWQsIHtcclxuICAgICAgICB0bDogeyBjb2w6IDAsIHJvdzogMCB9LFxyXG4gICAgICAgIGV4dDogeyB3aWR0aDogMTQ1LCBoZWlnaHQ6IDY2IH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB3b3Jrc2hlZXQuZ2V0Um93KDEpLmhlaWdodCA9IDI0O1xyXG4gICAgICB3b3Jrc2hlZXQuZ2V0Um93KDIpLmhlaWdodCA9IDIyO1xyXG4gICAgICB3b3Jrc2hlZXQuZ2V0Um93KDMpLmhlaWdodCA9IDIyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBUSVRMRSA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKGAke3RpdGxlQ29sTGV0dGVyfTE6JHt0aXRsZU1lcmdlRW5kfTFgKTtcclxuICAgIGNvbnN0IHRpdGxlQ2VsbCA9IHdvcmtzaGVldC5nZXRSb3coMSkuZ2V0Q2VsbCh0aXRsZVN0YXJ0Q29sKTtcclxuICAgIHRpdGxlQ2VsbC52YWx1ZSA9IHRpdGxlO1xyXG4gICAgdGl0bGVDZWxsLmZvbnQgPSB7IGJvbGQ6IHRydWUsIHNpemU6IDE2IH07XHJcbiAgICB0aXRsZUNlbGwuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBNRVRBREFUQSA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIGxldCBtZXRhUm93U3RhcnQgPSA0O1xyXG5cclxuICAgIG1ldGFkYXRhLmZvckVhY2goKFtsYWJlbCwgdmFsdWVdLCBpZHgpID0+IHtcclxuICAgICAgY29uc3Qgcm93ID0gd29ya3NoZWV0LmdldFJvdyhtZXRhUm93U3RhcnQgKyBpZHgpO1xyXG5cclxuICAgICAgcm93LmdldENlbGwoMSkudmFsdWUgPSB7XHJcbiAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgIHsgdGV4dDogYCR7bGFiZWx9IDogYCwgZm9udDogeyBib2xkOiB0cnVlIH0gfSxcclxuICAgICAgICAgIHsgdGV4dDogdmFsdWUgPz8gJycsIGZvbnQ6IHsgYm9sZDogZmFsc2UgfSB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMoYEEke3Jvdy5udW1iZXJ9OiR7dGl0bGVNZXJnZUVuZH0ke3Jvdy5udW1iZXJ9YCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgY3VycmVudFJvdyA9IG1ldGFSb3dTdGFydCArIG1ldGFkYXRhLmxlbmd0aDtcclxuXHJcbiAgICB3b3Jrc2hlZXQuZ2V0Um93KCsrY3VycmVudFJvdykuaGVpZ2h0ID0gNjtcclxuICAgIGN1cnJlbnRSb3crKztcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU0VBUkNIIENSSVRFUklBID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMoY3VycmVudFJvdywgMSwgY3VycmVudFJvdywgNik7XHJcbiAgICB3b3Jrc2hlZXQuZ2V0Q2VsbChjdXJyZW50Um93LCAxKS52YWx1ZSA9ICdTZWFyY2ggQ3JpdGVyaWE6LSc7XHJcbiAgICB3b3Jrc2hlZXQuZ2V0Q2VsbChjdXJyZW50Um93LCAxKS5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICBjdXJyZW50Um93ICs9IDI7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hDcml0ZXJpYS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgICBjb25zdCBsZWZ0ID0gc2VhcmNoQ3JpdGVyaWFbaV07XHJcbiAgICAgIGNvbnN0IHJpZ2h0ID0gc2VhcmNoQ3JpdGVyaWFbaSArIDFdO1xyXG5cclxuICAgICAgY29uc3Qgcm93ID0gd29ya3NoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG5cclxuICAgICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMocm93Lm51bWJlciwgMSwgcm93Lm51bWJlciwgMyk7XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IChsZWZ0Py5bMF0gPz8gJycpICsgJyAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgeyB0ZXh0OiBsZWZ0Py5bMV0gPz8gJycgfVxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICAgICAgcm93LmdldENlbGwoMSkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogdHJ1ZSwgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcblxyXG4gICAgICBpZiAocmlnaHQpIHtcclxuICAgICAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhyb3cubnVtYmVyLCA0LCByb3cubnVtYmVyLCA2KTtcclxuICAgICAgICByb3cuZ2V0Q2VsbCg0KS52YWx1ZSA9IHtcclxuICAgICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICAgIHsgdGV4dDogKHJpZ2h0Py5bMF0gPz8gJycpICsgJyAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgICB7IHRleHQ6IHJpZ2h0Py5bMV0gPz8gJycgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcm93LmdldENlbGwoNCkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogdHJ1ZSwgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50Um93Kys7XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IEhFQURFUiBST1cgPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBjb25zdCBoZWFkZXJSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KGN1cnJlbnRSb3crKyk7XHJcblxyXG4gICAgaGVhZGVyTGFiZWxzLmZvckVhY2goKGhlYWRlciwgaSkgPT4ge1xyXG4gICAgICBjb25zdCBjZWxsID0gaGVhZGVyUm93LmdldENlbGwoaSArIDEpO1xyXG4gICAgICBjZWxsLnZhbHVlID0gaGVhZGVyO1xyXG4gICAgICBjZWxsLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgICAgY2VsbC5maWxsID0ge1xyXG4gICAgICAgIHR5cGU6ICdwYXR0ZXJuJyxcclxuICAgICAgICBwYXR0ZXJuOiAnc29saWQnLFxyXG4gICAgICAgIGZnQ29sb3I6IHsgYXJnYjogJ0Q5RDlEOScgfVxyXG4gICAgICB9O1xyXG4gICAgICBjZWxsLmFsaWdubWVudCA9IHsgdmVydGljYWw6ICdtaWRkbGUnLCBob3Jpem9udGFsOiAnY2VudGVyJyB9O1xyXG4gICAgICBjZWxsLmJvcmRlciA9IHtcclxuICAgICAgICB0b3A6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgbGVmdDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgcmlnaHQ6IHsgc3R5bGU6ICd0aGluJyB9XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIGhlYWRlclJvdy5lYWNoQ2VsbCgoY2VsbCkgPT4ge1xyXG4gICAgICBpZiAoY2VsbC52YWx1ZSA9PT0gJ1RyYW5zYWN0aW9uIENvdW50Jykge1xyXG4gICAgICAgIGNlbGwudmFsdWUgPSAnVHJhbnNhY3Rpb25cXG5Db3VudCc7XHJcbiAgICAgICAgY2VsbC5hbGlnbm1lbnQgPSB7XHJcbiAgICAgICAgICBob3Jpem9udGFsOiAnY2VudGVyJyxcclxuICAgICAgICAgIHZlcnRpY2FsOiAnbWlkZGxlJyxcclxuICAgICAgICAgIHdyYXBUZXh0OiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gREFUQSBTRUNUSU9OID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgbGV0IHJvd0lkeCA9IGN1cnJlbnRSb3c7XHJcbiAgICBsZXQgc2VyaWFsTnVtYmVyID0gMTtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5ncm91cEJ5S2V5ICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IFtncm91cCwgaXRlbXNdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGdyb3VwUm93ID0gd29ya3NoZWV0LmdldFJvdyhyb3dJZHgrKyk7XHJcbiAgICAgICAgZ3JvdXBSb3cuZ2V0Q2VsbCgxKS52YWx1ZSA9IGdyb3VwO1xyXG4gICAgICAgIGdyb3VwUm93LmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgICAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhgQSR7Z3JvdXBSb3cubnVtYmVyfToke3RpdGxlTWVyZ2VFbmR9JHtncm91cFJvdy5udW1iZXJ9YCk7XHJcblxyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuXHJcbiAgICAgICAgICBjb25zdCByb3dEYXRhID0gdGhpcy5wcmVwYXJlVGFibGVSb3dzKFtpdGVtXSwgY29sdW1ucywgb3B0aW9ucylbMF07XHJcbiAgICAgICAgICBjb25zdCBkYXRhUm93ID0gd29ya3NoZWV0LmdldFJvdyhyb3dJZHgrKyk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFJvdyA9IFtcclxuICAgICAgICAgICAgIWl0ZW0/LmlzVG90YWxSb3cgPyBzZXJpYWxOdW1iZXIrKyA6ICcnLFxyXG4gICAgICAgICAgICAuLi5yb3dEYXRhXHJcbiAgICAgICAgICBdO1xyXG5cclxuICAgICAgICAgIGZ1bGxSb3cuZm9yRWFjaCgodmFsLCBjSWR4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkYXRhUm93LmdldENlbGwoY0lkeCArIDEpO1xyXG4gICAgICAgICAgICAvLyAgIGNlbGwudmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICAgIC8vYWRkZWQgYnkgYmhhcmF0aSBmb3IgXHJcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uc1tjSWR4IC0gMV0/LmZpZWxkO1xyXG5cclxuICAgICAgICAgICAgLy8g4pyFIEFtb3VudCBmaWVsZHMgKFJlY2VpdmUgQW1vdW50LCBTZW5kIEFtb3VudCwgVG90YWwgU2VuZCBBbW91bnQgZXRjLilcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIGZpZWxkPT0ndG90YWxQYXlpbkFtb3VudCd8fFxyXG4gICAgICAgICAgICAgIGZpZWxkPT0ncGF5aW5BbW91bnQnfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3RyYW5zYWN0aW9uQ29tbWlzc2lvbkFtb3VudCcgfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3RheCdcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnICYmIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IE51bWJlcih2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5udW1GbXQgPSAnIywjIzAuMDAwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgfSAqL1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0/LmlzVG90YWxSb3cgJiYgZmllbGQgPT09ICdyZWNlaXZlQW1vdW50Jykge1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgICAgICBmaWVsZD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYW1vdW50JykgfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3NlcnZpY2VGZWUnIHx8XHJcbiAgICAgICAgICAgICAgZmllbGQgPT09ICd0YXgnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnICYmIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDsgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBudW1iZXJcclxuICAgICAgICAgICAgICAgIGNlbGwubnVtRm10ID0gJyMsIyMwLjAwMCc7ICAgICAgIC8vIEV4Y2VsIGZvcm1hdHRpbmdcclxuICAgICAgICAgICAgICAgIGNlbGwuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNlbGwuYm9yZGVyID0ge1xyXG4gICAgICAgICAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgICAgICAgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgICAgICByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGlmIChpdGVtPy5pc1RvdGFsUm93KSB7XHJcbiAgICAgICAgICAgIGRhdGFSb3cuZWFjaENlbGwoY2VsbCA9PiB7XHJcbiAgICAgICAgICAgICAgIGNlbGwuZm9udCA9IHtcclxuICAgICAgICAgICAgICAgIC4uLmNlbGwuZm9udCxcclxuICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaXplOiAxMlxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIHRoaXMucHJlcGFyZVRhYmxlUm93cyhkYXRhIGFzIGFueVtdLCBjb2x1bW5zLCBvcHRpb25zKVxyXG4gICAgICAgIC5mb3JFYWNoKChyb3dEYXRhLCBpbmRleCkgPT4ge1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRhdGFSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KHJvd0lkeCsrKTtcclxuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSXRlbSA9IChkYXRhIGFzIGFueVtdKVtpbmRleF07XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFJvdyA9IFtcclxuICAgICAgICAgICAgIW9yaWdpbmFsSXRlbT8uaXNUb3RhbFJvdyA/IHNlcmlhbE51bWJlcisrIDogJycsXHJcbiAgICAgICAgICAgIC4uLnJvd0RhdGFcclxuICAgICAgICAgIF07XHJcblxyXG4gICAgICAgICAgZnVsbFJvdy5mb3JFYWNoKCh2YWwsIGNJZHgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGRhdGFSb3cuZ2V0Q2VsbChjSWR4ICsgMSk7XHJcbiAgICAgICAgICAgIC8vY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgLyogICBpZiAoY0lkeCA9PT0gMCkge1xyXG4gY2VsbC52YWx1ZSA9IHZhbDtcclxufSBlbHNlIHtcclxuXHJcbiBjb25zdCBmaWVsZCA9IGNvbHVtbnNbY0lkeCAtIDFdPy5maWVsZDtcclxuXHJcbiBpZiAoXHJcbiAgICAgZmllbGQ9PSd0b3RhbFBheWluQW1vdW50J3x8XHJcbiAgICAgZmllbGQ9PSdwYXlpbkFtb3VudCd8fFxyXG4gICAgIGZpZWxkID09PSAndHJhbnNhY3Rpb25Db21taXNzaW9uQW1vdW50JyB8fFxyXG4gICAgIGZpZWxkID09PSAndGF4J1xyXG4gKSB7XHJcbiAgICAgY2VsbC52YWx1ZSA9IE51bWJlcih2YWwpO1xyXG4gICAgIGNlbGwubnVtRm10ID0gJyMsIyMwLjAwMCc7XHJcbiAgICAgY2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gfVxyXG4gZWxzZSB7XHJcbiAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuIH1cclxufSAqL1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW5zW2NJZHggLSAxXT8uZmllbGQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY0lkeCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob3JpZ2luYWxJdGVtPy5pc1RvdGFsUm93ICYmIGZpZWxkID09PSAncmVjZWl2ZUFtb3VudCcpIHtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgZmllbGQ/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2Ftb3VudCcpIHx8XHJcbiAgICAgICAgICAgICAgZmllbGQgPT09ICdzZXJ2aWNlRmVlJyB8fFxyXG4gICAgICAgICAgICAgIGZpZWxkID09PSAndGF4J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpZiAodmFsICE9PSAnJyAmJiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNlbGwudmFsdWUgPSB2YWw7ICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgbnVtYmVyXHJcbiAgICAgICAgICAgICAgICBjZWxsLm51bUZtdCA9ICcjLCMjMC4wMDAnOyAgICAgICAvLyBFeGNlbCBmb3JtYXR0aW5nXHJcbiAgICAgICAgICAgICAgICBjZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JywgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNlbGwudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2VsbC5ib3JkZXIgPSB7XHJcbiAgICAgICAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgICAgICBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbT8uaXNUb3RhbFJvdykge1xyXG4gICAgICAgICAgICBkYXRhUm93LmVhY2hDZWxsKGNlbGwgPT4ge1xyXG4gICAgICAgICAgICAgICBjZWxsLmZvbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5jZWxsLmZvbnQsXHJcbiAgICAgICAgICAgICAgICBib2xkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogMTJcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQVVUTyBXSURUSCA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRvdGFsQ29sczsgaSsrKSB7XHJcbiAgICAgIGxldCBtYXhMZW5ndGggPSAxMDtcclxuXHJcbiAgICAgIHdvcmtzaGVldC5lYWNoUm93KHsgaW5jbHVkZUVtcHR5OiB0cnVlIH0sIChyb3cpID0+IHtcclxuICAgICAgICBjb25zdCBjZWxsID0gcm93LmdldENlbGwoaSk7XHJcbiAgICAgICAgaWYgKGNlbGwuaXNNZXJnZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNlbGxWYWx1ZSA9ICcnO1xyXG5cclxuICAgICAgICBpZiAoY2VsbC52YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjZWxsVmFsdWUgPSAnJztcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjZWxsLnZhbHVlID09PSAnb2JqZWN0JyAmJiAncmljaFRleHQnIGluIGNlbGwudmFsdWUpIHtcclxuICAgICAgICAgIGNlbGxWYWx1ZSA9IGNlbGwudmFsdWUucmljaFRleHQubWFwKHJ0ID0+IHJ0LnRleHQpLmpvaW4oJycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjZWxsVmFsdWUgPSBjZWxsLnZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtYXhMZW5ndGggPSBNYXRoLm1heChtYXhMZW5ndGgsIGNlbGxWYWx1ZS5sZW5ndGgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHdvcmtzaGVldC5nZXRDb2x1bW4oaSkud2lkdGggPSBNYXRoLm1pbihtYXhMZW5ndGgsIDUwKTtcclxuICAgIH1cclxuICAgIC8vbmV3IGNvZGU6YmhhcmF0aVxyXG5cclxuICAgIHdvcmtzaGVldC5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuXHJcbiAgICAgIGlmIChpbmRleCA9PT0gMCkgcmV0dXJuOyAvLyBza2lwIFNyIE5vXHJcblxyXG4gICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbnNbaW5kZXggLSAxXT8uZmllbGQ7XHJcblxyXG4gICAgICBpZiAoZmllbGQgPT09ICdwYXlpbkFtb3VudCcpIHtcclxuICAgICAgICBjb2x1bW4ud2lkdGggPSAxNDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmllbGQgPT09ICdwYXlvdXRBbW91bnQnKSB7XHJcbiAgICAgICAgY29sdW1uLndpZHRoID0gMTU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZpZWxkID09PSAndHJhbnNhY3Rpb25Db3VudCcpIHtcclxuICAgICAgICBjb2x1bW4ud2lkdGggPSAxNDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gd29ya3NoZWV0LmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAvLyAgIGlmIChjb2x1bW4uaGVhZGVyID09PSAnU2VuZCBBbW91bnQnKSB7XHJcbiAgICAvLyAgICAgY29sdW1uLndpZHRoID0gMjU7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pO1xyXG5cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU0FWRSBGSUxFID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgd29ya2Jvb2sueGxzeC53cml0ZUJ1ZmZlcigpO1xyXG5cclxuICAgIEZpbGVTYXZlci5zYXZlQXMoXHJcbiAgICAgIG5ldyBCbG9iKFtidWZmZXJdLCB7XHJcbiAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0J1xyXG4gICAgICB9KSxcclxuICAgICAgdGl0bGUucmVwbGFjZSgvXFxzL2csICctJykgKyAnLnhsc3gnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gICBwcml2YXRlIHByZXBhcmVUYWJsZVJvd3MoZGF0YTogYW55W10sIGNvbHVtbnM6IGFueVtdLCBvcHRpb25zOiBFeHBvcnRPcHRpb25zID0ge30pOiBhbnlbXVtdIHtcclxuICAvLyAgICAgICAgICAgY29uc3Qge1xyXG4gIC8vICAgICAgICAgICAgICAgZXhjbHVkZUZpZWxkcyA9IFtdLFxyXG4gIC8vICAgICAgICAgICAgICAgY3VycmVuY3lGaWVsZHMgPSBbXSxcclxuICAvLyAgICAgICAgICAgICAgIGRhdGVGaWVsZHMgPSBbXSxcclxuICAvLyAgICAgICAgICAgICAgIGRhdGVGaWVsZEZvcm1hdHMgPSB7fSxcclxuICAvLyAgICAgICAgICAgICAgIHNwZWNpYWxEZWNpbWFsRmllbGRzID0ge31cclxuICAvLyAgICAgICAgICAgfSA9IG9wdGlvbnM7XHJcblxyXG4gIC8vICAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGNvbHVtbnMuZmlsdGVyKGMgPT5cclxuICAvLyAgICAgICAgICAgICAgIGMuZmllbGQgJiYgIWV4Y2x1ZGVGaWVsZHMuc29tZShmID0+IGMuZmllbGQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmKSlcclxuICAvLyAgICAgICAgICAgKTtcclxuXHJcbiAgLy8gICAgICAgICByZXR1cm4gZGF0YS5tYXAoKHJvdykgPT4gKFtcclxuICAvLyAuLi5maWx0ZXJlZC5tYXAoY29sID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSByb3dbY29sLmZpZWxkXTtcclxuICAvLyAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXQgZGF0ZSBmaWVsZHMgd2l0aCBjdXN0b20gZm9ybWF0cyBpZiBzcGVjaWZpZWRcclxuICAvLyAgICAgICAgICAgICAgICAgICBpZiAoY29sLmZpZWxkICYmIChkYXRlRmllbGRzLmluY2x1ZGVzKGNvbC5maWVsZCkgfHwgY29sLmZpZWxkIGluIGRhdGVGaWVsZEZvcm1hdHMpKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IGRhdGVGaWVsZEZvcm1hdHNbY29sLmZpZWxkXSB8fCAnZGQvTU0veXl5eSc7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5mb3JtYXREYXRlQnlGb3JtYXQodmFsdWUsIGZvcm1hdCk7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdCBzcGVjaWFsIGRlY2ltYWwgZmllbGRzIHdpdGggc3BlY2lmaWMgZGVjaW1hbHNcclxuICAvLyAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZmllbGQgJiYgY29sLmZpZWxkIGluIHNwZWNpYWxEZWNpbWFsRmllbGRzICYmIHZhbHVlICE9IG51bGwpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjaW1hbHMgPSBzcGVjaWFsRGVjaW1hbEZpZWxkc1tjb2wuZmllbGRdO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQoZGVjaW1hbHMpO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXQgcmVndWxhciBjdXJyZW5jeSBmaWVsZHMgd2l0aCAzIGRlY2ltYWxzXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmZpZWxkICYmIGN1cnJlbmN5RmllbGRzLmluY2x1ZGVzKGNvbC5maWVsZCkgJiYgdmFsdWUgIT0gbnVsbCkge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQoMyk7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAvLyAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPz8gJyc7XHJcbiAgLy8gICAgICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgICBdKSk7XHJcbiAgLy8gICAgICAgfVxyXG4gIHByaXZhdGUgcHJlcGFyZVRhYmxlUm93cyhcclxuICAgIGRhdGE6IGFueVtdLFxyXG4gICAgY29sdW1uczogYW55W10sXHJcbiAgICBvcHRpb25zOiBFeHBvcnRPcHRpb25zID0ge31cclxuICApOiBhbnlbXVtdIHtcclxuXHJcbiAgICBjb25zdCB7XHJcbiAgICAgIGV4Y2x1ZGVGaWVsZHMgPSBbXSxcclxuICAgICAgY3VycmVuY3lGaWVsZHMgPSBbXSxcclxuICAgICAgZGF0ZUZpZWxkcyA9IFtdLFxyXG4gICAgICBkYXRlRmllbGRGb3JtYXRzID0ge30sXHJcbiAgICAgIHNwZWNpYWxEZWNpbWFsRmllbGRzID0ge31cclxuICAgIH0gPSBvcHRpb25zO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkID0gY29sdW1ucy5maWx0ZXIoYyA9PlxyXG4gICAgICBjLmZpZWxkICYmICFleGNsdWRlRmllbGRzLnNvbWUoZiA9PiBjLmZpZWxkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZikpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiAoW1xyXG4gICAgICAuLi5maWx0ZXJlZC5tYXAoY29sID0+IHtcclxuXHJcbiAgICAgICAgbGV0IHZhbHVlID0gcm93W2NvbC5maWVsZF07XHJcblxyXG4gICAgICAgIC8vIOKchSBEYXRlIGZvcm1hdHRpbmcgKGtlZXAgYXMgc3RyaW5nKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbC5maWVsZCAmJlxyXG4gICAgICAgICAgKGRhdGVGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSB8fCBjb2wuZmllbGQgaW4gZGF0ZUZpZWxkRm9ybWF0cylcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IGRhdGVGaWVsZEZvcm1hdHNbY29sLmZpZWxkXSB8fCAnZGQvTU0veXl5eSc7XHJcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZUJ5Rm9ybWF0KHZhbHVlLCBmb3JtYXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g4pyFIFNwZWNpYWwgZGVjaW1hbCBmaWVsZHMg4oaSIHJldHVybiBOVU1CRVIgKG5vIHRvRml4ZWQpXHJcbiAgICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgICBjb2wuZmllbGQgJiZcclxuICAgICAgICAgIGNvbC5maWVsZCBpbiBzcGVjaWFsRGVjaW1hbEZpZWxkcyAmJlxyXG4gICAgICAgICAgdmFsdWUgIT0gbnVsbFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g4pyFIEN1cnJlbmN5IGZpZWxkcyDihpIgcmV0dXJuIE5VTUJFUiAobm8gdG9GaXhlZClcclxuICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgIGNvbC5maWVsZCAmJlxyXG4gICAgICAgICAgY3VycmVuY3lGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSAmJlxyXG4gICAgICAgICAgdmFsdWUgIT0gbnVsbFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlID8/ICcnO1xyXG4gICAgICB9KVxyXG4gICAgXSkpO1xyXG4gIH1cclxuICBwcml2YXRlIGZvcm1hdERhdGVCeUZvcm1hdCh2YWw6IGFueSwgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgLy8gSGVscGVyIHRvIHBhZCBzaW5nbGUgZGlnaXRzXHJcbiAgICBjb25zdCBwYWQgPSAobjogbnVtYmVyKSA9PiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuXHJcbiAgICAvLyBQYXJzZSBkYXRlIGZvciBcIkREL01NL1lZWVkgaGg6bW0gQU0vUE1cIiBmb3JtYXQgbWFudWFsbHlcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiAvXlxcZHsyfVxcL1xcZHsyfVxcL1xcZHs0fSBcXGR7Mn06XFxkezJ9IFtBUF1NJC8udGVzdCh2YWwpKSB7XHJcblxyXG4gICAgICBjb25zdCBwYXJ0cyA9IHZhbC5tYXRjaCgvXihcXGR7Mn0pXFwvKFxcZHsyfSlcXC8oXFxkezR9KSAoXFxkezJ9KTooXFxkezJ9KSAoW0FQXU0pJC8pO1xyXG4gICAgICBpZiAoIXBhcnRzKSByZXR1cm4gJyc7XHJcbiAgICAgIGxldCBbLCBkZCwgbW0sIHl5eXksIGhoLCBtaW4sIGFtcG1dID0gcGFydHM7XHJcbiAgICAgIGxldCBob3VycyA9IHBhcnNlSW50KGhoLCAxMCk7XHJcbiAgICAgIGlmIChhbXBtID09PSAnUE0nICYmIGhvdXJzICE9PSAxMikgaG91cnMgKz0gMTI7XHJcbiAgICAgIGlmIChhbXBtID09PSAnQU0nICYmIGhvdXJzID09PSAxMikgaG91cnMgPSAwO1xyXG4gICAgICB2YWwgPSBuZXcgRGF0ZShwYXJzZUludCh5eXl5LCAxMCksIHBhcnNlSW50KG1tLCAxMCkgLSAxLCBwYXJzZUludChkZCwgMTApLCBob3VycywgcGFyc2VJbnQobWluLCAxMCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsID0gbmV3IERhdGUodmFsKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNOYU4odmFsLmdldFRpbWUoKSkpIHJldHVybiAnJztcclxuXHJcbiAgICBjb25zdCBkdCA9IHZhbDtcclxuXHJcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xyXG4gICAgICBjYXNlICdkZC9NTS95eXl5IGhoOm1tIGEnOiB7IC8vIDExLzA3LzIwMjUgMTA6NTYgUE1cclxuICAgICAgICBsZXQgaG91cnMxMiA9IGR0LmdldEhvdXJzKCkgJSAxMiB8fCAxMjtcclxuICAgICAgICBsZXQgYW1wbSA9IGR0LmdldEhvdXJzKCkgPj0gMTIgPyAnUE0nIDogJ0FNJztcclxuICAgICAgICByZXR1cm4gYCR7cGFkKGR0LmdldERhdGUoKSl9LyR7cGFkKGR0LmdldE1vbnRoKCkgKyAxKX0vJHtkdC5nZXRGdWxsWWVhcigpfSAke3BhZChob3VyczEyKX06JHtwYWQoZHQuZ2V0TWludXRlcygpKX0gJHthbXBtfWA7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnZGQvTU0veXl5eSBISDptbSc6IHsgLy8gMjgvMDcvMjAyNSAxMzowOFxyXG4gICAgICAgIHJldHVybiBgJHtwYWQoZHQuZ2V0RGF0ZSgpKX0vJHtwYWQoZHQuZ2V0TW9udGgoKSArIDEpfS8ke2R0LmdldEZ1bGxZZWFyKCl9ICR7cGFkKGR0LmdldEhvdXJzKCkpfToke3BhZChkdC5nZXRNaW51dGVzKCkpfWA7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnZGQvTU0veXl5eSc6IHsgLy8gMjgvMDcvMjAyNVxyXG4gICAgICAgIHJldHVybiBgJHtwYWQoZHQuZ2V0RGF0ZSgpKX0vJHtwYWQoZHQuZ2V0TW9udGgoKSArIDEpfS8ke2R0LmdldEZ1bGxZZWFyKCl9YDtcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBkdC50b0xvY2FsZVN0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0ZVZhbHVlRm9ybWF0dGVyKGZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gKHBhcmFtczogYW55KSA9PiB7XHJcbiAgICAgIGlmICghcGFyYW1zLnZhbHVlKSByZXR1cm4gJyc7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdERhdGUocGFyYW1zLnZhbHVlLCBmb3JtYXQsICdlbi1VUycpO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEtleXMob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBvYmogPyBPYmplY3Qua2V5cyhvYmopIDogW107XHJcbiAgfVxyXG5cclxuICBoYXNBbnlHcm91cHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGEgJiYgdGhpcy5nZXRLZXlzKHRoaXMuZmlsdGVyZWREYXRhKS5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0QW1vdW50KHBhcmFtczogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zPy52YWx1ZTtcclxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJykge1xyXG4gICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICByZXR1cm4gKE1hdGgudHJ1bmMobnVtICogMTAwMCkgLyAxMDAwKS50b0ZpeGVkKDMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VhcmNoKGNyaXRlcmlhOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoQ3JpdGVyaWEgPSBjcml0ZXJpYS5zZWFyY2hDcml0ZXJpYTtcclxuICAgIHRoaXMucmVwb3J0RGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcclxuICAgIHRoaXMucmVwb3J0RGF0ZSA9IGZvcm1hdERhdGUodGhpcy5yZXBvcnREYXRlLCAnZGQvTU0veXl5eSBoaDptbSBhJywgJ2VuLVVTJyk7XHJcbiAgICBjb25zdCBtb2RhbCA9IGNyaXRlcmlhLm1vZGFsO1xyXG4gICAgdGhpcy51c2VyID0gY3JpdGVyaWEuc3lzVXNlcklEO1xyXG4gICAgdGhpcy5mcm9tRGF0ZSA9IGZvcm1hdERhdGUobW9kYWwuZnJvbURhdGUsICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKS5zbGljZSgwLCAxMCk7XHJcbiAgICB0aGlzLnRvRGF0ZSA9IGZvcm1hdERhdGUobW9kYWwudG9EYXRlLCAnZGQvTU0veXl5eSBoaDptbSBhJywgJ2VuLVVTJykuc2xpY2UoMCwgMTApO1xyXG4gICAgY29uc29sZS5sb2cobW9kYWwpO1xyXG4gICAgLy8gQ29kZSBGb3IgTWV0YSBEYXRhXHJcbiAgICB0aGlzLmxlZnREYXRhID0ge1xyXG4gICAgICAnUmVwb3J0IFBlcmlvZCc6IHRoaXMuZnJvbURhdGUgKyBcIiAtIFwiICsgdGhpcy50b0RhdGUsXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tZXRhRGF0YVR3byA9IHtcclxuICAgICAgJ1JlcG9ydCBVc2VyICYgVGltZSc6IHRoaXMudXNlciArIFwiIEAgXCIgKyB0aGlzLnJlcG9ydERhdGUsXHJcbiAgICB9XHJcbiAgICBjb25zdCBpc1RvdGFsU3VtbWFyeSA9IG1vZGFsLnN1bW1hcnlSZXBvcnQgPT09ICdUb3RhbCBTdW1tYXJ5JztcclxuICAgIHRoaXMuaXNUb3RhbFN1bW1hcnkgPSBpc1RvdGFsU3VtbWFyeTtcclxuXHJcbiAgICBjb25zdCBzZWFyY2hEYXRhID0ge1xyXG4gICAgICBcIlN0YXJ0RGF0ZVwiOiBtb2RhbC5mcm9tRGF0ZSxcclxuICAgICAgXCJFbmREYXRlXCI6IG1vZGFsLnRvRGF0ZSxcclxuICAgICAgXCJTZW5kQ291bnRyeUNvZGVcIjogbW9kYWwuc2VuZENvdW50cnksXHJcbiAgICAgIFwiUmVjdkNvdW50cnlDb2RlXCI6IG1vZGFsLnJlY2VpdmVDb3VudHJ5LFxyXG4gICAgICBcIkJ1c2luZXNzUGFydG5lckNvZGVcIjogbW9kYWwuY2xpZW50LFxyXG4gICAgICBcIlRyYW5zYWN0aW9uU3RhdHVzXCI6IG1vZGFsLnRyYW5zYWN0aW9uU3RhdHVzLmpvaW4oXCIsXCIpLFxyXG4gICAgICBcIlBheW91dEN1cnJlbmN5XCI6IG1vZGFsLnJlY2VpdmVDdXJyZW5jeSxcclxuICAgICAgXCJUcmFuc2FjdGlvblR5cGVcIjogbW9kYWwucHJvZHVjdCxcclxuICAgICAgXCJCcmFuY2hDb2RlXCI6IG1vZGFsLmJyYW5jaCxcclxuICAgICAgXCJTdW1tYXJ5UmVwb3J0XCI6IG1vZGFsLnN1bW1hcnlSZXBvcnRcclxuXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zaG93TWVzc2FnZSA9IHRydWU7XHJcbiAgICB0aGlzLmNsZWFyU2VhcmNoID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Mb2FkaW5nO1xyXG4gICAgdGhpcy5yZXBvcnRTZXJ2aWNlLmdldEJyYW5jaEFjdGl2aXR5U2VuZFN1bW1hcnlSZXBvcnQoc2VhcmNoRGF0YSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcclxuICAgICAgICB0aGlzLmRhdGFNYXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhKS5sZW5ndGggPT0gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICB0aGlzLnByb3h5RGF0YSA9IHN0cnVjdHVyZWRDbG9uZShkYXRhKTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25BcnJheSA9IG5ldyBBcnJheShPYmplY3Qua2V5cyh0aGlzLmZpbHRlcmVkRGF0YSkubGVuZ3RoKS5maWxsKDE1KTtcclxuICAgICAgICB0aGlzLnNob3dNZXNzYWdlID0gT2JqZWN0LmtleXModGhpcy5maWx0ZXJlZERhdGEpLmxlbmd0aCA9PSAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd1JlcG9ydCA9IHRydWU7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgICAgICB0aGlzLmNsZWFyU2VhcmNoID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgICAgICB0aGlzLnNob3dSZXBvcnQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2xlYXJTZWFyY2ggPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGhhbmRsZUZvcm1WYWxpZChpc1ZhbGlkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRm9ybVZhbGlkID0gaXNWYWxpZDtcclxuICB9XHJcblxyXG59XHJcblxyXG4iLCI8bGliLXNlYXJjaC1maWx0ZXIgXHJcbiAgICBbUmVwb3J0TmFtZV09XCJSZXBvcnROYW1lXCIgXHJcbiAgICAoc2VhcmNoQ2xpY2tlZCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiXHJcbiAgICAoZm9ybVZhbGlkKT1cImhhbmRsZUZvcm1WYWxpZCgkZXZlbnQpXCI+XHJcbjwvbGliLXNlYXJjaC1maWx0ZXIgPlxyXG48YXBwLWxvYWRlciBjbGFzcz1cIlwiICpuZ0lmPVwibG9hZGluZ1N0YXRlID09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG5cclxuPHNlY3Rpb24gKm5nSWY9XCJzaG93UmVwb3J0ICYmIGlzRm9ybVZhbGlkICYmICFjbGVhclNlYXJjaFwiIGNsYXNzPVwibXktMlwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbm9EYXRhRm91bmRcIj5cclxuICAgICA8bGliLW1ldGFkYXRhIFtyZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiBbc2hvd21ldGFEYXRhT25lXT1cInRydWVcIiBbc2hvd21ldGFEYXRhVHdvXT1cInRydWVcIiBbbWV0YURhdGFPbmVdPVwibGVmdERhdGFcIiBbbWV0YURhdGFUd29dPVwibWV0YURhdGFUd29cIihleHBvcnRFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiIChzZWFyY2hFdmVudCk9XCJmaWx0ZXIoJGV2ZW50KVwiPjwvbGliLW1ldGFkYXRhPlxyXG5cclxuICA8bmdiLWFjY29yZGlvbiAjYWNjPVwibmdiQWNjb3JkaW9uXCIgW2Nsb3NlT3RoZXJzXT1cImZhbHNlXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkRGF0YSB8IGtleXZhbHVlOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgIDxuZ2ItcGFuZWwgKm5nSWY9XCJpdGVtLnZhbHVlLmxlbmd0aCA+IDBcIiBbaWRdPVwiJ3BhbmVsLScgKyBpXCI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JQYW5lbFRpdGxlIHN0eWxlPVwiaGVpZ2h0OiAxMCU7XCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJwYW5lbC1jbHNcIj57e1xyXG4gICAgICAgICAgICBpdGVtLmtleVxyXG4gICAgICAgICAgICB9fTwvbGFiZWw+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nYlBhbmVsQ29udGVudD5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgIDxsaWItcGFnZS1zaXplLXNlbGVjdG9yIFt0b3RhbEVudHJpZXNdPVwiaXRlbT8udmFsdWU/Lmxlbmd0aFwiXHJcbiAgICAgICAgICAgIFtkZWZhdWx0U2l6ZV09XCInMTUnXCIgW2dyaWRBcGldPVwiZ3JpZEFwaXNbaV1cIj5cclxuICAgICAgICAgICAgPjwvbGliLXBhZ2Utc2l6ZS1zZWxlY3Rvcj5cclxuXHJcbiAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgY2xhc3M9XCJhZy10aGVtZS1hbHBpbmUgdHJhbnNhY3Rpb24tZ3JpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7aGVpZ2h0OiAzODBweDtcIlxyXG4gICAgICAgICAgICAgIFtjb2x1bW5EZWZzXT1cImNvbHVtbkRlZnNcIiBcclxuICAgICAgICAgICAgICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCIgXHJcbiAgICAgICAgICAgICAgW3Jvd0RhdGFdPVwiaXRlbS52YWx1ZVwiIFxyXG4gICAgICAgICAgICAgIFtyb3dIZWlnaHRdPVwiMjBcIlxyXG4gICAgICAgICAgICAgIFtoZWFkZXJIZWlnaHRdPVwiMjJcIlxyXG4gICAgICAgICAgICAgIFtwYWdpbmF0aW9uXT1cInRydWVcIiBcclxuICAgICAgICAgICAgICBbcGFnaW5hdGlvblBhZ2VTaXplXT1cInBhZ2luYXRpb25BcnJheVtpXVwiIFxyXG4gICAgICAgICAgICAgIFtyb3dDbGFzc1J1bGVzXT1cInJvd0NsYXNzUnVsZXNcIlxyXG4gICAgICAgICAgICAgIChncmlkUmVhZHkpPVwib25HcmlkUmVhZHkoJGV2ZW50LGkpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDwvbmdiLXBhbmVsPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZ2ItYWNjb3JkaW9uPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nIG10LTNcIiAqbmdJZj1cIm5vRGF0YUZvdW5kXCI+XHJcbiAgICBObyBEYXRhIGZvdW5kIG1hdGNoaW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhLlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+Il19
|