@sachin9822/reports-lib 0.0.126 → 0.0.127
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 +3 -3
- package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +886 -0
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +6 -0
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +3 -0
- package/esm2020/lib/models/component-loading-states.mjs +7 -0
- package/esm2020/lib/reports-lib.module.mjs +45 -13
- package/esm2020/lib/services/report.service.mjs +36 -1
- package/esm2020/lib/shared/loader/loader.component.mjs +11 -0
- package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +3 -3
- package/esm2020/public-api.mjs +9 -2
- package/fesm2015/sachin9822-reports-lib.mjs +1062 -96
- package/fesm2015/sachin9822-reports-lib.mjs.map +1 -1
- package/fesm2020/sachin9822-reports-lib.mjs +1052 -96
- package/fesm2020/sachin9822-reports-lib.mjs.map +1 -1
- package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +100 -0
- package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +13 -0
- package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +20 -0
- package/lib/models/component-loading-states.d.ts +5 -0
- package/lib/reports-lib.module.d.ts +12 -8
- package/lib/services/report.service.d.ts +8 -1
- package/lib/shared/loader/loader.component.d.ts +5 -0
- package/package.json +1 -1
- package/public-api.d.ts +5 -1
package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs
ADDED
@@ -0,0 +1,886 @@
|
|
1
|
+
import { Component } from '@angular/core';
|
2
|
+
// import { Component, ElementRef, HostListener, ViewChild } from '@angular/core';
|
3
|
+
import { FormArray, Validators } from '@angular/forms';
|
4
|
+
import * as XLSX from 'xlsx';
|
5
|
+
import { saveAs } from 'file-saver';
|
6
|
+
import * as ExcelJS from 'exceljs';
|
7
|
+
import * as FileSaver from 'file-saver';
|
8
|
+
import { themeAlpine } from '@ag-grid-community/theming';
|
9
|
+
import jsPDF from 'jspdf';
|
10
|
+
import { formatDate } from '@angular/common';
|
11
|
+
import { BranchActivitySendReportRequestDomainModel } from '../../models/branch-activity-report/branch-activity-send-report-request-domain-model';
|
12
|
+
import { forkJoin, of } from 'rxjs';
|
13
|
+
import { catchError } from 'rxjs/operators';
|
14
|
+
import { ComponentLoadingStates } from '../../models/component-loading-states';
|
15
|
+
import * as i0 from "@angular/core";
|
16
|
+
import * as i1 from "@angular/forms";
|
17
|
+
import * as i2 from "../../services/report.service";
|
18
|
+
import * as i3 from "ag-grid-angular";
|
19
|
+
import * as i4 from "@angular/common";
|
20
|
+
import * as i5 from "@ng-bootstrap/ng-bootstrap";
|
21
|
+
import * as i6 from "@ng-select/ng-select";
|
22
|
+
import * as i7 from "../../shared/loader/loader.component";
|
23
|
+
export class BranchActivitySendReportComponent {
|
24
|
+
constructor(formBuilder, reportService, ngZone) {
|
25
|
+
this.formBuilder = formBuilder;
|
26
|
+
this.reportService = reportService;
|
27
|
+
this.ngZone = ngZone;
|
28
|
+
this.dataMap = {};
|
29
|
+
this.filteredData = {};
|
30
|
+
this.proxyData = {};
|
31
|
+
this.clients = [];
|
32
|
+
this.clientsData = [];
|
33
|
+
this.clientBranches = [];
|
34
|
+
this.ranges = [10, 15, 20, 30, 50, 100, 200, 'All'];
|
35
|
+
this.paginationPageSize = 15;
|
36
|
+
this.showRange = false;
|
37
|
+
this.isAgentSelected = false;
|
38
|
+
this.selectedExportOption = 'excel';
|
39
|
+
this.user = "kaushik.kulsange@xpressmoney.tech";
|
40
|
+
this.myStatus = new FormArray([]);
|
41
|
+
this.status = ['All'];
|
42
|
+
this.errorMessage = '';
|
43
|
+
this.message = 'No Data Found';
|
44
|
+
this.ComponentLoadingState = ComponentLoadingStates;
|
45
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
46
|
+
this.exportFormats = [{ formatName: "Excel", code: 'excel' }, { formatName: "PDF", code: 'pdf' }, { formatName: "CSV", code: 'csv' }];
|
47
|
+
// flags
|
48
|
+
this.showStatusDropdown = false;
|
49
|
+
this.showClients = false;
|
50
|
+
this.showCurrency = false;
|
51
|
+
this.showProduct = false;
|
52
|
+
this.showSendCountry = false;
|
53
|
+
this.showReceiveCountry = false;
|
54
|
+
this.showBranch = false;
|
55
|
+
this.disableToDate = true;
|
56
|
+
this.showError = false;
|
57
|
+
this.showMessage = false;
|
58
|
+
this.selectAll = false;
|
59
|
+
this.noDataFound = false;
|
60
|
+
this.clientSelected = false;
|
61
|
+
this.columnDefs = [
|
62
|
+
{ field: 'businessDateTime', headerName: 'Business Date', flex: 1, headerClass: 'ag-left-aligned-header', minWidth: 70, width: 70, tooltipField: 'businessDateTime' },
|
63
|
+
{ field: 'transactionDateTime', headerName: 'Transaction Date', flex: 2, wrapText: true, autoHeight: true },
|
64
|
+
{ field: 'transactionNumber', headerName: 'Transaction Number', flex: 1.8, width: 130, cellClass: 'ag-left-cols-cell compact-cell-transaction', tooltipField: 'transactionNumber' },
|
65
|
+
{ field: 'product', headerName: 'Product', flex: 0.5, minWidth: 50, width: 60, tooltipField: 'product' },
|
66
|
+
{ field: 'sendAgentBranchCode', headerName: 'Send BranchCode', flex: 1, width: 120, tooltipField: 'sendAgentBranchCode' },
|
67
|
+
{ field: 'receiveAgentCode', headerName: 'Receive ClientCode', flex: 1, minWidth: 70, width: 70, tooltipField: 'receiveAgentCode' },
|
68
|
+
{ field: 'payoutCCcode', headerName: 'ReceiveCcy Code', flex: 1, width: 110, tooltipField: 'payoutCCcode' },
|
69
|
+
{ field: 'payoutAmount', headerName: 'Receive Amount', flex: 1, maxWidth: 130, valueFormatter: this.currencyFormatter.bind(this), cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payoutAmount' },
|
70
|
+
{ field: 'payinCCcode', headerName: 'SendCcy Code', flex: 1, maxWidth: 90, tooltipField: 'payinCCcode' },
|
71
|
+
{ field: 'payinAmount', headerName: 'Send Amount', flex: 1, maxWidth: 120, valueFormatter: this.currencyFormatter.bind(this), cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payinAmount' },
|
72
|
+
{ field: 'transactionCommissionAmount', headerName: 'Service Fee', flex: 1, maxWidth: 120, valueFormatter: this.currencyFormatter.bind(this), cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'transactionCommissionAmount' },
|
73
|
+
{ field: 'tax', headerName: 'Tax', flex: 1, width: 70, maxWidth: 100, valueFormatter: this.currencyFormatter.bind(this), cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'tax' },
|
74
|
+
{ field: 'totalPayinAmount', headerName: 'Total Send Amount', flex: 1, valueFormatter: this.currencyFormatter.bind(this), cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'totalPayinAmount' },
|
75
|
+
{ field: 'status', headerName: 'Transaction Status', flex: 1, tooltipField: 'status' }
|
76
|
+
];
|
77
|
+
this.defaultColDef = {
|
78
|
+
sortable: true,
|
79
|
+
filter: false,
|
80
|
+
resizable: true,
|
81
|
+
minwidth: 40,
|
82
|
+
wrapHeaderText: true,
|
83
|
+
autoHeaderHeight: true,
|
84
|
+
suppressSizeToFit: false,
|
85
|
+
wrapText: true
|
86
|
+
};
|
87
|
+
this.rowData = [];
|
88
|
+
this.reportTheme = themeAlpine.withParams({
|
89
|
+
headerFontSize: '10px',
|
90
|
+
fontFamily: ['Arial', 'sans-serif'],
|
91
|
+
fontSize: '9px'
|
92
|
+
});
|
93
|
+
}
|
94
|
+
ngOnInit() {
|
95
|
+
// Check if User is falcon user or fossilUser
|
96
|
+
if (sessionStorage.getItem('fossilusername')) {
|
97
|
+
this.sysUserId = sessionStorage.getItem('fossilusername');
|
98
|
+
}
|
99
|
+
else {
|
100
|
+
this.sysUserId = sessionStorage.getItem('ezremitusername');
|
101
|
+
}
|
102
|
+
this.sysUserId = this.sysUserId.replace(/^["'](.*)["']$/, '$1');
|
103
|
+
this.user = this.sysUserId;
|
104
|
+
console.log("System User Id : " + this.sysUserId);
|
105
|
+
this.initForm();
|
106
|
+
this.reportService.getCompanyConfig().subscribe(data => {
|
107
|
+
this.params = data;
|
108
|
+
console.log(this.params);
|
109
|
+
});
|
110
|
+
forkJoin({
|
111
|
+
params: this.reportService.getParams().pipe(catchError(err => {
|
112
|
+
console.error('Error loading params', err);
|
113
|
+
return of(null);
|
114
|
+
})),
|
115
|
+
clients: this.reportService.getPayInAgents(this.sysUserId).pipe(catchError(err => {
|
116
|
+
console.error('Error loading clients', err);
|
117
|
+
return of([]);
|
118
|
+
}))
|
119
|
+
}).subscribe({
|
120
|
+
next: ({ params, clients }) => {
|
121
|
+
this.params = params;
|
122
|
+
this.clients = [...clients];
|
123
|
+
this.clientsData = [...clients];
|
124
|
+
if (!sessionStorage.getItem('fossilusername') && this.clients?.length) {
|
125
|
+
this.selectClient(this.clients[0].code);
|
126
|
+
}
|
127
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
128
|
+
},
|
129
|
+
error: err => {
|
130
|
+
console.error('Unexpected forkJoin error', err);
|
131
|
+
this.loadingState = ComponentLoadingStates.Error;
|
132
|
+
},
|
133
|
+
complete: () => {
|
134
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
135
|
+
this.onClientSelected();
|
136
|
+
}
|
137
|
+
});
|
138
|
+
this.subscribeToDateChanges();
|
139
|
+
this.subscribeToClientChange();
|
140
|
+
//Convert Logo to base64
|
141
|
+
this.loadImageAsBase64('src/assets/reports-lib/images/XMCoral.png').then(base64 => {
|
142
|
+
this.logoBase64 = base64;
|
143
|
+
});
|
144
|
+
}
|
145
|
+
initForm() {
|
146
|
+
this.form = this.formBuilder.group({
|
147
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
148
|
+
toDate: [{ value: new Date().toISOString().split("T")[0], disabled: false }, Validators.required],
|
149
|
+
sendCountry: ['All', Validators.required],
|
150
|
+
receiveCountry: ['All', Validators.required],
|
151
|
+
client: [null, Validators.required],
|
152
|
+
branch: [{ value: null, disabled: this.isAgentSelected }, Validators.required],
|
153
|
+
product: ['All', Validators.required],
|
154
|
+
receiveCurrency: ['All', Validators.required],
|
155
|
+
transactionStatus: [['All'], Validators.required],
|
156
|
+
selectedStatus: ['All', Validators.required]
|
157
|
+
});
|
158
|
+
}
|
159
|
+
onSubmit() {
|
160
|
+
this.showStatusDropdown = false;
|
161
|
+
this.showClients = false;
|
162
|
+
this.searchText = "";
|
163
|
+
this.showError = false;
|
164
|
+
this.showReport = false;
|
165
|
+
// console.log(this.form.value)
|
166
|
+
this.fromDate = this.form.controls["fromDate"].value;
|
167
|
+
this.toDate = this.form.controls["toDate"].value;
|
168
|
+
// Validate Form
|
169
|
+
if (!this.form.valid) {
|
170
|
+
this.showError = true;
|
171
|
+
this.errorMessage = `Please fill all the required fields`;
|
172
|
+
return;
|
173
|
+
}
|
174
|
+
// Check if fromDate is greater than toDate
|
175
|
+
if (new Date(this.fromDate) > new Date(this.toDate)) {
|
176
|
+
this.showError = true;
|
177
|
+
this.errorMessage = `From Date ${this.fromDate} can not be greater than To Date ${this.toDate}`;
|
178
|
+
return;
|
179
|
+
}
|
180
|
+
// Calculate the difference in days
|
181
|
+
const from = new Date(this.fromDate);
|
182
|
+
const to = new Date(this.toDate);
|
183
|
+
const differenceInDays = Math.floor((to?.getTime() - from?.getTime()) / (1000 * 60 * 60 * 24));
|
184
|
+
// Check if the difference between the two dates exceeds 31 days (1 months approx)
|
185
|
+
if (differenceInDays > 31) {
|
186
|
+
this.showError = true;
|
187
|
+
this.errorMessage = `From Date ${this.fromDate} and To Date ${this.toDate} should have difference of max 1 month`;
|
188
|
+
return;
|
189
|
+
}
|
190
|
+
this.showError = false;
|
191
|
+
const d = new Date().toISOString();
|
192
|
+
this.reportDate = new Date().toISOString();
|
193
|
+
this.reportDate = formatDate(this.reportDate, 'dd/MM/yyyy hh:mm a', 'en-US');
|
194
|
+
const modal = this.mapFormToModel();
|
195
|
+
modal.transactionStatus = this.form.controls["selectedStatus"].value;
|
196
|
+
console.log(modal);
|
197
|
+
this.showMessage = true;
|
198
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
199
|
+
this.reportService.getBranchActivityReport(modal).subscribe({
|
200
|
+
next: (data) => {
|
201
|
+
console.log(data);
|
202
|
+
this.dataMap = JSON.parse(JSON.stringify(data));
|
203
|
+
this.filteredData = data;
|
204
|
+
this.noDataFound = Object.keys(this.filteredData).length == 0 ? true : false;
|
205
|
+
this.proxyData = structuredClone(data);
|
206
|
+
this.paginationArray = new Array(Object.keys(this.filteredData).length).fill(15);
|
207
|
+
this.showMessage = Object.keys(this.filteredData).length == 0 ? true : false;
|
208
|
+
this.showReport = true;
|
209
|
+
},
|
210
|
+
error: (err) => {
|
211
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
212
|
+
},
|
213
|
+
complete: () => {
|
214
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
215
|
+
}
|
216
|
+
});
|
217
|
+
}
|
218
|
+
onSearch() {
|
219
|
+
console.log(this.searchText);
|
220
|
+
if (this.searchText.trim().length === 0) {
|
221
|
+
this.filteredData = structuredClone(this.dataMap);
|
222
|
+
return;
|
223
|
+
}
|
224
|
+
this.searchText = this.searchText.toLowerCase();
|
225
|
+
for (const [key, entries] of Object.entries(this.proxyData)) {
|
226
|
+
const filteredData = entries.filter(entry => Object.values(entry)
|
227
|
+
.some(val => {
|
228
|
+
let a = val.toString().toLowerCase();
|
229
|
+
return a.search(this.searchText) == -1 ? false : true;
|
230
|
+
}));
|
231
|
+
this.filteredData[key] = filteredData;
|
232
|
+
}
|
233
|
+
this.filteredData;
|
234
|
+
}
|
235
|
+
onAgentSelected(code) {
|
236
|
+
if (this.form.controls['client'].value === null) {
|
237
|
+
return;
|
238
|
+
}
|
239
|
+
this.form.controls['branch'].patchValue(null);
|
240
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
241
|
+
this.reportService.getBranchByAgent(this.sysUserId, code).subscribe({
|
242
|
+
next: (data) => {
|
243
|
+
this.clientBranches = data;
|
244
|
+
},
|
245
|
+
error: (err) => {
|
246
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
247
|
+
},
|
248
|
+
complete: () => {
|
249
|
+
if (sessionStorage.getItem("ezremitusername")) {
|
250
|
+
const index = this.clientBranches.findIndex((branch) => branch.branchCode === "All");
|
251
|
+
if (index == -1) {
|
252
|
+
this.form.controls['branch'].setValue(this.clientBranches[0].branchCode);
|
253
|
+
}
|
254
|
+
else {
|
255
|
+
this.form.controls['branch'].setValue('All');
|
256
|
+
}
|
257
|
+
}
|
258
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
259
|
+
}
|
260
|
+
});
|
261
|
+
}
|
262
|
+
mapFormToModel() {
|
263
|
+
const data = new BranchActivitySendReportRequestDomainModel(this.form.getRawValue());
|
264
|
+
data.startDate = this.form.controls['fromDate'].value;
|
265
|
+
data.endDate = this.form.controls['toDate'].value;
|
266
|
+
data.sendCountryCode = this.form.controls['sendCountry'].value;
|
267
|
+
data.recvCountryCode = this.form.controls['receiveCountry'].value;
|
268
|
+
data.businessPartnerCode = this.form.controls['client'].value;
|
269
|
+
data.transactionStatus = this.form.controls['transactionStatus'].value;
|
270
|
+
data.transactionType = this.form.controls['product'].value;
|
271
|
+
data.branchCode = this.form.controls['branch'].value;
|
272
|
+
data.payoutCurrency = this.form.controls['receiveCurrency'].value;
|
273
|
+
data.companyCode = "BH";
|
274
|
+
return data;
|
275
|
+
}
|
276
|
+
onGridReady(params) {
|
277
|
+
params.api.sizeColumnsToFit();
|
278
|
+
this.gridAPi = params.api;
|
279
|
+
this.gridColumnApi = params.columnApi;
|
280
|
+
}
|
281
|
+
onGridSizeChanged(params) {
|
282
|
+
params.api.sizeColumnsToFit();
|
283
|
+
}
|
284
|
+
changeLimit(limit, index, key) {
|
285
|
+
if (limit != "All") {
|
286
|
+
this.paginationArray[index] = limit;
|
287
|
+
}
|
288
|
+
else {
|
289
|
+
this.paginationArray[index] = this.filteredData[key].length;
|
290
|
+
}
|
291
|
+
this.showRange = false;
|
292
|
+
}
|
293
|
+
async handleExport() {
|
294
|
+
const data = [];
|
295
|
+
this.gridAPi.forEachNode(node => data.push(node.data));
|
296
|
+
if (Object.keys(this.filteredData).length == 0) {
|
297
|
+
return;
|
298
|
+
}
|
299
|
+
switch (this.selectedExportOption) {
|
300
|
+
case 'excel':
|
301
|
+
this.exportExcel(data);
|
302
|
+
break;
|
303
|
+
case 'pdf':
|
304
|
+
this.exportPDF(data);
|
305
|
+
break;
|
306
|
+
case 'csv':
|
307
|
+
this.exportCSV(data);
|
308
|
+
break;
|
309
|
+
default:
|
310
|
+
alert('Please select an export format.');
|
311
|
+
}
|
312
|
+
}
|
313
|
+
// ------------------------ Utility ------------------------
|
314
|
+
loadImageAsBase64(imagePath) {
|
315
|
+
return new Promise((resolve, reject) => {
|
316
|
+
const img = new Image();
|
317
|
+
img.crossOrigin = 'anonymous';
|
318
|
+
img.src = imagePath;
|
319
|
+
img.onload = () => {
|
320
|
+
// Scale up canvas resolution (2x or more)
|
321
|
+
const scale = 2;
|
322
|
+
const canvas = document.createElement('canvas');
|
323
|
+
canvas.width = img.width * scale;
|
324
|
+
canvas.height = img.height * scale;
|
325
|
+
const ctx = canvas.getContext('2d');
|
326
|
+
if (ctx) {
|
327
|
+
ctx.scale(scale, scale); // Draw image at higher quality
|
328
|
+
ctx.drawImage(img, 0, 0);
|
329
|
+
const base64 = canvas.toDataURL('image/png', 1.0); // 1.0 = highest quality
|
330
|
+
resolve(base64);
|
331
|
+
}
|
332
|
+
else {
|
333
|
+
reject('Failed to get canvas context.');
|
334
|
+
}
|
335
|
+
};
|
336
|
+
img.onerror = () => reject('Failed to load image: ' + imagePath);
|
337
|
+
});
|
338
|
+
}
|
339
|
+
exportPDF(data) {
|
340
|
+
const currencyFields = ['payoutAmount', 'payinAmount', 'totalPayinAmount', 'tax', 'transactionCommissionAmount'];
|
341
|
+
data = Object.values(this.dataMap)[0];
|
342
|
+
const doc = new jsPDF({
|
343
|
+
orientation: 'landscape',
|
344
|
+
unit: 'mm',
|
345
|
+
format: [400, 210]
|
346
|
+
});
|
347
|
+
const pageWidth = doc.internal.pageSize.width;
|
348
|
+
//Title
|
349
|
+
const title = `Branch Activity Send`;
|
350
|
+
doc.setFontSize(15);
|
351
|
+
doc.setFont('helvetica', 'bold');
|
352
|
+
const textWidth = doc.getTextWidth(title);
|
353
|
+
doc.text(title, doc.internal.pageSize.width / 2, 15, { align: 'center' });
|
354
|
+
//Add Image
|
355
|
+
if (this.logoBase64) {
|
356
|
+
doc.addImage(this.logoBase64, 'PNG', 15, 5, 25, 20);
|
357
|
+
}
|
358
|
+
//Info block
|
359
|
+
const infoY = 30;
|
360
|
+
const leftMargin = 15;
|
361
|
+
const lineHeight = 7;
|
362
|
+
const infoLines = [
|
363
|
+
['Report User And Time:', this.user],
|
364
|
+
['Report Time', formatDate(this.reportDate, 'dd/MM/yyyy hh:mm a', 'en-US')]
|
365
|
+
// ['Report Period:', `${this.fromDate} - ${this.toDate}`]
|
366
|
+
];
|
367
|
+
doc.setFontSize(10);
|
368
|
+
infoLines.forEach(([label, value], i) => {
|
369
|
+
const y = infoY + i * lineHeight;
|
370
|
+
// Draw label in bold
|
371
|
+
doc.setFont('helvetica', 'bold');
|
372
|
+
doc.text(label, leftMargin, y);
|
373
|
+
// Draw value in normal font right after label
|
374
|
+
const labelWidth = doc.getTextWidth(label + ' ');
|
375
|
+
doc.setFont('helvetica', 'normal');
|
376
|
+
doc.text(value, leftMargin + labelWidth, y);
|
377
|
+
});
|
378
|
+
const filteredColumns = this.columnDefs.filter(col => !(col.headerName?.toLowerCase().includes('sr. no') || col.field?.toLowerCase().includes('srno') || col.field?.toLowerCase().includes('serial')));
|
379
|
+
// Prepare headers with Sr No
|
380
|
+
const headers = ['Sr No', ...filteredColumns.map(col => col.headerName || col.field)];
|
381
|
+
let Rows = [];
|
382
|
+
for (const [key, reports] of Object.entries(this.dataMap)) {
|
383
|
+
Rows.push([{ content: key, colSpan: 15 }]);
|
384
|
+
const rows = reports.map((row, index) => {
|
385
|
+
const rowData = filteredColumns.map(col => {
|
386
|
+
let value = row[col.field];
|
387
|
+
if (currencyFields.includes(col.field) && value != null) {
|
388
|
+
value = parseFloat(value).toFixed(3);
|
389
|
+
}
|
390
|
+
return value ?? '';
|
391
|
+
});
|
392
|
+
Rows.push([index + 1, ...rowData]);
|
393
|
+
return [index + 1, ...rowData];
|
394
|
+
});
|
395
|
+
// Rows.push(rows);
|
396
|
+
}
|
397
|
+
// Prepare rows with Sr No
|
398
|
+
const rows = data.map((row, index) => {
|
399
|
+
const rowData = filteredColumns.map(col => {
|
400
|
+
let value = row[col.field];
|
401
|
+
return value ?? '';
|
402
|
+
});
|
403
|
+
return [index + 1, ...rowData];
|
404
|
+
});
|
405
|
+
// Generate dynamic column styles for auto-width
|
406
|
+
const columnStyles = {};
|
407
|
+
headers.forEach((_, i) => {
|
408
|
+
columnStyles[i] = { cellWidth: 'auto' };
|
409
|
+
});
|
410
|
+
columnStyles[2] = { cellWidth: 40 };
|
411
|
+
// Render Table
|
412
|
+
doc.autoTable({
|
413
|
+
head: [headers],
|
414
|
+
body: Rows,
|
415
|
+
startY: infoY + infoLines.length * lineHeight + 5,
|
416
|
+
theme: 'grid',
|
417
|
+
headStyles: {
|
418
|
+
fillColor: [220, 220, 220],
|
419
|
+
textColor: 0,
|
420
|
+
fontStyle: 'bold',
|
421
|
+
fontSize: 9,
|
422
|
+
halign: 'center'
|
423
|
+
},
|
424
|
+
bdyStyles: {
|
425
|
+
fontSize: 8,
|
426
|
+
fillColor: [255, 255, 255],
|
427
|
+
textColor: [0, 0, 0]
|
428
|
+
},
|
429
|
+
styles: {
|
430
|
+
cellPadding: 2,
|
431
|
+
overflow: 'linebreak',
|
432
|
+
minCellHeight: 6
|
433
|
+
},
|
434
|
+
columnStyles: columnStyles
|
435
|
+
});
|
436
|
+
doc.save("Branch-Activity-Send-Report.pdf");
|
437
|
+
}
|
438
|
+
exportExcel(data) {
|
439
|
+
const currencyFields = ['payoutAmount', 'payinAmount', 'totalPayinAmount', 'tax', 'transactionCommissionAmount'];
|
440
|
+
const workbook = new ExcelJS.Workbook();
|
441
|
+
const worksheet = workbook.addWorksheet('Branch-Activity-Send-Report');
|
442
|
+
const totalColumns = this.columnDefs.length;
|
443
|
+
// Title Row
|
444
|
+
const titleRow = worksheet.addRow(["Branch Activity Send"]);
|
445
|
+
titleRow.font = { bold: true, size: 14 };
|
446
|
+
titleRow.height = 60;
|
447
|
+
worksheet.mergeCells(`A${titleRow.number}:${String.fromCharCode(64 + totalColumns)}${titleRow.number}`);
|
448
|
+
//Center align the title
|
449
|
+
const masterCell = worksheet.getCell(`A${titleRow.number}`);
|
450
|
+
masterCell.alignment = { horizontal: 'center', vertical: 'middle' };
|
451
|
+
// Add image if available
|
452
|
+
if (this.logoBase64) {
|
453
|
+
const base64Data = this.logoBase64.replace(/^data:image\/\w+;base64,/, '');
|
454
|
+
const imageId = workbook.addImage({
|
455
|
+
base64: base64Data,
|
456
|
+
extension: 'png',
|
457
|
+
});
|
458
|
+
// Place image at top-left (e.g., A1:C4)
|
459
|
+
worksheet.addImage(imageId, {
|
460
|
+
tl: { col: 0, row: 0 },
|
461
|
+
ext: { width: 150, height: 50 },
|
462
|
+
});
|
463
|
+
}
|
464
|
+
//Meta Data
|
465
|
+
const meta = [
|
466
|
+
['Report User ', this.user],
|
467
|
+
['Report Time', formatDate(this.reportDate, 'dd/MM/yyyy hh:mm a', 'en-US')]
|
468
|
+
// ['Report Period', `${this.fromDate} - ${this.toDate}`]
|
469
|
+
];
|
470
|
+
meta.forEach(([label, value]) => {
|
471
|
+
const row = worksheet.addRow([label, value]);
|
472
|
+
//Bold the key column
|
473
|
+
const labelCell = row.getCell(1);
|
474
|
+
labelCell.font = { bold: true };
|
475
|
+
});
|
476
|
+
// For Empty Row
|
477
|
+
worksheet.addRow([]);
|
478
|
+
// Add Header Row for Data Table
|
479
|
+
const headerRow = worksheet.addRow(this.columnDefs.map(col => col.headerName || col.field));
|
480
|
+
headerRow.font = { bold: true };
|
481
|
+
for (let i = 1; i <= this.columnDefs.length; i++) {
|
482
|
+
const cell = headerRow.getCell(i);
|
483
|
+
cell.fill = {
|
484
|
+
type: 'pattern',
|
485
|
+
pattern: 'solid',
|
486
|
+
fgColor: { argb: 'D9D9D9' },
|
487
|
+
};
|
488
|
+
}
|
489
|
+
headerRow.alignment = {
|
490
|
+
wrapText: true,
|
491
|
+
vertical: 'top',
|
492
|
+
horizontal: 'center'
|
493
|
+
};
|
494
|
+
headerRow.border = {
|
495
|
+
top: { style: 'thin' }, bottom: { style: 'thin' },
|
496
|
+
left: { style: 'thin' }, right: { style: 'thin' }
|
497
|
+
};
|
498
|
+
const dataStartRow = worksheet.lastRow.number + 1;
|
499
|
+
const branchRows = [];
|
500
|
+
for (const [key, reports] of Object.entries(this.dataMap)) {
|
501
|
+
console.log('Key:', key);
|
502
|
+
console.log('Reports:', reports);
|
503
|
+
const row = worksheet.addRow([`${key}`]);
|
504
|
+
worksheet.mergeCells(row.number, 1, row.number, 10);
|
505
|
+
branchRows.push(row.number);
|
506
|
+
// Add Data Rows
|
507
|
+
reports.forEach(row => {
|
508
|
+
const rowData = this.columnDefs.map(col => {
|
509
|
+
let value = row[col.field];
|
510
|
+
// Format currency fields
|
511
|
+
if (currencyFields.includes(col.field) && value != null) {
|
512
|
+
value = parseFloat(value).toFixed(3);
|
513
|
+
}
|
514
|
+
if (!isNaN(value) && value !== null && value !== '') {
|
515
|
+
return `\t ${value}`;
|
516
|
+
}
|
517
|
+
return value ?? '';
|
518
|
+
});
|
519
|
+
const dataRow = worksheet.addRow(rowData);
|
520
|
+
dataRow.border = {
|
521
|
+
top: { style: 'thin' }, bottom: { style: 'thin' },
|
522
|
+
left: { style: 'thin' }, right: { style: 'thin' }
|
523
|
+
};
|
524
|
+
});
|
525
|
+
worksheet.addRow([]);
|
526
|
+
}
|
527
|
+
// Auto column width ONLY based on data rows
|
528
|
+
for (let i = 1; i <= totalColumns; i++) {
|
529
|
+
let maxLength = 10;
|
530
|
+
for (let rowNum = dataStartRow; rowNum <= worksheet.lastRow.number; rowNum++) {
|
531
|
+
if (branchRows.indexOf(x => x === rowNum) === -1) {
|
532
|
+
continue;
|
533
|
+
}
|
534
|
+
const cell = worksheet.getRow(rowNum).getCell(i);
|
535
|
+
const val = cell.value ? cell.value.toString() : '';
|
536
|
+
maxLength = Math.max(maxLength, val.length);
|
537
|
+
}
|
538
|
+
worksheet.getColumn(i).width = maxLength + 2;
|
539
|
+
}
|
540
|
+
worksheet.getColumn(2).width = 20;
|
541
|
+
worksheet.getColumn(3).width = 15;
|
542
|
+
// Export
|
543
|
+
workbook.xlsx.writeBuffer().then(buffer => {
|
544
|
+
const blob = new Blob([buffer], {
|
545
|
+
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
546
|
+
});
|
547
|
+
FileSaver.saveAs(blob, 'Branch-Activity-Send-Report.xlsx');
|
548
|
+
});
|
549
|
+
}
|
550
|
+
exportCSV(data) {
|
551
|
+
const currencyFields = ['payoutAmount', 'payinAmount', 'totalPayinAmount', 'tax', 'transactionCommissionAmount'];
|
552
|
+
const metadata = [
|
553
|
+
['Report Title', 'Branch Activity Send'],
|
554
|
+
['Report Time', formatDate(this.reportDate, 'dd/MM/yyyy hh:mm a', 'en-US')]
|
555
|
+
// ['Report User', this.user]
|
556
|
+
];
|
557
|
+
const filteredCols = this.columnDefs.filter(col => !(col.headerName?.toLowerCase().includes('sr. no') ||
|
558
|
+
col.field?.toLowerCase().includes('sr. no')));
|
559
|
+
const headers = ['Sr No', ...filteredCols.map(col => col.headerName || col.field)];
|
560
|
+
let Rows = [];
|
561
|
+
for (const [key, reports] of Object.entries(this.dataMap)) {
|
562
|
+
Rows.push([key]);
|
563
|
+
reports.map((row, index) => {
|
564
|
+
const rowVals = filteredCols.map(col => {
|
565
|
+
let v = row[col.field];
|
566
|
+
if (currencyFields.includes(col.field) && v != null) {
|
567
|
+
v = parseFloat(v).toFixed(3);
|
568
|
+
}
|
569
|
+
if (col.field === 'transactionNumber' || col.headerName === 'Transaction Number') {
|
570
|
+
return `\t ${v}`;
|
571
|
+
}
|
572
|
+
return v ?? '';
|
573
|
+
});
|
574
|
+
Rows.push([index + 1, ...rowVals]);
|
575
|
+
return [index + 1, ...rowVals];
|
576
|
+
});
|
577
|
+
}
|
578
|
+
const aoa = [
|
579
|
+
...metadata,
|
580
|
+
[],
|
581
|
+
headers,
|
582
|
+
...Rows
|
583
|
+
];
|
584
|
+
// convert to worksheet & CSV
|
585
|
+
const ws = XLSX.utils.aoa_to_sheet(aoa);
|
586
|
+
const csv = XLSX.utils.sheet_to_csv(ws, {
|
587
|
+
FS: ',', RS: '\n', blankrows: false, forceQuotes: false
|
588
|
+
});
|
589
|
+
// trigger download
|
590
|
+
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
|
591
|
+
saveAs(blob, 'Branch-Activity-Send-Report.csv');
|
592
|
+
}
|
593
|
+
// showStatus(event: Event) {
|
594
|
+
// this.ngZone.run(() => {
|
595
|
+
// this.showStatusDropdown = !this.showStatusDropdown;
|
596
|
+
// });
|
597
|
+
// }
|
598
|
+
// selectStatus(event: Event) {
|
599
|
+
// const target = event.target as HTMLInputElement;
|
600
|
+
// this.status = [];
|
601
|
+
// // this.status = this.form.controls["selectedStatus"].value.split(",");
|
602
|
+
// this.selectAll = false;
|
603
|
+
// if (target.checked) {
|
604
|
+
// this.myStatus.push(new FormControl(target.value));
|
605
|
+
// console.log(this.myStatus);
|
606
|
+
// } else {
|
607
|
+
// const index = this.myStatus.controls
|
608
|
+
// .findIndex(ctrl => ctrl.value === target.value);
|
609
|
+
// if (index !== -1) {
|
610
|
+
// this.myStatus.removeAt(index);
|
611
|
+
// }
|
612
|
+
// }
|
613
|
+
// for (let i = 0; i < this.myStatus.controls.length; i++) {
|
614
|
+
// this.status.push(this.myStatus.controls[i].value);
|
615
|
+
// }
|
616
|
+
// console.log(this.myStatus);
|
617
|
+
// this.form.setControl('transactionStatus', new FormArray([new FormControl(target.value)]));
|
618
|
+
// this.form.controls["selectedStatus"].setValue(this.status.join(","));
|
619
|
+
// console.log(this.form.controls["selectedStatus"].value);
|
620
|
+
// }
|
621
|
+
// selectAllStatus(event: Event) {
|
622
|
+
// const target = event.target as HTMLInputElement;
|
623
|
+
// this.status = [];
|
624
|
+
// this.selectAll = !this.selectAll;
|
625
|
+
// if (target.checked) {
|
626
|
+
// for (let s of this.params?.transactionStatusTypes) {
|
627
|
+
// this.myStatus.push(new FormControl(s.transactionStatus));
|
628
|
+
// this.status.push(s.transactionStatus);
|
629
|
+
// }
|
630
|
+
// } else {
|
631
|
+
// this.myStatus.clear();
|
632
|
+
// this.status = []
|
633
|
+
// }
|
634
|
+
// this.form.controls["selectedStatus"].setValue(this.status.join(","));
|
635
|
+
// console.log(this.form.controls["selectedStatus"].value);
|
636
|
+
// }
|
637
|
+
//Currency Dropdown
|
638
|
+
// toggleCurrencyDropdown() {
|
639
|
+
// this.showCurrency = !this.showCurrency;
|
640
|
+
// }
|
641
|
+
// selectCurrency(currencyCode: string) {
|
642
|
+
// this.form.controls["receiveCurrency"].setValue(currencyCode);
|
643
|
+
// this.showCurrency = false;
|
644
|
+
// }
|
645
|
+
// getSelectedCurrencyDisplay(): string {
|
646
|
+
// const currency = this.form.controls["receiveCurrency"].value;
|
647
|
+
// if (currency && this.params?.currencies) {
|
648
|
+
// return this.params.currencies[this.params.currencies.findIndex(c => c.currencyCode == currency)].currency;
|
649
|
+
// } else {
|
650
|
+
// this.form.controls["receiveCurrency"].setValue("All");
|
651
|
+
// return "All";
|
652
|
+
// }
|
653
|
+
// }
|
654
|
+
//Product Dropdown
|
655
|
+
// toggleProductDropdown() {
|
656
|
+
// this.showProduct = !this.showProduct;
|
657
|
+
// }
|
658
|
+
// selectProduct(productCode: string) {
|
659
|
+
// this.form.controls["product"].setValue(productCode);
|
660
|
+
// this.showProduct = false;
|
661
|
+
// }
|
662
|
+
// getSelectedProductDisplay(): string {
|
663
|
+
// const product = this.form.controls["product"].value;
|
664
|
+
// if (product && this.params?.transactionProductTypes) {
|
665
|
+
// return this.params.transactionProductTypes[this.params.transactionProductTypes.findIndex(p => p.productCode == product)].name;
|
666
|
+
// } else {
|
667
|
+
// this.form.controls["product"].setValue("All");
|
668
|
+
// return "All";
|
669
|
+
// }
|
670
|
+
// }
|
671
|
+
//SendCountry Dropdown
|
672
|
+
// toggleSendCountryDropdown() {
|
673
|
+
// this.showSendCountry = !this.showSendCountry;
|
674
|
+
// }
|
675
|
+
// selectSendCountry(countryCode: any) {
|
676
|
+
// this.form.controls["sendCountry"].setValue(countryCode);
|
677
|
+
// this.showSendCountry = false;
|
678
|
+
// }
|
679
|
+
// getSelectedSendCountryDisplay(): string {
|
680
|
+
// const country = this.form.controls["sendCountry"].value;
|
681
|
+
// if (country && this.params?.countries) {
|
682
|
+
// return this.params.countries[this.params.countries.findIndex(c => c.countryCode == country)].country;
|
683
|
+
// } else {
|
684
|
+
// this.form.controls["sendCountry"].setValue("All");
|
685
|
+
// return "All";
|
686
|
+
// }
|
687
|
+
// }
|
688
|
+
//ReceiveCountry Dropdown
|
689
|
+
// toggleReceiveCountry() {
|
690
|
+
// this.showReceiveCountry = !this.showReceiveCountry;
|
691
|
+
// }
|
692
|
+
// selectReceiveCountry(countryCode: string) {
|
693
|
+
// this.form.controls["receiveCountry"].setValue(countryCode);
|
694
|
+
// this.showReceiveCountry = false;
|
695
|
+
// }
|
696
|
+
// getSelectedReceiveCountryDisplay(): string {
|
697
|
+
// const country = this.form.controls["receiveCountry"].value;
|
698
|
+
// if (country && this.params?.countries) {
|
699
|
+
// return this.params.countries[this.params.countries.findIndex(c => c.countryCode == country)].country;
|
700
|
+
// } else {
|
701
|
+
// this.form.controls["receiveCountry"].setValue("All");
|
702
|
+
// return "All";
|
703
|
+
// }
|
704
|
+
// }
|
705
|
+
//Clients Dropdown
|
706
|
+
// toggleClients() {
|
707
|
+
// this.showClients = !this.showClients;
|
708
|
+
// }
|
709
|
+
selectClient(client) {
|
710
|
+
this.form.controls["client"].setValue(client);
|
711
|
+
this.form.controls["branch"].setValue(null);
|
712
|
+
this.onAgentSelected(client);
|
713
|
+
this.showClients = false;
|
714
|
+
this.clientSelected = true;
|
715
|
+
}
|
716
|
+
// getSelectedClient(): string {
|
717
|
+
// let client = this.form.controls["client"].value;
|
718
|
+
// // if (sessionStorage.getItem('fossilusername')) {
|
719
|
+
// // } else {
|
720
|
+
// // if(!client && this.clients){
|
721
|
+
// // this.selectClient(this.clients[0].code);
|
722
|
+
// // }
|
723
|
+
// // }
|
724
|
+
// if (client) {
|
725
|
+
// return this.clients[this.clients.findIndex(c => c.code == client)].agent;
|
726
|
+
// } else {
|
727
|
+
// return "Select Client";
|
728
|
+
// }
|
729
|
+
// }
|
730
|
+
//Branch Dropdown
|
731
|
+
// toggleBranch() {
|
732
|
+
// this.showBranch = !this.showBranch;
|
733
|
+
// }
|
734
|
+
// selectBranch(branchCode: any) {
|
735
|
+
// this.form.controls["branch"].setValue(branchCode);
|
736
|
+
// this.showBranch = false;
|
737
|
+
// }
|
738
|
+
// getSelectedBranch(): string {
|
739
|
+
// const branch = this.form.controls["branch"].value;
|
740
|
+
// if (branch && this.clientBranches) {
|
741
|
+
// return this.clientBranches[this.clientBranches.findIndex(b => b.branchCode == branch)].businessPartnerBranch;
|
742
|
+
// } else {
|
743
|
+
// return "Select Branch";
|
744
|
+
// }
|
745
|
+
// }
|
746
|
+
//Status Dropdown
|
747
|
+
// toggleStatusDropdown() {
|
748
|
+
// this.showStatusDropdown = !this.showStatusDropdown;
|
749
|
+
// }
|
750
|
+
// clearError() {
|
751
|
+
// this.showError = false;
|
752
|
+
// }
|
753
|
+
// clearMessage() {
|
754
|
+
// this.showMessage = false;
|
755
|
+
// }
|
756
|
+
// dateChange(type: string) {
|
757
|
+
// if (type === "fromDate") {
|
758
|
+
// this.disableToDate = true;
|
759
|
+
// this.form.controls["fromDate"].enable();
|
760
|
+
// // this.form.controls["fromDate"].setValue(this.formatDate(this.form.controls["fromDate"].value));
|
761
|
+
// }
|
762
|
+
// if (type === "toDate") {
|
763
|
+
// // this.form.controls["toDate"].setValue(this.formatDate(this.form.controls["toDate"].value));
|
764
|
+
// }
|
765
|
+
// }
|
766
|
+
formatDate(params) {
|
767
|
+
return formatDate(new Date(params.value), 'dd/MM/yyyy', 'en-US');
|
768
|
+
}
|
769
|
+
activateBranchPagination(branchIndex) {
|
770
|
+
this.activeBranch = branchIndex;
|
771
|
+
this.showRange = !this.showRange;
|
772
|
+
}
|
773
|
+
currencyFormatter(params) {
|
774
|
+
if (params.value == null || params.value === '')
|
775
|
+
return '';
|
776
|
+
const number = parseFloat(params.value);
|
777
|
+
if (isNaN(number))
|
778
|
+
return params.value;
|
779
|
+
return number.toLocaleString('en-US', {
|
780
|
+
minimumFractionDigits: 3,
|
781
|
+
maximumFractionDigits: 3
|
782
|
+
});
|
783
|
+
}
|
784
|
+
//Date Picler
|
785
|
+
// onDateChangeFromDate(event: Event) {
|
786
|
+
// const input = event.target as HTMLInputElement;
|
787
|
+
// const selectedDate = input.value;
|
788
|
+
// this.form.controls["fromDate"].setValue(formatDate(new Date(selectedDate), 'dd/MM/yyyy', 'en-US'));
|
789
|
+
// }
|
790
|
+
// onDateChangeToDate(event: Event) {
|
791
|
+
// const input = event.target as HTMLInputElement;
|
792
|
+
// const selectedDate = input.value;
|
793
|
+
// this.form.controls["toDate"].setValue(formatDate(new Date(selectedDate), 'dd/MM/yyyy', 'en-US'));
|
794
|
+
// }
|
795
|
+
// onEnterKey(event: Event) {
|
796
|
+
// const keyboardEvent = event as KeyboardEvent;
|
797
|
+
// keyboardEvent.preventDefault();
|
798
|
+
// if (keyboardEvent.target instanceof HTMLElement) {
|
799
|
+
// keyboardEvent.target.blur();
|
800
|
+
// }
|
801
|
+
// }
|
802
|
+
// fromDateChange() {
|
803
|
+
// const msPerDay = 1000 * 60 * 60 * 24;
|
804
|
+
// const fd = this.form.controls["fromDate"].value;
|
805
|
+
// const td = this.form.controls["toDate"].value;
|
806
|
+
// const from = new Date(fd);
|
807
|
+
// const to = new Date(td);
|
808
|
+
// const differenceInDays = Math.floor((to?.getTime() - from?.getTime()) / (1000 * 60 * 60 * 24));
|
809
|
+
// if (differenceInDays > 31) {
|
810
|
+
// // Set toDate to fromDate + 31 days
|
811
|
+
// const d = new Date(from.getTime() + 31 * msPerDay);
|
812
|
+
// this.form.controls['toDate']?.patchValue(d);
|
813
|
+
// }
|
814
|
+
// }
|
815
|
+
// toDateChange() {
|
816
|
+
// const msPerDay = 1000 * 60 * 60 * 24;
|
817
|
+
// const fd = this.form.controls["fromDate"].value;
|
818
|
+
// const td = this.form.controls["toDate"].value;
|
819
|
+
// const from = new Date(fd);
|
820
|
+
// const to = new Date(td);
|
821
|
+
// const differenceInDays = Math.floor((to?.getTime() - from?.getTime()) / (1000 * 60 * 60 * 24));
|
822
|
+
// if (differenceInDays > 31) {
|
823
|
+
// // Set toDate to fromDate + 31 days
|
824
|
+
// const d = new Date(from.getTime() + 31 * msPerDay)
|
825
|
+
// this.form.controls['fromDate']?.patchValue(d);
|
826
|
+
// }
|
827
|
+
// }
|
828
|
+
subscribeToDateChanges() {
|
829
|
+
this.form.get('fromDate')?.valueChanges.subscribe(fromDateStr => {
|
830
|
+
const toDateControl = this.form.get('toDate');
|
831
|
+
const toDateStr = toDateControl?.value;
|
832
|
+
if (!fromDateStr || !toDateStr)
|
833
|
+
return;
|
834
|
+
const fromDate = new Date(fromDateStr);
|
835
|
+
const toDate = new Date(toDateStr);
|
836
|
+
const maxToDate = new Date(fromDate);
|
837
|
+
maxToDate?.setDate(fromDate.getDate() + 31);
|
838
|
+
if (toDate > maxToDate) {
|
839
|
+
toDateControl?.patchValue(maxToDate.toISOString().split("T")[0]);
|
840
|
+
}
|
841
|
+
});
|
842
|
+
this.form.get('toDate')?.valueChanges.subscribe(toDateStr => {
|
843
|
+
const fromDateControl = this.form.get('fromDate');
|
844
|
+
const fromDateStr = fromDateControl?.value;
|
845
|
+
if (!toDateStr || !fromDateStr)
|
846
|
+
return;
|
847
|
+
const toDate = new Date(toDateStr);
|
848
|
+
const fromDate = new Date(fromDateStr);
|
849
|
+
const minFromDate = new Date(toDate);
|
850
|
+
minFromDate?.setDate(toDate.getDate() - 31);
|
851
|
+
if (fromDate < minFromDate) {
|
852
|
+
fromDateControl?.patchValue(minFromDate.toISOString().split("T")[0]);
|
853
|
+
}
|
854
|
+
});
|
855
|
+
}
|
856
|
+
subscribeToClientChange() {
|
857
|
+
this.form.get('client')?.valueChanges.subscribe(val => {
|
858
|
+
if (val === null) {
|
859
|
+
this.form.controls['branch'].patchValue(null);
|
860
|
+
}
|
861
|
+
});
|
862
|
+
}
|
863
|
+
// searchClient(event:Event){
|
864
|
+
// const target = event.target as HTMLInputElement;
|
865
|
+
// let searchText = target.value.trim();
|
866
|
+
// if(searchText.length==0){
|
867
|
+
// this.clients = [...this.clientsData];
|
868
|
+
// }
|
869
|
+
// this.clients = this.clientsData.filter((client)=>{
|
870
|
+
// client?.agent?.includes(searchText);
|
871
|
+
// })
|
872
|
+
// }
|
873
|
+
onClientSelected() {
|
874
|
+
this.form.get('client')?.valueChanges.subscribe((val) => {
|
875
|
+
val = this.form.get('client')?.value;
|
876
|
+
this.onAgentSelected(val);
|
877
|
+
});
|
878
|
+
}
|
879
|
+
}
|
880
|
+
BranchActivitySendReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendReportComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ReportService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
881
|
+
BranchActivitySendReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BranchActivitySendReportComponent, selector: "lib-branch-activity-send-report", ngImport: i0, template: "<section>\r\n <div class=\"Breadcrumb\">\r\n <h1>Reports</h1>\r\n <span class=\"BreadCrumbArrow\"></span>\r\n <h2 class=\"BreadCrumbActive\">Branch Activity Send</h2>\r\n </div>\r\n</section>\r\n\r\n<section id=\"request-params\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\">\r\n <table>\r\n <tbody>\r\n <tr>\r\n <td style=\"width: 36%;border-top: 0;\">\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2\">\r\n <label class=\"label-data\" for=\"client\">Client<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"clients\">\r\n <ng-select [items]=\"clients\" bindLabel=\"agent\" bindValue=\"code\" formControlName=\"client\"\r\n placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.agent }}\" class=\"ng-option-text\">\r\n {{ item.agent }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"client\" required>\r\n <ng-option *ngFor=\"let client of clients\" [value]=\"client.code\">\r\n {{ client.agent }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n <td style=\"width: 28%;\">\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\" col-2\">\r\n <label class=\"label-data\">From<span class=\"text-danger\">*</span> Date</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <div class=\"input-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #fromDateInput=\"ngbDatepicker\" name=\"fromDate\" id=\"fromDate\" formControlName=\"fromDate\" />\r\n <div class=\"input-group-append\">\r\n <button class=\"input-group-button cal\" (click)=\"fromDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <!-- <input id=\"fromdate\" class=\"form-control form-control-sm\" type=\"date\" formControlName=\"fromDate\"> -->\r\n </div>\r\n </div>\r\n </td>\r\n <td style=\"width: 28%;\">\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2\">\r\n <label class=\"label-data\">To<span class=\"text-danger\">*</span> Date</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <!-- <input id=\"todate\" class=\"form-control form-control-sm\" type=\"date\" formControlName=\"toDate\"> -->\r\n <div class=\"input-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #toDateInput=\"ngbDatepicker\" name=\"toDate\" id=\"toDate\" formControlName=\"toDate\" />\r\n <div class=\"input-group-append\">\r\n <button class=\"input-group-button cal\" (click)=\"toDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td style=\"width: 8%;\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"btn-box\">\r\n <button class=\"btn btn-report\" (click)=\"onSubmit()\">View</button>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"branch\">Branch<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"clientBranches\">\r\n <ng-select [items]=\"clientBranches\" bindLabel=\"businessPartnerBranch\" bindValue=\"branchCode\"\r\n formControlName=\"branch\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.businessPartnerBranch }}\" class=\"ng-option-text\">\r\n {{ item.businessPartnerBranch }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\"> Send<span class=\"text-danger\">*</span> Country</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.countries\" bindLabel=\"country\" bindValue=\"countryCode\"\r\n formControlName=\"sendCountry\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.country }}\" class=\"ng-option-text\">\r\n {{ item.country }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"sendCountry\" required>\r\n <ng-option *ngFor=\"let country of params.countries\" [value]=\"country.countryCode\">\r\n {{ country.country }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"receiveCountry\"> Receive<span class=\"text-danger\">*</span>\r\n Country</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.countries\" bindLabel=\"country\" bindValue=\"countryCode\"\r\n formControlName=\"receiveCountry\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.country }}\" class=\"ng-option-text\">\r\n {{ item.country }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"receiveCountry\" required>\r\n <ng-option *ngFor=\"let country of params.countries\" [value]=\"country.countryCode\">\r\n {{ country.country }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"transactionStatus\">Transaction Status <span\r\n class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.transactionStatusTypes\" [multiple]=\"true\"\r\n formControlName=\"transactionStatus\" bindLabel=\"transactionStatus\" bindValue=\"transactionStatus\"\r\n placeholder=\"Select items\" [closeOnSelect]=\"false\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input type=\"checkbox\" [checked]=\"item$.selected\" /> {{ item.transactionStatus }}\r\n </ng-template>\r\n </ng-select>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"product\">Product<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <div class=\"custom-dropdown-container\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.transactionProductTypes\" bindLabel=\"name\" bindValue=\"productCode\"\r\n formControlName=\"product\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.name }}\" class=\"ng-option-text\">\r\n {{ item.name }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"product\" required>\r\n <ng-option *ngFor=\"let product of params.transactionProductTypes\" [value]=\"product.productCode\">\r\n {{ product.name }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"receiveCurrency\">Receive<span class=\"text-danger\">*</span>\r\n Currency</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.currencies\" bindLabel=\"currency\" bindValue=\"currencyCode\"\r\n formControlName=\"receiveCurrency\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.currency }}\" class=\"ng-option-text\">\r\n {{ item.currency }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"receiveCurrency\" required>\r\n <ng-option *ngFor=\"let currency of params.currencies\" [value]=\"currency.currencyCode\">\r\n {{ currency.currency }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </form>\r\n</section>\r\n\r\n\r\n\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<div class=\"alert alert-danger mt-3 d-flex justify-content-between align-items-center\" *ngIf=\"showError\">\r\n <span>{{ errorMessage }}</span>\r\n</div>\r\n\r\n<section *ngIf=\"showReport\" class=\"my-2\">\r\n <div class=\"title mb-3\">\r\n Branch Activity Send\r\n </div>\r\n <div class=\"mb-2 flex-container\">\r\n <tbody>\r\n <tr>\r\n <td class=\"labl meta-td\">Report User:</td>\r\n <td class=\"px-3 meta-td\"><span class=\"info\">{{user}}</span></td>\r\n </tr>\r\n <tr>\r\n <td class=\"labl meta-td\">Report Time:</td>\r\n <td class=\"px-3 meta-td\"><span class=\"info\">{{ reportDate }}</span></td>\r\n </tr>\r\n </tbody>\r\n </div>\r\n\r\n <!-- Info Message -->\r\n <!-- <div class=\"alert alert-danger mt-3 d-flex justify-content-between align-items-center\"\r\n *ngIf=\"showMessage\">\r\n <span><strong>Message:</strong> {{ message }}</span>\r\n <button type=\"button\" class=\"btn-close\" (click)=\"clearMessage()\"></button>\r\n</div> -->\r\n\r\n <div class=\"added-functions\">\r\n <div class=\"searchBox\">\r\n <input type=\"text\" [(ngModel)]=\"searchText\" name=\"searchText\" class=\"search-input\" (ngModelChange)=\"onSearch()\"\r\n placeholder=\"Search...\" autocomplete=\"off\" />\r\n\r\n <button type=\"button\" class=\"btn btn-sm search-btn\" (click)=\"onSearch()\">\r\n <img src=\"assets/images/Search.svg\" alt=\"Search\" class=\"search-icon\" />\r\n </button>\r\n\r\n </div>\r\n <div class=\"export-options\">\r\n <ng-select placeholder=\"- Please select -\" class=\"export-selector\" [(ngModel)]=\"selectedExportOption\"\r\n [clearable]=\"false\" required>\r\n <ng-option *ngFor=\"let format of exportFormats\" [value]=\"format.code\">\r\n {{ format.formatName }}\r\n </ng-option>\r\n </ng-select>\r\n <!-- <select class=\"opt-cls\" [(ngModel)]=\"selectedExportOption\">\r\n <option value=\"excel\" selected>Excel</option>\r\n <option value=\"pdf\">PDF</option>\r\n <option value=\"csv\">CSV</option>\r\n </select> -->\r\n </div>\r\n <div>\r\n <button class=\"btn btn-report\" (click)=\"handleExport()\">Export</button>\r\n <!-- <div class=\"btn-box\">\r\n </div> -->\r\n </div>\r\n </div>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\" [activeIds]=\"'panel-0'\">\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 style=\"font-weight: bold; font-size: 13px; line-height: 1.2; margin: 0; padding: 2px 0;color: #0c63e4;\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <ag-grid-angular class=\"ag-theme-alpine compact-grid myGrid\" style=\"width: 100%;height: 370px;\"\r\n [columnDefs]=\"columnDefs\" [defaultColDef]=\"defaultColDef\" [rowData]=\"item.value\" [rowHeight]=\"20\"\r\n [headerHeight]=\"22\" [gridOptions]=\"{\r\n suppressHorizontalScroll: true,\r\n scrollbarWidth: 0\r\n }\" [pagination]=\"true\" [paginationPageSize]=\"paginationArray[i]\" (gridReady)=\"onGridReady($event)\"\r\n (gridSizeChanged)=\"onGridSizeChanged($event)\">\r\n </ag-grid-angular>\r\n\r\n\r\n <div class=\"pgn\">\r\n <div style=\"position: absolute;\">\r\n <div class=\"pagination-mobile mb-2\">\r\n <div class=\"ngx-dropdown ngx-range-dropdown\" [class.ngx-active]=\"showRange && activeBranch == i\">\r\n <div class=\"ngx-btn-group\">\r\n <span *ngIf=\"ranges.indexOf(paginationArray[i]) != -1; else showAll\"\r\n class=\"ngx-btn ngx-range-dropdown-button\" (click)=\"activateBranchPagination(i)\">\r\n {{ paginationArray[i] }} <i class=\"ngx-icon ngx-icon-arrow-down\"></i>\r\n </span>\r\n <ng-template #showAll>\r\n <span class=\"ngx-btn ngx-range-dropdown-button\" (click)=\"activateBranchPagination(i)\">\r\n All <i class=\"ngx-icon ngx-icon-arrow-down\"></i>\r\n </span>\r\n </ng-template>\r\n <span class=\"pagination-label\">Entries per page</span>\r\n <ul class=\"ngx-menu\" *ngIf=\"showRange\">\r\n <li class=\"ngx-c-hand ngx-range-dropdown-button\" *ngFor=\"let limit of ranges\"\r\n (click)=\"changeLimit(limit,i,item.key)\">\r\n <span>{{ limit }}</span>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data Found\r\n </div>\r\n</section>", styles: ["@charset \"UTF-8\";@import\"ag-grid-community/styles/ag-grid.css\";@import\"ag-grid-community/styles/ag-theme-alpine.css\";.btn-report{border-radius:3px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px;min-width:80px;margin:0 0 0 20px!important;padding:4px 15px!important;border:none!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}.cal:focus{box-shadow:none!important}.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;padding-top:.15rem!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{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}.search-btn{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}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}.meta-td{padding:0!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;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:ellipsis!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}.ag-theme-alpine{--ag-header-font-size: 9px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}.ag-theme-alpine .ag-header-cell-label,.ag-theme-alpine .ag-header-group-cell-label{justify-content:flex-start!important}::ng-deep .ag-root{-webkit-user-select:text!important;user-select:text!important}::ng-deep .compact-grid{font-weight:500!important;line-height:1.1!important}::ng-deep .compact-grid .ag-header-cell{padding:1px 2px!important;font-size:10px!important;font-weight:700!important;line-height:1.2!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important;text-align:center!important;background-color:#f8f9fa;border-right:1px solid #e0e0e0}.myGrid .ag-center-cols-clipper,.myGrid .ag-body-viewport{display:none}::ng-deep .compact-grid .ag-header-cell-text{font-size:10px!important;font-weight:700!important;text-align:center!important;width:100%}::ng-deep .compact-grid .ag-cell{cursor:default!important;border-right:1px solid #e0e0e0;padding:2px 3px!important;font-size:9px!important;display:flex!important;align-items:center!important}::ng-deep .compact-grid .ag-cell-value{cursor:text!important;font-size:9px!important;padding:0 3px 0 2px!important}::ng-deep .compact-grid .description-cell{white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-overflow:clip!important;text-align:left!important;padding:3px 4px!important;line-height:1.5!important;display:block!important;overflow:hidden!important;max-height:none!important}::ng-deep .compact-grid .compact-cell{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important;align-items:center!important}::ng-deep .compact-cell-transaction{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important;align-items:left!important;padding-left:5px!important}::ng-deep .compact-grid .ag-right-aligned-cell{text-align:right!important;justify-content:flex-end!important;text-overflow:ellipsis}::ng-deep .ag-left-cols-cell{text-align:left!important;text-overflow:ellipsis!important}::ng-deep .compact-grid .ag-center-cols-cell{text-align:center!important;justify-content:center!important}::ng-deep .ag-center-cols-viewport{width:100%;overflow-x:hidden!important}::ng-deep .compact-grid .ag-row{min-height:20px!important;max-height:none!important;border-bottom:1px solid #f0f0f0}::ng-deep .compact-grid .ag-row:hover{background-color:#f8f9fa!important}::ng-deep .ag-cell-value.ag-cell-link{cursor:pointer!important}::ng-deep .ag-paging-panel{border-top:1px solid;border-top-color:var(--ag-border-color);color:var(--ag-secondary-foreground-color);height:30px}.btn-box{width:16rem;margin:0 0 0 20px!important}.meta-td{padding:0!important}.form-group label{display:inline-block;padding-right:5px}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.75rem;border-radius:.25rem;font-weight:400;color:#000;border-color:#ddd}.added-functions{display:flex;justify-content:flex-end;width:100%;padding-right:4px;margin-bottom:.625rem}.pagination-mobile .ngx-range-dropdown{margin-top:8px;margin-right:2px}.pagination-mobile .ngx-range-dropdown .ngx-btn,.pagination-mobile .ngx-range-dropdown .ngx-menu .ngx-range-dropdown-button{cursor:pointer}.ngx-btn{color:#050506;border:1px solid #050506;display:inline-block;width:4rem}.ngx-range-dropdown-button{padding-left:.2rem;list-style:none;font-size:12px}.pagination-label{margin-left:10px;font-size:10px;font-weight:600}@media screen and (max-width: 480px){.pagination-mobile{margin-right:auto;margin-left:auto}}.searchBox{margin-right:auto;display:flex}::ng-deep .card-header{padding:.25rem .75rem}.custom-panel-title{font-size:13px;line-height:1.2;margin:0;padding:2px 0;height:30px}::ng-deep .accordion-button{position:relative;display:flex;align-items:center;width:100%;height:30px;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:#e7f1ff;border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}.small-labels p,.compact-report-metadata .text-dark p{margin-bottom:.15rem!important;margin-left:1rem!important;line-height:1.2}::ng-deep .small-labels p{font-weight:700!important;color:#000!important}::ng-deep .text-dark p{font-weight:500!important;color:#000!important}.ngx-icon-arrow-down:before,.ngx-icon-arrow-left:before,.ngx-icon-arrow-right:before,.ngx-icon-arrow-up:before,.ngx-icon-downward:before,.ngx-icon-back:before,.ngx-icon-forward:before,.ngx-icon-upward:before{border:.1rem solid currentColor;border-bottom:0;border-right:0;content:\"\";height:.65em;width:.65em}.ngx-icon:before,.ngx-icon:after{display:block;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) rotate(45deg)}*,:after,:before{box-sizing:border-box}.ngx-icon{box-sizing:border-box;display:inline-block;font-size:inherit;font-style:normal;height:1em;position:relative;text-indent:-9999px;vertical-align:middle;width:1em}.pgn{position:relative;top:-2.1rem;left:2px;width:30%!important;height:10%!important}.ngx-menu{position:relative;top:-11.4rem;width:3rem;background:#fff;border-radius:.1rem;box-shadow:0 .05rem .2rem #454d5d4d;list-style:none;margin:0;min-width:4rem;padding:.4rem;transform:translateY(.2rem);z-index:100}.ngx-btn-group{height:10px}.accordion-button:before{display:none!important}.status-text{width:100%;transform:scale(1)}.custom-input{width:100%;border:none;caret-color:transparent;cursor:pointer;text-transform:uppercase}.custom-input:focus{outline:none}#request-params{padding-bottom:2px;border-bottom:1px solid rgba(74,73,73,.1)}\n"], dependencies: [{ kind: "component", type: i3.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: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "component", type: i5.NgbAccordion, selector: "ngb-accordion", inputs: ["animation", "activeIds", "closeOthers", "destroyOnHide", "type"], outputs: ["panelChange", "shown", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbPanel, selector: "ngb-panel", inputs: ["disabled", "id", "title", "type", "cardClass"], outputs: ["shown", "hidden"] }, { kind: "directive", type: i5.NgbPanelTitle, selector: "ng-template[ngbPanelTitle]" }, { kind: "directive", type: i5.NgbPanelContent, selector: "ng-template[ngbPanelContent]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "component", type: i6.NgOptionComponent, selector: "ng-option", inputs: ["value", "disabled"] }, { kind: "directive", type: i6.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "component", type: i7.LoaderComponent, selector: "app-loader" }, { kind: "pipe", type: i4.KeyValuePipe, name: "keyvalue" }] });
|
882
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendReportComponent, decorators: [{
|
883
|
+
type: Component,
|
884
|
+
args: [{ selector: 'lib-branch-activity-send-report', template: "<section>\r\n <div class=\"Breadcrumb\">\r\n <h1>Reports</h1>\r\n <span class=\"BreadCrumbArrow\"></span>\r\n <h2 class=\"BreadCrumbActive\">Branch Activity Send</h2>\r\n </div>\r\n</section>\r\n\r\n<section id=\"request-params\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\">\r\n <table>\r\n <tbody>\r\n <tr>\r\n <td style=\"width: 36%;border-top: 0;\">\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2\">\r\n <label class=\"label-data\" for=\"client\">Client<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"clients\">\r\n <ng-select [items]=\"clients\" bindLabel=\"agent\" bindValue=\"code\" formControlName=\"client\"\r\n placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.agent }}\" class=\"ng-option-text\">\r\n {{ item.agent }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"client\" required>\r\n <ng-option *ngFor=\"let client of clients\" [value]=\"client.code\">\r\n {{ client.agent }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n <td style=\"width: 28%;\">\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\" col-2\">\r\n <label class=\"label-data\">From<span class=\"text-danger\">*</span> Date</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <div class=\"input-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #fromDateInput=\"ngbDatepicker\" name=\"fromDate\" id=\"fromDate\" formControlName=\"fromDate\" />\r\n <div class=\"input-group-append\">\r\n <button class=\"input-group-button cal\" (click)=\"fromDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <!-- <input id=\"fromdate\" class=\"form-control form-control-sm\" type=\"date\" formControlName=\"fromDate\"> -->\r\n </div>\r\n </div>\r\n </td>\r\n <td style=\"width: 28%;\">\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2\">\r\n <label class=\"label-data\">To<span class=\"text-danger\">*</span> Date</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <!-- <input id=\"todate\" class=\"form-control form-control-sm\" type=\"date\" formControlName=\"toDate\"> -->\r\n <div class=\"input-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #toDateInput=\"ngbDatepicker\" name=\"toDate\" id=\"toDate\" formControlName=\"toDate\" />\r\n <div class=\"input-group-append\">\r\n <button class=\"input-group-button cal\" (click)=\"toDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td style=\"width: 8%;\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"btn-box\">\r\n <button class=\"btn btn-report\" (click)=\"onSubmit()\">View</button>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"branch\">Branch<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"clientBranches\">\r\n <ng-select [items]=\"clientBranches\" bindLabel=\"businessPartnerBranch\" bindValue=\"branchCode\"\r\n formControlName=\"branch\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.businessPartnerBranch }}\" class=\"ng-option-text\">\r\n {{ item.businessPartnerBranch }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\"> Send<span class=\"text-danger\">*</span> Country</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.countries\" bindLabel=\"country\" bindValue=\"countryCode\"\r\n formControlName=\"sendCountry\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.country }}\" class=\"ng-option-text\">\r\n {{ item.country }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"sendCountry\" required>\r\n <ng-option *ngFor=\"let country of params.countries\" [value]=\"country.countryCode\">\r\n {{ country.country }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"receiveCountry\"> Receive<span class=\"text-danger\">*</span>\r\n Country</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.countries\" bindLabel=\"country\" bindValue=\"countryCode\"\r\n formControlName=\"receiveCountry\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.country }}\" class=\"ng-option-text\">\r\n {{ item.country }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"receiveCountry\" required>\r\n <ng-option *ngFor=\"let country of params.countries\" [value]=\"country.countryCode\">\r\n {{ country.country }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"transactionStatus\">Transaction Status <span\r\n class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.transactionStatusTypes\" [multiple]=\"true\"\r\n formControlName=\"transactionStatus\" bindLabel=\"transactionStatus\" bindValue=\"transactionStatus\"\r\n placeholder=\"Select items\" [closeOnSelect]=\"false\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input type=\"checkbox\" [checked]=\"item$.selected\" /> {{ item.transactionStatus }}\r\n </ng-template>\r\n </ng-select>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"product\">Product<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <div class=\"custom-dropdown-container\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.transactionProductTypes\" bindLabel=\"name\" bindValue=\"productCode\"\r\n formControlName=\"product\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.name }}\" class=\"ng-option-text\">\r\n {{ item.name }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"product\" required>\r\n <ng-option *ngFor=\"let product of params.transactionProductTypes\" [value]=\"product.productCode\">\r\n {{ product.name }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"row d-flex justify-content-center align-items-center row-cls\">\r\n <div class=\"col-2 \">\r\n <label class=\"label-data\" for=\"receiveCurrency\">Receive<span class=\"text-danger\">*</span>\r\n Currency</label>\r\n </div>\r\n <div class=\"col-10 inputbox\">\r\n <ng-container *ngIf=\"params\">\r\n <ng-select [items]=\"params.currencies\" bindLabel=\"currency\" bindValue=\"currencyCode\"\r\n formControlName=\"receiveCurrency\" placeholder=\"- Please select -\" required>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div title=\"{{ item.currency }}\" class=\"ng-option-text\">\r\n {{ item.currency }}\r\n </div>\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select placeholder=\"- Please select -\" formControlName=\"receiveCurrency\" required>\r\n <ng-option *ngFor=\"let currency of params.currencies\" [value]=\"currency.currencyCode\">\r\n {{ currency.currency }}\r\n </ng-option>\r\n </ng-select> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </form>\r\n</section>\r\n\r\n\r\n\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<div class=\"alert alert-danger mt-3 d-flex justify-content-between align-items-center\" *ngIf=\"showError\">\r\n <span>{{ errorMessage }}</span>\r\n</div>\r\n\r\n<section *ngIf=\"showReport\" class=\"my-2\">\r\n <div class=\"title mb-3\">\r\n Branch Activity Send\r\n </div>\r\n <div class=\"mb-2 flex-container\">\r\n <tbody>\r\n <tr>\r\n <td class=\"labl meta-td\">Report User:</td>\r\n <td class=\"px-3 meta-td\"><span class=\"info\">{{user}}</span></td>\r\n </tr>\r\n <tr>\r\n <td class=\"labl meta-td\">Report Time:</td>\r\n <td class=\"px-3 meta-td\"><span class=\"info\">{{ reportDate }}</span></td>\r\n </tr>\r\n </tbody>\r\n </div>\r\n\r\n <!-- Info Message -->\r\n <!-- <div class=\"alert alert-danger mt-3 d-flex justify-content-between align-items-center\"\r\n *ngIf=\"showMessage\">\r\n <span><strong>Message:</strong> {{ message }}</span>\r\n <button type=\"button\" class=\"btn-close\" (click)=\"clearMessage()\"></button>\r\n</div> -->\r\n\r\n <div class=\"added-functions\">\r\n <div class=\"searchBox\">\r\n <input type=\"text\" [(ngModel)]=\"searchText\" name=\"searchText\" class=\"search-input\" (ngModelChange)=\"onSearch()\"\r\n placeholder=\"Search...\" autocomplete=\"off\" />\r\n\r\n <button type=\"button\" class=\"btn btn-sm search-btn\" (click)=\"onSearch()\">\r\n <img src=\"assets/images/Search.svg\" alt=\"Search\" class=\"search-icon\" />\r\n </button>\r\n\r\n </div>\r\n <div class=\"export-options\">\r\n <ng-select placeholder=\"- Please select -\" class=\"export-selector\" [(ngModel)]=\"selectedExportOption\"\r\n [clearable]=\"false\" required>\r\n <ng-option *ngFor=\"let format of exportFormats\" [value]=\"format.code\">\r\n {{ format.formatName }}\r\n </ng-option>\r\n </ng-select>\r\n <!-- <select class=\"opt-cls\" [(ngModel)]=\"selectedExportOption\">\r\n <option value=\"excel\" selected>Excel</option>\r\n <option value=\"pdf\">PDF</option>\r\n <option value=\"csv\">CSV</option>\r\n </select> -->\r\n </div>\r\n <div>\r\n <button class=\"btn btn-report\" (click)=\"handleExport()\">Export</button>\r\n <!-- <div class=\"btn-box\">\r\n </div> -->\r\n </div>\r\n </div>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\" [activeIds]=\"'panel-0'\">\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 style=\"font-weight: bold; font-size: 13px; line-height: 1.2; margin: 0; padding: 2px 0;color: #0c63e4;\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <ag-grid-angular class=\"ag-theme-alpine compact-grid myGrid\" style=\"width: 100%;height: 370px;\"\r\n [columnDefs]=\"columnDefs\" [defaultColDef]=\"defaultColDef\" [rowData]=\"item.value\" [rowHeight]=\"20\"\r\n [headerHeight]=\"22\" [gridOptions]=\"{\r\n suppressHorizontalScroll: true,\r\n scrollbarWidth: 0\r\n }\" [pagination]=\"true\" [paginationPageSize]=\"paginationArray[i]\" (gridReady)=\"onGridReady($event)\"\r\n (gridSizeChanged)=\"onGridSizeChanged($event)\">\r\n </ag-grid-angular>\r\n\r\n\r\n <div class=\"pgn\">\r\n <div style=\"position: absolute;\">\r\n <div class=\"pagination-mobile mb-2\">\r\n <div class=\"ngx-dropdown ngx-range-dropdown\" [class.ngx-active]=\"showRange && activeBranch == i\">\r\n <div class=\"ngx-btn-group\">\r\n <span *ngIf=\"ranges.indexOf(paginationArray[i]) != -1; else showAll\"\r\n class=\"ngx-btn ngx-range-dropdown-button\" (click)=\"activateBranchPagination(i)\">\r\n {{ paginationArray[i] }} <i class=\"ngx-icon ngx-icon-arrow-down\"></i>\r\n </span>\r\n <ng-template #showAll>\r\n <span class=\"ngx-btn ngx-range-dropdown-button\" (click)=\"activateBranchPagination(i)\">\r\n All <i class=\"ngx-icon ngx-icon-arrow-down\"></i>\r\n </span>\r\n </ng-template>\r\n <span class=\"pagination-label\">Entries per page</span>\r\n <ul class=\"ngx-menu\" *ngIf=\"showRange\">\r\n <li class=\"ngx-c-hand ngx-range-dropdown-button\" *ngFor=\"let limit of ranges\"\r\n (click)=\"changeLimit(limit,i,item.key)\">\r\n <span>{{ limit }}</span>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data Found\r\n </div>\r\n</section>", styles: ["@charset \"UTF-8\";@import\"ag-grid-community/styles/ag-grid.css\";@import\"ag-grid-community/styles/ag-theme-alpine.css\";.btn-report{border-radius:3px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px;min-width:80px;margin:0 0 0 20px!important;padding:4px 15px!important;border:none!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}.cal:focus{box-shadow:none!important}.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;padding-top:.15rem!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{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}.search-btn{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}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}.meta-td{padding:0!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;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:ellipsis!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}.ag-theme-alpine{--ag-header-font-size: 9px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}.ag-theme-alpine .ag-header-cell-label,.ag-theme-alpine .ag-header-group-cell-label{justify-content:flex-start!important}::ng-deep .ag-root{-webkit-user-select:text!important;user-select:text!important}::ng-deep .compact-grid{font-weight:500!important;line-height:1.1!important}::ng-deep .compact-grid .ag-header-cell{padding:1px 2px!important;font-size:10px!important;font-weight:700!important;line-height:1.2!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important;text-align:center!important;background-color:#f8f9fa;border-right:1px solid #e0e0e0}.myGrid .ag-center-cols-clipper,.myGrid .ag-body-viewport{display:none}::ng-deep .compact-grid .ag-header-cell-text{font-size:10px!important;font-weight:700!important;text-align:center!important;width:100%}::ng-deep .compact-grid .ag-cell{cursor:default!important;border-right:1px solid #e0e0e0;padding:2px 3px!important;font-size:9px!important;display:flex!important;align-items:center!important}::ng-deep .compact-grid .ag-cell-value{cursor:text!important;font-size:9px!important;padding:0 3px 0 2px!important}::ng-deep .compact-grid .description-cell{white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-overflow:clip!important;text-align:left!important;padding:3px 4px!important;line-height:1.5!important;display:block!important;overflow:hidden!important;max-height:none!important}::ng-deep .compact-grid .compact-cell{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important;align-items:center!important}::ng-deep .compact-cell-transaction{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important;align-items:left!important;padding-left:5px!important}::ng-deep .compact-grid .ag-right-aligned-cell{text-align:right!important;justify-content:flex-end!important;text-overflow:ellipsis}::ng-deep .ag-left-cols-cell{text-align:left!important;text-overflow:ellipsis!important}::ng-deep .compact-grid .ag-center-cols-cell{text-align:center!important;justify-content:center!important}::ng-deep .ag-center-cols-viewport{width:100%;overflow-x:hidden!important}::ng-deep .compact-grid .ag-row{min-height:20px!important;max-height:none!important;border-bottom:1px solid #f0f0f0}::ng-deep .compact-grid .ag-row:hover{background-color:#f8f9fa!important}::ng-deep .ag-cell-value.ag-cell-link{cursor:pointer!important}::ng-deep .ag-paging-panel{border-top:1px solid;border-top-color:var(--ag-border-color);color:var(--ag-secondary-foreground-color);height:30px}.btn-box{width:16rem;margin:0 0 0 20px!important}.meta-td{padding:0!important}.form-group label{display:inline-block;padding-right:5px}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.75rem;border-radius:.25rem;font-weight:400;color:#000;border-color:#ddd}.added-functions{display:flex;justify-content:flex-end;width:100%;padding-right:4px;margin-bottom:.625rem}.pagination-mobile .ngx-range-dropdown{margin-top:8px;margin-right:2px}.pagination-mobile .ngx-range-dropdown .ngx-btn,.pagination-mobile .ngx-range-dropdown .ngx-menu .ngx-range-dropdown-button{cursor:pointer}.ngx-btn{color:#050506;border:1px solid #050506;display:inline-block;width:4rem}.ngx-range-dropdown-button{padding-left:.2rem;list-style:none;font-size:12px}.pagination-label{margin-left:10px;font-size:10px;font-weight:600}@media screen and (max-width: 480px){.pagination-mobile{margin-right:auto;margin-left:auto}}.searchBox{margin-right:auto;display:flex}::ng-deep .card-header{padding:.25rem .75rem}.custom-panel-title{font-size:13px;line-height:1.2;margin:0;padding:2px 0;height:30px}::ng-deep .accordion-button{position:relative;display:flex;align-items:center;width:100%;height:30px;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:#e7f1ff;border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}.small-labels p,.compact-report-metadata .text-dark p{margin-bottom:.15rem!important;margin-left:1rem!important;line-height:1.2}::ng-deep .small-labels p{font-weight:700!important;color:#000!important}::ng-deep .text-dark p{font-weight:500!important;color:#000!important}.ngx-icon-arrow-down:before,.ngx-icon-arrow-left:before,.ngx-icon-arrow-right:before,.ngx-icon-arrow-up:before,.ngx-icon-downward:before,.ngx-icon-back:before,.ngx-icon-forward:before,.ngx-icon-upward:before{border:.1rem solid currentColor;border-bottom:0;border-right:0;content:\"\";height:.65em;width:.65em}.ngx-icon:before,.ngx-icon:after{display:block;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) rotate(45deg)}*,:after,:before{box-sizing:border-box}.ngx-icon{box-sizing:border-box;display:inline-block;font-size:inherit;font-style:normal;height:1em;position:relative;text-indent:-9999px;vertical-align:middle;width:1em}.pgn{position:relative;top:-2.1rem;left:2px;width:30%!important;height:10%!important}.ngx-menu{position:relative;top:-11.4rem;width:3rem;background:#fff;border-radius:.1rem;box-shadow:0 .05rem .2rem #454d5d4d;list-style:none;margin:0;min-width:4rem;padding:.4rem;transform:translateY(.2rem);z-index:100}.ngx-btn-group{height:10px}.accordion-button:before{display:none!important}.status-text{width:100%;transform:scale(1)}.custom-input{width:100%;border:none;caret-color:transparent;cursor:pointer;text-transform:uppercase}.custom-input:focus{outline:none}#request-params{padding-bottom:2px;border-bottom:1px solid rgba(74,73,73,.1)}\n"] }]
|
885
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.ReportService }, { type: i0.NgZone }]; } });
|
886
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmNoLWFjdGl2aXR5LXNlbmQtcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9icmFuY2gtYWN0aXZpdHktc2VuZC1yZXBvcnQvYnJhbmNoLWFjdGl2aXR5LXNlbmQtcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9icmFuY2gtYWN0aXZpdHktc2VuZC1yZXBvcnQvYnJhbmNoLWFjdGl2aXR5LXNlbmQtcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXVELE1BQU0sZUFBZSxDQUFDO0FBQy9GLGtGQUFrRjtBQUNsRixPQUFPLEVBQUUsU0FBUyxFQUE0RCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSwwQ0FBMEMsRUFBRSxNQUFNLHNGQUFzRixDQUFDO0FBQ2xKLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7O0FBTy9FLE1BQU0sT0FBTyxpQ0FBaUM7SUFnRjVDLFlBQW9CLFdBQXdCLEVBQVUsYUFBNEIsRUFBVSxNQUFjO1FBQXRGLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBL0UxRyxZQUFPLEdBQTJDLEVBQUUsQ0FBQTtRQUNwRCxpQkFBWSxHQUEyQyxFQUFFLENBQUE7UUFDekQsY0FBUyxHQUEyQyxFQUFFLENBQUE7UUFNdEQsWUFBTyxHQUFRLEVBQUUsQ0FBQztRQUNsQixnQkFBVyxHQUFPLEVBQUUsQ0FBQztRQUNyQixtQkFBYyxHQUFRLEVBQUUsQ0FBQztRQUV6QixXQUFNLEdBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsdUJBQWtCLEdBQVcsRUFBRSxDQUFDO1FBRWhDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0Isb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMseUJBQW9CLEdBQUcsT0FBTyxDQUFDO1FBRy9CLFNBQUksR0FBVyxtQ0FBbUMsQ0FBQztRQUluRCxhQUFRLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsV0FBTSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFHbEIsWUFBTyxHQUFXLGVBQWUsQ0FBQztRQUNsQywwQkFBcUIsR0FBRyxzQkFBc0IsQ0FBQztRQUMvQyxpQkFBWSxHQUEyQixzQkFBc0IsQ0FBQyxPQUFPLENBQUM7UUFDdEUsa0JBQWEsR0FBRyxDQUFDLEVBQUMsVUFBVSxFQUFDLE9BQU8sRUFBQyxJQUFJLEVBQUMsT0FBTyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDL0csUUFBUTtRQUNSLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixrQkFBYSxHQUFZLElBQUksQ0FBQztRQUM5QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFHaEMsZUFBVSxHQUFtQztZQUMzQyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUU7WUFDckssRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1lBQzNHLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLDRDQUE0QyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRTtZQUNuTCxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFO1lBQ3hHLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFO1lBQ3pILEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUU7WUFDbkksRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRTtZQUMzRyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsb0NBQW9DLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRTtZQUNqTixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRTtZQUN4RyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLG9DQUFvQyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUU7WUFDNU0sRUFBRSxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLG9DQUFvQyxFQUFFLFlBQVksRUFBRSw2QkFBNkIsRUFBRTtZQUM1TyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsb0NBQW9DLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRTtZQUMvTCxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsb0NBQW9DLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFO1lBQzdNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO1NBQ3ZGLENBQUM7UUFHRixrQkFBYSxHQUFHO1lBQ2QsUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUUsS0FBSztZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLEVBQUU7WUFDWixjQUFjLEVBQUUsSUFBSTtZQUNwQixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBQ0YsWUFBTyxHQUEyQixFQUFFLENBQUM7UUFJckMsZ0JBQVcsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1lBQ25DLGNBQWMsRUFBRSxNQUFNO1lBQ3RCLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7WUFDbkMsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO0lBTjJHLENBQUM7SUFRL0csUUFBUTtRQUNOLDZDQUE2QztRQUM3QyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtTQUMxRDthQUNJO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDNUQ7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMxQixDQUFDLENBQUMsQ0FBQTtRQUVGLFFBQVEsQ0FBQztZQUNQLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FDekMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUNIO1lBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQzdELFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FDSDtTQUNGLENBQUMsQ0FBQyxTQUFTLENBQ1Y7WUFDRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO2dCQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFO29CQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3pDO2dCQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDO1lBQ3RELENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7WUFDbkQsQ0FBQztZQUNELFFBQVEsRUFBRSxHQUFHLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLENBQUM7U0FDRixDQUVGLENBQUM7UUFDRixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQix3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDJDQUEyQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2hGLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2pDLFFBQVEsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDdkUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDakcsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDekMsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDNUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbkMsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM5RSxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM3QyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNoRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUM3QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3JELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2pELGdCQUFnQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxxQ0FBcUMsQ0FBQztZQUMxRCxPQUFPO1NBQ1I7UUFDRCwyQ0FBMkM7UUFDM0MsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxJQUFJLENBQUMsUUFBUSxvQ0FBb0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hHLE9BQU87U0FDUjtRQUNELG9DQUFvQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0Ysa0ZBQWtGO1FBQ2xGLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxJQUFJLENBQUMsUUFBUSxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sd0NBQXdDLENBQUM7WUFDbEgsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUM7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUQsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDakYsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDN0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDekIsQ0FBQztZQUVELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDO1lBQ3RELENBQUM7WUFFRCxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDO1lBQ3RELENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBR0QsUUFBUTtRQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRCxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzNELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNWLElBQUksQ0FBQyxHQUFXLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUVMLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDO1NBQ3ZDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUNwQixDQUFDO0lBRUQsZUFBZSxDQUFDLElBQVM7UUFDdkIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQy9DLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLHNCQUFzQixDQUFDLE9BQU8sQ0FBQztRQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2xFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzdCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsWUFBWSxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDYixJQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBQztvQkFDM0MsTUFBTSxLQUFLLEdBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUMsRUFBRSxDQUFBLE1BQU0sQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDLENBQUM7b0JBQ2pGLElBQUcsS0FBSyxJQUFFLENBQUMsQ0FBQyxFQUFDO3dCQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFBO3FCQUN6RTt5QkFBSTt3QkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzlDO2lCQUNGO2dCQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDO1lBRXRELENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztRQUNaLE1BQU0sSUFBSSxHQUFHLElBQUksMENBQTBDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3RELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2xELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQy9ELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDbEUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUM5RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDM0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNsRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBc0I7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDeEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQVc7UUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFHRCxXQUFXLENBQUMsS0FBVSxFQUFFLEtBQWEsRUFBRSxHQUFXO1FBQ2hELElBQUksS0FBSyxJQUFJLEtBQUssRUFBRTtZQUNsQixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUNyQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUM3RDtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLElBQUksR0FBVSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3RELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUM5QyxPQUFPO1NBQ1I7UUFDRCxRQUFRLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUNqQyxLQUFLLE9BQU87Z0JBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLEtBQUssS0FBSztnQkFDUixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JCLE1BQU07WUFDUjtnQkFDRSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFRCw0REFBNEQ7SUFDcEQsaUJBQWlCLENBQUMsU0FBaUI7UUFDekMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQzlCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO1lBRXBCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO2dCQUNoQiwwQ0FBMEM7Z0JBQzFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDakMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFFbkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxHQUFHLEVBQUU7b0JBQ1AsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQywrQkFBK0I7b0JBQ3hELEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7b0JBQzNFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDakI7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUM7aUJBQ3pDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVM7UUFDakIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pILElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQztZQUNwQixXQUFXLEVBQUUsV0FBVztZQUN4QixJQUFJLEVBQUUsSUFBSTtZQUNWLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBRTlDLE9BQU87UUFDUCxNQUFNLEtBQUssR0FBRyxzQkFBc0IsQ0FBQztRQUNyQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUUxRSxXQUFXO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDckQ7UUFFRCxZQUFZO1FBQ1osTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN0QixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDckIsTUFBTSxTQUFTLEdBQUc7WUFDaEIsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3BDLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNFLDBEQUEwRDtTQUMzRCxDQUFBO1FBRUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDakMscUJBQXFCO1lBQ3JCLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUvQiw4Q0FBOEM7WUFDOUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbkMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ25ELENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUNoSixDQUFDO1FBRUYsNkJBQTZCO1FBQzdCLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLEtBQU0sQ0FBQyxDQUFDLENBQUM7UUFFdkYsSUFBSSxJQUFJLEdBQVUsRUFBRSxDQUFDO1FBRXJCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDdEMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDeEMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFNLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO3dCQUN2RCxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdEM7b0JBQ0QsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQixDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFDakMsQ0FBQyxDQUFDLENBQUM7WUFDSCxtQkFBbUI7U0FDcEI7UUFFRCwwQkFBMEI7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNuQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQU0sQ0FBQyxDQUFDO2dCQUM1QixPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsZ0RBQWdEO1FBQ2hELE1BQU0sWUFBWSxHQUEyQixFQUFFLENBQUM7UUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QixZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFFcEMsZUFBZTtRQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFDWixJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDZixJQUFJLEVBQUUsSUFBSTtZQUNWLE1BQU0sRUFBRSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLEdBQUcsQ0FBQztZQUNqRCxLQUFLLEVBQUUsTUFBTTtZQUNiLFVBQVUsRUFBRTtnQkFDVixTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztnQkFDMUIsU0FBUyxFQUFFLENBQUM7Z0JBQ1osU0FBUyxFQUFFLE1BQU07Z0JBQ2pCLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0QsU0FBUyxFQUFFO2dCQUNULFFBQVEsRUFBRSxDQUFDO2dCQUNYLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO2dCQUMxQixTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNyQjtZQUNELE1BQU0sRUFBRTtnQkFDTixXQUFXLEVBQUUsQ0FBQztnQkFDZCxRQUFRLEVBQUUsV0FBVztnQkFDckIsYUFBYSxFQUFFLENBQUM7YUFDakI7WUFDRCxZQUFZLEVBQUUsWUFBWTtTQUMzQixDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFTO1FBQ25CLE1BQU0sY0FBYyxHQUFHLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUNqSCxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDdkUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFNUMsWUFBWTtRQUNaLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7UUFDNUQsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLHdCQUF3QjtRQUN4QixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUQsVUFBVSxDQUFDLFNBQVMsR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBRXBFLHlCQUF5QjtRQUN6QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0UsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDaEMsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLFNBQVMsRUFBRSxLQUFLO2FBQ2pCLENBQUMsQ0FBQztZQUVILHdDQUF3QztZQUN4QyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtnQkFDMUIsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO2dCQUN0QixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7YUFDaEMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxXQUFXO1FBQ1gsTUFBTSxJQUFJLEdBQXVCO1lBQy9CLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDM0IsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0UseURBQXlEO1NBQzFELENBQUE7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDN0MscUJBQXFCO1lBQ3JCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQTtRQUNGLGdCQUFnQjtRQUNoQixTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXJCLGdDQUFnQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM1RixTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUc7Z0JBQ1YsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7YUFDNUIsQ0FBQztTQUNIO1FBRUQsU0FBUyxDQUFDLFNBQVMsR0FBRztZQUNwQixRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLFFBQVE7U0FDckIsQ0FBQztRQUNGLFNBQVMsQ0FBQyxNQUFNLEdBQUc7WUFDakIsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7WUFDakQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7U0FDbEQsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDdEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6QyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEQsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUIsZ0JBQWdCO1lBQ2hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN4QyxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQU0sQ0FBQyxDQUFDO29CQUM1Qix5QkFBeUI7b0JBQ3pCLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTt3QkFDdkQsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3RDO29CQUNELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFO3dCQUNuRCxPQUFPLE1BQU0sS0FBSyxFQUFFLENBQUM7cUJBQ3RCO29CQUNELE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxDQUFDLE1BQU0sR0FBRztvQkFDZixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtvQkFDakQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7aUJBQ2xELENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEI7UUFFRCw0Q0FBNEM7UUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDbkIsS0FBSyxJQUFJLE1BQU0sR0FBRyxZQUFZLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxPQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUM3RSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ2hELFNBQVM7aUJBQ1Y7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM3QztZQUNELFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7U0FDOUM7UUFDRCxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLFNBQVM7UUFDVCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM5QixJQUFJLEVBQUUsbUVBQW1FO2FBQzFFLENBQUMsQ0FBQTtZQUNGLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVc7UUFDbkIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pILE1BQU0sUUFBUSxHQUFHO1lBQ2YsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUM7WUFDeEMsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0UsNkJBQTZCO1NBQzlCLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDekMsR0FBRyxDQUFDLEVBQUUsQ0FDSixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ2hELEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ2pELENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxLQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXBGLElBQUksSUFBSSxHQUFZLEVBQUUsQ0FBQTtRQUN0QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDckMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFNLENBQUMsQ0FBQztvQkFDeEIsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO3dCQUNuRCxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDOUI7b0JBQ0QsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLG1CQUFtQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssb0JBQW9CLEVBQUU7d0JBQ2hGLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQztxQkFDbEI7b0JBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNqQixDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFDakMsQ0FBQyxDQUFDLENBQUE7U0FDSDtRQUVELE1BQU0sR0FBRyxHQUFZO1lBQ25CLEdBQUcsUUFBUTtZQUNYLEVBQUU7WUFDRixPQUFPO1lBQ1AsR0FBRyxJQUFJO1NBQ1IsQ0FBQztRQUVGLDZCQUE2QjtRQUM3QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDdEMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUs7U0FDakQsQ0FBQyxDQUFDO1FBRVYsbUJBQW1CO1FBQ25CLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1QiwwREFBMEQ7SUFDMUQsUUFBUTtJQUNSLElBQUk7SUFFSiwrQkFBK0I7SUFDL0IscURBQXFEO0lBQ3JELHNCQUFzQjtJQUN0Qiw0RUFBNEU7SUFDNUUsNEJBQTRCO0lBQzVCLDBCQUEwQjtJQUMxQix5REFBeUQ7SUFDekQsa0NBQWtDO0lBQ2xDLGFBQWE7SUFDYiwyQ0FBMkM7SUFDM0MseURBQXlEO0lBQ3pELDBCQUEwQjtJQUMxQix1Q0FBdUM7SUFDdkMsUUFBUTtJQUNSLE1BQU07SUFFTiw4REFBOEQ7SUFDOUQseURBQXlEO0lBQ3pELE1BQU07SUFDTixnQ0FBZ0M7SUFDaEMsK0ZBQStGO0lBQy9GLDBFQUEwRTtJQUMxRSw2REFBNkQ7SUFDN0QsSUFBSTtJQUVKLGtDQUFrQztJQUNsQyxxREFBcUQ7SUFDckQsc0JBQXNCO0lBQ3RCLHNDQUFzQztJQUN0QywwQkFBMEI7SUFDMUIsMkRBQTJEO0lBQzNELGtFQUFrRTtJQUNsRSwrQ0FBK0M7SUFDL0MsUUFBUTtJQUNSLGFBQWE7SUFDYiw2QkFBNkI7SUFDN0IsdUJBQXVCO0lBQ3ZCLE1BQU07SUFDTiwwRUFBMEU7SUFDMUUsNkRBQTZEO0lBQzdELElBQUk7SUFFSixtQkFBbUI7SUFDbkIsNkJBQTZCO0lBQzdCLDRDQUE0QztJQUM1QyxJQUFJO0lBQ0oseUNBQXlDO0lBQ3pDLGtFQUFrRTtJQUNsRSwrQkFBK0I7SUFDL0IsSUFBSTtJQUVKLHlDQUF5QztJQUN6QyxrRUFBa0U7SUFDbEUsK0NBQStDO0lBQy9DLGlIQUFpSDtJQUNqSCxhQUFhO0lBQ2IsNkRBQTZEO0lBQzdELG9CQUFvQjtJQUNwQixNQUFNO0lBQ04sSUFBSTtJQUVKLGtCQUFrQjtJQUNsQiw0QkFBNEI7SUFDNUIsMENBQTBDO0lBQzFDLElBQUk7SUFDSix1Q0FBdUM7SUFDdkMseURBQXlEO0lBQ3pELDhCQUE4QjtJQUM5QixJQUFJO0lBRUosd0NBQXdDO0lBQ3hDLHlEQUF5RDtJQUN6RCwyREFBMkQ7SUFDM0QscUlBQXFJO0lBQ3JJLGFBQWE7SUFDYixxREFBcUQ7SUFDckQsb0JBQW9CO0lBQ3BCLE1BQU07SUFDTixJQUFJO0lBRUosc0JBQXNCO0lBQ3RCLGdDQUFnQztJQUNoQyxrREFBa0Q7SUFDbEQsSUFBSTtJQUNKLHdDQUF3QztJQUN4Qyw2REFBNkQ7SUFDN0Qsa0NBQWtDO0lBQ2xDLElBQUk7SUFFSiw0Q0FBNEM7SUFDNUMsNkRBQTZEO0lBQzdELDZDQUE2QztJQUM3Qyw0R0FBNEc7SUFDNUcsYUFBYTtJQUNiLHlEQUF5RDtJQUN6RCxvQkFBb0I7SUFDcEIsTUFBTTtJQUNOLElBQUk7SUFFSix5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLHdEQUF3RDtJQUN4RCxJQUFJO0lBRUosOENBQThDO0lBQzlDLGdFQUFnRTtJQUNoRSxxQ0FBcUM7SUFDckMsSUFBSTtJQUVKLCtDQUErQztJQUMvQyxnRUFBZ0U7SUFDaEUsNkNBQTZDO0lBQzdDLDRHQUE0RztJQUM1RyxhQUFhO0lBQ2IsNERBQTREO0lBQzVELG9CQUFvQjtJQUNwQixNQUFNO0lBQ04sSUFBSTtJQUVKLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsMENBQTBDO0lBQzFDLElBQUk7SUFFSixZQUFZLENBQUMsTUFBVztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxxREFBcUQ7SUFDckQsdURBQXVEO0lBRXZELGdCQUFnQjtJQUNoQixzQ0FBc0M7SUFDdEMsb0RBQW9EO0lBQ3BELFdBQVc7SUFDWCxTQUFTO0lBQ1Qsa0JBQWtCO0lBQ2xCLGdGQUFnRjtJQUNoRixhQUFhO0lBQ2IsOEJBQThCO0lBQzlCLE1BQU07SUFDTixJQUFJO0lBRUosaUJBQWlCO0lBQ2pCLG1CQUFtQjtJQUNuQix3Q0FBd0M7SUFDeEMsSUFBSTtJQUVKLGtDQUFrQztJQUNsQyx1REFBdUQ7SUFDdkQsNkJBQTZCO0lBQzdCLElBQUk7SUFFSixnQ0FBZ0M7SUFDaEMsdURBQXVEO0lBQ3ZELHlDQUF5QztJQUN6QyxvSEFBb0g7SUFDcEgsYUFBYTtJQUNiLDhCQUE4QjtJQUM5QixNQUFNO0lBQ04sSUFBSTtJQUVKLGlCQUFpQjtJQUNqQiwyQkFBMkI7SUFDM0Isd0RBQXdEO0lBQ3hELElBQUk7SUFFSixpQkFBaUI7SUFDakIsNEJBQTRCO0lBQzVCLElBQUk7SUFDSixtQkFBbUI7SUFDbkIsOEJBQThCO0lBQzlCLElBQUk7SUFFSiw2QkFBNkI7SUFDN0IsK0JBQStCO0lBQy9CLGlDQUFpQztJQUNqQywrQ0FBK0M7SUFDL0MseUdBQXlHO0lBQ3pHLE1BQU07SUFDTiw2QkFBNkI7SUFDN0IscUdBQXFHO0lBQ3JHLE1BQU07SUFDTixJQUFJO0lBRUcsVUFBVSxDQUFDLE1BQVc7UUFDM0IsT0FBTyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsd0JBQXdCLENBQUMsV0FBbUI7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQVc7UUFDM0IsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN2QyxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQ3BDLHFCQUFxQixFQUFFLENBQUM7WUFDeEIscUJBQXFCLEVBQUUsQ0FBQztTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYTtJQUNiLHVDQUF1QztJQUN2QyxvREFBb0Q7SUFDcEQsc0NBQXNDO0lBQ3RDLHdHQUF3RztJQUN4RyxJQUFJO0lBRUoscUNBQXFDO0lBQ3JDLG9EQUFvRDtJQUNwRCxzQ0FBc0M7SUFDdEMsc0dBQXNHO0lBQ3RHLElBQUk7SUFFSiw2QkFBNkI7SUFDN0Isa0RBQWtEO0lBQ2xELG9DQUFvQztJQUVwQyx1REFBdUQ7SUFDdkQsbUNBQW1DO0lBQ25DLE1BQU07SUFDTixJQUFJO0lBRUoscUJBQXFCO0lBQ3JCLDBDQUEwQztJQUMxQyxxREFBcUQ7SUFDckQsbURBQW1EO0lBQ25ELCtCQUErQjtJQUMvQiw2QkFBNkI7SUFDN0Isb0dBQW9HO0lBQ3BHLGlDQUFpQztJQUNqQywwQ0FBMEM7SUFDMUMsMERBQTBEO0lBQzFELG1EQUFtRDtJQUNuRCxNQUFNO0lBRU4sSUFBSTtJQUVKLG1CQUFtQjtJQUNuQiwwQ0FBMEM7SUFDMUMscURBQXFEO0lBQ3JELG1EQUFtRDtJQUNuRCwrQkFBK0I7SUFDL0IsNkJBQTZCO0lBQzdCLG9HQUFvRztJQUNwRyxpQ0FBaUM7SUFDakMsMENBQTBDO0lBQzFDLHlEQUF5RDtJQUN6RCxxREFBcUQ7SUFDckQsTUFBTTtJQUNOLElBQUk7SUFFSSxzQkFBc0I7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUM5RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QyxNQUFNLFNBQVMsR0FBRyxhQUFhLEVBQUUsS0FBSyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxTQUFTO2dCQUFFLE9BQU87WUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDNUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxFQUFFO2dCQUN0QixhQUFhLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsRTtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUMxRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRCxNQUFNLFdBQVcsR0FBRyxlQUFlLEVBQUUsS0FBSyxDQUFDO1lBQzNDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxXQUFXO2dCQUFFLE9BQU87WUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFdkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDNUMsSUFBSSxRQUFRLEdBQUcsV0FBVyxFQUFFO2dCQUMxQixlQUFlLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0RTtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BELElBQUcsR0FBRyxLQUFLLElBQUksRUFBQztnQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0M7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCw2QkFBNkI7SUFDN0IscURBQXFEO0lBQ3JELDBDQUEwQztJQUMxQyw4QkFBOEI7SUFDOUIsNENBQTRDO0lBQzVDLE1BQU07SUFDTix1REFBdUQ7SUFDdkQsNkNBQTZDO0lBQzdDLE9BQU87SUFDUCxJQUFJO0lBRUosZ0JBQWdCO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO1lBQ3JELEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQTtJQUVKLENBQUM7OzhIQTE4QlUsaUNBQWlDO2tIQUFqQyxpQ0FBaUMsdUVDeEI5Qyw2bWlCQTRWVTsyRkRwVUcsaUNBQWlDO2tCQUw3QyxTQUFTOytCQUNFLGlDQUFpQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgTmdab25lLCBPbkluaXQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbi8vIGltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUmVwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQnJhbmNoQWN0aXZpdHlSZXBvcnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvYnJhbmNoLWFjdGl2aXR5LXJlcG9ydC9icmFuY2gtYWN0aXZpdHktc2VuZC1yZXBvcnQnO1xyXG5pbXBvcnQgeyBDb2xEZWYsIEdyaWRPcHRpb25zLCBHcmlkUmVhZHlFdmVudCwgUm93R3JvdXBpbmdEaXNwbGF5VHlwZSB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcclxuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcclxuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XHJcbmltcG9ydCAqIGFzIEV4Y2VsSlMgZnJvbSAnZXhjZWxqcyc7XHJcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IHsgdGhlbWVBbHBpbmUgfSBmcm9tICdAYWctZ3JpZC1jb21tdW5pdHkvdGhlbWluZyc7XHJcblxyXG5pbXBvcnQganNQREYgZnJvbSAnanNwZGYnO1xyXG5pbXBvcnQgeyBmb3JtYXREYXRlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEJyYW5jaEFjdGl2aXR5U2VuZFJlcG9ydFJlcXVlc3REb21haW5Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9icmFuY2gtYWN0aXZpdHktcmVwb3J0L2JyYW5jaC1hY3Rpdml0eS1zZW5kLXJlcG9ydC1yZXF1ZXN0LWRvbWFpbi1tb2RlbCc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkaW5nU3RhdGVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbXBvbmVudC1sb2FkaW5nLXN0YXRlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1icmFuY2gtYWN0aXZpdHktc2VuZC1yZXBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9icmFuY2gtYWN0aXZpdHktc2VuZC1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2JyYW5jaC1hY3Rpdml0eS1zZW5kLXJlcG9ydC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCcmFuY2hBY3Rpdml0eVNlbmRSZXBvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGRhdGFNYXA6IFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+ID0ge31cclxuICBmaWx0ZXJlZERhdGE6IFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+ID0ge31cclxuICBwcm94eURhdGE6IFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+ID0ge31cclxuICBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgY291bnRyaWVzOiBhbnk7XHJcbiAgcGFyYW1zOiBhbnk7XHJcbiAgZnJvbURhdGU6IGFueTtcclxuICB0b0RhdGU6IGFueTtcclxuICBjbGllbnRzOiBhbnkgPSBbXTtcclxuICBjbGllbnRzRGF0YTphbnkgPSBbXTtcclxuICBjbGllbnRCcmFuY2hlczogYW55ID0gW107XHJcbiAgc2hvd1JlcG9ydDogYm9vbGVhbjtcclxuICByYW5nZXM6IGFueVtdID0gWzEwLCAxNSwgMjAsIDMwLCA1MCwgMTAwLCAyMDAsICdBbGwnXTtcclxuICBwYWdpbmF0aW9uUGFnZVNpemU6IG51bWJlciA9IDE1O1xyXG4gIHBhZ2luYXRpb25BcnJheTogYW55W107XHJcbiAgc2hvd1JhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBZ2VudFNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRFeHBvcnRPcHRpb24gPSAnZXhjZWwnO1xyXG4gIGdyaWRBUGk7XHJcbiAgZ3JpZENvbHVtbkFwaTtcclxuICB1c2VyOiBzdHJpbmcgPSBcImthdXNoaWsua3Vsc2FuZ2VAeHByZXNzbW9uZXkudGVjaFwiO1xyXG4gIHJlcG9ydERhdGU6IHN0cmluZztcclxuICBzZWFyY2hUZXh0OiBzdHJpbmc7XHJcbiAgYnVmZmVyOiBhbnk7XHJcbiAgbXlTdGF0dXM6IEZvcm1BcnJheSA9IG5ldyBGb3JtQXJyYXkoW10pO1xyXG4gIHN0YXR1cyA9IFsnQWxsJ107XHJcbiAgZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgc3lzVXNlcklkOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBsb2dvQmFzZTY0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgbWVzc2FnZTogc3RyaW5nID0gJ05vIERhdGEgRm91bmQnO1xyXG4gIENvbXBvbmVudExvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXM7XHJcbiAgbG9hZGluZ1N0YXRlOiBDb21wb25lbnRMb2FkaW5nU3RhdGVzID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Mb2FkaW5nO1xyXG4gIGV4cG9ydEZvcm1hdHMgPSBbe2Zvcm1hdE5hbWU6XCJFeGNlbFwiLGNvZGU6J2V4Y2VsJ30se2Zvcm1hdE5hbWU6XCJQREZcIixjb2RlOidwZGYnfSx7Zm9ybWF0TmFtZTpcIkNTVlwiLGNvZGU6J2Nzdid9XVxyXG4gIC8vIGZsYWdzXHJcbiAgc2hvd1N0YXR1c0Ryb3Bkb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd0NsaWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93Q3VycmVuY3k6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93UHJvZHVjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dTZW5kQ291bnRyeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dSZWNlaXZlQ291bnRyeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dCcmFuY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaXNhYmxlVG9EYXRlOiBib29sZWFuID0gdHJ1ZTtcclxuICBzaG93RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93TWVzc2FnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdEFsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG5vRGF0YUZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2xpZW50U2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBhY3RpdmVCcmFuY2g6IG51bWJlcjtcclxuXHJcbiAgY29sdW1uRGVmczogQ29sRGVmPEJyYW5jaEFjdGl2aXR5UmVwb3J0PltdID0gW1xyXG4gICAgeyBmaWVsZDogJ2J1c2luZXNzRGF0ZVRpbWUnLCBoZWFkZXJOYW1lOiAnQnVzaW5lc3MgRGF0ZScsIGZsZXg6IDEsIGhlYWRlckNsYXNzOiAnYWctbGVmdC1hbGlnbmVkLWhlYWRlcicsIG1pbldpZHRoOiA3MCwgd2lkdGg6IDcwLCB0b29sdGlwRmllbGQ6ICdidXNpbmVzc0RhdGVUaW1lJyB9LFxyXG4gICAgeyBmaWVsZDogJ3RyYW5zYWN0aW9uRGF0ZVRpbWUnLCBoZWFkZXJOYW1lOiAnVHJhbnNhY3Rpb24gRGF0ZScsIGZsZXg6IDIsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlIH0sXHJcbiAgICB7IGZpZWxkOiAndHJhbnNhY3Rpb25OdW1iZXInLCBoZWFkZXJOYW1lOiAnVHJhbnNhY3Rpb24gTnVtYmVyJywgZmxleDogMS44LCB3aWR0aDogMTMwLCBjZWxsQ2xhc3M6ICdhZy1sZWZ0LWNvbHMtY2VsbCBjb21wYWN0LWNlbGwtdHJhbnNhY3Rpb24nLCB0b29sdGlwRmllbGQ6ICd0cmFuc2FjdGlvbk51bWJlcicgfSxcclxuICAgIHsgZmllbGQ6ICdwcm9kdWN0JywgaGVhZGVyTmFtZTogJ1Byb2R1Y3QnLCBmbGV4OiAwLjUsIG1pbldpZHRoOiA1MCwgd2lkdGg6IDYwLCB0b29sdGlwRmllbGQ6ICdwcm9kdWN0JyB9LFxyXG4gICAgeyBmaWVsZDogJ3NlbmRBZ2VudEJyYW5jaENvZGUnLCBoZWFkZXJOYW1lOiAnU2VuZCBCcmFuY2hDb2RlJywgZmxleDogMSwgd2lkdGg6IDEyMCwgdG9vbHRpcEZpZWxkOiAnc2VuZEFnZW50QnJhbmNoQ29kZScgfSxcclxuICAgIHsgZmllbGQ6ICdyZWNlaXZlQWdlbnRDb2RlJywgaGVhZGVyTmFtZTogJ1JlY2VpdmUgQ2xpZW50Q29kZScsIGZsZXg6IDEsIG1pbldpZHRoOiA3MCwgd2lkdGg6IDcwLCB0b29sdGlwRmllbGQ6ICdyZWNlaXZlQWdlbnRDb2RlJyB9LFxyXG4gICAgeyBmaWVsZDogJ3BheW91dENDY29kZScsIGhlYWRlck5hbWU6ICdSZWNlaXZlQ2N5IENvZGUnLCBmbGV4OiAxLCB3aWR0aDogMTEwLCB0b29sdGlwRmllbGQ6ICdwYXlvdXRDQ2NvZGUnIH0sXHJcbiAgICB7IGZpZWxkOiAncGF5b3V0QW1vdW50JywgaGVhZGVyTmFtZTogJ1JlY2VpdmUgQW1vdW50JywgZmxleDogMSwgbWF4V2lkdGg6IDEzMCwgdmFsdWVGb3JtYXR0ZXI6IHRoaXMuY3VycmVuY3lGb3JtYXR0ZXIuYmluZCh0aGlzKSwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3BheW91dEFtb3VudCcgfSxcclxuICAgIHsgZmllbGQ6ICdwYXlpbkNDY29kZScsIGhlYWRlck5hbWU6ICdTZW5kQ2N5IENvZGUnLCBmbGV4OiAxLCBtYXhXaWR0aDogOTAsIHRvb2x0aXBGaWVsZDogJ3BheWluQ0Njb2RlJyB9LFxyXG4gICAgeyBmaWVsZDogJ3BheWluQW1vdW50JywgaGVhZGVyTmFtZTogJ1NlbmQgQW1vdW50JywgZmxleDogMSwgbWF4V2lkdGg6IDEyMCwgdmFsdWVGb3JtYXR0ZXI6IHRoaXMuY3VycmVuY3lGb3JtYXR0ZXIuYmluZCh0aGlzKSwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3BheWluQW1vdW50JyB9LFxyXG4gICAgeyBmaWVsZDogJ3RyYW5zYWN0aW9uQ29tbWlzc2lvbkFtb3VudCcsIGhlYWRlck5hbWU6ICdTZXJ2aWNlIEZlZScsIGZsZXg6IDEsIG1heFdpZHRoOiAxMjAsIHZhbHVlRm9ybWF0dGVyOiB0aGlzLmN1cnJlbmN5Rm9ybWF0dGVyLmJpbmQodGhpcyksIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCBjb21wYWN0LWNlbGwnLCB0b29sdGlwRmllbGQ6ICd0cmFuc2FjdGlvbkNvbW1pc3Npb25BbW91bnQnIH0sXHJcbiAgICB7IGZpZWxkOiAndGF4JywgaGVhZGVyTmFtZTogJ1RheCcsIGZsZXg6IDEsIHdpZHRoOiA3MCwgbWF4V2lkdGg6IDEwMCwgdmFsdWVGb3JtYXR0ZXI6IHRoaXMuY3VycmVuY3lGb3JtYXR0ZXIuYmluZCh0aGlzKSwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3RheCcgfSxcclxuICAgIHsgZmllbGQ6ICd0b3RhbFBheWluQW1vdW50JywgaGVhZGVyTmFtZTogJ1RvdGFsIFNlbmQgQW1vdW50JywgZmxleDogMSwgdmFsdWVGb3JtYXR0ZXI6IHRoaXMuY3VycmVuY3lGb3JtYXR0ZXIuYmluZCh0aGlzKSwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3RvdGFsUGF5aW5BbW91bnQnIH0sXHJcbiAgICB7IGZpZWxkOiAnc3RhdHVzJywgaGVhZGVyTmFtZTogJ1RyYW5zYWN0aW9uIFN0YXR1cycsIGZsZXg6IDEsIHRvb2x0aXBGaWVsZDogJ3N0YXR1cycgfVxyXG4gIF07XHJcblxyXG5cclxuICBkZWZhdWx0Q29sRGVmID0ge1xyXG4gICAgc29ydGFibGU6IHRydWUsXHJcbiAgICBmaWx0ZXI6IGZhbHNlLFxyXG4gICAgcmVzaXphYmxlOiB0cnVlLFxyXG4gICAgbWlud2lkdGg6IDQwLFxyXG4gICAgd3JhcEhlYWRlclRleHQ6IHRydWUsXHJcbiAgICBhdXRvSGVhZGVySGVpZ2h0OiB0cnVlLFxyXG4gICAgc3VwcHJlc3NTaXplVG9GaXQ6IGZhbHNlLFxyXG4gICAgd3JhcFRleHQ6IHRydWVcclxuICB9O1xyXG4gIHJvd0RhdGE6IEJyYW5jaEFjdGl2aXR5UmVwb3J0W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgcmVwb3J0U2VydmljZTogUmVwb3J0U2VydmljZSwgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkgeyB9XHJcblxyXG4gIHJlcG9ydFRoZW1lID0gdGhlbWVBbHBpbmUud2l0aFBhcmFtcyh7XHJcbiAgICBoZWFkZXJGb250U2l6ZTogJzEwcHgnLFxyXG4gICAgZm9udEZhbWlseTogWydBcmlhbCcsICdzYW5zLXNlcmlmJ10sXHJcbiAgICBmb250U2l6ZTogJzlweCdcclxuICB9KTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyBDaGVjayBpZiBVc2VyIGlzIGZhbGNvbiB1c2VyIG9yIGZvc3NpbFVzZXJcclxuICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3NzaWx1c2VybmFtZScpKSB7XHJcbiAgICAgIHRoaXMuc3lzVXNlcklkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9zc2lsdXNlcm5hbWUnKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3lzVXNlcklkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZXpyZW1pdHVzZXJuYW1lJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN5c1VzZXJJZCA9IHRoaXMuc3lzVXNlcklkLnJlcGxhY2UoL15bXCInXSguKilbXCInXSQvLCAnJDEnKTtcclxuICAgIHRoaXMudXNlciA9IHRoaXMuc3lzVXNlcklkO1xyXG4gICAgY29uc29sZS5sb2coXCJTeXN0ZW0gVXNlciBJZCA6IFwiICsgdGhpcy5zeXNVc2VySWQpO1xyXG4gICAgdGhpcy5pbml0Rm9ybSgpO1xyXG4gICAgdGhpcy5yZXBvcnRTZXJ2aWNlLmdldENvbXBhbnlDb25maWcoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMucGFyYW1zID0gZGF0YTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5wYXJhbXMpXHJcbiAgICB9KVxyXG5cclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgcGFyYW1zOiB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0UGFyYW1zKCkucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHBhcmFtcycsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKSxcclxuICAgICAgY2xpZW50czogdGhpcy5yZXBvcnRTZXJ2aWNlLmdldFBheUluQWdlbnRzKHRoaXMuc3lzVXNlcklkKS5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgY2xpZW50cycsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YoW10pOyBcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KS5zdWJzY3JpYmUoXHJcbiAgICAgIHtcclxuICAgICAgICBuZXh0OiAoeyBwYXJhbXMsIGNsaWVudHMgfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudHMgPSBbLi4uY2xpZW50c107XHJcbiAgICAgICAgICB0aGlzLmNsaWVudHNEYXRhID0gWy4uLmNsaWVudHNdO1xyXG4gICAgICAgICAgaWYgKCFzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3NzaWx1c2VybmFtZScpICYmIHRoaXMuY2xpZW50cz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2xpZW50KHRoaXMuY2xpZW50c1swXS5jb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCBmb3JrSm9pbiBlcnJvcicsIGVycik7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuRXJyb3I7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgICAgICAgdGhpcy5vbkNsaWVudFNlbGVjdGVkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlVG9EYXRlQ2hhbmdlcygpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVUb0NsaWVudENoYW5nZSgpO1xyXG4gICAgLy9Db252ZXJ0IExvZ28gdG8gYmFzZTY0XHJcbiAgICB0aGlzLmxvYWRJbWFnZUFzQmFzZTY0KCdzcmMvYXNzZXRzL3JlcG9ydHMtbGliL2ltYWdlcy9YTUNvcmFsLnBuZycpLnRoZW4oYmFzZTY0ID0+IHtcclxuICAgICAgdGhpcy5sb2dvQmFzZTY0ID0gYmFzZTY0O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0Rm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBmcm9tRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICB0b0RhdGU6IFt7IHZhbHVlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdLCBkaXNhYmxlZDogZmFsc2UgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHNlbmRDb3VudHJ5OiBbJ0FsbCcsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICByZWNlaXZlQ291bnRyeTogWydBbGwnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgY2xpZW50OiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGJyYW5jaDogW3sgdmFsdWU6IG51bGwsIGRpc2FibGVkOiB0aGlzLmlzQWdlbnRTZWxlY3RlZCB9LCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcHJvZHVjdDogWydBbGwnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcmVjZWl2ZUN1cnJlbmN5OiBbJ0FsbCcsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICB0cmFuc2FjdGlvblN0YXR1czogW1snQWxsJ10sVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHNlbGVjdGVkU3RhdHVzOiBbJ0FsbCcsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgdGhpcy5zaG93U3RhdHVzRHJvcGRvd24gPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0NsaWVudHMgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IFwiXCI7XHJcbiAgICB0aGlzLnNob3dFcnJvciA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93UmVwb3J0ID0gZmFsc2U7XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmZvcm0udmFsdWUpXHJcbiAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5mb3JtLmNvbnRyb2xzW1wiZnJvbURhdGVcIl0udmFsdWU7XHJcbiAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuZm9ybS5jb250cm9sc1tcInRvRGF0ZVwiXS52YWx1ZTtcclxuICAgIC8vIFZhbGlkYXRlIEZvcm1cclxuICAgIGlmICghdGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0Vycm9yID0gdHJ1ZTtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBgUGxlYXNlIGZpbGwgYWxsIHRoZSByZXF1aXJlZCBmaWVsZHNgO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBDaGVjayBpZiBmcm9tRGF0ZSBpcyBncmVhdGVyIHRoYW4gdG9EYXRlXHJcbiAgICBpZiAobmV3IERhdGUodGhpcy5mcm9tRGF0ZSkgPiBuZXcgRGF0ZSh0aGlzLnRvRGF0ZSkpIHtcclxuICAgICAgdGhpcy5zaG93RXJyb3IgPSB0cnVlO1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGBGcm9tIERhdGUgJHt0aGlzLmZyb21EYXRlfSBjYW4gbm90IGJlIGdyZWF0ZXIgdGhhbiBUbyBEYXRlICR7dGhpcy50b0RhdGV9YDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGluIGRheXMgXHJcbiAgICBjb25zdCBmcm9tID0gbmV3IERhdGUodGhpcy5mcm9tRGF0ZSk7XHJcbiAgICBjb25zdCB0byA9IG5ldyBEYXRlKHRoaXMudG9EYXRlKTtcclxuICAgIGNvbnN0IGRpZmZlcmVuY2VJbkRheXMgPSBNYXRoLmZsb29yKCh0bz8uZ2V0VGltZSgpIC0gZnJvbT8uZ2V0VGltZSgpKSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZGF0ZXMgZXhjZWVkcyAzMSBkYXlzICgxIG1vbnRocyBhcHByb3gpXHJcbiAgICBpZiAoZGlmZmVyZW5jZUluRGF5cyA+IDMxKSB7XHJcbiAgICAgIHRoaXMuc2hvd0Vycm9yID0gdHJ1ZTtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBgRnJvbSBEYXRlICR7dGhpcy5mcm9tRGF0ZX0gYW5kIFRvIERhdGUgJHt0aGlzLnRvRGF0ZX0gc2hvdWxkIGhhdmUgZGlmZmVyZW5jZSBvZiBtYXggMSBtb250aGA7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0Vycm9yID0gZmFsc2U7XHJcbiAgICBjb25zdCBkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xyXG4gICAgdGhpcy5yZXBvcnREYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xyXG4gICAgdGhpcy5yZXBvcnREYXRlID0gZm9ybWF0RGF0ZSh0aGlzLnJlcG9ydERhdGUsICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKTtcclxuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5tYXBGb3JtVG9Nb2RlbCgpO1xyXG4gICAgbW9kYWwudHJhbnNhY3Rpb25TdGF0dXMgPSB0aGlzLmZvcm0uY29udHJvbHNbXCJzZWxlY3RlZFN0YXR1c1wiXS52YWx1ZTtcclxuICAgIGNvbnNvbGUubG9nKG1vZGFsKTtcclxuICAgIHRoaXMuc2hvd01lc3NhZ2UgPSB0cnVlO1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkxvYWRpbmc7XHJcbiAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QnJhbmNoQWN0aXZpdHlSZXBvcnQobW9kYWwpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZGF0YSk7XHJcbiAgICAgICAgdGhpcy5kYXRhTWFwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcmVkRGF0YSkubGVuZ3RoID09IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wcm94eURhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGF0YSk7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uQXJyYXkgPSBuZXcgQXJyYXkoT2JqZWN0LmtleXModGhpcy5maWx0ZXJlZERhdGEpLmxlbmd0aCkuZmlsbCgxNSk7XHJcbiAgICAgICAgdGhpcy5zaG93TWVzc2FnZSA9IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhKS5sZW5ndGggPT0gMCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICB0aGlzLnNob3dSZXBvcnQgPSB0cnVlO1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuQ29tcGxldGU7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICBvblNlYXJjaCgpIHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuc2VhcmNoVGV4dCk7XHJcbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0LnRyaW0oKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5kYXRhTWFwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucHJveHlEYXRhKSkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBlbnRyaWVzLmZpbHRlcihlbnRyeSA9PiBPYmplY3QudmFsdWVzKGVudHJ5KVxyXG4gICAgICAgIC5zb21lKHZhbCA9PiB7XHJcbiAgICAgICAgICBsZXQgYTogc3RyaW5nID0gdmFsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgIHJldHVybiBhLnNlYXJjaCh0aGlzLnNlYXJjaFRleHQpID09IC0xID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgICAgIH0pKVxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJlZERhdGFba2V5XSA9IGZpbHRlcmVkRGF0YTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlsdGVyZWREYXRhO1xyXG4gIH1cclxuXHJcbiAgb25BZ2VudFNlbGVjdGVkKGNvZGU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1snY2xpZW50J10udmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzWydicmFuY2gnXS5wYXRjaFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkxvYWRpbmc7XHJcbiAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QnJhbmNoQnlBZ2VudCh0aGlzLnN5c1VzZXJJZCwgY29kZSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmNsaWVudEJyYW5jaGVzID0gZGF0YTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuQ29tcGxldGU7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgaWYoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcImV6cmVtaXR1c2VybmFtZVwiKSl7XHJcbiAgICAgICAgICBjb25zdCBpbmRleD10aGlzLmNsaWVudEJyYW5jaGVzLmZpbmRJbmRleCgoYnJhbmNoKT0+YnJhbmNoLmJyYW5jaENvZGUgPT09IFwiQWxsXCIpO1xyXG4gICAgICAgICAgaWYoaW5kZXg9PS0xKXtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzWydicmFuY2gnXS5zZXRWYWx1ZSh0aGlzLmNsaWVudEJyYW5jaGVzWzBdLmJyYW5jaENvZGUpXHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzWydicmFuY2gnXS5zZXRWYWx1ZSgnQWxsJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbWFwRm9ybVRvTW9kZWwoKTogQnJhbmNoQWN0aXZpdHlTZW5kUmVwb3J0UmVxdWVzdERvbWFpbk1vZGVsIHtcclxuICAgIGNvbnN0IGRhdGEgPSBuZXcgQnJhbmNoQWN0aXZpdHlTZW5kUmVwb3J0UmVxdWVzdERvbWFpbk1vZGVsKHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpKTtcclxuICAgIGRhdGEuc3RhcnREYXRlID0gdGhpcy5mb3JtLmNvbnRyb2xzWydmcm9tRGF0ZSddLnZhbHVlO1xyXG4gICAgZGF0YS5lbmREYXRlID0gdGhpcy5mb3JtLmNvbnRyb2xzWyd0b0RhdGUnXS52YWx1ZTtcclxuICAgIGRhdGEuc2VuZENvdW50cnlDb2RlID0gdGhpcy5mb3JtLmNvbnRyb2xzWydzZW5kQ291bnRyeSddLnZhbHVlO1xyXG4gICAgZGF0YS5yZWN2Q291bnRyeUNvZGUgPSB0aGlzLmZvcm0uY29udHJvbHNbJ3JlY2VpdmVDb3VudHJ5J10udmFsdWU7XHJcbiAgICBkYXRhLmJ1c2luZXNzUGFydG5lckNvZGUgPSB0aGlzLmZvcm0uY29udHJvbHNbJ2NsaWVudCddLnZhbHVlO1xyXG4gICAgZGF0YS50cmFuc2FjdGlvblN0YXR1cyA9IHRoaXMuZm9ybS5jb250cm9sc1sndHJhbnNhY3Rpb25TdGF0dXMnXS52YWx1ZTtcclxuICAgIGRhdGEudHJhbnNhY3Rpb25UeXBlID0gdGhpcy5mb3JtLmNvbnRyb2xzWydwcm9kdWN0J10udmFsdWU7XHJcbiAgICBkYXRhLmJyYW5jaENvZGUgPSB0aGlzLmZvcm0uY29udHJvbHNbJ2JyYW5jaCddLnZhbHVlO1xyXG4gICAgZGF0YS5wYXlvdXRDdXJyZW5jeSA9IHRoaXMuZm9ybS5jb250cm9sc1sncmVjZWl2ZUN1cnJlbmN5J10udmFsdWU7XHJcbiAgICBkYXRhLmNvbXBhbnlDb2RlID0gXCJCSFwiO1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBvbkdyaWRSZWFkeShwYXJhbXM6IEdyaWRSZWFkeUV2ZW50KSB7XHJcbiAgICBwYXJhbXMuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIHRoaXMuZ3JpZEFQaSA9IHBhcmFtcy5hcGk7XHJcbiAgICB0aGlzLmdyaWRDb2x1bW5BcGkgPSBwYXJhbXMuY29sdW1uQXBpO1xyXG4gIH1cclxuXHJcbiAgb25HcmlkU2l6ZUNoYW5nZWQocGFyYW1zOiBhbnkpIHtcclxuICAgIHBhcmFtcy5hcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIGNoYW5nZUxpbWl0KGxpbWl0OiBhbnksIGluZGV4OiBudW1iZXIsIGtleTogc3RyaW5nKSB7XHJcbiAgICBpZiAobGltaXQgIT0gXCJBbGxcIikge1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BcnJheVtpbmRleF0gPSBsaW1pdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFycmF5W2luZGV4XSA9IHRoaXMuZmlsdGVyZWREYXRhW2tleV0ubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93UmFuZ2UgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZUV4cG9ydCgpIHtcclxuICAgIGNvbnN0IGRhdGE6IGFueVtdID0gW107XHJcbiAgICB0aGlzLmdyaWRBUGkuZm9yRWFjaE5vZGUobm9kZSA9PiBkYXRhLnB1c2gobm9kZS5kYXRhKSlcclxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmZpbHRlcmVkRGF0YSkubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uKSB7XHJcbiAgICAgIGNhc2UgJ2V4Y2VsJzpcclxuICAgICAgICB0aGlzLmV4cG9ydEV4Y2VsKGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdwZGYnOlxyXG4gICAgICAgIHRoaXMuZXhwb3J0UERGKGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjc3YnOlxyXG4gICAgICAgIHRoaXMuZXhwb3J0Q1NWKGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGFsZXJ0KCdQbGVhc2Ugc2VsZWN0IGFuIGV4cG9ydCBmb3JtYXQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVXRpbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBwcml2YXRlIGxvYWRJbWFnZUFzQmFzZTY0KGltYWdlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcclxuICAgICAgaW1nLnNyYyA9IGltYWdlUGF0aDtcclxuXHJcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gU2NhbGUgdXAgY2FudmFzIHJlc29sdXRpb24gKDJ4IG9yIG1vcmUpXHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSAyO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aCAqIHNjYWxlO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0ICogc2NhbGU7XHJcblxyXG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgIGlmIChjdHgpIHtcclxuICAgICAgICAgIGN0eC5zY2FsZShzY2FsZSwgc2NhbGUpOyAvLyBEcmF3IGltYWdlIGF0IGhpZ2hlciBxdWFsaXR5XHJcbiAgICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XHJcbiAgICAgICAgICBjb25zdCBiYXNlNjQgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnLCAxLjApOyAvLyAxLjAgPSBoaWdoZXN0IHF1YWxpdHlcclxuICAgICAgICAgIHJlc29sdmUoYmFzZTY0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KCdGYWlsZWQgdG8gZ2V0IGNhbnZhcyBjb250ZXh0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGltZy5vbmVycm9yID0gKCkgPT4gcmVqZWN0KCdGYWlsZWQgdG8gbG9hZCBpbWFnZTogJyArIGltYWdlUGF0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV4cG9ydFBERihkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGN1cnJlbmN5RmllbGRzID0gWydwYXlvdXRBbW91bnQnLCAncGF5aW5BbW91bnQnLCAndG90YWxQYXlpbkFtb3VudCcsICd0YXgnLCAndHJhbnNhY3Rpb25Db21taXNzaW9uQW1vdW50J107XHJcbiAgICBkYXRhID0gT2JqZWN0LnZhbHVlcyh0aGlzLmRhdGFNYXApWzBdO1xyXG4gICAgY29uc3QgZG9jID0gbmV3IGpzUERGKHtcclxuICAgICAgb3JpZW50YXRpb246ICdsYW5kc2NhcGUnLFxyXG4gICAgICB1bml0OiAnbW0nLFxyXG4gICAgICBmb3JtYXQ6IFs0MDAsIDIxMF1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aDtcclxuXHJcbiAgICAvL1RpdGxlXHJcbiAgICBjb25zdCB0aXRsZSA9IGBCcmFuY2ggQWN0aXZpdHkgU2VuZGA7XHJcbiAgICBkb2Muc2V0Rm9udFNpemUoMTUpO1xyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBjb25zdCB0ZXh0V2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKHRpdGxlKTtcclxuICAgIGRvYy50ZXh0KHRpdGxlLCBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLyAyLCAxNSwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XHJcblxyXG4gICAgLy9BZGQgSW1hZ2VcclxuICAgIGlmICh0aGlzLmxvZ29CYXNlNjQpIHtcclxuICAgICAgZG9jLmFkZEltYWdlKHRoaXMubG9nb0Jhc2U2NCwgJ1BORycsIDE1LCA1LCAyNSwgMjApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSW5mbyBibG9ja1xyXG4gICAgY29uc3QgaW5mb1kgPSAzMDtcclxuICAgIGNvbnN0IGxlZnRNYXJnaW4gPSAxNTtcclxuICAgIGNvbnN0IGxpbmVIZWlnaHQgPSA3O1xyXG4gICAgY29uc3QgaW5mb0xpbmVzID0gW1xyXG4gICAgICBbJ1JlcG9ydCBVc2VyIEFuZCBUaW1lOicsIHRoaXMudXNlcl0sXHJcbiAgICAgIFsnUmVwb3J0IFRpbWUnLCBmb3JtYXREYXRlKHRoaXMucmVwb3J0RGF0ZSwgJ2RkL01NL3l5eXkgaGg6bW0gYScsICdlbi1VUycpXVxyXG4gICAgICAvLyBbJ1JlcG9ydCBQZXJpb2Q6JywgYCR7dGhpcy5mcm9tRGF0ZX0gLSAke3RoaXMudG9EYXRlfWBdXHJcbiAgICBdXHJcblxyXG4gICAgZG9jLnNldEZvbnRTaXplKDEwKTtcclxuICAgIGluZm9MaW5lcy5mb3JFYWNoKChbbGFiZWwsIHZhbHVlXSwgaSkgPT4ge1xyXG4gICAgICBjb25zdCB5ID0gaW5mb1kgKyBpICogbGluZUhlaWdodDtcclxuICAgICAgLy8gRHJhdyBsYWJlbCBpbiBib2xkXHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBkb2MudGV4dChsYWJlbCwgbGVmdE1hcmdpbiwgeSk7XHJcblxyXG4gICAgICAvLyBEcmF3IHZhbHVlIGluIG5vcm1hbCBmb250IHJpZ2h0IGFmdGVyIGxhYmVsXHJcbiAgICAgIGNvbnN0IGxhYmVsV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGxhYmVsICsgJyAnKTtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgZG9jLnRleHQodmFsdWUsIGxlZnRNYXJnaW4gKyBsYWJlbFdpZHRoLCB5KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IHRoaXMuY29sdW1uRGVmcy5maWx0ZXIoY29sID0+XHJcbiAgICAgICEoY29sLmhlYWRlck5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3NyLiBubycpIHx8IGNvbC5maWVsZD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnc3JubycpIHx8IGNvbC5maWVsZD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnc2VyaWFsJykpXHJcbiAgICApO1xyXG5cclxuICAgIC8vIFByZXBhcmUgaGVhZGVycyB3aXRoIFNyIE5vXHJcbiAgICBjb25zdCBoZWFkZXJzID0gWydTciBObycsIC4uLmZpbHRlcmVkQ29sdW1ucy5tYXAoY29sID0+IGNvbC5oZWFkZXJOYW1lIHx8IGNvbC5maWVsZCEpXTtcclxuXHJcbiAgICBsZXQgUm93czogYW55W10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJlcG9ydHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZGF0YU1hcCkpIHtcclxuICAgICAgUm93cy5wdXNoKFt7IGNvbnRlbnQ6IGtleSwgY29sU3BhbjogMTUgfV0pO1xyXG4gICAgICBjb25zdCByb3dzID0gcmVwb3J0cy5tYXAoKHJvdywgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCByb3dEYXRhID0gZmlsdGVyZWRDb2x1bW5zLm1hcChjb2wgPT4ge1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gcm93W2NvbC5maWVsZCFdO1xyXG4gICAgICAgICAgaWYgKGN1cnJlbmN5RmllbGRzLmluY2x1ZGVzKGNvbC5maWVsZCkgJiYgdmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQoMyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPz8gJyc7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgUm93cy5wdXNoKFtpbmRleCArIDEsIC4uLnJvd0RhdGFdKTtcclxuICAgICAgICByZXR1cm4gW2luZGV4ICsgMSwgLi4ucm93RGF0YV07XHJcbiAgICAgIH0pO1xyXG4gICAgICAvLyBSb3dzLnB1c2gocm93cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJlcGFyZSByb3dzIHdpdGggU3IgTm9cclxuICAgIGNvbnN0IHJvd3MgPSBkYXRhLm1hcCgocm93LCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCByb3dEYXRhID0gZmlsdGVyZWRDb2x1bW5zLm1hcChjb2wgPT4ge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IHJvd1tjb2wuZmllbGQhXTtcclxuICAgICAgICByZXR1cm4gdmFsdWUgPz8gJyc7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gW2luZGV4ICsgMSwgLi4ucm93RGF0YV07XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBHZW5lcmF0ZSBkeW5hbWljIGNvbHVtbiBzdHlsZXMgZm9yIGF1dG8td2lkdGhcclxuICAgIGNvbnN0IGNvbHVtblN0eWxlczogeyBba2V5OiBudW1iZXJdOiBhbnkgfSA9IHt9O1xyXG4gICAgaGVhZGVycy5mb3JFYWNoKChfLCBpKSA9PiB7XHJcbiAgICAgIGNvbHVtblN0eWxlc1tpXSA9IHsgY2VsbFdpZHRoOiAnYXV0bycgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbHVtblN0eWxlc1syXSA9IHsgY2VsbFdpZHRoOiA0MCB9O1xyXG5cclxuICAgIC8vIFJlbmRlciBUYWJsZVxyXG4gICAgZG9jLmF1dG9UYWJsZSh7XHJcbiAgICAgIGhlYWQ6IFtoZWFkZXJzXSxcclxuICAgICAgYm9keTogUm93cyxcclxuICAgICAgc3RhcnRZOiBpbmZvWSArIGluZm9MaW5lcy5sZW5ndGggKiBsaW5lSGVpZ2h0ICsgNSxcclxuICAgICAgdGhlbWU6ICdncmlkJyxcclxuICAgICAgaGVhZFN0eWxlczoge1xyXG4gICAgICAgIGZpbGxDb2xvcjogWzIyMCwgMjIwLCAyMjBdLFxyXG4gICAgICAgIHRleHRDb2xvcjogMCxcclxuICAgICAgICBmb250U3R5bGU6ICdib2xkJyxcclxuICAgICAgICBmb250U2l6ZTogOSxcclxuICAgICAgICBoYWxpZ246ICdjZW50ZXInXHJcbiAgICAgIH0sXHJcbiAgICAgIGJkeVN0eWxlczoge1xyXG4gICAgICAgIGZvbnRTaXplOiA4LFxyXG4gICAgICAgIGZpbGxDb2xvcjogWzI1NSwgMjU1LCAyNTVdLFxyXG4gICAgICAgIHRleHRDb2xvcjogWzAsIDAsIDBdXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0eWxlczoge1xyXG4gICAgICAgIGNlbGxQYWRkaW5nOiAyLFxyXG4gICAgICAgIG92ZXJmbG93OiAnbGluZWJyZWFrJyxcclxuICAgICAgICBtaW5DZWxsSGVpZ2h0OiA2XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtblN0eWxlczogY29sdW1uU3R5bGVzXHJcbiAgICB9KTtcclxuICAgIGRvYy5zYXZlKFwiQnJhbmNoLUFjdGl2aXR5LVNlbmQtUmVwb3J0LnBkZlwiKVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0RXhjZWwoZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBjdXJyZW5jeUZpZWxkcyA9IFsncGF5b3V0QW1vdW50JywgJ3BheWluQW1vdW50JywgJ3RvdGFsUGF5aW5BbW91bnQnLCAndGF4JywgJ3RyYW5zYWN0aW9uQ29tbWlzc2lvbkFtb3VudCddO1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgRXhjZWxKUy5Xb3JrYm9vaygpO1xyXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gd29ya2Jvb2suYWRkV29ya3NoZWV0KCdCcmFuY2gtQWN0aXZpdHktU2VuZC1SZXBvcnQnKTtcclxuICAgIGNvbnN0IHRvdGFsQ29sdW1ucyA9IHRoaXMuY29sdW1uRGVmcy5sZW5ndGg7XHJcblxyXG4gICAgLy8gVGl0bGUgUm93XHJcbiAgICBjb25zdCB0aXRsZVJvdyA9IHdvcmtzaGVldC5hZGRSb3coW1wiQnJhbmNoIEFjdGl2aXR5IFNlbmRcIl0pO1xyXG4gICAgdGl0bGVSb3cuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTQgfTtcclxuICAgIHRpdGxlUm93LmhlaWdodCA9IDYwO1xyXG4gICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMoYEEke3RpdGxlUm93Lm51bWJlcn06JHtTdHJpbmcuZnJvbUNoYXJDb2RlKDY0ICsgdG90YWxDb2x1bW5zKX0ke3RpdGxlUm93Lm51bWJlcn1gKTtcclxuICAgIC8vQ2VudGVyIGFsaWduIHRoZSB0aXRsZVxyXG4gICAgY29uc3QgbWFzdGVyQ2VsbCA9IHdvcmtzaGVldC5nZXRDZWxsKGBBJHt0aXRsZVJvdy5udW1iZXJ9YCk7XHJcbiAgICBtYXN0ZXJDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ2NlbnRlcicsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG5cclxuICAgIC8vIEFkZCBpbWFnZSBpZiBhdmFpbGFibGVcclxuICAgIGlmICh0aGlzLmxvZ29CYXNlNjQpIHtcclxuICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IHRoaXMubG9nb0Jhc2U2NC5yZXBsYWNlKC9eZGF0YTppbWFnZVxcL1xcdys7YmFzZTY0LC8sICcnKTtcclxuICAgICAgY29uc3QgaW1hZ2VJZCA9IHdvcmtib29rLmFkZEltYWdlKHtcclxuICAgICAgICBiYXNlNjQ6IGJhc2U2NERhdGEsXHJcbiAgICAgICAgZXh0ZW5zaW9uOiAncG5nJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBQbGFjZSBpbWFnZSBhdCB0b3AtbGVmdCAoZS5nLiwgQTE6QzQpXHJcbiAgICAgIHdvcmtzaGVldC5hZGRJbWFnZShpbWFnZUlkLCB7XHJcbiAgICAgICAgdGw6IHsgY29sOiAwLCByb3c6IDAgfSxcclxuICAgICAgICBleHQ6IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiA1MCB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL01ldGEgRGF0YVxyXG4gICAgY29uc3QgbWV0YTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICBbJ1JlcG9ydCBVc2VyICcsIHRoaXMudXNlcl0sXHJcbiAgICAgIFsnUmVwb3J0IFRpbWUnLCBmb3JtYXREYXRlKHRoaXMucmVwb3J0RGF0ZSwgJ2RkL01NL3l5eXkgaGg6bW0gYScsICdlbi1VUycpXVxyXG4gICAgICAvLyBbJ1JlcG9ydCBQZXJpb2QnLCBgJHt0aGlzLmZyb21EYXRlfSAtICR7dGhpcy50b0RhdGV9YF1cclxuICAgIF1cclxuXHJcbiAgICBtZXRhLmZvckVhY2goKFtsYWJlbCwgdmFsdWVdKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJvdyA9IHdvcmtzaGVldC5hZGRSb3coW2xhYmVsLCB2YWx1ZV0pO1xyXG4gICAgICAvL0JvbGQgdGhlIGtleSBjb2x1bW5cclxuICAgICAgY29uc3QgbGFiZWxDZWxsID0gcm93LmdldENlbGwoMSk7XHJcbiAgICAgIGxhYmVsQ2VsbC5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICB9KVxyXG4gICAgLy8gRm9yIEVtcHR5IFJvd1xyXG4gICAgd29ya3NoZWV0LmFkZFJvdyhbXSk7XHJcblxyXG4gICAgLy8gQWRkIEhlYWRlciBSb3cgZm9yIERhdGEgVGFibGVcclxuICAgIGNvbnN0IGhlYWRlclJvdyA9IHdvcmtzaGVldC5hZGRSb3codGhpcy5jb2x1bW5EZWZzLm1hcChjb2wgPT4gY29sLmhlYWRlck5hbWUgfHwgY29sLmZpZWxkKSk7XHJcbiAgICBoZWFkZXJSb3cuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdGhpcy5jb2x1bW5EZWZzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNlbGwgPSBoZWFkZXJSb3cuZ2V0Q2VsbChpKTtcclxuICAgICAgY2VsbC5maWxsID0ge1xyXG4gICAgICAgIHR5cGU6ICdwYXR0ZXJuJyxcclxuICAgICAgICBwYXR0ZXJuOiAnc29saWQnLFxyXG4gICAgICAgIGZnQ29sb3I6IHsgYXJnYjogJ0Q5RDlEOScgfSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBoZWFkZXJSb3cuYWxpZ25tZW50ID0ge1xyXG4gICAgICB3cmFwVGV4dDogdHJ1ZSxcclxuICAgICAgdmVydGljYWw6ICd0b3AnLFxyXG4gICAgICBob3Jpem9udGFsOiAnY2VudGVyJ1xyXG4gICAgfTtcclxuICAgIGhlYWRlclJvdy5ib3JkZXIgPSB7XHJcbiAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGF0YVN0YXJ0Um93ID0gd29ya3NoZWV0Lmxhc3RSb3chLm51bWJlciArIDE7XHJcbiAgICBjb25zdCBicmFuY2hSb3dzID0gW107XHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJlcG9ydHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZGF0YU1hcCkpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleTonLCBrZXkpO1xyXG4gICAgICBjb25zb2xlLmxvZygnUmVwb3J0czonLCByZXBvcnRzKTtcclxuICAgICAgY29uc3Qgcm93ID0gd29ya3NoZWV0LmFkZFJvdyhbYCR7a2V5fWBdKTtcclxuICAgICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMocm93Lm51bWJlciwgMSwgcm93Lm51bWJlciwgMTApO1xyXG4gICAgICBicmFuY2hSb3dzLnB1c2gocm93Lm51bWJlcik7XHJcbiAgICAgIC8vIEFkZCBEYXRhIFJvd3NcclxuICAgICAgcmVwb3J0cy5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93RGF0YSA9IHRoaXMuY29sdW1uRGVmcy5tYXAoY29sID0+IHtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IHJvd1tjb2wuZmllbGQhXTtcclxuICAgICAgICAgIC8vIEZvcm1hdCBjdXJyZW5jeSBmaWVsZHNcclxuICAgICAgICAgIGlmIChjdXJyZW5jeUZpZWxkcy5pbmNsdWRlcyhjb2wuZmllbGQpICYmIHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKDMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgXFx0ICR7dmFsdWV9YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB2YWx1ZSA/PyAnJztcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IGRhdGFSb3cgPSB3b3Jrc2hlZXQuYWRkUm93KHJvd0RhdGEpO1xyXG4gICAgICAgIGRhdGFSb3cuYm9yZGVyID0ge1xyXG4gICAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSwgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgICAgd29ya3NoZWV0LmFkZFJvdyhbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXV0byBjb2x1bW4gd2lkdGggT05MWSBiYXNlZCBvbiBkYXRhIHJvd3NcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRvdGFsQ29sdW1uczsgaSsrKSB7XHJcbiAgICAgIGxldCBtYXhMZW5ndGggPSAxMDtcclxuICAgICAgZm9yIChsZXQgcm93TnVtID0gZGF0YVN0YXJ0Um93OyByb3dOdW0gPD0gd29ya3NoZWV0Lmxhc3RSb3chLm51bWJlcjsgcm93TnVtKyspIHtcclxuICAgICAgICBpZiAoYnJhbmNoUm93cy5pbmRleE9mKHggPT4geCA9PT0gcm93TnVtKSA9PT0gLTEpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjZWxsID0gd29ya3NoZWV0LmdldFJvdyhyb3dOdW0pLmdldENlbGwoaSk7XHJcbiAgICAgICAgY29uc3QgdmFsID0gY2VsbC52YWx1ZSA/IGNlbGwudmFsdWUudG9TdHJpbmcoKSA6ICcnO1xyXG4gICAgICAgIG1heExlbmd0aCA9IE1hdGgubWF4KG1heExlbmd0aCwgdmFsLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgICAgd29ya3NoZWV0LmdldENvbHVtbihpKS53aWR0aCA9IG1heExlbmd0aCArIDI7XHJcbiAgICB9XHJcbiAgICB3b3Jrc2hlZXQuZ2V0Q29sdW1uKDIpLndpZHRoID0gMjA7XHJcbiAgICB3b3Jrc2hlZXQuZ2V0Q29sdW1uKDMpLndpZHRoID0gMTU7XHJcbiAgICAvLyBFeHBvcnRcclxuICAgIHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKS50aGVuKGJ1ZmZlciA9PiB7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xyXG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCdcclxuICAgICAgfSlcclxuICAgICAgRmlsZVNhdmVyLnNhdmVBcyhibG9iLCAnQnJhbmNoLUFjdGl2aXR5LVNlbmQtUmVwb3J0Lnhsc3gnKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBleHBvcnRDU1YoZGF0YTogYW55W10pIHtcclxuICAgIGNvbnN0IGN1cnJlbmN5RmllbGRzID0gWydwYXlvdXRBbW91bnQnLCAncGF5aW5BbW91bnQnLCAndG90YWxQYXlpbkFtb3VudCcsICd0YXgnLCAndHJhbnNhY3Rpb25Db21taXNzaW9uQW1vdW50J107XHJcbiAgICBjb25zdCBtZXRhZGF0YSA9IFtcclxuICAgICAgWydSZXBvcnQgVGl0bGUnLCAnQnJhbmNoIEFjdGl2aXR5IFNlbmQnXSxcclxuICAgICAgWydSZXBvcnQgVGltZScsIGZvcm1hdERhdGUodGhpcy5yZXBvcnREYXRlLCAnZGQvTU0veXl5eSBoaDptbSBhJywgJ2VuLVVTJyldXHJcbiAgICAgIC8vIFsnUmVwb3J0IFVzZXInLCB0aGlzLnVzZXJdXHJcbiAgICBdO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkQ29scyA9IHRoaXMuY29sdW1uRGVmcy5maWx0ZXIoXHJcbiAgICAgIGNvbCA9PlxyXG4gICAgICAgICEoY29sLmhlYWRlck5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3NyLiBubycpIHx8XHJcbiAgICAgICAgICBjb2wuZmllbGQ/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3NyLiBubycpKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBoZWFkZXJzID0gWydTciBObycsIC4uLmZpbHRlcmVkQ29scy5tYXAoY29sID0+IGNvbC5oZWFkZXJOYW1lIHx8IGNvbC5maWVsZCEpXTtcclxuXHJcbiAgICBsZXQgUm93czogYW55W11bXSA9IFtdXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJlcG9ydHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZGF0YU1hcCkpIHtcclxuICAgICAgUm93cy5wdXNoKFtrZXldKTtcclxuICAgICAgcmVwb3J0cy5tYXAoKHJvdywgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCByb3dWYWxzID0gZmlsdGVyZWRDb2xzLm1hcChjb2wgPT4ge1xyXG4gICAgICAgICAgbGV0IHYgPSByb3dbY29sLmZpZWxkIV07XHJcbiAgICAgICAgICBpZiAoY3VycmVuY3lGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSAmJiB2ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdiA9IHBhcnNlRmxvYXQodikudG9GaXhlZCgzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjb2wuZmllbGQgPT09ICd0cmFuc2FjdGlvbk51bWJlcicgfHwgY29sLmhlYWRlck5hbWUgPT09ICdUcmFuc2FjdGlvbiBOdW1iZXInKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgXFx0ICR7dn1gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHYgPz8gJyc7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgUm93cy5wdXNoKFtpbmRleCArIDEsIC4uLnJvd1ZhbHNdKTtcclxuICAgICAgICByZXR1cm4gW2luZGV4ICsgMSwgLi4ucm93VmFsc107XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYW9hOiBhbnlbXVtdID0gW1xyXG4gICAgICAuLi5tZXRhZGF0YSxcclxuICAgICAgW10sICAgICAgLy8gYmxhbmsgcm93IGZvciBzZXBhcmF0aW9uXHJcbiAgICAgIGhlYWRlcnMsXHJcbiAgICAgIC4uLlJvd3NcclxuICAgIF07XHJcblxyXG4gICAgLy8gY29udmVydCB0byB3b3Jrc2hlZXQgJiBDU1ZcclxuICAgIGNvbnN0IHdzID0gWExTWC51dGlscy5hb2FfdG9fc2hlZXQoYW9hKTtcclxuICAgIGNvbnN0IGNzdiA9IFhMU1gudXRpbHMuc2hlZXRfdG9fY3N2KHdzLCB7XHJcbiAgICAgIEZTOiAnLCcsIFJTOiAnXFxuJywgYmxhbmtyb3dzOiBmYWxzZSwgZm9yY2VRdW90ZXM6IGZhbHNlXHJcbiAgICB9IGFzIGFueSk7XHJcblxyXG4gICAgLy8gdHJpZ2dlciBkb3dubG9hZFxyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZdLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XHJcbiAgICBzYXZlQXMoYmxvYiwgJ0JyYW5jaC1BY3Rpdml0eS1TZW5kLVJlcG9ydC5jc3YnKTtcclxuICB9XHJcblxyXG4gIC8vIHNob3dTdGF0dXMoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgLy8gICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gIC8vICAgICB0aGlzLnNob3dTdGF0dXNEcm9wZG93biA9ICF0aGlzLnNob3dTdGF0dXNEcm9wZG93bjtcclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2VsZWN0U3RhdHVzKGV2ZW50OiBFdmVudCkge1xyXG4gIC8vICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgLy8gICB0aGlzLnN0YXR1cyA9IFtdO1xyXG4gIC8vICAgLy8gdGhpcy5zdGF0dXMgPSB0aGlzLmZvcm0uY29udHJvbHNbXCJzZWxlY3RlZFN0YXR1c1wiXS52YWx1ZS5zcGxpdChcIixcIik7XHJcbiAgLy8gICB0aGlzLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gIC8vICAgaWYgKHRhcmdldC5jaGVja2VkKSB7XHJcbiAgLy8gICAgIHRoaXMubXlTdGF0dXMucHVzaChuZXcgRm9ybUNvbnRyb2wodGFyZ2V0LnZhbHVlKSk7XHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKHRoaXMubXlTdGF0dXMpO1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgY29uc3QgaW5kZXggPSB0aGlzLm15U3RhdHVzLmNvbnRyb2xzXHJcbiAgLy8gICAgICAgLmZpbmRJbmRleChjdHJsID0+IGN0cmwudmFsdWUgPT09IHRhcmdldC52YWx1ZSk7XHJcbiAgLy8gICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAvLyAgICAgICB0aGlzLm15U3RhdHVzLnJlbW92ZUF0KGluZGV4KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5teVN0YXR1cy5jb250cm9scy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICB0aGlzLnN0YXR1cy5wdXNoKHRoaXMubXlTdGF0dXMuY29udHJvbHNbaV0udmFsdWUpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgY29uc29sZS5sb2codGhpcy5teVN0YXR1cyk7XHJcbiAgLy8gICB0aGlzLmZvcm0uc2V0Q29udHJvbCgndHJhbnNhY3Rpb25TdGF0dXMnLCBuZXcgRm9ybUFycmF5KFtuZXcgRm9ybUNvbnRyb2wodGFyZ2V0LnZhbHVlKV0pKTtcclxuICAvLyAgIHRoaXMuZm9ybS5jb250cm9sc1tcInNlbGVjdGVkU3RhdHVzXCJdLnNldFZhbHVlKHRoaXMuc3RhdHVzLmpvaW4oXCIsXCIpKTtcclxuICAvLyAgIGNvbnNvbGUubG9nKHRoaXMuZm9ybS5jb250cm9sc1tcInNlbGVjdGVkU3RhdHVzXCJdLnZhbHVlKTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNlbGVjdEFsbFN0YXR1cyhldmVudDogRXZlbnQpIHtcclxuICAvLyAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIC8vICAgdGhpcy5zdGF0dXMgPSBbXTtcclxuICAvLyAgIHRoaXMuc2VsZWN0QWxsID0gIXRoaXMuc2VsZWN0QWxsO1xyXG4gIC8vICAgaWYgKHRhcmdldC5jaGVja2VkKSB7XHJcbiAgLy8gICAgIGZvciAobGV0IHMgb2YgdGhpcy5wYXJhbXM/LnRyYW5zYWN0aW9uU3RhdHVzVHlwZXMpIHtcclxuICAvLyAgICAgICB0aGlzLm15U3RhdHVzLnB1c2gobmV3IEZvcm1Db250cm9sKHMudHJhbnNhY3Rpb25TdGF0dXMpKTtcclxuICAvLyAgICAgICB0aGlzLnN0YXR1cy5wdXNoKHMudHJhbnNhY3Rpb25TdGF0dXMpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLm15U3RhdHVzLmNsZWFyKCk7XHJcbiAgLy8gICAgIHRoaXMuc3RhdHVzID0gW11cclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuZm9ybS5jb250cm9sc1tcInNlbGVjdGVkU3RhdHVzXCJdLnNldFZhbHVlKHRoaXMuc3RhdHVzLmpvaW4oXCIsXCIpKTtcclxuICAvLyAgIGNvbnNvbGUubG9nKHRoaXMuZm9ybS5jb250cm9sc1tcInNlbGVjdGVkU3RhdHVzXCJdLnZhbHVlKTtcclxuICAvLyB9XHJcblxyXG4gIC8vQ3VycmVuY3kgRHJvcGRvd25cclxuICAvLyB0b2dnbGVDdXJyZW5jeURyb3Bkb3duKCkge1xyXG4gIC8vICAgdGhpcy5zaG93Q3VycmVuY3kgPSAhdGhpcy5zaG93Q3VycmVuY3k7XHJcbiAgLy8gfVxyXG4gIC8vIHNlbGVjdEN1cnJlbmN5KGN1cnJlbmN5Q29kZTogc3RyaW5nKSB7XHJcbiAgLy8gICB0aGlzLmZvcm0uY29udHJvbHNbXCJyZWNlaXZlQ3VycmVuY3lcIl0uc2V0VmFsdWUoY3VycmVuY3lDb2RlKTtcclxuICAvLyAgIHRoaXMuc2hvd0N1cnJlbmN5ID0gZmFsc2U7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXRTZWxlY3RlZEN1cnJlbmN5RGlzcGxheSgpOiBzdHJpbmcge1xyXG4gIC8vICAgY29uc3QgY3VycmVuY3kgPSB0aGlzLmZvcm0uY29udHJvbHNbXCJyZWNlaXZlQ3VycmVuY3lcIl0udmFsdWU7XHJcbiAgLy8gICBpZiAoY3VycmVuY3kgJiYgdGhpcy5wYXJhbXM/LmN1cnJlbmNpZXMpIHtcclxuICAvLyAgICAgcmV0dXJuIHRoaXMucGFyYW1zLmN1cnJlbmNpZXNbdGhpcy5wYXJhbXMuY3VycmVuY2llcy5maW5kSW5kZXgoYyA9PiBjLmN1cnJlbmN5Q29kZSA9PSBjdXJyZW5jeSldLmN1cnJlbmN5O1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW1wicmVjZWl2ZUN1cnJlbmN5XCJdLnNldFZhbHVlKFwiQWxsXCIpO1xyXG4gIC8vICAgICByZXR1cm4gXCJBbGxcIjtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vUHJvZHVjdCBEcm9wZG93blxyXG4gIC8vIHRvZ2dsZVByb2R1Y3REcm9wZG93bigpIHtcclxuICAvLyAgIHRoaXMuc2hvd1Byb2R1Y3QgPSAhdGhpcy5zaG93UHJvZHVjdDtcclxuICAvLyB9XHJcbiAgLy8gc2VsZWN0UHJvZHVjdChwcm9kdWN0Q29kZTogc3RyaW5nKSB7XHJcbiAgLy8gICB0aGlzLmZvcm0uY29udHJvbHNbXCJwcm9kdWN0XCJdLnNldFZhbHVlKHByb2R1Y3RDb2RlKTtcclxuICAvLyAgIHRoaXMuc2hvd1Byb2R1Y3QgPSBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldFNlbGVjdGVkUHJvZHVjdERpc3BsYXkoKTogc3RyaW5nIHtcclxuICAvLyAgIGNvbnN0IHByb2R1Y3QgPSB0aGlzLmZvcm0uY29udHJvbHNbXCJwcm9kdWN0XCJdLnZhbHVlO1xyXG4gIC8vICAgaWYgKHByb2R1Y3QgJiYgdGhpcy5wYXJhbXM/LnRyYW5zYWN0aW9uUHJvZHVjdFR5cGVzKSB7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLnBhcmFtcy50cmFuc2FjdGlvblByb2R1Y3RUeXBlc1t0aGlzLnBhcmFtcy50cmFuc2FjdGlvblByb2R1Y3RUeXBlcy5maW5kSW5kZXgocCA9PiBwLnByb2R1Y3RDb2RlID09IHByb2R1Y3QpXS5uYW1lO1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW1wicHJvZHVjdFwiXS5zZXRWYWx1ZShcIkFsbFwiKTtcclxuICAvLyAgICAgcmV0dXJuIFwiQWxsXCI7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvL1NlbmRDb3VudHJ5IERyb3Bkb3duXHJcbiAgLy8gdG9nZ2xlU2VuZENvdW50cnlEcm9wZG93bigpIHtcclxuICAvLyAgIHRoaXMuc2hvd1NlbmRDb3VudHJ5ID0gIXRoaXMuc2hvd1NlbmRDb3VudHJ5O1xyXG4gIC8vIH1cclxuICAvLyBzZWxlY3RTZW5kQ291bnRyeShjb3VudHJ5Q29kZTogYW55KSB7XHJcbiAgLy8gICB0aGlzLmZvcm0uY29udHJvbHNbXCJzZW5kQ291bnRyeVwiXS5zZXRWYWx1ZShjb3VudHJ5Q29kZSk7XHJcbiAgLy8gICB0aGlzLnNob3dTZW5kQ291bnRyeSA9IGZhbHNlO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0U2VsZWN0ZWRTZW5kQ291bnRyeURpc3BsYXkoKTogc3RyaW5nIHtcclxuICAvLyAgIGNvbnN0IGNvdW50cnkgPSB0aGlzLmZvcm0uY29udHJvbHNbXCJzZW5kQ291bnRyeVwiXS52YWx1ZTtcclxuICAvLyAgIGlmIChjb3VudHJ5ICYmIHRoaXMucGFyYW1zPy5jb3VudHJpZXMpIHtcclxuICAvLyAgICAgcmV0dXJuIHRoaXMucGFyYW1zLmNvdW50cmllc1t0aGlzLnBhcmFtcy5jb3VudHJpZXMuZmluZEluZGV4KGMgPT4gYy5jb3VudHJ5Q29kZSA9PSBjb3VudHJ5KV0uY291bnRyeTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuZm9ybS5jb250cm9sc1tcInNlbmRDb3VudHJ5XCJdLnNldFZhbHVlKFwiQWxsXCIpO1xyXG4gIC8vICAgICByZXR1cm4gXCJBbGxcIjtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vUmVjZWl2ZUNvdW50cnkgRHJvcGRvd25cclxuICAvLyB0b2dnbGVSZWNlaXZlQ291bnRyeSgpIHtcclxuICAvLyAgIHRoaXMuc2hvd1JlY2VpdmVDb3VudHJ5ID0gIXRoaXMuc2hvd1JlY2VpdmVDb3VudHJ5O1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2VsZWN0UmVjZWl2ZUNvdW50cnkoY291bnRyeUNvZGU6IHN0cmluZykge1xyXG4gIC8vICAgdGhpcy5mb3JtLmNvbnRyb2xzW1wicmVjZWl2ZUNvdW50cnlcIl0uc2V0VmFsdWUoY291bnRyeUNvZGUpO1xyXG4gIC8vICAgdGhpcy5zaG93UmVjZWl2ZUNvdW50cnkgPSBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldFNlbGVjdGVkUmVjZWl2ZUNvdW50cnlEaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgLy8gICBjb25zdCBjb3VudHJ5ID0gdGhpcy5mb3JtLmNvbnRyb2xzW1wicmVjZWl2ZUNvdW50cnlcIl0udmFsdWU7XHJcbiAgLy8gICBpZiAoY291bnRyeSAmJiB0aGlzLnBhcmFtcz8uY291bnRyaWVzKSB7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLnBhcmFtcy5jb3VudHJpZXNbdGhpcy5wYXJhbXMuY291bnRyaWVzLmZpbmRJbmRleChjID0+IGMuY291bnRyeUNvZGUgPT0gY291bnRyeSldLmNvdW50cnk7XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLmZvcm0uY29udHJvbHNbXCJyZWNlaXZlQ291bnRyeVwiXS5zZXRWYWx1ZShcIkFsbFwiKTtcclxuICAvLyAgICAgcmV0dXJuIFwiQWxsXCI7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvL0NsaWVudHMgRHJvcGRvd25cclxuICAvLyB0b2dnbGVDbGllbnRzKCkge1xyXG4gIC8vICAgdGhpcy5zaG93Q2xpZW50cyA9ICF0aGlzLnNob3dDbGllbnRzO1xyXG4gIC8vIH1cclxuXHJcbiAgc2VsZWN0Q2xpZW50KGNsaWVudDogYW55KSB7XHJcbiAgICB0aGlzLmZvcm0uY29udHJvbHNbXCJjbGllbnRcIl0uc2V0VmFsdWUoY2xpZW50KTtcclxuICAgIHRoaXMuZm9ybS5jb250cm9sc1tcImJyYW5jaFwiXS5zZXRWYWx1ZShudWxsKTtcclxuICAgIHRoaXMub25BZ2VudFNlbGVjdGVkKGNsaWVudCk7XHJcbiAgICB0aGlzLnNob3dDbGllbnRzID0gZmFsc2U7XHJcbiAgICB0aGlzLmNsaWVudFNlbGVjdGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIGdldFNlbGVjdGVkQ2xpZW50KCk6IHN0cmluZyB7XHJcbiAgLy8gICBsZXQgY2xpZW50ID0gdGhpcy5mb3JtLmNvbnRyb2xzW1wiY2xpZW50XCJdLnZhbHVlO1xyXG4gIC8vICAgLy8gaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvc3NpbHVzZXJuYW1lJykpIHtcclxuXHJcbiAgLy8gICAvLyB9IGVsc2Uge1xyXG4gIC8vICAgLy8gICBpZighY2xpZW50ICYmIHRoaXMuY2xpZW50cyl7XHJcbiAgLy8gICAvLyAgICAgdGhpcy5zZWxlY3RDbGllbnQodGhpcy5jbGllbnRzWzBdLmNvZGUpO1xyXG4gIC8vICAgLy8gICB9XHJcbiAgLy8gICAvLyB9XHJcbiAgLy8gICBpZiAoY2xpZW50KSB7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLmNsaWVudHNbdGhpcy5jbGllbnRzLmZpbmRJbmRleChjID0+IGMuY29kZSA9PSBjbGllbnQpXS5hZ2VudDtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHJldHVybiBcIlNlbGVjdCBDbGllbnRcIjtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vQnJhbmNoIERyb3Bkb3duXHJcbiAgLy8gdG9nZ2xlQnJhbmNoKCkge1xyXG4gIC8vICAgdGhpcy5zaG93QnJhbmNoID0gIXRoaXMuc2hvd0JyYW5jaDtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNlbGVjdEJyYW5jaChicmFuY2hDb2RlOiBhbnkpIHtcclxuICAvLyAgIHRoaXMuZm9ybS5jb250cm9sc1tcImJyYW5jaFwiXS5zZXRWYWx1ZShicmFuY2hDb2RlKTtcclxuICAvLyAgIHRoaXMuc2hvd0JyYW5jaCA9IGZhbHNlO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0U2VsZWN0ZWRCcmFuY2goKTogc3RyaW5nIHtcclxuICAvLyAgIGNvbnN0IGJyYW5jaCA9IHRoaXMuZm9ybS5jb250cm9sc1tcImJyYW5jaFwiXS52YWx1ZTtcclxuICAvLyAgIGlmIChicmFuY2ggJiYgdGhpcy5jbGllbnRCcmFuY2hlcykge1xyXG4gIC8vICAgICByZXR1cm4gdGhpcy5jbGllbnRCcmFuY2hlc1t0aGlzLmNsaWVudEJyYW5jaGVzLmZpbmRJbmRleChiID0+IGIuYnJhbmNoQ29kZSA9PSBicmFuY2gpXS5idXNpbmVzc1BhcnRuZXJCcmFuY2g7XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICByZXR1cm4gXCJTZWxlY3QgQnJhbmNoXCI7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvL1N0YXR1cyBEcm9wZG93blxyXG4gIC8vIHRvZ2dsZVN0YXR1c0Ryb3Bkb3duKCkge1xyXG4gIC8vICAgdGhpcy5zaG93U3RhdHVzRHJvcGRvd24gPSAhdGhpcy5zaG93U3RhdHVzRHJvcGRvd247XHJcbiAgLy8gfVxyXG5cclxuICAvLyBjbGVhckVycm9yKCkge1xyXG4gIC8vICAgdGhpcy5zaG93RXJyb3IgPSBmYWxzZTtcclxuICAvLyB9XHJcbiAgLy8gY2xlYXJNZXNzYWdlKCkge1xyXG4gIC8vICAgdGhpcy5zaG93TWVzc2FnZSA9IGZhbHNlO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZGF0ZUNoYW5nZSh0eXBlOiBzdHJpbmcpIHtcclxuICAvLyAgIGlmICh0eXBlID09PSBcImZyb21EYXRlXCIpIHtcclxuICAvLyAgICAgdGhpcy5kaXNhYmxlVG9EYXRlID0gdHJ1ZTtcclxuICAvLyAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW1wiZnJvbURhdGVcIl0uZW5hYmxlKCk7XHJcbiAgLy8gICAgIC8vIHRoaXMuZm9ybS5jb250cm9sc1tcImZyb21EYXRlXCJdLnNldFZhbHVlKHRoaXMuZm9ybWF0RGF0ZSh0aGlzLmZvcm0uY29udHJvbHNbXCJmcm9tRGF0ZVwiXS52YWx1ZSkpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKHR5cGUgPT09IFwidG9EYXRlXCIpIHtcclxuICAvLyAgICAgLy8gdGhpcy5mb3JtLmNvbnRyb2xzW1widG9EYXRlXCJdLnNldFZhbHVlKHRoaXMuZm9ybWF0RGF0ZSh0aGlzLmZvcm0uY29udHJvbHNbXCJ0b0RhdGVcIl0udmFsdWUpKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXREYXRlKHBhcmFtczogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBmb3JtYXREYXRlKG5ldyBEYXRlKHBhcmFtcy52YWx1ZSksICdkZC9NTS95eXl5JywgJ2VuLVVTJyk7XHJcbiAgfVxyXG5cclxuICBhY3RpdmF0ZUJyYW5jaFBhZ2luYXRpb24oYnJhbmNoSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5hY3RpdmVCcmFuY2ggPSBicmFuY2hJbmRleDtcclxuICAgIHRoaXMuc2hvd1JhbmdlID0gIXRoaXMuc2hvd1JhbmdlO1xyXG4gIH1cclxuXHJcbiAgY3VycmVuY3lGb3JtYXR0ZXIocGFyYW1zOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKHBhcmFtcy52YWx1ZSA9PSBudWxsIHx8IHBhcmFtcy52YWx1ZSA9PT0gJycpIHJldHVybiAnJztcclxuICAgIGNvbnN0IG51bWJlciA9IHBhcnNlRmxvYXQocGFyYW1zLnZhbHVlKTtcclxuICAgIGlmIChpc05hTihudW1iZXIpKSByZXR1cm4gcGFyYW1zLnZhbHVlO1xyXG4gICAgcmV0dXJuIG51bWJlci50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7XHJcbiAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMyxcclxuICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAzXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vRGF0ZSBQaWNsZXJcclxuICAvLyBvbkRhdGVDaGFuZ2VGcm9tRGF0ZShldmVudDogRXZlbnQpIHtcclxuICAvLyAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgLy8gICBjb25zdCBzZWxlY3RlZERhdGUgPSBpbnB1dC52YWx1ZTtcclxuICAvLyAgIHRoaXMuZm9ybS5jb250cm9sc1tcImZyb21EYXRlXCJdLnNldFZhbHVlKGZvcm1hdERhdGUobmV3IERhdGUoc2VsZWN0ZWREYXRlKSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBvbkRhdGVDaGFuZ2VUb0RhdGUoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgLy8gICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIC8vICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gaW5wdXQudmFsdWU7XHJcbiAgLy8gICB0aGlzLmZvcm0uY29udHJvbHNbXCJ0b0RhdGVcIl0uc2V0VmFsdWUoZm9ybWF0RGF0ZShuZXcgRGF0ZShzZWxlY3RlZERhdGUpLCAnZGQvTU0veXl5eScsICdlbi1VUycpKTtcclxuICAvLyB9XHJcblxyXG4gIC8vIG9uRW50ZXJLZXkoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgLy8gICBjb25zdCBrZXlib2FyZEV2ZW50ID0gZXZlbnQgYXMgS2V5Ym9hcmRFdmVudDtcclxuICAvLyAgIGtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgLy8gICBpZiAoa2V5Ym9hcmRFdmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gIC8vICAgICBrZXlib2FyZEV2ZW50LnRhcmdldC5ibHVyKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBmcm9tRGF0ZUNoYW5nZSgpIHtcclxuICAvLyAgIGNvbnN0IG1zUGVyRGF5ID0gMTAwMCAqIDYwICogNjAgKiAyNDtcclxuICAvLyAgIGNvbnN0IGZkID0gdGhpcy5mb3JtLmNvbnRyb2xzW1wiZnJvbURhdGVcIl0udmFsdWU7XHJcbiAgLy8gICBjb25zdCB0ZCA9IHRoaXMuZm9ybS5jb250cm9sc1tcInRvRGF0ZVwiXS52YWx1ZTtcclxuICAvLyAgIGNvbnN0IGZyb20gPSBuZXcgRGF0ZShmZCk7XHJcbiAgLy8gICBjb25zdCB0byA9IG5ldyBEYXRlKHRkKTtcclxuICAvLyAgIGNvbnN0IGRpZmZlcmVuY2VJbkRheXMgPSBNYXRoLmZsb29yKCh0bz8uZ2V0VGltZSgpIC0gZnJvbT8uZ2V0VGltZSgpKSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XHJcbiAgLy8gICBpZiAoZGlmZmVyZW5jZUluRGF5cyA+IDMxKSB7XHJcbiAgLy8gICAgIC8vIFNldCB0b0RhdGUgdG8gZnJvbURhdGUgKyAzMSBkYXlzXHJcbiAgLy8gICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShmcm9tLmdldFRpbWUoKSArIDMxICogbXNQZXJEYXkpO1xyXG4gIC8vICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ3RvRGF0ZSddPy5wYXRjaFZhbHVlKGQpO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyB9XHJcblxyXG4gIC8vIHRvRGF0ZUNoYW5nZSgpIHtcclxuICAvLyAgIGNvbnN0IG1zUGVyRGF5ID0gMTAwMCAqIDYwICogNjAgKiAyNDtcclxuICAvLyAgIGNvbnN0IGZkID0gdGhpcy5mb3JtLmNvbnRyb2xzW1wiZnJvbURhdGVcIl0udmFsdWU7XHJcbiAgLy8gICBjb25zdCB0ZCA9IHRoaXMuZm9ybS5jb250cm9sc1tcInRvRGF0ZVwiXS52YWx1ZTtcclxuICAvLyAgIGNvbnN0IGZyb20gPSBuZXcgRGF0ZShmZCk7XHJcbiAgLy8gICBjb25zdCB0byA9IG5ldyBEYXRlKHRkKTtcclxuICAvLyAgIGNvbnN0IGRpZmZlcmVuY2VJbkRheXMgPSBNYXRoLmZsb29yKCh0bz8uZ2V0VGltZSgpIC0gZnJvbT8uZ2V0VGltZSgpKSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XHJcbiAgLy8gICBpZiAoZGlmZmVyZW5jZUluRGF5cyA+IDMxKSB7XHJcbiAgLy8gICAgIC8vIFNldCB0b0RhdGUgdG8gZnJvbURhdGUgKyAzMSBkYXlzXHJcbiAgLy8gICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShmcm9tLmdldFRpbWUoKSArIDMxICogbXNQZXJEYXkpXHJcbiAgLy8gICAgIHRoaXMuZm9ybS5jb250cm9sc1snZnJvbURhdGUnXT8ucGF0Y2hWYWx1ZShkKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9EYXRlQ2hhbmdlcygpOiB2b2lkIHtcclxuICB0aGlzLmZvcm0uZ2V0KCdmcm9tRGF0ZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGZyb21EYXRlU3RyID0+IHtcclxuICAgIGNvbnN0IHRvRGF0ZUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KCd0b0RhdGUnKTtcclxuICAgIGNvbnN0IHRvRGF0ZVN0ciA9IHRvRGF0ZUNvbnRyb2w/LnZhbHVlO1xyXG4gICAgaWYgKCFmcm9tRGF0ZVN0ciB8fCAhdG9EYXRlU3RyKSByZXR1cm47XHJcbiAgICBjb25zdCBmcm9tRGF0ZSA9IG5ldyBEYXRlKGZyb21EYXRlU3RyKTtcclxuICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKHRvRGF0ZVN0cik7XHJcbiBcclxuICAgIGNvbnN0IG1heFRvRGF0ZSA9IG5ldyBEYXRlKGZyb21EYXRlKTtcclxuICAgIG1heFRvRGF0ZT8uc2V0RGF0ZShmcm9tRGF0ZS5nZXREYXRlKCkgKyAzMSk7XHJcbiAgICBpZiAodG9EYXRlID4gbWF4VG9EYXRlKSB7XHJcbiAgICAgIHRvRGF0ZUNvbnRyb2w/LnBhdGNoVmFsdWUobWF4VG9EYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdKTtcclxuICAgIH1cclxuICB9KTtcclxuIFxyXG4gIHRoaXMuZm9ybS5nZXQoJ3RvRGF0ZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHRvRGF0ZVN0ciA9PiB7XHJcbiAgICBjb25zdCBmcm9tRGF0ZUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KCdmcm9tRGF0ZScpO1xyXG4gICAgY29uc3QgZnJvbURhdGVTdHIgPSBmcm9tRGF0ZUNvbnRyb2w/LnZhbHVlO1xyXG4gICAgaWYgKCF0b0RhdGVTdHIgfHwgIWZyb21EYXRlU3RyKSByZXR1cm47XHJcbiAgICBjb25zdCB0b0RhdGUgPSBuZXcgRGF0ZSh0b0RhdGVTdHIpO1xyXG4gICAgY29uc3QgZnJvbURhdGUgPSBuZXcgRGF0ZShmcm9tRGF0ZVN0cik7XHJcbiBcclxuICAgIGNvbnN0IG1pbkZyb21EYXRlID0gbmV3IERhdGUodG9EYXRlKTtcclxuICAgIG1pbkZyb21EYXRlPy5zZXREYXRlKHRvRGF0ZS5nZXREYXRlKCkgLSAzMSk7XHJcbiAgICBpZiAoZnJvbURhdGUgPCBtaW5Gcm9tRGF0ZSkge1xyXG4gICAgICBmcm9tRGF0ZUNvbnRyb2w/LnBhdGNoVmFsdWUobWluRnJvbURhdGUudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5wcml2YXRlIHN1YnNjcmliZVRvQ2xpZW50Q2hhbmdlKCk6IHZvaWQge1xyXG4gIHRoaXMuZm9ybS5nZXQoJ2NsaWVudCcpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbCA9PiB7XHJcbiAgICBpZih2YWwgPT09IG51bGwpe1xyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ2JyYW5jaCddLnBhdGNoVmFsdWUobnVsbCk7XHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuLy8gc2VhcmNoQ2xpZW50KGV2ZW50OkV2ZW50KXtcclxuLy8gICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuLy8gICBsZXQgc2VhcmNoVGV4dCA9IHRhcmdldC52YWx1ZS50cmltKCk7XHJcbi8vICAgaWYoc2VhcmNoVGV4dC5sZW5ndGg9PTApe1xyXG4vLyAgICAgdGhpcy5jbGllbnRzID0gWy4uLnRoaXMuY2xpZW50c0RhdGFdO1xyXG4vLyAgIH1cclxuLy8gICB0aGlzLmNsaWVudHMgPSB0aGlzLmNsaWVudHNEYXRhLmZpbHRlcigoY2xpZW50KT0+e1xyXG4vLyAgICAgICBjbGllbnQ/LmFnZW50Py5pbmNsdWRlcyhzZWFyY2hUZXh0KTtcclxuLy8gICB9KVxyXG4vLyB9XHJcblxyXG5vbkNsaWVudFNlbGVjdGVkKCl7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdjbGllbnQnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsKT0+e1xyXG4gICAgICB2YWwgPSB0aGlzLmZvcm0uZ2V0KCdjbGllbnQnKT8udmFsdWU7XHJcbiAgICAgIHRoaXMub25BZ2VudFNlbGVjdGVkKHZhbCk7XHJcbiAgICB9KVxyXG4gICAgICBcclxuICB9XHJcblxyXG59XHJcblxyXG4iLCI8c2VjdGlvbj5cclxuICA8ZGl2IGNsYXNzPVwiQnJlYWRjcnVtYlwiPlxyXG4gICAgPGgxPlJlcG9ydHM8L2gxPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJCcmVhZENydW1iQXJyb3dcIj48L3NwYW4+XHJcbiAgICA8aDIgY2xhc3M9XCJCcmVhZENydW1iQWN0aXZlXCI+QnJhbmNoIEFjdGl2aXR5IFNlbmQ8L2gyPlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48c2VjdGlvbiBpZD1cInJlcXVlc3QtcGFyYW1zXCI+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIj5cclxuICAgIDx0YWJsZT5cclxuICAgICAgPHRib2R5PlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzNiU7Ym9yZGVyLXRvcDogMDtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgcm93LWNsc1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtZGF0YVwiIGZvcj1cImNsaWVudFwiPkNsaWVudDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMCBpbnB1dGJveFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNsaWVudHNcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwiY2xpZW50c1wiIGJpbmRMYWJlbD1cImFnZW50XCIgYmluZFZhbHVlPVwiY29kZVwiIGZvcm1Db250cm9sTmFtZT1cImNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCItIFBsZWFzZSBzZWxlY3QgLVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1vcHRpb24tdG1wIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT1cInt7IGl0ZW0uYWdlbnQgfX1cIiBjbGFzcz1cIm5nLW9wdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uYWdlbnQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIDxuZy1zZWxlY3QgcGxhY2Vob2xkZXI9XCItIFBsZWFzZSBzZWxlY3QgLVwiIGZvcm1Db250cm9sTmFtZT1cImNsaWVudFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1vcHRpb24gKm5nRm9yPVwibGV0IGNsaWVudCBvZiBjbGllbnRzXCIgW3ZhbHVlXT1cImNsaWVudC5jb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjbGllbnQuYWdlbnQgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nLW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAyOCU7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHJvdy1jbHNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIGNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1kYXRhXCI+RnJvbTxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPiBEYXRlPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwIGlucHV0Ym94XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGRwaWNrZXJcIiBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIiBuZ2JEYXRlcGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgI2Zyb21EYXRlSW5wdXQ9XCJuZ2JEYXRlcGlja2VyXCIgbmFtZT1cImZyb21EYXRlXCIgaWQ9XCJmcm9tRGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cImZyb21EYXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbnB1dC1ncm91cC1idXR0b24gY2FsXCIgKGNsaWNrKT1cImZyb21EYXRlSW5wdXQudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgaWQ9XCJmcm9tZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIHR5cGU9XCJkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZnJvbURhdGVcIj4gLS0+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAyOCU7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHJvdy1jbHNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWRhdGFcIj5UbzxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPiBEYXRlPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwIGlucHV0Ym94XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBpZD1cInRvZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIHR5cGU9XCJkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwidG9EYXRlXCI+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBkcGlja2VyXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICN0b0RhdGVJbnB1dD1cIm5nYkRhdGVwaWNrZXJcIiBuYW1lPVwidG9EYXRlXCIgaWQ9XCJ0b0RhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJ0b0RhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ1dHRvbiBjYWxcIiAoY2xpY2spPVwidG9EYXRlSW5wdXQudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogOCU7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1yZXBvcnRcIiAoY2xpY2spPVwib25TdWJtaXQoKVwiPlZpZXc8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgICAgPHRyPlxyXG4gICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciByb3ctY2xzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtZGF0YVwiIGZvcj1cImJyYW5jaFwiPkJyYW5jaDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMCBpbnB1dGJveFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNsaWVudEJyYW5jaGVzXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImNsaWVudEJyYW5jaGVzXCIgYmluZExhYmVsPVwiYnVzaW5lc3NQYXJ0bmVyQnJhbmNoXCIgYmluZFZhbHVlPVwiYnJhbmNoQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmNoXCIgcGxhY2Vob2xkZXI9XCItIFBsZWFzZSBzZWxlY3QgLVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1vcHRpb24tdG1wIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT1cInt7IGl0ZW0uYnVzaW5lc3NQYXJ0bmVyQnJhbmNoIH19XCIgY2xhc3M9XCJuZy1vcHRpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmJ1c2luZXNzUGFydG5lckJyYW5jaCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciByb3ctY2xzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtZGF0YVwiPiBTZW5kPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+IENvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTAgaW5wdXRib3hcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXJhbXNcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwicGFyYW1zLmNvdW50cmllc1wiIGJpbmRMYWJlbD1cImNvdW50cnlcIiBiaW5kVmFsdWU9XCJjb3VudHJ5Q29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VuZENvdW50cnlcIiBwbGFjZWhvbGRlcj1cIi0gUGxlYXNlIHNlbGVjdCAtXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPVwie3sgaXRlbS5jb3VudHJ5IH19XCIgY2xhc3M9XCJuZy1vcHRpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmNvdW50cnkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIDxuZy1zZWxlY3QgcGxhY2Vob2xkZXI9XCItIFBsZWFzZSBzZWxlY3QgLVwiIGZvcm1Db250cm9sTmFtZT1cInNlbmRDb3VudHJ5XCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLW9wdGlvbiAqbmdGb3I9XCJsZXQgY291bnRyeSBvZiBwYXJhbXMuY291bnRyaWVzXCIgW3ZhbHVlXT1cImNvdW50cnkuY291bnRyeUNvZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGNvdW50cnkuY291bnRyeSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD4gLS0+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciByb3ctY2xzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtZGF0YVwiIGZvcj1cInJlY2VpdmVDb3VudHJ5XCI+IFJlY2VpdmU8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgQ291bnRyeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMCBpbnB1dGJveFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcmFtc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJwYXJhbXMuY291bnRyaWVzXCIgYmluZExhYmVsPVwiY291bnRyeVwiIGJpbmRWYWx1ZT1cImNvdW50cnlDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWNlaXZlQ291bnRyeVwiIHBsYWNlaG9sZGVyPVwiLSBQbGVhc2Ugc2VsZWN0IC1cIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9XCJ7eyBpdGVtLmNvdW50cnkgfX1cIiBjbGFzcz1cIm5nLW9wdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uY291bnRyeSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLXNlbGVjdCBwbGFjZWhvbGRlcj1cIi0gUGxlYXNlIHNlbGVjdCAtXCIgZm9ybUNvbnRyb2xOYW1lPVwicmVjZWl2ZUNvdW50cnlcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctb3B0aW9uICpuZ0Zvcj1cImxldCBjb3VudHJ5IG9mIHBhcmFtcy5jb3VudHJpZXNcIiBbdmFsdWVdPVwiY291bnRyeS5jb3VudHJ5Q29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgY291bnRyeS5jb3VudHJ5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PiAtLT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHJvdy1jbHNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1kYXRhXCIgZm9yPVwidHJhbnNhY3Rpb25TdGF0dXNcIj5UcmFuc2FjdGlvbiBTdGF0dXMgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTAgaW5wdXRib3hcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXJhbXNcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwicGFyYW1zLnRyYW5zYWN0aW9uU3RhdHVzVHlwZXNcIiBbbXVsdGlwbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHJhbnNhY3Rpb25TdGF0dXNcIiBiaW5kTGFiZWw9XCJ0cmFuc2FjdGlvblN0YXR1c1wiIGJpbmRWYWx1ZT1cInRyYW5zYWN0aW9uU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBpdGVtc1wiIFtjbG9zZU9uU2VsZWN0XT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWl0ZW0kPVwiaXRlbSRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpdGVtJC5zZWxlY3RlZFwiIC8+IHt7IGl0ZW0udHJhbnNhY3Rpb25TdGF0dXMgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHJvdy1jbHNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1kYXRhXCIgZm9yPVwicHJvZHVjdFwiPlByb2R1Y3Q8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTAgaW5wdXRib3hcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tZHJvcGRvd24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXJhbXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJwYXJhbXMudHJhbnNhY3Rpb25Qcm9kdWN0VHlwZXNcIiBiaW5kTGFiZWw9XCJuYW1lXCIgYmluZFZhbHVlPVwicHJvZHVjdENvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdFwiIHBsYWNlaG9sZGVyPVwiLSBQbGVhc2Ugc2VsZWN0IC1cIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1vcHRpb24tdG1wIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPVwie3sgaXRlbS5uYW1lIH19XCIgY2xhc3M9XCJuZy1vcHRpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctc2VsZWN0IHBsYWNlaG9sZGVyPVwiLSBQbGVhc2Ugc2VsZWN0IC1cIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0XCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctb3B0aW9uICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIHBhcmFtcy50cmFuc2FjdGlvblByb2R1Y3RUeXBlc1wiIFt2YWx1ZV09XCJwcm9kdWN0LnByb2R1Y3RDb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHByb2R1Y3QubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHJvdy1jbHNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1kYXRhXCIgZm9yPVwicmVjZWl2ZUN1cnJlbmN5XCI+UmVjZWl2ZTxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICBDdXJyZW5jeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMCBpbnB1dGJveFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcmFtc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJwYXJhbXMuY3VycmVuY2llc1wiIGJpbmRMYWJlbD1cImN1cnJlbmN5XCIgYmluZFZhbHVlPVwiY3VycmVuY3lDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWNlaXZlQ3VycmVuY3lcIiBwbGFjZWhvbGRlcj1cIi0gUGxlYXNlIHNlbGVjdCAtXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPVwie3sgaXRlbS5jdXJyZW5jeSB9fVwiIGNsYXNzPVwibmctb3B0aW9uLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5jdXJyZW5jeSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLXNlbGVjdCBwbGFjZWhvbGRlcj1cIi0gUGxlYXNlIHNlbGVjdCAtXCIgZm9ybUNvbnRyb2xOYW1lPVwicmVjZWl2ZUN1cnJlbmN5XCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLW9wdGlvbiAqbmdGb3I9XCJsZXQgY3VycmVuY3kgb2YgcGFyYW1zLmN1cnJlbmNpZXNcIiBbdmFsdWVdPVwiY3VycmVuY3kuY3VycmVuY3lDb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW5jeS5jdXJyZW5jeSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD4gLS0+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGJvZHk+XHJcbiAgICA8L3RhYmxlPlxyXG4gIDwvZm9ybT5cclxuPC9zZWN0aW9uPlxyXG5cclxuXHJcblxyXG48YXBwLWxvYWRlciBjbGFzcz1cIlwiICpuZ0lmPVwibG9hZGluZ1N0YXRlID09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG5cclxuPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBtdC0zIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNob3dFcnJvclwiPlxyXG4gIDxzcGFuPnt7IGVycm9yTWVzc2FnZSB9fTwvc3Bhbj5cclxuPC9kaXY+XHJcblxyXG48c2VjdGlvbiAqbmdJZj1cInNob3dSZXBvcnRcIiBjbGFzcz1cIm15LTJcIj5cclxuICA8ZGl2IGNsYXNzPVwidGl0bGUgbWItM1wiPlxyXG4gICAgQnJhbmNoIEFjdGl2aXR5IFNlbmRcclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwibWItMiBmbGV4LWNvbnRhaW5lclwiPlxyXG4gICAgPHRib2R5PlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibGFibCBtZXRhLXRkXCI+UmVwb3J0IFVzZXI6PC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJweC0zIG1ldGEtdGRcIj48c3BhbiBjbGFzcz1cImluZm9cIj57e3VzZXJ9fTwvc3Bhbj48L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibGFibCBtZXRhLXRkXCI+UmVwb3J0IFRpbWU6PC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJweC0zIG1ldGEtdGRcIj48c3BhbiBjbGFzcz1cImluZm9cIj57eyByZXBvcnREYXRlIH19PC9zcGFuPjwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L3Rib2R5PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIEluZm8gTWVzc2FnZSAtLT5cclxuICA8IS0tIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgbXQtMyBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICpuZ0lmPVwic2hvd01lc3NhZ2VcIj5cclxuICAgIDxzcGFuPjxzdHJvbmc+TWVzc2FnZTo8L3N0cm9uZz4ge3sgbWVzc2FnZSB9fTwvc3Bhbj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgKGNsaWNrKT1cImNsZWFyTWVzc2FnZSgpXCI+PC9idXR0b24+XHJcbjwvZGl2PiAtLT5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImFkZGVkLWZ1bmN0aW9uc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNlYXJjaEJveFwiPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIiBuYW1lPVwic2VhcmNoVGV4dFwiIGNsYXNzPVwic2VhcmNoLWlucHV0XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2goKVwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIHNlYXJjaC1idG5cIiAoY2xpY2spPVwib25TZWFyY2goKVwiPlxyXG4gICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ltYWdlcy9TZWFyY2guc3ZnXCIgYWx0PVwiU2VhcmNoXCIgY2xhc3M9XCJzZWFyY2gtaWNvblwiIC8+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImV4cG9ydC1vcHRpb25zXCI+XHJcbiAgICAgIDxuZy1zZWxlY3QgcGxhY2Vob2xkZXI9XCItIFBsZWFzZSBzZWxlY3QgLVwiIGNsYXNzPVwiZXhwb3J0LXNlbGVjdG9yXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEV4cG9ydE9wdGlvblwiXHJcbiAgICAgICAgW2NsZWFyYWJsZV09XCJmYWxzZVwiIHJlcXVpcmVkPlxyXG4gICAgICAgIDxuZy1vcHRpb24gKm5nRm9yPVwibGV0IGZvcm1hdCBvZiBleHBvcnRGb3JtYXRzXCIgW3ZhbHVlXT1cImZvcm1hdC5jb2RlXCI+XHJcbiAgICAgICAgICB7eyBmb3JtYXQuZm9ybWF0TmFtZSB9fVxyXG4gICAgICAgIDwvbmctb3B0aW9uPlxyXG4gICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgPCEtLSA8c2VsZWN0IGNsYXNzPVwib3B0LWNsc1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFeHBvcnRPcHRpb25cIj5cclxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXhjZWxcIiBzZWxlY3RlZD5FeGNlbDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJwZGZcIj5QREY8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3N2XCI+Q1NWPC9vcHRpb24+XHJcbiAgICAgIDwvc2VsZWN0PiAtLT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcmVwb3J0XCIgKGNsaWNrKT1cImhhbmRsZUV4cG9ydCgpXCI+RXhwb3J0PC9idXR0b24+XHJcbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImJ0bi1ib3hcIj5cclxuICAgICAgPC9kaXY+IC0tPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxuZ2ItYWNjb3JkaW9uICNhY2M9XCJuZ2JBY2NvcmRpb25cIiBbY2xvc2VPdGhlcnNdPVwiZmFsc2VcIiBbYWN0aXZlSWRzXT1cIidwYW5lbC0wJ1wiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZERhdGEgfCBrZXl2YWx1ZTsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICA8bmdiLXBhbmVsICpuZ0lmPVwiaXRlbS52YWx1ZS5sZW5ndGggPiAwXCIgW2lkXT1cIidwYW5lbC0nICsgaVwiPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbmdiUGFuZWxUaXRsZSBzdHlsZT1cImhlaWdodDogMTAlO1wiPlxyXG4gICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IDEuMjsgbWFyZ2luOiAwOyBwYWRkaW5nOiAycHggMDtjb2xvcjogIzBjNjNlNDtcIj57e1xyXG4gICAgICAgICAgICBpdGVtLmtleVxyXG4gICAgICAgICAgICB9fTwvbGFiZWw+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nYlBhbmVsQ29udGVudD5cclxuICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgY2xhc3M9XCJhZy10aGVtZS1hbHBpbmUgY29tcGFjdC1ncmlkIG15R3JpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7aGVpZ2h0OiAzNzBweDtcIlxyXG4gICAgICAgICAgICBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCIgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiIFtyb3dEYXRhXT1cIml0ZW0udmFsdWVcIiBbcm93SGVpZ2h0XT1cIjIwXCJcclxuICAgICAgICAgICAgW2hlYWRlckhlaWdodF09XCIyMlwiIFtncmlkT3B0aW9uc109XCJ7XHJcbiAgICAgICAgICAgICAgc3VwcHJlc3NIb3Jpem9udGFsU2Nyb2xsOiB0cnVlLFxyXG4gICAgICAgICAgICAgIHNjcm9sbGJhcldpZHRoOiAwXHJcbiAgICAgICAgICAgIH1cIiBbcGFnaW5hdGlvbl09XCJ0cnVlXCIgW3BhZ2luYXRpb25QYWdlU2l6ZV09XCJwYWdpbmF0aW9uQXJyYXlbaV1cIiAoZ3JpZFJlYWR5KT1cIm9uR3JpZFJlYWR5KCRldmVudClcIlxyXG4gICAgICAgICAgICAoZ3JpZFNpemVDaGFuZ2VkKT1cIm9uR3JpZFNpemVDaGFuZ2VkKCRldmVudClcIj5cclxuICAgICAgICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxyXG5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGduXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZ2luYXRpb24tbW9iaWxlIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZHJvcGRvd24gbmd4LXJhbmdlLWRyb3Bkb3duXCIgW2NsYXNzLm5neC1hY3RpdmVdPVwic2hvd1JhbmdlICYmIGFjdGl2ZUJyYW5jaCA9PSBpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyYW5nZXMuaW5kZXhPZihwYWdpbmF0aW9uQXJyYXlbaV0pICE9IC0xOyBlbHNlIHNob3dBbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuZ3gtYnRuIG5neC1yYW5nZS1kcm9wZG93bi1idXR0b25cIiAoY2xpY2spPVwiYWN0aXZhdGVCcmFuY2hQYWdpbmF0aW9uKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBwYWdpbmF0aW9uQXJyYXlbaV0gfX0gJm5ic3A7ICZuYnNwOzxpIGNsYXNzPVwibmd4LWljb24gbmd4LWljb24tYXJyb3ctZG93blwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93QWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtYnRuIG5neC1yYW5nZS1kcm9wZG93bi1idXR0b25cIiAoY2xpY2spPVwiYWN0aXZhdGVCcmFuY2hQYWdpbmF0aW9uKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFsbCAmbmJzcDsgJm5ic3A7PGkgY2xhc3M9XCJuZ3gtaWNvbiBuZ3gtaWNvbi1hcnJvdy1kb3duXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0aW9uLWxhYmVsXCI+RW50cmllcyBwZXIgcGFnZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJuZ3gtbWVudVwiICpuZ0lmPVwic2hvd1JhbmdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuZ3gtYy1oYW5kIG5neC1yYW5nZS1kcm9wZG93bi1idXR0b25cIiAqbmdGb3I9XCJsZXQgbGltaXQgb2YgcmFuZ2VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZUxpbWl0KGxpbWl0LGksaXRlbS5rZXkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGxpbWl0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8L25nYi1wYW5lbD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmdiLWFjY29yZGlvbj5cclxuICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBtdC0zXCIgKm5nSWY9XCJub0RhdGFGb3VuZFwiPlxyXG4gICAgTm8gRGF0YSBGb3VuZFxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+Il19
|