@sachin9822/reports-lib 0.0.213 → 0.0.215
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 +240 -0
- package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +614 -0
- package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +218 -0
- package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +263 -0
- package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +718 -0
- package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +275 -0
- package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +192 -0
- package/esm2020/lib/components/funding-report/funding-report.component.mjs +198 -0
- package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +244 -0
- package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +776 -0
- package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +282 -0
- package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +332 -0
- package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +631 -0
- package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +2 -0
- package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +2 -0
- package/esm2020/lib/models/app-config.model.mjs +2 -0
- package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +2 -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/cancellation-transaction-report/cancellation-transaction.model.mjs +10 -0
- package/esm2020/lib/models/component-loading-states.mjs +7 -0
- package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +5 -0
- package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +2 -0
- package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +2 -0
- package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +8 -0
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +6 -0
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +5 -0
- package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +3 -0
- package/esm2020/lib/reports-lib-routing.module.mjs +24 -0
- package/esm2020/lib/reports-lib.component.mjs +22 -0
- package/esm2020/lib/reports-lib.module.mjs +172 -0
- package/esm2020/lib/reports-lib.service.mjs +14 -0
- package/esm2020/lib/services/config.service.mjs +39 -0
- package/esm2020/lib/services/report.service.mjs +374 -0
- package/esm2020/lib/shared/export-generic.service.mjs +443 -0
- package/esm2020/lib/shared/export.service.mjs +379 -0
- package/esm2020/lib/shared/loader/loader.component.mjs +11 -0
- package/esm2020/lib/shared/metadata/metadata.component.mjs +51 -0
- package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +44 -0
- package/esm2020/lib/shared/search-filter/search-filter.component.mjs +2147 -0
- package/esm2020/lib/shared/shared.module.mjs +21 -0
- package/esm2020/public-api.mjs +41 -0
- package/esm2020/sachin9822-reports-lib.mjs +5 -0
- package/fesm2015/sachin9822-reports-lib.mjs +8649 -0
- package/fesm2015/sachin9822-reports-lib.mjs.map +1 -0
- package/fesm2020/sachin9822-reports-lib.mjs +8510 -0
- package/fesm2020/sachin9822-reports-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +70 -0
- package/lib/components/accounting-report/accounting-report.component.d.ts +76 -0
- package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +58 -0
- package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +69 -0
- package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +78 -0
- package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +108 -0
- package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +55 -0
- package/lib/components/funding-report/funding-report.component.d.ts +55 -0
- package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +57 -0
- package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +109 -0
- package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +76 -0
- package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +69 -0
- package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +71 -0
- package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +8 -0
- package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +18 -0
- package/lib/models/accounting-report/accounting-report-branch-group.d.ts +6 -0
- package/lib/models/accounting-report/accounting-report-entry-model.d.ts +24 -0
- package/lib/models/accounting-report/accounting-report-model.d.ts +6 -0
- package/{src/lib/models/accounting-report/accounting-report-sub-group.ts → lib/models/accounting-report/accounting-report-sub-group.d.ts} +2 -3
- package/{src/lib/models/app-config.model.ts → lib/models/app-config.model.d.ts} +7 -8
- package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +18 -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 +24 -0
- package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +44 -0
- package/lib/models/component-loading-states.d.ts +5 -0
- package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +26 -0
- package/{src/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.ts → lib/models/revenue-per-transaction-report/revenue-per-transaction.model.d.ts} +1 -1
- package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +18 -0
- package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +113 -0
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +13 -0
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +23 -0
- package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +38 -0
- package/lib/reports-lib-routing.module.d.ts +7 -0
- package/lib/reports-lib.component.d.ts +8 -0
- package/lib/reports-lib.module.d.ts +33 -0
- package/lib/reports-lib.service.d.ts +6 -0
- package/lib/services/config.service.d.ts +20 -0
- package/lib/services/report.service.d.ts +80 -0
- package/lib/shared/export-generic.service.d.ts +50 -0
- package/lib/shared/export.service.d.ts +32 -0
- package/lib/shared/loader/loader.component.d.ts +5 -0
- package/lib/shared/metadata/metadata.component.d.ts +24 -0
- package/lib/shared/page-size-selector/page-size-selector.component.d.ts +15 -0
- package/lib/shared/search-filter/search-filter.component.d.ts +127 -0
- package/lib/shared/shared.module.d.ts +11 -0
- package/package.json +31 -16
- package/{src/public-api.ts → public-api.d.ts} +7 -17
- package/karma.conf.js +0 -44
- package/ng-package.json +0 -17
- package/src/assets/images/BreadcrumbArrow.png +0 -0
- package/src/assets/images/XMCoral.png +0 -0
- package/src/lib/assets/images/Search.svg +0 -10
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +0 -27
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +0 -46
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +0 -23
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +0 -292
- package/src/lib/components/accounting-report/accounting-report.component.html +0 -64
- package/src/lib/components/accounting-report/accounting-report.component.scss +0 -24
- package/src/lib/components/accounting-report/accounting-report.component.spec.ts +0 -23
- package/src/lib/components/accounting-report/accounting-report.component.ts +0 -738
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +0 -46
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +0 -2
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +0 -23
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +0 -247
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +0 -46
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +0 -3
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +0 -23
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +0 -276
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +0 -51
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +0 -7
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +0 -23
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +0 -840
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +0 -68
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +0 -65
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +0 -23
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +0 -290
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +0 -25
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +0 -1
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +0 -23
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +0 -213
- package/src/lib/components/funding-report/funding-report.component.html +0 -49
- package/src/lib/components/funding-report/funding-report.component.scss +0 -1
- package/src/lib/components/funding-report/funding-report.component.spec.ts +0 -23
- package/src/lib/components/funding-report/funding-report.component.ts +0 -221
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +0 -26
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +0 -1
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +0 -23
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +0 -267
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +0 -95
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +0 -54
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +0 -23
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +0 -904
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +0 -49
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +0 -2
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +0 -32
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +0 -304
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +0 -46
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +0 -7
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +0 -343
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +0 -25
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +0 -23
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +0 -23
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +0 -745
- package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +0 -10
- package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +0 -20
- package/src/lib/models/accounting-report/accounting-report-branch-group.ts +0 -7
- package/src/lib/models/accounting-report/accounting-report-entry-model.ts +0 -25
- package/src/lib/models/accounting-report/accounting-report-model.ts +0 -7
- package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +0 -18
- package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +0 -16
- package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +0 -26
- package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +0 -65
- package/src/lib/models/component-loading-states.ts +0 -5
- package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +0 -28
- package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +0 -21
- package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +0 -127
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +0 -16
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +0 -29
- package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +0 -46
- package/src/lib/reports-lib-routing.module.ts +0 -20
- package/src/lib/reports-lib.component.spec.ts +0 -23
- package/src/lib/reports-lib.component.ts +0 -20
- package/src/lib/reports-lib.module.ts +0 -102
- package/src/lib/reports-lib.service.spec.ts +0 -16
- package/src/lib/reports-lib.service.ts +0 -9
- package/src/lib/services/config.service.ts +0 -43
- package/src/lib/services/report.service.spec.ts +0 -16
- package/src/lib/services/report.service.ts +0 -463
- package/src/lib/shared/export-generic.service.ts +0 -557
- package/src/lib/shared/export.service.spec.ts +0 -16
- package/src/lib/shared/export.service.ts +0 -457
- package/src/lib/shared/loader/loader.component.html +0 -8
- package/src/lib/shared/loader/loader.component.scss +0 -52
- package/src/lib/shared/loader/loader.component.ts +0 -10
- package/src/lib/shared/metadata/metadata.component.html +0 -42
- package/src/lib/shared/metadata/metadata.component.scss +0 -95
- package/src/lib/shared/metadata/metadata.component.spec.ts +0 -23
- package/src/lib/shared/metadata/metadata.component.ts +0 -38
- package/src/lib/shared/page-size-selector/page-size-selector.component.html +0 -7
- package/src/lib/shared/page-size-selector/page-size-selector.component.scss +0 -42
- package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +0 -23
- package/src/lib/shared/page-size-selector/page-size-selector.component.ts +0 -38
- package/src/lib/shared/search-filter/search-filter.component.html +0 -601
- package/src/lib/shared/search-filter/search-filter.component.scss +0 -203
- package/src/lib/shared/search-filter/search-filter.component.spec.ts +0 -23
- package/src/lib/shared/search-filter/search-filter.component.ts +0 -2387
- package/src/lib/shared/shared.module.ts +0 -13
- package/src/styles/ag-grid-report-style.scss +0 -71
- package/src/styles/common-ag-grid-style.scss +0 -146
- package/src/styles/common-report-style.scss +0 -395
- package/src/styles/common-style.scss +0 -615
- package/src/test.ts +0 -27
- package/tsconfig.lib.json +0 -15
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -17
- /package/{src/lib → lib}/assets/config/app-config.json +0 -0
- /package/{src → lib}/assets/images/Search.svg +0 -0
- /package/{src/lib → lib}/assets/images/XMLogo.png +0 -0
- /package/{src/lib → lib}/assets/svg-loaders/blue-tail-spin.svg +0 -0
|
@@ -0,0 +1,631 @@
|
|
|
1
|
+
import { formatDate } from '@angular/common';
|
|
2
|
+
import { Component, HostListener } from '@angular/core';
|
|
3
|
+
import { ComponentLoadingStates } from '../../models/component-loading-states';
|
|
4
|
+
import jsPDF from 'jspdf';
|
|
5
|
+
import 'jspdf-autotable';
|
|
6
|
+
import * as ExcelJS from 'exceljs';
|
|
7
|
+
import * as FileSaver from 'file-saver';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../../services/report.service";
|
|
10
|
+
import * as i2 from "../../shared/export.service";
|
|
11
|
+
import * as i3 from "ag-grid-angular";
|
|
12
|
+
import * as i4 from "@angular/common";
|
|
13
|
+
import * as i5 from "../../shared/page-size-selector/page-size-selector.component";
|
|
14
|
+
import * as i6 from "../../shared/metadata/metadata.component";
|
|
15
|
+
import * as i7 from "../../shared/loader/loader.component";
|
|
16
|
+
import * as i8 from "../../shared/search-filter/search-filter.component";
|
|
17
|
+
export class TrialBalanceAccountsReportComponent {
|
|
18
|
+
constructor(reportService, exportService) {
|
|
19
|
+
this.reportService = reportService;
|
|
20
|
+
this.exportService = exportService;
|
|
21
|
+
this.ReportName = "Trial Balance - Accounts";
|
|
22
|
+
this.ComponentLoadingState = ComponentLoadingStates;
|
|
23
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
24
|
+
this.selectedExportOption = 'excel';
|
|
25
|
+
this.pageSize = 15;
|
|
26
|
+
this.dataReady = false;
|
|
27
|
+
this.accountStatus = '';
|
|
28
|
+
this.currency = '';
|
|
29
|
+
this.dateType = '';
|
|
30
|
+
this.fromDate = '';
|
|
31
|
+
this.toDate = '';
|
|
32
|
+
this.businessLine = '';
|
|
33
|
+
this.reportUser = '';
|
|
34
|
+
this.reportTime = '';
|
|
35
|
+
this.reportPeriod = '';
|
|
36
|
+
this.isFormValid = false;
|
|
37
|
+
this.defaultColDef = {
|
|
38
|
+
resizable: true,
|
|
39
|
+
sortable: true,
|
|
40
|
+
filter: true,
|
|
41
|
+
suppressSizeToFit: false,
|
|
42
|
+
cellStyle: {
|
|
43
|
+
userSelect: 'text',
|
|
44
|
+
'line-height': '1.2',
|
|
45
|
+
'white-space': 'normal',
|
|
46
|
+
'word-break': 'normal',
|
|
47
|
+
'overflow-wrap': 'break-word',
|
|
48
|
+
},
|
|
49
|
+
wrapHeaderText: true,
|
|
50
|
+
autoHeaderHeight: true,
|
|
51
|
+
wrapText: true,
|
|
52
|
+
autoHeight: true,
|
|
53
|
+
cellClassRules: {
|
|
54
|
+
'total-positive': params => params.data?.isTotalRow && params.value >= 0,
|
|
55
|
+
'total-negative': params => params.data?.isTotalRow && params.value < 0,
|
|
56
|
+
'positive-value': params => !params.data?.isTotalRow && params.value >= 0,
|
|
57
|
+
'negative-value': params => !params.data?.isTotalRow && params.value < 0,
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
this.rowClassRules = {
|
|
61
|
+
'total-row': params => params.data?.isTotalRow
|
|
62
|
+
};
|
|
63
|
+
this.columnDefs = [
|
|
64
|
+
{ headerName: 'COA Code', field: 'coaCode', tooltipField: 'coaCode', minWidth: 60, maxWidth: 100 },
|
|
65
|
+
{ headerName: 'Account Code', field: 'accountCode', tooltipField: 'accountCode', minWidth: 80, maxWidth: 100 },
|
|
66
|
+
{ headerName: 'Account Description', field: 'accountDescription', tooltipField: 'accountDescription', minWidth: 180, maxWidth: 230 },
|
|
67
|
+
{ headerName: 'Opening Balance Local Amount', field: 'openingBalance', type: 'numericColumn', tooltipField: 'openingBalance' },
|
|
68
|
+
{ headerName: 'Debits Local Amount', field: 'debit', type: 'numericColumn', tooltipField: 'debit' },
|
|
69
|
+
{ headerName: 'Credits Local Amount', field: 'credit', type: 'numericColumn', tooltipField: 'credit' },
|
|
70
|
+
{ headerName: 'Net Movement Local Amount', field: 'netMovement', type: 'numericColumn', tooltipField: 'netMovement' },
|
|
71
|
+
{ headerName: 'Closing Balance Local Amount', field: 'closingBalance', type: 'numericColumn', tooltipField: 'closingBalance' }
|
|
72
|
+
];
|
|
73
|
+
this.rowData = [];
|
|
74
|
+
}
|
|
75
|
+
ngOnInit() { }
|
|
76
|
+
getTrialBalanceAccountsReport(req) {
|
|
77
|
+
this.dataReady = false;
|
|
78
|
+
this.trialBalanceReport = null;
|
|
79
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
|
80
|
+
this.reportService.getTrialBalanceAccountsReport(req).subscribe({
|
|
81
|
+
next: (report) => {
|
|
82
|
+
this.trialBalanceReport = report;
|
|
83
|
+
this.dataReady = true;
|
|
84
|
+
this.reportUser = this.trialBalanceReport.reportUser;
|
|
85
|
+
this.reportTime = formatDate(new Date(), 'dd/MM/yyyy hh:mm a', 'en-US');
|
|
86
|
+
this.reportPeriod = req.reportPeriod;
|
|
87
|
+
this.accountStatus = req.accountStatus;
|
|
88
|
+
this.currency = req.currency;
|
|
89
|
+
this.dateType = req.dateType == "VD" ? "Value Date" : "Posting Date";
|
|
90
|
+
this.businessLine = req.businessLine;
|
|
91
|
+
this.rowData = this.flattenReport(report).map(acc => ({
|
|
92
|
+
...acc,
|
|
93
|
+
openingBalance: Number(acc.openingBalance).toFixed(3),
|
|
94
|
+
debit: Number(acc.debit).toFixed(3),
|
|
95
|
+
credit: Number(acc.credit).toFixed(3),
|
|
96
|
+
netMovement: Number(acc.netMovement).toFixed(3),
|
|
97
|
+
closingBalance: Number(acc.closingBalance).toFixed(3)
|
|
98
|
+
}));
|
|
99
|
+
this.metaDataOne = {
|
|
100
|
+
'Report Period': this.reportPeriod,
|
|
101
|
+
};
|
|
102
|
+
this.metaDataTwo = {
|
|
103
|
+
'Report User & Time': `${this.reportUser} @ ${this.reportTime}`,
|
|
104
|
+
};
|
|
105
|
+
const searchCriteria = [
|
|
106
|
+
['Account Status:', this.accountStatus],
|
|
107
|
+
['Currency:', this.currency],
|
|
108
|
+
['Date Type:', this.dateType],
|
|
109
|
+
['From Date:', this.fromDate],
|
|
110
|
+
['Business Line:', this.businessLine],
|
|
111
|
+
['To Date:', this.toDate],
|
|
112
|
+
];
|
|
113
|
+
this.searchCriteria = searchCriteria;
|
|
114
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
115
|
+
},
|
|
116
|
+
error: (err) => {
|
|
117
|
+
console.error('Error fetching trial balance report:', err);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
flattenReport(report) {
|
|
122
|
+
const rows = [];
|
|
123
|
+
report.mainCOAGroups.forEach(main => {
|
|
124
|
+
main.subCOAGroups.forEach(sub => {
|
|
125
|
+
sub.coaGroups.forEach(coa => {
|
|
126
|
+
coa.accounts.forEach(account => rows.push(account));
|
|
127
|
+
rows.push({
|
|
128
|
+
coaCode: '',
|
|
129
|
+
accountCode: 'Total:',
|
|
130
|
+
accountDescription: `${coa.coaDescription}`,
|
|
131
|
+
openingBalance: Number(coa.totals.openingBalance).toFixed(3),
|
|
132
|
+
debit: Number(coa.totals.debit).toFixed(3),
|
|
133
|
+
credit: Number(coa.totals.credit).toFixed(3),
|
|
134
|
+
netMovement: Number(coa.totals.netMovement).toFixed(3),
|
|
135
|
+
closingBalance: Number(coa.totals.closingBalance).toFixed(3),
|
|
136
|
+
isTotalRow: true
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
rows.push({
|
|
140
|
+
coaCode: '',
|
|
141
|
+
accountCode: 'Total:',
|
|
142
|
+
accountDescription: `${sub.subCOADescription}`,
|
|
143
|
+
openingBalance: Number(sub.totals.openingBalance).toFixed(3),
|
|
144
|
+
debit: Number(sub.totals.debit).toFixed(3),
|
|
145
|
+
credit: Number(sub.totals.credit).toFixed(3),
|
|
146
|
+
netMovement: Number(sub.totals.netMovement).toFixed(3),
|
|
147
|
+
closingBalance: Number(sub.totals.closingBalance).toFixed(3),
|
|
148
|
+
isTotalRow: true
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
rows.push({
|
|
152
|
+
coaCode: '',
|
|
153
|
+
accountCode: 'Total:',
|
|
154
|
+
accountDescription: `${main.mainCOADescription}`,
|
|
155
|
+
openingBalance: Number(main.totals.openingBalance).toFixed(3),
|
|
156
|
+
debit: Number(main.totals.debit).toFixed(3),
|
|
157
|
+
credit: Number(main.totals.credit).toFixed(3),
|
|
158
|
+
netMovement: Number(main.totals.netMovement).toFixed(3),
|
|
159
|
+
closingBalance: Number(main.totals.closingBalance).toFixed(3),
|
|
160
|
+
isTotalRow: true
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
rows.push({
|
|
164
|
+
coaCode: 'TOTAL:',
|
|
165
|
+
accountCode: '',
|
|
166
|
+
accountDescription: '',
|
|
167
|
+
openingBalance: Number(report.grandTotal.openingBalance).toFixed(3),
|
|
168
|
+
debit: Number(report.grandTotal.debit).toFixed(3),
|
|
169
|
+
credit: Number(report.grandTotal.credit).toFixed(3),
|
|
170
|
+
netMovement: Number(report.grandTotal.netMovement).toFixed(3),
|
|
171
|
+
closingBalance: Number(report.grandTotal.closingBalance).toFixed(3),
|
|
172
|
+
isTotalRow: true
|
|
173
|
+
});
|
|
174
|
+
return rows;
|
|
175
|
+
}
|
|
176
|
+
onGridReady(params) {
|
|
177
|
+
this.gridApi = params.api;
|
|
178
|
+
this.gridColumnApi = params.columnApi;
|
|
179
|
+
const allColumnIds = [];
|
|
180
|
+
params.columnApi.getColumns().forEach((column) => {
|
|
181
|
+
allColumnIds.push(column.getColId());
|
|
182
|
+
});
|
|
183
|
+
params.columnApi.autoSizeColumns(allColumnIds);
|
|
184
|
+
this.onResize();
|
|
185
|
+
}
|
|
186
|
+
onResize() {
|
|
187
|
+
if (this.gridApi && this.gridApi.sizeColumnsToFit) {
|
|
188
|
+
this.gridApi.sizeColumnsToFit();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
onSearch(text) {
|
|
192
|
+
const normalize = (str) => str
|
|
193
|
+
?.toString()
|
|
194
|
+
.toLowerCase()
|
|
195
|
+
.replace(/,/g, '')
|
|
196
|
+
.replace(/\s+/g, ' ')
|
|
197
|
+
.replace(/[\u200B-\u200D\uFEFF]/g, '')
|
|
198
|
+
.trim();
|
|
199
|
+
const search = normalize(text);
|
|
200
|
+
if (search) {
|
|
201
|
+
// filter from already formatted rowData
|
|
202
|
+
this.rowData = this.flattenReport(this.trialBalanceReport)
|
|
203
|
+
.map(acc => ({
|
|
204
|
+
...acc,
|
|
205
|
+
openingBalance: Number(acc.openingBalance).toFixed(3),
|
|
206
|
+
debit: Number(acc.debit).toFixed(3),
|
|
207
|
+
credit: Number(acc.credit).toFixed(3),
|
|
208
|
+
netMovement: Number(acc.netMovement).toFixed(3),
|
|
209
|
+
closingBalance: Number(acc.closingBalance).toFixed(3)
|
|
210
|
+
}))
|
|
211
|
+
.filter(item => Object.values(item).some(value => normalize(value).includes(search)));
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
this.rowData = this.flattenReport(this.trialBalanceReport)
|
|
215
|
+
.map(acc => ({
|
|
216
|
+
...acc,
|
|
217
|
+
openingBalance: Number(acc.openingBalance).toFixed(3),
|
|
218
|
+
debit: Number(acc.debit).toFixed(3),
|
|
219
|
+
credit: Number(acc.credit).toFixed(3),
|
|
220
|
+
netMovement: Number(acc.netMovement).toFixed(3),
|
|
221
|
+
closingBalance: Number(acc.closingBalance).toFixed(3)
|
|
222
|
+
}));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
handleExport(option) {
|
|
226
|
+
this.selectedExportOption = option;
|
|
227
|
+
switch (this.selectedExportOption) {
|
|
228
|
+
case 'excel':
|
|
229
|
+
this.exportToExcel();
|
|
230
|
+
break;
|
|
231
|
+
case 'pdf':
|
|
232
|
+
this.exportToPdf();
|
|
233
|
+
break;
|
|
234
|
+
case 'csv':
|
|
235
|
+
this.exportToCsv();
|
|
236
|
+
break;
|
|
237
|
+
default:
|
|
238
|
+
alert('Please select an export format.');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exportToPdf() {
|
|
242
|
+
if (!this.trialBalanceReport?.mainCOAGroups?.length)
|
|
243
|
+
return;
|
|
244
|
+
const title = 'Xpress Money - MI Accounts';
|
|
245
|
+
const fileName = 'Trial-Balance-Accounts-Raw.pdf';
|
|
246
|
+
// --- page & layout ---
|
|
247
|
+
const doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: [312, 210] });
|
|
248
|
+
const pageWidth = doc.internal.pageSize.getWidth();
|
|
249
|
+
const marginLeft = 15;
|
|
250
|
+
const logoWidth = 38.4, logoHeight = 17.5, logoX = marginLeft, logoY = 8;
|
|
251
|
+
const titleY = 18;
|
|
252
|
+
let currentY = titleY + 14;
|
|
253
|
+
const labelValueGap = 2;
|
|
254
|
+
const pairGap = 15;
|
|
255
|
+
// --- metadata ---
|
|
256
|
+
const metadata = [
|
|
257
|
+
['Report Period:', this.reportPeriod],
|
|
258
|
+
['Report User & Time : ', `${this.reportUser}@${this.reportTime}`],
|
|
259
|
+
];
|
|
260
|
+
// --- search criteria ---
|
|
261
|
+
const searchCriteria = this.searchCriteria;
|
|
262
|
+
// --- draw logo + title ---
|
|
263
|
+
if (this.exportService?.logoBase64) {
|
|
264
|
+
try {
|
|
265
|
+
doc.addImage(this.exportService.logoBase64, 'PNG', logoX, logoY, logoWidth, logoHeight);
|
|
266
|
+
}
|
|
267
|
+
catch { }
|
|
268
|
+
}
|
|
269
|
+
doc.setFontSize(15);
|
|
270
|
+
doc.setFont('helvetica', 'bold');
|
|
271
|
+
doc.text(title, pageWidth / 2, titleY, { align: 'center' });
|
|
272
|
+
// --- draw metadata ---
|
|
273
|
+
doc.setFontSize(10);
|
|
274
|
+
metadata.forEach(([label, value], i) => {
|
|
275
|
+
const y = currentY + i * 6;
|
|
276
|
+
doc.setFont('helvetica', 'bold');
|
|
277
|
+
doc.text(label, marginLeft, y);
|
|
278
|
+
doc.setFont('helvetica', 'normal');
|
|
279
|
+
const labelWidth = doc.getTextWidth(label + ' ');
|
|
280
|
+
doc.text(value, marginLeft + labelWidth + labelValueGap, y);
|
|
281
|
+
});
|
|
282
|
+
currentY += metadata.length * 6 + 6;
|
|
283
|
+
// --- draw search criteria heading ---
|
|
284
|
+
doc.setFont('helvetica', 'bold');
|
|
285
|
+
doc.text('Search Criteria:-', marginLeft, currentY);
|
|
286
|
+
currentY += 8;
|
|
287
|
+
// --- draw search criteria pairs ---
|
|
288
|
+
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
289
|
+
const left = searchCriteria[i];
|
|
290
|
+
const right = searchCriteria[i + 1]; // may be undefined
|
|
291
|
+
// --- Left side ---
|
|
292
|
+
if (left) {
|
|
293
|
+
doc.setFont('helvetica', 'bold');
|
|
294
|
+
doc.text(left[0], marginLeft, currentY);
|
|
295
|
+
doc.setFont('helvetica', 'normal');
|
|
296
|
+
const leftLabelWidth = doc.getTextWidth(left[0] + ' ');
|
|
297
|
+
doc.text(left[1] ?? '', marginLeft + leftLabelWidth + labelValueGap, currentY);
|
|
298
|
+
}
|
|
299
|
+
// --- Right side (if available) ---
|
|
300
|
+
if (right) {
|
|
301
|
+
doc.setFont('helvetica', 'bold');
|
|
302
|
+
doc.text(right[0], pageWidth / 2, currentY);
|
|
303
|
+
doc.setFont('helvetica', 'normal');
|
|
304
|
+
const rightLabelWidth = doc.getTextWidth(right[0] + ' ');
|
|
305
|
+
doc.text(right[1] ?? '', pageWidth / 2 + rightLabelWidth + labelValueGap, currentY);
|
|
306
|
+
}
|
|
307
|
+
currentY += 6; // move down for next line
|
|
308
|
+
}
|
|
309
|
+
currentY += 4;
|
|
310
|
+
// --- headers ---
|
|
311
|
+
const headers = [
|
|
312
|
+
'Sr No',
|
|
313
|
+
'COA Code', 'Account Code', 'Account Description',
|
|
314
|
+
'Opening Balance Local Amt', 'Debits Local Amt', 'Credits Local Amt',
|
|
315
|
+
'Net Movement Local Amt', 'Closing Balance Local Amt'
|
|
316
|
+
];
|
|
317
|
+
const flatReport = this.flattenReport(this.trialBalanceReport);
|
|
318
|
+
// --- rows ---
|
|
319
|
+
const rows = flatReport.map((acc, i) => [
|
|
320
|
+
i + 1,
|
|
321
|
+
acc.coaCode,
|
|
322
|
+
acc.accountCode,
|
|
323
|
+
acc.accountDescription,
|
|
324
|
+
acc.openingBalance != null ? Number(acc.openingBalance).toFixed(3) : "",
|
|
325
|
+
acc.debit != null ? Number(acc.debit).toFixed(3) : "",
|
|
326
|
+
acc.credit != null ? Number(acc.credit).toFixed(3) : "",
|
|
327
|
+
acc.netMovement != null ? Number(acc.netMovement).toFixed(3) : "",
|
|
328
|
+
acc.closingBalance != null ? Number(acc.closingBalance).toFixed(3) : ""
|
|
329
|
+
]);
|
|
330
|
+
// --- column widths ---
|
|
331
|
+
const columnStyles = {
|
|
332
|
+
0: { cellWidth: 15 },
|
|
333
|
+
1: { cellWidth: 25 },
|
|
334
|
+
2: { cellWidth: 25 },
|
|
335
|
+
3: { cellWidth: 70 },
|
|
336
|
+
4: { cellWidth: 30 },
|
|
337
|
+
5: { cellWidth: 30 },
|
|
338
|
+
6: { cellWidth: 30 },
|
|
339
|
+
7: { cellWidth: 30 },
|
|
340
|
+
8: { cellWidth: 30 },
|
|
341
|
+
};
|
|
342
|
+
// --- draw table ---
|
|
343
|
+
doc.autoTable({
|
|
344
|
+
head: [headers],
|
|
345
|
+
body: rows,
|
|
346
|
+
startY: currentY,
|
|
347
|
+
theme: 'grid',
|
|
348
|
+
headStyles: {
|
|
349
|
+
fillColor: [220, 220, 220],
|
|
350
|
+
textColor: 0,
|
|
351
|
+
fontStyle: 'bold',
|
|
352
|
+
fontSize: 9,
|
|
353
|
+
halign: 'center',
|
|
354
|
+
cellWidth: 'wrap',
|
|
355
|
+
minCellHeight: 10
|
|
356
|
+
},
|
|
357
|
+
bodyStyles: {
|
|
358
|
+
fontSize: 8,
|
|
359
|
+
fillColor: [255, 255, 255],
|
|
360
|
+
textColor: [0, 0, 0]
|
|
361
|
+
},
|
|
362
|
+
styles: { cellPadding: 2, overflow: 'linebreak', minCellHeight: 6 },
|
|
363
|
+
columnStyles,
|
|
364
|
+
didParseCell: (data) => {
|
|
365
|
+
const rowIndex = data.row.index;
|
|
366
|
+
const rowData = flatReport[rowIndex];
|
|
367
|
+
const isTotalRow = rowData.isTotalRow;
|
|
368
|
+
if (isTotalRow)
|
|
369
|
+
data.cell.styles.fontStyle = 'bold';
|
|
370
|
+
// highlight negatives in red
|
|
371
|
+
if (data.column.index > 3) {
|
|
372
|
+
const keyMap = ["openingBalance", "debit", "credit", "netMovement", "closingBalance"];
|
|
373
|
+
const key = keyMap[data.column.index - 4];
|
|
374
|
+
const raw = rowData[key];
|
|
375
|
+
const num = Number(raw);
|
|
376
|
+
if (!isNaN(num) && num < 0) {
|
|
377
|
+
data.cell.styles.textColor = [255, 0, 0];
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
// --- page numbers ---
|
|
383
|
+
const totalPages = doc.internal.getNumberOfPages();
|
|
384
|
+
for (let i = 1; i <= totalPages; i++) {
|
|
385
|
+
doc.setPage(i);
|
|
386
|
+
doc.setFontSize(9);
|
|
387
|
+
const footerY = doc.internal.pageSize.height - 6;
|
|
388
|
+
doc.text(`Page ${i} of ${totalPages}`, pageWidth - 15, footerY, { align: 'right' });
|
|
389
|
+
}
|
|
390
|
+
// --- save PDF ---
|
|
391
|
+
doc.save(fileName);
|
|
392
|
+
}
|
|
393
|
+
exportToExcel() {
|
|
394
|
+
if (!this.trialBalanceReport?.mainCOAGroups?.length)
|
|
395
|
+
return;
|
|
396
|
+
const fileName = 'Trial-Balance-Accounts-Raw.xlsx';
|
|
397
|
+
const workbook = new ExcelJS.Workbook();
|
|
398
|
+
const sheet = workbook.addWorksheet('Trial Balance');
|
|
399
|
+
let currentRow = 1;
|
|
400
|
+
// --- add logo if available ---
|
|
401
|
+
if (this.exportService?.logoBase64) {
|
|
402
|
+
const base64Data = this.exportService.logoBase64.replace(/^data:image\/\w+;base64,/, '');
|
|
403
|
+
const imageId = workbook.addImage({ base64: base64Data, extension: 'png' });
|
|
404
|
+
sheet.addImage(imageId, { tl: { col: 0, row: 0 }, ext: { width: 120, height: 60 }, editAs: 'oneCell' });
|
|
405
|
+
}
|
|
406
|
+
// --- title ---
|
|
407
|
+
const title = 'Xpress Money - MI Accounts';
|
|
408
|
+
sheet.mergeCells(1, 3, 1, 9);
|
|
409
|
+
const titleCell = sheet.getCell('C1');
|
|
410
|
+
titleCell.value = title;
|
|
411
|
+
titleCell.font = { size: 15, bold: true };
|
|
412
|
+
titleCell.alignment = { horizontal: 'center', vertical: 'middle' };
|
|
413
|
+
currentRow = 4;
|
|
414
|
+
// --- metadata ---
|
|
415
|
+
const metadata = [
|
|
416
|
+
['Report Period:', this.reportPeriod],
|
|
417
|
+
['Report User & Time : ', `${this.reportUser}@${this.reportTime}`],
|
|
418
|
+
];
|
|
419
|
+
metadata.forEach(([label, value]) => {
|
|
420
|
+
sheet.mergeCells(currentRow, 1, currentRow, 6);
|
|
421
|
+
const row = sheet.getRow(currentRow++);
|
|
422
|
+
row.getCell(1).value = { richText: [{ text: label + ' ', font: { bold: true } }, { text: value }] };
|
|
423
|
+
row.getCell(1).alignment = { vertical: 'middle', wrapText: true };
|
|
424
|
+
});
|
|
425
|
+
currentRow++;
|
|
426
|
+
// --- search criteria heading ---
|
|
427
|
+
sheet.mergeCells(currentRow, 1, currentRow, 6);
|
|
428
|
+
sheet.getCell(currentRow, 1).value = 'Search Criteria:-';
|
|
429
|
+
sheet.getCell(currentRow, 1).font = { bold: true };
|
|
430
|
+
currentRow += 2;
|
|
431
|
+
// --- search criteria ---
|
|
432
|
+
const searchCriteria = this.searchCriteria;
|
|
433
|
+
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
434
|
+
const left = searchCriteria[i];
|
|
435
|
+
const right = searchCriteria[i + 1]; // may be undefined
|
|
436
|
+
const row = sheet.getRow(currentRow++);
|
|
437
|
+
// Left cell
|
|
438
|
+
sheet.mergeCells(row.number, 1, row.number, 3);
|
|
439
|
+
row.getCell(1).value = {
|
|
440
|
+
richText: [
|
|
441
|
+
{ text: (left?.[0] ?? '') + ' ', font: { bold: true } },
|
|
442
|
+
{ text: left?.[1] ?? '' }
|
|
443
|
+
]
|
|
444
|
+
};
|
|
445
|
+
row.getCell(1).alignment = { wrapText: true, vertical: 'middle' };
|
|
446
|
+
// Right cell (only if present)
|
|
447
|
+
if (right) {
|
|
448
|
+
sheet.mergeCells(row.number, 4, row.number, 6);
|
|
449
|
+
row.getCell(4).value = {
|
|
450
|
+
richText: [
|
|
451
|
+
{ text: (right?.[0] ?? '') + ' ', font: { bold: true } },
|
|
452
|
+
{ text: right?.[1] ?? '' }
|
|
453
|
+
]
|
|
454
|
+
};
|
|
455
|
+
row.getCell(4).alignment = { wrapText: true, vertical: 'middle' };
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
currentRow++;
|
|
459
|
+
// --- headers ---
|
|
460
|
+
const headers = [
|
|
461
|
+
'Sr No',
|
|
462
|
+
'COA Code', 'Account Code', 'Account Description',
|
|
463
|
+
'Opening Balance Local Amt', 'Debits Local Amt', 'Credits Local Amt',
|
|
464
|
+
'Net Movement Local Amt', 'Closing Balance Local Amt'
|
|
465
|
+
];
|
|
466
|
+
const headerRow = sheet.getRow(currentRow++);
|
|
467
|
+
headers.forEach((h, i) => {
|
|
468
|
+
const cell = headerRow.getCell(i + 1);
|
|
469
|
+
cell.value = h;
|
|
470
|
+
cell.font = { bold: true };
|
|
471
|
+
cell.alignment = { horizontal: 'center', vertical: 'middle', wrapText: true };
|
|
472
|
+
cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'DCDCDC' } };
|
|
473
|
+
cell.border = { top: { style: 'thin' }, left: { style: 'thin' }, bottom: { style: 'thin' }, right: { style: 'thin' } };
|
|
474
|
+
});
|
|
475
|
+
// --- rows with 3 decimals for numeric columns ---
|
|
476
|
+
const rows = this.flattenReport(this.trialBalanceReport).map((acc, idx) => {
|
|
477
|
+
const numericColumns = ['openingBalance', 'debit', 'credit', 'netMovement', 'closingBalance'];
|
|
478
|
+
const rowData = numericColumns.map(col => {
|
|
479
|
+
const val = Number(acc[col]);
|
|
480
|
+
return !isNaN(val) ? val.toFixed(3) : '';
|
|
481
|
+
});
|
|
482
|
+
return [
|
|
483
|
+
idx + 1,
|
|
484
|
+
acc.coaCode,
|
|
485
|
+
acc.accountCode,
|
|
486
|
+
acc.accountDescription,
|
|
487
|
+
...rowData,
|
|
488
|
+
acc.isTotalRow || false
|
|
489
|
+
];
|
|
490
|
+
});
|
|
491
|
+
rows.forEach(r => {
|
|
492
|
+
const row = sheet.getRow(currentRow++);
|
|
493
|
+
r.slice(0, 9).forEach((val, i) => {
|
|
494
|
+
const cell = row.getCell(i + 1);
|
|
495
|
+
// convert back to number for Excel math but show 3 decimals
|
|
496
|
+
if (i > 3 && val !== '')
|
|
497
|
+
cell.value = parseFloat(val.toString());
|
|
498
|
+
else
|
|
499
|
+
cell.value = val;
|
|
500
|
+
cell.border = { top: { style: 'thin' }, left: { style: 'thin' }, bottom: { style: 'thin' }, right: { style: 'thin' } };
|
|
501
|
+
// bold total rows
|
|
502
|
+
if (r[9])
|
|
503
|
+
cell.font = { bold: true };
|
|
504
|
+
// negative numbers red
|
|
505
|
+
if (i > 3 && typeof cell.value === 'number' && cell.value < 0) {
|
|
506
|
+
cell.font = { color: { argb: 'FF0000' }, bold: r[9] ? true : undefined };
|
|
507
|
+
}
|
|
508
|
+
// set number format to show 3 decimals
|
|
509
|
+
if (i > 3)
|
|
510
|
+
cell.numFmt = '0.000';
|
|
511
|
+
});
|
|
512
|
+
});
|
|
513
|
+
// --- column widths ---
|
|
514
|
+
const widths = [8, 15, 15, 40, 20, 20, 20, 20, 20];
|
|
515
|
+
widths.forEach((w, i) => sheet.getColumn(i + 1).width = w);
|
|
516
|
+
// --- save file ---
|
|
517
|
+
workbook.xlsx.writeBuffer().then(buffer => {
|
|
518
|
+
const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
|
|
519
|
+
FileSaver.saveAs(blob, fileName);
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
exportToCsv() {
|
|
523
|
+
if (!this.trialBalanceReport?.mainCOAGroups?.length)
|
|
524
|
+
return;
|
|
525
|
+
const fileName = 'Trial-Balance-Accounts-Raw.csv';
|
|
526
|
+
// --- metadata ---
|
|
527
|
+
const metadata = [
|
|
528
|
+
['Report Title:', 'Xpress Money - MI Accounts'],
|
|
529
|
+
['Report Period:', this.reportPeriod],
|
|
530
|
+
['Report User & Time : ', `${this.reportUser}@${this.reportTime}`],
|
|
531
|
+
];
|
|
532
|
+
// --- search criteria ---
|
|
533
|
+
const searchCriteria = this.searchCriteria;
|
|
534
|
+
// --- table headers (add Sr No at start) ---
|
|
535
|
+
const headers = [
|
|
536
|
+
'Sr No',
|
|
537
|
+
'COA Code', 'Account Code', 'Account Description',
|
|
538
|
+
'Opening Balance Local Amt', 'Debits Local Amt', 'Credits Local Amt',
|
|
539
|
+
'Net Movement Local Amt', 'Closing Balance Local Amt'
|
|
540
|
+
];
|
|
541
|
+
// --- table rows (prepend Sr No) ---
|
|
542
|
+
const rows = this.flattenReport(this.trialBalanceReport).map((acc, index) => [
|
|
543
|
+
index + 1,
|
|
544
|
+
acc.coaCode,
|
|
545
|
+
acc.accountCode,
|
|
546
|
+
acc.accountDescription,
|
|
547
|
+
Number(acc.openingBalance).toFixed(3),
|
|
548
|
+
Number(acc.debit).toFixed(3),
|
|
549
|
+
Number(acc.credit).toFixed(3),
|
|
550
|
+
Number(acc.netMovement).toFixed(3),
|
|
551
|
+
Number(acc.closingBalance).toFixed(3)
|
|
552
|
+
]);
|
|
553
|
+
// --- helper to escape CSV values ---
|
|
554
|
+
const escapeCsv = (value) => {
|
|
555
|
+
if (value === null || value === undefined)
|
|
556
|
+
return '';
|
|
557
|
+
const str = value.toString();
|
|
558
|
+
return str.includes(',') || str.includes('"') || str.includes('\n')
|
|
559
|
+
? `"${str.replace(/"/g, '""')}"`
|
|
560
|
+
: str;
|
|
561
|
+
};
|
|
562
|
+
// --- build CSV content ---
|
|
563
|
+
let csvContent = '';
|
|
564
|
+
// metadata
|
|
565
|
+
metadata.forEach(([label, value]) => {
|
|
566
|
+
csvContent += `${escapeCsv(label)}${escapeCsv(value)},\n`;
|
|
567
|
+
});
|
|
568
|
+
csvContent += '\n'; // gap
|
|
569
|
+
// --- search criteria heading ---
|
|
570
|
+
csvContent += 'Search Criteria:-\n';
|
|
571
|
+
// --- search criteria (2 per row, dynamic) ---
|
|
572
|
+
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
573
|
+
const left = searchCriteria[i];
|
|
574
|
+
const right = searchCriteria[i + 1];
|
|
575
|
+
// Left side
|
|
576
|
+
if (left)
|
|
577
|
+
csvContent += `${escapeCsv(left[0])} ${escapeCsv(left[1])},`;
|
|
578
|
+
// Right side
|
|
579
|
+
if (right)
|
|
580
|
+
csvContent += ` ${escapeCsv(right[0])} ${escapeCsv(right[1])},`;
|
|
581
|
+
csvContent += '\n';
|
|
582
|
+
}
|
|
583
|
+
csvContent += '\n'; // blank line after criteria
|
|
584
|
+
// table headers
|
|
585
|
+
csvContent += headers.map(h => escapeCsv(h)).join(',') + '\n';
|
|
586
|
+
// table rows
|
|
587
|
+
rows.forEach(row => {
|
|
588
|
+
csvContent += row.map(cell => escapeCsv(cell)).join(',') + '\n';
|
|
589
|
+
});
|
|
590
|
+
// --- trigger download ---
|
|
591
|
+
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
|
|
592
|
+
const link = document.createElement('a');
|
|
593
|
+
const url = URL.createObjectURL(blob);
|
|
594
|
+
link.setAttribute('href', url);
|
|
595
|
+
link.setAttribute('download', fileName);
|
|
596
|
+
link.style.visibility = 'hidden';
|
|
597
|
+
document.body.appendChild(link);
|
|
598
|
+
link.click();
|
|
599
|
+
document.body.removeChild(link);
|
|
600
|
+
}
|
|
601
|
+
getReport(payload) {
|
|
602
|
+
const modal = payload?.modal || payload;
|
|
603
|
+
this.fromDate = formatDate(modal.fromDate, 'dd/MM/yyyy', 'en-US');
|
|
604
|
+
this.toDate = formatDate(modal.toDate, 'dd/MM/yyyy', 'en-US');
|
|
605
|
+
const req = {
|
|
606
|
+
year: Number(modal.financialYear),
|
|
607
|
+
dateType: modal.dateType,
|
|
608
|
+
fromDate: modal.fromDay,
|
|
609
|
+
toDate: modal.toDay,
|
|
610
|
+
accountStatus: modal.accountStatus.join(','),
|
|
611
|
+
businessLine: modal.businessLine,
|
|
612
|
+
currency: modal.currency,
|
|
613
|
+
companyCode: "BH",
|
|
614
|
+
reportPeriod: `${formatDate(modal.fromDate, 'dd/MM/yyyy', 'en-US')} - ${formatDate(modal.toDate, 'dd/MM/yyyy', 'en-US')}`,
|
|
615
|
+
};
|
|
616
|
+
this.getTrialBalanceAccountsReport(req);
|
|
617
|
+
}
|
|
618
|
+
handleFormValid(isValid) {
|
|
619
|
+
this.isFormValid = isValid;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
TrialBalanceAccountsReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TrialBalanceAccountsReportComponent, deps: [{ token: i1.ReportService }, { token: i2.ExportService }], target: i0.ɵɵFactoryTarget.Component });
|
|
623
|
+
TrialBalanceAccountsReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TrialBalanceAccountsReportComponent, selector: "lib-trial-balance-accounts-report", host: { listeners: { "window:resize": "onResize($event)" } }, ngImport: i0, template: "<lib-search-filter [ReportName]=\"ReportName\" (searchClicked)=\"getReport($event)\"\r\n (formValid)=\"handleFormValid($event)\"></lib-search-filter>\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<div *ngIf=\"dataReady && trialBalanceReport?.mainCOAGroups?.length > 0 &&isFormValid\">\r\n <lib-metadata [reportName]=\"'Xpress Money - MI Accounts'\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\"\r\n [metaDataOne]=\"metaDataOne\" [metaDataTwo]=\"metaDataTwo\" (exportEvent)=\"handleExport($event)\"\r\n (searchEvent)=\"onSearch($event)\"></lib-metadata>\r\n\r\n <div style=\"position: relative;\" *ngIf=\"rowData && rowData.length > 0\">\r\n <lib-page-size-selector [totalEntries]=\"rowData?.length\" [defaultSize]=\"'15'\"\r\n [gridApi]=\"gridApi\"></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"height: 380px;\" [domLayout]=\"'normal'\"\r\n [rowData]=\"rowData\" [defaultColDef]=\"defaultColDef\" [columnDefs]=\"columnDefs\" [rowClassRules]=\"rowClassRules\"\r\n [pagination]=\"true\" (gridReady)=\"onGridReady($event)\" [paginationPageSize]=\"pageSize\" [rowHeight]=\"20\"\r\n [headerHeight]=\"22\" (paginationChanged)=\"onResize()\"></ag-grid-angular>\r\n\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"alert alert-warning mt-3\" *ngIf=\"trialBalanceReport?.mainCOAGroups?.length==0\">\r\n No Data found matching your search criteria.\r\n</div>", styles: [".transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important}.transaction-grid ::ng-deep .ag-cell.total-positive{font-weight:700!important;color:#000!important}.transaction-grid ::ng-deep .ag-cell.total-negative{font-weight:700!important;color:red!important}.transaction-grid ::ng-deep .ag-cell.positive-value{color:#000!important}.transaction-grid ::ng-deep .ag-cell.negative-value{color:red!important}\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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PageSizeSelectorComponent, selector: "lib-page-size-selector", inputs: ["pageSizeArray", "defaultSize", "totalEntries", "gridApi"] }, { kind: "component", type: i6.MetadataComponent, selector: "lib-metadata", inputs: ["metaDataOne", "metaDataTwo", "showmetaDataOne", "showmetaDataTwo", "reportName"], outputs: ["searchEvent", "exportEvent"] }, { kind: "component", type: i7.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i8.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName", "initialFilters"], outputs: ["searchClicked", "formValid"] }] });
|
|
624
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TrialBalanceAccountsReportComponent, decorators: [{
|
|
625
|
+
type: Component,
|
|
626
|
+
args: [{ selector: 'lib-trial-balance-accounts-report', template: "<lib-search-filter [ReportName]=\"ReportName\" (searchClicked)=\"getReport($event)\"\r\n (formValid)=\"handleFormValid($event)\"></lib-search-filter>\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<div *ngIf=\"dataReady && trialBalanceReport?.mainCOAGroups?.length > 0 &&isFormValid\">\r\n <lib-metadata [reportName]=\"'Xpress Money - MI Accounts'\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\"\r\n [metaDataOne]=\"metaDataOne\" [metaDataTwo]=\"metaDataTwo\" (exportEvent)=\"handleExport($event)\"\r\n (searchEvent)=\"onSearch($event)\"></lib-metadata>\r\n\r\n <div style=\"position: relative;\" *ngIf=\"rowData && rowData.length > 0\">\r\n <lib-page-size-selector [totalEntries]=\"rowData?.length\" [defaultSize]=\"'15'\"\r\n [gridApi]=\"gridApi\"></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"height: 380px;\" [domLayout]=\"'normal'\"\r\n [rowData]=\"rowData\" [defaultColDef]=\"defaultColDef\" [columnDefs]=\"columnDefs\" [rowClassRules]=\"rowClassRules\"\r\n [pagination]=\"true\" (gridReady)=\"onGridReady($event)\" [paginationPageSize]=\"pageSize\" [rowHeight]=\"20\"\r\n [headerHeight]=\"22\" (paginationChanged)=\"onResize()\"></ag-grid-angular>\r\n\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"alert alert-warning mt-3\" *ngIf=\"trialBalanceReport?.mainCOAGroups?.length==0\">\r\n No Data found matching your search criteria.\r\n</div>", styles: [".transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important}.transaction-grid ::ng-deep .ag-cell.total-positive{font-weight:700!important;color:#000!important}.transaction-grid ::ng-deep .ag-cell.total-negative{font-weight:700!important;color:red!important}.transaction-grid ::ng-deep .ag-cell.positive-value{color:#000!important}.transaction-grid ::ng-deep .ag-cell.negative-value{color:red!important}\n"] }]
|
|
627
|
+
}], ctorParameters: function () { return [{ type: i1.ReportService }, { type: i2.ExportService }]; }, propDecorators: { onResize: [{
|
|
628
|
+
type: HostListener,
|
|
629
|
+
args: ['window:resize', ['$event']]
|
|
630
|
+
}] } });
|
|
631
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpYWwtYmFsYW5jZS1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL3RyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0L3RyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFaEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFHL0UsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7QUEyQnhDLE1BQU0sT0FBTyxtQ0FBbUM7SUF5RTlDLFlBQW9CLGFBQTRCLEVBQVUsYUFBNEI7UUFBbEUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXRFdEYsZUFBVSxHQUFXLDBCQUEwQixDQUFBO1FBSS9DLDBCQUFxQixHQUFHLHNCQUFzQixDQUFDO1FBQy9DLGlCQUFZLEdBQTJCLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztRQUV2RSx5QkFBb0IsR0FBVyxPQUFPLENBQUM7UUFDdkMsYUFB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QUssQ0FBQyxRQUFRO1lBQ3hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFlBQVksRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUU7U0FDMUgsQ0FBQztRQUVGLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQWdCO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO0lBQzdCLENBQUM7O2dJQTdyQlUsbUNBQW1DO29IQUFuQyxtQ0FBbUMsdUlDcENoRCxnK0NBd0JNOzJGRFlPLG1DQUFtQztrQkFML0MsU0FBUzsrQkFDRSxtQ0FBbUM7Z0lBb043QyxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29sRGVmLCBDb2x1bW5BcGksIEdyaWRBcGksIEdyaWRSZWFkeUV2ZW50IH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkaW5nU3RhdGVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbXBvbmVudC1sb2FkaW5nLXN0YXRlcyc7XHJcbmltcG9ydCB7IEFjY291bnREZXRhaWwsIFRyaWFsQmFsYW5jZVJlcG9ydCB9IGZyb20gJy4uLy4uL21vZGVscy90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC90cmlhbC1iYWxhbmNlLWFjY291bnRzLm1vZGVscyc7XHJcbmltcG9ydCB7IFJlcG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQuc2VydmljZSc7XHJcbmltcG9ydCBqc1BERiBmcm9tICdqc3BkZic7XHJcbmltcG9ydCAnanNwZGYtYXV0b3RhYmxlJztcclxuaW1wb3J0ICogYXMgRXhjZWxKUyBmcm9tICdleGNlbGpzJztcclxuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2V4cG9ydC5zZXJ2aWNlJztcclxuXHJcblxyXG5kZWNsYXJlIG1vZHVsZSAnanNwZGYnIHtcclxuICBpbnRlcmZhY2UganNQREYge1xyXG4gICAgYXV0b1RhYmxlOiAob3B0aW9uczogYW55KSA9PiBqc1BERjtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnRSZXF1ZXN0RFRPIHtcclxuICB5ZWFyOiBudW1iZXI7XHJcbiAgZGF0ZVR5cGU6IHN0cmluZztcclxuICBmcm9tRGF0ZTogc3RyaW5nO1xyXG4gIHRvRGF0ZTogc3RyaW5nO1xyXG4gIGFjY291bnRTdGF0dXM6IHN0cmluZztcclxuICBidXNpbmVzc0xpbmU6IHN0cmluZztcclxuICBjdXJyZW5jeTogc3RyaW5nO1xyXG4gIGNvbXBhbnlDb2RlOiBzdHJpbmc7XHJcbiAgcmVwb3J0UGVyaW9kOiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJpYWwtYmFsYW5jZS1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcblxyXG4gIFJlcG9ydE5hbWU6IHN0cmluZyA9IFwiVHJpYWwgQmFsYW5jZSAtIEFjY291bnRzXCJcclxuICBncmlkQXBpOiBHcmlkQXBpO1xyXG4gIG1ldGFEYXRhT25lOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIG1ldGFEYXRhVHdvOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIENvbXBvbmVudExvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXM7XHJcbiAgbG9hZGluZ1N0YXRlOiBDb21wb25lbnRMb2FkaW5nU3RhdGVzID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICB0cmlhbEJhbGFuY2VSZXBvcnQ6IFRyaWFsQmFsYW5jZVJlcG9ydDtcclxuICBzZWxlY3RlZEV4cG9ydE9wdGlvbjogc3RyaW5nID0gJ2V4Y2VsJztcclxuICBwYWdlU2l6ZTogbnVtYmVyID0gMTU7XHJcbiAgZGF0YVJlYWR5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuXHJcbiAgYWNjb3VudFN0YXR1czogc3RyaW5nID0gJyc7XHJcbiAgY3VycmVuY3k6IHN0cmluZyA9ICcnO1xyXG4gIGRhdGVUeXBlOiBzdHJpbmcgPSAnJztcclxuICBmcm9tRGF0ZTogc3RyaW5nID0gJyc7XHJcbiAgdG9EYXRlOiBzdHJpbmcgPSAnJztcclxuICBidXNpbmVzc0xpbmU6IHN0cmluZyA9ICcnO1xyXG5cclxuICByZXBvcnRVc2VyOiBzdHJpbmcgPSAnJztcclxuICByZXBvcnRUaW1lOiBzdHJpbmcgPSAnJztcclxuICByZXBvcnRQZXJpb2Q6IHN0cmluZyA9ICcnO1xyXG4gIGlzRm9ybVZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICBkZWZhdWx0Q29sRGVmOiBDb2xEZWYgPSB7XHJcbiAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgIHN1cHByZXNzU2l6ZVRvRml0OiBmYWxzZSxcclxuICAgIGNlbGxTdHlsZToge1xyXG4gICAgICB1c2VyU2VsZWN0OiAndGV4dCcsXHJcbiAgICAgICdsaW5lLWhlaWdodCc6ICcxLjInLFxyXG4gICAgICAnd2hpdGUtc3BhY2UnOiAnbm9ybWFsJyxcclxuICAgICAgJ3dvcmQtYnJlYWsnOiAnbm9ybWFsJyxcclxuICAgICAgJ292ZXJmbG93LXdyYXAnOiAnYnJlYWstd29yZCcsXHJcbiAgICB9LFxyXG5cclxuICAgIHdyYXBIZWFkZXJUZXh0OiB0cnVlLFxyXG4gICAgYXV0b0hlYWRlckhlaWdodDogdHJ1ZSxcclxuICAgIHdyYXBUZXh0OiB0cnVlLFxyXG4gICAgYXV0b0hlaWdodDogdHJ1ZSxcclxuXHJcbiAgICBjZWxsQ2xhc3NSdWxlczoge1xyXG4gICAgICAndG90YWwtcG9zaXRpdmUnOiBwYXJhbXMgPT4gcGFyYW1zLmRhdGE/LmlzVG90YWxSb3cgJiYgcGFyYW1zLnZhbHVlID49IDAsXHJcbiAgICAgICd0b3RhbC1uZWdhdGl2ZSc6IHBhcmFtcyA9PiBwYXJhbXMuZGF0YT8uaXNUb3RhbFJvdyAmJiBwYXJhbXMudmFsdWUgPCAwLFxyXG4gICAgICAncG9zaXRpdmUtdmFsdWUnOiBwYXJhbXMgPT4gIXBhcmFtcy5kYXRhPy5pc1RvdGFsUm93ICYmIHBhcmFtcy52YWx1ZSA+PSAwLFxyXG4gICAgICAnbmVnYXRpdmUtdmFsdWUnOiBwYXJhbXMgPT4gIXBhcmFtcy5kYXRhPy5pc1RvdGFsUm93ICYmIHBhcmFtcy52YWx1ZSA8IDAsXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcm93Q2xhc3NSdWxlcyA9IHtcclxuICAgICd0b3RhbC1yb3cnOiBwYXJhbXMgPT4gcGFyYW1zLmRhdGE/LmlzVG90YWxSb3dcclxuICB9O1xyXG5cclxuICBjb2x1bW5EZWZzOiBDb2xEZWZbXSA9XHJcbiAgICBbXHJcbiAgICAgIHsgaGVhZGVyTmFtZTogJ0NPQSBDb2RlJywgZmllbGQ6ICdjb2FDb2RlJywgdG9vbHRpcEZpZWxkOiAnY29hQ29kZScsIG1pbldpZHRoOiA2MCwgbWF4V2lkdGg6IDEwMCB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdBY2NvdW50IENvZGUnLCBmaWVsZDogJ2FjY291bnRDb2RlJywgdG9vbHRpcEZpZWxkOiAnYWNjb3VudENvZGUnLCBtaW5XaWR0aDogODAsIG1heFdpZHRoOiAxMDAgfSxcclxuICAgICAgeyBoZWFkZXJOYW1lOiAnQWNjb3VudCBEZXNjcmlwdGlvbicsIGZpZWxkOiAnYWNjb3VudERlc2NyaXB0aW9uJywgdG9vbHRpcEZpZWxkOiAnYWNjb3VudERlc2NyaXB0aW9uJywgbWluV2lkdGg6IDE4MCwgbWF4V2lkdGg6IDIzMCB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdPcGVuaW5nIEJhbGFuY2UgTG9jYWwgQW1vdW50JywgZmllbGQ6ICdvcGVuaW5nQmFsYW5jZScsIHR5cGU6ICdudW1lcmljQ29sdW1uJywgdG9vbHRpcEZpZWxkOiAnb3BlbmluZ0JhbGFuY2UnIH0sXHJcbiAgICAgIHsgaGVhZGVyTmFtZTogJ0RlYml0cyBMb2NhbCBBbW91bnQnLCBmaWVsZDogJ2RlYml0JywgdHlwZTogJ251bWVyaWNDb2x1bW4nLCB0b29sdGlwRmllbGQ6ICdkZWJpdCcgfSxcclxuICAgICAgeyBoZWFkZXJOYW1lOiAnQ3JlZGl0cyBMb2NhbCBBbW91bnQnLCBmaWVsZDogJ2NyZWRpdCcsIHR5cGU6ICdudW1lcmljQ29sdW1uJywgdG9vbHRpcEZpZWxkOiAnY3JlZGl0JyB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdOZXQgTW92ZW1lbnQgTG9jYWwgQW1vdW50JywgZmllbGQ6ICduZXRNb3ZlbWVudCcsIHR5cGU6ICdudW1lcmljQ29sdW1uJywgdG9vbHRpcEZpZWxkOiAnbmV0TW92ZW1lbnQnIH0sXHJcbiAgICAgIHsgaGVhZGVyTmFtZTogJ0Nsb3NpbmcgQmFsYW5jZSBMb2NhbCBBbW91bnQnLCBmaWVsZDogJ2Nsb3NpbmdCYWxhbmNlJywgdHlwZTogJ251bWVyaWNDb2x1bW4nLCB0b29sdGlwRmllbGQ6ICdjbG9zaW5nQmFsYW5jZScgfVxyXG4gICAgXTtcclxuXHJcbiAgcm93RGF0YTogQWNjb3VudERldGFpbFtdID0gW107XHJcbiAgZ3JpZENvbHVtbkFwaTogQ29sdW1uQXBpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlcG9ydFNlcnZpY2U6IFJlcG9ydFNlcnZpY2UsIHByaXZhdGUgZXhwb3J0U2VydmljZTogRXhwb3J0U2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB9XHJcblxyXG4gIGdldFRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KHJlcTogYW55KSB7XHJcblxyXG4gICAgdGhpcy5kYXRhUmVhZHkgPSBmYWxzZTtcclxuICAgIHRoaXMudHJpYWxCYWxhbmNlUmVwb3J0ID0gbnVsbDtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Mb2FkaW5nO1xyXG5cclxuICAgIHRoaXMucmVwb3J0U2VydmljZS5nZXRUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydChyZXEpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXBvcnQ6IFRyaWFsQmFsYW5jZVJlcG9ydCkgPT4ge1xyXG4gICAgICAgIHRoaXMudHJpYWxCYWxhbmNlUmVwb3J0ID0gcmVwb3J0O1xyXG4gICAgICAgIHRoaXMuZGF0YVJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlcG9ydFVzZXIgPSB0aGlzLnRyaWFsQmFsYW5jZVJlcG9ydC5yZXBvcnRVc2VyO1xyXG4gICAgICAgIHRoaXMucmVwb3J0VGltZSA9IGZvcm1hdERhdGUobmV3IERhdGUoKSwgJ2RkL01NL3l5eXkgaGg6bW0gYScsICdlbi1VUycpO1xyXG4gICAgICAgIHRoaXMucmVwb3J0UGVyaW9kID0gcmVxLnJlcG9ydFBlcmlvZDtcclxuXHJcbiAgICAgICAgdGhpcy5hY2NvdW50U3RhdHVzID0gcmVxLmFjY291bnRTdGF0dXM7XHJcbiAgICAgICAgdGhpcy5jdXJyZW5jeSA9IHJlcS5jdXJyZW5jeTtcclxuICAgICAgICB0aGlzLmRhdGVUeXBlID0gcmVxLmRhdGVUeXBlID09IFwiVkRcIiA/IFwiVmFsdWUgRGF0ZVwiIDogXCJQb3N0aW5nIERhdGVcIjtcclxuICAgICAgICB0aGlzLmJ1c2luZXNzTGluZSA9IHJlcS5idXNpbmVzc0xpbmU7XHJcblxyXG4gICAgICAgIHRoaXMucm93RGF0YSA9IHRoaXMuZmxhdHRlblJlcG9ydChyZXBvcnQpLm1hcChhY2MgPT4gKHtcclxuICAgICAgICAgIC4uLmFjYyxcclxuICAgICAgICAgIG9wZW5pbmdCYWxhbmNlOiBOdW1iZXIoYWNjLm9wZW5pbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgZGViaXQ6IE51bWJlcihhY2MuZGViaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBjcmVkaXQ6IE51bWJlcihhY2MuY3JlZGl0KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgbmV0TW92ZW1lbnQ6IE51bWJlcihhY2MubmV0TW92ZW1lbnQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBjbG9zaW5nQmFsYW5jZTogTnVtYmVyKGFjYy5jbG9zaW5nQmFsYW5jZSkudG9GaXhlZCgzKVxyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5tZXRhRGF0YU9uZSA9IHtcclxuICAgICAgICAgICdSZXBvcnQgUGVyaW9kJzogdGhpcy5yZXBvcnRQZXJpb2QsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5tZXRhRGF0YVR3byA9IHtcclxuICAgICAgICAgICdSZXBvcnQgVXNlciAmIFRpbWUnOiBgJHt0aGlzLnJlcG9ydFVzZXJ9IEAgJHt0aGlzLnJlcG9ydFRpbWV9YCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICAgICAgWydBY2NvdW50IFN0YXR1czonLCB0aGlzLmFjY291bnRTdGF0dXNdLFxyXG4gICAgICAgICAgWydDdXJyZW5jeTonLCB0aGlzLmN1cnJlbmN5XSxcclxuICAgICAgICAgIFsnRGF0ZSBUeXBlOicsIHRoaXMuZGF0ZVR5cGVdLFxyXG4gICAgICAgICAgWydGcm9tIERhdGU6JywgdGhpcy5mcm9tRGF0ZV0sXHJcbiAgICAgICAgICBbJ0J1c2luZXNzIExpbmU6JywgdGhpcy5idXNpbmVzc0xpbmVdLFxyXG4gICAgICAgICAgWydUbyBEYXRlOicsIHRoaXMudG9EYXRlXSxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaENyaXRlcmlhID0gc2VhcmNoQ3JpdGVyaWE7XHJcblxyXG5cclxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuQ29tcGxldGU7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgdHJpYWwgYmFsYW5jZSByZXBvcnQ6JywgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmbGF0dGVuUmVwb3J0KHJlcG9ydDogVHJpYWxCYWxhbmNlUmVwb3J0KTogQWNjb3VudERldGFpbFtdIHtcclxuICAgIGNvbnN0IHJvd3M6IEFjY291bnREZXRhaWxbXSA9IFtdO1xyXG5cclxuICAgIHJlcG9ydC5tYWluQ09BR3JvdXBzLmZvckVhY2gobWFpbiA9PiB7XHJcbiAgICAgIG1haW4uc3ViQ09BR3JvdXBzLmZvckVhY2goc3ViID0+IHtcclxuICAgICAgICBzdWIuY29hR3JvdXBzLmZvckVhY2goY29hID0+IHtcclxuICAgICAgICAgIGNvYS5hY2NvdW50cy5mb3JFYWNoKGFjY291bnQgPT4gcm93cy5wdXNoKGFjY291bnQpKTtcclxuXHJcbiAgICAgICAgICByb3dzLnB1c2goe1xyXG4gICAgICAgICAgICBjb2FDb2RlOiAnJyxcclxuICAgICAgICAgICAgYWNjb3VudENvZGU6ICdUb3RhbDonLFxyXG4gICAgICAgICAgICBhY2NvdW50RGVzY3JpcHRpb246IGAke2NvYS5jb2FEZXNjcmlwdGlvbn1gLFxyXG4gICAgICAgICAgICBvcGVuaW5nQmFsYW5jZTogTnVtYmVyKGNvYS50b3RhbHMub3BlbmluZ0JhbGFuY2UpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICAgIGRlYml0OiBOdW1iZXIoY29hLnRvdGFscy5kZWJpdCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgICAgY3JlZGl0OiBOdW1iZXIoY29hLnRvdGFscy5jcmVkaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICAgIG5ldE1vdmVtZW50OiBOdW1iZXIoY29hLnRvdGFscy5uZXRNb3ZlbWVudCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgICAgY2xvc2luZ0JhbGFuY2U6IE51bWJlcihjb2EudG90YWxzLmNsb3NpbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgICBpc1RvdGFsUm93OiB0cnVlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcm93cy5wdXNoKHtcclxuICAgICAgICAgIGNvYUNvZGU6ICcnLFxyXG4gICAgICAgICAgYWNjb3VudENvZGU6ICdUb3RhbDonLFxyXG4gICAgICAgICAgYWNjb3VudERlc2NyaXB0aW9uOiBgJHtzdWIuc3ViQ09BRGVzY3JpcHRpb259YCxcclxuICAgICAgICAgIG9wZW5pbmdCYWxhbmNlOiBOdW1iZXIoc3ViLnRvdGFscy5vcGVuaW5nQmFsYW5jZSkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGRlYml0OiBOdW1iZXIoc3ViLnRvdGFscy5kZWJpdCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGNyZWRpdDogTnVtYmVyKHN1Yi50b3RhbHMuY3JlZGl0KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgbmV0TW92ZW1lbnQ6IE51bWJlcihzdWIudG90YWxzLm5ldE1vdmVtZW50KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgY2xvc2luZ0JhbGFuY2U6IE51bWJlcihzdWIudG90YWxzLmNsb3NpbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgaXNUb3RhbFJvdzogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJvd3MucHVzaCh7XHJcbiAgICAgICAgY29hQ29kZTogJycsXHJcbiAgICAgICAgYWNjb3VudENvZGU6ICdUb3RhbDonLFxyXG4gICAgICAgIGFjY291bnREZXNjcmlwdGlvbjogYCR7bWFpbi5tYWluQ09BRGVzY3JpcHRpb259YCxcclxuICAgICAgICBvcGVuaW5nQmFsYW5jZTogTnVtYmVyKG1haW4udG90YWxzLm9wZW5pbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICAgIGRlYml0OiBOdW1iZXIobWFpbi50b3RhbHMuZGViaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgY3JlZGl0OiBOdW1iZXIobWFpbi50b3RhbHMuY3JlZGl0KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgIG5ldE1vdmVtZW50OiBOdW1iZXIobWFpbi50b3RhbHMubmV0TW92ZW1lbnQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgY2xvc2luZ0JhbGFuY2U6IE51bWJlcihtYWluLnRvdGFscy5jbG9zaW5nQmFsYW5jZSkudG9GaXhlZCgzKSxcclxuICAgICAgICBpc1RvdGFsUm93OiB0cnVlXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcm93cy5wdXNoKHtcclxuICAgICAgY29hQ29kZTogJ1RPVEFMOicsXHJcbiAgICAgIGFjY291bnRDb2RlOiAnJyxcclxuICAgICAgYWNjb3VudERlc2NyaXB0aW9uOiAnJyxcclxuICAgICAgb3BlbmluZ0JhbGFuY2U6IE51bWJlcihyZXBvcnQuZ3JhbmRUb3RhbC5vcGVuaW5nQmFsYW5jZSkudG9GaXhlZCgzKSxcclxuICAgICAgZGViaXQ6IE51bWJlcihyZXBvcnQuZ3JhbmRUb3RhbC5kZWJpdCkudG9GaXhlZCgzKSxcclxuICAgICAgY3JlZGl0OiBOdW1iZXIocmVwb3J0LmdyYW5kVG90YWwuY3JlZGl0KS50b0ZpeGVkKDMpLFxyXG4gICAgICBuZXRNb3ZlbWVudDogTnVtYmVyKHJlcG9ydC5ncmFuZFRvdGFsLm5ldE1vdmVtZW50KS50b0ZpeGVkKDMpLFxyXG4gICAgICBjbG9zaW5nQmFsYW5jZTogTnVtYmVyKHJlcG9ydC5ncmFuZFRvdGFsLmNsb3NpbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICBpc1RvdGFsUm93OiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcm93cztcclxuICB9XHJcblxyXG4gIG9uR3JpZFJlYWR5KHBhcmFtczogR3JpZFJlYWR5RXZlbnQpIHtcclxuICAgIHRoaXMuZ3JpZEFwaSA9IHBhcmFtcy5hcGk7XHJcbiAgICB0aGlzLmdyaWRDb2x1bW5BcGkgPSBwYXJhbXMuY29sdW1uQXBpO1xyXG5cclxuICAgIGNvbnN0IGFsbENvbHVtbklkczogc3RyaW5nW10gPSBbXTtcclxuICAgIHBhcmFtcy5jb2x1bW5BcGkuZ2V0Q29sdW1ucygpLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XHJcbiAgICAgIGFsbENvbHVtbklkcy5wdXNoKGNvbHVtbi5nZXRDb2xJZCgpKTtcclxuICAgIH0pO1xyXG4gICAgcGFyYW1zLmNvbHVtbkFwaS5hdXRvU2l6ZUNvbHVtbnMoYWxsQ29sdW1uSWRzKTtcclxuICAgIHRoaXMub25SZXNpemUoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gIG9uUmVzaXplKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZEFwaSAmJiB0aGlzLmdyaWRBcGkuc2l6ZUNvbHVtbnNUb0ZpdCkge1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TZWFyY2godGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBub3JtYWxpemUgPSAoc3RyOiBhbnkpOiBzdHJpbmcgPT5cclxuICAgICAgc3RyXHJcbiAgICAgICAgPy50b1N0cmluZygpXHJcbiAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAucmVwbGFjZSgvLC9nLCAnJylcclxuICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpXHJcbiAgICAgICAgLnJlcGxhY2UoL1tcXHUyMDBCLVxcdTIwMERcXHVGRUZGXS9nLCAnJylcclxuICAgICAgICAudHJpbSgpO1xyXG5cclxuICAgIGNvbnN0IHNlYXJjaCA9IG5vcm1hbGl6ZSh0ZXh0KTtcclxuXHJcbiAgICBpZiAoc2VhcmNoKSB7XHJcbiAgICAgIC8vIGZpbHRlciBmcm9tIGFscmVhZHkgZm9ybWF0dGVkIHJvd0RhdGFcclxuICAgICAgdGhpcy5yb3dEYXRhID0gdGhpcy5mbGF0dGVuUmVwb3J0KHRoaXMudHJpYWxCYWxhbmNlUmVwb3J0KVxyXG4gICAgICAgIC5tYXAoYWNjID0+ICh7XHJcbiAgICAgICAgICAuLi5hY2MsXHJcbiAgICAgICAgICBvcGVuaW5nQmFsYW5jZTogTnVtYmVyKGFjYy5vcGVuaW5nQmFsYW5jZSkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGRlYml0OiBOdW1iZXIoYWNjLmRlYml0KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgY3JlZGl0OiBOdW1iZXIoYWNjLmNyZWRpdCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIG5ldE1vdmVtZW50OiBOdW1iZXIoYWNjLm5ldE1vdmVtZW50KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgY2xvc2luZ0JhbGFuY2U6IE51bWJlcihhY2MuY2xvc2luZ0JhbGFuY2UpLnRvRml4ZWQoMylcclxuICAgICAgICB9KSlcclxuICAgICAgICAuZmlsdGVyKGl0ZW0gPT5cclxuICAgICAgICAgIE9iamVjdC52YWx1ZXMoaXRlbSkuc29tZSh2YWx1ZSA9PiBub3JtYWxpemUodmFsdWUpLmluY2x1ZGVzKHNlYXJjaCkpXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucm93RGF0YSA9IHRoaXMuZmxhdHRlblJlcG9ydCh0aGlzLnRyaWFsQmFsYW5jZVJlcG9ydClcclxuICAgICAgICAubWFwKGFjYyA9PiAoe1xyXG4gICAgICAgICAgLi4uYWNjLFxyXG4gICAgICAgICAgb3BlbmluZ0JhbGFuY2U6IE51bWJlcihhY2Mub3BlbmluZ0JhbGFuY2UpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBkZWJpdDogTnVtYmVyKGFjYy5kZWJpdCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGNyZWRpdDogTnVtYmVyKGFjYy5jcmVkaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBuZXRNb3ZlbWVudDogTnVtYmVyKGFjYy5uZXRNb3ZlbWVudCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGNsb3NpbmdCYWxhbmNlOiBOdW1iZXIoYWNjLmNsb3NpbmdCYWxhbmNlKS50b0ZpeGVkKDMpXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXhwb3J0KG9wdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uID0gb3B0aW9uO1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uKSB7XHJcbiAgICAgIGNhc2UgJ2V4Y2VsJzpcclxuICAgICAgICB0aGlzLmV4cG9ydFRvRXhjZWwoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncGRmJzpcclxuICAgICAgICB0aGlzLmV4cG9ydFRvUGRmKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Nzdic6XHJcbiAgICAgICAgdGhpcy5leHBvcnRUb0NzdigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGFsZXJ0KCdQbGVhc2Ugc2VsZWN0IGFuIGV4cG9ydCBmb3JtYXQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb1BkZigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy50cmlhbEJhbGFuY2VSZXBvcnQ/Lm1haW5DT0FHcm91cHM/Lmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHRpdGxlID0gJ1hwcmVzcyBNb25leSAtIE1JIEFjY291bnRzJztcclxuICAgIGNvbnN0IGZpbGVOYW1lID0gJ1RyaWFsLUJhbGFuY2UtQWNjb3VudHMtUmF3LnBkZic7XHJcblxyXG4gICAgLy8gLS0tIHBhZ2UgJiBsYXlvdXQgLS0tXHJcbiAgICBjb25zdCBkb2MgPSBuZXcganNQREYoeyBvcmllbnRhdGlvbjogJ2xhbmRzY2FwZScsIHVuaXQ6ICdtbScsIGZvcm1hdDogWzMxMiwgMjEwXSB9KTtcclxuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpO1xyXG4gICAgY29uc3QgbWFyZ2luTGVmdCA9IDE1O1xyXG4gICAgY29uc3QgbG9nb1dpZHRoID0gMzguNCwgbG9nb0hlaWdodCA9IDE3LjUsIGxvZ29YID0gbWFyZ2luTGVmdCwgbG9nb1kgPSA4O1xyXG4gICAgY29uc3QgdGl0bGVZID0gMTg7XHJcbiAgICBsZXQgY3VycmVudFkgPSB0aXRsZVkgKyAxNDtcclxuXHJcbiAgICBjb25zdCBsYWJlbFZhbHVlR2FwID0gMjtcclxuICAgIGNvbnN0IHBhaXJHYXAgPSAxNTtcclxuXHJcbiAgICAvLyAtLS0gbWV0YWRhdGEgLS0tXHJcbiAgICBjb25zdCBtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICBbJ1JlcG9ydCBQZXJpb2Q6JywgdGhpcy5yZXBvcnRQZXJpb2RdLFxyXG4gICAgICBbJ1JlcG9ydCBVc2VyICYgVGltZSA6ICcsIGAke3RoaXMucmVwb3J0VXNlcn1AJHt0aGlzLnJlcG9ydFRpbWV9YF0sXHJcbiAgICBdO1xyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYSA9IHRoaXMuc2VhcmNoQ3JpdGVyaWE7XHJcblxyXG4gICAgLy8gLS0tIGRyYXcgbG9nbyArIHRpdGxlIC0tLVxyXG4gICAgaWYgKHRoaXMuZXhwb3J0U2VydmljZT8ubG9nb0Jhc2U2NCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGRvYy5hZGRJbWFnZSh0aGlzLmV4cG9ydFNlcnZpY2UubG9nb0Jhc2U2NCwgJ1BORycsIGxvZ29YLCBsb2dvWSwgbG9nb1dpZHRoLCBsb2dvSGVpZ2h0KTtcclxuICAgICAgfSBjYXRjaCB7IH1cclxuICAgIH1cclxuICAgIGRvYy5zZXRGb250U2l6ZSgxNSk7XHJcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgIGRvYy50ZXh0KHRpdGxlLCBwYWdlV2lkdGggLyAyLCB0aXRsZVksIHsgYWxpZ246ICdjZW50ZXInIH0pO1xyXG5cclxuICAgIC8vIC0tLSBkcmF3IG1ldGFkYXRhIC0tLVxyXG4gICAgZG9jLnNldEZvbnRTaXplKDEwKTtcclxuICAgIG1ldGFkYXRhLmZvckVhY2goKFtsYWJlbCwgdmFsdWVdLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHkgPSBjdXJyZW50WSArIGkgKiA2O1xyXG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgICAgZG9jLnRleHQobGFiZWwsIG1hcmdpbkxlZnQsIHkpO1xyXG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xyXG4gICAgICBjb25zdCBsYWJlbFdpZHRoID0gZG9jLmdldFRleHRXaWR0aChsYWJlbCArICcgJyk7XHJcbiAgICAgIGRvYy50ZXh0KHZhbHVlLCBtYXJnaW5MZWZ0ICsgbGFiZWxXaWR0aCArIGxhYmVsVmFsdWVHYXAsIHkpO1xyXG4gICAgfSk7XHJcbiAgICBjdXJyZW50WSArPSBtZXRhZGF0YS5sZW5ndGggKiA2ICsgNjtcclxuXHJcbiAgICAvLyAtLS0gZHJhdyBzZWFyY2ggY3JpdGVyaWEgaGVhZGluZyAtLS1cclxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgZG9jLnRleHQoJ1NlYXJjaCBDcml0ZXJpYTotJywgbWFyZ2luTGVmdCwgY3VycmVudFkpO1xyXG4gICAgY3VycmVudFkgKz0gODtcclxuXHJcbiAgICAvLyAtLS0gZHJhdyBzZWFyY2ggY3JpdGVyaWEgcGFpcnMgLS0tXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07IC8vIG1heSBiZSB1bmRlZmluZWRcclxuXHJcbiAgICAgIC8vIC0tLSBMZWZ0IHNpZGUgLS0tXHJcbiAgICAgIGlmIChsZWZ0KSB7XHJcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICAgICAgZG9jLnRleHQobGVmdFswXSwgbWFyZ2luTGVmdCwgY3VycmVudFkpO1xyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgICAgY29uc3QgbGVmdExhYmVsV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGxlZnRbMF0gKyAnICcpO1xyXG4gICAgICAgIGRvYy50ZXh0KGxlZnRbMV0gPz8gJycsIG1hcmdpbkxlZnQgKyBsZWZ0TGFiZWxXaWR0aCArIGxhYmVsVmFsdWVHYXAsIGN1cnJlbnRZKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gLS0tIFJpZ2h0IHNpZGUgKGlmIGF2YWlsYWJsZSkgLS0tXHJcbiAgICAgIGlmIChyaWdodCkge1xyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICAgIGRvYy50ZXh0KHJpZ2h0WzBdLCBwYWdlV2lkdGggLyAyLCBjdXJyZW50WSk7XHJcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgICBjb25zdCByaWdodExhYmVsV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKHJpZ2h0WzBdICsgJyAnKTtcclxuICAgICAgICBkb2MudGV4dChyaWdodFsxXSA/PyAnJywgcGFnZVdpZHRoIC8gMiArIHJpZ2h0TGFiZWxXaWR0aCArIGxhYmVsVmFsdWVHYXAsIGN1cnJlbnRZKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3VycmVudFkgKz0gNjsgLy8gbW92ZSBkb3duIGZvciBuZXh0IGxpbmVcclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50WSArPSA0O1xyXG5cclxuICAgIC8vIC0tLSBoZWFkZXJzIC0tLVxyXG4gICAgY29uc3QgaGVhZGVycyA9IFtcclxuICAgICAgJ1NyIE5vJyxcclxuICAgICAgJ0NPQSBDb2RlJywgJ0FjY291bnQgQ29kZScsICdBY2NvdW50IERlc2NyaXB0aW9uJyxcclxuICAgICAgJ09wZW5pbmcgQmFsYW5jZSBMb2NhbCBBbXQnLCAnRGViaXRzIExvY2FsIEFtdCcsICdDcmVkaXRzIExvY2FsIEFtdCcsXHJcbiAgICAgICdOZXQgTW92ZW1lbnQgTG9jYWwgQW10JywgJ0Nsb3NpbmcgQmFsYW5jZSBMb2NhbCBBbXQnXHJcbiAgICBdO1xyXG5cclxuICAgIGNvbnN0IGZsYXRSZXBvcnQgPSB0aGlzLmZsYXR0ZW5SZXBvcnQodGhpcy50cmlhbEJhbGFuY2VSZXBvcnQpO1xyXG5cclxuICAgIC8vIC0tLSByb3dzIC0tLVxyXG4gICAgY29uc3Qgcm93czogYW55W11bXSA9IGZsYXRSZXBvcnQubWFwKChhY2MsIGkpID0+IFtcclxuICAgICAgaSArIDEsXHJcbiAgICAgIGFjYy5jb2FDb2RlLFxyXG4gICAgICBhY2MuYWNjb3VudENvZGUsXHJcbiAgICAgIGFjYy5hY2NvdW50RGVzY3JpcHRpb24sXHJcbiAgICAgIGFjYy5vcGVuaW5nQmFsYW5jZSAhPSBudWxsID8gTnVtYmVyKGFjYy5vcGVuaW5nQmFsYW5jZSkudG9GaXhlZCgzKSA6IFwiXCIsXHJcbiAgICAgIGFjYy5kZWJpdCAhPSBudWxsID8gTnVtYmVyKGFjYy5kZWJpdCkudG9GaXhlZCgzKSA6IFwiXCIsXHJcbiAgICAgIGFjYy5jcmVkaXQgIT0gbnVsbCA/IE51bWJlcihhY2MuY3JlZGl0KS50b0ZpeGVkKDMpIDogXCJcIixcclxuICAgICAgYWNjLm5ldE1vdmVtZW50ICE9IG51bGwgPyBOdW1iZXIoYWNjLm5ldE1vdmVtZW50KS50b0ZpeGVkKDMpIDogXCJcIixcclxuICAgICAgYWNjLmNsb3NpbmdCYWxhbmNlICE9IG51bGwgPyBOdW1iZXIoYWNjLmNsb3NpbmdCYWxhbmNlKS50b0ZpeGVkKDMpIDogXCJcIlxyXG4gICAgXSk7XHJcblxyXG4gICAgLy8gLS0tIGNvbHVtbiB3aWR0aHMgLS0tXHJcbiAgICBjb25zdCBjb2x1bW5TdHlsZXM6IHsgW2tleTogbnVtYmVyXTogYW55IH0gPSB7XHJcbiAgICAgIDA6IHsgY2VsbFdpZHRoOiAxNSB9LFxyXG4gICAgICAxOiB7IGNlbGxXaWR0aDogMjUgfSxcclxuICAgICAgMjogeyBjZWxsV2lkdGg6IDI1IH0sXHJcbiAgICAgIDM6IHsgY2VsbFdpZHRoOiA3MCB9LFxyXG4gICAgICA0OiB7IGNlbGxXaWR0aDogMzAgfSxcclxuICAgICAgNTogeyBjZWxsV2lkdGg6IDMwIH0sXHJcbiAgICAgIDY6IHsgY2VsbFdpZHRoOiAzMCB9LFxyXG4gICAgICA3OiB7IGNlbGxXaWR0aDogMzAgfSxcclxuICAgICAgODogeyBjZWxsV2lkdGg6IDMwIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIC0tLSBkcmF3IHRhYmxlIC0tLVxyXG4gICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XHJcbiAgICAgIGhlYWQ6IFtoZWFkZXJzXSxcclxuICAgICAgYm9keTogcm93cyxcclxuICAgICAgc3RhcnRZOiBjdXJyZW50WSxcclxuICAgICAgdGhlbWU6ICdncmlkJyxcclxuICAgICAgaGVhZFN0eWxlczoge1xyXG4gICAgICAgIGZpbGxDb2xvcjogWzIyMCwgMjIwLCAyMjBdLFxyXG4gICAgICAgIHRleHRDb2xvcjogMCxcclxuICAgICAgICBmb250U3R5bGU6ICdib2xkJyxcclxuICAgICAgICBmb250U2l6ZTogOSxcclxuICAgICAgICBoYWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgIGNlbGxXaWR0aDogJ3dyYXAnLFxyXG4gICAgICAgIG1pbkNlbGxIZWlnaHQ6IDEwXHJcbiAgICAgIH0sXHJcbiAgICAgIGJvZHlTdHlsZXM6IHtcclxuICAgICAgICBmb250U2l6ZTogOCxcclxuICAgICAgICBmaWxsQ29sb3I6IFsyNTUsIDI1NSwgMjU1XSxcclxuICAgICAgICB0ZXh0Q29sb3I6IFswLCAwLCAwXVxyXG4gICAgICB9LFxyXG4gICAgICBzdHlsZXM6IHsgY2VsbFBhZGRpbmc6IDIsIG92ZXJmbG93OiAnbGluZWJyZWFrJywgbWluQ2VsbEhlaWdodDogNiB9LFxyXG4gICAgICBjb2x1bW5TdHlsZXMsXHJcbiAgICAgIGRpZFBhcnNlQ2VsbDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gZGF0YS5yb3cuaW5kZXg7XHJcbiAgICAgICAgY29uc3Qgcm93RGF0YSA9IGZsYXRSZXBvcnRbcm93SW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IGlzVG90YWxSb3cgPSByb3dEYXRhLmlzVG90YWxSb3c7XHJcblxyXG4gICAgICAgIGlmIChpc1RvdGFsUm93KSBkYXRhLmNlbGwuc3R5bGVzLmZvbnRTdHlsZSA9ICdib2xkJztcclxuXHJcbiAgICAgICAgLy8gaGlnaGxpZ2h0IG5lZ2F0aXZlcyBpbiByZWRcclxuICAgICAgICBpZiAoZGF0YS5jb2x1bW4uaW5kZXggPiAzKSB7XHJcbiAgICAgICAgICBjb25zdCBrZXlNYXAgPSBbXCJvcGVuaW5nQmFsYW5jZVwiLCBcImRlYml0XCIsIFwiY3JlZGl0XCIsIFwibmV0TW92ZW1lbnRcIiwgXCJjbG9zaW5nQmFsYW5jZVwiXTtcclxuICAgICAgICAgIGNvbnN0IGtleSA9IGtleU1hcFtkYXRhLmNvbHVtbi5pbmRleCAtIDRdO1xyXG4gICAgICAgICAgY29uc3QgcmF3ID0gcm93RGF0YVtrZXldO1xyXG4gICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHJhdyk7XHJcbiAgICAgICAgICBpZiAoIWlzTmFOKG51bSkgJiYgbnVtIDwgMCkge1xyXG4gICAgICAgICAgICBkYXRhLmNlbGwuc3R5bGVzLnRleHRDb2xvciA9IFsyNTUsIDAsIDBdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gLS0tIHBhZ2UgbnVtYmVycyAtLS1cclxuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSAoZG9jIGFzIGFueSkuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxQYWdlczsgaSsrKSB7XHJcbiAgICAgIGRvYy5zZXRQYWdlKGkpO1xyXG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XHJcbiAgICAgIGNvbnN0IGZvb3RlclkgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gNjtcclxuICAgICAgZG9jLnRleHQoYFBhZ2UgJHtpfSBvZiAke3RvdGFsUGFnZXN9YCwgcGFnZVdpZHRoIC0gMTUsIGZvb3RlclksIHsgYWxpZ246ICdyaWdodCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIHNhdmUgUERGIC0tLVxyXG4gICAgZG9jLnNhdmUoZmlsZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9FeGNlbCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy50cmlhbEJhbGFuY2VSZXBvcnQ/Lm1haW5DT0FHcm91cHM/Lmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGZpbGVOYW1lID0gJ1RyaWFsLUJhbGFuY2UtQWNjb3VudHMtUmF3Lnhsc3gnO1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgRXhjZWxKUy5Xb3JrYm9vaygpO1xyXG4gICAgY29uc3Qgc2hlZXQgPSB3b3JrYm9vay5hZGRXb3Jrc2hlZXQoJ1RyaWFsIEJhbGFuY2UnKTtcclxuXHJcbiAgICBsZXQgY3VycmVudFJvdyA9IDE7XHJcblxyXG4gICAgLy8gLS0tIGFkZCBsb2dvIGlmIGF2YWlsYWJsZSAtLS1cclxuICAgIGlmICh0aGlzLmV4cG9ydFNlcnZpY2U/LmxvZ29CYXNlNjQpIHtcclxuICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IHRoaXMuZXhwb3J0U2VydmljZS5sb2dvQmFzZTY0LnJlcGxhY2UoL15kYXRhOmltYWdlXFwvXFx3KztiYXNlNjQsLywgJycpO1xyXG4gICAgICBjb25zdCBpbWFnZUlkID0gd29ya2Jvb2suYWRkSW1hZ2UoeyBiYXNlNjQ6IGJhc2U2NERhdGEsIGV4dGVuc2lvbjogJ3BuZycgfSk7XHJcbiAgICAgIHNoZWV0LmFkZEltYWdlKGltYWdlSWQsIHsgdGw6IHsgY29sOiAwLCByb3c6IDAgfSwgZXh0OiB7IHdpZHRoOiAxMjAsIGhlaWdodDogNjAgfSwgZWRpdEFzOiAnb25lQ2VsbCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIHRpdGxlIC0tLVxyXG4gICAgY29uc3QgdGl0bGUgPSAnWHByZXNzIE1vbmV5IC0gTUkgQWNjb3VudHMnO1xyXG4gICAgc2hlZXQubWVyZ2VDZWxscygxLCAzLCAxLCA5KTtcclxuICAgIGNvbnN0IHRpdGxlQ2VsbCA9IHNoZWV0LmdldENlbGwoJ0MxJyk7XHJcbiAgICB0aXRsZUNlbGwudmFsdWUgPSB0aXRsZTtcclxuICAgIHRpdGxlQ2VsbC5mb250ID0geyBzaXplOiAxNSwgYm9sZDogdHJ1ZSB9O1xyXG4gICAgdGl0bGVDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ2NlbnRlcicsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgY3VycmVudFJvdyA9IDQ7XHJcblxyXG4gICAgLy8gLS0tIG1ldGFkYXRhIC0tLVxyXG4gICAgY29uc3QgbWV0YWRhdGE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtcclxuICAgICAgWydSZXBvcnQgUGVyaW9kOicsIHRoaXMucmVwb3J0UGVyaW9kXSxcclxuICAgICAgWydSZXBvcnQgVXNlciAmIFRpbWUgOiAnLCBgJHt0aGlzLnJlcG9ydFVzZXJ9QCR7dGhpcy5yZXBvcnRUaW1lfWBdLFxyXG4gICAgXTtcclxuICAgIG1ldGFkYXRhLmZvckVhY2goKFtsYWJlbCwgdmFsdWVdKSA9PiB7XHJcbiAgICAgIHNoZWV0Lm1lcmdlQ2VsbHMoY3VycmVudFJvdywgMSwgY3VycmVudFJvdywgNik7XHJcbiAgICAgIGNvbnN0IHJvdyA9IHNoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG4gICAgICByb3cuZ2V0Q2VsbCgxKS52YWx1ZSA9IHsgcmljaFRleHQ6IFt7IHRleHQ6IGxhYmVsICsgJyAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LCB7IHRleHQ6IHZhbHVlIH1dIH07XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLmFsaWdubWVudCA9IHsgdmVydGljYWw6ICdtaWRkbGUnLCB3cmFwVGV4dDogdHJ1ZSB9O1xyXG4gICAgfSk7XHJcbiAgICBjdXJyZW50Um93Kys7XHJcblxyXG4gICAgLy8gLS0tIHNlYXJjaCBjcml0ZXJpYSBoZWFkaW5nIC0tLVxyXG4gICAgc2hlZXQubWVyZ2VDZWxscyhjdXJyZW50Um93LCAxLCBjdXJyZW50Um93LCA2KTtcclxuICAgIHNoZWV0LmdldENlbGwoY3VycmVudFJvdywgMSkudmFsdWUgPSAnU2VhcmNoIENyaXRlcmlhOi0nO1xyXG4gICAgc2hlZXQuZ2V0Q2VsbChjdXJyZW50Um93LCAxKS5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICBjdXJyZW50Um93ICs9IDI7XHJcblxyXG4gICAgLy8gLS0tIHNlYXJjaCBjcml0ZXJpYSAtLS1cclxuICAgIGNvbnN0IHNlYXJjaENyaXRlcmlhID0gdGhpcy5zZWFyY2hDcml0ZXJpYTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07IC8vIG1heSBiZSB1bmRlZmluZWRcclxuICAgICAgY29uc3Qgcm93ID0gc2hlZXQuZ2V0Um93KGN1cnJlbnRSb3crKyk7XHJcblxyXG4gICAgICAvLyBMZWZ0IGNlbGxcclxuICAgICAgc2hlZXQubWVyZ2VDZWxscyhyb3cubnVtYmVyLCAxLCByb3cubnVtYmVyLCAzKTtcclxuICAgICAgcm93LmdldENlbGwoMSkudmFsdWUgPSB7XHJcbiAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgIHsgdGV4dDogKGxlZnQ/LlswXSA/PyAnJykgKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICB7IHRleHQ6IGxlZnQ/LlsxXSA/PyAnJyB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gICAgICByb3cuZ2V0Q2VsbCgxKS5hbGlnbm1lbnQgPSB7IHdyYXBUZXh0OiB0cnVlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuXHJcbiAgICAgIC8vIFJpZ2h0IGNlbGwgKG9ubHkgaWYgcHJlc2VudClcclxuICAgICAgaWYgKHJpZ2h0KSB7XHJcbiAgICAgICAgc2hlZXQubWVyZ2VDZWxscyhyb3cubnVtYmVyLCA0LCByb3cubnVtYmVyLCA2KTtcclxuICAgICAgICByb3cuZ2V0Q2VsbCg0KS52YWx1ZSA9IHtcclxuICAgICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICAgIHsgdGV4dDogKHJpZ2h0Py5bMF0gPz8gJycpICsgJyAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgICB7IHRleHQ6IHJpZ2h0Py5bMV0gPz8gJycgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcm93LmdldENlbGwoNCkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogdHJ1ZSwgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGN1cnJlbnRSb3crKztcclxuXHJcbiAgICAvLyAtLS0gaGVhZGVycyAtLS1cclxuICAgIGNvbnN0IGhlYWRlcnMgPSBbXHJcbiAgICAgICdTciBObycsXHJcbiAgICAgICdDT0EgQ29kZScsICdBY2NvdW50IENvZGUnLCAnQWNjb3VudCBEZXNjcmlwdGlvbicsXHJcbiAgICAgICdPcGVuaW5nIEJhbGFuY2UgTG9jYWwgQW10JywgJ0RlYml0cyBMb2NhbCBBbXQnLCAnQ3JlZGl0cyBMb2NhbCBBbXQnLFxyXG4gICAgICAnTmV0IE1vdmVtZW50IExvY2FsIEFtdCcsICdDbG9zaW5nIEJhbGFuY2UgTG9jYWwgQW10J1xyXG4gICAgXTtcclxuICAgIGNvbnN0IGhlYWRlclJvdyA9IHNoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG4gICAgaGVhZGVycy5mb3JFYWNoKChoLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNlbGwgPSBoZWFkZXJSb3cuZ2V0Q2VsbChpICsgMSk7XHJcbiAgICAgIGNlbGwudmFsdWUgPSBoO1xyXG4gICAgICBjZWxsLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgICAgY2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdjZW50ZXInLCB2ZXJ0aWNhbDogJ21pZGRsZScsIHdyYXBUZXh0OiB0cnVlIH07XHJcbiAgICAgIGNlbGwuZmlsbCA9IHsgdHlwZTogJ3BhdHRlcm4nLCBwYXR0ZXJuOiAnc29saWQnLCBmZ0NvbG9yOiB7IGFyZ2I6ICdEQ0RDREMnIH0gfTtcclxuICAgICAgY2VsbC5ib3JkZXIgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIC0tLSByb3dzIHdpdGggMyBkZWNpbWFscyBmb3IgbnVtZXJpYyBjb2x1bW5zIC0tLVxyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZmxhdHRlblJlcG9ydCh0aGlzLnRyaWFsQmFsYW5jZVJlcG9ydCkubWFwKChhY2MsIGlkeCkgPT4ge1xyXG4gICAgICBjb25zdCBudW1lcmljQ29sdW1ucyA9IFsnb3BlbmluZ0JhbGFuY2UnLCAnZGViaXQnLCAnY3JlZGl0JywgJ25ldE1vdmVtZW50JywgJ2Nsb3NpbmdCYWxhbmNlJ107XHJcbiAgICAgIGNvbnN0IHJvd0RhdGEgPSBudW1lcmljQ29sdW1ucy5tYXAoY29sID0+IHtcclxuICAgICAgICBjb25zdCB2YWwgPSBOdW1iZXIoYWNjW2NvbF0pO1xyXG4gICAgICAgIHJldHVybiAhaXNOYU4odmFsKSA/IHZhbC50b0ZpeGVkKDMpIDogJyc7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIGlkeCArIDEsXHJcbiAgICAgICAgYWNjLmNvYUNvZGUsXHJcbiAgICAgICAgYWNjLmFjY291bnRDb2RlLFxyXG4gICAgICAgIGFjYy5hY2NvdW50RGVzY3JpcHRpb24sXHJcbiAgICAgICAgLi4ucm93RGF0YSxcclxuICAgICAgICBhY2MuaXNUb3RhbFJvdyB8fCBmYWxzZVxyXG4gICAgICBdO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcm93cy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICBjb25zdCByb3cgPSBzaGVldC5nZXRSb3coY3VycmVudFJvdysrKTtcclxuICAgICAgci5zbGljZSgwLCA5KS5mb3JFYWNoKCh2YWwsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBjZWxsID0gcm93LmdldENlbGwoaSArIDEpO1xyXG4gICAgICAgIC8vIGNvbnZlcnQgYmFjayB0byBudW1iZXIgZm9yIEV4Y2VsIG1hdGggYnV0IHNob3cgMyBkZWNpbWFsc1xyXG4gICAgICAgIGlmIChpID4gMyAmJiB2YWwgIT09ICcnKSBjZWxsLnZhbHVlID0gcGFyc2VGbG9hdCh2YWwudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgZWxzZSBjZWxsLnZhbHVlID0gdmFsO1xyXG5cclxuICAgICAgICBjZWxsLmJvcmRlciA9IHsgdG9wOiB7IHN0eWxlOiAndGhpbicgfSwgbGVmdDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfSB9O1xyXG5cclxuICAgICAgICAvLyBib2xkIHRvdGFsIHJvd3NcclxuICAgICAgICBpZiAocls5XSkgY2VsbC5mb250ID0geyBib2xkOiB0cnVlIH07XHJcblxyXG4gICAgICAgIC8vIG5lZ2F0aXZlIG51bWJlcnMgcmVkXHJcbiAgICAgICAgaWYgKGkgPiAzICYmIHR5cGVvZiBjZWxsLnZhbHVlID09PSAnbnVtYmVyJyAmJiBjZWxsLnZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgY2VsbC5mb250ID0geyBjb2xvcjogeyBhcmdiOiAnRkYwMDAwJyB9LCBib2xkOiByWzldID8gdHJ1ZSA6IHVuZGVmaW5lZCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IG51bWJlciBmb3JtYXQgdG8gc2hvdyAzIGRlY2ltYWxzXHJcbiAgICAgICAgaWYgKGkgPiAzKSBjZWxsLm51bUZtdCA9ICcwLjAwMCc7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gLS0tIGNvbHVtbiB3aWR0aHMgLS0tXHJcbiAgICBjb25zdCB3aWR0aHMgPSBbOCwgMTUsIDE1LCA0MCwgMjAsIDIwLCAyMCwgMjAsIDIwXTtcclxuICAgIHdpZHRocy5mb3JFYWNoKCh3LCBpKSA9PiBzaGVldC5nZXRDb2x1bW4oaSArIDEpLndpZHRoID0gdyk7XHJcblxyXG4gICAgLy8gLS0tIHNhdmUgZmlsZSAtLS1cclxuICAgIHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKS50aGVuKGJ1ZmZlciA9PiB7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pO1xyXG4gICAgICBGaWxlU2F2ZXIuc2F2ZUFzKGJsb2IsIGZpbGVOYW1lKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9Dc3YoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMudHJpYWxCYWxhbmNlUmVwb3J0Py5tYWluQ09BR3JvdXBzPy5sZW5ndGgpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBmaWxlTmFtZSA9ICdUcmlhbC1CYWxhbmNlLUFjY291bnRzLVJhdy5jc3YnO1xyXG5cclxuICAgIC8vIC0tLSBtZXRhZGF0YSAtLS1cclxuICAgIGNvbnN0IG1ldGFkYXRhOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXHJcbiAgICAgIFsnUmVwb3J0IFRpdGxlOicsICdYcHJlc3MgTW9uZXkgLSBNSSBBY2NvdW50cyddLFxyXG4gICAgICBbJ1JlcG9ydCBQZXJpb2Q6JywgdGhpcy5yZXBvcnRQZXJpb2RdLFxyXG4gICAgICBbJ1JlcG9ydCBVc2VyICYgVGltZSA6ICcsIGAke3RoaXMucmVwb3J0VXNlcn1AJHt0aGlzLnJlcG9ydFRpbWV9YF0sXHJcbiAgICBdO1xyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYSA9IHRoaXMuc2VhcmNoQ3JpdGVyaWE7XHJcblxyXG4gICAgLy8gLS0tIHRhYmxlIGhlYWRlcnMgKGFkZCBTciBObyBhdCBzdGFydCkgLS0tXHJcbiAgICBjb25zdCBoZWFkZXJzID0gW1xyXG4gICAgICAnU3IgTm8nLFxyXG4gICAgICAnQ09BIENvZGUnLCAnQWNjb3VudCBDb2RlJywgJ0FjY291bnQgRGVzY3JpcHRpb24nLFxyXG4gICAgICAnT3BlbmluZyBCYWxhbmNlIExvY2FsIEFtdCcsICdEZWJpdHMgTG9jYWwgQW10JywgJ0NyZWRpdHMgTG9jYWwgQW10JyxcclxuICAgICAgJ05ldCBNb3ZlbWVudCBMb2NhbCBBbXQnLCAnQ2xvc2luZyBCYWxhbmNlIExvY2FsIEFtdCdcclxuICAgIF07XHJcblxyXG4gICAgLy8gLS0tIHRhYmxlIHJvd3MgKHByZXBlbmQgU3IgTm8pIC0tLVxyXG4gICAgY29uc3Qgcm93czogYW55W11bXSA9IHRoaXMuZmxhdHRlblJlcG9ydCh0aGlzLnRyaWFsQmFsYW5jZVJlcG9ydCkubWFwKChhY2MsIGluZGV4KSA9PiBbXHJcbiAgICAgIGluZGV4ICsgMSwgLy8gU3IgTm9cclxuICAgICAgYWNjLmNvYUNvZGUsXHJcbiAgICAgIGFjYy5hY2NvdW50Q29kZSxcclxuICAgICAgYWNjLmFjY291bnREZXNjcmlwdGlvbixcclxuICAgICAgTnVtYmVyKGFjYy5vcGVuaW5nQmFsYW5jZSkudG9GaXhlZCgzKSxcclxuICAgICAgTnVtYmVyKGFjYy5kZWJpdCkudG9GaXhlZCgzKSxcclxuICAgICAgTnVtYmVyKGFjYy5jcmVkaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgIE51bWJlcihhY2MubmV0TW92ZW1lbnQpLnRvRml4ZWQoMyksXHJcbiAgICAgIE51bWJlcihhY2MuY2xvc2luZ0JhbGFuY2UpLnRvRml4ZWQoMylcclxuICAgIF0pO1xyXG5cclxuICAgIC8vIC0tLSBoZWxwZXIgdG8gZXNjYXBlIENTViB2YWx1ZXMgLS0tXHJcbiAgICBjb25zdCBlc2NhcGVDc3YgPSAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xyXG4gICAgICBjb25zdCBzdHIgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICByZXR1cm4gc3RyLmluY2x1ZGVzKCcsJykgfHwgc3RyLmluY2x1ZGVzKCdcIicpIHx8IHN0ci5pbmNsdWRlcygnXFxuJylcclxuICAgICAgICA/IGBcIiR7c3RyLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgXHJcbiAgICAgICAgOiBzdHI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIC0tLSBidWlsZCBDU1YgY29udGVudCAtLS1cclxuICAgIGxldCBjc3ZDb250ZW50ID0gJyc7XHJcblxyXG4gICAgLy8gbWV0YWRhdGFcclxuICAgIG1ldGFkYXRhLmZvckVhY2goKFtsYWJlbCwgdmFsdWVdKSA9PiB7XHJcbiAgICAgIGNzdkNvbnRlbnQgKz0gYCR7ZXNjYXBlQ3N2KGxhYmVsKX0ke2VzY2FwZUNzdih2YWx1ZSl9LFxcbmA7XHJcbiAgICB9KTtcclxuICAgIGNzdkNvbnRlbnQgKz0gJ1xcbic7IC8vIGdhcFxyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgaGVhZGluZyAtLS1cclxuICAgIGNzdkNvbnRlbnQgKz0gJ1NlYXJjaCBDcml0ZXJpYTotXFxuJztcclxuXHJcbiAgICAvLyAtLS0gc2VhcmNoIGNyaXRlcmlhICgyIHBlciByb3csIGR5bmFtaWMpIC0tLVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hDcml0ZXJpYS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgICBjb25zdCBsZWZ0ID0gc2VhcmNoQ3JpdGVyaWFbaV07XHJcbiAgICAgIGNvbnN0IHJpZ2h0ID0gc2VhcmNoQ3JpdGVyaWFbaSArIDFdO1xyXG5cclxuICAgICAgLy8gTGVmdCBzaWRlXHJcbiAgICAgIGlmIChsZWZ0KSBjc3ZDb250ZW50ICs9IGAke2VzY2FwZUNzdihsZWZ0WzBdKX0gJHtlc2NhcGVDc3YobGVmdFsxXSl9LGA7XHJcblxyXG4gICAgICAvLyBSaWdodCBzaWRlXHJcbiAgICAgIGlmIChyaWdodCkgY3N2Q29udGVudCArPSBgICR7ZXNjYXBlQ3N2KHJpZ2h0WzBdKX0gJHtlc2NhcGVDc3YocmlnaHRbMV0pfSxgO1xyXG5cclxuICAgICAgY3N2Q29udGVudCArPSAnXFxuJztcclxuICAgIH1cclxuICAgIGNzdkNvbnRlbnQgKz0gJ1xcbic7IC8vIGJsYW5rIGxpbmUgYWZ0ZXIgY3JpdGVyaWFcclxuXHJcbiAgICAvLyB0YWJsZSBoZWFkZXJzXHJcbiAgICBjc3ZDb250ZW50ICs9IGhlYWRlcnMubWFwKGggPT4gZXNjYXBlQ3N2KGgpKS5qb2luKCcsJykgKyAnXFxuJztcclxuXHJcbiAgICAvLyB0YWJsZSByb3dzXHJcbiAgICByb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgY3N2Q29udGVudCArPSByb3cubWFwKGNlbGwgPT4gZXNjYXBlQ3N2KGNlbGwpKS5qb2luKCcsJykgKyAnXFxuJztcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIC0tLSB0cmlnZ2VyIGRvd25sb2FkIC0tLVxyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZDb250ZW50XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xyXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7XHJcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlTmFtZSk7XHJcbiAgICBsaW5rLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVwb3J0KHBheWxvYWQ6IGFueSkge1xyXG4gICAgY29uc3QgbW9kYWwgPSBwYXlsb2FkPy5tb2RhbCB8fCBwYXlsb2FkO1xyXG5cclxuICAgIHRoaXMuZnJvbURhdGUgPSBmb3JtYXREYXRlKG1vZGFsLmZyb21EYXRlLCAnZGQvTU0veXl5eScsICdlbi1VUycpO1xyXG4gICAgdGhpcy50b0RhdGUgPSBmb3JtYXREYXRlKG1vZGFsLnRvRGF0ZSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKTtcclxuXHJcbiAgICBjb25zdCByZXE6IFRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0UmVxdWVzdERUTyA9IHtcclxuICAgICAgeWVhcjogTnVtYmVyKG1vZGFsLmZpbmFuY2lhbFllYXIpLFxyXG4gICAgICBkYXRlVHlwZTogbW9kYWwuZGF0ZVR5cGUsXHJcbiAgICAgIGZyb21EYXRlOiBtb2RhbC5mcm9tRGF5LFxyXG4gICAgICB0b0RhdGU6IG1vZGFsLnRvRGF5LFxyXG4gICAgICBhY2NvdW50U3RhdHVzOiBtb2RhbC5hY2NvdW50U3RhdHVzLmpvaW4oJywnKSxcclxuICAgICAgYnVzaW5lc3NMaW5lOiBtb2RhbC5idXNpbmVzc0xpbmUsXHJcbiAgICAgIGN1cnJlbmN5OiBtb2RhbC5jdXJyZW5jeSxcclxuICAgICAgY29tcGFueUNvZGU6IFwiQkhcIixcclxuICAgICAgcmVwb3J0UGVyaW9kOiBgJHtmb3JtYXREYXRlKG1vZGFsLmZyb21EYXRlLCAnZGQvTU0veXl5eScsICdlbi1VUycpfSAtICR7Zm9ybWF0RGF0ZShtb2RhbC50b0RhdGUsICdkZC9NTS95eXl5JywgJ2VuLVVTJyl9YCxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5nZXRUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydChyZXEpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRm9ybVZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNGb3JtVmFsaWQgPSBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGxpYi1zZWFyY2gtZmlsdGVyIFtSZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiAoc2VhcmNoQ2xpY2tlZCk9XCJnZXRSZXBvcnQoJGV2ZW50KVwiXHJcbiAgKGZvcm1WYWxpZCk9XCJoYW5kbGVGb3JtVmFsaWQoJGV2ZW50KVwiPjwvbGliLXNlYXJjaC1maWx0ZXI+XHJcbjxhcHAtbG9hZGVyIGNsYXNzPVwiXCIgKm5nSWY9XCJsb2FkaW5nU3RhdGUgPT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmdcIj48L2FwcC1sb2FkZXI+XHJcblxyXG48ZGl2ICpuZ0lmPVwiZGF0YVJlYWR5ICYmIHRyaWFsQmFsYW5jZVJlcG9ydD8ubWFpbkNPQUdyb3Vwcz8ubGVuZ3RoID4gMCAmJmlzRm9ybVZhbGlkXCI+XHJcbiAgPGxpYi1tZXRhZGF0YSBbcmVwb3J0TmFtZV09XCInWHByZXNzIE1vbmV5IC0gTUkgQWNjb3VudHMnXCIgW3Nob3dtZXRhRGF0YU9uZV09XCJ0cnVlXCIgW3Nob3dtZXRhRGF0YVR3b109XCJ0cnVlXCJcclxuICAgIFttZXRhRGF0YU9uZV09XCJtZXRhRGF0YU9uZVwiIFttZXRhRGF0YVR3b109XCJtZXRhRGF0YVR3b1wiIChleHBvcnRFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiXHJcbiAgICAoc2VhcmNoRXZlbnQpPVwib25TZWFyY2goJGV2ZW50KVwiPjwvbGliLW1ldGFkYXRhPlxyXG5cclxuICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiICpuZ0lmPVwicm93RGF0YSAmJiByb3dEYXRhLmxlbmd0aCA+IDBcIj5cclxuICAgIDxsaWItcGFnZS1zaXplLXNlbGVjdG9yIFt0b3RhbEVudHJpZXNdPVwicm93RGF0YT8ubGVuZ3RoXCIgW2RlZmF1bHRTaXplXT1cIicxNSdcIlxyXG4gICAgICBbZ3JpZEFwaV09XCJncmlkQXBpXCI+PC9saWItcGFnZS1zaXplLXNlbGVjdG9yPlxyXG5cclxuICAgIDxhZy1ncmlkLWFuZ3VsYXIgY2xhc3M9XCJhZy10aGVtZS1hbHBpbmUgdHJhbnNhY3Rpb24tZ3JpZFwiIHN0eWxlPVwiaGVpZ2h0OiAzODBweDtcIiBbZG9tTGF5b3V0XT1cIidub3JtYWwnXCJcclxuICAgICAgW3Jvd0RhdGFdPVwicm93RGF0YVwiIFtkZWZhdWx0Q29sRGVmXT1cImRlZmF1bHRDb2xEZWZcIiBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCIgW3Jvd0NsYXNzUnVsZXNdPVwicm93Q2xhc3NSdWxlc1wiXHJcbiAgICAgIFtwYWdpbmF0aW9uXT1cInRydWVcIiAoZ3JpZFJlYWR5KT1cIm9uR3JpZFJlYWR5KCRldmVudClcIiBbcGFnaW5hdGlvblBhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3Jvd0hlaWdodF09XCIyMFwiXHJcbiAgICAgIFtoZWFkZXJIZWlnaHRdPVwiMjJcIiAocGFnaW5hdGlvbkNoYW5nZWQpPVwib25SZXNpemUoKVwiPjwvYWctZ3JpZC1hbmd1bGFyPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmcgbXQtM1wiICpuZ0lmPVwidHJpYWxCYWxhbmNlUmVwb3J0Py5tYWluQ09BR3JvdXBzPy5sZW5ndGg9PTBcIj5cclxuICBObyBEYXRhIGZvdW5kIG1hdGNoaW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhLlxyXG48L2Rpdj4iXX0=
|